ZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IDFkZWIzMzEuLjA3ZTMyYTggMTAwNjQ0Ci0tLSBhL0NSRURJVFMKKysrIGIvQ1JFRElUUwpAQCAtNTA0LDcgKzUwNCw3IEBACiBFOiBsaW51eEBicm9kby5kZQogVzogaHR0cDovL3d3dy5icm9kby5kZS8KIFA6IDEwMjRELzcyNUIzN0M2ICAxOTBGIDNFNzcgOUM4OSAzQjZEIEJFQ0QgIDQ2RUUgNjdDMyAwMzA4IDcyNUIgMzdDNgotRDogcGFydHMgb2YgQ1BVRnJlcSBjb2RlLCBBQ1BJIGJ1Z2ZpeGVzCitEOiBwYXJ0cyBvZiBDUFVGcmVxIGNvZGUsIEFDUEkgYnVnZml4ZXMsIFBDTUNJQSByZXdyaXRlLCBjcHVmcmVxdXRpbHMKIFM6IFR1ZWJpbmdlbiwgR2VybWFueQogCiBOOiBBbmRyaWVzIEJyb3V3ZXIKQEAgLTg1Nyw2ICs4NTcsMTAgQEAKIFM6IFJvdW5kIFJvY2ssIFRYICA3ODY4MgogUzogVVNBCiAKK046IE1hdHRpYSBEb25naWxpCitFOiBtYWxhdHRpYUBnbWFpbC5jb20KK0Q6IGNwdWZyZXF1dGlscyAocHJlY3Vyc29yIHRvIGNwdXBvd2VydXRpbHMpCisKIE46IEJlbiBEb29rcwogRTogYmVuLWxpbnV4QGZsdWZmLm9yZwogRTogYmVuQHNpbXRlYy5jby51awpAQCAtMTg4Myw2ICsxODg3LDExIEBACiBTOiAxMDk4IFZBIEFtc3RlcmRhbSAKIFM6IFRoZSBOZXRoZXJsYW5kcwogCitOOiBHb3JhbiBLb3J1Z2EKK0U6IGtvcnVnYWdAc2lvbC5uZXQKK0Q6IGNwdWZyZXF1dGlscyAocHJlY3Vyc29yIHRvIGNwdXBvd2VydXRpbHMpCitTOiBTbG92ZW5pYQorCiBOOiBKaXJpIEtvc2luYQogRTogamlrb3NAamlrb3MuY3oKIEU6IGprb3NpbmFAc3VzZS5jegpAQCAtMjkxNiw2ICsyOTI1LDEyIEBACiBTOiA3OTA5OCBGcmVpYnVyZwogUzogR2VybWFueQogCitOOiBUaG9tYXMgUmVubmluZ2VyCitFOiB0cmVubkBzdXNlLmRlCitEOiBjcHVwb3dlcnV0aWxzCitTOiBTVVNFIExpbnV4IEdtYkgKK1M6IEdlcm1hbnkKKwogTjogSm9lcmcgUmV1dGVyCiBFOiBqcmV1dGVyQHlhaW5hLmRlCiBXOiBodHRwOi8veWFpbmEuZGUvanJldXRlci8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvcHN0b3JlIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9wc3RvcmUKaW5kZXggZGRmNDUxZS4uZmYxZGY0ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9wc3RvcmUKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9wc3RvcmUKQEAgLTM5LDMgKzM5LDkgQEAKIAkJbXVsdGlwbGUpIGZpbGVzIGJhc2VkIG9uIHRoZSByZWNvcmQgc2l6ZSBvZiB0aGUgdW5kZXJseWluZwogCQlwZXJzaXN0ZW50IHN0b3JhZ2UgdW50aWwgYXQgbGVhc3QgdGhpcyBhbW91bnQgaXMgcmVhY2hlZC4KIAkJRGVmYXVsdCBpcyAxMCBLYnl0ZXMuCisKKwkJUHN0b3JlIG9ubHkgc3VwcG9ydHMgb25lIGJhY2tlbmQgYXQgYSB0aW1lLiBJZiBtdWx0aXBsZQorCQliYWNrZW5kcyBhcmUgYXZhaWxhYmxlLCB0aGUgcHJlZmVycmVkIGJhY2tlbmQgbWF5IGJlCisJCXNldCBieSBwYXNzaW5nIHRoZSBwc3RvcmUuYmFja2VuZD0gYXJndW1lbnQgdG8gdGhlIGtlcm5lbCBhdAorCQlib290IHRpbWUuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay8uZ2l0aWdub3JlIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rLy5naXRpZ25vcmUKaW5kZXggNjc5MDM0Yy4uNzIwZjI0NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rLy5naXRpZ25vcmUKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rLy5naXRpZ25vcmUKQEAgLTgsNCArOCw3IEBACiAqLmR2aQogKi5sb2cKICoub3V0Ci1tZWRpYS8KKyoucG5nCisqLmdpZgorbWVkaWEtaW5kaWNlcy50bXBsCittZWRpYS1lbnRpdGllcy50bXBsCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUKaW5kZXggM2NlYmZhMC4uNjY3MjVhMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZQpAQCAtMTQsNyArMTQsOSBAQAogCSAgICBnZW5lcmljaXJxLnhtbCBzMzkwLWRyaXZlcnMueG1sIHVpby1ob3d0by54bWwgc2NzaS54bWwgXAogCSAgICA4MDIxMS54bWwgZGVidWdvYmplY3RzLnhtbCBzaC54bWwgcmVndWxhdG9yLnhtbCBcCiAJICAgIGFsc2EtZHJpdmVyLWFwaS54bWwgd3JpdGluZy1hbi1hbHNhLWRyaXZlci54bWwgXAotCSAgICB0cmFjZXBvaW50LnhtbCBtZWRpYS54bWwgZHJtLnhtbAorCSAgICB0cmFjZXBvaW50LnhtbCBkcm0ueG1sIG1lZGlhX2FwaS54bWwKKworaW5jbHVkZSAkKHNyY3RyZWUpL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9NYWtlZmlsZQogCiAjIyMKICMgVGhlIGJ1aWxkIHByb2Nlc3MgaXMgYXMgZm9sbG93cyAodGFyZ2V0cyk6CkBAIC0zMiw3ICszNCw3IEBACiAKICMjIwogIyBUaGUgdGFyZ2V0cyB0aGF0IG1heSBiZSB1c2VkLgotUEhPTlkgKz0geG1sZG9jcyBzZ21sZG9jcyBwc2RvY3MgcGRmZG9jcyBodG1sZG9jcyBtYW5kb2NzIGluc3RhbGxtYW5kb2NzIGNsZWFuZG9jcyB4bWxkb2NsaW5rcworUEhPTlkgKz0geG1sZG9jcyBzZ21sZG9jcyBwc2RvY3MgcGRmZG9jcyBodG1sZG9jcyBtYW5kb2NzIGluc3RhbGxtYW5kb2NzIGNsZWFuZG9jcwogCiBCT09LUyA6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoRE9DQk9PS1MpKQogeG1sZG9jczogJChCT09LUykKQEAgLTQ1LDI3ICs0NywxNCBAQAogcGRmZG9jczogJChQREYpCiAKIEhUTUwgOj0gJChzb3J0ICQocGF0c3Vic3QgJS54bWwsICUuaHRtbCwgJChCT09LUykpKQotaHRtbGRvY3M6ICQoSFRNTCkgeG1sZG9jbGlua3MKK2h0bWxkb2NzOiAkKEhUTUwpCiAJJChjYWxsIGJ1aWxkX21haW5faW5kZXgpCiAJJChjYWxsIGJ1aWxkX2ltYWdlcykKKwkkKGNhbGwgaW5zdGFsbF9tZWRpYV9pbWFnZXMpCiAKIE1BTiA6PSAkKHBhdHN1YnN0ICUueG1sLCAlLjksICQoQk9PS1MpKQogbWFuZG9jczogJChNQU4pCiAKLWJ1aWxkX2ltYWdlcyA9IG1rZGlyIC1wICQob2JqdHJlZSkvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhLyAmJiBcCi0JICAgICAgIGNwICQoc3JjdHJlZSkvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi8qLnBuZyBcCi0JICAgICAgICAgICQoc3JjdHJlZSkvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC8qLmdpZiBcCi0JCSAgJChvYmp0cmVlKS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvCi0KLXhtbGRvY2xpbmtzOgotaWZuZXEgKCQob2JqdHJlZSksJChzcmN0cmVlKSkKLQlmb3IgZGVwIGluIGR2YiBtZWRpYS1lbnRpdGllcy50bXBsIG1lZGlhLWluZGljZXMudG1wbCB2NGw7IGRvIFwKLQkJcm0gLWYgJChvYmp0cmVlKS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svJCRkZXAgXAotCQkmJiBsbiAtcyAkKHNyY3RyZWUpL0RvY3VtZW50YXRpb24vRG9jQm9vay8kJGRlcCAkKG9ianRyZWUpL0RvY3VtZW50YXRpb24vRG9jQm9vay8gXAotCQl8fCBleGl0OyBcCi0JZG9uZQotZW5kaWYKLQogaW5zdGFsbG1hbmRvY3M6IG1hbmRvY3MKIAlta2RpciAtcCAvdXNyL2xvY2FsL21hbi9tYW45LwogCWluc3RhbGwgRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21hbi8qLjkuZ3ogL3Vzci9sb2NhbC9tYW4vbWFuOS8KQEAgLTk3LDExICs4NiwxMSBAQAogICAgICAgICApID4gJChkaXIgJEApLiQobm90ZGlyICRAKS5jbWQKIGVuZGVmCiAKLSUueG1sOiAlLnRtcGwgeG1sZG9jbGlua3MgRk9SQ0UKKyUueG1sOiAlLnRtcGwgRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZF9ydWxlLGRvY3Byb2MpCiAKICMjIwotI1JlYWQgaW4gYWxsIHNhdmVkIGRlcGVuZGVuY3kgZmlsZXMgCisjUmVhZCBpbiBhbGwgc2F2ZWQgZGVwZW5kZW5jeSBmaWxlcwogY21kX2ZpbGVzIDo9ICQod2lsZGNhcmQgJChmb3JlYWNoIGYsJChCT09LUyksJChkaXIgJChmKSkuJChub3RkaXIgJChmKSkuY21kKSkKIAogaWZuZXEgKCQoY21kX2ZpbGVzKSwpCkBAIC0xNTAsNyArMTM5LDcgQEAKIAogaW5kZXggPSBpbmRleC5odG1sCiBtYWluX2lkeCA9IERvY3VtZW50YXRpb24vRG9jQm9vay8kKGluZGV4KQotYnVpbGRfbWFpbl9pbmRleCA9IHJtIC1yZiAkKG1haW5faWR4KSAmJiBcCitidWlsZF9tYWluX2luZGV4ID0gcm0gLXJmICQobWFpbl9pZHgpOyBcCiAJCSAgIGVjaG8gJzxoMT5MaW51eCBLZXJuZWwgSFRNTCBEb2N1bWVudGF0aW9uPC9oMT4nID4+ICQobWFpbl9pZHgpICYmIFwKIAkJICAgZWNobyAnPGgyPktlcm5lbCBWZXJzaW9uOiAkKEtFUk5FTFZFUlNJT04pPC9oMj4nID4+ICQobWFpbl9pZHgpICYmIFwKIAkJICAgY2F0ICQoSFRNTCkgPj4gJChtYWluX2lkeCkKQEAgLTI0Miw3ICsyMzEsNyBAQAogCiBjbGVhbi1kaXJzIDo9ICQocGF0c3Vic3QgJS54bWwsJSwkKERPQ0JPT0tTKSkgbWFuCiAKLWNsZWFuZG9jczoKK2NsZWFuZG9jczogY2xlYW5tZWRpYWRvY3MKIAkkKFEpcm0gLWYgJChjYWxsIG9iamVjdGlmeSwgJChjbGVhbi1maWxlcykpCiAJJChRKXJtIC1yZiAkKGNhbGwgb2JqZWN0aWZ5LCAkKGNsZWFuLWRpcnMpKQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2R2YnByb3BlcnR5LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZHZicHJvcGVydHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTM2NWY2Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZHZicHJvcGVydHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkwICswLDAgQEAKLTxzZWN0aW9uIGlkPSJGRV9HRVRfU0VUX1BST1BFUlRZIj4KLTx0aXRsZT5GRV9HRVRfUFJPUEVSVFkvRkVfU0VUX1BST1BFUlRZPC90aXRsZT4KLQotPHByb2dyYW1saXN0aW5nPgotLyogUmVzZXJ2ZWQgZmllbGRzIHNob3VsZCBiZSBzZXQgdG8gMCAqLwotc3RydWN0IGR0dl9wcm9wZXJ0eSB7Ci0JX191MzIgY21kOwotCXVuaW9uIHsKLQkJX191MzIgZGF0YTsKLQkJc3RydWN0IHsKLQkJCV9fdTggZGF0YVszMl07Ci0JCQlfX3UzMiBsZW47Ci0JCQlfX3UzMiByZXNlcnZlZDFbM107Ci0JCQl2b2lkICpyZXNlcnZlZDI7Ci0JCX0gYnVmZmVyOwotCX0gdTsKLQlpbnQgcmVzdWx0OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIG51bSBvZiBwcm9wZXJ0aWVzIGNhbm5vdCBleGNlZWQgRFRWX0lPQ1RMX01BWF9NU0dTIHBlciBpb2N0bCAqLwotI2RlZmluZSBEVFZfSU9DVExfTUFYX01TR1MgNjQKLQotc3RydWN0IGR0dl9wcm9wZXJ0aWVzIHsKLQlfX3UzMiBudW07Ci0Jc3RydWN0IGR0dl9wcm9wZXJ0eSAqcHJvcHM7Ci19OwotPC9wcm9ncmFtbGlzdGluZz4KLQotPHNlY3Rpb24gaWQ9IkZFX0dFVF9QUk9QRVJUWSI+Ci08dGl0bGU+RkVfR0VUX1BST1BFUlRZPC90aXRsZT4KLTxwYXJhPkRFU0NSSVBUSU9OCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjEiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPlRoaXMgaW9jdGwgY2FsbCByZXR1cm5zIG9uZSBvciBtb3JlIGZyb250ZW5kIHByb3BlcnRpZXMuIFRoaXMgY2FsbCBvbmx5Ci0gcmVxdWlyZXMgcmVhZC1vbmx5IGFjY2VzcyB0byB0aGUgZGV2aWNlLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5TWU5PUFNJUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5pbnQgaW9jdGwoaW50IGZkLCBpbnQgcmVxdWVzdCA9IDxsaW5rIGxpbmtlbmQ9IkZFX0dFVF9QUk9QRVJUWSI+RkVfR0VUX1BST1BFUlRZPC9saW5rPiwKLSBkdHZfcHJvcGVydGllcyAmI3gyMkM2O3Byb3BzKTs8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+UEFSQU1FVEVSUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkgYWxpZ249ImNoYXIiPgotPHBhcmE+aW50IGZkPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5GaWxlIGRlc2NyaXB0b3IgcmV0dXJuZWQgYnkgYSBwcmV2aW91cyBjYWxsIHRvIG9wZW4oKS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+aW50IG51bTwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RXF1YWxzIDxsaW5rIGxpbmtlbmQ9IkZFX0dFVF9QUk9QRVJUWSI+RkVfR0VUX1BST1BFUlRZPC9saW5rPiBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5zdHJ1Y3QgZHR2X3Byb3BlcnR5ICpwcm9wczwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+UG9pbnRzIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgZnJvbnQtZW5kIHByb3BlcnR5IGNvbW1hbmRzIGFyZSBzdG9yZWQuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUzwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+Ci0gIDxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+RUlOVkFMPC9wYXJhPjwvZW50cnk+Ci0gIDxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+SW52YWxpZCBwYXJhbWV0ZXIocykgcmVjZWl2ZWQgb3IgbnVtYmVyIG9mIHBhcmFtZXRlcnMgb3V0IG9mIHRoZSByYW5nZS48L3BhcmE+PC9lbnRyeT4KLSA8L3Jvdz48cm93PgotICA8ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPkVOT01FTTwvcGFyYT48L2VudHJ5PgotICA8ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPk91dCBvZiBtZW1vcnkuPC9wYXJhPjwvZW50cnk+Ci0gPC9yb3c+PHJvdz4KLSAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5FRkFVTFQ8L3BhcmE+PC9lbnRyeT4KLSAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5GYWlsdXJlIHdoaWxlIGNvcHlpbmcgZGF0YSBmcm9tL3RvIHVzZXJzcGFjZS48L3BhcmE+PC9lbnRyeT4KLSA8L3Jvdz48cm93PgotICA8ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPkVPUE5PVFNVUFA8L3BhcmE+PC9lbnRyeT4KLSAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5Qcm9wZXJ0eSB0eXBlIG5vdCBzdXBwb3J0ZWQuPC9wYXJhPjwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uIGlkPSJGRV9TRVRfUFJPUEVSVFkiPgotPHRpdGxlPkZFX1NFVF9QUk9QRVJUWTwvdGl0bGU+Ci08cGFyYT5ERVNDUklQVElPTgotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5UaGlzIGlvY3RsIGNhbGwgc2V0cyBvbmUgb3IgbW9yZSBmcm9udGVuZCBwcm9wZXJ0aWVzLiBUaGlzIGNhbGwgb25seQotIHJlcXVpcmVzIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhlIGRldmljZS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+U1lOT1BTSVMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMSI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+aW50IGlvY3RsKGludCBmZCwgaW50IHJlcXVlc3QgPSA8bGluayBsaW5rZW5kPSJGRV9TRVRfUFJPUEVSVFkiPkZFX1NFVF9QUk9QRVJUWTwvbGluaz4sCi0gZHR2X3Byb3BlcnRpZXMgJiN4MjJDNjtwcm9wcyk7PC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPlBBUkFNRVRFUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5IGFsaWduPSJjaGFyIj4KLTxwYXJhPmludCBmZDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBvcGVuKCkuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmludCBudW08L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVxdWFscyA8bGluayBsaW5rZW5kPSJGRV9TRVRfUFJPUEVSVFkiPkZFX1NFVF9QUk9QRVJUWTwvbGluaz4gZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+c3RydWN0IGR0dl9wcm9wZXJ0eSAqcHJvcHM8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPlBvaW50cyB0byB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGZyb250LWVuZCBwcm9wZXJ0eSBjb21tYW5kcyBhcmUgc3RvcmVkLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+Ci0gIDxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+RUlOVkFMPC9wYXJhPjwvZW50cnk+Ci0gIDxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+SW52YWxpZCBwYXJhbWV0ZXIocykgcmVjZWl2ZWQgb3IgbnVtYmVyIG9mIHBhcmFtZXRlcnMgb3V0IG9mIHRoZSByYW5nZS48L3BhcmE+PC9lbnRyeT4KLSA8L3Jvdz48cm93PgotICA8ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPkVOT01FTTwvcGFyYT48L2VudHJ5PgotICA8ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPk91dCBvZiBtZW1vcnkuPC9wYXJhPjwvZW50cnk+Ci0gPC9yb3c+PHJvdz4KLSAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5FRkFVTFQ8L3BhcmE+PC9lbnRyeT4KLSAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5GYWlsdXJlIHdoaWxlIGNvcHlpbmcgZGF0YSBmcm9tL3RvIHVzZXJzcGFjZS48L3BhcmE+PC9lbnRyeT4KLSA8L3Jvdz48cm93PgotICA8ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPkVPUE5PVFNVUFA8L3BhcmE+PC9lbnRyeT4KLSAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5Qcm9wZXJ0eSB0eXBlIG5vdCBzdXBwb3J0ZWQuPC9wYXJhPjwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uPgotCTx0aXRsZT5Qcm9wZXJ0eSB0eXBlczwvdGl0bGU+Ci08cGFyYT4KLU9uIDxsaW5rIGxpbmtlbmQ9IkZFX0dFVF9QUk9QRVJUWSI+RkVfR0VUX1BST1BFUlRZPC9saW5rPi88bGluayBsaW5rZW5kPSJGRV9TRVRfUFJPUEVSVFkiPkZFX1NFVF9QUk9QRVJUWTwvbGluaz4sCi10aGUgYWN0dWFsIGFjdGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBkdHZfcHJvcGVydHkgY21kL2RhdGEgcGFpcnMuIFdpdGggb25lIHNpbmdsZSBpb2N0bCwgaXMgcG9zc2libGUgdG8KLWdldC9zZXQgdXAgdG8gNjQgcHJvcGVydGllcy4gVGhlIGFjdHVhbCBtZWFuaW5nIG9mIGVhY2ggcHJvcGVydHkgaXMgZGVzY3JpYmVkIG9uIHRoZSBuZXh0IHNlY3Rpb25zLgotPC9wYXJhPgotCi08cGFyYT5UaGUgYXZhaWxhYmxlIGZyb250ZW5kIHByb3BlcnR5IHR5cGVzIGFyZTo8L3BhcmE+Ci08cHJvZ3JhbWxpc3Rpbmc+Ci0jZGVmaW5lIERUVl9VTkRFRklORUQJCTAKLSNkZWZpbmUgRFRWX1RVTkUJCTEKLSNkZWZpbmUgRFRWX0NMRUFSCQkyCi0jZGVmaW5lIERUVl9GUkVRVUVOQ1kJCTMKLSNkZWZpbmUgRFRWX01PRFVMQVRJT04JCTQKLSNkZWZpbmUgRFRWX0JBTkRXSURUSF9IWgk1Ci0jZGVmaW5lIERUVl9JTlZFUlNJT04JCTYKLSNkZWZpbmUgRFRWX0RJU0VRQ19NQVNURVIJNwotI2RlZmluZSBEVFZfU1lNQk9MX1JBVEUJCTgKLSNkZWZpbmUgRFRWX0lOTkVSX0ZFQwkJOQotI2RlZmluZSBEVFZfVk9MVEFHRQkJMTAKLSNkZWZpbmUgRFRWX1RPTkUJCTExCi0jZGVmaW5lIERUVl9QSUxPVAkJMTIKLSNkZWZpbmUgRFRWX1JPTExPRkYJCTEzCi0jZGVmaW5lIERUVl9ESVNFUUNfU0xBVkVfUkVQTFkJMTQKLSNkZWZpbmUgRFRWX0ZFX0NBUEFCSUxJVFlfQ09VTlQJMTUKLSNkZWZpbmUgRFRWX0ZFX0NBUEFCSUxJVFkJMTYKLSNkZWZpbmUgRFRWX0RFTElWRVJZX1NZU1RFTQkxNwotI2RlZmluZSBEVFZfSVNEQlRfUEFSVElBTF9SRUNFUFRJT04JMTgKLSNkZWZpbmUgRFRWX0lTREJUX1NPVU5EX0JST0FEQ0FTVElORwkxOQotI2RlZmluZSBEVFZfSVNEQlRfU0JfU1VCQ0hBTk5FTF9JRAkyMAotI2RlZmluZSBEVFZfSVNEQlRfU0JfU0VHTUVOVF9JRFgJMjEKLSNkZWZpbmUgRFRWX0lTREJUX1NCX1NFR01FTlRfQ09VTlQJMjIKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQV9GRUMJCQkyMwotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJBX01PRFVMQVRJT04JCTI0Ci0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkFfU0VHTUVOVF9DT1VOVAkJMjUKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQV9USU1FX0lOVEVSTEVBVklORwkyNgotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJCX0ZFQwkJCTI3Ci0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkJfTU9EVUxBVElPTgkJMjgKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQl9TRUdNRU5UX0NPVU5UCQkyOQotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJCX1RJTUVfSU5URVJMRUFWSU5HCTMwCi0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkNfRkVDCQkJMzEKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQ19NT0RVTEFUSU9OCQkzMgotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJDX1NFR01FTlRfQ09VTlQJCTMzCi0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkNfVElNRV9JTlRFUkxFQVZJTkcJMzQKLSNkZWZpbmUgRFRWX0FQSV9WRVJTSU9OCQkzNQotI2RlZmluZSBEVFZfQ09ERV9SQVRFX0hQCTM2Ci0jZGVmaW5lIERUVl9DT0RFX1JBVEVfTFAJMzcKLSNkZWZpbmUgRFRWX0dVQVJEX0lOVEVSVkFMCTM4Ci0jZGVmaW5lIERUVl9UUkFOU01JU1NJT05fTU9ERQkzOQotI2RlZmluZSBEVFZfSElFUkFSQ0hZCQk0MAotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJfRU5BQkxFRAk0MQotI2RlZmluZSBEVFZfSVNEQlNfVFNfSUQJCTQyCi08L3Byb2dyYW1saXN0aW5nPgotPC9zZWN0aW9uPgotCi08c2VjdGlvbiBpZD0iZmVfcHJvcGVydHlfY29tbW9uIj4KLQk8dGl0bGU+UGFyYW1ldGVycyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIERpZ2l0YWwgVFYgc3RhbmRhcmRzPC90aXRsZT4KLQk8c2VjdGlvbiBpZD0iRFRWX0ZSRVFVRU5DWSI+Ci0JCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0ZSRVFVRU5DWTwvY29uc3RhbnQ+PC90aXRsZT4KLQotCQk8cGFyYT5DZW50cmFsIGZyZXF1ZW5jeSBvZiB0aGUgY2hhbm5lbCwgaW4gSFouPC9wYXJhPgotCi0JCTxwYXJhPk5vdGVzOjwvcGFyYT4KLQkJPHBhcmE+MSlGb3IgSVNEQi1ULCB0aGUgY2hhbm5lbHMgYXJlIHVzdWFsbHkgdHJhbnNtaXR0ZWQgd2l0aCBhbiBvZmZzZXQgb2YgMTQza0h6LgotCQkJRS5nLiBhIHZhbGlkIGZyZXF1bmN5IGNvdWxkIGJlIDQ3NDE0MyBrSHouIFRoZSBzdGVwcGluZyBpcyBib3VuZCB0byB0aGUgYmFuZHdpZHRoIG9mCi0JCQl0aGUgY2hhbm5lbCB3aGljaCBpcyA2TUh6LjwvcGFyYT4KLQotCQk8cGFyYT4yKUFzIGluIElTREItVHNiIHRoZSBjaGFubmVsIGNvbnNpc3RzIG9mIG9ubHkgb25lIG9yIHRocmVlIHNlZ21lbnRzIHRoZQotCQkJZnJlcXVlbmN5IHN0ZXAgaXMgNDI5a0h6LCAzKjQyOSByZXNwZWN0aXZlbHkuIEFzIGZvciBJU0RCLVQgdGhlCi0JCQljZW50cmFsIGZyZXF1ZW5jeSBvZiB0aGUgY2hhbm5lbCBpcyBleHBlY3RlZC48L3BhcmE+Ci0JPC9zZWN0aW9uPgotCi0JPHNlY3Rpb24gaWQ9IkRUVl9CQU5EV0lEVEhfSFoiPgotCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9CQU5EV0lEVEhfSFo8L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJPHBhcmE+QmFuZHdpZHRoIGZvciB0aGUgY2hhbm5lbCwgaW4gSFouPC9wYXJhPgotCi0JCTxwYXJhPlBvc3NpYmxlIHZhbHVlczoKLQkJCTxjb25zdGFudD4xNzEyMDAwPC9jb25zdGFudD4sCi0JCQk8Y29uc3RhbnQ+NTAwMDAwMDwvY29uc3RhbnQ+LAotCQkJPGNvbnN0YW50PjYwMDAwMDA8L2NvbnN0YW50PiwKLQkJCTxjb25zdGFudD43MDAwMDAwPC9jb25zdGFudD4sCi0JCQk8Y29uc3RhbnQ+ODAwMDAwMDwvY29uc3RhbnQ+LAotCQkJPGNvbnN0YW50PjEwMDAwMDAwPC9jb25zdGFudD4uCi0JCTwvcGFyYT4KLQotCQk8cGFyYT5Ob3Rlczo8L3BhcmE+Ci0KLQkJPHBhcmE+MSkgRm9yIElTREItVCBpdCBzaG91bGQgYmUgYWx3YXlzIDYwMDAwMDBIeiAoNk1Ieik8L3BhcmE+Ci0JCTxwYXJhPjIpIEZvciBJU0RCLVRzYiBpdCBjYW4gdmFyeSBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBjb25uZWN0ZWQgc2VnbWVudHM8L3BhcmE+Ci0JCTxwYXJhPjMpIEJhbmR3aWR0aCBkb2Vzbid0IGFwcGx5IGZvciBEVkItQyB0cmFuc21pc3Npb25zLCBhcyB0aGUgYmFuZHdpZHRoCi0JCQkgZm9yIERWQi1DIGRlcGVuZHMgb24gdGhlIHN5bWJvbCByYXRlPC9wYXJhPgotCQk8cGFyYT40KSBCYW5kd2lkdGggaW4gSVNEQi1UIGlzIGZpeGVkICg2TUh6KSBvciBjYW4gYmUgZWFzaWx5IGRlcml2ZWQgZnJvbQotCQkJb3RoZXIgcGFyYW1ldGVycyAoRFRWX0lTREJUX1NCX1NFR01FTlRfSURYLAotCQkJRFRWX0lTREJUX1NCX1NFR01FTlRfQ09VTlQpLjwvcGFyYT4KLQkJPHBhcmE+NSkgRFZCLVQgc3VwcG9ydHMgNiwgNyBhbmQgOE1Iei48L3BhcmE+Ci0JCTxwYXJhPjYpIEluIGFkZGl0aW9uLCBEVkItVDIgc3VwcG9ydHMgMS4xNzIsIDUgYW5kIDEwTUh6LjwvcGFyYT4KLQk8L3NlY3Rpb24+Ci0KLQk8c2VjdGlvbiBpZD0iRFRWX0RFTElWRVJZX1NZU1RFTSI+Ci0JCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0RFTElWRVJZX1NZU1RFTTwvY29uc3RhbnQ+PC90aXRsZT4KLQotCQk8cGFyYT5TcGVjaWZpZXMgdGhlIHR5cGUgb2YgRGVsaXZlcnkgc3lzdGVtPC9wYXJhPgotCi0JCTxwYXJhPlBvc3NpYmxlIHZhbHVlczogPC9wYXJhPgotPHByb2dyYW1saXN0aW5nPgotdHlwZWRlZiBlbnVtIGZlX2RlbGl2ZXJ5X3N5c3RlbSB7Ci0JU1lTX1VOREVGSU5FRCwKLQlTWVNfRFZCQ19BTk5FWF9BQywKLQlTWVNfRFZCQ19BTk5FWF9CLAotCVNZU19EVkJULAotCVNZU19EU1MsCi0JU1lTX0RWQlMsCi0JU1lTX0RWQlMyLAotCVNZU19EVkJILAotCVNZU19JU0RCVCwKLQlTWVNfSVNEQlMsCi0JU1lTX0lTREJDLAotCVNZU19BVFNDLAotCVNZU19BVFNDTUgsCi0JU1lTX0RNQlRILAotCVNZU19DTU1CLAotCVNZU19EQUIsCi0JU1lTX0RWQlQyLAotfSBmZV9kZWxpdmVyeV9zeXN0ZW1fdDsKLTwvcHJvZ3JhbWxpc3Rpbmc+Ci0KLQk8L3NlY3Rpb24+Ci0KLQk8c2VjdGlvbiBpZD0iRFRWX1RSQU5TTUlTU0lPTl9NT0RFIj4KLQkJPHRpdGxlPjxjb25zdGFudD5EVFZfVFJBTlNNSVNTSU9OX01PREU8L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJPHBhcmE+U3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY2FycmllcnMgdXNlZCBieSB0aGUgc3RhbmRhcmQ8L3BhcmE+Ci0KLQkJPHBhcmE+UG9zc2libGUgdmFsdWVzIGFyZTo8L3BhcmE+Ci08cHJvZ3JhbWxpc3Rpbmc+Ci10eXBlZGVmIGVudW0gZmVfdHJhbnNtaXRfbW9kZSB7Ci0JVFJBTlNNSVNTSU9OX01PREVfMkssCi0JVFJBTlNNSVNTSU9OX01PREVfOEssCi0JVFJBTlNNSVNTSU9OX01PREVfQVVUTywKLQlUUkFOU01JU1NJT05fTU9ERV80SywKLQlUUkFOU01JU1NJT05fTU9ERV8xSywKLQlUUkFOU01JU1NJT05fTU9ERV8xNkssCi0JVFJBTlNNSVNTSU9OX01PREVfMzJLLAotfSBmZV90cmFuc21pdF9tb2RlX3Q7Ci08L3Byb2dyYW1saXN0aW5nPgotCi0JCTxwYXJhPk5vdGVzOjwvcGFyYT4KLQkJPHBhcmE+MSkgSVNEQi1UIHN1cHBvcnRzIHRocmVlIGNhcnJpZXIvc3ltYm9sLXNpemU6IDhLLCA0SywgMksuIEl0IGlzIGNhbGxlZAotCQkJJ21vZGUnIGluIHRoZSBzdGFuZGFyZDogTW9kZSAxIGlzIDJLLCBtb2RlIDIgaXMgNEssIG1vZGUgMyBpcyA4SzwvcGFyYT4KLQotCQk8cGFyYT4yKSBJZiA8Y29uc3RhbnQ+RFRWX1RSQU5TTUlTU0lPTl9NT0RFPC9jb25zdGFudD4gaXMgc2V0IHRoZSA8Y29uc3RhbnQ+VFJBTlNNSVNTSU9OX01PREVfQVVUTzwvY29uc3RhbnQ+IHRoZQotCQkJaGFyZHdhcmUgd2lsbCB0cnkgdG8gZmluZCB0aGUgY29ycmVjdCBGRlQtc2l6ZSAoaWYgY2FwYWJsZSkgYW5kIHdpbGwKLQkJCXVzZSBUTUNDIHRvIGZpbGwgaW4gdGhlIG1pc3NpbmcgcGFyYW1ldGVycy48L3BhcmE+Ci0JCTxwYXJhPjMpIERWQi1UIHNwZWNpZmllcyAySyBhbmQgOEsgYXMgdmFsaWQgc2l6ZXMuPC9wYXJhPgotCQk8cGFyYT40KSBEVkItVDIgc3BlY2lmaWVzIDFLLCAySywgNEssIDhLLCAxNksgYW5kIDMySy48L3BhcmE+Ci0JPC9zZWN0aW9uPgotCi0JPHNlY3Rpb24gaWQ9IkRUVl9HVUFSRF9JTlRFUlZBTCI+Ci0JCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0dVQVJEX0lOVEVSVkFMPC9jb25zdGFudD48L3RpdGxlPgotCi0JCTxwYXJhPlBvc3NpYmxlIHZhbHVlcyBhcmU6PC9wYXJhPgotPHByb2dyYW1saXN0aW5nPgotdHlwZWRlZiBlbnVtIGZlX2d1YXJkX2ludGVydmFsIHsKLQlHVUFSRF9JTlRFUlZBTF8xXzMyLAotCUdVQVJEX0lOVEVSVkFMXzFfMTYsCi0JR1VBUkRfSU5URVJWQUxfMV84LAotCUdVQVJEX0lOVEVSVkFMXzFfNCwKLQlHVUFSRF9JTlRFUlZBTF9BVVRPLAotCUdVQVJEX0lOVEVSVkFMXzFfMTI4LAotCUdVQVJEX0lOVEVSVkFMXzE5XzEyOCwKLQlHVUFSRF9JTlRFUlZBTF8xOV8yNTYsCi19IGZlX2d1YXJkX2ludGVydmFsX3Q7Ci08L3Byb2dyYW1saXN0aW5nPgotCi0JCTxwYXJhPk5vdGVzOjwvcGFyYT4KLQkJPHBhcmE+MSkgSWYgPGNvbnN0YW50PkRUVl9HVUFSRF9JTlRFUlZBTDwvY29uc3RhbnQ+IGlzIHNldCB0aGUgPGNvbnN0YW50PkdVQVJEX0lOVEVSVkFMX0FVVE88L2NvbnN0YW50PiB0aGUgaGFyZHdhcmUgd2lsbAotCQkJdHJ5IHRvIGZpbmQgdGhlIGNvcnJlY3QgZ3VhcmQgaW50ZXJ2YWwgKGlmIGNhcGFibGUpIGFuZCB3aWxsIHVzZSBUTUNDIHRvIGZpbGwKLQkJCWluIHRoZSBtaXNzaW5nIHBhcmFtZXRlcnMuPC9wYXJhPgotCQk8cGFyYT4yKSBJbnRlcnZhbHMgMS8xMjgsIDE5LzEyOCBhbmQgMTkvMjU2IGFyZSB1c2VkIG9ubHkgZm9yIERWQi1UMiBhdCBwcmVzZW50PC9wYXJhPgotCTwvc2VjdGlvbj4KLTwvc2VjdGlvbj4KLQotPHNlY3Rpb24gaWQ9ImlzZGJ0Ij4KLQk8dGl0bGU+SVNEQi1UIGZyb250ZW5kPC90aXRsZT4KLQk8cGFyYT5UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHNob3J0bHkgd2hhdCBhcmUgdGhlIHBvc3NpYmxlIHBhcmFtZXRlcnMgaW4gdGhlIExpbnV4Ci0JCURWQi1BUEkgY2FsbGVkICJTMkFQSSIgYW5kIG5vdyBEVkIgQVBJIDUgaW4gb3JkZXIgdG8gdHVuZSBhbiBJU0RCLVQvSVNEQi1Uc2IKLQkJZGVtb2R1bGF0b3I6PC9wYXJhPgotCi0JPHBhcmE+VGhpcyBJU0RCLVQvSVNEQi1Uc2IgQVBJIGV4dGVuc2lvbiBzaG91bGQgcmVmbGVjdCBhbGwgaW5mb3JtYXRpb24KLQkJbmVlZGVkIHRvIHR1bmUgYW55IElTREItVC9JU0RCLVRzYiBoYXJkd2FyZS4gT2YgY291cnNlIGl0IGlzIHBvc3NpYmxlCi0JCXRoYXQgc29tZSB2ZXJ5IHNvcGhpc3RpY2F0ZWQgZGV2aWNlcyB3b24ndCBuZWVkIGNlcnRhaW4gcGFyYW1ldGVycyB0bwotCQl0dW5lLjwvcGFyYT4KLQotCTxwYXJhPlRoZSBpbmZvcm1hdGlvbiBnaXZlbiBoZXJlIHNob3VsZCBoZWxwIGFwcGxpY2F0aW9uIHdyaXRlcnMgdG8ga25vdyBob3cKLQkJdG8gaGFuZGxlIElTREItVCBhbmQgSVNEQi1Uc2IgaGFyZHdhcmUgdXNpbmcgdGhlIExpbnV4IERWQi1BUEkuPC9wYXJhPgotCi0JPHBhcmE+VGhlIGRldGFpbHMgZ2l2ZW4gaGVyZSBhYm91dCBJU0RCLVQgYW5kIElTREItVHNiIGFyZSBqdXN0IGVub3VnaCB0bwotCQliYXNpY2FsbHkgc2hvdyB0aGUgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlIG5lZWRlZCBwYXJhbWV0ZXIgdmFsdWVzLAotCQlidXQgc3VyZWx5IHNvbWUgaW5mb3JtYXRpb24gaXMgbGVmdCBvdXQuIEZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uCi0JCXNlZSB0aGUgZm9sbG93aW5nIGRvY3VtZW50czo8L3BhcmE+Ci0KLQk8cGFyYT5BUklCIFNURC1CMzEgLSAiVHJhbnNtaXNzaW9uIFN5c3RlbSBmb3IgRGlnaXRhbCBUZXJyZXN0cmlhbAotCQlUZWxldmlzaW9uIEJyb2FkY2FzdGluZyIgYW5kPC9wYXJhPgotCTxwYXJhPkFSSUIgVFItQjE0IC0gIk9wZXJhdGlvbmFsIEd1aWRlbGluZXMgZm9yIERpZ2l0YWwgVGVycmVzdHJpYWwKLQkJVGVsZXZpc2lvbiBCcm9hZGNhc3RpbmciLjwvcGFyYT4KLQotCTxwYXJhPkluIG9yZGVyIHRvIHJlYWQgdGhpcyBkb2N1bWVudCBvbmUgaGFzIHRvIGhhdmUgc29tZSBrbm93bGVkZ2UgdGhlCi0JCWNoYW5uZWwgc3RydWN0dXJlIGluIElTREItVCBhbmQgSVNEQi1Uc2IuIEkuZS4gaXQgaGFzIHRvIGJlIGtub3duIHRvCi0JCXRoZSByZWFkZXIgdGhhdCBhbiBJU0RCLVQgY2hhbm5lbCBjb25zaXN0cyBvZiAxMyBzZWdtZW50cywgdGhhdCBpdCBjYW4KLQkJaGF2ZSB1cCB0byAzIGxheWVyIHNoYXJpbmcgdGhvc2Ugc2VnbWVudHMsIGFuZCB0aGluZ3MgbGlrZSB0aGF0LjwvcGFyYT4KLQotCTxwYXJhPlBhcmFtZXRlcnMgdXNlZCBieSBJU0RCLVQgYW5kIElTREItVHNiLjwvcGFyYT4KLQotCTxzZWN0aW9uIGlkPSJpc2RidC1uZXctcGFybXMiPgotCQk8dGl0bGU+SVNEQi1UIG9ubHkgcGFyYW1ldGVyczwvdGl0bGU+Ci0KLQkJPHNlY3Rpb24gaWQ9ImlzZGJ0LXBhcnQtcmVjIj4KLQkJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lTREJUX1BBUlRJQUxfUkVDRVBUSU9OPC9jb25zdGFudD48L3RpdGxlPgotCi0JCQk8cGFyYT48Y29uc3RhbnQ+SWYgRFRWX0lTREJUX1NPVU5EX0JST0FEQ0FTVElORzwvY29uc3RhbnQ+IGlzICcwJyB0aGlzIGJpdC1maWVsZCByZXByZXNlbnRzIHdoZXRoZXIKLQkJCQl0aGUgY2hhbm5lbCBpcyBpbiBwYXJ0aWFsIHJlY2VwdGlvbiBtb2RlIG9yIG5vdC48L3BhcmE+Ci0KLQkJCTxwYXJhPklmICcxJyA8Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSQV8qPC9jb25zdGFudD4gdmFsdWVzIGFyZSBhc3NpZ25lZCB0byB0aGUgY2VudGVyIHNlZ21lbnQgYW5kCi0JCQkJPGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUkFfU0VHTUVOVF9DT1VOVDwvY29uc3RhbnQ+IGhhcyB0byBiZSAnMScuPC9wYXJhPgotCi0JCQk8cGFyYT5JZiBpbiBhZGRpdGlvbiA8Y29uc3RhbnQ+RFRWX0lTREJUX1NPVU5EX0JST0FEQ0FTVElORzwvY29uc3RhbnQ+IGlzICcxJwotCQkJCTxjb25zdGFudD5EVFZfSVNEQlRfUEFSVElBTF9SRUNFUFRJT048L2NvbnN0YW50PiByZXByZXNlbnRzIHdoZXRoZXIgdGhpcyBJU0RCLVRzYiBjaGFubmVsCi0JCQkJaXMgY29uc2lzdGluZyBvZiBvbmUgc2VnbWVudCBhbmQgbGF5ZXIgb3IgdGhyZWUgc2VnbWVudHMgYW5kIHR3byBsYXllcnMuPC9wYXJhPgotCi0JCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDAsIDEsIC0xIChBVVRPKTwvcGFyYT4KLQkJPC9zZWN0aW9uPgotCi0JCTxzZWN0aW9uIGlkPSJpc2RidC1zb3VuZC1iY2FzdCI+Ci0JCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJCTxwYXJhPlRoaXMgZmllbGQgcmVwcmVzZW50cyB3aGV0aGVyIHRoZSBvdGhlciBEVFZfSVNEQlRfKi1wYXJhbWV0ZXJzIGFyZQotCQkJCXJlZmVycmluZyB0byBhbiBJU0RCLVQgYW5kIGFuIElTREItVHNiIGNoYW5uZWwuIChTZWUgYWxzbwotCQkJCTxjb25zdGFudD5EVFZfSVNEQlRfUEFSVElBTF9SRUNFUFRJT048L2NvbnN0YW50PikuPC9wYXJhPgotCi0JCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDAsIDEsIC0xIChBVVRPKTwvcGFyYT4KLQkJPC9zZWN0aW9uPgotCi0JCTxzZWN0aW9uIGlkPSJpc2RidC1zYi1jaC1pZCI+Ci0JCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9TQl9TVUJDSEFOTkVMX0lEPC9jb25zdGFudD48L3RpdGxlPgotCi0JCQk8cGFyYT5UaGlzIGZpZWxkIG9ubHkgYXBwbGllcyBpZiA8Y29uc3RhbnQ+RFRWX0lTREJUX1NPVU5EX0JST0FEQ0FTVElORzwvY29uc3RhbnQ+IGlzICcxJy48L3BhcmE+Ci0KLQkJCTxwYXJhPihOb3RlIG9mIHRoZSBhdXRob3I6IFRoaXMgbWlnaHQgbm90IGJlIHRoZSBjb3JyZWN0IGRlc2NyaXB0aW9uIG9mIHRoZQotCQkJCTxjb25zdGFudD5TVUJDSEFOTkVMLUlEPC9jb25zdGFudD4gaW4gYWxsIGRldGFpbHMsIGJ1dCBpdCBpcyBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSB0ZWNobmljYWwKLQkJCQliYWNrZ3JvdW5kIG5lZWRlZCB0byBwcm9ncmFtIGEgZGV2aWNlKTwvcGFyYT4KLQotCQkJPHBhcmE+QW4gSVNEQi1Uc2IgY2hhbm5lbCAoMSBvciAzIHNlZ21lbnRzKSBjYW4gYmUgYnJvYWRjYXN0ZWQgYWxvbmUgb3IgaW4gYQotCQkJCXNldCBvZiBjb25uZWN0ZWQgSVNEQi1Uc2IgY2hhbm5lbHMuIEluIHRoaXMgc2V0IG9mIGNoYW5uZWxzIGV2ZXJ5Ci0JCQkJY2hhbm5lbCBjYW4gYmUgcmVjZWl2ZWQgaW5kZXBlbmRlbnRseS4gVGhlIG51bWJlciBvZiBjb25uZWN0ZWQKLQkJCQlJU0RCLVRzYiBzZWdtZW50IGNhbiB2YXJ5LCBlLmcuIGRlcGVuZGluZyBvbiB0aGUgZnJlcXVlbmN5IHNwZWN0cnVtCi0JCQkJYmFuZHdpZHRoIGF2YWlsYWJsZS48L3BhcmE+Ci0KLQkJCTxwYXJhPkV4YW1wbGU6IEFzc3VtZSA4IElTREItVHNiIGNvbm5lY3RlZCBzZWdtZW50cyBhcmUgYnJvYWRjYXN0ZWQuIFRoZQotCQkJCWJyb2FkY2FzdGVyIGhhcyBzZXZlcmFsIHBvc3NpYmlsaXRpZXMgdG8gcHV0IHRob3NlIGNoYW5uZWxzIGluIHRoZQotCQkJCWFpcjogQXNzdW1pbmcgYSBub3JtYWwgMTMtc2VnbWVudCBJU0RCLVQgc3BlY3RydW0gaGUgY2FuIGFsaWduIHRoZSA4Ci0JCQkJc2VnbWVudHMgZnJvbSBwb3NpdGlvbiAxLTggdG8gNS0xMyBvciBhbnl0aGluZyBpbiBiZXR3ZWVuLjwvcGFyYT4KLQotCQkJPHBhcmE+VGhlIHVuZGVybHlpbmcgbGF5ZXIgb2Ygc2VnbWVudHMgYXJlIHN1YmNoYW5uZWxzOiBlYWNoIHNlZ21lbnQgaXMKLQkJCQljb25zaXN0aW5nIG9mIHNldmVyYWwgc3ViY2hhbm5lbHMgd2l0aCBhIHByZWRlZmluZWQgSURzLiBBIHN1Yi1jaGFubmVsCi0JCQkJaXMgdXNlZCB0byBoZWxwIHRoZSBkZW1vZHVsYXRvciB0byBzeW5jaHJvbml6ZSBvbiB0aGUgY2hhbm5lbC48L3BhcmE+Ci0KLQkJCTxwYXJhPkFuIElTREItVCBjaGFubmVsIGlzIGFsd2F5cyBjZW50ZXJlZCBvdmVyIGFsbCBzdWItY2hhbm5lbHMuIEFzIGZvcgotCQkJCXRoZSBleGFtcGxlIGFib3ZlLCBpbiBJU0RCLVRzYiBpdCBpcyBubyBsb25nZXIgYXMgc2ltcGxlIGFzIHRoYXQuPC9wYXJhPgotCi0JCQk8cGFyYT48Y29uc3RhbnQ+VGhlIERUVl9JU0RCVF9TQl9TVUJDSEFOTkVMX0lEPC9jb25zdGFudD4gcGFyYW1ldGVyIGlzIHVzZWQgdG8gZ2l2ZSB0aGUKLQkJCQlzdWItY2hhbm5lbCBJRCBvZiB0aGUgc2VnbWVudCB0byBiZSBkZW1vZHVsYXRlZC48L3BhcmE+Ci0KLQkJCTxwYXJhPlBvc3NpYmxlIHZhbHVlczogMCAuLiA0MSwgLTEgKEFVVE8pPC9wYXJhPgotCQk8L3NlY3Rpb24+Ci0KLQkJPHNlY3Rpb24gaWQ9ImlzZGJ0LXNiLXNlZy1pZHgiPgotCi0JCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9TQl9TRUdNRU5UX0lEWDwvY29uc3RhbnQ+PC90aXRsZT4KLQotCQkJPHBhcmE+VGhpcyBmaWVsZCBvbmx5IGFwcGxpZXMgaWYgPGNvbnN0YW50PkRUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PiBpcyAnMScuPC9wYXJhPgotCi0JCQk8cGFyYT48Y29uc3RhbnQ+RFRWX0lTREJUX1NCX1NFR01FTlRfSURYPC9jb25zdGFudD4gZ2l2ZXMgdGhlIGluZGV4IG9mIHRoZSBzZWdtZW50IHRvIGJlCi0JCQkJZGVtb2R1bGF0ZWQgZm9yIGFuIElTREItVHNiIGNoYW5uZWwgd2hlcmUgc2V2ZXJhbCBvZiB0aGVtIGFyZQotCQkJCXRyYW5zbWl0dGVkIGluIHRoZSBjb25uZWN0ZWQgbWFubmVyLjwvcGFyYT4KLQotCQkJPHBhcmE+UG9zc2libGUgdmFsdWVzOiAwIC4uIDxjb25zdGFudD5EVFZfSVNEQlRfU0JfU0VHTUVOVF9DT1VOVDwvY29uc3RhbnQ+IC0gMTwvcGFyYT4KLQotCQkJPHBhcmE+Tm90ZTogVGhpcyB2YWx1ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBieSBhbiBhdXRvbWF0aWMgY2hhbm5lbCBzZWFyY2guPC9wYXJhPgotCQk8L3NlY3Rpb24+Ci0KLQkJPHNlY3Rpb24gaWQ9ImlzZGJ0LXNiLXNlZy1jbnQiPgotCQkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfU0JfU0VHTUVOVF9DT1VOVDwvY29uc3RhbnQ+PC90aXRsZT4KLQotCQkJPHBhcmE+VGhpcyBmaWVsZCBvbmx5IGFwcGxpZXMgaWYgPGNvbnN0YW50PkRUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PiBpcyAnMScuPC9wYXJhPgotCi0JCQk8cGFyYT48Y29uc3RhbnQ+RFRWX0lTREJUX1NCX1NFR01FTlRfQ09VTlQ8L2NvbnN0YW50PiBnaXZlcyB0aGUgdG90YWwgY291bnQgb2YgY29ubmVjdGVkIElTREItVHNiCi0JCQkJY2hhbm5lbHMuPC9wYXJhPgotCi0JCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDEgLi4gMTM8L3BhcmE+Ci0KLQkJCTxwYXJhPk5vdGU6IFRoaXMgdmFsdWUgY2Fubm90IGJlIGRldGVybWluZWQgYnkgYW4gYXV0b21hdGljIGNoYW5uZWwgc2VhcmNoLjwvcGFyYT4KLQkJPC9zZWN0aW9uPgotCi0JCTxzZWN0aW9uIGlkPSJpc2RiLWhpZXJxLWxheWVycyI+Ci0JCQk8dGl0bGU+SGllcmFyY2hpY2FsIGxheWVyczwvdGl0bGU+Ci0KLQkJCTxwYXJhPklTREItVCBjaGFubmVscyBjYW4gYmUgY29kZWQgaGllcmFyY2hpY2FsbHkuIEFzIG9wcG9zZWQgdG8gRFZCLVQgaW4KLQkJCQlJU0RCLVQgaGllcmFyY2hpY2FsIGxheWVycyBjYW4gYmUgZGVjb2RlZCBzaW11bHRhbmVvdXNseS4gRm9yIHRoYXQKLQkJCQlyZWFzb24gYSBJU0RCLVQgZGVtb2R1bGF0b3IgaGFzIDMgdml0ZXJiaSBhbmQgMyByZWVkLXNvbG9tb24tZGVjb2RlcnMuPC9wYXJhPgotCi0JCQk8cGFyYT5JU0RCLVQgaGFzIDMgaGllcmFyY2hpY2FsIGxheWVycyB3aGljaCBlYWNoIGNhbiB1c2UgYSBwYXJ0IG9mIHRoZQotCQkJCWF2YWlsYWJsZSBzZWdtZW50cy4gVGhlIHRvdGFsIG51bWJlciBvZiBzZWdtZW50cyBvdmVyIGFsbCBsYXllcnMgaGFzCi0JCQkJdG8gMTMgaW4gSVNEQi1ULjwvcGFyYT4KLQotCQkJPHNlY3Rpb24gaWQ9ImlzZGJ0LWxheWVyLWVuYSI+Ci0JCQkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJfRU5BQkxFRDwvY29uc3RhbnQ+PC90aXRsZT4KLQotCQkJCTxwYXJhPkhpZXJhcmNoaWNhbCByZWNlcHRpb24gaW4gSVNEQi1UIGlzIGFjaGlldmVkIGJ5IGVuYWJsaW5nIG9yIGRpc2FibGluZwotCQkJCQlsYXllcnMgaW4gdGhlIGRlY29kaW5nIHByb2Nlc3MuIFNldHRpbmcgYWxsIGJpdHMgb2YKLQkJCQkJPGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUl9FTkFCTEVEPC9jb25zdGFudD4gdG8gJzEnIGZvcmNlcyBhbGwgbGF5ZXJzIChpZiBhcHBsaWNhYmxlKSB0byBiZQotCQkJCQlkZW1vZHVsYXRlZC4gVGhpcyBpcyB0aGUgZGVmYXVsdC48L3BhcmE+Ci0KLQkJCQk8cGFyYT5JZiB0aGUgY2hhbm5lbCBpcyBpbiB0aGUgcGFydGlhbCByZWNlcHRpb24gbW9kZQotCQkJCQkoPGNvbnN0YW50PkRUVl9JU0RCVF9QQVJUSUFMX1JFQ0VQVElPTjwvY29uc3RhbnQ+ID0gMSkgdGhlIGNlbnRyYWwgc2VnbWVudCBjYW4gYmUgZGVjb2RlZAotCQkJCQlpbmRlcGVuZGVudGx5IG9mIHRoZSBvdGhlciAxMiBzZWdtZW50cy4gSW4gdGhhdCBtb2RlIGxheWVyIEEgaGFzIHRvCi0JCQkJCWhhdmUgYSA8Y29uc3RhbnQ+U0VHTUVOVF9DT1VOVDwvY29uc3RhbnQ+IG9mIDEuPC9wYXJhPgotCi0JCQkJPHBhcmE+SW4gSVNEQi1Uc2Igb25seSBsYXllciBBIGlzIHVzZWQsIGl0IGNhbiBiZSAxIG9yIDMgaW4gSVNEQi1Uc2IKLQkJCQkJYWNjb3JkaW5nIHRvIDxjb25zdGFudD5EVFZfSVNEQlRfUEFSVElBTF9SRUNFUFRJT048L2NvbnN0YW50Pi4gPGNvbnN0YW50PlNFR01FTlRfQ09VTlQ8L2NvbnN0YW50PiBtdXN0IGJlIGZpbGxlZAotCQkJCQlhY2NvcmRpbmdseS48L3BhcmE+Ci0KLQkJCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDB4MSwgMHgyLCAweDQgKHwtYWJsZSk8L3BhcmE+Ci0KLQkJCQk8cGFyYT48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSX0VOQUJMRURbMDowXTwvY29uc3RhbnQ+IC0gbGF5ZXIgQTwvcGFyYT4KLQkJCQk8cGFyYT48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSX0VOQUJMRURbMToxXTwvY29uc3RhbnQ+IC0gbGF5ZXIgQjwvcGFyYT4KLQkJCQk8cGFyYT48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSX0VOQUJMRURbMjoyXTwvY29uc3RhbnQ+IC0gbGF5ZXIgQzwvcGFyYT4KLQkJCQk8cGFyYT48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSX0VOQUJMRURbMzE6M108L2NvbnN0YW50PiB1bnVzZWQ8L3BhcmE+Ci0JCQk8L3NlY3Rpb24+Ci0KLQkJCTxzZWN0aW9uIGlkPSJpc2RidC1sYXllci1mZWMiPgotCQkJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSKl9GRUM8L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDxjb25zdGFudD5GRUNfQVVUTzwvY29uc3RhbnQ+LCA8Y29uc3RhbnQ+RkVDXzFfMjwvY29uc3RhbnQ+LCA8Y29uc3RhbnQ+RkVDXzJfMzwvY29uc3RhbnQ+LCA8Y29uc3RhbnQ+RkVDXzNfNDwvY29uc3RhbnQ+LCA8Y29uc3RhbnQ+RkVDXzVfNjwvY29uc3RhbnQ+LCA8Y29uc3RhbnQ+RkVDXzdfODwvY29uc3RhbnQ+PC9wYXJhPgotCQkJPC9zZWN0aW9uPgotCi0JCQk8c2VjdGlvbiBpZD0iaXNkYnQtbGF5ZXItbW9kIj4KLQkJCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUipfTU9EVUxBVElPTjwvY29uc3RhbnQ+PC90aXRsZT4KLQotCQkJCTxwYXJhPlBvc3NpYmxlIHZhbHVlczogPGNvbnN0YW50PlFBTV9BVVRPPC9jb25zdGFudD4sIFFQPGNvbnN0YW50PlNLLCBRQU1fMTY8L2NvbnN0YW50PiwgPGNvbnN0YW50PlFBTV82NDwvY29uc3RhbnQ+LCA8Y29uc3RhbnQ+RFFQU0s8L2NvbnN0YW50PjwvcGFyYT4KLQotCQkJCTxwYXJhPk5vdGU6IElmIGxheWVyIEMgaXMgPGNvbnN0YW50PkRRUFNLPC9jb25zdGFudD4gbGF5ZXIgQiBoYXMgdG8gYmUgPGNvbnN0YW50PkRRUFNLPC9jb25zdGFudD4uIElmIGxheWVyIEIgaXMgPGNvbnN0YW50PkRRUFNLPC9jb25zdGFudD4KLQkJCQkJYW5kIDxjb25zdGFudD5EVFZfSVNEQlRfUEFSVElBTF9SRUNFUFRJT048L2NvbnN0YW50Pj0wIGxheWVyIGhhcyB0byBiZSA8Y29uc3RhbnQ+RFFQU0s8L2NvbnN0YW50Pi48L3BhcmE+Ci0JCQk8L3NlY3Rpb24+Ci0KLQkJCTxzZWN0aW9uIGlkPSJpc2RidC1sYXllci1zZWctY250Ij4KLQkJCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUipfU0VHTUVOVF9DT1VOVDwvY29uc3RhbnQ+PC90aXRsZT4KLQotCQkJCTxwYXJhPlBvc3NpYmxlIHZhbHVlczogMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIC0xIChBVVRPKTwvcGFyYT4KLQotCQkJCTxwYXJhPk5vdGU6IFRydXRoIHRhYmxlIGZvciA8Y29uc3RhbnQ+RFRWX0lTREJUX1NPVU5EX0JST0FEQ0FTVElORzwvY29uc3RhbnQ+IGFuZAotCQkJCQk8Y29uc3RhbnQ+RFRWX0lTREJUX1BBUlRJQUxfUkVDRVBUSU9OPC9jb25zdGFudD4gYW5kIDxjb25zdGFudD5MQVlFUjwvY29uc3RhbnQ+Kl9TRUdNRU5UX0NPVU5UPC9wYXJhPgotCi0JCQkJPGluZm9ybWFsdGFibGUgaWQ9ImlzZGJ0LWxheWVyX3NlZy1jbnQtdGFibGUiPgotCQkJCQk8dGdyb3VwIGNvbHM9IjYiPgotCi0JCQkJCQk8dGJvZHk+Ci0JCQkJCQkJPHJvdz4KLQkJCQkJCQkJPGVudHJ5PlBSPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PlNCPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PkxheWVyIEEgd2lkdGg8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+TGF5ZXIgQiB3aWR0aDwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT5MYXllciBDIHdpZHRoPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PnRvdGFsIHdpZHRoPC9lbnRyeT4KLQkJCQkJCQk8L3Jvdz4KLQotCQkJCQkJCTxyb3c+Ci0JCQkJCQkJCTxlbnRyeT4wPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PjA8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MSAuLiAxMzwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT4xIC4uIDEzPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PjEgLi4gMTM8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MTM8L2VudHJ5PgotCQkJCQkJCTwvcm93PgotCi0JCQkJCQkJPHJvdz4KLQkJCQkJCQkJPGVudHJ5PjE8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MDwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PjEgLi4gMTM8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MSAuLiAxMzwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT4xMzwvZW50cnk+Ci0JCQkJCQkJPC9yb3c+Ci0KLQkJCQkJCQk8cm93PgotCQkJCQkJCQk8ZW50cnk+MDwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PjE8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MDwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT4wPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PjE8L2VudHJ5PgotCQkJCQkJCTwvcm93PgotCi0JCQkJCQkJPHJvdz4KLQkJCQkJCQkJPGVudHJ5PjE8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MTwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PjI8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MDwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT4xMzwvZW50cnk+Ci0JCQkJCQkJPC9yb3c+Ci0JCQkJCQk8L3Rib2R5PgotCi0JCQkJCTwvdGdyb3VwPgotCQkJCTwvaW5mb3JtYWx0YWJsZT4KLQotCQkJPC9zZWN0aW9uPgotCi0JCQk8c2VjdGlvbiBpZD0iaXNkYnRfbGF5ZXJfdF9pbnRlcmwiPgotCQkJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSKl9USU1FX0lOVEVSTEVBVklORzwvY29uc3RhbnQ+PC90aXRsZT4KLQotCQkJCTxwYXJhPlBvc3NpYmxlIHZhbHVlczogMCwgMSwgMiwgMywgLTEgKEFVVE8pPC9wYXJhPgotCi0JCQkJPHBhcmE+Tm90ZTogVGhlIHJlYWwgaW50ZXItbGVhdmVyIGRlcHRoLW5hbWVzIGRlcGVuZCBvbiB0aGUgbW9kZSAoZmZ0LXNpemUpOyB0aGUgdmFsdWVzCi0JCQkJCWhlcmUgYXJlIHJlZmVycmluZyB0byB3aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgVE1DQy1zdHJ1Y3R1cmUgLQotCQkJCQlpbmRlcGVuZGVudCBvZiB0aGUgbW9kZS48L3BhcmE+Ci0JCQk8L3NlY3Rpb24+Ci0JCTwvc2VjdGlvbj4KLQk8L3NlY3Rpb24+Ci0JPHNlY3Rpb24gaWQ9ImR2YnQyLXBhcmFtcyI+Ci0JCTx0aXRsZT5EVkItVDIgcGFyYW1ldGVyczwvdGl0bGU+Ci0JCQotCQk8cGFyYT5UaGlzIHNlY3Rpb24gY292ZXJzIHBhcmFtZXRlcnMgdGhhdCBhcHBseSBvbmx5IHRvIHRoZSBEVkItVDIgZGVsaXZlcnkgbWV0aG9kLiBEVkItVDIKLQkJCXN1cHBvcnQgaXMgY3VycmVudGx5IGluIHRoZSBlYXJseSBzdGFnZXMgZGV2ZWxvcG1lbnQgc28gZXhwZWN0IHRoaXMgc2VjdGlvbiB0byBncm93Ci0JCQlhbmQgYmVjb21lIG1vcmUgZGV0YWlsZWQgd2l0aCB0aW1lLjwvcGFyYT4KLQotCQk8c2VjdGlvbiBpZD0iZHZidDItcGxwLWlkIj4KLQkJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0RWQlQyX1BMUF9JRDwvY29uc3RhbnQ+PC90aXRsZT4KLQotCQkJPHBhcmE+RFZCLVQyIHN1cHBvcnRzIFBoeXNpY2FsIExheWVyIFBpcGVzIChQTFApIHRvIGFsbG93IHRyYW5zbWlzc2lvbiBvZgotCQkJCW1hbnkgZGF0YSB0eXBlcyB2aWEgYSBzaW5nbGUgbXVsdGlwbGV4LiBUaGUgQVBJIHdpbGwgc29vbiBzdXBwb3J0IHRoaXMKLQkJCQlhdCB3aGljaCBwb2ludCB0aGlzIHNlY3Rpb24gd2lsbCBiZSBleHBhbmRlZC48L3BhcmE+Ci0JCTwvc2VjdGlvbj4KLQk8L3NlY3Rpb24+Ci08L3NlY3Rpb24+Ci08L3NlY3Rpb24+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2R2YnN0Yi5wbmcgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2R2YnN0Yi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliOGYzNzIuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9kdmJzdGIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9mcm9udGVuZC5oLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZnJvbnRlbmQuaC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OTJmNzguLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9mcm9udGVuZC5oLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi08cHJvZ3JhbWxpc3Rpbmc+Ci0vKgotICogZnJvbnRlbmQuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCBNYXJjdXMgTWV0emxlciAmbHQ7bWFyY3VzQGNvbnZlcmdlbmNlLmRlJmd0OwotICogICAgICAgICAgICAgICAgICBSYWxwaCAgTWV0emxlciAmbHQ7cmFscGhAY29udmVyZ2VuY2UuZGUmZ3Q7Ci0gKiAgICAgICAgICAgICAgICAgIEhvbGdlciBXYWVjaHRsZXIgJmx0O2hvbGdlckBjb252ZXJnZW5jZS5kZSZndDsKLSAqICAgICAgICAgICAgICAgICAgQW5kcmUgRHJhc3ppayAmbHQ7YWRAY29udmVyZ2VuY2UuZGUmZ3Q7Ci0gKiAgICAgICAgICAgICAgICAgIGZvciBjb252ZXJnZW5jZSBpbnRlZ3JhdGVkIG1lZGlhIEdtYkgKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEKLSAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0gKgotICovCi0KLSNpZm5kZWYgX0RWQkZST05URU5EX0hfCi0jZGVmaW5lIF9EVkJGUk9OVEVORF9IXwotCi0jaW5jbHVkZSAmbHQ7bGludXgvdHlwZXMuaCZndDsKLQotdHlwZWRlZiBlbnVtIGZlX3R5cGUgewotICAgICAgICBGRV9RUFNLLAotICAgICAgICBGRV9RQU0sCi0gICAgICAgIEZFX09GRE0sCi0gICAgICAgIEZFX0FUU0MKLX0gZmVfdHlwZV90OwotCi0KLXR5cGVkZWYgZW51bSBmZV9jYXBzIHsKLSAgICAgICAgRkVfSVNfU1RVUElEICAgICAgICAgICAgICAgICAgICA9IDAsCi0gICAgICAgIEZFX0NBTl9JTlZFUlNJT05fQVVUTyAgICAgICAgICAgPSAweDEsCi0gICAgICAgIEZFX0NBTl9GRUNfMV8yICAgICAgICAgICAgICAgICAgPSAweDIsCi0gICAgICAgIEZFX0NBTl9GRUNfMl8zICAgICAgICAgICAgICAgICAgPSAweDQsCi0gICAgICAgIEZFX0NBTl9GRUNfM180ICAgICAgICAgICAgICAgICAgPSAweDgsCi0gICAgICAgIEZFX0NBTl9GRUNfNF81ICAgICAgICAgICAgICAgICAgPSAweDEwLAotICAgICAgICBGRV9DQU5fRkVDXzVfNiAgICAgICAgICAgICAgICAgID0gMHgyMCwKLSAgICAgICAgRkVfQ0FOX0ZFQ182XzcgICAgICAgICAgICAgICAgICA9IDB4NDAsCi0gICAgICAgIEZFX0NBTl9GRUNfN184ICAgICAgICAgICAgICAgICAgPSAweDgwLAotICAgICAgICBGRV9DQU5fRkVDXzhfOSAgICAgICAgICAgICAgICAgID0gMHgxMDAsCi0gICAgICAgIEZFX0NBTl9GRUNfQVVUTyAgICAgICAgICAgICAgICAgPSAweDIwMCwKLSAgICAgICAgRkVfQ0FOX1FQU0sgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwLAotICAgICAgICBGRV9DQU5fUUFNXzE2ICAgICAgICAgICAgICAgICAgID0gMHg4MDAsCi0gICAgICAgIEZFX0NBTl9RQU1fMzIgICAgICAgICAgICAgICAgICAgPSAweDEwMDAsCi0gICAgICAgIEZFX0NBTl9RQU1fNjQgICAgICAgICAgICAgICAgICAgPSAweDIwMDAsCi0gICAgICAgIEZFX0NBTl9RQU1fMTI4ICAgICAgICAgICAgICAgICAgPSAweDQwMDAsCi0gICAgICAgIEZFX0NBTl9RQU1fMjU2ICAgICAgICAgICAgICAgICAgPSAweDgwMDAsCi0gICAgICAgIEZFX0NBTl9RQU1fQVVUTyAgICAgICAgICAgICAgICAgPSAweDEwMDAwLAotICAgICAgICBGRV9DQU5fVFJBTlNNSVNTSU9OX01PREVfQVVUTyAgID0gMHgyMDAwMCwKLSAgICAgICAgRkVfQ0FOX0JBTkRXSURUSF9BVVRPICAgICAgICAgICA9IDB4NDAwMDAsCi0gICAgICAgIEZFX0NBTl9HVUFSRF9JTlRFUlZBTF9BVVRPICAgICAgPSAweDgwMDAwLAotICAgICAgICBGRV9DQU5fSElFUkFSQ0hZX0FVVE8gICAgICAgICAgID0gMHgxMDAwMDAsCi0gICAgICAgIEZFX0NBTl84VlNCICAgICAgICAgICAgICAgICAgICAgPSAweDIwMDAwMCwKLSAgICAgICAgRkVfQ0FOXzE2VlNCICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMDAwLAotICAgICAgICBGRV9IQVNfRVhURU5ERURfQ0FQUyAgICAgICAgICAgID0gMHg4MDAwMDAsICAgLyogV2UgbmVlZCBtb3JlIGJpdHNwYWNlIGZvciBuZXdlciBBUElzLCBpbmRpY2F0ZSB0aGlzLiAqLwotICAgICAgICBGRV9DQU5fVFVSQk9fRkVDICAgICAgICAgICAgICAgID0gMHg4MDAwMDAwLCAgLyogZnJvbnRlbmQgc3VwcG9ydHMgInR1cmJvIGZlYyBtb2R1bGF0aW9uIiAqLwotICAgICAgICBGRV9DQU5fMkdfTU9EVUxBVElPTiAgICAgICAgICAgID0gMHgxMDAwMDAwMCwgLyogZnJvbnRlbmQgc3VwcG9ydHMgIjJuZCBnZW5lcmF0aW9uIG1vZHVsYXRpb24iIChEVkItUzIpICovCi0gICAgICAgIEZFX05FRURTX0JFTkRJTkcgICAgICAgICAgICAgICAgPSAweDIwMDAwMDAwLCAvKiBub3Qgc3VwcG9ydGVkIGFueW1vcmUsIGRvbid0IHVzZSAoZnJvbnRlbmQgcmVxdWlyZXMgZnJlcXVlbmN5IGJlbmRpbmcpICovCi0gICAgICAgIEZFX0NBTl9SRUNPVkVSICAgICAgICAgICAgICAgICAgPSAweDQwMDAwMDAwLCAvKiBmcm9udGVuZCBjYW4gcmVjb3ZlciBmcm9tIGEgY2FibGUgdW5wbHVnIGF1dG9tYXRpY2FsbHkgKi8KLSAgICAgICAgRkVfQ0FOX01VVEVfVFMgICAgICAgICAgICAgICAgICA9IDB4ODAwMDAwMDAgIC8qIGZyb250ZW5kIGNhbiBzdG9wIHNwdXJpb3VzIFRTIGRhdGEgb3V0cHV0ICovCi19IGZlX2NhcHNfdDsKLQotCi1zdHJ1Y3QgZHZiX2Zyb250ZW5kX2luZm8gewotICAgICAgICBjaGFyICAgICAgIG5hbWVbMTI4XTsKLSAgICAgICAgZmVfdHlwZV90ICB0eXBlOwotICAgICAgICBfX3UzMiAgICAgIGZyZXF1ZW5jeV9taW47Ci0gICAgICAgIF9fdTMyICAgICAgZnJlcXVlbmN5X21heDsKLSAgICAgICAgX191MzIgICAgICBmcmVxdWVuY3lfc3RlcHNpemU7Ci0gICAgICAgIF9fdTMyICAgICAgZnJlcXVlbmN5X3RvbGVyYW5jZTsKLSAgICAgICAgX191MzIgICAgICBzeW1ib2xfcmF0ZV9taW47Ci0gICAgICAgIF9fdTMyICAgICAgc3ltYm9sX3JhdGVfbWF4OwotICAgICAgICBfX3UzMiAgICAgIHN5bWJvbF9yYXRlX3RvbGVyYW5jZTsgICAgICAgLyogcHBtICovCi0gICAgICAgIF9fdTMyICAgICAgbm90aWZpZXJfZGVsYXk7ICAgICAgICAgICAgICAvKiBERVBSRUNBVEVEICovCi0gICAgICAgIGZlX2NhcHNfdCAgY2FwczsKLX07Ci0KLQotLyoqCi0gKiAgQ2hlY2sgb3V0IHRoZSBEaVNFcUMgYnVzIHNwZWMgYXZhaWxhYmxlIG9uIGh0dHA6Ly93d3cuZXV0ZWxzYXQub3JnLyBmb3IKLSAqICB0aGUgbWVhbmluZyBvZiB0aGlzIHN0cnVjdC4uLgotICovCi1zdHJ1Y3QgZHZiX2Rpc2VxY19tYXN0ZXJfY21kIHsKLSAgICAgICAgX191OCBtc2cgWzZdOyAgIC8qICB7IGZyYW1pbmcsIGFkZHJlc3MsIGNvbW1hbmQsIGRhdGEgWzNdIH0gKi8KLSAgICAgICAgX191OCBtc2dfbGVuOyAgIC8qICB2YWxpZCB2YWx1ZXMgYXJlIDMuLi42ICAqLwotfTsKLQotCi1zdHJ1Y3QgZHZiX2Rpc2VxY19zbGF2ZV9yZXBseSB7Ci0gICAgICAgIF9fdTggbXNnIFs0XTsgICAvKiAgeyBmcmFtaW5nLCBkYXRhIFszXSB9ICovCi0gICAgICAgIF9fdTggbXNnX2xlbjsgICAvKiAgdmFsaWQgdmFsdWVzIGFyZSAwLi4uNCwgMCBtZWFucyBubyBtc2cgICovCi0gICAgICAgIGludCAgdGltZW91dDsgICAvKiAgcmV0dXJuIGZyb20gaW9jdGwgYWZ0ZXIgdGltZW91dCBtcyB3aXRoICovCi19OyAgICAgICAgICAgICAgICAgICAgICAvKiAgZXJyb3Jjb2RlIHdoZW4gbm8gbWVzc2FnZSB3YXMgcmVjZWl2ZWQgICovCi0KLQotdHlwZWRlZiBlbnVtIGZlX3NlY192b2x0YWdlIHsKLSAgICAgICAgU0VDX1ZPTFRBR0VfMTMsCi0gICAgICAgIFNFQ19WT0xUQUdFXzE4LAotICAgICAgICBTRUNfVk9MVEFHRV9PRkYKLX0gZmVfc2VjX3ZvbHRhZ2VfdDsKLQotCi10eXBlZGVmIGVudW0gZmVfc2VjX3RvbmVfbW9kZSB7Ci0gICAgICAgIFNFQ19UT05FX09OLAotICAgICAgICBTRUNfVE9ORV9PRkYKLX0gZmVfc2VjX3RvbmVfbW9kZV90OwotCi0KLXR5cGVkZWYgZW51bSBmZV9zZWNfbWluaV9jbWQgewotICAgICAgICBTRUNfTUlOSV9BLAotICAgICAgICBTRUNfTUlOSV9CCi19IGZlX3NlY19taW5pX2NtZF90OwotCi0KLXR5cGVkZWYgZW51bSBmZV9zdGF0dXMgewotICAgICAgICBGRV9IQVNfU0lHTkFMICAgPSAweDAxLCAgIC8qIGZvdW5kIHNvbWV0aGluZyBhYm92ZSB0aGUgbm9pc2UgbGV2ZWwgKi8KLSAgICAgICAgRkVfSEFTX0NBUlJJRVIgID0gMHgwMiwgICAvKiBmb3VuZCBhIERWQiBzaWduYWwgICovCi0gICAgICAgIEZFX0hBU19WSVRFUkJJICA9IDB4MDQsICAgLyogRkVDIGlzIHN0YWJsZSAgKi8KLSAgICAgICAgRkVfSEFTX1NZTkMgICAgID0gMHgwOCwgICAvKiBmb3VuZCBzeW5jIGJ5dGVzICAqLwotICAgICAgICBGRV9IQVNfTE9DSyAgICAgPSAweDEwLCAgIC8qIGV2ZXJ5dGhpbmcncyB3b3JraW5nLi4uICovCi0gICAgICAgIEZFX1RJTUVET1VUICAgICA9IDB4MjAsICAgLyogbm8gbG9jayB3aXRoaW4gdGhlIGxhc3QgfjIgc2Vjb25kcyAqLwotICAgICAgICBGRV9SRUlOSVQgICAgICAgPSAweDQwICAgIC8qIGZyb250ZW5kIHdhcyByZWluaXRpYWxpemVkLCAgKi8KLX0gZmVfc3RhdHVzX3Q7ICAgICAgICAgICAgICAgICAgICAvKiBhcHBsaWNhdGlvbiBpcyByZWNvbW1lbmRlZCB0byByZXNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpU0VxQywgdG9uZSBhbmQgcGFyYW1ldGVycyAqLwotCi10eXBlZGVmIGVudW0gZmVfc3BlY3RyYWxfaW52ZXJzaW9uIHsKLSAgICAgICAgSU5WRVJTSU9OX09GRiwKLSAgICAgICAgSU5WRVJTSU9OX09OLAotICAgICAgICBJTlZFUlNJT05fQVVUTwotfSBmZV9zcGVjdHJhbF9pbnZlcnNpb25fdDsKLQotCi10eXBlZGVmIGVudW0gZmVfY29kZV9yYXRlIHsKLSAgICAgICAgRkVDX05PTkUgPSAwLAotICAgICAgICBGRUNfMV8yLAotICAgICAgICBGRUNfMl8zLAotICAgICAgICBGRUNfM180LAotICAgICAgICBGRUNfNF81LAotICAgICAgICBGRUNfNV82LAotICAgICAgICBGRUNfNl83LAotICAgICAgICBGRUNfN184LAotICAgICAgICBGRUNfOF85LAotICAgICAgICBGRUNfQVVUTywKLSAgICAgICAgRkVDXzNfNSwKLSAgICAgICAgRkVDXzlfMTAsCi19IGZlX2NvZGVfcmF0ZV90OwotCi0KLXR5cGVkZWYgZW51bSBmZV9tb2R1bGF0aW9uIHsKLSAgICAgICAgUVBTSywKLSAgICAgICAgUUFNXzE2LAotICAgICAgICBRQU1fMzIsCi0gICAgICAgIFFBTV82NCwKLSAgICAgICAgUUFNXzEyOCwKLSAgICAgICAgUUFNXzI1NiwKLSAgICAgICAgUUFNX0FVVE8sCi0gICAgICAgIFZTQl84LAotICAgICAgICBWU0JfMTYsCi0gICAgICAgIFBTS184LAotICAgICAgICBBUFNLXzE2LAotICAgICAgICBBUFNLXzMyLAotICAgICAgICBEUVBTSywKLX0gZmVfbW9kdWxhdGlvbl90OwotCi10eXBlZGVmIGVudW0gZmVfdHJhbnNtaXRfbW9kZSB7Ci0gICAgICAgIFRSQU5TTUlTU0lPTl9NT0RFXzJLLAotICAgICAgICBUUkFOU01JU1NJT05fTU9ERV84SywKLSAgICAgICAgVFJBTlNNSVNTSU9OX01PREVfQVVUTywKLSAgICAgICAgVFJBTlNNSVNTSU9OX01PREVfNEssCi0gICAgICAgIFRSQU5TTUlTU0lPTl9NT0RFXzFLLAotICAgICAgICBUUkFOU01JU1NJT05fTU9ERV8xNkssCi0gICAgICAgIFRSQU5TTUlTU0lPTl9NT0RFXzMySywKLX0gZmVfdHJhbnNtaXRfbW9kZV90OwotCi10eXBlZGVmIGVudW0gZmVfYmFuZHdpZHRoIHsKLSAgICAgICAgQkFORFdJRFRIXzhfTUhaLAotICAgICAgICBCQU5EV0lEVEhfN19NSFosCi0gICAgICAgIEJBTkRXSURUSF82X01IWiwKLSAgICAgICAgQkFORFdJRFRIX0FVVE8sCi0gICAgICAgIEJBTkRXSURUSF81X01IWiwKLSAgICAgICAgQkFORFdJRFRIXzEwX01IWiwKLSAgICAgICAgQkFORFdJRFRIXzFfNzEyX01IWiwKLX0gZmVfYmFuZHdpZHRoX3Q7Ci0KLQotdHlwZWRlZiBlbnVtIGZlX2d1YXJkX2ludGVydmFsIHsKLSAgICAgICAgR1VBUkRfSU5URVJWQUxfMV8zMiwKLSAgICAgICAgR1VBUkRfSU5URVJWQUxfMV8xNiwKLSAgICAgICAgR1VBUkRfSU5URVJWQUxfMV84LAotICAgICAgICBHVUFSRF9JTlRFUlZBTF8xXzQsCi0gICAgICAgIEdVQVJEX0lOVEVSVkFMX0FVVE8sCi0gICAgICAgIEdVQVJEX0lOVEVSVkFMXzFfMTI4LAotICAgICAgICBHVUFSRF9JTlRFUlZBTF8xOV8xMjgsCi0gICAgICAgIEdVQVJEX0lOVEVSVkFMXzE5XzI1NiwKLX0gZmVfZ3VhcmRfaW50ZXJ2YWxfdDsKLQotCi10eXBlZGVmIGVudW0gZmVfaGllcmFyY2h5IHsKLSAgICAgICAgSElFUkFSQ0hZX05PTkUsCi0gICAgICAgIEhJRVJBUkNIWV8xLAotICAgICAgICBISUVSQVJDSFlfMiwKLSAgICAgICAgSElFUkFSQ0hZXzQsCi0gICAgICAgIEhJRVJBUkNIWV9BVVRPCi19IGZlX2hpZXJhcmNoeV90OwotCi0KLXN0cnVjdCBkdmJfcXBza19wYXJhbWV0ZXJzIHsKLSAgICAgICAgX191MzIgICAgICAgICAgIHN5bWJvbF9yYXRlOyAgLyogc3ltYm9sIHJhdGUgaW4gU3ltYm9scyBwZXIgc2Vjb25kICovCi0gICAgICAgIGZlX2NvZGVfcmF0ZV90ICBmZWNfaW5uZXI7ICAgIC8qIGZvcndhcmQgZXJyb3IgY29ycmVjdGlvbiAoc2VlIGFib3ZlKSAqLwotfTsKLQotc3RydWN0IGR2Yl9xYW1fcGFyYW1ldGVycyB7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICBzeW1ib2xfcmF0ZTsgLyogc3ltYm9sIHJhdGUgaW4gU3ltYm9scyBwZXIgc2Vjb25kICovCi0gICAgICAgIGZlX2NvZGVfcmF0ZV90ICBmZWNfaW5uZXI7ICAgLyogZm9yd2FyZCBlcnJvciBjb3JyZWN0aW9uIChzZWUgYWJvdmUpICovCi0gICAgICAgIGZlX21vZHVsYXRpb25fdCBtb2R1bGF0aW9uOyAgLyogbW9kdWxhdGlvbiB0eXBlIChzZWUgYWJvdmUpICovCi19OwotCi1zdHJ1Y3QgZHZiX3ZzYl9wYXJhbWV0ZXJzIHsKLSAgICAgICAgZmVfbW9kdWxhdGlvbl90IG1vZHVsYXRpb247ICAvKiBtb2R1bGF0aW9uIHR5cGUgKHNlZSBhYm92ZSkgKi8KLX07Ci0KLXN0cnVjdCBkdmJfb2ZkbV9wYXJhbWV0ZXJzIHsKLSAgICAgICAgZmVfYmFuZHdpZHRoX3QgICAgICBiYW5kd2lkdGg7Ci0gICAgICAgIGZlX2NvZGVfcmF0ZV90ICAgICAgY29kZV9yYXRlX0hQOyAgLyogaGlnaCBwcmlvcml0eSBzdHJlYW0gY29kZSByYXRlICovCi0gICAgICAgIGZlX2NvZGVfcmF0ZV90ICAgICAgY29kZV9yYXRlX0xQOyAgLyogbG93IHByaW9yaXR5IHN0cmVhbSBjb2RlIHJhdGUgKi8KLSAgICAgICAgZmVfbW9kdWxhdGlvbl90ICAgICBjb25zdGVsbGF0aW9uOyAvKiBtb2R1bGF0aW9uIHR5cGUgKHNlZSBhYm92ZSkgKi8KLSAgICAgICAgZmVfdHJhbnNtaXRfbW9kZV90ICB0cmFuc21pc3Npb25fbW9kZTsKLSAgICAgICAgZmVfZ3VhcmRfaW50ZXJ2YWxfdCBndWFyZF9pbnRlcnZhbDsKLSAgICAgICAgZmVfaGllcmFyY2h5X3QgICAgICBoaWVyYXJjaHlfaW5mb3JtYXRpb247Ci19OwotCi0KLXN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyB7Ci0gICAgICAgIF9fdTMyIGZyZXF1ZW5jeTsgICAgIC8qIChhYnNvbHV0ZSkgZnJlcXVlbmN5IGluIEh6IGZvciBRQU0vT0ZETS9BVFNDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGludGVybWVkaWF0ZSBmcmVxdWVuY3kgaW4ga0h6IGZvciBRUFNLICovCi0gICAgICAgIGZlX3NwZWN0cmFsX2ludmVyc2lvbl90IGludmVyc2lvbjsKLSAgICAgICAgdW5pb24gewotICAgICAgICAgICAgICAgIHN0cnVjdCBkdmJfcXBza19wYXJhbWV0ZXJzIHFwc2s7Ci0gICAgICAgICAgICAgICAgc3RydWN0IGR2Yl9xYW1fcGFyYW1ldGVycyAgcWFtOwotICAgICAgICAgICAgICAgIHN0cnVjdCBkdmJfb2ZkbV9wYXJhbWV0ZXJzIG9mZG07Ci0gICAgICAgICAgICAgICAgc3RydWN0IGR2Yl92c2JfcGFyYW1ldGVycyB2c2I7Ci0gICAgICAgIH0gdTsKLX07Ci0KLQotc3RydWN0IGR2Yl9mcm9udGVuZF9ldmVudCB7Ci0gICAgICAgIGZlX3N0YXR1c190IHN0YXR1czsKLSAgICAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzIHBhcmFtZXRlcnM7Ci19OwotCi0vKiBTMkFQSSBDb21tYW5kcyAqLwotI2RlZmluZSBEVFZfVU5ERUZJTkVEICAgICAgICAgICAwCi0jZGVmaW5lIERUVl9UVU5FICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgRFRWX0NMRUFSICAgICAgICAgICAgICAgMgotI2RlZmluZSBEVFZfRlJFUVVFTkNZICAgICAgICAgICAzCi0jZGVmaW5lIERUVl9NT0RVTEFUSU9OICAgICAgICAgIDQKLSNkZWZpbmUgRFRWX0JBTkRXSURUSF9IWiAgICAgICAgNQotI2RlZmluZSBEVFZfSU5WRVJTSU9OICAgICAgICAgICA2Ci0jZGVmaW5lIERUVl9ESVNFUUNfTUFTVEVSICAgICAgIDcKLSNkZWZpbmUgRFRWX1NZTUJPTF9SQVRFICAgICAgICAgOAotI2RlZmluZSBEVFZfSU5ORVJfRkVDICAgICAgICAgICA5Ci0jZGVmaW5lIERUVl9WT0xUQUdFICAgICAgICAgICAgIDEwCi0jZGVmaW5lIERUVl9UT05FICAgICAgICAgICAgICAgIDExCi0jZGVmaW5lIERUVl9QSUxPVCAgICAgICAgICAgICAgIDEyCi0jZGVmaW5lIERUVl9ST0xMT0ZGICAgICAgICAgICAgIDEzCi0jZGVmaW5lIERUVl9ESVNFUUNfU0xBVkVfUkVQTFkgIDE0Ci0KLS8qIEJhc2ljIGVudW1lcmF0aW9uIHNldCBmb3IgcXVlcnlpbmcgdW5saW1pdGVkIGNhcGFiaWxpdGllcyAqLwotI2RlZmluZSBEVFZfRkVfQ0FQQUJJTElUWV9DT1VOVCAxNQotI2RlZmluZSBEVFZfRkVfQ0FQQUJJTElUWSAgICAgICAxNgotI2RlZmluZSBEVFZfREVMSVZFUllfU1lTVEVNICAgICAxNwotCi0vKiBJU0RCLVQgYW5kIElTREItVHNiICovCi0jZGVmaW5lIERUVl9JU0RCVF9QQVJUSUFMX1JFQ0VQVElPTiAgICAgMTgKLSNkZWZpbmUgRFRWX0lTREJUX1NPVU5EX0JST0FEQ0FTVElORyAgICAxOQotCi0jZGVmaW5lIERUVl9JU0RCVF9TQl9TVUJDSEFOTkVMX0lEICAgICAgMjAKLSNkZWZpbmUgRFRWX0lTREJUX1NCX1NFR01FTlRfSURYICAgICAgICAyMQotI2RlZmluZSBEVFZfSVNEQlRfU0JfU0VHTUVOVF9DT1VOVCAgICAgIDIyCi0KLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQV9GRUMgICAgICAgICAgICAgICAgICAgIDIzCi0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkFfTU9EVUxBVElPTiAgICAgICAgICAgICAyNAotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJBX1NFR01FTlRfQ09VTlQgICAgICAgICAgMjUKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQV9USU1FX0lOVEVSTEVBVklORyAgICAgIDI2Ci0KLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQl9GRUMgICAgICAgICAgICAgICAgICAgIDI3Ci0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkJfTU9EVUxBVElPTiAgICAgICAgICAgICAyOAotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJCX1NFR01FTlRfQ09VTlQgICAgICAgICAgMjkKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQl9USU1FX0lOVEVSTEVBVklORyAgICAgIDMwCi0KLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQ19GRUMgICAgICAgICAgICAgICAgICAgIDMxCi0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkNfTU9EVUxBVElPTiAgICAgICAgICAgICAzMgotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJDX1NFR01FTlRfQ09VTlQgICAgICAgICAgMzMKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQ19USU1FX0lOVEVSTEVBVklORyAgICAgIDM0Ci0KLSNkZWZpbmUgRFRWX0FQSV9WRVJTSU9OICAgICAgICAgMzUKLQotI2RlZmluZSBEVFZfQ09ERV9SQVRFX0hQICAgICAgICAzNgotI2RlZmluZSBEVFZfQ09ERV9SQVRFX0xQICAgICAgICAzNwotI2RlZmluZSBEVFZfR1VBUkRfSU5URVJWQUwgICAgICAzOAotI2RlZmluZSBEVFZfVFJBTlNNSVNTSU9OX01PREUgICAzOQotI2RlZmluZSBEVFZfSElFUkFSQ0hZICAgICAgICAgICA0MAotCi0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUl9FTkFCTEVEIDQxCi0KLSNkZWZpbmUgRFRWX0lTREJTX1RTX0lEICAgICAgICAgNDIKLQotI2RlZmluZSBEVFZfRFZCVDJfUExQX0lECTQzCi0KLSNkZWZpbmUgRFRWX01BWF9DT01NQU5EICAgICAgICAgICAgICAgICAgICAgICAgIERUVl9EVkJUMl9QTFBfSUQKLQotdHlwZWRlZiBlbnVtIGZlX3BpbG90IHsKLSAgICAgICAgUElMT1RfT04sCi0gICAgICAgIFBJTE9UX09GRiwKLSAgICAgICAgUElMT1RfQVVUTywKLX0gZmVfcGlsb3RfdDsKLQotdHlwZWRlZiBlbnVtIGZlX3JvbGxvZmYgewotICAgICAgICBST0xMT0ZGXzM1LCAvKiBJbXBsaWVkIHZhbHVlIGluIERWQi1TLCBkZWZhdWx0IGZvciBEVkItUzIgKi8KLSAgICAgICAgUk9MTE9GRl8yMCwKLSAgICAgICAgUk9MTE9GRl8yNSwKLSAgICAgICAgUk9MTE9GRl9BVVRPLAotfSBmZV9yb2xsb2ZmX3Q7Ci0KLXR5cGVkZWYgZW51bSBmZV9kZWxpdmVyeV9zeXN0ZW0gewotICAgICAgICBTWVNfVU5ERUZJTkVELAotICAgICAgICBTWVNfRFZCQ19BTk5FWF9BQywKLSAgICAgICAgU1lTX0RWQkNfQU5ORVhfQiwKLSAgICAgICAgU1lTX0RWQlQsCi0gICAgICAgIFNZU19EU1MsCi0gICAgICAgIFNZU19EVkJTLAotICAgICAgICBTWVNfRFZCUzIsCi0gICAgICAgIFNZU19EVkJILAotICAgICAgICBTWVNfSVNEQlQsCi0gICAgICAgIFNZU19JU0RCUywKLSAgICAgICAgU1lTX0lTREJDLAotICAgICAgICBTWVNfQVRTQywKLSAgICAgICAgU1lTX0FUU0NNSCwKLSAgICAgICAgU1lTX0RNQlRILAotICAgICAgICBTWVNfQ01NQiwKLSAgICAgICAgU1lTX0RBQiwKLSAgICAgICAgU1lTX0RWQlQyLAotfSBmZV9kZWxpdmVyeV9zeXN0ZW1fdDsKLQotc3RydWN0IGR0dl9jbWRzX2ggewotICAgICAgICBjaGFyICAgICpuYW1lOyAgICAgICAgICAvKiBBIGRpc3BsYXkgbmFtZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzICovCi0KLSAgICAgICAgX191MzIgICBjbWQ7ICAgICAgICAgICAgLyogQSB1bmlxdWUgSUQgKi8KLQotICAgICAgICAvKiBGbGFncyAqLwotICAgICAgICBfX3UzMiAgIHNldDoxOyAgICAgICAgICAvKiBFaXRoZXIgYSBzZXQgb3IgZ2V0IHByb3BlcnR5ICovCi0gICAgICAgIF9fdTMyICAgYnVmZmVyOjE7ICAgICAgIC8qIERvZXMgdGhpcyBwcm9wZXJ0eSB1c2UgdGhlIGJ1ZmZlcj8gKi8KLSAgICAgICAgX191MzIgICByZXNlcnZlZDozMDsgICAgLyogQWxpZ24gKi8KLX07Ci0KLXN0cnVjdCBkdHZfcHJvcGVydHkgewotICAgICAgICBfX3UzMiBjbWQ7Ci0gICAgICAgIF9fdTMyIHJlc2VydmVkWzNdOwotICAgICAgICB1bmlvbiB7Ci0gICAgICAgICAgICAgICAgX191MzIgZGF0YTsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgICAgICAgICAgICAgX191OCBkYXRhWzMyXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fdTMyIGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fdTMyIHJlc2VydmVkMVszXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlc2VydmVkMjsKLSAgICAgICAgICAgICAgICB9IGJ1ZmZlcjsKLSAgICAgICAgfSB1OwotICAgICAgICBpbnQgcmVzdWx0OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIG51bSBvZiBwcm9wZXJ0aWVzIGNhbm5vdCBleGNlZWQgRFRWX0lPQ1RMX01BWF9NU0dTIHBlciBpb2N0bCAqLwotI2RlZmluZSBEVFZfSU9DVExfTUFYX01TR1MgNjQKLQotc3RydWN0IGR0dl9wcm9wZXJ0aWVzIHsKLSAgICAgICAgX191MzIgbnVtOwotICAgICAgICBzdHJ1Y3QgZHR2X3Byb3BlcnR5ICpwcm9wczsKLX07Ci0KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfR0VUX1BST1BFUlRZIj5GRV9TRVRfUFJPUEVSVFk8L2xpbms+ICAgICAgICAgICAgX0lPVygnbycsIDgyLCBzdHJ1Y3QgZHR2X3Byb3BlcnRpZXMpCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX0dFVF9QUk9QRVJUWSI+RkVfR0VUX1BST1BFUlRZPC9saW5rPiAgICAgICAgICAgIF9JT1IoJ28nLCA4Mywgc3RydWN0IGR0dl9wcm9wZXJ0aWVzKQotCi0KLS8qKgotICogV2hlbiBzZXQsIHRoaXMgZmxhZyB3aWxsIGRpc2FibGUgYW55IHppZ3phZ2dpbmcgb3Igb3RoZXIgIm5vcm1hbCIgdHVuaW5nCi0gKiBiZWhhdmlvdXIuIEFkZGl0aW9uYWxseSwgdGhlcmUgd2lsbCBiZSBubyBhdXRvbWF0aWMgbW9uaXRvcmluZyBvZiB0aGUgbG9jawotICogc3RhdHVzLCBhbmQgaGVuY2Ugbm8gZnJvbnRlbmQgZXZlbnRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBJZiBhIGZyb250ZW5kIGRldmljZQotICogaXMgY2xvc2VkLCB0aGlzIGZsYWcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvZmYgd2hlbiB0aGUgZGV2aWNlIGlzCi0gKiByZW9wZW5lZCByZWFkLXdyaXRlLgotICovCi0jZGVmaW5lIEZFX1RVTkVfTU9ERV9PTkVTSE9UIDB4MDEKLQotCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX0dFVF9JTkZPIj5GRV9HRVRfSU5GTzwvbGluaz4gICAgICAgICAgICAgICAgX0lPUignbycsIDYxLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX2luZm8pCi0KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfRElTRVFDX1JFU0VUX09WRVJMT0FEIj5GRV9ESVNFUUNfUkVTRVRfT1ZFUkxPQUQ8L2xpbms+ICAgX0lPKCdvJywgNjIpCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX0RJU0VRQ19TRU5EX01BU1RFUl9DTUQiPkZFX0RJU0VRQ19TRU5EX01BU1RFUl9DTUQ8L2xpbms+ICBfSU9XKCdvJywgNjMsIHN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQpCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX0RJU0VRQ19SRUNWX1NMQVZFX1JFUExZIj5GRV9ESVNFUUNfUkVDVl9TTEFWRV9SRVBMWTwvbGluaz4gX0lPUignbycsIDY0LCBzdHJ1Y3QgZHZiX2Rpc2VxY19zbGF2ZV9yZXBseSkKLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfRElTRVFDX1NFTkRfQlVSU1QiPkZFX0RJU0VRQ19TRU5EX0JVUlNUPC9saW5rPiAgICAgICBfSU8oJ28nLCA2NSkgIC8qIGZlX3NlY19taW5pX2NtZF90ICovCi0KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfU0VUX1RPTkUiPkZFX1NFVF9UT05FPC9saW5rPiAgICAgICAgICAgICAgICBfSU8oJ28nLCA2NikgIC8qIGZlX3NlY190b25lX21vZGVfdCAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9TRVRfVk9MVEFHRSI+RkVfU0VUX1ZPTFRBR0U8L2xpbms+ICAgICAgICAgICAgIF9JTygnbycsIDY3KSAgLyogZmVfc2VjX3ZvbHRhZ2VfdCAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9FTkFCTEVfSElHSF9MTkJfVk9MVEFHRSI+RkVfRU5BQkxFX0hJR0hfTE5CX1ZPTFRBR0U8L2xpbms+IF9JTygnbycsIDY4KSAgLyogaW50ICovCi0KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfUkVBRF9TVEFUVVMiPkZFX1JFQURfU1RBVFVTPC9saW5rPiAgICAgICAgICAgICBfSU9SKCdvJywgNjksIGZlX3N0YXR1c190KQotI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9SRUFEX0JFUiI+RkVfUkVBRF9CRVI8L2xpbms+ICAgICAgICAgICAgICAgIF9JT1IoJ28nLCA3MCwgX191MzIpCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX1JFQURfU0lHTkFMX1NUUkVOR1RIIj5GRV9SRUFEX1NJR05BTF9TVFJFTkdUSDwvbGluaz4gICAgX0lPUignbycsIDcxLCBfX3UxNikKLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfUkVBRF9TTlIiPkZFX1JFQURfU05SPC9saW5rPiAgICAgICAgICAgICAgICBfSU9SKCdvJywgNzIsIF9fdTE2KQotI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9SRUFEX1VOQ09SUkVDVEVEX0JMT0NLUyI+RkVfUkVBRF9VTkNPUlJFQ1RFRF9CTE9DS1M8L2xpbms+IF9JT1IoJ28nLCA3MywgX191MzIpCi0KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfU0VUX0ZST05URU5EIj5GRV9TRVRfRlJPTlRFTkQ8L2xpbms+ICAgICAgICAgICAgX0lPVygnbycsIDc2LCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMpCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX0dFVF9GUk9OVEVORCI+RkVfR0VUX0ZST05URU5EPC9saW5rPiAgICAgICAgICAgIF9JT1IoJ28nLCA3Nywgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKQotI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9TRVRfRlJPTlRFTkRfVFVORV9NT0RFIj5GRV9TRVRfRlJPTlRFTkRfVFVORV9NT0RFPC9saW5rPiAgX0lPKCdvJywgODEpIC8qIHVuc2lnbmVkIGludCAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9HRVRfRVZFTlQiPkZFX0dFVF9FVkVOVDwvbGluaz4gICAgICAgICAgICAgICBfSU9SKCdvJywgNzgsIHN0cnVjdCBkdmJfZnJvbnRlbmRfZXZlbnQpCi0KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfRElTSE5FVFdPUktfU0VORF9MRUdBQ1lfQ01EIj5GRV9ESVNITkVUV09SS19TRU5EX0xFR0FDWV9DTUQ8L2xpbms+IF9JTygnbycsIDgwKSAvKiB1bnNpZ25lZCBpbnQgKi8KLQotI2VuZGlmIC8qX0RWQkZST05URU5EX0hfKi8KLTwvcHJvZ3JhbWxpc3Rpbmc+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL25ldC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL25ldC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZTM4OGQuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9uZXQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPHRpdGxlPkRWQiBOZXR3b3JrIEFQSTwvdGl0bGU+Ci08cGFyYT5UaGUgRFZCIG5ldCBkZXZpY2UgZW5hYmxlcyBmZWVkaW5nIG9mIE1QRSAobXVsdGkgcHJvdG9jb2wgZW5jYXBzdWxhdGlvbikgcGFja2V0cwotcmVjZWl2ZWQgdmlhIERWQiBpbnRvIHRoZSBMaW51eCBuZXR3b3JrIHByb3RvY29sIHN0YWNrLCBlLmcuIGZvciBpbnRlcm5ldCB2aWEgc2F0ZWxsaXRlCi1hcHBsaWNhdGlvbnMuIEl0IGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIDxlbXBoYXNpcyByb2xlPSJ0dCI+L2Rldi9kdmIvYWRhcHRlcjAvbmV0MDwvZW1waGFzaXM+LiBEYXRhIHR5cGVzIGFuZAotYW5kIGlvY3RsIGRlZmluaXRpb25zIGNhbiBiZSBhY2Nlc3NlZCBieSBpbmNsdWRpbmcgPGVtcGhhc2lzIHJvbGU9InR0Ij5saW51eC9kdmIvbmV0Lmg8L2VtcGhhc2lzPiBpbiB5b3VyCi1hcHBsaWNhdGlvbi4KLTwvcGFyYT4KLTxzZWN0aW9uIGlkPSJkdmJfbmV0X3R5cGVzIj4KLTx0aXRsZT5EVkIgTmV0IERhdGEgVHlwZXM8L3RpdGxlPgotPHBhcmE+VG8gYmUgd3JpdHRlbiYjeDIwMjY7Ci08L3BhcmE+Ci08L3NlY3Rpb24+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEtZW50aXRpZXMudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS1lbnRpdGllcy50bXBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWZlMDk0Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS1lbnRpdGllcy50bXBsCisrKyAvZGV2L251bGwKQEAgLTEsNDY0ICswLDAgQEAKLTwhLS0gR2VuZXJhdGVkIGZpbGUhIERvIG5vdCBlZGl0LiAtLT4KLQotPCEtLSBGdW5jdGlvbnMgLS0+Ci08IUVOVElUWSBmdW5jLWNsb3NlICI8bGluayBsaW5rZW5kPSdmdW5jLWNsb3NlJz48ZnVuY3Rpb24+Y2xvc2UoKTwvZnVuY3Rpb24+PC9saW5rPiI+Ci08IUVOVElUWSBmdW5jLWlvY3RsICI8bGluayBsaW5rZW5kPSdmdW5jLWlvY3RsJz48ZnVuY3Rpb24+aW9jdGwoKTwvZnVuY3Rpb24+PC9saW5rPiI+Ci08IUVOVElUWSBmdW5jLW1tYXAgIjxsaW5rIGxpbmtlbmQ9J2Z1bmMtbW1hcCc+PGZ1bmN0aW9uPm1tYXAoKTwvZnVuY3Rpb24+PC9saW5rPiI+Ci08IUVOVElUWSBmdW5jLW11bm1hcCAiPGxpbmsgbGlua2VuZD0nZnVuYy1tdW5tYXAnPjxmdW5jdGlvbj5tdW5tYXAoKTwvZnVuY3Rpb24+PC9saW5rPiI+Ci08IUVOVElUWSBmdW5jLW9wZW4gIjxsaW5rIGxpbmtlbmQ9J2Z1bmMtb3Blbic+PGZ1bmN0aW9uPm9wZW4oKTwvZnVuY3Rpb24+PC9saW5rPiI+Ci08IUVOVElUWSBmdW5jLXBvbGwgIjxsaW5rIGxpbmtlbmQ9J2Z1bmMtcG9sbCc+PGZ1bmN0aW9uPnBvbGwoKTwvZnVuY3Rpb24+PC9saW5rPiI+Ci08IUVOVElUWSBmdW5jLXJlYWQgIjxsaW5rIGxpbmtlbmQ9J2Z1bmMtcmVhZCc+PGZ1bmN0aW9uPnJlYWQoKTwvZnVuY3Rpb24+PC9saW5rPiI+Ci08IUVOVElUWSBmdW5jLXNlbGVjdCAiPGxpbmsgbGlua2VuZD0nZnVuYy1zZWxlY3QnPjxmdW5jdGlvbj5zZWxlY3QoKTwvZnVuY3Rpb24+PC9saW5rPiI+Ci08IUVOVElUWSBmdW5jLXdyaXRlICI8bGluayBsaW5rZW5kPSdmdW5jLXdyaXRlJz48ZnVuY3Rpb24+d3JpdGUoKTwvZnVuY3Rpb24+PC9saW5rPiI+Ci0KLTwhRU5USVRZIG1lZGlhLWZ1bmMtY2xvc2UgIjxsaW5rIGxpbmtlbmQ9J21lZGlhLWZ1bmMtY2xvc2UnPjxmdW5jdGlvbj5jbG9zZSgpPC9mdW5jdGlvbj48L2xpbms+Ij4KLTwhRU5USVRZIG1lZGlhLWZ1bmMtaW9jdGwgIjxsaW5rIGxpbmtlbmQ9J21lZGlhLWZ1bmMtaW9jdGwnPjxmdW5jdGlvbj5pb2N0bCgpPC9mdW5jdGlvbj48L2xpbms+Ij4KLTwhRU5USVRZIG1lZGlhLWZ1bmMtb3BlbiAiPGxpbmsgbGlua2VuZD0nbWVkaWEtZnVuYy1vcGVuJz48ZnVuY3Rpb24+b3BlbigpPC9mdW5jdGlvbj48L2xpbms+Ij4KLQotPCEtLSBJb2N0bHMgLS0+Ci08IUVOVElUWSBWSURJT0MtQ1JPUENBUCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWNyb3BjYXAnPjxjb25zdGFudD5WSURJT0NfQ1JPUENBUDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtREJHLUctQ0hJUC1JREVOVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWRiZy1nLWNoaXAtaWRlbnQnPjxjb25zdGFudD5WSURJT0NfREJHX0dfQ0hJUF9JREVOVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtREJHLUctUkVHSVNURVIgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1kYmctZy1yZWdpc3Rlcic+PGNvbnN0YW50PlZJRElPQ19EQkdfR19SRUdJU1RFUjwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtREJHLVMtUkVHSVNURVIgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1kYmctZy1yZWdpc3Rlcic+PGNvbnN0YW50PlZJRElPQ19EQkdfU19SRUdJU1RFUjwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRFFCVUYgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1xYnVmJz48Y29uc3RhbnQ+VklESU9DX0RRQlVGPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1EUUVWRU5UICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZHFldmVudCc+PGNvbnN0YW50PlZJRElPQ19EUUVWRU5UPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1FTkNPREVSLUNNRCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWVuY29kZXItY21kJz48Y29uc3RhbnQ+VklESU9DX0VOQ09ERVJfQ01EPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1FTlVNQVVESU8gIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1lbnVtYXVkaW8nPjxjb25zdGFudD5WSURJT0NfRU5VTUFVRElPPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1FTlVNQVVET1VUICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZW51bWF1ZGlvb3V0Jz48Y29uc3RhbnQ+VklESU9DX0VOVU1BVURPVVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUVOVU1JTlBVVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWVudW1pbnB1dCc+PGNvbnN0YW50PlZJRElPQ19FTlVNSU5QVVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUVOVU1PVVRQVVQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1lbnVtb3V0cHV0Jz48Y29uc3RhbnQ+VklESU9DX0VOVU1PVVRQVVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUVOVU1TVEQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1lbnVtc3RkJz48Y29uc3RhbnQ+VklESU9DX0VOVU1TVEQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUVOVU0tRFYtUFJFU0VUUyAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWVudW0tZHYtcHJlc2V0cyc+PGNvbnN0YW50PlZJRElPQ19FTlVNX0RWX1BSRVNFVFM8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUVOVU0tRk1UICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZW51bS1mbXQnPjxjb25zdGFudD5WSURJT0NfRU5VTV9GTVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUVOVU0tRlJBTUVJTlRFUlZBTFMgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1lbnVtLWZyYW1laW50ZXJ2YWxzJz48Y29uc3RhbnQ+VklESU9DX0VOVU1fRlJBTUVJTlRFUlZBTFM8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUVOVU0tRlJBTUVTSVpFUyAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWVudW0tZnJhbWVzaXplcyc+PGNvbnN0YW50PlZJRElPQ19FTlVNX0ZSQU1FU0laRVM8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctQVVESU8gIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWF1ZGlvJz48Y29uc3RhbnQ+VklESU9DX0dfQVVESU88L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctQVVET1VUICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1hdWRpb291dCc+PGNvbnN0YW50PlZJRElPQ19HX0FVRE9VVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRy1DUk9QICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1jcm9wJz48Y29uc3RhbnQ+VklESU9DX0dfQ1JPUDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRy1DVFJMICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1jdHJsJz48Y29uc3RhbnQ+VklESU9DX0dfQ1RSTDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRy1EVi1QUkVTRVQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWR2LXByZXNldCc+PGNvbnN0YW50PlZJRElPQ19HX0RWX1BSRVNFVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRy1EVi1USU1JTkdTICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1kdi10aW1pbmdzJz48Y29uc3RhbnQ+VklESU9DX0dfRFZfVElNSU5HUzwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRy1FTkMtSU5ERVggIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWVuYy1pbmRleCc+PGNvbnN0YW50PlZJRElPQ19HX0VOQ19JTkRFWDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRy1FWFQtQ1RSTFMgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWV4dC1jdHJscyc+PGNvbnN0YW50PlZJRElPQ19HX0VYVF9DVFJMUzwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRy1GQlVGICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1mYnVmJz48Y29uc3RhbnQ+VklESU9DX0dfRkJVRjwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRy1GTVQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWZtdCc+PGNvbnN0YW50PlZJRElPQ19HX0ZNVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRy1GUkVRVUVOQ1kgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWZyZXF1ZW5jeSc+PGNvbnN0YW50PlZJRElPQ19HX0ZSRVFVRU5DWTwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRy1JTlBVVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctaW5wdXQnPjxjb25zdGFudD5WSURJT0NfR19JTlBVVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRy1KUEVHQ09NUCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctanBlZ2NvbXAnPjxjb25zdGFudD5WSURJT0NfR19KUEVHQ09NUDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRy1NUEVHQ09NUCAiPGxpbmsgbGlua2VuZD0nJz48Y29uc3RhbnQ+VklESU9DX0dfTVBFR0NPTVA8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctTU9EVUxBVE9SICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1tb2R1bGF0b3InPjxjb25zdGFudD5WSURJT0NfR19NT0RVTEFUT1I8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctT1VUUFVUICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1vdXRwdXQnPjxjb25zdGFudD5WSURJT0NfR19PVVRQVVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctUEFSTSAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctcGFybSc+PGNvbnN0YW50PlZJRElPQ19HX1BBUk08L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctUFJJT1JJVFkgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLXByaW9yaXR5Jz48Y29uc3RhbnQ+VklESU9DX0dfUFJJT1JJVFk8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctU0xJQ0VELVZCSS1DQVAgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLXNsaWNlZC12YmktY2FwJz48Y29uc3RhbnQ+VklESU9DX0dfU0xJQ0VEX1ZCSV9DQVA8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctU1REICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1zdGQnPjxjb25zdGFudD5WSURJT0NfR19TVEQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctVFVORVIgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLXR1bmVyJz48Y29uc3RhbnQ+VklESU9DX0dfVFVORVI8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUxPRy1TVEFUVVMgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1sb2ctc3RhdHVzJz48Y29uc3RhbnQ+VklESU9DX0xPR19TVEFUVVM8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLU9WRVJMQVkgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1vdmVybGF5Jz48Y29uc3RhbnQ+VklESU9DX09WRVJMQVk8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVFCVUYgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1xYnVmJz48Y29uc3RhbnQ+VklESU9DX1FCVUY8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVFVRVJZQlVGICI8bGluayBsaW5rZW5kPSd2aWRpb2MtcXVlcnlidWYnPjxjb25zdGFudD5WSURJT0NfUVVFUllCVUY8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVFVRVJZQ0FQICI8bGluayBsaW5rZW5kPSd2aWRpb2MtcXVlcnljYXAnPjxjb25zdGFudD5WSURJT0NfUVVFUllDQVA8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVFVRVJZQ1RSTCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXF1ZXJ5Y3RybCc+PGNvbnN0YW50PlZJRElPQ19RVUVSWUNUUkw8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVFVRVJZTUVOVSAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXF1ZXJ5Y3RybCc+PGNvbnN0YW50PlZJRElPQ19RVUVSWU1FTlU8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVFVRVJZU1REICI8bGluayBsaW5rZW5kPSd2aWRpb2MtcXVlcnlzdGQnPjxjb25zdGFudD5WSURJT0NfUVVFUllTVEQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVFVRVJZLURWLVBSRVNFVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXF1ZXJ5LWR2LXByZXNldCc+PGNvbnN0YW50PlZJRElPQ19RVUVSWV9EVl9QUkVTRVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVJFUUJVRlMgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1yZXFidWZzJz48Y29uc3RhbnQ+VklESU9DX1JFUUJVRlM8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNUUkVBTU9GRiAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXN0cmVhbW9uJz48Y29uc3RhbnQ+VklESU9DX1NUUkVBTU9GRjwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtU1RSRUFNT04gIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1zdHJlYW1vbic+PGNvbnN0YW50PlZJRElPQ19TVFJFQU1PTjwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtU1VCU0NSSUJFLUVWRU5UICI8bGluayBsaW5rZW5kPSd2aWRpb2Mtc3Vic2NyaWJlLWV2ZW50Jz48Y29uc3RhbnQ+VklESU9DX1NVQlNDUklCRV9FVkVOVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1BVURJTyAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctYXVkaW8nPjxjb25zdGFudD5WSURJT0NfU19BVURJTzwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1BVURPVVQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWF1ZGlvb3V0Jz48Y29uc3RhbnQ+VklESU9DX1NfQVVET1VUPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1TLUNST1AgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWNyb3AnPjxjb25zdGFudD5WSURJT0NfU19DUk9QPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1TLUNUUkwgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWN0cmwnPjxjb25zdGFudD5WSURJT0NfU19DVFJMPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1TLURWLVBSRVNFVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctZHYtcHJlc2V0Jz48Y29uc3RhbnQ+VklESU9DX1NfRFZfUFJFU0VUPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1TLURWLVRJTUlOR1MgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWR2LXRpbWluZ3MnPjxjb25zdGFudD5WSURJT0NfU19EVl9USU1JTkdTPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1TLUVYVC1DVFJMUyAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctZXh0LWN0cmxzJz48Y29uc3RhbnQ+VklESU9DX1NfRVhUX0NUUkxTPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1TLUZCVUYgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWZidWYnPjxjb25zdGFudD5WSURJT0NfU19GQlVGPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1TLUZNVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctZm10Jz48Y29uc3RhbnQ+VklESU9DX1NfRk1UPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1TLUZSRVFVRU5DWSAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctZnJlcXVlbmN5Jz48Y29uc3RhbnQ+VklESU9DX1NfRlJFUVVFTkNZPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1TLUhXLUZSRVEtU0VFSyAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXMtaHctZnJlcS1zZWVrJz48Y29uc3RhbnQ+VklESU9DX1NfSFdfRlJFUV9TRUVLPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1TLUlOUFVUICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1pbnB1dCc+PGNvbnN0YW50PlZJRElPQ19TX0lOUFVUPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1TLUpQRUdDT01QICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1qcGVnY29tcCc+PGNvbnN0YW50PlZJRElPQ19TX0pQRUdDT01QPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1TLU1QRUdDT01QICI8bGluayBsaW5rZW5kPScnPjxjb25zdGFudD5WSURJT0NfU19NUEVHQ09NUDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1NT0RVTEFUT1IgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLW1vZHVsYXRvcic+PGNvbnN0YW50PlZJRElPQ19TX01PRFVMQVRPUjwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1PVVRQVVQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLW91dHB1dCc+PGNvbnN0YW50PlZJRElPQ19TX09VVFBVVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1QQVJNICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1wYXJtJz48Y29uc3RhbnQ+VklESU9DX1NfUEFSTTwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1QUklPUklUWSAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctcHJpb3JpdHknPjxjb25zdGFudD5WSURJT0NfU19QUklPUklUWTwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1TVEQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLXN0ZCc+PGNvbnN0YW50PlZJRElPQ19TX1NURDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1UVU5FUiAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctdHVuZXInPjxjb25zdGFudD5WSURJT0NfU19UVU5FUjwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtU1VCREVWLUVOVU0tRlJBTUUtU0laRSAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXN1YmRldi1lbnVtLWZyYW1lLXNpemUnPjxjb25zdGFudD5WSURJT0NfU1VCREVWX0VOVU1fRlJBTUVfU0laRTwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtU1VCREVWLUVOVU0tTUJVUy1DT0RFICI8bGluayBsaW5rZW5kPSd2aWRpb2Mtc3ViZGV2LWVudW0tbWJ1cy1jb2RlJz48Y29uc3RhbnQ+VklESU9DX1NVQkRFVl9FTlVNX01CVVNfQ09ERTwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtU1VCREVWLUctQ1JPUCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXN1YmRldi1nLWNyb3AnPjxjb25zdGFudD5WSURJT0NfU1VCREVWX0dfQ1JPUDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtU1VCREVWLUctRk1UICI8bGluayBsaW5rZW5kPSd2aWRpb2Mtc3ViZGV2LWctZm10Jz48Y29uc3RhbnQ+VklESU9DX1NVQkRFVl9HX0ZNVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtU1VCREVWLUctRlJBTUUtSU5URVJWQUwgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1zdWJkZXYtZy1mcmFtZS1pbnRlcnZhbCc+PGNvbnN0YW50PlZJRElPQ19TVUJERVZfR19GUkFNRV9JTlRFUlZBTDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtU1VCREVWLVMtQ1JPUCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXN1YmRldi1nLWNyb3AnPjxjb25zdGFudD5WSURJT0NfU1VCREVWX1NfQ1JPUDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtU1VCREVWLVMtRk1UICI8bGluayBsaW5rZW5kPSd2aWRpb2Mtc3ViZGV2LWctZm10Jz48Y29uc3RhbnQ+VklESU9DX1NVQkRFVl9TX0ZNVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtU1VCREVWLVMtRlJBTUUtSU5URVJWQUwgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1zdWJkZXYtZy1mcmFtZS1pbnRlcnZhbCc+PGNvbnN0YW50PlZJRElPQ19TVUJERVZfU19GUkFNRV9JTlRFUlZBTDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtVFJZLUVOQ09ERVItQ01EICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZW5jb2Rlci1jbWQnPjxjb25zdGFudD5WSURJT0NfVFJZX0VOQ09ERVJfQ01EPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1UUlktRVhULUNUUkxTICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1leHQtY3RybHMnPjxjb25zdGFudD5WSURJT0NfVFJZX0VYVF9DVFJMUzwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtVFJZLUZNVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctZm10Jz48Y29uc3RhbnQ+VklESU9DX1RSWV9GTVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVVOU1VCU0NSSUJFLUVWRU5UICI8bGluayBsaW5rZW5kPSd2aWRpb2Mtc3Vic2NyaWJlLWV2ZW50Jz48Y29uc3RhbnQ+VklESU9DX1VOU1VCU0NSSUJFX0VWRU5UPC9jb25zdGFudD48L2xpbms+Ij4KLQotPCFFTlRJVFkgTUVESUEtSU9DLURFVklDRS1JTkZPICI8bGluayBsaW5rZW5kPSdtZWRpYS1pb2MtZGV2aWNlLWluZm8nPjxjb25zdGFudD5NRURJQV9JT0NfREVWSUNFX0lORk88L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgTUVESUEtSU9DLUVOVU0tRU5USVRJRVMgIjxsaW5rIGxpbmtlbmQ9J21lZGlhLWlvYy1lbnVtLWVudGl0aWVzJz48Y29uc3RhbnQ+TUVESUFfSU9DX0VOVU1fRU5USVRJRVM8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgTUVESUEtSU9DLUVOVU0tTElOS1MgIjxsaW5rIGxpbmtlbmQ9J21lZGlhLWlvYy1lbnVtLWxpbmtzJz48Y29uc3RhbnQ+TUVESUFfSU9DX0VOVU1fTElOS1M8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgTUVESUEtSU9DLVNFVFVQLUxJTksgIjxsaW5rIGxpbmtlbmQ9J21lZGlhLWlvYy1zZXR1cC1saW5rJz48Y29uc3RhbnQ+TUVESUFfSU9DX1NFVFVQX0xJTks8L2NvbnN0YW50PjwvbGluaz4iPgotCi08IS0tIFR5cGVzIC0tPgotPCFFTlRJVFkgdjRsMi1zdGQtaWQgIjxsaW5rIGxpbmtlbmQ9J3Y0bDItc3RkLWlkJz52NGwyX3N0ZF9pZDwvbGluaz4iPgotCi08IS0tIEVudW1zIC0tPgotPCFFTlRJVFkgdjRsMi1idWYtdHlwZSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItYnVmLXR5cGUnPnY0bDJfYnVmX3R5cGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItY29sb3JzcGFjZSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItY29sb3JzcGFjZSc+djRsMl9jb2xvcnNwYWNlPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLWN0cmwtdHlwZSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItY3RybC10eXBlJz52NGwyX2N0cmxfdHlwZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1leHBvc3VyZS1hdXRvLXR5cGUgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWV4cG9zdXJlLWF1dG8tdHlwZSc+djRsMl9leHBvc3VyZV9hdXRvX3R5cGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZmllbGQgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZpZWxkJz52NGwyX2ZpZWxkPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLWZybWl2YWx0eXBlcyAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZnJtaXZhbHR5cGVzJz52NGwyX2ZybWl2YWx0eXBlczwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1mcm1zaXpldHlwZXMgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZybXNpemV0eXBlcyc+djRsMl9mcm1zaXpldHlwZXM8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbWJ1cy1waXhlbGNvZGUgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1idXMtcGl4ZWxjb2RlJz52NGwyX21idXNfcGl4ZWxjb2RlPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLW1lbW9yeSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbWVtb3J5Jz52NGwyX21lbW9yeTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tcGVnLWF1ZGlvLWFjMy1iaXRyYXRlICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWF1ZGlvLWFjMy1iaXRyYXRlJz52NGwyX21wZWdfYXVkaW9fYWMzX2JpdHJhdGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy1hdWRpby1jcmMgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctYXVkaW8tY3JjJz52NGwyX21wZWdfYXVkaW9fY3JjPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLW1wZWctYXVkaW8tZW1waGFzaXMgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctYXVkaW8tZW1waGFzaXMnPnY0bDJfbXBlZ19hdWRpb19lbXBoYXNpczwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tcGVnLWF1ZGlvLWVuY29kaW5nICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWF1ZGlvLWVuY29kaW5nJz52NGwyX21wZWdfYXVkaW9fZW5jb2Rpbmc8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy1hdWRpby1sMS1iaXRyYXRlICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWF1ZGlvLWwxLWJpdHJhdGUnPnY0bDJfbXBlZ19hdWRpb19sMV9iaXRyYXRlPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLW1wZWctYXVkaW8tbDItYml0cmF0ZSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1sMi1iaXRyYXRlJz52NGwyX21wZWdfYXVkaW9fbDJfYml0cmF0ZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tcGVnLWF1ZGlvLWwzLWJpdHJhdGUgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctYXVkaW8tbDMtYml0cmF0ZSc+djRsMl9tcGVnX2F1ZGlvX2wzX2JpdHJhdGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy1hdWRpby1tb2RlICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWF1ZGlvLW1vZGUnPnY0bDJfbXBlZ19hdWRpb19tb2RlPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLW1wZWctYXVkaW8tbW9kZS1leHRlbnNpb24gImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctYXVkaW8tbW9kZS1leHRlbnNpb24nPnY0bDJfbXBlZ19hdWRpb19tb2RlX2V4dGVuc2lvbjwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tcGVnLWF1ZGlvLXNhbXBsaW5nLWZyZXEgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctYXVkaW8tc2FtcGxpbmctZnJlcSc+djRsMl9tcGVnX2F1ZGlvX3NhbXBsaW5nX2ZyZXE8L2xpbms+Ij4KLTwhRU5USVRZIGNocm9tYS1zcGF0aWFsLWZpbHRlci10eXBlICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0nY2hyb21hLXNwYXRpYWwtZmlsdGVyLXR5cGUnPnY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX2Nocm9tYV9zcGF0aWFsX2ZpbHRlcl90eXBlPC9saW5rPiI+Ci08IUVOVElUWSBsdW1hLXNwYXRpYWwtZmlsdGVyLXR5cGUgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSdsdW1hLXNwYXRpYWwtZmlsdGVyLXR5cGUnPnY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX2x1bWFfc3BhdGlhbF9maWx0ZXJfdHlwZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tcGVnLWN4MjM0MXgtdmlkZW8tbWVkaWFuLWZpbHRlci10eXBlICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWN4MjM0MXgtdmlkZW8tbWVkaWFuLWZpbHRlci10eXBlJz52NGwyX21wZWdfY3gyMzQxeF92aWRlb19tZWRpYW5fZmlsdGVyX3R5cGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy1jeDIzNDF4LXZpZGVvLXNwYXRpYWwtZmlsdGVyLW1vZGUgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctY3gyMzQxeC12aWRlby1zcGF0aWFsLWZpbHRlci1tb2RlJz52NGwyX21wZWdfY3gyMzQxeF92aWRlb19zcGF0aWFsX2ZpbHRlcl9tb2RlPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLW1wZWctY3gyMzQxeC12aWRlby10ZW1wb3JhbC1maWx0ZXItbW9kZSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1jeDIzNDF4LXZpZGVvLXRlbXBvcmFsLWZpbHRlci1tb2RlJz52NGwyX21wZWdfY3gyMzQxeF92aWRlb190ZW1wb3JhbF9maWx0ZXJfbW9kZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tcGVnLXN0cmVhbS10eXBlICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLXN0cmVhbS10eXBlJz52NGwyX21wZWdfc3RyZWFtX3R5cGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy1zdHJlYW0tdmJpLWZtdCAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1zdHJlYW0tdmJpLWZtdCc+djRsMl9tcGVnX3N0cmVhbV92YmlfZm10PC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLW1wZWctdmlkZW8tYXNwZWN0ICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLXZpZGVvLWFzcGVjdCc+djRsMl9tcGVnX3ZpZGVvX2FzcGVjdDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tcGVnLXZpZGVvLWJpdHJhdGUtbW9kZSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy12aWRlby1iaXRyYXRlLW1vZGUnPnY0bDJfbXBlZ192aWRlb19iaXRyYXRlX21vZGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy12aWRlby1lbmNvZGluZyAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy12aWRlby1lbmNvZGluZyc+djRsMl9tcGVnX3ZpZGVvX2VuY29kaW5nPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLXBvd2VyLWxpbmUtZnJlcXVlbmN5ICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1wb3dlci1saW5lLWZyZXF1ZW5jeSc+djRsMl9wb3dlcl9saW5lX2ZyZXF1ZW5jeTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1wcmlvcml0eSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItcHJpb3JpdHknPnY0bDJfcHJpb3JpdHk8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc3ViZGV2LWZvcm1hdC13aGVuY2UgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXN1YmRldi1mb3JtYXQtd2hlbmNlJz52NGwyX3N1YmRldl9mb3JtYXRfd2hlbmNlPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLXR1bmVyLXR5cGUgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXR1bmVyLXR5cGUnPnY0bDJfdHVuZXJfdHlwZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1wcmVlbXBoYXNpcyAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItcHJlZW1waGFzaXMnPnY0bDJfcHJlZW1waGFzaXM8L2xpbms+Ij4KLQotPCEtLSBTdHJ1Y3R1cmVzIC0tPgotPCFFTlRJVFkgdjRsMi1hdWRpbyAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1hdWRpbyc+djRsMl9hdWRpbzwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1hdWRpb291dCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1hdWRpb291dCc+djRsMl9hdWRpb291dDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1idC10aW1pbmdzICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWJ0LXRpbWluZ3MnPnY0bDJfYnRfdGltaW5nczwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1idWZmZXIgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItYnVmZmVyJz52NGwyX2J1ZmZlcjwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1wbGFuZSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1wbGFuZSc+djRsMl9wbGFuZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1jYXBhYmlsaXR5ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWNhcGFiaWxpdHknPnY0bDJfY2FwYWJpbGl0eTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1jYXB0dXJlcGFybSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1jYXB0dXJlcGFybSc+djRsMl9jYXB0dXJlcGFybTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1jbGlwICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWNsaXAnPnY0bDJfY2xpcDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1jb250cm9sICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWNvbnRyb2wnPnY0bDJfY29udHJvbDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1jcm9wICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWNyb3AnPnY0bDJfY3JvcDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1jcm9wY2FwICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWNyb3BjYXAnPnY0bDJfY3JvcGNhcDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1kYmctY2hpcC1pZGVudCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1kYmctY2hpcC1pZGVudCc+djRsMl9kYmdfY2hpcF9pZGVudDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1kYmctbWF0Y2ggInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZGJnLW1hdGNoJz52NGwyX2RiZ19tYXRjaDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1kYmctcmVnaXN0ZXIgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZGJnLXJlZ2lzdGVyJz52NGwyX2RiZ19yZWdpc3RlcjwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1kdi1lbnVtLXByZXNldCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1kdi1lbnVtLXByZXNldCc+djRsMl9kdl9lbnVtX3ByZXNldDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1kdi1wcmVzZXQgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZHYtcHJlc2V0Jz52NGwyX2R2X3ByZXNldDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1kdi10aW1pbmdzICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWR2LXRpbWluZ3MnPnY0bDJfZHZfdGltaW5nczwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1lbmMtaWR4ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWVuYy1pZHgnPnY0bDJfZW5jX2lkeDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1lbmMtaWR4LWVudHJ5ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWVuYy1pZHgtZW50cnknPnY0bDJfZW5jX2lkeF9lbnRyeTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1lbmNvZGVyLWNtZCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1lbmNvZGVyLWNtZCc+djRsMl9lbmNvZGVyX2NtZDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1ldmVudCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1ldmVudCc+djRsMl9ldmVudDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1ldmVudC1zdWJzY3JpcHRpb24gInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZXZlbnQtc3Vic2NyaXB0aW9uJz52NGwyX2V2ZW50X3N1YnNjcmlwdGlvbjwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1ldmVudC12c3luYyAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1ldmVudC12c3luYyc+djRsMl9ldmVudF92c3luYzwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1leHQtY29udHJvbCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1leHQtY29udHJvbCc+djRsMl9leHRfY29udHJvbDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1leHQtY29udHJvbHMgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZXh0LWNvbnRyb2xzJz52NGwyX2V4dF9jb250cm9sczwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1mbXRkZXNjICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZtdGRlc2MnPnY0bDJfZm10ZGVzYzwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1mb3JtYXQgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZm9ybWF0Jz52NGwyX2Zvcm1hdDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1mcmFjdCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcmFjdCc+djRsMl9mcmFjdDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1mcmFtZWJ1ZmZlciAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcmFtZWJ1ZmZlcic+djRsMl9mcmFtZWJ1ZmZlcjwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1mcmVxdWVuY3kgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZnJlcXVlbmN5Jz52NGwyX2ZyZXF1ZW5jeTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1mcm1pdmFsLXN0ZXB3aXNlICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZybWl2YWwtc3RlcHdpc2UnPnY0bDJfZnJtaXZhbF9zdGVwd2lzZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1mcm1pdmFsZW51bSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcm1pdmFsZW51bSc+djRsMl9mcm1pdmFsZW51bTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1mcm1zaXplLWRpc2NyZXRlICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZybXNpemUtZGlzY3JldGUnPnY0bDJfZnJtc2l6ZV9kaXNjcmV0ZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1mcm1zaXplLXN0ZXB3aXNlICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZybXNpemUtc3RlcHdpc2UnPnY0bDJfZnJtc2l6ZV9zdGVwd2lzZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1mcm1zaXplZW51bSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcm1zaXplZW51bSc+djRsMl9mcm1zaXplZW51bTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1ody1mcmVxLXNlZWsgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItaHctZnJlcS1zZWVrJz52NGwyX2h3X2ZyZXFfc2VlazwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1pbnB1dCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1pbnB1dCc+djRsMl9pbnB1dDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1qcGVnY29tcHJlc3Npb24gInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItanBlZ2NvbXByZXNzaW9uJz52NGwyX2pwZWdjb21wcmVzc2lvbjwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tYnVzLWZyYW1lZm10ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1idXMtZnJhbWVmbXQnPnY0bDJfbWJ1c19mcmFtZWZtdDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tb2R1bGF0b3IgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbW9kdWxhdG9yJz52NGwyX21vZHVsYXRvcjwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tcGVnLXZiaS1mbXQtaXZ0diAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLXZiaS1mbXQtaXZ0dic+djRsMl9tcGVnX3ZiaV9mbXRfaXZ0djwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1vdXRwdXQgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItb3V0cHV0Jz52NGwyX291dHB1dDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1vdXRwdXRwYXJtICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW91dHB1dHBhcm0nPnY0bDJfb3V0cHV0cGFybTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1waXgtZm9ybWF0ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXBpeC1mb3JtYXQnPnY0bDJfcGl4X2Zvcm1hdDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1waXgtZm9ybWF0LW1wbGFuZSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1waXgtZm9ybWF0LW1wbGFuZSc+djRsMl9waXhfZm9ybWF0X21wbGFuZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1wbGFuZS1waXgtZm9ybWF0ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXBsYW5lLXBpeC1mb3JtYXQnPnY0bDJfcGxhbmVfcGl4X2Zvcm1hdDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1xdWVyeWN0cmwgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItcXVlcnljdHJsJz52NGwyX3F1ZXJ5Y3RybDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1xdWVyeW1lbnUgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItcXVlcnltZW51Jz52NGwyX3F1ZXJ5bWVudTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1yZWN0ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXJlY3QnPnY0bDJfcmVjdDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1yZXF1ZXN0YnVmZmVycyAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1yZXF1ZXN0YnVmZmVycyc+djRsMl9yZXF1ZXN0YnVmZmVyczwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1zbGljZWQtdmJpLWNhcCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1zbGljZWQtdmJpLWNhcCc+djRsMl9zbGljZWRfdmJpX2NhcDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1zbGljZWQtdmJpLWRhdGEgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItc2xpY2VkLXZiaS1kYXRhJz52NGwyX3NsaWNlZF92YmlfZGF0YTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1zbGljZWQtdmJpLWZvcm1hdCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1zbGljZWQtdmJpLWZvcm1hdCc+djRsMl9zbGljZWRfdmJpX2Zvcm1hdDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1zdWJkZXYtZnJhbWUtaW50ZXJ2YWwgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItc3ViZGV2LWZyYW1lLWludGVydmFsJz52NGwyX3N1YmRldl9mcmFtZV9pbnRlcnZhbDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1zdWJkZXYtZnJhbWUtaW50ZXJ2YWwtZW51bSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1zdWJkZXYtZnJhbWUtaW50ZXJ2YWwtZW51bSc+djRsMl9zdWJkZXZfZnJhbWVfaW50ZXJ2YWxfZW51bTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1zdWJkZXYtZnJhbWUtc2l6ZS1lbnVtICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXN1YmRldi1mcmFtZS1zaXplLWVudW0nPnY0bDJfc3ViZGV2X2ZyYW1lX3NpemVfZW51bTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1zdWJkZXYtY3JvcCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1zdWJkZXYtY3JvcCc+djRsMl9zdWJkZXZfY3JvcDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1zdWJkZXYtZm9ybWF0ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXN1YmRldi1mb3JtYXQnPnY0bDJfc3ViZGV2X2Zvcm1hdDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1zdWJkZXYtbWJ1cy1jb2RlLWVudW0gInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItc3ViZGV2LW1idXMtY29kZS1lbnVtJz52NGwyX3N1YmRldl9tYnVzX2NvZGVfZW51bTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1zdGFuZGFyZCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1zdGFuZGFyZCc+djRsMl9zdGFuZGFyZDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1zdHJlYW1wYXJtICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXN0cmVhbXBhcm0nPnY0bDJfc3RyZWFtcGFybTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi10aW1lY29kZSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi10aW1lY29kZSc+djRsMl90aW1lY29kZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi10dW5lciAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi10dW5lcic+djRsMl90dW5lcjwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi12YmktZm9ybWF0ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXZiaS1mb3JtYXQnPnY0bDJfdmJpX2Zvcm1hdDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi13aW5kb3cgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItd2luZG93Jz52NGwyX3dpbmRvdzwvbGluaz4iPgotCi08IUVOVElUWSBtZWRpYS1kZXZpY2UtaW5mbyAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0nbWVkaWEtZGV2aWNlLWluZm8nPm1lZGlhX2RldmljZV9pbmZvPC9saW5rPiI+Ci08IUVOVElUWSBtZWRpYS1lbnRpdHktZGVzYyAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0nbWVkaWEtZW50aXR5LWRlc2MnPm1lZGlhX2VudGl0eV9kZXNjPC9saW5rPiI+Ci08IUVOVElUWSBtZWRpYS1saW5rcy1lbnVtICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSdtZWRpYS1saW5rcy1lbnVtJz5tZWRpYV9saW5rc19lbnVtPC9saW5rPiI+Ci08IUVOVElUWSBtZWRpYS1wYWQtZGVzYyAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0nbWVkaWEtcGFkLWRlc2MnPm1lZGlhX3BhZF9kZXNjPC9saW5rPiI+Ci08IUVOVElUWSBtZWRpYS1saW5rLWRlc2MgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J21lZGlhLWxpbmstZGVzYyc+bWVkaWFfbGlua19kZXNjPC9saW5rPiI+Ci0KLTwhLS0gRXJyb3IgQ29kZXMgLS0+Ci08IUVOVElUWSBFQUNDRVMgIjxlcnJvcmNvZGU+RUFDQ0VTPC9lcnJvcmNvZGU+IGVycm9yIGNvZGUiPgotPCFFTlRJVFkgRUFHQUlOICI8ZXJyb3Jjb2RlPkVBR0FJTjwvZXJyb3Jjb2RlPiBlcnJvciBjb2RlIj4KLTwhRU5USVRZIEVCQURGICI8ZXJyb3Jjb2RlPkVCQURGPC9lcnJvcmNvZGU+IGVycm9yIGNvZGUiPgotPCFFTlRJVFkgRUJVU1kgIjxlcnJvcmNvZGU+RUJVU1k8L2Vycm9yY29kZT4gZXJyb3IgY29kZSI+Ci08IUVOVElUWSBFRkFVTFQgIjxlcnJvcmNvZGU+RUZBVUxUPC9lcnJvcmNvZGU+IGVycm9yIGNvZGUiPgotPCFFTlRJVFkgRUlPICI8ZXJyb3Jjb2RlPkVJTzwvZXJyb3Jjb2RlPiBlcnJvciBjb2RlIj4KLTwhRU5USVRZIEVJTlRSICI8ZXJyb3Jjb2RlPkVJTlRSPC9lcnJvcmNvZGU+IGVycm9yIGNvZGUiPgotPCFFTlRJVFkgRUlOVkFMICI8ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPiBlcnJvciBjb2RlIj4KLTwhRU5USVRZIEVORklMRSAiPGVycm9yY29kZT5FTkZJTEU8L2Vycm9yY29kZT4gZXJyb3IgY29kZSI+Ci08IUVOVElUWSBFTk9NRU0gIjxlcnJvcmNvZGU+RU5PTUVNPC9lcnJvcmNvZGU+IGVycm9yIGNvZGUiPgotPCFFTlRJVFkgRU5PU1BDICI8ZXJyb3Jjb2RlPkVOT1NQQzwvZXJyb3Jjb2RlPiBlcnJvciBjb2RlIj4KLTwhRU5USVRZIEVOT1RUWSAiPGVycm9yY29kZT5FTk9UVFk8L2Vycm9yY29kZT4gZXJyb3IgY29kZSI+Ci08IUVOVElUWSBFTlhJTyAiPGVycm9yY29kZT5FTlhJTzwvZXJyb3Jjb2RlPiBlcnJvciBjb2RlIj4KLTwhRU5USVRZIEVNRklMRSAiPGVycm9yY29kZT5FTUZJTEU8L2Vycm9yY29kZT4gZXJyb3IgY29kZSI+Ci08IUVOVElUWSBFUEVSTSAiPGVycm9yY29kZT5FUEVSTTwvZXJyb3Jjb2RlPiBlcnJvciBjb2RlIj4KLTwhRU5USVRZIEVQSVBFICI8ZXJyb3Jjb2RlPkVQSVBFPC9lcnJvcmNvZGU+IGVycm9yIGNvZGUiPgotPCFFTlRJVFkgRVJBTkdFICI8ZXJyb3Jjb2RlPkVSQU5HRTwvZXJyb3Jjb2RlPiBlcnJvciBjb2RlIj4KLQotPCEtLSBTdWJzZWN0aW9ucyAtLT4KLTwhRU5USVRZIHN1Yi1iaWJsaW8gU1lTVEVNICJ2NGwvYmlibGlvLnhtbCI+Ci08IUVOVElUWSBzdWItY29tbW9uIFNZU1RFTSAidjRsL2NvbW1vbi54bWwiPgotPCFFTlRJVFkgc3ViLXBsYW5hci1hcGlzIFNZU1RFTSAidjRsL3BsYW5hci1hcGlzLnhtbCI+Ci08IUVOVElUWSBzdWItY29tcGF0IFNZU1RFTSAidjRsL2NvbXBhdC54bWwiPgotPCFFTlRJVFkgc3ViLWNvbnRyb2xzIFNZU1RFTSAidjRsL2NvbnRyb2xzLnhtbCI+Ci08IUVOVElUWSBzdWItZGV2LWNhcHR1cmUgU1lTVEVNICJ2NGwvZGV2LWNhcHR1cmUueG1sIj4KLTwhRU5USVRZIHN1Yi1kZXYtY29kZWMgU1lTVEVNICJ2NGwvZGV2LWNvZGVjLnhtbCI+Ci08IUVOVElUWSBzdWItZGV2LWV2ZW50IFNZU1RFTSAidjRsL2Rldi1ldmVudC54bWwiPgotPCFFTlRJVFkgc3ViLWRldi1lZmZlY3QgU1lTVEVNICJ2NGwvZGV2LWVmZmVjdC54bWwiPgotPCFFTlRJVFkgc3ViLWRldi1vc2QgU1lTVEVNICJ2NGwvZGV2LW9zZC54bWwiPgotPCFFTlRJVFkgc3ViLWRldi1vdXRwdXQgU1lTVEVNICJ2NGwvZGV2LW91dHB1dC54bWwiPgotPCFFTlRJVFkgc3ViLWRldi1vdmVybGF5IFNZU1RFTSAidjRsL2Rldi1vdmVybGF5LnhtbCI+Ci08IUVOVElUWSBzdWItZGV2LXJhZGlvIFNZU1RFTSAidjRsL2Rldi1yYWRpby54bWwiPgotPCFFTlRJVFkgc3ViLWRldi1yYXctdmJpIFNZU1RFTSAidjRsL2Rldi1yYXctdmJpLnhtbCI+Ci08IUVOVElUWSBzdWItZGV2LXJkcyBTWVNURU0gInY0bC9kZXYtcmRzLnhtbCI+Ci08IUVOVElUWSBzdWItZGV2LXNsaWNlZC12YmkgU1lTVEVNICJ2NGwvZGV2LXNsaWNlZC12YmkueG1sIj4KLTwhRU5USVRZIHN1Yi1kZXYtc3ViZGV2IFNZU1RFTSAidjRsL2Rldi1zdWJkZXYueG1sIj4KLTwhRU5USVRZIHN1Yi1kZXYtdGVsZXRleHQgU1lTVEVNICJ2NGwvZGV2LXRlbGV0ZXh0LnhtbCI+Ci08IUVOVElUWSBzdWItZHJpdmVyIFNZU1RFTSAidjRsL2RyaXZlci54bWwiPgotPCFFTlRJVFkgc3ViLWxpYnY0bCBTWVNURU0gInY0bC9saWJ2NGwueG1sIj4KLTwhRU5USVRZIHN1Yi1saXJjX2RldmljZV9pbnRlcmZhY2UgU1lTVEVNICJ2NGwvbGlyY19kZXZpY2VfaW50ZXJmYWNlLnhtbCI+Ci08IUVOVElUWSBzdWItcmVtb3RlX2NvbnRyb2xsZXJzIFNZU1RFTSAidjRsL3JlbW90ZV9jb250cm9sbGVycy54bWwiPgotPCFFTlRJVFkgc3ViLWZkbC1hcHBlbmRpeCBTWVNURU0gInY0bC9mZGwtYXBwZW5kaXgueG1sIj4KLTwhRU5USVRZIHN1Yi1jbG9zZSBTWVNURU0gInY0bC9mdW5jLWNsb3NlLnhtbCI+Ci08IUVOVElUWSBzdWItaW9jdGwgU1lTVEVNICJ2NGwvZnVuYy1pb2N0bC54bWwiPgotPCFFTlRJVFkgc3ViLW1tYXAgU1lTVEVNICJ2NGwvZnVuYy1tbWFwLnhtbCI+Ci08IUVOVElUWSBzdWItbXVubWFwIFNZU1RFTSAidjRsL2Z1bmMtbXVubWFwLnhtbCI+Ci08IUVOVElUWSBzdWItb3BlbiBTWVNURU0gInY0bC9mdW5jLW9wZW4ueG1sIj4KLTwhRU5USVRZIHN1Yi1wb2xsIFNZU1RFTSAidjRsL2Z1bmMtcG9sbC54bWwiPgotPCFFTlRJVFkgc3ViLXJlYWQgU1lTVEVNICJ2NGwvZnVuYy1yZWFkLnhtbCI+Ci08IUVOVElUWSBzdWItc2VsZWN0IFNZU1RFTSAidjRsL2Z1bmMtc2VsZWN0LnhtbCI+Ci08IUVOVElUWSBzdWItd3JpdGUgU1lTVEVNICJ2NGwvZnVuYy13cml0ZS54bWwiPgotPCFFTlRJVFkgc3ViLWlvIFNZU1RFTSAidjRsL2lvLnhtbCI+Ci08IUVOVElUWSBzdWItZ3JleSBTWVNURU0gInY0bC9waXhmbXQtZ3JleS54bWwiPgotPCFFTlRJVFkgc3ViLW00MjAgU1lTVEVNICJ2NGwvcGl4Zm10LW00MjAueG1sIj4KLTwhRU5USVRZIHN1Yi1udjEyIFNZU1RFTSAidjRsL3BpeGZtdC1udjEyLnhtbCI+Ci08IUVOVElUWSBzdWItbnYxMm0gU1lTVEVNICJ2NGwvcGl4Zm10LW52MTJtLnhtbCI+Ci08IUVOVElUWSBzdWItbnYxMm10IFNZU1RFTSAidjRsL3BpeGZtdC1udjEybXQueG1sIj4KLTwhRU5USVRZIHN1Yi1udjE2IFNZU1RFTSAidjRsL3BpeGZtdC1udjE2LnhtbCI+Ci08IUVOVElUWSBzdWItcGFja2VkLXJnYiBTWVNURU0gInY0bC9waXhmbXQtcGFja2VkLXJnYi54bWwiPgotPCFFTlRJVFkgc3ViLXBhY2tlZC15dXYgU1lTVEVNICJ2NGwvcGl4Zm10LXBhY2tlZC15dXYueG1sIj4KLTwhRU5USVRZIHN1Yi1zYmdncjE2IFNZU1RFTSAidjRsL3BpeGZtdC1zYmdncjE2LnhtbCI+Ci08IUVOVElUWSBzdWItc2JnZ3I4IFNZU1RFTSAidjRsL3BpeGZtdC1zYmdncjgueG1sIj4KLTwhRU5USVRZIHN1Yi1zZ2JyZzggU1lTVEVNICJ2NGwvcGl4Zm10LXNnYnJnOC54bWwiPgotPCFFTlRJVFkgc3ViLXNncmJnOCBTWVNURU0gInY0bC9waXhmbXQtc2dyYmc4LnhtbCI+Ci08IUVOVElUWSBzdWItdXl2eSBTWVNURU0gInY0bC9waXhmbXQtdXl2eS54bWwiPgotPCFFTlRJVFkgc3ViLXZ5dXkgU1lTVEVNICJ2NGwvcGl4Zm10LXZ5dXkueG1sIj4KLTwhRU5USVRZIHN1Yi15MTYgU1lTVEVNICJ2NGwvcGl4Zm10LXkxNi54bWwiPgotPCFFTlRJVFkgc3ViLXk0MXAgU1lTVEVNICJ2NGwvcGl4Zm10LXk0MXAueG1sIj4KLTwhRU5USVRZIHN1Yi15dXY0MTAgU1lTVEVNICJ2NGwvcGl4Zm10LXl1djQxMC54bWwiPgotPCFFTlRJVFkgc3ViLXl1djQxMXAgU1lTVEVNICJ2NGwvcGl4Zm10LXl1djQxMXAueG1sIj4KLTwhRU5USVRZIHN1Yi15dXY0MjAgU1lTVEVNICJ2NGwvcGl4Zm10LXl1djQyMC54bWwiPgotPCFFTlRJVFkgc3ViLXl1djQyMG0gU1lTVEVNICJ2NGwvcGl4Zm10LXl1djQyMG0ueG1sIj4KLTwhRU5USVRZIHN1Yi15dXY0MjJwIFNZU1RFTSAidjRsL3BpeGZtdC15dXY0MjJwLnhtbCI+Ci08IUVOVElUWSBzdWIteXV5diBTWVNURU0gInY0bC9waXhmbXQteXV5di54bWwiPgotPCFFTlRJVFkgc3ViLXl2eXUgU1lTVEVNICJ2NGwvcGl4Zm10LXl2eXUueG1sIj4KLTwhRU5USVRZIHN1Yi1zcmdnYjEwIFNZU1RFTSAidjRsL3BpeGZtdC1zcmdnYjEwLnhtbCI+Ci08IUVOVElUWSBzdWItc3JnZ2IxMiBTWVNURU0gInY0bC9waXhmbXQtc3JnZ2IxMi54bWwiPgotPCFFTlRJVFkgc3ViLXNyZ2diOCBTWVNURU0gInY0bC9waXhmbXQtc3JnZ2I4LnhtbCI+Ci08IUVOVElUWSBzdWIteTEwIFNZU1RFTSAidjRsL3BpeGZtdC15MTAueG1sIj4KLTwhRU5USVRZIHN1Yi15MTIgU1lTVEVNICJ2NGwvcGl4Zm10LXkxMi54bWwiPgotPCFFTlRJVFkgc3ViLXkxMGIgU1lTVEVNICJ2NGwvcGl4Zm10LXkxMGIueG1sIj4KLTwhRU5USVRZIHN1Yi1waXhmbXQgU1lTVEVNICJ2NGwvcGl4Zm10LnhtbCI+Ci08IUVOVElUWSBzdWItY3JvcGNhcCBTWVNURU0gInY0bC92aWRpb2MtY3JvcGNhcC54bWwiPgotPCFFTlRJVFkgc3ViLWRiZy1nLXJlZ2lzdGVyIFNZU1RFTSAidjRsL3ZpZGlvYy1kYmctZy1yZWdpc3Rlci54bWwiPgotPCFFTlRJVFkgc3ViLWVuY29kZXItY21kIFNZU1RFTSAidjRsL3ZpZGlvYy1lbmNvZGVyLWNtZC54bWwiPgotPCFFTlRJVFkgc3ViLWVudW0tZm10IFNZU1RFTSAidjRsL3ZpZGlvYy1lbnVtLWZtdC54bWwiPgotPCFFTlRJVFkgc3ViLWVudW0tZnJhbWVpbnRlcnZhbHMgU1lTVEVNICJ2NGwvdmlkaW9jLWVudW0tZnJhbWVpbnRlcnZhbHMueG1sIj4KLTwhRU5USVRZIHN1Yi1lbnVtLWZyYW1lc2l6ZXMgU1lTVEVNICJ2NGwvdmlkaW9jLWVudW0tZnJhbWVzaXplcy54bWwiPgotPCFFTlRJVFkgc3ViLWVudW1hdWRpbyBTWVNURU0gInY0bC92aWRpb2MtZW51bWF1ZGlvLnhtbCI+Ci08IUVOVElUWSBzdWItZW51bWF1ZGlvb3V0IFNZU1RFTSAidjRsL3ZpZGlvYy1lbnVtYXVkaW9vdXQueG1sIj4KLTwhRU5USVRZIHN1Yi1lbnVtaW5wdXQgU1lTVEVNICJ2NGwvdmlkaW9jLWVudW1pbnB1dC54bWwiPgotPCFFTlRJVFkgc3ViLWVudW1vdXRwdXQgU1lTVEVNICJ2NGwvdmlkaW9jLWVudW1vdXRwdXQueG1sIj4KLTwhRU5USVRZIHN1Yi1lbnVtLWR2LXByZXNldHMgU1lTVEVNICJ2NGwvdmlkaW9jLWVudW0tZHYtcHJlc2V0cy54bWwiPgotPCFFTlRJVFkgc3ViLWctZHYtcHJlc2V0IFNZU1RFTSAidjRsL3ZpZGlvYy1nLWR2LXByZXNldC54bWwiPgotPCFFTlRJVFkgc3ViLXF1ZXJ5LWR2LXByZXNldCBTWVNURU0gInY0bC92aWRpb2MtcXVlcnktZHYtcHJlc2V0LnhtbCI+Ci08IUVOVElUWSBzdWItZy1kdi10aW1pbmdzIFNZU1RFTSAidjRsL3ZpZGlvYy1nLWR2LXRpbWluZ3MueG1sIj4KLTwhRU5USVRZIHN1Yi1lbnVtc3RkIFNZU1RFTSAidjRsL3ZpZGlvYy1lbnVtc3RkLnhtbCI+Ci08IUVOVElUWSBzdWItZy1hdWRpbyBTWVNURU0gInY0bC92aWRpb2MtZy1hdWRpby54bWwiPgotPCFFTlRJVFkgc3ViLWctYXVkaW9vdXQgU1lTVEVNICJ2NGwvdmlkaW9jLWctYXVkaW9vdXQueG1sIj4KLTwhRU5USVRZIHN1Yi1kYmctZy1jaGlwLWlkZW50IFNZU1RFTSAidjRsL3ZpZGlvYy1kYmctZy1jaGlwLWlkZW50LnhtbCI+Ci08IUVOVElUWSBzdWItZy1jcm9wIFNZU1RFTSAidjRsL3ZpZGlvYy1nLWNyb3AueG1sIj4KLTwhRU5USVRZIHN1Yi1nLWN0cmwgU1lTVEVNICJ2NGwvdmlkaW9jLWctY3RybC54bWwiPgotPCFFTlRJVFkgc3ViLWctZW5jLWluZGV4IFNZU1RFTSAidjRsL3ZpZGlvYy1nLWVuYy1pbmRleC54bWwiPgotPCFFTlRJVFkgc3ViLWctZXh0LWN0cmxzIFNZU1RFTSAidjRsL3ZpZGlvYy1nLWV4dC1jdHJscy54bWwiPgotPCFFTlRJVFkgc3ViLWctZmJ1ZiBTWVNURU0gInY0bC92aWRpb2MtZy1mYnVmLnhtbCI+Ci08IUVOVElUWSBzdWItZy1mbXQgU1lTVEVNICJ2NGwvdmlkaW9jLWctZm10LnhtbCI+Ci08IUVOVElUWSBzdWItZy1mcmVxdWVuY3kgU1lTVEVNICJ2NGwvdmlkaW9jLWctZnJlcXVlbmN5LnhtbCI+Ci08IUVOVElUWSBzdWItZy1pbnB1dCBTWVNURU0gInY0bC92aWRpb2MtZy1pbnB1dC54bWwiPgotPCFFTlRJVFkgc3ViLWctanBlZ2NvbXAgU1lTVEVNICJ2NGwvdmlkaW9jLWctanBlZ2NvbXAueG1sIj4KLTwhRU5USVRZIHN1Yi1nLW1vZHVsYXRvciBTWVNURU0gInY0bC92aWRpb2MtZy1tb2R1bGF0b3IueG1sIj4KLTwhRU5USVRZIHN1Yi1nLW91dHB1dCBTWVNURU0gInY0bC92aWRpb2MtZy1vdXRwdXQueG1sIj4KLTwhRU5USVRZIHN1Yi1nLXBhcm0gU1lTVEVNICJ2NGwvdmlkaW9jLWctcGFybS54bWwiPgotPCFFTlRJVFkgc3ViLWctcHJpb3JpdHkgU1lTVEVNICJ2NGwvdmlkaW9jLWctcHJpb3JpdHkueG1sIj4KLTwhRU5USVRZIHN1Yi1nLXNsaWNlZC12YmktY2FwIFNZU1RFTSAidjRsL3ZpZGlvYy1nLXNsaWNlZC12YmktY2FwLnhtbCI+Ci08IUVOVElUWSBzdWItZy1zdGQgU1lTVEVNICJ2NGwvdmlkaW9jLWctc3RkLnhtbCI+Ci08IUVOVElUWSBzdWItZy10dW5lciBTWVNURU0gInY0bC92aWRpb2MtZy10dW5lci54bWwiPgotPCFFTlRJVFkgc3ViLWxvZy1zdGF0dXMgU1lTVEVNICJ2NGwvdmlkaW9jLWxvZy1zdGF0dXMueG1sIj4KLTwhRU5USVRZIHN1Yi1vdmVybGF5IFNZU1RFTSAidjRsL3ZpZGlvYy1vdmVybGF5LnhtbCI+Ci08IUVOVElUWSBzdWItcWJ1ZiBTWVNURU0gInY0bC92aWRpb2MtcWJ1Zi54bWwiPgotPCFFTlRJVFkgc3ViLXF1ZXJ5YnVmIFNZU1RFTSAidjRsL3ZpZGlvYy1xdWVyeWJ1Zi54bWwiPgotPCFFTlRJVFkgc3ViLXF1ZXJ5Y2FwIFNZU1RFTSAidjRsL3ZpZGlvYy1xdWVyeWNhcC54bWwiPgotPCFFTlRJVFkgc3ViLXF1ZXJ5Y3RybCBTWVNURU0gInY0bC92aWRpb2MtcXVlcnljdHJsLnhtbCI+Ci08IUVOVElUWSBzdWItcXVlcnlzdGQgU1lTVEVNICJ2NGwvdmlkaW9jLXF1ZXJ5c3RkLnhtbCI+Ci08IUVOVElUWSBzdWItcmVxYnVmcyBTWVNURU0gInY0bC92aWRpb2MtcmVxYnVmcy54bWwiPgotPCFFTlRJVFkgc3ViLXMtaHctZnJlcS1zZWVrIFNZU1RFTSAidjRsL3ZpZGlvYy1zLWh3LWZyZXEtc2Vlay54bWwiPgotPCFFTlRJVFkgc3ViLXN0cmVhbW9uIFNZU1RFTSAidjRsL3ZpZGlvYy1zdHJlYW1vbi54bWwiPgotPCFFTlRJVFkgc3ViLXN1YmRldi1lbnVtLWZyYW1lLWludGVydmFsIFNZU1RFTSAidjRsL3ZpZGlvYy1zdWJkZXYtZW51bS1mcmFtZS1pbnRlcnZhbC54bWwiPgotPCFFTlRJVFkgc3ViLXN1YmRldi1lbnVtLWZyYW1lLXNpemUgU1lTVEVNICJ2NGwvdmlkaW9jLXN1YmRldi1lbnVtLWZyYW1lLXNpemUueG1sIj4KLTwhRU5USVRZIHN1Yi1zdWJkZXYtZW51bS1tYnVzLWNvZGUgU1lTVEVNICJ2NGwvdmlkaW9jLXN1YmRldi1lbnVtLW1idXMtY29kZS54bWwiPgotPCFFTlRJVFkgc3ViLXN1YmRldi1mb3JtYXRzIFNZU1RFTSAidjRsL3N1YmRldi1mb3JtYXRzLnhtbCI+Ci08IUVOVElUWSBzdWItc3ViZGV2LWctY3JvcCBTWVNURU0gInY0bC92aWRpb2Mtc3ViZGV2LWctY3JvcC54bWwiPgotPCFFTlRJVFkgc3ViLXN1YmRldi1nLWZtdCBTWVNURU0gInY0bC92aWRpb2Mtc3ViZGV2LWctZm10LnhtbCI+Ci08IUVOVElUWSBzdWItc3ViZGV2LWctZnJhbWUtaW50ZXJ2YWwgU1lTVEVNICJ2NGwvdmlkaW9jLXN1YmRldi1nLWZyYW1lLWludGVydmFsLnhtbCI+Ci08IUVOVElUWSBzdWItY2FwdHVyZS1jIFNZU1RFTSAidjRsL2NhcHR1cmUuYy54bWwiPgotPCFFTlRJVFkgc3ViLWtleXRhYmxlLWMgU1lTVEVNICJ2NGwva2V5dGFibGUuYy54bWwiPgotPCFFTlRJVFkgc3ViLXY0bDJncmFiLWMgU1lTVEVNICJ2NGwvdjRsMmdyYWIuYy54bWwiPgotPCFFTlRJVFkgc3ViLXZpZGVvZGV2Mi1oIFNZU1RFTSAidjRsL3ZpZGVvZGV2Mi5oLnhtbCI+Ci08IUVOVElUWSBzdWItdjRsMiBTWVNURU0gInY0bC92NGwyLnhtbCI+Ci08IUVOVElUWSBzdWItZHFldmVudCBTWVNURU0gInY0bC92aWRpb2MtZHFldmVudC54bWwiPgotPCFFTlRJVFkgc3ViLXN1YnNjcmliZS1ldmVudCBTWVNURU0gInY0bC92aWRpb2Mtc3Vic2NyaWJlLWV2ZW50LnhtbCI+Ci08IUVOVElUWSBzdWItaW50cm8gU1lTVEVNICJkdmIvaW50cm8ueG1sIj4KLTwhRU5USVRZIHN1Yi1mcm9udGVuZCBTWVNURU0gImR2Yi9mcm9udGVuZC54bWwiPgotPCFFTlRJVFkgc3ViLWR2YnByb3BlcnR5IFNZU1RFTSAiZHZiL2R2YnByb3BlcnR5LnhtbCI+Ci08IUVOVElUWSBzdWItZGVtdXggU1lTVEVNICJkdmIvZGVtdXgueG1sIj4KLTwhRU5USVRZIHN1Yi12aWRlbyBTWVNURU0gImR2Yi92aWRlby54bWwiPgotPCFFTlRJVFkgc3ViLWF1ZGlvIFNZU1RFTSAiZHZiL2F1ZGlvLnhtbCI+Ci08IUVOVElUWSBzdWItY2EgU1lTVEVNICJkdmIvY2EueG1sIj4KLTwhRU5USVRZIHN1Yi1uZXQgU1lTVEVNICJkdmIvbmV0LnhtbCI+Ci08IUVOVElUWSBzdWIta2RhcGkgU1lTVEVNICJkdmIva2RhcGkueG1sIj4KLTwhRU5USVRZIHN1Yi1leGFtcGxlcyBTWVNURU0gImR2Yi9leGFtcGxlcy54bWwiPgotPCFFTlRJVFkgc3ViLWZyb250ZW5kLWggU1lTVEVNICJkdmIvZnJvbnRlbmQuaC54bWwiPgotPCFFTlRJVFkgc3ViLWR2YmFwaSBTWVNURU0gImR2Yi9kdmJhcGkueG1sIj4KLTwhRU5USVRZIHN1Yi1tZWRpYSBTWVNURU0gIm1lZGlhLnhtbCI+Ci08IUVOVElUWSBzdWItbWVkaWEtZW50aXRpZXMgU1lTVEVNICJtZWRpYS1lbnRpdGllcy50bXBsIj4KLTwhRU5USVRZIHN1Yi1tZWRpYS1pbmRpY2VzIFNZU1RFTSAibWVkaWEtaW5kaWNlcy50bXBsIj4KLQotPCFFTlRJVFkgc3ViLW1lZGlhLWNvbnRyb2xsZXIgU1lTVEVNICJ2NGwvbWVkaWEtY29udHJvbGxlci54bWwiPgotPCFFTlRJVFkgc3ViLW1lZGlhLWZ1bmMtb3BlbiBTWVNURU0gInY0bC9tZWRpYS1mdW5jLW9wZW4ueG1sIj4KLTwhRU5USVRZIHN1Yi1tZWRpYS1mdW5jLWNsb3NlIFNZU1RFTSAidjRsL21lZGlhLWZ1bmMtY2xvc2UueG1sIj4KLTwhRU5USVRZIHN1Yi1tZWRpYS1mdW5jLWlvY3RsIFNZU1RFTSAidjRsL21lZGlhLWZ1bmMtaW9jdGwueG1sIj4KLTwhRU5USVRZIHN1Yi1tZWRpYS1pb2MtZGV2aWNlLWluZm8gU1lTVEVNICJ2NGwvbWVkaWEtaW9jLWRldmljZS1pbmZvLnhtbCI+Ci08IUVOVElUWSBzdWItbWVkaWEtaW9jLWVudW0tZW50aXRpZXMgU1lTVEVNICJ2NGwvbWVkaWEtaW9jLWVudW0tZW50aXRpZXMueG1sIj4KLTwhRU5USVRZIHN1Yi1tZWRpYS1pb2MtZW51bS1saW5rcyBTWVNURU0gInY0bC9tZWRpYS1pb2MtZW51bS1saW5rcy54bWwiPgotPCFFTlRJVFkgc3ViLW1lZGlhLWlvYy1zZXR1cC1saW5rIFNZU1RFTSAidjRsL21lZGlhLWlvYy1zZXR1cC1saW5rLnhtbCI+Ci0KLTwhLS0gRnVuY3Rpb24gUmVmZXJlbmNlIC0tPgotPCFFTlRJVFkgY2xvc2UgU1lTVEVNICJ2NGwvZnVuYy1jbG9zZS54bWwiPgotPCFFTlRJVFkgaW9jdGwgU1lTVEVNICJ2NGwvZnVuYy1pb2N0bC54bWwiPgotPCFFTlRJVFkgbW1hcCBTWVNURU0gInY0bC9mdW5jLW1tYXAueG1sIj4KLTwhRU5USVRZIG11bm1hcCBTWVNURU0gInY0bC9mdW5jLW11bm1hcC54bWwiPgotPCFFTlRJVFkgb3BlbiBTWVNURU0gInY0bC9mdW5jLW9wZW4ueG1sIj4KLTwhRU5USVRZIHBvbGwgU1lTVEVNICJ2NGwvZnVuYy1wb2xsLnhtbCI+Ci08IUVOVElUWSByZWFkIFNZU1RFTSAidjRsL2Z1bmMtcmVhZC54bWwiPgotPCFFTlRJVFkgc2VsZWN0IFNZU1RFTSAidjRsL2Z1bmMtc2VsZWN0LnhtbCI+Ci08IUVOVElUWSB3cml0ZSBTWVNURU0gInY0bC9mdW5jLXdyaXRlLnhtbCI+Ci08IUVOVElUWSBncmV5IFNZU1RFTSAidjRsL3BpeGZtdC1ncmV5LnhtbCI+Ci08IUVOVElUWSBudjEyIFNZU1RFTSAidjRsL3BpeGZtdC1udjEyLnhtbCI+Ci08IUVOVElUWSBudjEybSBTWVNURU0gInY0bC9waXhmbXQtbnYxMm0ueG1sIj4KLTwhRU5USVRZIG52MTYgU1lTVEVNICJ2NGwvcGl4Zm10LW52MTYueG1sIj4KLTwhRU5USVRZIHBhY2tlZC1yZ2IgU1lTVEVNICJ2NGwvcGl4Zm10LXBhY2tlZC1yZ2IueG1sIj4KLTwhRU5USVRZIHBhY2tlZC15dXYgU1lTVEVNICJ2NGwvcGl4Zm10LXBhY2tlZC15dXYueG1sIj4KLTwhRU5USVRZIHNiZ2dyMTYgU1lTVEVNICJ2NGwvcGl4Zm10LXNiZ2dyMTYueG1sIj4KLTwhRU5USVRZIHNiZ2dyOCBTWVNURU0gInY0bC9waXhmbXQtc2JnZ3I4LnhtbCI+Ci08IUVOVElUWSBzZ2JyZzggU1lTVEVNICJ2NGwvcGl4Zm10LXNnYnJnOC54bWwiPgotPCFFTlRJVFkgc2dyYmc4IFNZU1RFTSAidjRsL3BpeGZtdC1zZ3JiZzgueG1sIj4KLTwhRU5USVRZIHV5dnkgU1lTVEVNICJ2NGwvcGl4Zm10LXV5dnkueG1sIj4KLTwhRU5USVRZIHZ5dXkgU1lTVEVNICJ2NGwvcGl4Zm10LXZ5dXkueG1sIj4KLTwhRU5USVRZIHkxNiBTWVNURU0gInY0bC9waXhmbXQteTE2LnhtbCI+Ci08IUVOVElUWSB5NDFwIFNZU1RFTSAidjRsL3BpeGZtdC15NDFwLnhtbCI+Ci08IUVOVElUWSB5dXY0MTAgU1lTVEVNICJ2NGwvcGl4Zm10LXl1djQxMC54bWwiPgotPCFFTlRJVFkgeXV2NDExcCBTWVNURU0gInY0bC9waXhmbXQteXV2NDExcC54bWwiPgotPCFFTlRJVFkgeXV2NDIwIFNZU1RFTSAidjRsL3BpeGZtdC15dXY0MjAueG1sIj4KLTwhRU5USVRZIHl1djQyMG0gU1lTVEVNICJ2NGwvcGl4Zm10LXl1djQyMG0ueG1sIj4KLTwhRU5USVRZIHl1djQyMnAgU1lTVEVNICJ2NGwvcGl4Zm10LXl1djQyMnAueG1sIj4KLTwhRU5USVRZIHl1eXYgU1lTVEVNICJ2NGwvcGl4Zm10LXl1eXYueG1sIj4KLTwhRU5USVRZIHl2eXUgU1lTVEVNICJ2NGwvcGl4Zm10LXl2eXUueG1sIj4KLTwhRU5USVRZIHNyZ2diMTAgU1lTVEVNICJ2NGwvcGl4Zm10LXNyZ2diMTAueG1sIj4KLTwhRU5USVRZIHNyZ2diOCBTWVNURU0gInY0bC9waXhmbXQtc3JnZ2I4LnhtbCI+Ci08IUVOVElUWSB5MTAgU1lTVEVNICJ2NGwvcGl4Zm10LXkxMC54bWwiPgotPCFFTlRJVFkgY3JvcGNhcCBTWVNURU0gInY0bC92aWRpb2MtY3JvcGNhcC54bWwiPgotPCFFTlRJVFkgZGJnLWctcmVnaXN0ZXIgU1lTVEVNICJ2NGwvdmlkaW9jLWRiZy1nLXJlZ2lzdGVyLnhtbCI+Ci08IUVOVElUWSBlbmNvZGVyLWNtZCBTWVNURU0gInY0bC92aWRpb2MtZW5jb2Rlci1jbWQueG1sIj4KLTwhRU5USVRZIGVudW0tZm10IFNZU1RFTSAidjRsL3ZpZGlvYy1lbnVtLWZtdC54bWwiPgotPCFFTlRJVFkgZW51bS1mcmFtZWludGVydmFscyBTWVNURU0gInY0bC92aWRpb2MtZW51bS1mcmFtZWludGVydmFscy54bWwiPgotPCFFTlRJVFkgZW51bS1mcmFtZXNpemVzIFNZU1RFTSAidjRsL3ZpZGlvYy1lbnVtLWZyYW1lc2l6ZXMueG1sIj4KLTwhRU5USVRZIGVudW1hdWRpbyBTWVNURU0gInY0bC92aWRpb2MtZW51bWF1ZGlvLnhtbCI+Ci08IUVOVElUWSBlbnVtYXVkaW9vdXQgU1lTVEVNICJ2NGwvdmlkaW9jLWVudW1hdWRpb291dC54bWwiPgotPCFFTlRJVFkgZW51bWlucHV0IFNZU1RFTSAidjRsL3ZpZGlvYy1lbnVtaW5wdXQueG1sIj4KLTwhRU5USVRZIGVudW1vdXRwdXQgU1lTVEVNICJ2NGwvdmlkaW9jLWVudW1vdXRwdXQueG1sIj4KLTwhRU5USVRZIGVudW0tZHYtcHJlc2V0cyBTWVNURU0gInY0bC92aWRpb2MtZW51bS1kdi1wcmVzZXRzLnhtbCI+Ci08IUVOVElUWSBnLWR2LXByZXNldCBTWVNURU0gInY0bC92aWRpb2MtZy1kdi1wcmVzZXQueG1sIj4KLTwhRU5USVRZIHF1ZXJ5LWR2LXByZXNldCBTWVNURU0gInY0bC92aWRpb2MtcXVlcnktZHYtcHJlc2V0LnhtbCI+Ci08IUVOVElUWSBnLWR2LXRpbWluZ3MgU1lTVEVNICJ2NGwvdmlkaW9jLWctZHYtdGltaW5ncy54bWwiPgotPCFFTlRJVFkgZW51bXN0ZCBTWVNURU0gInY0bC92aWRpb2MtZW51bXN0ZC54bWwiPgotPCFFTlRJVFkgZy1hdWRpbyBTWVNURU0gInY0bC92aWRpb2MtZy1hdWRpby54bWwiPgotPCFFTlRJVFkgZy1hdWRpb291dCBTWVNURU0gInY0bC92aWRpb2MtZy1hdWRpb291dC54bWwiPgotPCFFTlRJVFkgZGJnLWctY2hpcC1pZGVudCBTWVNURU0gInY0bC92aWRpb2MtZGJnLWctY2hpcC1pZGVudC54bWwiPgotPCFFTlRJVFkgZy1jcm9wIFNZU1RFTSAidjRsL3ZpZGlvYy1nLWNyb3AueG1sIj4KLTwhRU5USVRZIGctY3RybCBTWVNURU0gInY0bC92aWRpb2MtZy1jdHJsLnhtbCI+Ci08IUVOVElUWSBnLWVuYy1pbmRleCBTWVNURU0gInY0bC92aWRpb2MtZy1lbmMtaW5kZXgueG1sIj4KLTwhRU5USVRZIGctZXh0LWN0cmxzIFNZU1RFTSAidjRsL3ZpZGlvYy1nLWV4dC1jdHJscy54bWwiPgotPCFFTlRJVFkgZy1mYnVmIFNZU1RFTSAidjRsL3ZpZGlvYy1nLWZidWYueG1sIj4KLTwhRU5USVRZIGctZm10IFNZU1RFTSAidjRsL3ZpZGlvYy1nLWZtdC54bWwiPgotPCFFTlRJVFkgZy1mcmVxdWVuY3kgU1lTVEVNICJ2NGwvdmlkaW9jLWctZnJlcXVlbmN5LnhtbCI+Ci08IUVOVElUWSBnLWlucHV0IFNZU1RFTSAidjRsL3ZpZGlvYy1nLWlucHV0LnhtbCI+Ci08IUVOVElUWSBnLWpwZWdjb21wIFNZU1RFTSAidjRsL3ZpZGlvYy1nLWpwZWdjb21wLnhtbCI+Ci08IUVOVElUWSBnLW1vZHVsYXRvciBTWVNURU0gInY0bC92aWRpb2MtZy1tb2R1bGF0b3IueG1sIj4KLTwhRU5USVRZIGctb3V0cHV0IFNZU1RFTSAidjRsL3ZpZGlvYy1nLW91dHB1dC54bWwiPgotPCFFTlRJVFkgZy1wYXJtIFNZU1RFTSAidjRsL3ZpZGlvYy1nLXBhcm0ueG1sIj4KLTwhRU5USVRZIGctcHJpb3JpdHkgU1lTVEVNICJ2NGwvdmlkaW9jLWctcHJpb3JpdHkueG1sIj4KLTwhRU5USVRZIGctc2xpY2VkLXZiaS1jYXAgU1lTVEVNICJ2NGwvdmlkaW9jLWctc2xpY2VkLXZiaS1jYXAueG1sIj4KLTwhRU5USVRZIGctc3RkIFNZU1RFTSAidjRsL3ZpZGlvYy1nLXN0ZC54bWwiPgotPCFFTlRJVFkgZy10dW5lciBTWVNURU0gInY0bC92aWRpb2MtZy10dW5lci54bWwiPgotPCFFTlRJVFkgbG9nLXN0YXR1cyBTWVNURU0gInY0bC92aWRpb2MtbG9nLXN0YXR1cy54bWwiPgotPCFFTlRJVFkgb3ZlcmxheSBTWVNURU0gInY0bC92aWRpb2Mtb3ZlcmxheS54bWwiPgotPCFFTlRJVFkgcWJ1ZiBTWVNURU0gInY0bC92aWRpb2MtcWJ1Zi54bWwiPgotPCFFTlRJVFkgcXVlcnlidWYgU1lTVEVNICJ2NGwvdmlkaW9jLXF1ZXJ5YnVmLnhtbCI+Ci08IUVOVElUWSBxdWVyeWNhcCBTWVNURU0gInY0bC92aWRpb2MtcXVlcnljYXAueG1sIj4KLTwhRU5USVRZIHF1ZXJ5Y3RybCBTWVNURU0gInY0bC92aWRpb2MtcXVlcnljdHJsLnhtbCI+Ci08IUVOVElUWSBxdWVyeXN0ZCBTWVNURU0gInY0bC92aWRpb2MtcXVlcnlzdGQueG1sIj4KLTwhRU5USVRZIHJlcWJ1ZnMgU1lTVEVNICJ2NGwvdmlkaW9jLXJlcWJ1ZnMueG1sIj4KLTwhRU5USVRZIHMtaHctZnJlcS1zZWVrIFNZU1RFTSAidjRsL3ZpZGlvYy1zLWh3LWZyZXEtc2Vlay54bWwiPgotPCFFTlRJVFkgc3RyZWFtb24gU1lTVEVNICJ2NGwvdmlkaW9jLXN0cmVhbW9uLnhtbCI+Ci08IUVOVElUWSBkcWV2ZW50IFNZU1RFTSAidjRsL3ZpZGlvYy1kcWV2ZW50LnhtbCI+Ci08IUVOVElUWSBzdWJzY3JpYmVfZXZlbnQgU1lTVEVNICJ2NGwvdmlkaW9jLXN1YnNjcmliZS1ldmVudC54bWwiPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhLWluZGljZXMudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS1pbmRpY2VzLnRtcGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZDYwMzEuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhLWluZGljZXMudG1wbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTwhLS0gR2VuZXJhdGVkIGZpbGUhIERvIG5vdCBlZGl0LiAtLT4KLQotPGluZGV4Pjx0aXRsZT5MaXN0IG9mIFR5cGVzPC90aXRsZT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+PGxpbmsgbGlua2VuZD0ndjRsMi1zdGQtaWQnPnY0bDJfc3RkX2lkPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItYnVmLXR5cGUnPnY0bDJfYnVmX3R5cGU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1jb2xvcnNwYWNlJz52NGwyX2NvbG9yc3BhY2U8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1jdHJsLXR5cGUnPnY0bDJfY3RybF90eXBlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZXhwb3N1cmUtYXV0by10eXBlJz52NGwyX2V4cG9zdXJlX2F1dG9fdHlwZTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZpZWxkJz52NGwyX2ZpZWxkPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZnJtaXZhbHR5cGVzJz52NGwyX2ZybWl2YWx0eXBlczwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZybXNpemV0eXBlcyc+djRsMl9mcm1zaXpldHlwZXM8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tZW1vcnknPnY0bDJfbWVtb3J5PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1hYzMtYml0cmF0ZSc+djRsMl9tcGVnX2F1ZGlvX2FjM19iaXRyYXRlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1jcmMnPnY0bDJfbXBlZ19hdWRpb19jcmM8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWF1ZGlvLWVtcGhhc2lzJz52NGwyX21wZWdfYXVkaW9fZW1waGFzaXM8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWF1ZGlvLWVuY29kaW5nJz52NGwyX21wZWdfYXVkaW9fZW5jb2Rpbmc8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWF1ZGlvLWwxLWJpdHJhdGUnPnY0bDJfbXBlZ19hdWRpb19sMV9iaXRyYXRlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1sMi1iaXRyYXRlJz52NGwyX21wZWdfYXVkaW9fbDJfYml0cmF0ZTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctYXVkaW8tbDMtYml0cmF0ZSc+djRsMl9tcGVnX2F1ZGlvX2wzX2JpdHJhdGU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWF1ZGlvLW1vZGUnPnY0bDJfbXBlZ19hdWRpb19tb2RlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1tb2RlLWV4dGVuc2lvbic+djRsMl9tcGVnX2F1ZGlvX21vZGVfZXh0ZW5zaW9uPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1zYW1wbGluZy1mcmVxJz52NGwyX21wZWdfYXVkaW9fc2FtcGxpbmdfZnJlcTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSdjaHJvbWEtc3BhdGlhbC1maWx0ZXItdHlwZSc+djRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fY2hyb21hX3NwYXRpYWxfZmlsdGVyX3R5cGU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0nbHVtYS1zcGF0aWFsLWZpbHRlci10eXBlJz52NGwyX21wZWdfY3gyMzQxeF92aWRlb19sdW1hX3NwYXRpYWxfZmlsdGVyX3R5cGU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWN4MjM0MXgtdmlkZW8tbWVkaWFuLWZpbHRlci10eXBlJz52NGwyX21wZWdfY3gyMzQxeF92aWRlb19tZWRpYW5fZmlsdGVyX3R5cGU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWN4MjM0MXgtdmlkZW8tc3BhdGlhbC1maWx0ZXItbW9kZSc+djRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fc3BhdGlhbF9maWx0ZXJfbW9kZTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctY3gyMzQxeC12aWRlby10ZW1wb3JhbC1maWx0ZXItbW9kZSc+djRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fdGVtcG9yYWxfZmlsdGVyX21vZGU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLXN0cmVhbS10eXBlJz52NGwyX21wZWdfc3RyZWFtX3R5cGU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLXN0cmVhbS12YmktZm10Jz52NGwyX21wZWdfc3RyZWFtX3ZiaV9mbXQ8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLXZpZGVvLWFzcGVjdCc+djRsMl9tcGVnX3ZpZGVvX2FzcGVjdDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctdmlkZW8tYml0cmF0ZS1tb2RlJz52NGwyX21wZWdfdmlkZW9fYml0cmF0ZV9tb2RlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy12aWRlby1lbmNvZGluZyc+djRsMl9tcGVnX3ZpZGVvX2VuY29kaW5nPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItcG93ZXItbGluZS1mcmVxdWVuY3knPnY0bDJfcG93ZXJfbGluZV9mcmVxdWVuY3k8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1wcmlvcml0eSc+djRsMl9wcmlvcml0eTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXR1bmVyLXR5cGUnPnY0bDJfdHVuZXJfdHlwZTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXByZWVtcGhhc2lzJz52NGwyX3ByZWVtcGhhc2lzPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1hdWRpbyc+djRsMl9hdWRpbzwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItYXVkaW9vdXQnPnY0bDJfYXVkaW9vdXQ8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWJ0LXRpbWluZ3MnPnY0bDJfYnRfdGltaW5nczwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItYnVmZmVyJz52NGwyX2J1ZmZlcjwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItY2FwYWJpbGl0eSc+djRsMl9jYXBhYmlsaXR5PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1jYXB0dXJlcGFybSc+djRsMl9jYXB0dXJlcGFybTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItY2xpcCc+djRsMl9jbGlwPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1jb250cm9sJz52NGwyX2NvbnRyb2w8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWNyb3AnPnY0bDJfY3JvcDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItY3JvcGNhcCc+djRsMl9jcm9wY2FwPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1kYmctY2hpcC1pZGVudCc+djRsMl9kYmdfY2hpcF9pZGVudDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZGJnLW1hdGNoJz52NGwyX2RiZ19tYXRjaDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZGJnLXJlZ2lzdGVyJz52NGwyX2RiZ19yZWdpc3RlcjwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZHYtZW51bS1wcmVzZXQnPnY0bDJfZHZfZW51bV9wcmVzZXQ8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWR2LXByZXNldCc+djRsMl9kdl9wcmVzZXQ8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWR2LXRpbWluZ3MnPnY0bDJfZHZfdGltaW5nczwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZW5jLWlkeCc+djRsMl9lbmNfaWR4PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1lbmMtaWR4LWVudHJ5Jz52NGwyX2VuY19pZHhfZW50cnk8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWVuY29kZXItY21kJz52NGwyX2VuY29kZXJfY21kPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1leHQtY29udHJvbCc+djRsMl9leHRfY29udHJvbDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZXh0LWNvbnRyb2xzJz52NGwyX2V4dF9jb250cm9sczwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZm10ZGVzYyc+djRsMl9mbXRkZXNjPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mb3JtYXQnPnY0bDJfZm9ybWF0PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcmFjdCc+djRsMl9mcmFjdDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZnJhbWVidWZmZXInPnY0bDJfZnJhbWVidWZmZXI8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZyZXF1ZW5jeSc+djRsMl9mcmVxdWVuY3k8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZybWl2YWwtc3RlcHdpc2UnPnY0bDJfZnJtaXZhbF9zdGVwd2lzZTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZnJtaXZhbGVudW0nPnY0bDJfZnJtaXZhbGVudW08L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZybXNpemUtZGlzY3JldGUnPnY0bDJfZnJtc2l6ZV9kaXNjcmV0ZTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZnJtc2l6ZS1zdGVwd2lzZSc+djRsMl9mcm1zaXplX3N0ZXB3aXNlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcm1zaXplZW51bSc+djRsMl9mcm1zaXplZW51bTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItaHctZnJlcS1zZWVrJz52NGwyX2h3X2ZyZXFfc2VlazwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItaW5wdXQnPnY0bDJfaW5wdXQ8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWpwZWdjb21wcmVzc2lvbic+djRsMl9qcGVnY29tcHJlc3Npb248L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1vZHVsYXRvcic+djRsMl9tb2R1bGF0b3I8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctdmJpLWZtdC1pdnR2Jz52NGwyX21wZWdfdmJpX2ZtdF9pdnR2PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1vdXRwdXQnPnY0bDJfb3V0cHV0PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1vdXRwdXRwYXJtJz52NGwyX291dHB1dHBhcm08L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXBpeC1mb3JtYXQnPnY0bDJfcGl4X2Zvcm1hdDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItcXVlcnljdHJsJz52NGwyX3F1ZXJ5Y3RybDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItcXVlcnltZW51Jz52NGwyX3F1ZXJ5bWVudTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItcmVjdCc+djRsMl9yZWN0PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1yZXF1ZXN0YnVmZmVycyc+djRsMl9yZXF1ZXN0YnVmZmVyczwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItc2xpY2VkLXZiaS1jYXAnPnY0bDJfc2xpY2VkX3ZiaV9jYXA8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXNsaWNlZC12YmktZGF0YSc+djRsMl9zbGljZWRfdmJpX2RhdGE8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXNsaWNlZC12YmktZm9ybWF0Jz52NGwyX3NsaWNlZF92YmlfZm9ybWF0PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1zdGFuZGFyZCc+djRsMl9zdGFuZGFyZDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItc3RyZWFtcGFybSc+djRsMl9zdHJlYW1wYXJtPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi10aW1lY29kZSc+djRsMl90aW1lY29kZTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItdHVuZXInPnY0bDJfdHVuZXI8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXZiaS1mb3JtYXQnPnY0bDJfdmJpX2Zvcm1hdDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItd2luZG93Jz52NGwyX3dpbmRvdzwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08L2luZGV4PgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL01ha2VmaWxlIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MjhiNGIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvTWFrZWZpbGUKQEAgLTAsMCArMSwzODYgQEAKKyMjIworIyBNZWRpYSBidWlsZCBydWxlcyAtIEF1dG8tZ2VuZXJhdGVzIG1lZGlhIGNvbnRlbnRzL2luZGV4ZXMgYW5kICouaCB4bWwncworIworCitTSEVMTD0vYmluL2Jhc2gKKworTUVESUFfT0JKX0RJUj0kKG9ianRyZWUpL0RvY3VtZW50YXRpb24vRG9jQm9vay8KK01FRElBX1NSQ19ESVI9JChzcmN0cmVlKS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEKKworTUVESUFfVEVNUCA9ICBtZWRpYS1lbnRpdGllcy50bXBsIFwKKwkgICAgICBtZWRpYS1pbmRpY2VzLnRtcGwgXAorCSAgICAgIHZpZGVvZGV2Mi5oLnhtbCBcCisJICAgICAgdjRsMi54bWwgXAorCSAgICAgIGF1ZGlvLmgueG1sIFwKKwkgICAgICBjYS5oLnhtbCBcCisJICAgICAgZG14LmgueG1sIFwKKwkgICAgICBmcm9udGVuZC5oLnhtbCBcCisJICAgICAgbmV0LmgueG1sIFwKKwkgICAgICB2aWRlby5oLnhtbCBcCisKK0lNR0ZJTEVTIDo9ICQocGF0c3Vic3QgJS5iNjQsJSwgJChub3RkaXIgJChzaGVsbCBscyAkKE1FRElBX1NSQ19ESVIpLyouYjY0KSkpCitPQkpJTUdGSUxFUyA6PSAkKGFkZHByZWZpeCAkKE1FRElBX09CSl9ESVIpLywgJChJTUdGSUxFUykpCitHRU5GSUxFUyA6PSAkKGFkZHByZWZpeCAkKE1FRElBX09CSl9ESVIpLywgJChNRURJQV9URU1QKSkKKworUEhPTlkgKz0gY2xlYW5tZWRpYWRvY3MKKworY2xlYW5tZWRpYWRvY3M6CisJLUBybSBgZmluZCAkKE1FRElBX09CSl9ESVIpIC10eXBlIGxgICQoR0VORklMRVMpICQoT0JKSU1HRklMRVMpIDI+L2Rldi9udWxsCisKKyQob2JqKS9tZWRpYV9hcGkueG1sOiAkKEdFTkZJTEVTKSBGT1JDRQorCisjJChNRURJQV9PQkpfRElSKS9tZWRpYV9hcGkuaHRtbDogJChNRURJQV9PQkpfRElSKS9tZWRpYV9hcGkueG1sCisjJChNRURJQV9PQkpfRElSKS9tZWRpYV9hcGkucGRmOiAkKE1FRElBX09CSl9ESVIpL21lZGlhX2FwaS54bWwKKyMkKE1FRElBX09CSl9ESVIpL21lZGlhX2FwaS5wczogJChNRURJQV9PQkpfRElSKS9tZWRpYV9hcGkueG1sCisKK1Y0TF9TR01MUyA9IFwKKwkkKHNoZWxsIGxzICQoTUVESUFfU1JDX0RJUikvdjRsLyoueG1sfHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgKG0sLiovKC4qKVxuLCknKSBcCisJY2FwdHVyZS5jLnhtbCBcCisJa2V5dGFibGUuYy54bWwgXAorCXY0bDJncmFiLmMueG1sCisKK0RWQl9TR01MUyA9IFwKKwkkKHNoZWxsIGxzICQoTUVESUFfU1JDX0RJUikvZHZiLyoueG1sfHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgKG0sLiovKC4qKVxuLCknKQorCitNRURJQV9TR01MUyA9ICAkKGFkZHByZWZpeCAuLywkKFY0TF9TR01MUykpICQoYWRkcHJlZml4IC4vLCQoRFZCX1NHTUxTKSkgJChhZGRwcmVmaXggLi8sJChNRURJQV9URU1QKSkKKworRlVOQ1MgPSBcCisJY2xvc2UgXAorCWlvY3RsIFwKKwltbWFwIFwKKwltdW5tYXAgXAorCW9wZW4gXAorCXBvbGwgXAorCXJlYWQgXAorCXNlbGVjdCBcCisJd3JpdGUgXAorCitJT0NUTFMgPSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIC9cI2RlZmluZVxzKyhbXlxzXSspXHMrX0lPLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIC9cI2RlZmluZVxzKyhbXlxzXSspXHMrX0lPLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9hdWRpby5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIC9cI2RlZmluZVxzKyhbXlxzXSspXHMrX0lPLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9jYS5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIC9cI2RlZmluZVxzKyhbXlxzXSspXHMrX0lPLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9kbXguaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXCNkZWZpbmVccysoW15cc10rKVxzK19JTy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvZnJvbnRlbmQuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXCNkZWZpbmVccysoW0EtWl1bXlxzXSspXHMrX0lPLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9uZXQuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXCNkZWZpbmVccysoW15cc10rKVxzK19JTy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvdmlkZW8uaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXCNkZWZpbmVccysoW15cc10rKVxzK19JTy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9tZWRpYS5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIC9cI2RlZmluZVxzKyhbXlxzXSspXHMrX0lPLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L3Y0bDItc3ViZGV2LmgpIFwKKwlWSURJT0NfU1VCREVWX0dfRlJBTUVfSU5URVJWQUwgXAorCVZJRElPQ19TVUJERVZfU19GUkFNRV9JTlRFUlZBTCBcCisJVklESU9DX1NVQkRFVl9FTlVNX01CVVNfQ09ERSBcCisJVklESU9DX1NVQkRFVl9FTlVNX0ZSQU1FX1NJWkUgXAorCVZJRElPQ19TVUJERVZfRU5VTV9GUkFNRV9JTlRFUlZBTCBcCisKK1RZUEVTID0gXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXnR5cGVkZWZccytbXlxzXStccysoW15cc10rKVw7LycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIC9efVxzKyhbYS16MC05X10rX3QpLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9mcm9udGVuZC5oKQorCitFTlVNUyA9IFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL15lbnVtXHMrKFteXHNdKylccysvJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL15lbnVtXHMrKFteXHNdKylccysvJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL2F1ZGlvLmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL15lbnVtXHMrKFteXHNdKylccysvJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL2NhLmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL15lbnVtXHMrKFteXHNdKylccysvJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL2RteC5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIC9eZW51bVxzKyhbXlxzXSspXHMrLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9mcm9udGVuZC5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIC9eZW51bVxzKyhbXlxzXSspXHMrLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9uZXQuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXmVudW1ccysoW15cc10rKVxzKy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvdmlkZW8uaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXmVudW1ccysoW15cc10rKVxzKy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9tZWRpYS5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIC9eZW51bVxzKyhbXlxzXSspXHMrLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L3Y0bDItbWVkaWFidXMuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXmVudW1ccysoW15cc10rKVxzKy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC92NGwyLXN1YmRldi5oKQorCitTVFJVQ1RTID0gXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXnN0cnVjdFxzKyhbXlxzXSspXHMrLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmICgvXnN0cnVjdFxzKyhbXlxzXHtdKylccyovKScgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9hdWRpby5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmICgvXnN0cnVjdFxzKyhbXlxzXSspXHMrLyknICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvY2EuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAoL15zdHJ1Y3RccysoW15cc10rKVxzKy8pJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL2RteC5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmICghL2R0dlxfY21kc1xfaC8gJiYgL15zdHJ1Y3RccysoW15cc10rKVxzKy8pJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL2Zyb250ZW5kLmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgKC9ec3RydWN0XHMrKFtBLVpdW15cc10rKVxzKy8pJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL25ldC5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmICgvXnN0cnVjdFxzKyhbXlxzXSspXHMrLyknICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvdmlkZW8uaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXnN0cnVjdFxzKyhbXlxzXSspXHMrLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L21lZGlhLmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL15zdHJ1Y3RccysoW15cc10rKVxzKy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC92NGwyLXN1YmRldi5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIC9ec3RydWN0XHMrKFteXHNdKylccysvJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvdjRsMi1tZWRpYWJ1cy5oKQorCitFUlJPUlMgPSBcCisJRTJCSUcgXAorCUVBQ0NFUyBcCisJRUFHQUlOIFwKKwlFQkFERiBcCisJRUJBREZEIFwKKwlFQkFEUiBcCisJRUJBRFJRQyBcCisJRUJVU1kgXAorCUVDSElMRCBcCisJRUNPTk5SRVNFVCBcCisJRURFQURMSyBcCisJRURPTSBcCisJRUVYSVNUIFwKKwlFRkFVTFQgXAorCUVGQklHIFwKKwlFSUxTRVEgXAorCUVJTklUIFwKKwlFSU5QUk9HUkVTUyBcCisJRUlOVFIgXAorCUVJTlZBTCBcCisJRUlPIFwKKwlFTUZJTEUgXAorCUVORklMRSBcCisJRU5PQlVGUyBcCisJRU5PREFUQSBcCisJRU5PREVWIFwKKwlFTk9FTlQgXAorCUVOT0lPQ1RMQ01EIFwKKwlFTk9NRU0gXAorCUVOT1NQQyBcCisJRU5PU1IgXAorCUVOT1NZUyBcCisJRU5PVFNVUCBcCisJRU5PVFNVUFAgXAorCUVOT1RUWSBcCisJRU5YSU8gXAorCUVPUE5PVFNVUFAgXAorCUVPVkVSRkxPVyBcCisJRVBFUk0gXAorCUVQSVBFIFwKKwlFUFJPVE8gXAorCUVSQU5HRSBcCisJRVJFTU9URSBcCisJRVJFTU9URUlPIFwKKwlFUkVTVEFSVCBcCisJRVJFU1RBUlRTWVMgXAorCUVTSFVURE9XTiBcCisJRVNQSVBFIFwKKwlFVElNRSBcCisJRVRJTUVET1VUIFwKKwlFVVNFUlMgXAorCUVXT1VMREJMT0NLIFwKKwlFWERFViBcCisKK0VTQ0FQRSA9IFwKKwktZSAicy8mL1xcJmFtcDsvZyIgXAorCS1lICJzLzwvXFwmbHQ7L2ciIFwKKwktZSAicy8+L1xcJmd0Oy9nIgorCitGSUxFTkFNRSA9IFwKKwktZSBzLCJeW15cL10qLyIsLCBcCisJLWUgcy8iXFwueG1sIi8vIFwKKwktZSBzLyJcXC50bXBsIi8vIFwKKwktZSBzL1xcXC4vLS9nIFwKKwktZSBzLyJeZnVuYy0iLy8gXAorCS1lIHMvIl5waXhmbXQtIi8vIFwKKwktZSBzLyJedmlkaW9jLSIvLworCisjIEdlbmVyYXRlIHJlZmVyZW5jZXMgdG8gdGhlc2Ugc3RydWN0cyBpbiB2aWRlb2RldjIuaC54bWwuCitET0NVTUVOVEVEID0gXAorCS1lICJzL1woZW51bSAqXCl2NGwyX21wZWdfY3gyMzQxeF92aWRlb19cKFthLXpdKl9zcGF0aWFsX2ZpbHRlcl90eXBlXCkvXDE8bGluayBsaW5rZW5kPVwiXDJcIj52NGwyX21wZWdfY3gyMzQxeF92aWRlb19cMjxcL2xpbms+L2ciIFwKKwktZSAicy9cKFwoZW51bVx8c3RydWN0XCkgKlwpXCh2NGwyX1thLXpBLVowLTlfXSpcKS9cMTxsaW5rIGxpbmtlbmQ9XCJcM1wiPlwzPFwvbGluaz4vZyIgXAorCS1lICJzL1woVjRMMl9QSVhfRk1UX1tBLVowLTlfXVwrXCkgLzxsaW5rIGxpbmtlbmQ9XCJcMVwiPlwxPFwvbGluaz4gL2ciIFwKKwktZSAiOmE7cy9cKGxpbmtlbmQ9XCIuKlwpX1woLipcIj5cKS9cMS1cMi87dGEiIFwKKwktZSAicy92NGwyXC1tcGVnXC12YmlcLUlUVjAvdjRsMi1tcGVnLXZiaS1pdHYwLTEvZyIKKworRFZCX0RPQ1VNRU5URUQgPSBcCisJLWUgInMvXChsaW5rZW5kXD1cIlwpRkVfU0VUX1BST1BFUlRZL1wxRkVfR0VUX1BST1BFUlRZL2ciIFwKKwktZSAicyxcKHN0cnVjdFxzXCtcKVwoW2EtejAtOV9dXCtcKVwoXHNcK3tcKSxcMVw8bGluayBsaW5rZW5kPVwiXDJcIj5cMlw8XC9saW5rXD5cMyxnIiBcCisJLWUgInMsXCh9XHNcK1wpXChbYS16MC05X11cK190XCtcKSxcMVw8bGluayBsaW5rZW5kPVwiXDJcIj5cMlw8XC9saW5rXD4sZyIgXAorCS1lICJzLFwoZGVmaW5lXHNcK1wpXChEVFZfW0EtWjAtOV9dXCtcKVwoXHNcK1swLTldXCtcKSxcMVw8bGluayBsaW5rZW5kPVwiXDJcIj5cMlw8XC9saW5rXD5cMyxnIiBcCisJLWUgInMsPGxpbmtcc1wrbGlua2VuZD1cIi4qXCI+XChEVFZfSU9DVExfTUFYX01TR1NcfGR0dl9jbWRzX2hcfF9fLipfb2xkXCk8XC9saW5rPixcMSxnIiBcCisJLWUgIjphO3MvXChsaW5rZW5kPVwiLipcKV9cKC4qXCI+XCkvXDEtXDIvO3RhIiBcCisJLWUgInMsXChhdWRpby1taXhlclx8YXVkaW8ta2FyYW9rZVx8YXVkaW8tc3RhdHVzXHxjYS1zbG90LWluZm9cfGNhLWRlc2NyLWluZm9cfGNhLWNhcHNcfGNhLW1zZ1x8Y2EtZGVzY3JcfGNhLXBpZFx8ZG14LWZpbHRlclx8ZG14LWNhcHNcfHZpZGVvLXN5c3RlbVx8dmlkZW8taGlnaGxpZ2h0XHx2aWRlby1zcHVcfHZpZGVvLXNwdS1wYWxldHRlXHx2aWRlby1uYXZpLXBhY2tcKS10LFwxLGciIFwKKwktZSAicyxEVFYtSVNEQlQtTEFZRVJbQS1DXSxEVFYtSVNEQlQtTEFZRVIsZyIgXAorCS1lICJzLFwoZGVmaW5lXHNcK1wpXChbQS1aMC05X11cK1wpXChcc1wrX0lPXCksXDFcPGxpbmsgbGlua2VuZD1cIlwyXCI+XDJcPFwvbGlua1w+XDMsZyIgXAorCS1lICJzLDxsaW5rXHNcK2xpbmtlbmQ9XCIuKlwiPlwoX18uKl9PTERcKTxcL2xpbms+LFwxLGciIFwKKworIworIyBNZWRpYSB0YXJnZXRzIGFuZCBkZXBlbmRlbmNpZXMKKyMKKworaW5zdGFsbF9tZWRpYV9pbWFnZXMgPSBcCisJJChRKWNwICQoT0JKSU1HRklMRVMpICQoTUVESUFfT0JKX0RJUikvbWVkaWFfYXBpCisKKyQoTUVESUFfT0JKX0RJUikvJTogJChNRURJQV9TUkNfRElSKS8lLmI2NAorCSQoUSliYXNlNjQgLWQgJDwgPiRACisKKyQoTUVESUFfT0JKX0RJUikvdjRsMi54bWw6ICQoT0JKSU1HRklMRVMpCisJQCQoJChxdWlldClnZW5feG1sKQorCUAobG4gLXNmICQoTUVESUFfU1JDX0RJUikvdjRsLyp4bWwgJChNRURJQV9PQkpfRElSKS8pCisJQChsbiAtc2YgJChNRURJQV9TUkNfRElSKS9kdmIvKnhtbCAkKE1FRElBX09CSl9ESVIpLykKKworJChNRURJQV9PQkpfRElSKS92aWRlb2RldjIuaC54bWw6ICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaCAkKE1FRElBX09CSl9ESVIpL3Y0bDIueG1sCisJQCQoJChxdWlldClnZW5feG1sKQorCUAoCQkJCQlcCisJZWNobyAiPHByb2dyYW1saXN0aW5nPiIpID4gJEAKKwlAKAkJCQkJXAorCWV4cGFuZCAtLXRhYnM9OCA8ICQ8IHwJCQlcCisJICBzZWQgJChFU0NBUEUpICQoRE9DVU1FTlRFRCkgfAkJXAorCSAgc2VkICdzL2lcLmVcLi8maWU7LycpID4+ICRACisJQCgJCQkJCVwKKwllY2hvICI8L3Byb2dyYW1saXN0aW5nPiIpID4+ICRACisKKyQoTUVESUFfT0JKX0RJUikvYXVkaW8uaC54bWw6ICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvYXVkaW8uaCAkKE1FRElBX09CSl9ESVIpL3Y0bDIueG1sCisJQCQoJChxdWlldClnZW5feG1sKQorCUAoCQkJCQlcCisJZWNobyAiPHByb2dyYW1saXN0aW5nPiIpID4gJEAKKwlAKAkJCQkJXAorCWV4cGFuZCAtLXRhYnM9OCA8ICQ8IHwJCQlcCisJICBzZWQgJChFU0NBUEUpICQoRFZCX0RPQ1VNRU5URUQpIHwJXAorCSAgc2VkICdzL2lcLmVcLi8maWU7LycpID4+ICRACisJQCgJCQkJCVwKKwllY2hvICI8L3Byb2dyYW1saXN0aW5nPiIpID4+ICRACisKKyQoTUVESUFfT0JKX0RJUikvY2EuaC54bWw6ICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvY2EuaCAkKE1FRElBX09CSl9ESVIpL3Y0bDIueG1sCisJQCQoJChxdWlldClnZW5feG1sKQorCUAoCQkJCQlcCisJZWNobyAiPHByb2dyYW1saXN0aW5nPiIpID4gJEAKKwlAKAkJCQkJXAorCWV4cGFuZCAtLXRhYnM9OCA8ICQ8IHwJCQlcCisJICBzZWQgJChFU0NBUEUpICQoRFZCX0RPQ1VNRU5URUQpIHwJXAorCSAgc2VkICdzL2lcLmVcLi8maWU7LycpID4+ICRACisJQCgJCQkJCVwKKwllY2hvICI8L3Byb2dyYW1saXN0aW5nPiIpID4+ICRACisKKyQoTUVESUFfT0JKX0RJUikvZG14LmgueG1sOiAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL2RteC5oICQoTUVESUFfT0JKX0RJUikvdjRsMi54bWwKKwlAJCgkKHF1aWV0KWdlbl94bWwpCisJQCgJCQkJCVwKKwllY2hvICI8cHJvZ3JhbWxpc3Rpbmc+IikgPiAkQAorCUAoCQkJCQlcCisJZXhwYW5kIC0tdGFicz04IDwgJDwgfAkJCVwKKwkgIHNlZCAkKEVTQ0FQRSkgJChEVkJfRE9DVU1FTlRFRCkgfAlcCisJICBzZWQgJ3MvaVwuZVwuLyZpZTsvJykgPj4gJEAKKwlAKAkJCQkJXAorCWVjaG8gIjwvcHJvZ3JhbWxpc3Rpbmc+IikgPj4gJEAKKworJChNRURJQV9PQkpfRElSKS9mcm9udGVuZC5oLnhtbDogJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9mcm9udGVuZC5oICQoTUVESUFfT0JKX0RJUikvdjRsMi54bWwKKwlAJCgkKHF1aWV0KWdlbl94bWwpCisJQCgJCQkJCVwKKwllY2hvICI8cHJvZ3JhbWxpc3Rpbmc+IikgPiAkQAorCUAoCQkJCQlcCisJZXhwYW5kIC0tdGFicz04IDwgJDwgfAkJCVwKKwkgIHNlZCAkKEVTQ0FQRSkgJChEVkJfRE9DVU1FTlRFRCkgfAlcCisJICBzZWQgJ3MvaVwuZVwuLyZpZTsvJykgPj4gJEAKKwlAKAkJCQkJXAorCWVjaG8gIjwvcHJvZ3JhbWxpc3Rpbmc+IikgPj4gJEAKKworJChNRURJQV9PQkpfRElSKS9uZXQuaC54bWw6ICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvbmV0LmggJChNRURJQV9PQkpfRElSKS92NGwyLnhtbAorCUAkKCQocXVpZXQpZ2VuX3htbCkKKwlAKAkJCQkJXAorCWVjaG8gIjxwcm9ncmFtbGlzdGluZz4iKSA+ICRACisJQCgJCQkJCVwKKwlleHBhbmQgLS10YWJzPTggPCAkPCB8CQkJXAorCSAgc2VkICQoRVNDQVBFKSAkKERWQl9ET0NVTUVOVEVEKSB8CVwKKwkgIHNlZCAncy9pXC5lXC4vJmllOy8nKSA+PiAkQAorCUAoCQkJCQlcCisJZWNobyAiPC9wcm9ncmFtbGlzdGluZz4iKSA+PiAkQAorCiskKE1FRElBX09CSl9ESVIpL3ZpZGVvLmgueG1sOiAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL3ZpZGVvLmggJChNRURJQV9PQkpfRElSKS92NGwyLnhtbAorCUAkKCQocXVpZXQpZ2VuX3htbCkKKwlAKAkJCQkJXAorCWVjaG8gIjxwcm9ncmFtbGlzdGluZz4iKSA+ICRACisJQCgJCQkJCVwKKwlleHBhbmQgLS10YWJzPTggPCAkPCB8CQkJXAorCSAgc2VkICQoRVNDQVBFKSAkKERWQl9ET0NVTUVOVEVEKSB8CVwKKwkgIHNlZCAncy9pXC5lXC4vJmllOy8nKSA+PiAkQAorCUAoCQkJCQlcCisJZWNobyAiPC9wcm9ncmFtbGlzdGluZz4iKSA+PiAkQAorCiskKE1FRElBX09CSl9ESVIpL21lZGlhLWVudGl0aWVzLnRtcGw6ICQoTUVESUFfT0JKX0RJUikvdjRsMi54bWwKKwlAJCgkKHF1aWV0KWdlbl94bWwpCisJQCgJCQkJCQkJCVwKKwllY2hvICI8IS0tIEdlbmVyYXRlZCBmaWxlISBEbyBub3QgZWRpdC4gLS0+IikgPiRACisJQCgJCQkJCQkJCVwKKwllY2hvIC1lICJcbjwhLS0gRnVuY3Rpb25zIC0tPiIpID4+JEAKKwlAKAkJCQkJCQkJXAorCWZvciBpZGVudCBpbiAkKEZVTkNTKSA7IGRvCQkJCQlcCisJICBlbnRpdHk9YGVjaG8gJCRpZGVudCB8IHRyIF8gLWAgOwkJCQlcCisJICBlY2hvICI8IUVOVElUWSBmdW5jLSQkZW50aXR5IFwiPGxpbmsiCQkJCVwKKwkgICAgImxpbmtlbmQ9J2Z1bmMtJCRlbnRpdHknPjxmdW5jdGlvbj4kJGlkZW50KCk8L2Z1bmN0aW9uPjwvbGluaz5cIj4iIFwKKwkgID4+JEAgOwkJCQkJCQlcCisJZG9uZSkKKwlAKAkJCQkJCQkJXAorCWVjaG8gLWUgIlxuPCEtLSBJb2N0bHMgLS0+IikgPj4kQAorCUAoCQkJCQkJCQlcCisJZm9yIGlkZW50IGluICQoSU9DVExTKSA7IGRvCQkJCQlcCisJICBlbnRpdHk9YGVjaG8gJCRpZGVudCB8IHRyIF8gLWAgOwkJCQlcCisJICBpZD1gZ3JlcCAiPHJlZm5hbWU+JCRpZGVudCIgJChNRURJQV9PQkpfRElSKS92aWRpb2MtKi54bWwgfCBzZWQgLXIgcywiXi4qLyguKikueG1sLioiLCJcMSIsYCA7IFwKKwkgIGVjaG8gIjwhRU5USVRZICQkZW50aXR5IFwiPGxpbmsiCQkJCVwKKwkgICAgImxpbmtlbmQ9JyQkaWQnPjxjb25zdGFudD4kJGlkZW50PC9jb25zdGFudD48L2xpbms+XCI+IglcCisJICA+PiRAIDsJCQkJCQkJXAorCWRvbmUpCisJQCgJCQkJCQkJCVwKKwllY2hvIC1lICJcbjwhLS0gVHlwZXMgLS0+IikgPj4kQAorCUAoCQkJCQkJCQlcCisJZm9yIGlkZW50IGluICQoVFlQRVMpIDsgZG8JCQkJCVwKKwkgIGVudGl0eT1gZWNobyAkJGlkZW50IHwgdHIgXyAtYCA7CQkJCVwKKwkgIGVjaG8gIjwhRU5USVRZICQkZW50aXR5IFwiPGxpbmsiCQkJCVwKKwkgICAgImxpbmtlbmQ9JyQkZW50aXR5Jz4kJGlkZW50PC9saW5rPlwiPiIgPj4kQCA7CQlcCisJZG9uZSkKKwlAKAkJCQkJCQkJXAorCWVjaG8gLWUgIlxuPCEtLSBFbnVtcyAtLT4iKSA+PiRACisJQCgJCQkJCQkJCVwKKwlmb3IgaWRlbnQgaW4gJChFTlVNUykgOyBkbwkJCQkJXAorCSAgZW50aXR5PWBlY2hvICQkaWRlbnQgfCBzZWQgLWUgInMvdjRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fXChbYS16XSpfc3BhdGlhbF9maWx0ZXJfdHlwZVwpL1wxLyIgfCB0ciBfIC1gIDsgXAorCSAgZWNobyAiPCFFTlRJVFkgJCRlbnRpdHkgXCJlbnVtJm5ic3A7PGxpbmsiCQkJXAorCSAgICAibGlua2VuZD0nJCRlbnRpdHknPiQkaWRlbnQ8L2xpbms+XCI+IiA+PiRAIDsJCVwKKwlkb25lKQorCUAoCQkJCQkJCQlcCisJZWNobyAtZSAiXG48IS0tIFN0cnVjdHVyZXMgLS0+IikgPj4kQAorCUAoCQkJCQkJCQlcCisJZm9yIGlkZW50IGluICQoU1RSVUNUUykgOyBkbwkJCQkJXAorCSAgZW50aXR5PWBlY2hvICQkaWRlbnQgfCB0ciBfIC0gfCBzZWQgcy92NGwyLW1wZWctdmJpLUlUVjAvdjRsMi1tcGVnLXZiaS1pdHYwLTEvZ2AgOyBcCisJICBlY2hvICI8IUVOVElUWSAkJGVudGl0eSBcInN0cnVjdCZuYnNwOzxsaW5rIgkJCVwKKwkgICAgImxpbmtlbmQ9JyQkZW50aXR5Jz4kJGlkZW50PC9saW5rPlwiPiIgPj4kQCA7CQlcCisJZG9uZSkKKwlAKAkJCQkJCQkJXAorCWVjaG8gLWUgIlxuPCEtLSBFcnJvciBDb2RlcyAtLT4iKSA+PiRACisJQCgJCQkJCQkJCVwKKwlmb3IgaWRlbnQgaW4gJChFUlJPUlMpIDsgZG8JCQkJCVwKKwkgIGVjaG8gIjwhRU5USVRZICQkaWRlbnQgXCI8ZXJyb3Jjb2RlPiQkaWRlbnQ8L2Vycm9yY29kZT4iCVwKKwkgICAgImVycm9yIGNvZGVcIj4iID4+JEAgOwkJCQkJXAorCWRvbmUpCisJQCgJCQkJCQkJCVwKKwllY2hvIC1lICJcbjwhLS0gU3Vic2VjdGlvbnMgLS0+IikgPj4kQAorCUAoCQkJCQkJCQlcCisJZm9yIGZpbGUgaW4gJChNRURJQV9TR01MUykgOyBkbwkJCQkJXAorCSAgZW50aXR5PWBlY2hvICIkJGZpbGUiIHwgc2VkICQoRklMRU5BTUUpIC1lIHMvIl4oW14tXSopIi9zdWJcMS9gIDsgXAorCSAgaWYgISBlY2hvICIkJGZpbGUiIHwJCQkJCQlcCisJICAgIGdyZXAgLXEgLUUgLWUgJ14oZnVuY3x2aWRpb2N8cGl4Zm10KS0nIDsgdGhlbgkJXAorCSAgICBlY2hvICI8IUVOVElUWSBzdWItJCRlbnRpdHkgU1lTVEVNIFwiJCRmaWxlXCI+IiA+PiRAIDsJXAorCSAgZmkgOwkJCQkJCQkJXAorCWRvbmUpCisJQCgJCQkJCQkJCVwKKwllY2hvIC1lICJcbjwhLS0gRnVuY3Rpb24gUmVmZXJlbmNlIC0tPiIpID4+JEAKKwlAKAkJCQkJCQkJXAorCWZvciBmaWxlIGluICQoTUVESUFfU0dNTFMpIDsgZG8JCQkJCVwKKwkgIGlmIGVjaG8gIiQkZmlsZSIgfAkJCQkJCVwKKwkgICAgZ3JlcCAtcSAtRSAtZSAnKGZ1bmN8dmlkaW9jfHBpeGZtdCktJyA7IHRoZW4JCVwKKwkgICAgZW50aXR5PWBlY2hvICIkJGZpbGUiIHxzZWQgJChGSUxFTkFNRSlgIDsJCQlcCisJICAgIGVjaG8gIjwhRU5USVRZICQkZW50aXR5IFNZU1RFTSBcIiQkZmlsZVwiPiIgPj4kQCA7CVwKKwkgIGZpIDsJCQkJCQkJCVwKKwlkb25lKQorCisjIEphZGUgY2FuIGF1dG8tZ2VuZXJhdGUgYSBsaXN0LW9mLXRhYmxlcywgd2hpY2ggaW5jbHVkZXMgYWxsIHN0cnVjdHMsCisjIGJ1dCB3ZSBvbmx5IHdhbnQgZGF0YSB0eXBlcywgYWxsIHR5cGVzLCBhbmQgc29ydGVkIHBsZWFzZS4KKyQoTUVESUFfT0JKX0RJUikvbWVkaWEtaW5kaWNlcy50bXBsOiAkKE1FRElBX09CSl9ESVIpL3Y0bDIueG1sCisJQCQoJChxdWlldClnZW5feG1sKQorCUAoCQkJCQkJCQlcCisJZWNobyAiPCEtLSBHZW5lcmF0ZWQgZmlsZSEgRG8gbm90IGVkaXQuIC0tPiIpID4kQAorCUAoCQkJCQkJCQlcCisJZWNobyAtZSAiXG48aW5kZXg+PHRpdGxlPkxpc3Qgb2YgVHlwZXM8L3RpdGxlPiIpID4+JEAKKwlAKAkJCQkJCQkJXAorCWZvciBpZGVudCBpbiAkKFRZUEVTKSA7IGRvCQkJCQlcCisJICBpZD1gZWNobyAkJGlkZW50IHwgdHIgXyAtYCA7CQkJCQlcCisJICBlY2hvICI8aW5kZXhlbnRyeT48cHJpbWFyeWllPjxsaW5rIgkJCQlcCisJICAgICJsaW5rZW5kPSckJGlkJz4kJGlkZW50PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4iID4+JEAgOyBcCisJZG9uZSkKKwlAKAkJCQkJCQkJXAorCWZvciBpZGVudCBpbiAkKEVOVU1TKSA7IGRvCQkJCQlcCisJICBpZD1gZWNobyAkJGlkZW50IHwgc2VkIC1lICJzL3Y0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX1woW2Etel0qX3NwYXRpYWxfZmlsdGVyX3R5cGVcKS9cMS8iIHwgdHIgXyAtYDsgXAorCSAgZWNobyAiPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsiCQkJXAorCSAgICAibGlua2VuZD0nJCRpZCc+JCRpZGVudDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+IiA+PiRAIDsgXAorCWRvbmUpCisJQCgJCQkJCQkJCVwKKwlmb3IgaWRlbnQgaW4gJChTVFJVQ1RTKSA7IGRvCQkJCQlcCisJICBpZD1gZWNobyAkJGlkZW50IHwgdHIgXyAtIHwgc2VkIHMvdjRsMi1tcGVnLXZiaS1JVFYwL3Y0bDItbXBlZy12YmktaXR2MC0xL2dgIDsgXAorCSAgZWNobyAiPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayIJCVwKKwkgICAgImxpbmtlbmQ9JyQkaWQnPiQkaWRlbnQ8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PiIgPj4kQCA7IFwKKwlkb25lKQorCUAoCQkJCQkJCQlcCisJZWNobyAiPC9pbmRleD4iKSA+PiRACisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9iYXllci5wbmcuYjY0IGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2JheWVyLnBuZy5iNjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkZjJiYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9iYXllci5wbmcuYjY0CkBAIC0wLDAgKzEsMTcxIEBACitpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBbGdBQUFDcUNBTUFBQUJHZmNIVkFBQUFBWE5TUjBJQXJzNGM2UUFBQXdCUVRGUkZBQUlBCitDQUlDQUFRVkVRRUJBZ3NBSmdFQ0FBb2dBd3NUQVFvcEhRWUJOQUVBQUF4TkFSUUFFUklRQWhvREFCd0FBQlpFSFJRS0dSWUtRdzBGCitBQ01CQUNVQUVSd3BIUjRjVlJBRkJSNXJaaEFEQUNSMkppSWhCREFHQWlXR2dRNEFjeFFBQkRZQUNTZVFNU1lsSnlrbUVTeFlsUTRBCitQU1laSVMwNU9Tc0pIUzVKT0M4a0FFTURVQzhTQURYTE5EVXpBRGJFQUVzQUFEWC8yUkFCQ0ZJQUFEL3F4QjBBQUQvL0JGZ0FLMFZwCitXVDRyM2h3QTNSc1RSRVJBQUVmLzVDSUEyaVlDQ1V2K1dVZ3o3aUlBT2s1ZzNDZ1ZTVTVTaUQ4dUIyc0FCbThBRTFYL1UxUlFPRnlMCis0amtmSWx6L1JWOThNMWorRzJIL2ZWazIzanRENFQwcFhsOWllRnRHY1Y4OTRVSWlZV0pmQUl3QTUwZ09WMnArNGtzc08yaitkR1p4CitiRzFxVm1qL09ISC9hSEp6Zm5CWDVsUTdCNTBBWm5haGRYZDBBS1VHNVYxQVJuei82bUVyQ3FnQUFLc0FlbnQ0NkdCSVc0R2hBSzBBCitBSzhCNDJGdEFMSU9pbjkvQUxVQWlJT0JBTGtBVklmLzZXeFdnNGVCaTRTS0pyRUFtb1Z0ZFkyZ2VvUC9yWVZYaG95T3FZVnVKYlVoCitJcmdXWDVEL2pvNko3bnN6UDdnQXNJOVM2M3huTjcwelpxTy9mWnpDT2I0K2Nacis2NGR5OG90WW5KNmI3SW1EUmNNNTZJcWNXTUVvCitvSmIvTjhab1RNUkw3WTkvUWNoY3NhT1RvNmVvaGFqLzdacUtYc3BYajZ2OXhhbCtvSys3ZDd2VFVNK0FmY281cjdDdW1MVFZTdEtWCiticzl1a2JiLzlxeC85cTlsOHF1ZW9Mdi9lOVI2NmJlRzdyREltTlJoaTlhRHdzUEFzOGJXemNLMmNkNjdqdHFQNU1XVW9keUI4YisxCit0TXIvejhML2o5K2tiT1hXbk4yWnN0RDd5YzdSenM3THk5eGIxODNVd2RELytzaS9xZU9tdnVLSXg5Zmo0dFBDdHVXaXFPckwrdFMyCit5OXYrK05QSzJkdlp0K20wdWVxODArV28zT2VTd3V5L3llekcrZDdmL2VTL3ovRFMzdWYvNk9ubzRQQzcxTzM5eFBiMDJ2UFovK25SCisrT3JpNmUzOTkrdnQrUEd6K3VyNjVmTDU1L1hiNHZiaDdmZlgvUFBZOHZQOSt2THk2UGYzNmZqci9QZk04dmpyLy9mKy92bjQ4UDM2Cis5dnYrL3Z6ZitmdjQvZnZ1Ly96Nyt2Ny8vUC83L3YvOC8vUXB4QUFBQUFGaVMwZEVBSWdGSFVnQUFBQUpjRWhaY3dBQUZZOEFBQldXCitBUTJUVDhjQUFBQUhkRWxOUlFmYUNSUVhHU2x0d2JQUkFBQWdBRWxFUVZSNDJ1MmREWHdVMWJYQVp3RUp0RWFOSDFuYmg2OGZwb1dLCitpRTFhbzJCZ285UnFJckVnK0JJRm1xTFlMT2xNY0hIbFU2RGlRbXJKTTJqS28wUUlCSGdVakQ1RVRjUUlsS3EwZ0tEbUErVWppUkFUCitCQ09Ca0d6QzVyZS8rKzY5ODdFenN6c3pkemM3czlqZlBhMndPK3pNUGVmYy81NTc1dDY3WjVoQi8wRWsvVzY2OHhja2NtVm1RWjVTCitDdkxtZ3NobDRRQ2ladSs4bnRDT2dXbHpWZnJsNVpaRnJsNlQvVllTdjl4NUszUGo5d25raDlmRkZ4UUU2VmNWcVhZKzhQamdINUswCisrLzBiQnhEYVljc04waSt2TGxUYnpIOWtqRWtua0VGM3pwdGpMUFBtWEwyVndHQy9ueHlzbStZUnljKy9TMmJITllVZ210SmtmNVJJCit2U2NIM0hFdmlmejA1bWhxQjhHNjhkNnhKTzNlY1NXaEhYWWZZZHZNOTlMSEdFdjZtRUYzem1GSjVHcjQ5ZTlxVlVoN08vd1Avdy85CitnZjRFWG5Ld2Jwak5HUXM3Nzlidmt0bHh6VUxnN1RDUXp2REFJdEJ2enFNRDdoanJNSmF4UHgwQ3YzT2RCdnFGQlJaSnM0NnhDQ3dpCitPK3hOd05mU2Nsb202RjJMNGoxQS9Vc0cxaGdJMWp5V1V6TEVLZi9nWDBDd2V2SXpzdlNsSm95aDhJWTVMbVBoRUZoRWhzQ0k5YjdMCitveS91STJHQlJhRGZQQVRXYUdPNTk2ZERBRGhpb0orN1BLeUk1U0JvRjRORlpBY0VhNlpqdkw3TU9nOU1BV3RQeHY0YUhkbGZNMzE1CitUTUh5N0dnNHBpZk41Y1V4Qk1zUGlzdWI5ZFJycUhjMXhCQ3NDN3ZISDZqVmxRT08zZUdCaGNjYzlCK3JHSVdrUC9BTEJOWUVBM3VYCit4eGFzb29NR2JWYVd4aFNzMGtyOU5qczh6YkVFNjBDMlViT1RUQU9yUjYvWkhqQi9aV3pCZXQrZ3pSMHhCbXVIZnB0dHNRYkxJRVAyCitacHNHVnJzQldNc3BXQlFzR3JFb1dGRUFLMVVVRGJCa1FFa0p1K0tvK1dEeERSbUFwV21IK1dDRjB1L2JDRllJTXlJSEszMENMMWtaCitZMUoxN3dvNTFzbmhXMS80ZDlCZG9abGdjWng3bWNlenpNMXllbUJwMjJFMldCekw2NmZzRXhWWWpteEJ4c05lZDFnSFZyYThYWDJ3CitXQmMyQS80ZERiQ1NwNHYvMlByR2IxTDFoa0tuWjhzUk5GSDM5Y2VsNksxbFF5RmJ2TGNaWGYzWXJtV3NObGc2ZHBnTUZsdGMzZEFOCitqMyt6YXpXckNWYktCdW44bHRjZlMzRllCcGIwRDcyMUwrdUN4WG9xeE81VmZFTWlCbXNhNkJMLytVeFdxaFpZTUZ5dFBTVmQ1eU1VCitxS3hKM2psdWI3ZjRENWYreG1xRHBXMkh1V0N4cjByNjliN042b0FWNkpzVGo2VllCcGFjaVA5TDBRYUxWWFF2MTNld1VxZUJkanlTCitaTTAvQ2Y2dUJSYmthazAzdUxTcmFCSG5XZnNKQUovTEVpMlRJeFpzN2JQeVpTNlhad3UwWEVhV0Npd2RPMHdGaTNzWGdDL0s0UURpCitxZmhFb1Y4UVdOdFQ4RkxLK0w5MGdkZEhXd2pXak5HdzFkRy9tZ1c3L2pGTnNGall2ZC9zS25LNzNLaDdQNG9TV0h3M0pPY0RrSkdxCitCVmJ4QmZENUlpZEtxcHpPVi8zZ2IwNXJ3R0pmUlhFQWZZTTQxbk1LZk1YcGdhVmhoNWxnc1ZzQWVKdmo5WU9NWFZyRTZZQWx2SHdhCitYSlNGTEpQQk9nOG04VzJscEx3RlE1WWpORmdjNnQ0NU9GQ3gwT1ZnTlJ1MWlJVkVCeXpudStBcklVaXhuUE1mS0dSWkFSYUNTUnBmCitFTngvNHd3aVZnZzdUQVNMYzUyQ0E0ZjRCaW9iQ0ZtYVlEbFN1c0JVQzhHYUdnQzZWZ3NzRm5hdlMzUXRDN3VYaXlKWU1QMDlvNW04CitPMkdmT3NXOGlsMVR1ZG9pc0Y0Rlg4aEd2eTNsYzF5R1lBWFpZU1pZYStSQml0dnk5aHlYSVZpajc0NFJXUCtqRFJiOHlnYUNGTGRtCit4N0tvSk8vdHlXajJKejMvSlBoanNzWThsbk5MOTFjdnNOTDhLT3RrMWZOWTVpVHYzRC9BUDJVSk1hdWJ2R3ZaWVNKWThKditUMDQrCis4ZUF5QkNzRmR2QlhWZzZGMlVLN2s4NW9Eb1VzN041RnNpd2pTc2s3djVjS2txSHNEM25FY200Qm56bnhISU5URU5hYUNWSnBjQkduCit6WFFpbHBZZFpvTDFpVGhTQitrWEJOYnU4Vk9oekZod0FJQ1hyVXplRjJSUG5UcHA2cXkvbkFHOVl6V1NkNWdwZnFaaFJsL0FrcGpZCitQMEhycnRCWkRRNDY4WnVLSFZncVhkWWs3OTNBZzR6a2xsWHlEWmZxNUZoYWRwZ0pWak1veFozZzNzSHJWODRaem1NQjhMcGpkQ3ltCitHM3Ivb0RYZHdGYUQ5N0VaSEc5RnhRNTNWSEtzYWRPaDVLOC9xNTFqWWJEd0MvRlNpeXdGaXhYNy9TaXJrMk5wMkdFbVdBMmdIT3ZuCitFZmUzYUNmdlhpVEEyN0o5bHBWTE9sN2NMdnlIMmcyUGFVNlFTbUN4NG1YY1hEVEFTa2FTbXB4eEV2dzFWWHNvZkJMUHQ3OS85QWdVCisyREpyNVZESUZoMnJoOUlNNnZYQTByRERncUdRVzRiMWF3QU4rbmVGdnpvRHZwVFBqbHFWdkQ4TncrVG9GRzJ3eEtHUU8zZ1VtbkVrCitHbUFsUy9NL1k1S1hnNXBrTGJENDVGM0lzZGhnc0V4TzN2SFM1Sk1WMm1EcDJHRko4bzcxS3pZQ0srVmhTSllqeFhLdzRBMERlRjBQCitMREY1eHhPVlhMUWlsdGczODRQQWt0YWFueFNtRytEOUFrcnRFRmhXTEVLenI0SnYrRnNVTk9pek8vUWpsb1lkNWs0MzlDNlNWSUlECitkb1BSUE5iVFhlQTk2eVBXNkpTM0FGQ2tXTXJwQmcvcVhtbVljRWNiTE8ySXhUcmZCUmRmY0FxWU9aMVdEWVZvenZHZjBzMnZreEFzCis2eUlXR3FzL2w5WnNuV3RCc3hGWUtIYThiT0VpdERpUEJRZmhjNDlwcmhXeXFIdWxpV2hYMUhJc3ZJMUpMOGVDTUowQ0YxZXplQnhrCitpeit4TE1kQ1N5WWZ6Ulp1Z2JkMGdDTzZPVlpvTzB4ZDBsblREVDU3UWRpa3RxWUR0Qm5Pdk1QWWNjN0NSV2hwZ2hTbVdXOXFnb1ZXCitFQzZ1NXVNR2g3czNLbUJOUXpKOStVblFwVG56emptTFR3SHdSVVZ4Y2VtV0Juam51c3VxUldpMGN0WDVjWGxSOGRxOUhRQjhzMXB2CitTVWZERGxNakZreFBRTy9INWF1S3kvZTJvZjBYaG11RktROTNnVGN0SHdwSE8xQ29sQStHcWtWb3ZudFhGUW5kRzVXWmQwbTZmcWU5CitiWVp6ZWo2UlB2alo2cUFKVXRQMnZMTnJwUDBjNTNiTllYVm0zclhzTUhuYnpGckpMNzI3WHRDYklBMHNyWUEvcFZnMzNTQXU2ZHg5CitCcHlRM1Rlb3Q4MG91amM2RTZUdFdCcHIxbWZvYlBSRFVyemxTRWZIMTBkM0ZjRWJCd3MzK3JuWDdtM282UGptNDNLOWpYNDZkcGk4CiswWTl6RmU4OTF0SFovSEhGTW81ekVhd1YvdW80K0hLc1ZXQ2RsaTFDKzJGMnA3blJqK09LK083ZFVlUmlvN3ZuUGRWb2F6SXIzL1J1Cis0ZFprY2UyYkk5dnpubXI1MW1SaDJ3ZDcyZTk1VDlIZG1oektERXQrcGFQNE1RWDkrUmY5bFU2MHdLSS8vNkpnVWJBb1dKY3pXTVJGCitRZWhRU01FeUpXSk5NN0IzZVl3ajFyZThLRWhuak1HYVpOU3NhVVZCMHRjclphUHFiVmFNeXhpVlZsY3FSUDIyS0xabGpFcUxsQXBWCitxOTd1aUcwWm93T09WemJveWl0bWxURUNLNmZseTJWNmZyN3FmWHRNd1RwYVZLeVVVdFg3NHVZWWdnVkFzMW85bFg1RjFTQ0dZRFdCCitsMmJNVk1vczVkc1pMNEh3d1RJUUZ3WXJtbUlDV05FVU04Q0tucGdERnBtRUFWWlFNMjYzK3Noc2wxWnhXei82SC9vRC91a1BDNng1CitzNDJMNnM0bXJFRnFDbGdrUlg4aFdQZU9OUll6d0JwTjBpNENpOGlPa0dCNVE3eGpiUDJDWkdEd29YNjJLMjlReS9VMzNSQjhiRURTCitTTFVrcGZVbFlqRTNFTW1WSWV3SUpUWjdzSDRGZlFIcnFodXVWOHROUVVkdXVKcnBUeVEyMjhoZy9Vb2lCeXVYc04zK0E2NE90aVBFCitrYXVZRVAwYnNsdzRjOU1EOXhQSUE5ZC81d2MvSkpIK3VXVWxhdW5MNkRpM1AxR3pQeGhNYU1mVjkyME4wcThxY3ZWTzI3LzM0LzgwCitsaDkvYjhEOUQ1REl6KzNCN2l2WkZ6bFl2NzMrQWFLRzd4OUFhRWQ4WWJCK0lVZEg1aGRrZGRSLzlIMmlPdVgzWHJFMXVqblczTytRCit0WHNkcVIzUFJua28vR1VHUVhYNWpOc1lqa2k5QjVKSVd2V1NnM1VybVZ0WTVqWVNPOUovU1Y3bi9lZnpPSktzRFlJMW1rU3VnT0dwCis3YWkrSEFzTHJMRUUyYWZqM3V2STdKaHpFd1RyZ0pHRUE5WnRSUFhsYngvd0pNbE5DQS9XZmdOcEIvNHd3Q0p5eTVQTTdVUTU2dTB3Cit4Mm83WXRDL2JTYUIxZVp4NnhjcWQ5WEhGS3lYcExwbkd1TFlRQndUb2crV0Y3d21sbzNUa0l6cDdTQjJZSjAyN0Y2M3A4MGNzT29YCitkWFIzYWtzSEtDMlBLVmpaRzhCcFBRRXZ6WWdwV1BrcmhkMWtvYVduSnFNbWhtQ2RxWGQzZE9wSmQ0ZTczaHl3am5nTTdDMnZpQ2xZCitNN1lidFBuS3JGaURwU3V0V1kweEJjdW9lNEhITkxDNktWZ21ndFVZYTdBTThuY2ZCWXVDUmNHaVlIM3J3UkorVUtZTFZvb2tWb0xsCiswR3czRkZnaDdUQVpyTlJrUVZLTndWS1hDTElJck5CdVVZS2xaVVpmd09KWWQzRnBlZW1xWmF3T1dJNFZDd1NaNmJBeVlrMFYyNTAxCitWVm56SUJnc0RUdk1CU3QxK3ZMNVdQS1Z0Wk5DZ01XNmlxQjZwY3M0MWxLd3ROeWlBQ3QxZ21qR05IV1ovSWpCWWoxNytUMGpYKzlhCit4R3FDTlQ1d2xaYlhyUU1ySlVCRWIrMGY1RDlORHdKTHl3NXp3VXJlTHg0LzgwWjZxZzVZckd2TE1leWt6bnBsUFhpVHdaTGM4bzNLCitMUXF3a3FYOWNsNVZkYkdJd1dMWFhJREdOamMwZHdCd1NmRkxSV1hFQW9CL05OM3hMZ0JldHc2c0RlQzAwQzVVVC81TFhqVlltbmFZCitETlllMElvZXlkZ0llNzVHQnl3Ty9TQzB0NjJoQVJYcFY1UzdOaGNzZG91V1c5UmdkZkZtK0VHWHNreCtoR0N4Vy95b1RqbkhjaDZvCit3c1VYZE1EaTA1M1JrOTRDUUZGZXdtU3d0Z3NwMW9JejRNMnhtbUJwMjJFNldDdHhhcEsrc2h2OE1WVVRMTThwMEx1ckNGVlJYYXVxCitCMjhxV0tqMmhjd3RpM1RBcWtsT1JSbFd2cnBNZm9SZ2VVNkN6NFZmdnFMeURCK3gybUE1VUNWNjJPVjN2NlY4eG9IcFlPSEMrNmljCis5Q1VaMENxd3RPMHdIYXoxeVdQU1VmYjdHbmdqV1FzczlsMFVMNFFTVktnZXZFVmdvZnJ0dkZ0dzlZMWRyQTVZcWVuSWp1VDVVcUd4Cit2b0NGQ256UEZsdHp2Z28rbDFYQUR3Wkw2T3kvU0hVSXJBRkxmSDBhek5BQ1M4Y09LOERDcjFhQ1BWcGdzY1hkZ1NqRmVrNzF5b3FICittQWtXcnQrdTRaYmdpS1d1WU5jWHNJcmxOZTlkbnRKbExwY3hXRzhwQytKWUJkYkRpdnJvU3JCMDdMQUFMRnc5YWN3SDJrTWg3T0RQCitaZmxONmFyWjFrUXNQYmVFQUF2YnNUSWFReUc3OXBROEhYRXBDbnlIenJGU1VIR0pQOFVneDRJajhJbkhOSElzUFR0TUIydmptSXlNCitqS3pwZTVRZG9od0svNkdzQjI5UjhxN3JsaUN3eG1SQk02YXQ3ejd6bTJpQUJiN1JMUEN0Qm1zRmxsZDJBL0NwbFhlRnRRdHd1eHZPCitBSG14RkRWWTJuYVlEcGJVKzJPMHdUb2xQUG1CY3diVmd6Y1ZMQjIzYUV3M2dLN2ZKZmQ5dW9FdEI4ZjRPc3c3VUxuYyt2cGpIbFlMCitySURqUDFVVy9qVVpySUM4UEZvVExCMDdMQU1MN0UvWEJNc25sQlV2NHRVN3VvTzFCS3dLMFMyVlFyc2V6aEFzMFBpNzFLaUI1WGFLCit2NnNyWm5YbnNieWdkL3RNVldGbms4RnFPWUFuc2I1OEtWdDc1bDNQRHZOenJGUzBFM25DeW03RldLZ0VxeHNVYWRTck54VXN5UzF0Cit3VzRKY1ZjSUJUMlZyeXNLRVd1dC95SWZvc3NyMFNNSk9zRXFWamZIZWxvOU8ycFJqdlVXK0ZKWjlGYzlGR3JiWWRGZFlXcnkvRzRnCitHMFhVUXlGT29qa1BVcS9paUt4SXI3bERvZG90UmF6QlhXRnFjdFpKOE5ma0tDVHZ3blFzWHc2NVF3OHNOSS9GRnd4UHNSWXM5QnpICis0NkQzTVoySXBXT0hWZE1OWTFKcndId05zSFRxMVpzSkZnZmQ4b0xDTFlaZ3daZnJGZk54a2M1amZTS2ZTMlFOd0JJS2h2L0o0b2lGCitYa3hDRlRTMUY2RjE3TEFNckdSdHNGaFVEejZnN0E2THdGSzVoYk1RTEc0TldsL2d4SktNSFhvNUZ0K3ZkeDlYRlF5M0JDeCtFTlplCitoTmF4d3lxd1V0TlBha2NzenlrMEE4N3g2am1yWldYRnpRVUxBaDF3Qzh6MFZobUNsWnI2UmpUQVFsTjM0TzFsK0hFVDdqVU5RSWEwCitCbGdwRHdORk9XbXJKa2hocU96VldZVFd0c09hdGNMazVER3ZnVE95L1EycUpaMjFGOEFYcTkyb3VvcTdhSzhmZk14YXRGYW83WlpnCitzUGo5V012OVFIRmJHQ0ZZbkFzMjNmdHhaY1dPZ3gzb09lekdNKzlCVDgrd2FPWWREb2FmYWk5Q2E5dGhPbGg3bHErRXNyNEdLSkplCisxU0kwM256eEJWU3ZHcFc5L3V3RmE1WjBWRzY1OUxiT1BGWWpObVBsSGdEK25oeVYvVmljVkVpOTk2TmxyTTUrTExHM1lROWZsRys2CitNeG1zM1lGbkdzdWZJQm0wSDB2TERxdjJZd0d3VVhjL1Z2RmU4WE5mbExvNHkvWmphYnBGY3g1cmYzcVVkcEN5cnVMcWcwY09WcGU3CitXZTJOZm83YUE5SmE0WUxhMnBsV2diWGkrRXZTSXZUMjJ0MWpkWGFRYXRoaE1sanJhL0JQbGZlOHNWSzVqU2xvQnluTGVpcjJIcWxICis1ZUJaNi9aalNXNnBWTHRGQ1ZhK1lNYWVqZE5Ubzczbm5UWFk4eDc2dGZsNzNoMnliZmNrZTk3WjJPeDVUeWJkODg3RlpzODdTN2JuCitQV2pUdTltLzBuRTRaQzhkbHUxNWQyaTFlOW44U2tlb25mRnQvNVZPdW9ZZDlPZGY5T2RmZlFLTC9xNlFna1hCb21CUnNQb0tsbytDCis5ZThNbGxHelpvRlY3KzRFUG0zcEJxV3hCU3Q3QS9EcXlXVlF4cWlycHd2K0gvNkJSZnliRjlBWTR6SkdIdDN1OVlGT3M4QnFWbGZpCitLbElYWGpzWVU3QldPQ1lwQzYxTlVyNmY1TmhBcko0WllLMVBuNmFzdEtaNm16V3ROWVpnbmY3YVl5ak5QRml6U2Vvd1E3REdrZ2lxCitRZHBXZjBRaFI1VnY2NCtDY01BaWFoZUJSV1pIcUZLUnUxVUNvZzdXYlFPY1JPV3VjYW5JRDVSU3MzK1BVbHJES2hWSjVCWW5RMmlICit2UWw4cmVwZXRkVGovWlhNcmV5VEJNTCs2RWJISFNSeVJZbXY2ZlFabFlESTVabnZFTFU3K2pveU81dzNQWE8rNllKS3VpTlhyOGwrCisrNWhmR2t2NjdjeWpUaEkzMzI5dmFtcnFWWXU2MVRDSzIvNkl6QzJQd29oRllBZU1XQjhHZDI5SWRaZ0JWd2JKVlZjRkh4dGdHMHdrCit0aUgySUJuWkI3QktDTnU5TnBRZHdZZXVaT0tEMUl2UDdRTllTZjBHQnNtZzRFUDltQkM2WEIzaVdMQjY5dmlJbjNuZ0E4K0dhamVVCitNS1IyQk90bkQxM25QYk51SDRIVWpjd2wrdHkrcE1MZ3o5WDFCYXlSWlBwbDlzR09QdWpYTktTczdrTmpxU3V6VjVIb1YxZVlGT0pvCitVK1JnNVJLNnBjcmVCenRDVGdJd2hGL1h0S1ZrbjBzaXFmUGVSZTZiUXNMSFd1Uk9KclJqSVlpbU5ObkpxS3l6bnlmNjNOYWthR3JuCitBems1Wkovc0lyYURwTTY3VndDcmNmMUdYVm5mRGp0a0xnQU5sZFg2Z3NBcUEyQy8vdlhXdjBhY0pQQmd2Vy9RYm1VYkFEa1FySTBiCitDZXdvQUoxR1psU0hBeFljQityMUwxZ0o3Nzczb1dmUWJEZDRITnNCQVN3RDdTb2J3Z0xMZjN5RGdXem43VERxWHRHT0F4c003ZkJpCitzSHFtVGNpZnJpUDVXZmtZckE2UCtubHNLbkZWWUxCcU1xWk4xNVgwaldGRnJHcVhmclBGbmlJZkFtdGxocTRaZ2gzUGdsSjNxYkVkCitZWUJWYjZTZnF4NTN5QWJIekJtNjRxaUZZUGxBaFV0ZnZ5SlBXemhnZVdka3o5SnRkcVpqQTdUalg0YmR5OXR4b1hiOGpCbUdkbUN3Cisyck1NSnR6ZW1JREJhblliR0ZSWmpNSGFrMlZnYnppUDdvVmdWUmc5OFBTWXV3T0JaVFJqemR2eExQQVlQbUcxT0N5d3Fvc01QbFJVCitqY0Zhc2NEZ2M5bTdNVmhHais3dGNEZUVBOWJwOGJVR0gxdXdBb0gxdGJ1RHhJNExCN0tCc1IwOFdCUDJBUDZSYi81UUFqdGtHZytXCiswU05qMGJPVWsvaG5Rb2U4RU45R1R3Umc2US9zeHp5ZEFsaCtZenVlamZJem9hdkErMFpncmVMQmVtbUJmZ3JnSlFRcm5HZENRN0RPCitaeDh3U0loNHNOb01BK0VxQVN5eVowSWpzUFliZk5QREJTdUtUN0VuaWxnU1dBUjJVTEFvV0JRc0NoWUZpNEpGd2FKZ2ZWdkJhamNBCithemtGaTRKRkl4WUZpNEpGd2FKZ1ViQW9XQlFzQ2haTjNpbFlOR0pSc0NoWUZDd0tWcGhnNVJDQ1ZVQUcxcENTNkE2RmMwZVNnTlVCCitjdTRqQktzZ3VtREZFNElWVHdaV21UM0tZR1dDMDBSZ3hST0NGVThNVmlFWldMa2xaR0RsVkVVM1lwWGxra1dzd2dJeXNLQWRVUVVyCitzNDRJckxwTU1yQ3FNa0ZVd1ZvNGx6QmlaZjdyYXhLdzZqSzdTY0VDUkdDaGF4R0JCU1dxWUVFaEFnc0tDVmpRRG04MHdVSkNBaFlTCitFckNRUkE4c0xFUmc0ZTV0STdKamQxVEJRanVpaU1EeWdlZ09oZkNDWkdEMWtFVXNuemVxRVF2WlN3U1dqeEFzWDVUQjhoR0M1U01FCit5eGR0c0M3N2lPVW5Bd3NLalZpWFU4UUtDNnhvUml3S0ZnV0xSaXdLRmdXTGdrWEJvbUJSc0NoWUZDd0tGZ1dMM2hWU3NDaFlOR0pSCitzQ2hZRkN3S0ZnV0xna1hCb21CaHNHb0l3VElvUjFJcGdtV2c0UEl3ay9keWd3ODBJTVVnV09zSndUS3NOaE5sc0lvbHNQUmxrZ0JXCitwZjdIT3NJRnk2amF6SW9WUk4wcjJMSGJzTnJNSkJHc2pOY2FhM1NrY1QxZmw2akJWZC9jb0NOdEZYejVuejBaTmNycnFhN2VtQjhtCitXTVZ0RGJydEhuUjFvQzllL254ZE15UTdQSlVHMTZzb0RrdS9hbyt1V3hxYVBUd3BLMlljcjlXVjhUeFl4ZVc2K2pVZmNUV0VvOTdwCis4ZHYxMnowK2N3WGZ2VWVJN05nOXZyYVd3QTRJRmxpWmthV1FhUk1VYnlkazhLSEFWKzdXTCs4dDFHOXZuNjYrbnZKdEZuRUJmR0drCitXMlJRVmh3WFN2TkRvTE4wUmJTajB1VWhzb05VRE92YUN4R21kcnhLcGlyZk9tYTA0TS9WRytqbkx2ZUZwZDhLaDdLZDdHeTFJZ2VJCit1bGV3bzJXRzZucmpzMFBad2FDYTRZMnRqYTJ0alkzd0wvZzNmbzMrajkvZ0Y5TG9ycFFPMVh0K2pQYURkbnh1bzNBSjhiS3lOa2pyCitsSXV4djgxQWhNODF0aXJzYU5XeW80M3dlcEhxcDM3ZktlUXlMY2RiOU9UNGVTRUhhek80WHBqcUFmMW1vVlo4dXo0anQzVHlacHczCit1aDYyZ3lGU3pROHVmL0gvbTlqeGJ5SU1kUUVWQ2hZVkNoWVZDaFlWS2hRc0toUXNLaFFzS2xRb1dGUW9XRlFvV0NEMGcwVjhmdlVMCisyU2REYktEd21xcXUxeHRRUWQxU3FDTkJwL1dZcktEa3BSNS9rRXQ5QktmNXpGc2NVRFRmRS96U3ErbGxYd1RkcTRoWVd3dm1JbGxhCis4bzc4Nk02U3dtZVhiajZydU9qaHJZVnpsNVlkRW80MUZTeWNLNXo1b2RuZmhKYWRKYWdaNlhHN2hVTExTQm0wWkZOWG9EZ2lTaTg2CitiZW5tZHRPL3FZR0dzR3VxZUpmT1hiaTBySlZmVXRvbk9IbnA1aDZWbHhlcXZSeGxyc29rWFRhM0tqcHpIV3E2U2Q0MDh2S3pvcGVsCitNNWVXSElwc0tFeGpCSWtmZDFMRWM5M3dCSHhvMkpSdWllYkQ5d3l4b1dPSjR3N2h6OVF4a3Rpbm1OcDNMWXR2eGkzSEQxc2krRUZzCisySlk0aGY5eXlIWGh1OUlMZWhjUEYwL3pteGV5NElWN0JYZkZEVnZTalJ2S2xhbnpJajVTS0IwWTlnN1E4cklwWUtVeG9acmVtWllnCitlT3VrNkpxQWx6ZXJ6aFRBQ0Jlc1RHWmtEcFRKc0tsYmVBTmJIb0g0M0RjNUozTTR3OXdpWHZQNUJDWU9IVXV6TVFPM29jZWwxakh4CitPVmd5WWY4OVpPSjM3dkJRNkpQN1lEc0pqTzBoWHNONEpsTnMrU2tjSWhpN3FBc0RqM1NoMDc0Y0paM0czR1ZhejZIOUM3QWh1K0N1Cit1ODZpWXdWTWtxQk9BdE52RzNKTkNYOWtNand3NkpEOHRFemV5MmROODU3UXZUazVzSDhIdmlOMDB4TTJKaTV0TXZaZklqN21sYnljCitocnpzNTg5TUU4RWc5WjhLckJMK3hicWgvVjdFY1gwaUU3ZmtFUHJXdDZ5VHJ2bWNqWm55WVErT2w2T1lRVFU0WXNWTEVhVi8zQWVtCis5ZHlYSTVqRXpkanhkWXR0ek85eE9MSXpUZndROUh4L3JFc1ZJejdidk9VUlcyS05lTnFTSnY2MEJIaWFlY1BnS05qUUlkNFBDY3lECitQRmppczVFUGo3Smgxa3FZVE9IQUNQZ1J2K1JsSUhqNVFiOTVZSldJdWd5MVBjaS9lbzZKRXpwejNYQWhkRUIzRGR2Y0pIcjVLY1daCis2d2J6WUlRTmx2akE5Q2VZM3lLYk42R1FKTWg3Z3hrY0dFOGsySjRTajUwYnhVemh3Ukx6dTk3L01xL240TFdscUFueGpzT3Y3Y3crCis0VitITTFzeFdFbGlzbm5wWjdZWGtSWFBNYmRJdWNFbTRiVG9DMjRvVWNwT04vVzNIVktBQmI2NkZrZW9FaVlOS29qbzJjUU1BN3lYCitBNmRCTDc5akhsaUZValBNTlRobGVjOFdKNEZ5WWlpekpOakxpU2NWU0NJd0lnZkxEeFppUEhxSE1qSStKeUlkdXNBanpEaS82RW53CitwdTJoczNLdy9ISlBScnZqRGcrT0N6ajkzSWpFRHlTd3ZINm8ySERiWmdWWVhZSTloNjlndGdYZ0hKRzR6YXh0V1MzWE1iSnJUeHk0CitUZVVPL2p2QWc0WHpkZVlXck5KMXpJdUI5R0ZpM0lzV2dOWEwyTTZqVVc4VXpGeWtmMytPZVFwcWo3M3NsY1lJNk9VQVdINlFSeG8zCitRa2VzY3lQNm9iNTRiOEExcllGL1BYY0lKaXoraXovalV3VytvVXNmbnZkYUZySCt6UHdrMEFHOWh3OTVnV3dvaE45MS9FV1RSNng3CitiRXVFMHdMU2lhd3dSOTVrZnRLdGNwY2NyQlBYOWpza0h3ckJSRDRyaE5IanJQbzA4eVBXb1BOWXBVRUJpQURzVE95dXU0Q2tRbThuCis5TElzWW4wNW90OEhFWUdWdTY4S3lycFJjTFNEdDMrL3RqMGwzSEJDRVc2T3QxOHg3SlIwRE0rNitHVTVWaS9Nc2ZhWTFYRy9adjRYCitLTlRoYzZ3U3JQUGloTVJ0UUpGajlUNWlHL2dCUHUyL2cwOHpJM1ZYTkNUMFRhZ2NLdzBydlBVZTIwTjRVZ0o2MmEvMnNnVTVGbXB6CitRLzl4RndLZHFlVmxkR1llRDhiUXVDV0U5Mllxc0VRWjE4MXJzalRvaEhYTWZVR1hobUFWWU1rMTlhNXdLQk5pR2lVK1h0U1puMjZvCitZb2JNUmFyazVlSzdRaTg2N1IxZ2dmamd1TEk1NkdnQk01SlhKd2ZlU2d0M2hhTEdpWWN3ajZHOGJCSllhYnd1OElaMElKNG9lb1o1CitQT2o3RWV4bG53cU1TTUN5SnlFWllrUDVHNXErNEJIM2plUWxUWWprWGx4Q1BBa2ZTNnJEWUVrVEhRKzFtdVlhTzFPSG8wM1ZFTDdsCitQQjZzSkVGbmZHc013WkowaWVNandSQ21pc2RmVURnSCtNenB1Skg0N2dHQUpxR2hUSGlzSURCM2xNaW5FQkFzWHVFRUc4elovVEl2CitKd1c4YkJKWTRweWZlTGVRSjhiVE5FRmxIL0RGcTd4Y2dNK1VneEY1anRXeWJpaURwb25FNzVKUHBBYjc1VDRlckNUaDRENE1WaTZVCitvVGJoWnRza3VWbjRMb2x6b0praWJjSkVCeDZKcWhnN1ZDVW5JVDV4eVZueHRIZUVXTVpMbWxsZ3BRa1JTNXd2VHNKZ2pjekx6YzBjCitIRDlNblBVWGN5enY0WHVZUk1YWFYrWmxzeUlXZEUxbWYyYmNaaUh1U0JGTFJBN21xd2xCWGc0TW9pM3JibVllOGtjT0ZrenVFcTc1CitBQTIzUzdBR3ZxMVFxZ3FaSWZEMTdzSGorQnlyQ2gzY2FoZkFRa2MrSFl4YU5XK3g2MFpoOUcvQzZ1U0lZTzBUYi9adFArbVJjcXhOCit0cmdscXRTTVB5M1hMTEFDT1JidkxvZ1VCaXVYbnk1S0ZPOU1BM2VGSjBiMGV6SG90RUxJbzZrNVZ1OUU1aFl4WTM5ZXpMRndaNWJGCitJN0RVWHM1UnBQMFFqSm8rZ05VRGhqTmw2RFpIZmxkWWg4RTY4Yk5CMnhURDA3N0FYZUdtQkhUM2FocFpmMlllbEMyZUZpckFRdmRUCitUTC96Z2J2QzUxQ0doWFZSM2hWdU5Rc3MzSkRNOWlvNVdMQTMrMjFUZ3lWTUNpbHZKdmVaQ1ZZaDhzaTVVV2plUFlCSklDWEdFZXM1Cis2T1V1bVpkejVHbS9YNWd0akJTc0xoaWY0Zm1YWlBOWWZ2QWhBZ3ZOWXowa1c2NVVnQVdldDlsZU5Bc3JQempjUDY0bThHNnBHcXhlCit4dFlqbTI2WWFCTzZFcDRtWnU5ZVB5Z3pENnh6VjBqeldMQ2hyWEt3d0xrUmFOeFRnQ1ZPY3AyVHpiTWhMNXNMRnBvekdNcmNjb0VQCitzcU9ZcHdKTjkyQ3dkdlpQVkhoWkFWYVhsRWhHT0JRS2NVaytsUXp2QjYvRmxQZnY5MVJna2VWYU9WaitYdmhsT0drV1dUaUlCNjcrCitoSG9vZk5QMjNYWVpXT2V3Ky96cTB4YWJCNVppaWgrNlN3NFd6aE9FNUYxVTROSkUyKzlCc0plSG1ENlB0Y2ttOGlSZldnR0g4YXdwCitkTmRkU2krTFlIbDVNUFpIQXBZQVpzc2pEQjU4WVNPSndscmh6aWRzYUFVQ3lOWUtmWFdMYjdiWjZnSmdlY0dKd2JhN3pOcytFRmpGCithdGw1ajQyWnJKZ2dQVHdVZXlzd1FXak1HWEVBQUFKcVNVUkJWUHBlZjM2NmdWOHJQQ3VkZHA5cFlQR0xrcnk3SHJFeDQrUmdvVFVvCitZYm9oVTV6enMvRkJMTWpMZnBQQmd0RmNYSVNlS0s0Vm50KzNPTUVXaDE1OXF2VHk0NG9KMG50SUp4eFVZS1VWb051N25PRU1qczVlCitZWGNET21Kam1ISEMxL0Y1RzlyZGtJdFd2NkVLZnNYTSszTU1zODBzcnNSMWQzaG5BeFdNbTlMS2c1V1RoM1RPVEdEVU0rK1BNR2dNCis5UHJBNFZIOGFkaUtLYTNtNlllMlVVanV3aE12QWJCZ2FuTkxLNDVZU2RqSnVYZy9oaDk3K1o0UVhqWVRMRGdZM2lYUS9RUVQ2TXh4Cis3d1M4UEZuMDhsbitmaEk3T2VkbUpvNXdVakQwZml4bW1MUnNzMjQ0bmhleTJjY0pXM2p3ZnF3RWZyL095Q1U5d3YyMUNOYWxFY3dnCis4d1pEYWFjUVk1OXlpRS9ObWNCV0lUem50NVd4aTJEQkFDSnNRaEgzWS9Hbm1TaTk2OFNHa0x1OGFEOVdqclNNMGg5dmVBanN4N0x6Cis4Mno4TnE3NHdHbG1nWlhHekJXL0Fac1lLYmtTOTJQRjR4aUJzNHFXeFVQa1h2YUZCQ01jc0VweTg3QW9kMXJ1TEpsYndHL0hsTzB3CitoTWNLbG40b1pEZE51WG1CVCtkT05tOFhLY3FZZGhiQ2xqZExxMnNGdk1vRlMvbU9CSFU1YzZVQXNpNTNzc2lSK2pUekJEYVV0N1NzCitTYndKelNtVGRIOCs5M0dZWDFUbENFNHVVeWdEdlp5bjluS1V3U3JKcVpMZVBaTzd0TnNydEhVWWRURHVURzlJTC90a1lCQXZPUm51CitlZmY2WmIwcVNvL09jQURNM1BmdTFWSFdxM2ZBcjJkamxObFh1ZFFYZENUWWpWNEw2dUNvZGZFRzk3UndTTDduWGEyelB3S3dxRkNKCittbEN3cUZDd3FGQ3dxRkN3cUZDaFlGR2hZRkdoWUZHaFFzR2lRc0dpUXNHaVFvV0NSWVdDUllXQ1JZVUtCWXNLQllzS0JZc0tGUW9XCitGUW9XRlFvV0ZTb1VMQ3FYcS93L2didWRqSTZiTXdZQUFBQUFTVVZPUks1Q1lJST0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9jcm9wLmdpZi5iNjQgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvY3JvcC5naWYuYjY0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZDkzNmEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvY3JvcC5naWYuYjY0CkBAIC0wLDAgKzEsMTA1IEBACitSMGxHT0RsaHVRSkdBZU1BQUFBQUFIOS9md0N2QVA4QUFORUEwZEVBQUs4QXIvLy8vd0NPQUFBQTBRQUEvLy8vLy8vLy8vLy8vLy8vCisvLy8vL3l3QUFBQUF1UUpHQVFBRS92RElTYXU5T092TnUvOWdLSTVrYVo1b3FxNXM2NzV3TE05MGJkOTRydTk4Ny8vQW9IQklMQnFQCit5S1J5eVd3Nm45Q29kRXF0V3EvWXJIYkw3WHEvNExCNFRDNmJ6K2kwZXMxdXU5L3d1SHhPcjl2ditMeCt6Ky83LzRDQmdvT0VoWWFICitpSW1LaTR5TmpvK1FrWktUbEpXV2w1aVptcHVjblo2Zm9LR2lvNlNscHFlb3FhcXJySzJ1cjdDeHNyTzB0YmEzdUxtNmdRQzl2ci9BCit3Y0xEeE1YR3g4akp5c3ZNemM3UDBOSFMwOVRWMXRmWXhidGgyZDNlMytEUkFlUGs1ZWJuNk9ubDRlenQ3dTNxOGZMcUFOdGc3L2o1Cisrcy96L2Y0Qit3SUtIQWpzbjhGMDlleDVJY2l3b2J1REVNMUJpMGl4b3NXTEdETnFySmhRSVpkay9odERpaHhKc2lUSmlTWlRxbHpKCitNbU5IajFxK3RSem5zS2JObXpoekRvejNFaVlXbVRONyt2UUpnT2ZRbU41bUFqekt0Q2c5cGorVEJvVTYxQ2xDcWxhQXRoU0tWWmRWCitkRnk3TnRIS01xeFlXMS9QbVQyYmhPekt0V3hscFpVWUY0cGJsWERydnBxN1RxK1R1K1VHQ0I1TXVMRGh3NGdUSzE3TXVMSGp4NUFqCitTNTVNdWJMbHk1Z3phOTVNbVZ4ZXYwRUFreHNnOGpOb1ZYTkowenk5UlBRNDFSdE5zejZWMnZQc3RsTFR3ZFlvK3phcDJxdDlHM0VkCitZTGRMNGJHQUwwVk9oTGh4akwyWmYxSWVYYm9NNTZXdHQ2S3VQWFJ1ZE04dlZ1K2VpVHQ1SDloRGpqOXZ5ZnlJWHJUVzgwZ2ZPNE9DCisrL2p6NjkvUHY3Ly8vd0FHL2lqZ2dBUVdhT0NCQ0NhbzRJSU1OdWpnZ1JlNEo0SXdCeEJnNFlVWVpxamhoaHgyNk9HSElJWW80b2drCitsb2loTUJiaTFrMDg0VmxrbGdMc1dRS2pCUkpxZ0l3RUJKUnlZNFVxWnNOaWRoak1HT01rUWxMZ25qRVJ3a2RCanVWcGsyUUZUQjVCCitIMi8yRFVsSmtSTlloV1FLVVRLeUpRcGRGakhsY1VGYVNhUXhvOW5HUXBoL2ZDa0RtME9NQ1YyVlpoN2lacGJud0NZZkJuREtjZWNPCitmWHEzb2pvdGNrUm5uWHI4U1FHV0V0UUlwaHVLRWhFb0VIS0tkeWdIQ1VpUTZRRUpkRHJFcGhXQTJvR28zVVhhQWFNSE9IckNwRm1ZCisyZ1NyNkgyWEo1QVhvSHFCcDV4eXVpbXBQZkNhNndlKzZ1V3FDYWlxYWdLc1RBeHJCYkx6L3NscVRxRVV2V2dCcUx2aVNxcXZuWHBxCityYmJaVHBEdHQ5emlTc0czdW5LcmFhYmtsdHV0V01xK1VPeXN3YTNBN0EvdGZqR3ZEcFc2ZUttM3YrYTY2N2kzOHZ2dnVRTHpXN0NtCitBSjg3OEwvVzlvdXVSL1hpOE82emFzb3JSTVJvM0p0RHZvYVdPZTJ2NElJYzdMVUlFNHp3dGQxU203QzZLWjhNTHNtellCekV4SUZWCitySUxHSnNnY0I4NDNjQnp0dmdxSFduS3d1cDVzOHJyb1Zpdnd3RWMzREhMUi9qS2NpczVLMEp4bXZEZXpRTFVlUE52Z2MwVFNCaXgwCisxT3VHNm5TNTZub2I3c3NxcDEzMnd1SWk3Y25XVTFqOW1zMWNoa0QzSUYzWDhEVkVZZTlBdE5pMzdNMkYzY1hoL1dnRmhqUFNOdzEvCitIeFM0Q1M5N01QakgvdHM1dVFmaWVxYlF1Q1dQenhDNVFaUG5jUG5Zb1h6K0J1ZUtZK0JtNkozQUhzUG8vNVRPbXVwNXNCNXZ4TEp2CiswdnNMdFB0ak8xVzREMEt6NnI5bmtud0x3ZmN6dkZlYW02SUFtbmRqbmZjc3kydnRiTTNxQVQyS2toa1VMd2o0U1JJVEliekxXWXg5CitqOWo4MkwzSHZ5bGppdnplRzF0QzlxQ3pmNDM3OWNFUGlnQUNDQVlBQjBqQUFocndnQWhNb0FJWHlNQUdPdkNCRUl5Z0FWTVZEQkxvCitMbjFaV3g4U21qZVA1MjFDQUVZaVh5cEFHTUwxWEhCUEY4QmZKVlRvdWUxZHJYKzFHZ1VKWlRIREZKeXdCU3ljUkE1UHdFRjVlRkFUCitOWVJGRUU5d3d6WFJZb2M1YzJIMVlHZ0JXMzJRRmtNazF2a29acjNGeVFLSkplaWgvbEg4OTRrb3RzS0xGcHdpOXpCNHZTdnF6eHI4CitveElYUFFIR1ZiUlJCRVZVbnhrM3FNVEV2UytHb25qakJCQ3d4d01nNEkrZDBDTUk0cGpCT1VxcGp0QUNtL2M0SVVoQVN1Q1BmUFFqCitJMWxBeURMR0Fvc2swT0pUMWhoSUMwUlNrcERzb3lnOUdVcEFodEtQcDZRQUpEOXBCMEYrb0pKV3ZPUVpxNUZHTXVFeEZGSGtZeVIxCitPVXBXcXJLUHZIeWtKSVhaeXp5NDBnT3dYTlVSWjBtTldzNkprNVAwSkNoWEtVeEhYc0NYd1FUbEtJZTVoMk9lU293dlJLRUZNT2tJCitjazRJa2JScW9neXZhVTF1WnBPZDFVUmxOWGVwU25yaXdac2NTT2F4bGtuSFFla21uUlZ3SWhBeGdNMDlydEtYQnJYbkthbEp6RlRlCitBWjhiME9mOS92aDVTSCtDQjZDTFdpY1BFQW9JaUdwQW9pUXdwK09ZT1ExbldncWFUMFRCUVRsNlRVTjR0SDdvRXllVUtEb2NkTjVSCituWG5zQVV2OThGSk8yaStrTkJXVFRaa1lVSTNTa0pMZ1hLSk1seFRVNWd4VmpiZjhIeFNSU3FPWTRyQ3BjWHFxTFhHS3k2bXVBS1FqCitFT2tpeFBvQlRWNEZwUU9kUlUramlpY3FrakdXc0NDckI4d0tsa1dtOUtoZlRhb2QzNnBNRFZiVVI0VEM2QVFFbW9tMXNwR3FqTE9xCitFZjFhVTR1aUQ2cGNsYXBhRVdza3hjcFJsdjBFN0Q5dld0U2NUamF2VlhYclVpY2dWMFNVbGdOMFZZdGQwNHBYRllCVkJLYzFSR3h0CitwTlZuc3ZXd24zV3RYanUzV0VNMlZyTVg1V3hHUGR0YUcrNjJkZnRrckZBZC91dFd5SGEycTdrMWJtakhPRm9jWWZWaXRUM3BiVHNaCitYUlM4TmdTekpVUjRYWmRkZmFHMXNGN1Y3WFREZVZYbE9wVzVZM1R1Y0tGYlhPOGV0NHA5OWUxeWdmdllyVDVYc3ZVbDRuMzVtbHo5Cit2cGUvemZYdmZBRWNDOFArdDYzVWJhK0Jzd3JmRjhwM3NFWnRNR1Voek43ZVl2YXY3UXVzY0RGTVhBMkROckdpbGZDSGZ4dml6UkoxCit3VjFNcjNSUkhHRVB4NVdrMGpDcGViY2J6UUJMY2IxS1ZmR05NOXZpNEw2WXhQUTFzWHBwM09ITERobkUreFB4a1NWQVdFdzR1TWN6CitybXlLYmZ5SzhaWVB3ZkZWTUpJWkxNUU5OOHF5aFZ6eGZvdmNYOXRHTnNiZEZUQ1E5MXBkSHJtWHdtQzJzSmlwbk9FeW4xakxOWFp5CitsM0VzL2c0cFg1alBKZmJ6a2dIZDVEUS9tY1ZSZHZHaEQxRGxTMXo1cmxubWNKQzU3QW92MDZpOEhlTXhwaFdkNlROdldkQ2RKalJLCitKTDFuU3ZmNUZaZEdOSk0zamVwV2VKcHhvUDdaZWEwc1kvdk9tYmUxWnNXdFM1am5KVTY2MHBhSU5Yci9yR2s2QzNuUVJJNjBrWS85CithbGNvKzdzZ0dMWWZ0TjJvWEN0eTE1YnV0WnhuN1d4TzIxclYvREIwcTVGZENXWHptdG1tRHJTam9RMWxOS3JielEvR3JZOUxnTzBQCitjSnNQLzA0dFhjQ2RiSEgvbU56QW5uZXFvMjF2VnVNYnh2cFdjcWxUaFdaTFBuck4wbTZ6ZHQ4Y2NWTDdHdUhJbmVpZHNWdGhZNis3CisybDgwTThWUHJmQnpNNXlXOTk1NHZybTc3ekQrT3VSQUhibWdpcjFYL21vbkd0WXEvMmxZcjd0ek5pZjQ0V09HYzgxSDBHOFAvSHNQCitBZmMyNEZhNzdLWERjY0IxZmpyWDBPME1IWWVhNHpTWCtNY1pUZXVXQzV2cnpmQzZya1hOV3JHUG0remxEdllxb2w3eW5wLzg1OVlPCitlc1hoU205SU4zemFkMCt5eDkvZTdJUmJ2TzhZLzd2R2R3eDJMQS8rNEhBM1BOOFhYbStZTzF6bUVBLzc0L21OOVdkVDN1K1dCenpTCitaVTFtb01ONzVmSSsvT2NUSC9yRmYzM21qamY5b2d1UDg2SHJuRkpTbHh6VjMyMzFFRFM5QTFyUEE5MTVuc2lwRTd6ZEJ1Zjh6ZkZiCitZRFVmMk9oaEhyMnI4Wjd5MHdzZHRrVEhmZDJMci92alU4TGQ0YmIrM3ZQcmZEeERYOC9TWi9mM2syOXprRE5mNUJNbU9mRUZTM3FsCisvcnNkOHJSL2Y4N2pYL1NNSHgzelNkZHhzamR4MXdkZTJVY3Z1VWM2dXhkK3ZUZEluV2R1Wi9keXpSUnpqQWQ3b3phQVk1ZC9CQVovCis1U2QvNTJkeTZZZHlySEJ0RHloM3FqQjhIMmgzSVVoOUk2aDNMS2Q2TGxkNUUzaDVGWmg1c1pkMzR2ZUNreGVEb0RlRG9nZUE5U2VBCitPRGg3OGRab01CaUJNbGhTRlBoNk5uaUJRMGlBNDlkOEYvZDgvaGQ5UURoOWdvZUJoRmVFWlhlRWM0ZDJ6S0IyMzhaMlZYZC95dWQrCitHN2gvSGRoL2l2ZC9OUmlBbXFlRitNZUZjV2QyWHlpQlNraURUQWlITjFoOVJJaDZScmlEU05pRGVmaURieGlFY2ZpRUdVaUhra2QrCitVMmgrVlloK1Y2aCtreUJCbG5pSm1KaUptcmlKbHVpQ3FTZUkvbmVZaERtMmhHdlhlSnpnQ3pFalFreFhnblo0Z21DNERHSm9mR1M0CitDY0FBQzdYWWZwRlhlOWgzZXdpNGZmU0hoZkdqaXF2d0MyZVlpL3BuZS95bmZmTTNZb2lZT3Fob2k4OTRkY3VYaHNpNGhzcVlndHluCitnTjVYSHQxbWk5M29lNnpvaGE2SWg2T29oNlZvZ1RwU1orM1JHNy9IQWNHSEJ5Z1lpU0E0aWRDWWlzZ1VqcUE0anFKWWFPWTRocVk0CitOZXBZQ2NJNGN3V1liUWNZSzc3SWpNQllqM0t4RnUyNEFlOTRCL0hZaGxaNGlBdVpIQUZKQ1FQNWtCb1FrWFl3a2EzbmhudllqQXlKCitrV0JYa1A1MmtEMGdjSDJ4alFCcGozQ0lrazZua3MyU2tGTjJrV2lSa1pPZ0pCeVpBUjVaQnlEcGc2NTNqazFZQ3dNNWpBRFEvcE44CitRcE03d0pJaFI0bDdvWk9Tb0lveUNYeE1pUzhKV0RzTGFKUlMrUWd3UWo1VjZZNVh1VEZaS1R4Ym1aT3ZJQ1JLRXBZUU9aWTQ0SlR2CitCNVh4MFpXS2dDVytFSVVjK0lnZUtJOHFTSTlZY1pTaVVDeHAwWWhTaUhoVVNKR1NhSkZ5V1RoMFdRanYwZ3VCNklpR0NZbUlPWStLCitHUmVBMlFuSFV4U0VtWmVUdVplVjJaZVhXUmVacVFsMkE1bkh1SXZKMkl2TGVKT0x1UTJsZVFtY0E1bFo1NVk5VTViT2M1WkhFWnRYCitjbCs4bVpLOGlKQ3Q2WE8zMDVoNmNFSy9LWmJCdVpLNDJVRzZTVHpHZVFkRmxKdythWnRlMDV3KzlKeC9HWjEwUUVqVU9VN1c2VGZZCit1VVd6S0N6Y0dRZXc5SjJrRlo2UU01NmJWSjUrb1o2RS9xQlA2dm1UZEJDVWhUaVUvb2lPdHlHZmdRQlMxR21mYzRDZjVXaUlJNG1UCiswdUdmZnZCYXZ5bWdja0NnL0dpZ1JNbUgxcUdnbTRPUDVHV1Z5MW1Ud3hsNFEyS2hlTkIwbWVtZ08vT0t5aENMM1FlZnpBR2lkZENPCitSMG1pY0FDaHF5YWgrMW1VNThHaWNzQ1J3Z2lqYnlDajZkYVBzdmlQTVlLanE0T2haZFVUUE9vR1B0cDFwRmlqRkdvbVJNb0dTdm1OCitkcmFhd29tTnYvaWFDWHFlaDJPazUxU2wxc2lhV0txUVdscWhYSm9GVTRwcjdDazY3bmxXS2dxbFoyb0ZhUW9sVVpvLzVCaWgraG1rCisvSWtvSWZRSGM4cFVGS1NYYkJpU0ZYbWdaY29lZFFvR2Y3cWVXUktuZ3JDa2FkZWtlbXFqZlBva3grbWxha2lscVFDcC9tRW9xU2txCitwSldhb1NHS3FkWFlwNXRxb2lEaHFkcjRwcUZxcWkxS3FxcHBxYWJBcWJDb3FscnBrcTNhcUs4NmpiVzVBWWxxV3FpS0RDaTZxcUNhCitxN1ExQjR0cVhSM3dxNFZBcXlkcXEyYUpxOGJxcW02UXJHQ0tXbzRLbE1GNkRNTjZxNnc2cmJJcXBiQnFnSHFUclErNnJkUURwSis2CitwK0M2ck9icUE5YmFOY3k2YmVoYUROMGFyZC9hcnFLYUJ2R2FSSnpnckttcXJzVEtydm82VisrYUEvM0tRd2ViQmdBcnJOQ2FtOUphCitzUHRLQmdtTEF2TXFrZlZLRFBjS3Nma3FzY2RLc2VOcWtDdHdzZmVac2NPd3NjNFpzUjRiUGdzYkF4VTdzaTBiQmczTHJRK2JzaDI3CitzcjRhc3kzd3N0b2pDVE9icmpRNnFVK0tzLzdxL2dVOHl6dzZ1d1UvYTY4MW01MHFTN1E1MndWSDZ3SWt1d1pMcTdGTlM1N0ZDclZaCitsTFRGcUlHOTJwNGpkYWN6bXFmclNxbGNxN0JvR3JMQWVaMktjTFVubTdYdnViVnBXN1JWTUxWc0NxeGsrNk5CZTdaRFc3Y3FVTFV1Cit5N1l6MlpSZSt3UndLd3dvNjdRM0M3amxXamVFcTZITklsNG1xN2h5NjZaMDY3Z1dlN2d3cFlPU2laV1BXcm5Cc0xoYVM3Q2FHN2ljCitlNUo0bWFuTUNRaUpPN3FYVzFkUGU3cGZ5Z1I0TzdsOThMb0ZFYnVxTmJ1MFc3dEpjTHV0QzNXaXU3c0M2NjJaKzdzd0c3eVJxNXcxCit0WFY3eTZUSGk2L0pxN3pMYXdUQ2kzdndXTHkvUUxwemE3cldTN1U2bTczZThaSGNlNWU4TzNDTkc3NmJPd1RrL290ZEpSdTlrVHE5CitIRnU5N0l1ME05TzhiZmtFZ3ZzcTU0dWE5R3V6OW51LytBdXYrdHVSVXRDL1NxQzczWnUrTGJtK0JJeTZQZkMraDZTay84c1hpV21vCitFUXkvT2tEQmRNUUdESXkrQWN5NEE3ekJ3SE9lSG93YmFoRENBTnkzQTR1MkpueWJONURDU3FEQVFjRENHR3laR2h6RFRsVUROTndhCitxUXVCMThpWDJZaTg0TXZEYmlzRFA1d3NRU3lPVjByRVdZckVGUXdEU3p3V1RWeVlsRW1vR1R5aEpDbkZDT2d1QjF5ZDNIREZwWHFZCitXcXpEWEl5Z1hseStuaGlaV053Rk5td0RPT3k5bUh2RWEweVdPZmlKbi9zRmNUd0RjK3pBVDNuSFFBeUZudnZHOTBER3prdUlCV3EyCitML3kzZ3F5OWN3aUlYWmlQZkl6SVlyeVAvbVVya21sOHFJOHNubC9MaUxwSXJtclF4MElzcGxCTXBwMzhGK05SeFVoQkJYODh3cVVMCit3Nm5NeHE4VXhrdjVCcVM4eDRNcWxKcnNwRjA4eTg5N2o3enFlV3VReTZ5YnhieGNxSnNNekZFUW02eGN5VTd3eWk1c3hMTE16RmtWCitVYmFjUW5aZ3pHMnJ5SGpheTBMN3k5Yjh3VDYxdW1Yc0o2a3J6WXhNelk0OHpsTk1rT1ljcTl0OHVPb016bjRyenU2c3dwbkhsZ2k4CitCOXg4eTVqTXQrdE12WGFjenoyTWlQeDh5ZjRjcy9Xc3pMNnN4Z2F0eWppWjBBRGRCLy9NcUFFdHZkTk0wTlVjMGVTTWhtSGJKdS9hCiswRnY4MEp6czBUOHdQVDFCMGRvOENOeE0wbWhzMGloOUJUTUNQaXdObm9XUXl6QXRtanM4MDFSUUpQQngvdE16WlNkY3V0TkZ6Tkh0Cis3Tk5Id0NndFBNbTZ6QXZjYWRSUnJOU1ErMmxmMFpuSG5OUEdLZFdvVE5WU01ER29pZFhuVE5RMHdOV3U2ZFZmRFU2OUlOYnl2QWdYCithOWJFaWRaT2dEaW9HZEtPd0t4dzdhRnliYnZIRlkydG1BaUptdGNydU5kTmdKeWw3TmJWSmRoK1NkaDhQY3c0eWl3R01BR1JiUUNVCitqUUdSblFLWHZRV1BmY0YwTExzUXpOZytYSUlnaWl5VkxRR1VmZG1aVFFHcGJRS3IzY3BQYmNxaGVkVDFXOUNnamJEaHFLQnNrdG1UCitYZG9Ia05xdFhkcW5MZG03ZmRxVlRkeTdQY2FHUE1TeFBkVzF6YnpEL0duSFBObW0zZHVTWGQwWElOM1RUZDNhamRvVndOMWlJSitLCitQWnJOalFRUzlaMXdJdDNHUGQyOC9tMEIyTDNkMmUzZHhKM2RZMkRlbkEzSWNUbmV6ZzNTVWR2Tnd1M2IxZDNhcXQzYjhQM2U2bTNkCitBSDdJSXB2Ujg3dlJzOTNSK0QzRDQ4cWJmYkxhdXAzZTdHM2F2RDNnMUczYzdXMEdFbDdmc1B5OUR2N2dvZjNjN3BySW9sQ2E0ZDNUCitKTzYra1F1WXNzUGhnTDBXSzc3TUxVNEVEN21XUTQwS09nNm9DdDZwSVY3SEkzN2pnMnZpNTBRK1NWb0d4SWpSM3B6SkRoM09FRTNrCit0bTNrUjk0UlNhN2swVmpqTWkzbCtVdmw1ZnFNVjA0R0ZhVGxVSDdTWEw2RmtseUgvaHJtWitBTFpIN1BVWDdtSmE3ZmEySWlkbjduCitlSjduZXI3bkpnTGlEQzdBdEMzbmVlekc5d3VYRzJqbWdyNktYaDdCaHY1RGlUNEQxcXF2amE2ZC9vLytoMEs5c3BQdXU1VXVqWFRPCit3NW4rMlpzT2pvdE93Sjlld3FHT2kyQXJ4YVVlNktldTZKMGV3NnMrNUszdTZzWklqZFliNjBrOTYyaCs2UjZMNi9pczY0dVk1bXl0Cit2TDRlNThBZTdMd3VzY1dPNk1lK1hjbGVzTXZlN0VxY3pVUWI3ZEpPeGRTT3M5Wis3UzRRNmUyNjdkemV4azVONm0zcTJhWWU3dVZjCit5SVZlN3IwTDZ1Z2VrL0ZNN095dXZ1ZHVyQVVnQWZkK0FBV3c3eitRN3lmZzc5ODA2dXR1azNGOXV2eXU3L3FlN3dDdkF3dFBBZzMvCitVZG1PNmZQK3dQVnVKZjUrNy91dThCWHc4Qm1QOFFyUDd4MC9BUjAvOGdsLzhDS2Y4Zmh1OGhwZjhoNFA4aUhmdVhwTTdnQXc4d0JRCis4elovOHppZjh6cmYyZTFlL3ZFV2ovQUl2L0w0ZmdFWEQvUVhYL1JGTC9KQXYvUkxyL0pEYi9RcHIvUW1EL0VDejc0NmYvVllqL1U4CitUKytzamlnWXovSmZuL0FZc1BCQzcvUmtqL0pKLy9SaS8vUXIvL0ZLei9KVS8rb21uUFYwWC9kYlQvRmRYeWNvLy9aQ2J3RUhIL1ovCisvL2RyYi9aOUgvaHR6L1lwci9GcDcrengvcnQxLy9oWGYvZUI3TGhrUC9RazcvZUNuL2h3ci9ramYvbEJ2L2Q3di9tS2ovYWhuKzR4CitQL0NRbi9vNXpOTTJqdElQbndHdnZ3UGVEcTZxWC91U2Y5OUkzUGtlRVB0RTcrSlZINzYxci9xM2YrZyt6ZnQrNy90eXY4SEJuL3JECis3K2p2THVySnorakwvL2pOVCtuUGIvcUVidlhUYi9mMmZlZ1A4djNnSC83aVAvN2tYLzdtL24vKzZELzcwN3I5M0s4Ym5QSCs4Qi8vCis4ai8vOUYvLzluLy8rRS8vb2V6NDdKLzFTbUhKRUhEa3BOVmVuUFhtM1g4d0ZFZXlOTThSQ0ZhMkJWQTRsbWU2dG04ZzEzZSs5L2xXCitVRGdrRmdPdlcxSzVaRGFkVDZoU1ZVUkdyVmRzZHZuamRudEdjSGhZMVpiTlozUmEzWmtTeVd0NFhGN3oxcnRpdk5pKzUvZjlmOEJBCit3VUhDUXNORHhFVEZIYU8zdVVmSVNEYTd2RXJMUzh4TXpVM09UcjFBejFEUlVkSlMweUJIU2RYVnlMM1RWOWhZMmRtalJkdGIzTnhCCisyaU5XMzk4NVhlRmg0bUxqWStSazVXVWVZT2RuNkdqcGFlcHE2MnZzYk8xdDdtN3ZiL0J3OFhIeWN2Tno5SFQxZGZaMjkzZjRlUGw1CisrbnI3ZS94OC9YMytHMzcvZjRBQkJRNGtXTkRnUVlRSkZTNWsyTkRoUTRnUkpkS0xBQUE3CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiLy5naXRpZ25vcmUgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiLy5naXRpZ25vcmUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvLmdpdGlnbm9yZQpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi8uZ2l0aWdub3JlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2F1ZGlvLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvYXVkaW8ueG1sCnNpbWlsYXJpdHkgaW5kZXggNzklCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvYXVkaW8ueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2F1ZGlvLnhtbAppbmRleCBlZWI5NmI4Li5kNjQzODYyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2F1ZGlvLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2F1ZGlvLnhtbApAQCAtMTQsMTcgKzE0LDE3IEBACiBhdWRpbyBkZXZpY2UuCiA8L3BhcmE+CiAKLTxzZWN0aW9uIGlkPSJhdWRpb19zdHJlYW1fc291cmNlX3QiPgorPHNlY3Rpb24gaWQ9ImF1ZGlvLXN0cmVhbS1zb3VyY2UtdCI+CiA8dGl0bGU+YXVkaW9fc3RyZWFtX3NvdXJjZV90PC90aXRsZT4KIDxwYXJhPlRoZSBhdWRpbyBzdHJlYW0gc291cmNlIGlzIHNldCB0aHJvdWdoIHRoZSBBVURJT19TRUxFQ1RfU09VUkNFIGNhbGwgYW5kIGNhbiB0YWtlCiB0aGUgZm9sbG93aW5nIHZhbHVlcywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgYXJlIHJlcGxheWluZyBmcm9tIGFuIGludGVybmFsIChkZW11eCkgb3IKIGV4dGVybmFsICh1c2VyIHdyaXRlKSBzb3VyY2UuCiA8L3BhcmE+CiA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBlbnVtIHsKLQkgQVVESU9fU09VUkNFX0RFTVVYLAotCSBBVURJT19TT1VSQ0VfTUVNT1JZCi0gfSBhdWRpb19zdHJlYW1fc291cmNlX3Q7Cit0eXBlZGVmIGVudW0geworCUFVRElPX1NPVVJDRV9ERU1VWCwKKwlBVURJT19TT1VSQ0VfTUVNT1JZCit9IGF1ZGlvX3N0cmVhbV9zb3VyY2VfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8cGFyYT5BVURJT19TT1VSQ0VfREVNVVggc2VsZWN0cyB0aGUgZGVtdWx0aXBsZXhlciAoZmVkIGVpdGhlciBieSB0aGUgZnJvbnRlbmQgb3IgdGhlCiBEVlIgZGV2aWNlKSBhcyB0aGUgc291cmNlIG9mIHRoZSB2aWRlbyBzdHJlYW0uIElmIEFVRElPX1NPVVJDRV9NRU1PUlkKQEAgLTMzLDYxICszMyw2NCBAQAogPC9wYXJhPgogCiA8L3NlY3Rpb24+Ci08c2VjdGlvbiBpZD0iYXVkaW9fcGxheV9zdGF0ZV90Ij4KKzxzZWN0aW9uIGlkPSJhdWRpby1wbGF5LXN0YXRlLXQiPgogPHRpdGxlPmF1ZGlvX3BsYXlfc3RhdGVfdDwvdGl0bGU+CiA8cGFyYT5UaGUgZm9sbG93aW5nIHZhbHVlcyBjYW4gYmUgcmV0dXJuZWQgYnkgdGhlIEFVRElPX0dFVF9TVEFUVVMgY2FsbCByZXByZXNlbnRpbmcgdGhlCiBzdGF0ZSBvZiBhdWRpbyBwbGF5YmFjay4KIDwvcGFyYT4KIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIGVudW0gewotCSBBVURJT19TVE9QUEVELAotCSBBVURJT19QTEFZSU5HLAotCSBBVURJT19QQVVTRUQKLSB9IGF1ZGlvX3BsYXlfc3RhdGVfdDsKK3R5cGVkZWYgZW51bSB7CisJQVVESU9fU1RPUFBFRCwKKwlBVURJT19QTEFZSU5HLAorCUFVRElPX1BBVVNFRAorfSBhdWRpb19wbGF5X3N0YXRlX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogCiA8L3NlY3Rpb24+Ci08c2VjdGlvbiBpZD0iYXVkaW9fY2hhbm5lbF9zZWxlY3RfdCI+Cis8c2VjdGlvbiBpZD0iYXVkaW8tY2hhbm5lbC1zZWxlY3QtdCI+CiA8dGl0bGU+YXVkaW9fY2hhbm5lbF9zZWxlY3RfdDwvdGl0bGU+CiA8cGFyYT5UaGUgYXVkaW8gY2hhbm5lbCBzZWxlY3RlZCB2aWEgQVVESU9fQ0hBTk5FTF9TRUxFQ1QgaXMgZGV0ZXJtaW5lZCBieSB0aGUKIGZvbGxvd2luZyB2YWx1ZXMuCiA8L3BhcmE+CiA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBlbnVtIHsKLQkgQVVESU9fU1RFUkVPLAotCSBBVURJT19NT05PX0xFRlQsCi0JIEFVRElPX01PTk9fUklHSFQsCi0gfSBhdWRpb19jaGFubmVsX3NlbGVjdF90OwordHlwZWRlZiBlbnVtIHsKKwlBVURJT19TVEVSRU8sCisJQVVESU9fTU9OT19MRUZULAorCUFVRElPX01PTk9fUklHSFQsCisJQVVESU9fTU9OTywKKwlBVURJT19TVEVSRU9fU1dBUFBFRAorfSBhdWRpb19jaGFubmVsX3NlbGVjdF90OwogPC9wcm9ncmFtbGlzdGluZz4KIAogPC9zZWN0aW9uPgotPHNlY3Rpb24gaWQ9InN0cnVjdF9hdWRpb19zdGF0dXMiPgorPHNlY3Rpb24gaWQ9ImF1ZGlvLXN0YXR1cyI+CiA8dGl0bGU+c3RydWN0IGF1ZGlvX3N0YXR1czwvdGl0bGU+CiA8cGFyYT5UaGUgQVVESU9fR0VUX1NUQVRVUyBjYWxsIHJldHVybnMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaW5mb3JtaW5nIGFib3V0IHZhcmlvdXMKIHN0YXRlcyBvZiB0aGUgcGxheWJhY2sgb3BlcmF0aW9uLgogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgc3RydWN0IGF1ZGlvX3N0YXR1cyB7Ci0JIGJvb2xlYW4gQVZfc3luY19zdGF0ZTsKLQkgYm9vbGVhbiBtdXRlX3N0YXRlOwotCSBhdWRpb19wbGF5X3N0YXRlX3QgcGxheV9zdGF0ZTsKLQkgYXVkaW9fc3RyZWFtX3NvdXJjZV90IHN0cmVhbV9zb3VyY2U7Ci0JIGF1ZGlvX2NoYW5uZWxfc2VsZWN0X3QgY2hhbm5lbF9zZWxlY3Q7Ci0JIGJvb2xlYW4gYnlwYXNzX21vZGU7Ci0gfSBhdWRpb19zdGF0dXNfdDsKK3R5cGVkZWYgc3RydWN0IGF1ZGlvX3N0YXR1cyB7CisJYm9vbGVhbiBBVl9zeW5jX3N0YXRlOworCWJvb2xlYW4gbXV0ZV9zdGF0ZTsKKwlhdWRpb19wbGF5X3N0YXRlX3QgcGxheV9zdGF0ZTsKKwlhdWRpb19zdHJlYW1fc291cmNlX3Qgc3RyZWFtX3NvdXJjZTsKKwlhdWRpb19jaGFubmVsX3NlbGVjdF90IGNoYW5uZWxfc2VsZWN0OworCWJvb2xlYW4gYnlwYXNzX21vZGU7CisJYXVkaW9fbWl4ZXJfdCBtaXhlcl9zdGF0ZTsKK30gYXVkaW9fc3RhdHVzX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogCiA8L3NlY3Rpb24+Ci08c2VjdGlvbiBpZD0ic3RydWN0X2F1ZGlvX21peGVyIj4KKzxzZWN0aW9uIGlkPSJhdWRpby1taXhlciI+CiA8dGl0bGU+c3RydWN0IGF1ZGlvX21peGVyPC90aXRsZT4KIDxwYXJhPlRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHVzZWQgYnkgdGhlIEFVRElPX1NFVF9NSVhFUiBjYWxsIHRvIHNldCB0aGUgYXVkaW8KIHZvbHVtZS4KIDwvcGFyYT4KIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIHN0cnVjdCBhdWRpb19taXhlciB7Ci0JIHVuc2lnbmVkIGludCB2b2x1bWVfbGVmdDsKLQkgdW5zaWduZWQgaW50IHZvbHVtZV9yaWdodDsKLSB9IGF1ZGlvX21peGVyX3Q7Cit0eXBlZGVmIHN0cnVjdCBhdWRpb19taXhlciB7CisJdW5zaWduZWQgaW50IHZvbHVtZV9sZWZ0OworCXVuc2lnbmVkIGludCB2b2x1bWVfcmlnaHQ7Cit9IGF1ZGlvX21peGVyX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogCiA8L3NlY3Rpb24+CkBAIC0xMDksMTcgKzExMiwxNyBAQAogPC9wcm9ncmFtbGlzdGluZz4KIAogPC9zZWN0aW9uPgotPHNlY3Rpb24gaWQ9InN0cnVjdF9hdWRpb19rYXJhb2tlIj4KKzxzZWN0aW9uIGlkPSJhdWRpby1rYXJhb2tlIj4KIDx0aXRsZT5zdHJ1Y3QgYXVkaW9fa2FyYW9rZTwvdGl0bGU+CiA8cGFyYT5UaGUgaW9jdGwgQVVESU9fU0VUX0tBUkFPS0UgdXNlcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKIDwvcGFyYT4KIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmCi0gc3RydWN0IGF1ZGlvX2thcmFva2V7Ci0JIGludCB2b2NhbDE7Ci0JIGludCB2b2NhbDI7Ci0JIGludCBtZWxvZHk7Ci0gfSBhdWRpb19rYXJhb2tlX3Q7Cit0eXBlZGVmCitzdHJ1Y3QgYXVkaW9fa2FyYW9rZSB7CisJaW50IHZvY2FsMTsKKwlpbnQgdm9jYWwyOworCWludCBtZWxvZHk7Cit9IGF1ZGlvX2thcmFva2VfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8cGFyYT5JZiBWb2NhbDEgb3IgVm9jYWwyIGFyZSBub24temVybywgdGhleSBnZXQgbWl4ZWQgaW50byBsZWZ0IGFuZCByaWdodCB0IGF0IDcwJSBlYWNoLiBJZiBib3RoLAogVm9jYWwxIGFuZCBWb2NhbDIgYXJlIG5vbi16ZXJvLCBWb2NhbDEgZ2V0cyBtaXhlZCBpbnRvIHRoZSBsZWZ0IGNoYW5uZWwgYW5kIFZvY2FsMiBpbnRvIHRoZQpAQCAtMTI4LDcgKzEzMSw3IEBACiA8L3BhcmE+CiAKIDwvc2VjdGlvbj4KLTxzZWN0aW9uIGlkPSJhdWRpb19hdHRyaWJ1dGVzIj4KKzxzZWN0aW9uIGlkPSJhdWRpby1hdHRyaWJ1dGVzLXQiPgogPHRpdGxlPmF1ZGlvIGF0dHJpYnV0ZXM8L3RpdGxlPgogPHBhcmE+VGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGNhbiBiZSBzZXQgYnkgYSBjYWxsIHRvIEFVRElPX1NFVF9BVFRSSUJVVEVTOgogPC9wYXJhPgpAQCAtMjE3LDggKzIyMCw3IEBACiA8cGFyYT4oYmxvY2tpbmcgbW9kZSBpcyB0aGUgZGVmYXVsdCk8L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Cis8cGFyYT5SRVRVUk4gVkFMVUU8L3BhcmE+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVOT0RFVjwvcGFyYT4KQEAgLTIyOCwxMyArMjMwLDYgQEAKIDwvZW50cnk+CiAgPC9yb3c+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FQlVTWTwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpAQCAtMjc2LDggKzI3MSw3IEBACiA8cGFyYT5GaWxlIGRlc2NyaXB0b3IgcmV0dXJuZWQgYnkgYSBwcmV2aW91cyBjYWxsIHRvIG9wZW4oKS48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Cis8cGFyYT5SRVRVUk4gVkFMVUU8L3BhcmE+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVCQURGPC9wYXJhPgpAQCAtMzMyLDggKzMyNiw3IEBACiA8cGFyYT5TaXplIG9mIGJ1Zi48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Cis8cGFyYT5SRVRVUk4gVkFMVUU8L3BhcmE+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVQRVJNPC9wYXJhPgpAQCAtMzU4LDcgKzM1MSw3IEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iQVVESU9fU1RPUCIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19TVE9QPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0zOTEsMjUgKzM4NCw5IEBACiA8cGFyYT5FcXVhbHMgQVVESU9fU1RPUCBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iQVVESU9fUExBWSIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19QTEFZPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC00NDMsMjUgKzQyMCw5IEBACiA8cGFyYT5FcXVhbHMgQVVESU9fUExBWSBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iQVVESU9fUEFVU0UiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fUEFVU0U8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTUwMywyNSArNDY0LDQ5IEBACiA8cGFyYT5FcXVhbHMgQVVESU9fUEFVU0UgZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCismcmV0dXJuLXZhbHVlLWR2YjsKKworPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJBVURJT19DT05USU5VRSIKK3JvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19DT05USU5VRTwvdGl0bGU+Cis8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKKzxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMSI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KKzxwYXJhPlRoaXMgaW9jdGwgcmVzdGFydHMgdGhlIGRlY29kaW5nIGFuZCBwbGF5aW5nIHByb2Nlc3MgcHJldmlvdXNseSBwYXVzZWQKK3dpdGggQVVESU9fUEFVU0UgY29tbWFuZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvci48L3BhcmE+Cis8cGFyYT5JdCBvbmx5IHdvcmtzIGlmIHRoZSBzdHJlYW0gd2VyZSBwcmV2aW91c2x5IHN0b3BwZWQgd2l0aCBBVURJT19QQVVTRTwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Cis8cGFyYT5TWU5PUFNJUworPC9wYXJhPgorPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz48ZW50cnkKKyBhbGlnbj0iY2hhciI+Cis8cGFyYT5pbnQgaW9jdGwoaW50IGZkLCBpbnQgcmVxdWVzdCA9IEFVRElPX0NPTlRJTlVFKTs8L3BhcmE+Cis8L2VudHJ5PgorIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorPHBhcmE+UEFSQU1FVEVSUworPC9wYXJhPgorPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKKyBhbGlnbj0iY2hhciI+Cis8cGFyYT5pbnQgZmQ8L3BhcmE+Cis8L2VudHJ5PjxlbnRyeQorIGFsaWduPSJjaGFyIj4KKzxwYXJhPkZpbGUgZGVzY3JpcHRvciByZXR1cm5lZCBieSBhIHByZXZpb3VzIGNhbGwgdG8gb3BlbigpLjwvcGFyYT4KKzwvZW50cnk+CisgPC9yb3c+PHJvdz48ZW50cnkKKyBhbGlnbj0iY2hhciI+Cis8cGFyYT5pbnQgcmVxdWVzdDwvcGFyYT4KKzwvZW50cnk+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+RXF1YWxzIEFVRElPX0NPTlRJTlVFIGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgorPC9lbnRyeT4KKyA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iQVVESU9fU0VMRUNUX1NPVVJDRSIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19TRUxFQ1RfU09VUkNFPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC01NjcsMzIgKzU1Miw5IEBACiAgc3RyZWFtLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5WQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPklsbGVnYWwgaW5wdXQgcGFyYW1ldGVyLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1NFVF9NVVRFIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPkFVRElPX1NFVF9NVVRFPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC02NDYsMzIgKzYwOCw5IEBACiA8cGFyYT5GQUxTRSBBdWRpbyBVbi1tdXRlPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SWxsZWdhbCBpbnB1dCBwYXJhbWV0ZXIuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iQVVESU9fU0VUX0FWX1NZTkMiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fU0VUX0FWX1NZTkM8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTcyNSwzMiArNjY0LDkgQEAKIDxwYXJhPkZBTFNFIEFWLXN5bmMgT0ZGPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SWxsZWdhbCBpbnB1dCBwYXJhbWV0ZXIuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iQVVESU9fU0VUX0JZUEFTU19NT0RFIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPkFVRElPX1NFVF9CWVBBU1NfTU9ERTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtODA4LDMyICs3MjQsOSBAQAogPHBhcmE+RkFMU0UgQnlwYXNzIGlzIGVuYWJsZWQ8L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbGxlZ2FsIGlucHV0IHBhcmFtZXRlci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJBVURJT19DSEFOTkVMX1NFTEVDVCIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19DSEFOTkVMX1NFTEVDVDwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtODc3LDMyICs3NzAsOSBAQAogIHN0ZXJlbykuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SWxsZWdhbCBpbnB1dCBwYXJhbWV0ZXIgY2guPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iQVVESU9fR0VUX1NUQVRVUyIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19HRVRfU1RBVFVTPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC05NDUsMzIgKzgxNSw5IEBACiA8cGFyYT5SZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIEF1ZGlvIERldmljZS48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5zdGF0dXMgcG9pbnRzIHRvIGludmFsaWQgYWRkcmVzcy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJBVURJT19HRVRfQ0FQQUJJTElUSUVTIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPkFVRElPX0dFVF9DQVBBQklMSVRJRVM8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTEwMTMsMzIgKzg2MCw5IEBACiA8cGFyYT5SZXR1cm5zIGEgYml0IGFycmF5IG9mIHN1cHBvcnRlZCBzb3VuZCBmb3JtYXRzLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FRkFVTFQ8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmNhcCBwb2ludHMgdG8gYW4gaW52YWxpZCBhZGRyZXNzLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX0NMRUFSX0JVRkZFUiIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19DTEVBUl9CVUZGRVI8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTEwNzIsMjUgKzg5Niw5IEBACiA8cGFyYT5FcXVhbHMgQVVESU9fQ0xFQVJfQlVGRkVSIGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iQVVESU9fU0VUX0lEIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPkFVRElPX1NFVF9JRDwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTEzNiwzMiArOTQ0LDkgQEAKIDxwYXJhPmF1ZGlvIHN1Yi1zdHJlYW0gaWQ8L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnZhbGlkIHN1Yi1zdHJlYW0gaWQuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iQVVESU9fU0VUX01JWEVSIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPkFVRElPX1NFVF9NSVhFUjwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTIwMiwzMiArOTg3LDkgQEAKIDxwYXJhPm1peGVyIHNldHRpbmdzLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FRkFVTFQ8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPm1peCBwb2ludHMgdG8gYW4gaW52YWxpZCBhZGRyZXNzLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1NFVF9TVFJFQU1UWVBFIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPkFVRElPX1NFVF9TVFJFQU1UWVBFPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xMjcwLDE3ICsxMDMyLDkgQEAKIDxwYXJhPnN0cmVhbSB0eXBlPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTEyODgsNyArMTA0Miw3IEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iQVVESU9fU0VUX0VYVF9JRCIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19TRVRfRVhUX0lEPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xMzMwLDE3ICsxMDg0LDkgQEAKIDxwYXJhPmF1ZGlvIHN1Yl9zdHJlYW1faWQ8L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+CismcmV0dXJuLXZhbHVlLWR2YjsKIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVJTlZBTDwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpAQCAtMTM0OCw3ICsxMDk0LDcgQEAKIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJBVURJT19TRVRfQVRUUklCVVRFUyIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19TRVRfQVRUUklCVVRFUzwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTM5MSwxNyArMTEzNyw5IEBACiA8cGFyYT5hdWRpbyBhdHRyaWJ1dGVzIGFjY29yZGluZyB0byBzZWN0aW9uID8/PC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTE0MDksNyArMTE0Nyw3IEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iQVVESU9fU0VUX0tBUkFPS0UiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fU0VUX0tBUkFPS0U8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTE0MjIsNyArMTE2MCw3IEBACiA8L3BhcmE+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjEiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPmludCBpb2N0bChmZCwgaW50IHJlcXVlc3QgPSBBVURJT19TRVRfU1RSRUFNVFlQRSwKKzxwYXJhPmludCBpb2N0bChmZCwgaW50IHJlcXVlc3QgPSBBVURJT19TRVRfS0FSQU9LRSwKICBhdWRpb19rYXJhb2tlX3QgJiN4MjJDNjtrYXJhb2tlKTs8L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgpAQCAtMTQ0MCw3ICsxMTc4LDcgQEAKIDxwYXJhPmludCByZXF1ZXN0PC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FcXVhbHMgQVVESU9fU0VUX1NUUkVBTVRZUEUgZm9yIHRoaXMKKzxwYXJhPkVxdWFscyBBVURJT19TRVRfS0FSQU9LRSBmb3IgdGhpcwogIGNvbW1hbmQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48cm93PjxlbnRyeQpAQCAtMTQ1MiwxNyArMTE5MCw5IEBACiA8cGFyYT5rYXJhb2tlIHNldHRpbmdzIGFjY29yZGluZyB0byBzZWN0aW9uID8/LjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+RUlOVkFMPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2NhLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvY2EueG1sCnNpbWlsYXJpdHkgaW5kZXggNjclCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvY2EueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2NhLnhtbAppbmRleCBiMWYxZDJmLi41YzRhZGI0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2NhLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2NhLnhtbApAQCAtOCw3NSArOCw4NSBAQAogPHRpdGxlPkNBIERhdGEgVHlwZXM8L3RpdGxlPgogCiAKLTxzZWN0aW9uIGlkPSJjYV9zbG90X2luZm9fdCI+Cis8c2VjdGlvbiBpZD0iY2Etc2xvdC1pbmZvIj4KIDx0aXRsZT5jYV9zbG90X2luZm9fdDwvdGl0bGU+CiAgPHByb2dyYW1saXN0aW5nPgotIC8mI3gyMkM2OyBzbG90IGludGVyZmFjZSB0eXBlcyBhbmQgaW5mbyAmI3gyMkM2Oy8KK3R5cGVkZWYgc3RydWN0IGNhX3Nsb3RfaW5mbyB7CisJaW50IG51bTsgICAgICAgICAgICAgICAvJiN4MjJDNjsgc2xvdCBudW1iZXIgJiN4MjJDNjsvCiAKLSB0eXBlZGVmIHN0cnVjdCBjYV9zbG90X2luZm9fcyB7Ci0JIGludCBudW07ICAgICAgICAgICAgICAgLyYjeDIyQzY7IHNsb3QgbnVtYmVyICYjeDIyQzY7LworCWludCB0eXBlOyAgICAgICAgICAgICAgLyYjeDIyQzY7IENBIGludGVyZmFjZSB0aGlzIHNsb3Qgc3VwcG9ydHMgJiN4MjJDNjsvCisjZGVmaW5lIENBX0NJICAgICAgICAgICAgMSAgICAgLyYjeDIyQzY7IENJIGhpZ2ggbGV2ZWwgaW50ZXJmYWNlICYjeDIyQzY7LworI2RlZmluZSBDQV9DSV9MSU5LICAgICAgIDIgICAgIC8mI3gyMkM2OyBDSSBsaW5rIGxheWVyIGxldmVsIGludGVyZmFjZSAmI3gyMkM2Oy8KKyNkZWZpbmUgQ0FfQ0lfUEhZUyAgICAgICA0ICAgICAvJiN4MjJDNjsgQ0kgcGh5c2ljYWwgbGF5ZXIgbGV2ZWwgaW50ZXJmYWNlICYjeDIyQzY7LworI2RlZmluZSBDQV9ERVNDUiAgICAgICAgIDggICAgIC8mI3gyMkM2OyBidWlsdC1pbiBkZXNjcmFtYmxlciAmI3gyMkM2Oy8KKyNkZWZpbmUgQ0FfU0MgICAgICAgICAgMTI4ICAgICAvJiN4MjJDNjsgc2ltcGxlIHNtYXJ0IGNhcmQgaW50ZXJmYWNlICYjeDIyQzY7LwogCi0JIGludCB0eXBlOyAgICAgICAgICAgLyYjeDIyQzY7IENBIGludGVyZmFjZSB0aGlzIHNsb3Qgc3VwcG9ydHMgJiN4MjJDNjsvCi0gI2RlZmluZSBDQV9DSSAgICAgICAgICAgIDEgIC8mI3gyMkM2OyBDSSBoaWdoIGxldmVsIGludGVyZmFjZSAmI3gyMkM2Oy8KLSAjZGVmaW5lIENBX0NJX0xJTksgICAgICAgMiAgLyYjeDIyQzY7IENJIGxpbmsgbGF5ZXIgbGV2ZWwgaW50ZXJmYWNlICYjeDIyQzY7LwotICNkZWZpbmUgQ0FfQ0lfUEhZUyAgICAgICA0ICAvJiN4MjJDNjsgQ0kgcGh5c2ljYWwgbGF5ZXIgbGV2ZWwgaW50ZXJmYWNlICYjeDIyQzY7LwotICNkZWZpbmUgQ0FfU0MgICAgICAgICAgMTI4ICAvJiN4MjJDNjsgc2ltcGxlIHNtYXJ0IGNhcmQgaW50ZXJmYWNlICYjeDIyQzY7LwotCi0JIHVuc2lnbmVkIGludCBmbGFnczsKLSAjZGVmaW5lIENBX0NJX01PRFVMRV9QUkVTRU5UIDEgLyYjeDIyQzY7IG1vZHVsZSAob3IgY2FyZCkgaW5zZXJ0ZWQgJiN4MjJDNjsvCi0gI2RlZmluZSBDQV9DSV9NT0RVTEVfUkVBRFkgICAyCi0gfSBjYV9zbG90X2luZm9fdDsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisjZGVmaW5lIENBX0NJX01PRFVMRV9QUkVTRU5UIDEgLyYjeDIyQzY7IG1vZHVsZSAob3IgY2FyZCkgaW5zZXJ0ZWQgJiN4MjJDNjsvCisjZGVmaW5lIENBX0NJX01PRFVMRV9SRUFEWSAgIDIKK30gY2Ffc2xvdF9pbmZvX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogCiA8L3NlY3Rpb24+Ci08c2VjdGlvbiBpZD0iY2FfZGVzY3JfaW5mb190Ij4KKzxzZWN0aW9uIGlkPSJjYS1kZXNjci1pbmZvIj4KIDx0aXRsZT5jYV9kZXNjcl9pbmZvX3Q8L3RpdGxlPgotIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIHN0cnVjdCBjYV9kZXNjcl9pbmZvX3MgewotCSB1bnNpZ25lZCBpbnQgbnVtOyAgLyYjeDIyQzY7IG51bWJlciBvZiBhdmFpbGFibGUgZGVzY3JhbWJsZXJzIChrZXlzKSAmI3gyMkM2Oy8KLQkgdW5zaWduZWQgaW50IHR5cGU7IC8mI3gyMkM2OyB0eXBlIG9mIHN1cHBvcnRlZCBzY3JhbWJsaW5nIHN5c3RlbSAmI3gyMkM2Oy8KLSAjZGVmaW5lIENBX0VDRCAgICAgICAgICAgMQotICNkZWZpbmUgQ0FfTkRTICAgICAgICAgICAyCi0gI2RlZmluZSBDQV9EU1MgICAgICAgICAgIDQKLSB9IGNhX2Rlc2NyX2luZm9fdDsKKzxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgc3RydWN0IGNhX2Rlc2NyX2luZm8geworCXVuc2lnbmVkIGludCBudW07ICAvJiN4MjJDNjsgbnVtYmVyIG9mIGF2YWlsYWJsZSBkZXNjcmFtYmxlcnMgKGtleXMpICYjeDIyQzY7LworCXVuc2lnbmVkIGludCB0eXBlOyAvJiN4MjJDNjsgdHlwZSBvZiBzdXBwb3J0ZWQgc2NyYW1ibGluZyBzeXN0ZW0gJiN4MjJDNjsvCisjZGVmaW5lIENBX0VDRCAgICAgICAgICAgMQorI2RlZmluZSBDQV9ORFMgICAgICAgICAgIDIKKyNkZWZpbmUgQ0FfRFNTICAgICAgICAgICA0Cit9IGNhX2Rlc2NyX2luZm9fdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiAKIDwvc2VjdGlvbj4KLTxzZWN0aW9uIGlkPSJjYV9jYXBfdCI+Ci08dGl0bGU+Y2FfY2FwX3Q8L3RpdGxlPgotIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIHN0cnVjdCBjYV9jYXBfcyB7Ci0JIHVuc2lnbmVkIGludCBzbG90X251bTsgIC8mI3gyMkM2OyB0b3RhbCBudW1iZXIgb2YgQ0EgY2FyZCBhbmQgbW9kdWxlIHNsb3RzICYjeDIyQzY7LwotCSB1bnNpZ25lZCBpbnQgc2xvdF90eXBlOyAvJiN4MjJDNjsgT1Igb2YgYWxsIHN1cHBvcnRlZCB0eXBlcyAmI3gyMkM2Oy8KLQkgdW5zaWduZWQgaW50IGRlc2NyX251bTsgLyYjeDIyQzY7IHRvdGFsIG51bWJlciBvZiBkZXNjcmFtYmxlciBzbG90cyAoa2V5cykgJiN4MjJDNjsvCi0JIHVuc2lnbmVkIGludCBkZXNjcl90eXBlOy8mI3gyMkM2OyBPUiBvZiBhbGwgc3VwcG9ydGVkIHR5cGVzICYjeDIyQzY7LworPHNlY3Rpb24gaWQ9ImNhLWNhcHMiPgorPHRpdGxlPmNhX2NhcHNfdDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIHN0cnVjdCBjYV9jYXBzIHsKKwl1bnNpZ25lZCBpbnQgc2xvdF9udW07ICAvJiN4MjJDNjsgdG90YWwgbnVtYmVyIG9mIENBIGNhcmQgYW5kIG1vZHVsZSBzbG90cyAmI3gyMkM2Oy8KKwl1bnNpZ25lZCBpbnQgc2xvdF90eXBlOyAvJiN4MjJDNjsgT1Igb2YgYWxsIHN1cHBvcnRlZCB0eXBlcyAmI3gyMkM2Oy8KKwl1bnNpZ25lZCBpbnQgZGVzY3JfbnVtOyAvJiN4MjJDNjsgdG90YWwgbnVtYmVyIG9mIGRlc2NyYW1ibGVyIHNsb3RzIChrZXlzKSAmI3gyMkM2Oy8KKwl1bnNpZ25lZCBpbnQgZGVzY3JfdHlwZTsvJiN4MjJDNjsgT1Igb2YgYWxsIHN1cHBvcnRlZCB0eXBlcyAmI3gyMkM2Oy8KICB9IGNhX2NhcF90OwogPC9wcm9ncmFtbGlzdGluZz4KIAogPC9zZWN0aW9uPgotPHNlY3Rpb24gaWQ9ImNhX21zZ190Ij4KKzxzZWN0aW9uIGlkPSJjYS1tc2ciPgogPHRpdGxlPmNhX21zZ190PC90aXRsZT4KLSA8cHJvZ3JhbWxpc3Rpbmc+Ci0gLyYjeDIyQzY7IGEgbWVzc2FnZSB0by9mcm9tIGEgQ0ktQ0FNICYjeDIyQzY7LwotIHR5cGVkZWYgc3RydWN0IGNhX21zZ19zIHsKLQkgdW5zaWduZWQgaW50IGluZGV4OwotCSB1bnNpZ25lZCBpbnQgdHlwZTsKLQkgdW5zaWduZWQgaW50IGxlbmd0aDsKLQkgdW5zaWduZWQgY2hhciBtc2dbMjU2XTsKLSB9IGNhX21zZ190OworPHByb2dyYW1saXN0aW5nPgorLyYjeDIyQzY7IGEgbWVzc2FnZSB0by9mcm9tIGEgQ0ktQ0FNICYjeDIyQzY7LwordHlwZWRlZiBzdHJ1Y3QgY2FfbXNnIHsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJdW5zaWduZWQgaW50IHR5cGU7CisJdW5zaWduZWQgaW50IGxlbmd0aDsKKwl1bnNpZ25lZCBjaGFyIG1zZ1syNTZdOworfSBjYV9tc2dfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiAKIDwvc2VjdGlvbj4KLTxzZWN0aW9uIGlkPSJjYV9kZXNjcl90Ij4KKzxzZWN0aW9uIGlkPSJjYS1kZXNjciI+CiA8dGl0bGU+Y2FfZGVzY3JfdDwvdGl0bGU+Ci0gPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgc3RydWN0IGNhX2Rlc2NyX3MgewotCSB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0JIHVuc2lnbmVkIGludCBwYXJpdHk7Ci0JIHVuc2lnbmVkIGNoYXIgY3dbOF07Ci0gfSBjYV9kZXNjcl90OworPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBzdHJ1Y3QgY2FfZGVzY3IgeworCXVuc2lnbmVkIGludCBpbmRleDsKKwl1bnNpZ25lZCBpbnQgcGFyaXR5OworCXVuc2lnbmVkIGNoYXIgY3dbOF07Cit9IGNhX2Rlc2NyX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgotIDwvc2VjdGlvbj48L3NlY3Rpb24+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIGlkPSJjYS1waWQiPgorPHRpdGxlPmNhLXBpZDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIHN0cnVjdCBjYV9waWQgeworCXVuc2lnbmVkIGludCBwaWQ7CisJaW50IGluZGV4OwkJLyYjeDIyQzY7IC0xID09IGRpc2FibGUmI3gyMkM2Oy8KK30gY2FfcGlkX3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorPC9zZWN0aW9uPjwvc2VjdGlvbj4KKwogPHNlY3Rpb24gaWQ9ImNhX2Z1bmN0aW9uX2NhbGxzIj4KIDx0aXRsZT5DQSBGdW5jdGlvbiBDYWxsczwvdGl0bGU+CiAKQEAgLTE0OCw4ICsxNTgsNyBAQAogPHBhcmE+KGJsb2NraW5nIG1vZGUgaXMgdGhlIGRlZmF1bHQpPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FTk9ERVY8L3BhcmE+CkBAIC0yMDcsOCArMjE2LDcgQEAKIDxwYXJhPkZpbGUgZGVzY3JpcHRvciByZXR1cm5lZCBieSBhIHByZXZpb3VzIGNhbGwgdG8gb3BlbigpLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKzxwYXJhPlJFVFVSTiBWQUxVRTwvcGFyYT4KIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgogPHBhcmE+RUJBREY8L3BhcmE+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2RlbXV4LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvZGVtdXgueG1sCnNpbWlsYXJpdHkgaW5kZXggODQlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZGVtdXgueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2RlbXV4LnhtbAppbmRleCAxYjhjNGU5Li4zN2MxNzkwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2RlbXV4LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2RlbXV4LnhtbApAQCAtNywxNSArNywxOSBAQAogPHNlY3Rpb24gaWQ9ImRteF90eXBlcyI+CiA8dGl0bGU+RGVtdXggRGF0YSBUeXBlczwvdGl0bGU+CiAKLTxzZWN0aW9uIGlkPSJkbXhfb3V0cHV0X3QiPgorPHNlY3Rpb24gaWQ9ImRteC1vdXRwdXQtdCI+CiA8dGl0bGU+ZG14X291dHB1dF90PC90aXRsZT4KLSA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBlbnVtCi0gewotCSBETVhfT1VUX0RFQ09ERVIsCi0JIERNWF9PVVRfVEFQLAotCSBETVhfT1VUX1RTX1RBUAotIH0gZG14X291dHB1dF90OworPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBlbnVtCit7CisJRE1YX09VVF9ERUNPREVSLCAvJiN4MjJDNjsgU3RyZWFtaW5nIGRpcmVjdGx5IHRvIGRlY29kZXIuICYjeDIyQzY7LworCURNWF9PVVRfVEFQLCAgICAgLyYjeDIyQzY7IE91dHB1dCBnb2luZyB0byBhIG1lbW9yeSBidWZmZXIgJiN4MjJDNjsvCisJCQkgLyYjeDIyQzY7ICh0byBiZSByZXRyaWV2ZWQgdmlhIHRoZSByZWFkIGNvbW1hbmQpLiYjeDIyQzY7LworCURNWF9PVVRfVFNfVEFQLCAgLyYjeDIyQzY7IE91dHB1dCBtdWx0aXBsZXhlZCBpbnRvIGEgbmV3IFRTICAmI3gyMkM2Oy8KKwkJCSAvJiN4MjJDNjsgKHRvIGJlIHJldHJpZXZlZCBieSByZWFkaW5nIGZyb20gdGhlICYjeDIyQzY7LworCQkJIC8mI3gyMkM2OyBsb2dpY2FsIERWUiBkZXZpY2UpLiAgICAgICAgICAgICAgICAgJiN4MjJDNjsvCisJRE1YX09VVF9UU0RFTVVYX1RBUCAvJiN4MjJDNjsgTGlrZSBUU19UQVAgYnV0IHJldHJpZXZlZCBmcm9tIHRoZSBETVggZGV2aWNlICYjeDIyQzY7LworfSBkbXhfb3V0cHV0X3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogPHBhcmE+PGVtcGhhc2lzIHJvbGU9InR0Ij5ETVhfT1VUX1RBUDwvZW1waGFzaXM+IGRlbGl2ZXJzIHRoZSBzdHJlYW0gb3V0cHV0IHRvIHRoZSBkZW11eCBkZXZpY2Ugb24gd2hpY2ggdGhlIGlvY3RsIGlzCiBjYWxsZWQuCkBAIC0yNiw5NiArMzAsOTUgQEAKIDwvcGFyYT4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImRteF9pbnB1dF90Ij4KKzxzZWN0aW9uIGlkPSJkbXgtaW5wdXQtdCI+CiA8dGl0bGU+ZG14X2lucHV0X3Q8L3RpdGxlPgotIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIGVudW0KLSB7Ci0JIERNWF9JTl9GUk9OVEVORCwKLQkgRE1YX0lOX0RWUgotIH0gZG14X2lucHV0X3Q7Cis8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIGVudW0KK3sKKwlETVhfSU5fRlJPTlRFTkQsIC8mI3gyMkM2OyBJbnB1dCBmcm9tIGEgZnJvbnQtZW5kIGRldmljZS4gICYjeDIyQzY7LworCURNWF9JTl9EVlIgICAgICAgLyYjeDIyQzY7IElucHV0IGZyb20gdGhlIGxvZ2ljYWwgRFZSIGRldmljZS4gICYjeDIyQzY7LworfSBkbXhfaW5wdXRfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJkbXhfcGVzX3R5cGVfdCI+Cis8c2VjdGlvbiBpZD0iZG14LXBlcy10eXBlLXQiPgogPHRpdGxlPmRteF9wZXNfdHlwZV90PC90aXRsZT4KLSA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBlbnVtCi0gewotCSBETVhfUEVTX0FVRElPLAotCSBETVhfUEVTX1ZJREVPLAotCSBETVhfUEVTX1RFTEVURVhULAotCSBETVhfUEVTX1NVQlRJVExFLAotCSBETVhfUEVTX1BDUiwKLQkgRE1YX1BFU19PVEhFUgotIH0gZG14X3Blc190eXBlX3Q7Cis8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIGVudW0KK3sKKwlETVhfUEVTX0FVRElPMCwKKwlETVhfUEVTX1ZJREVPMCwKKwlETVhfUEVTX1RFTEVURVhUMCwKKwlETVhfUEVTX1NVQlRJVExFMCwKKwlETVhfUEVTX1BDUjAsCisKKwlETVhfUEVTX0FVRElPMSwKKwlETVhfUEVTX1ZJREVPMSwKKwlETVhfUEVTX1RFTEVURVhUMSwKKwlETVhfUEVTX1NVQlRJVExFMSwKKwlETVhfUEVTX1BDUjEsCisKKwlETVhfUEVTX0FVRElPMiwKKwlETVhfUEVTX1ZJREVPMiwKKwlETVhfUEVTX1RFTEVURVhUMiwKKwlETVhfUEVTX1NVQlRJVExFMiwKKwlETVhfUEVTX1BDUjIsCisKKwlETVhfUEVTX0FVRElPMywKKwlETVhfUEVTX1ZJREVPMywKKwlETVhfUEVTX1RFTEVURVhUMywKKwlETVhfUEVTX1NVQlRJVExFMywKKwlETVhfUEVTX1BDUjMsCisKKwlETVhfUEVTX09USEVSCit9IGRteF9wZXNfdHlwZV90OwogPC9wcm9ncmFtbGlzdGluZz4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImRteF9ldmVudF90Ij4KLTx0aXRsZT5kbXhfZXZlbnRfdDwvdGl0bGU+Ci0gPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bQotIHsKLQkgRE1YX1NDUkFNQkxJTkdfRVYsCi0JIERNWF9GUk9OVEVORF9FVgotIH0gZG14X2V2ZW50X3Q7Ci08L3Byb2dyYW1saXN0aW5nPgotPC9zZWN0aW9uPgotCi08c2VjdGlvbiBpZD0iZG14X3NjcmFtYmxpbmdfc3RhdHVzX3QiPgotPHRpdGxlPmRteF9zY3JhbWJsaW5nX3N0YXR1c190PC90aXRsZT4KLSA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBlbnVtCi0gewotCSBETVhfU0NSQU1CTElOR19PRkYsCi0JIERNWF9TQ1JBTUJMSU5HX09OCi0gfSBkbXhfc2NyYW1ibGluZ19zdGF0dXNfdDsKLTwvcHJvZ3JhbWxpc3Rpbmc+Ci08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uIGlkPSJkbXhfZmlsdGVyIj4KKzxzZWN0aW9uIGlkPSJkbXgtZmlsdGVyIj4KIDx0aXRsZT5zdHJ1Y3QgZG14X2ZpbHRlcjwvdGl0bGU+CiAgPHByb2dyYW1saXN0aW5nPgogIHR5cGVkZWYgc3RydWN0IGRteF9maWx0ZXIKLSB7Ci0JIHVpbnQ4X3QgICAgICAgICBmaWx0ZXJbRE1YX0ZJTFRFUl9TSVpFXTsKLQkgdWludDhfdCAgICAgICAgIG1hc2tbRE1YX0ZJTFRFUl9TSVpFXTsKLSB9IGRteF9maWx0ZXJfdDsKK3sKKwlfX3U4ICBmaWx0ZXJbRE1YX0ZJTFRFUl9TSVpFXTsKKwlfX3U4ICBtYXNrW0RNWF9GSUxURVJfU0laRV07CisJX191OCAgbW9kZVtETVhfRklMVEVSX1NJWkVdOworfSBkbXhfZmlsdGVyX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZG14X3NjdF9maWx0ZXJfcGFyYW1zIj4KKzxzZWN0aW9uIGlkPSJkbXgtc2N0LWZpbHRlci1wYXJhbXMiPgogPHRpdGxlPnN0cnVjdCBkbXhfc2N0X2ZpbHRlcl9wYXJhbXM8L3RpdGxlPgotIDxwcm9ncmFtbGlzdGluZz4KLSBzdHJ1Y3QgZG14X3NjdF9maWx0ZXJfcGFyYW1zCi0gewotCSB1aW50MTZfdCAgICAgICAgICAgIHBpZDsKLQkgZG14X2ZpbHRlcl90ICAgICAgICBmaWx0ZXI7Ci0JIHVpbnQzMl90ICAgICAgICAgICAgdGltZW91dDsKLQkgdWludDMyX3QgICAgICAgICAgICBmbGFnczsKLSAjZGVmaW5lIERNWF9DSEVDS19DUkMgICAgICAgMQotICNkZWZpbmUgRE1YX09ORVNIT1QgICAgICAgICAyCi0gI2RlZmluZSBETVhfSU1NRURJQVRFX1NUQVJUIDQKLSB9OworPHByb2dyYW1saXN0aW5nPgorc3RydWN0IGRteF9zY3RfZmlsdGVyX3BhcmFtcworeworCV9fdTE2ICAgICAgICAgIHBpZDsKKwlkbXhfZmlsdGVyX3QgICBmaWx0ZXI7CisJX191MzIgICAgICAgICAgdGltZW91dDsKKwlfX3UzMiAgICAgICAgICBmbGFnczsKKyNkZWZpbmUgRE1YX0NIRUNLX0NSQyAgICAgICAxCisjZGVmaW5lIERNWF9PTkVTSE9UICAgICAgICAgMgorI2RlZmluZSBETVhfSU1NRURJQVRFX1NUQVJUIDQKKyNkZWZpbmUgRE1YX0tFUk5FTF9DTElFTlQgICAweDgwMDAKK307CiA8L3Byb2dyYW1saXN0aW5nPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZG14X3Blc19maWx0ZXJfcGFyYW1zIj4KKzxzZWN0aW9uIGlkPSJkbXgtcGVzLWZpbHRlci1wYXJhbXMiPgogPHRpdGxlPnN0cnVjdCBkbXhfcGVzX2ZpbHRlcl9wYXJhbXM8L3RpdGxlPgotIDxwcm9ncmFtbGlzdGluZz4KLSBzdHJ1Y3QgZG14X3Blc19maWx0ZXJfcGFyYW1zCi0gewotCSB1aW50MTZfdCAgICAgICAgICAgIHBpZDsKLQkgZG14X2lucHV0X3QgICAgICAgICBpbnB1dDsKLQkgZG14X291dHB1dF90ICAgICAgICBvdXRwdXQ7Ci0JIGRteF9wZXNfdHlwZV90ICAgICAgcGVzX3R5cGU7Ci0JIHVpbnQzMl90ICAgICAgICAgICAgZmxhZ3M7Ci0gfTsKKzxwcm9ncmFtbGlzdGluZz4KK3N0cnVjdCBkbXhfcGVzX2ZpbHRlcl9wYXJhbXMKK3sKKwlfX3UxNiAgICAgICAgICBwaWQ7CisJZG14X2lucHV0X3QgICAgaW5wdXQ7CisJZG14X291dHB1dF90ICAgb3V0cHV0OworCWRteF9wZXNfdHlwZV90IHBlc190eXBlOworCV9fdTMyICAgICAgICAgIGZsYWdzOworfTsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJkbXhfZXZlbnQiPgorPHNlY3Rpb24gaWQ9ImRteC1ldmVudCI+CiA8dGl0bGU+c3RydWN0IGRteF9ldmVudDwvdGl0bGU+CiAgPHByb2dyYW1saXN0aW5nPgogIHN0cnVjdCBkbXhfZXZlbnQKQEAgLTEzMCwxOSArMTMzLDQ0IEBACiA8L3Byb2dyYW1saXN0aW5nPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZG14X3N0YyI+Cis8c2VjdGlvbiBpZD0iZG14LXN0YyI+CiA8dGl0bGU+c3RydWN0IGRteF9zdGM8L3RpdGxlPgotIDxwcm9ncmFtbGlzdGluZz4KLSBzdHJ1Y3QgZG14X3N0YyB7Ci0JIHVuc2lnbmVkIGludCBudW07ICAgICAgIC8mI3gyMkM2OyBpbnB1dCA6IHdoaWNoIFNUQz8gMC4uTiAmI3gyMkM2Oy8KLQkgdW5zaWduZWQgaW50IGJhc2U7ICAgICAgLyYjeDIyQzY7IG91dHB1dDogZGl2aXNvciBmb3Igc3RjIHRvIGdldCA5MCBrSHogY2xvY2sgJiN4MjJDNjsvCi0JIHVpbnQ2NF90IHN0YzsgICAgICAgICAgIC8mI3gyMkM2OyBvdXRwdXQ6IHN0YyBpbiAnYmFzZScmI3gyMkM2OzkwIGtIeiB1bml0cyAmI3gyMkM2Oy8KLSB9OworPHByb2dyYW1saXN0aW5nPgorc3RydWN0IGRteF9zdGMgeworCXVuc2lnbmVkIGludCBudW07CS8mI3gyMkM2OyBpbnB1dCA6IHdoaWNoIFNUQz8gMC4uTiAmI3gyMkM2Oy8KKwl1bnNpZ25lZCBpbnQgYmFzZTsJLyYjeDIyQzY7IG91dHB1dDogZGl2aXNvciBmb3Igc3RjIHRvIGdldCA5MCBrSHogY2xvY2sgJiN4MjJDNjsvCisJX191NjQgc3RjOwkJLyYjeDIyQzY7IG91dHB1dDogc3RjIGluICdiYXNlJyYjeDIyQzY7OTAga0h6IHVuaXRzICYjeDIyQzY7LworfTsKIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gPC9zZWN0aW9uPgotCiA8L3NlY3Rpb24+CiAKKzxzZWN0aW9uIGlkPSJkbXgtY2FwcyI+Cis8dGl0bGU+c3RydWN0IGRteF9jYXBzPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKyB0eXBlZGVmIHN0cnVjdCBkbXhfY2FwcyB7CisJX191MzIgY2FwczsKKwlpbnQgbnVtX2RlY29kZXJzOworfSBkbXhfY2Fwc190OworPC9wcm9ncmFtbGlzdGluZz4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gaWQ9ImRteC1zb3VyY2UtdCI+Cis8dGl0bGU+ZW51bSBkbXhfc291cmNlX3Q8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBlbnVtIHsKKwlETVhfU09VUkNFX0ZST05UMCA9IDAsCisJRE1YX1NPVVJDRV9GUk9OVDEsCisJRE1YX1NPVVJDRV9GUk9OVDIsCisJRE1YX1NPVVJDRV9GUk9OVDMsCisJRE1YX1NPVVJDRV9EVlIwICAgPSAxNiwKKwlETVhfU09VUkNFX0RWUjEsCisJRE1YX1NPVVJDRV9EVlIyLAorCURNWF9TT1VSQ0VfRFZSMworfSBkbXhfc291cmNlX3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorPC9zZWN0aW9uPgorCis8L3NlY3Rpb24+CiA8c2VjdGlvbiBpZD0iZG14X2ZjYWxscyI+CiA8dGl0bGU+RGVtdXggRnVuY3Rpb24gQ2FsbHM8L3RpdGxlPgogCkBAIC0yMTEsOCArMjM5LDcgQEAKIDxwYXJhPihibG9ja2luZyBtb2RlIGlzIHRoZSBkZWZhdWx0KTwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKzxwYXJhPlJFVFVSTiBWQUxVRTwvcGFyYT4KIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgogPHBhcmE+RU5PREVWPC9wYXJhPgpAQCAtMjcxLDggKzI5OCw3IEBACiA8cGFyYT5GaWxlIGRlc2NyaXB0b3IgcmV0dXJuZWQgYnkgYSBwcmV2aW91cyBjYWxsIHRvIG9wZW4oKS48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Cis8cGFyYT5SRVRVUk4gVkFMVUU8L3BhcmE+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVCQURGPC9wYXJhPgpAQCAtMzUzLDggKzM3OSw3IEBACiA8cGFyYT5TaXplIG9mIGJ1Zi48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Cis8cGFyYT5SRVRVUk4gVkFMVUU8L3BhcmE+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVXT1VMREJMT0NLPC9wYXJhPgpAQCAtNDU3LDggKzQ4Miw3IEBACiA8cGFyYT5TaXplIG9mIGJ1Zi48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Cis8cGFyYT5SRVRVUk4gVkFMVUU8L3BhcmE+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVXT1VMREJMT0NLPC9wYXJhPgpAQCAtNDkxLDcgKzUxNSw3IEBACiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJkbXhfc3RhcnQiPgorPHNlY3Rpb24gaWQ9IkRNWF9TVEFSVCI+CiA8dGl0bGU+RE1YX1NUQVJUPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC01MjUsMTcgKzU0OSw5IEBACiA8cGFyYT5FcXVhbHMgRE1YX1NUQVJUIGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVJTlZBTDwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpAQCAtNTU2LDcgKzU3Miw3IEBACiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJkbXhfc3RvcCI+Cis8c2VjdGlvbiBpZD0iRE1YX1NUT1AiPgogPHRpdGxlPkRNWF9TVE9QPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC01OTEsMTkgKzYwNywxMCBAQAogPHBhcmE+RXF1YWxzIERNWF9TVE9QIGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImRteF9zZXRfZmlsdGVyIj4KKzxzZWN0aW9uIGlkPSJETVhfU0VUX0ZJTFRFUiI+CiA8dGl0bGU+RE1YX1NFVF9GSUxURVI8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTY1NCwyNiArNjYxLDEwIEBACiA8cGFyYT5Qb2ludGVyIHRvIHN0cnVjdHVyZSBjb250YWluaW5nIGZpbHRlciBwYXJhbWV0ZXJzLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnZhbGlkIGFyZ3VtZW50LjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImRteF9zZXRfcGVzX2ZpbHRlciI+Cis8c2VjdGlvbiBpZD0iRE1YX1NFVF9QRVNfRklMVEVSIj4KIDx0aXRsZT5ETVhfU0VUX1BFU19GSUxURVI8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTcyNywyNCArNzE4LDkgQEAKIDxwYXJhPlBvaW50ZXIgdG8gc3RydWN0dXJlIGNvbnRhaW5pbmcgZmlsdGVyIHBhcmFtZXRlcnMuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW52YWxpZCBhcmd1bWVudC48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+RUJVU1k8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTc1Niw3ICs3MzIsNyBAQAogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZG1zX3NldF9idWZmZXJfc2l6ZSI+Cis8c2VjdGlvbiBpZD0iRE1YX1NFVF9CVUZGRVJfU0laRSI+CiA8dGl0bGU+RE1YX1NFVF9CVUZGRVJfU0laRTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtNzk5LDI3ICs3NzUsMTAgQEAKIDxwYXJhPlNpemUgb2YgY2lyY3VsYXIgYnVmZmVyLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RU5PTUVNPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5UaGUgZHJpdmVyIHdhcyBub3QgYWJsZSB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBvZiB0aGUKLSByZXF1ZXN0ZWQgc2l6ZS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJkbXhfZ2V0X2V2ZW50Ij4KKzxzZWN0aW9uIGlkPSJETVhfR0VUX0VWRU5UIj4KIDx0aXRsZT5ETVhfR0VUX0VWRU5UPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC04NzIsMjQgKzgzMSw5IEBACiA8cGFyYT5Qb2ludGVyIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgZXZlbnQgaXMgdG8gYmUgc3RvcmVkLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FRkFVTFQ8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmV2IHBvaW50cyB0byBhbiBpbnZhbGlkIGFkZHJlc3MuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVXT1VMREJMT0NLPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CkBAIC04OTksNyArODQzLDcgQEAKICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImRteF9nZXRfc3RjIj4KKzxzZWN0aW9uIGlkPSJETVhfR0VUX1NUQyI+CiA8dGl0bGU+RE1YX0dFVF9TVEM8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTk0NiwyNCArODkwLDkgQEAKIDxwYXJhPlBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBzdGMgaXMgdG8gYmUgc3RvcmVkLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FRkFVTFQ8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPnN0YyBwb2ludHMgdG8gYW4gaW52YWxpZCBhZGRyZXNzLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZHZiYXBpLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvZHZiYXBpLnhtbApzaW1pbGFyaXR5IGluZGV4IDg1JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2R2YmFwaS54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvZHZiYXBpLnhtbAppbmRleCA5ZmFkODZjLi4yYWI2ZGRjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2R2YmFwaS54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9kdmJhcGkueG1sCkBAIC0xMTQsOCArMTE0LDI4IEBACiAgICAgJnN1Yi1leGFtcGxlczsKICAgPC9jaGFwdGVyPgogPCEtLSBFTkQgT0YgQ0hBUFRFUlMgLS0+CisgIDxhcHBlbmRpeCBpZD0iYXVkaW9faCI+CisgICAgPHRpdGxlPkRWQiBBdWRpbyBIZWFkZXIgRmlsZTwvdGl0bGU+CisgICAgJnN1Yi1hdWRpby1oOworICA8L2FwcGVuZGl4PgorICA8YXBwZW5kaXggaWQ9ImNhX2giPgorICAgIDx0aXRsZT5EVkIgQ29uZGl0aW9uYWwgQWNjZXNzIEhlYWRlciBGaWxlPC90aXRsZT4KKyAgICAmc3ViLWNhLWg7CisgIDwvYXBwZW5kaXg+CisgIDxhcHBlbmRpeCBpZD0iZG14X2giPgorICAgIDx0aXRsZT5EVkIgRGVtdXggSGVhZGVyIEZpbGU8L3RpdGxlPgorICAgICZzdWItZG14LWg7CisgIDwvYXBwZW5kaXg+CiAgIDxhcHBlbmRpeCBpZD0iZnJvbnRlbmRfaCI+CiAgICAgPHRpdGxlPkRWQiBGcm9udGVuZCBIZWFkZXIgRmlsZTwvdGl0bGU+CiAgICAgJnN1Yi1mcm9udGVuZC1oOwogICA8L2FwcGVuZGl4PgorICA8YXBwZW5kaXggaWQ9Im5ldF9oIj4KKyAgICA8dGl0bGU+RFZCIE5ldHdvcmsgSGVhZGVyIEZpbGU8L3RpdGxlPgorICAgICZzdWItbmV0LWg7CisgIDwvYXBwZW5kaXg+CisgIDxhcHBlbmRpeCBpZD0idmlkZW9faCI+CisgICAgPHRpdGxlPkRWQiBWaWRlbyBIZWFkZXIgRmlsZTwvdGl0bGU+CisgICAgJnN1Yi12aWRlby1oOworICA8L2FwcGVuZGl4PgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2R2YnByb3BlcnR5LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvZHZicHJvcGVydHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwN2UxYTUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2R2YnByb3BlcnR5LnhtbApAQCAtMCwwICsxLDg1OSBAQAorPHNlY3Rpb24gaWQ9IkZFX0dFVF9TRVRfUFJPUEVSVFkiPgorPHRpdGxlPjxjb25zdGFudD5GRV9HRVRfUFJPUEVSVFkvRkVfU0VUX1BST1BFUlRZPC9jb25zdGFudD48L3RpdGxlPgorPHBhcmE+VGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgRFZCIHZlcnNpb24gNSBleHRlbnRpb24gb2YgdGhlIERWQi1BUEksIGFsc28KK2NhbGxlZCAiUzJBUEkiLCBhcyB0aGlzIEFQSSB3ZXJlIGFkZGVkIHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgRFZCLVMyLiBJdCB3YXMKK2Rlc2lnbmVkIHRvIGJlIGFibGUgdG8gcmVwbGFjZSB0aGUgb2xkIGZyb250ZW5kIEFQSS4gWWV0LCB0aGUgRElTRVFDIGFuZAordGhlIGNhcGFiaWxpdHkgaW9jdGxzIHdlcmVuJ3QgaW1wbGVtZW50ZWQgeWV0IHZpYSB0aGUgbmV3IHdheS48L3BhcmE+Cis8cGFyYT5UaGUgdHlwaWNhbCB1c2FnZSBmb3IgdGhlIDxjb25zdGFudD5GRV9HRVRfUFJPUEVSVFkvRkVfU0VUX1BST1BFUlRZPC9jb25zdGFudD4KK0FQSSBpcyB0byByZXBsYWNlIHRoZSBpb2N0bCdzIHdlcmUgdGhlIDxsaW5rIGxpbmtlbmQ9ImR2Yi1mcm9udGVuZC1wYXJhbWV0ZXJzIj4KK3N0cnVjdCA8Y29uc3RhbnQ+ZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnM8L2NvbnN0YW50PjwvbGluaz4gd2VyZSB1c2VkLjwvcGFyYT4KKzxzZWN0aW9uIGlkPSJkdHYtcHJvcGVydHkiPgorPHRpdGxlPkRUViBwcm9wZXJ0eSB0eXBlPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KKy8qIFJlc2VydmVkIGZpZWxkcyBzaG91bGQgYmUgc2V0IHRvIDAgKi8KK3N0cnVjdCBkdHZfcHJvcGVydHkgeworCV9fdTMyIGNtZDsKKwl1bmlvbiB7CisJCV9fdTMyIGRhdGE7CisJCXN0cnVjdCB7CisJCQlfX3U4IGRhdGFbMzJdOworCQkJX191MzIgbGVuOworCQkJX191MzIgcmVzZXJ2ZWQxWzNdOworCQkJdm9pZCAqcmVzZXJ2ZWQyOworCQl9IGJ1ZmZlcjsKKwl9IHU7CisJaW50IHJlc3VsdDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBudW0gb2YgcHJvcGVydGllcyBjYW5ub3QgZXhjZWVkIERUVl9JT0NUTF9NQVhfTVNHUyBwZXIgaW9jdGwgKi8KKyNkZWZpbmUgRFRWX0lPQ1RMX01BWF9NU0dTIDY0Cis8L3Byb2dyYW1saXN0aW5nPgorPC9zZWN0aW9uPgorPHNlY3Rpb24gaWQ9ImR0di1wcm9wZXJ0aWVzIj4KKzx0aXRsZT5EVFYgcHJvcGVydGllcyB0eXBlPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK3N0cnVjdCBkdHZfcHJvcGVydGllcyB7CisJX191MzIgbnVtOworCXN0cnVjdCBkdHZfcHJvcGVydHkgKnByb3BzOworfTsKKzwvcHJvZ3JhbWxpc3Rpbmc+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIGlkPSJGRV9HRVRfUFJPUEVSVFkiPgorPHRpdGxlPkZFX0dFVF9QUk9QRVJUWTwvdGl0bGU+Cis8cGFyYT5ERVNDUklQVElPTgorPC9wYXJhPgorPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz48ZW50cnkKKyBhbGlnbj0iY2hhciI+Cis8cGFyYT5UaGlzIGlvY3RsIGNhbGwgcmV0dXJucyBvbmUgb3IgbW9yZSBmcm9udGVuZCBwcm9wZXJ0aWVzLiBUaGlzIGNhbGwgb25seQorIHJlcXVpcmVzIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhlIGRldmljZS48L3BhcmE+Cis8L2VudHJ5PgorIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorPHBhcmE+U1lOT1BTSVMKKzwvcGFyYT4KKzxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMSI+PHRib2R5Pjxyb3c+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+aW50IGlvY3RsKGludCBmZCwgaW50IHJlcXVlc3QgPSA8bGluayBsaW5rZW5kPSJGRV9HRVRfUFJPUEVSVFkiPkZFX0dFVF9QUk9QRVJUWTwvbGluaz4sCisgZHR2X3Byb3BlcnRpZXMgJiN4MjJDNjtwcm9wcyk7PC9wYXJhPgorPC9lbnRyeT4KKyA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKzxwYXJhPlBBUkFNRVRFUlMKKzwvcGFyYT4KKzxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5IGFsaWduPSJjaGFyIj4KKzxwYXJhPmludCBmZDwvcGFyYT4KKzwvZW50cnk+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+RmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBvcGVuKCkuPC9wYXJhPgorPC9lbnRyeT4KKyA8L3Jvdz48cm93PjxlbnRyeQorIGFsaWduPSJjaGFyIj4KKzxwYXJhPmludCBudW08L3BhcmE+Cis8L2VudHJ5PjxlbnRyeQorIGFsaWduPSJjaGFyIj4KKzxwYXJhPkVxdWFscyA8bGluayBsaW5rZW5kPSJGRV9HRVRfUFJPUEVSVFkiPkZFX0dFVF9QUk9QRVJUWTwvbGluaz4gZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+Cis8L2VudHJ5PgorIDwvcm93Pjxyb3c+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+c3RydWN0IGR0dl9wcm9wZXJ0eSAqcHJvcHM8L3BhcmE+Cis8L2VudHJ5PjxlbnRyeQorIGFsaWduPSJjaGFyIj4KKzxwYXJhPlBvaW50cyB0byB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGZyb250LWVuZCBwcm9wZXJ0eSBjb21tYW5kcyBhcmUgc3RvcmVkLjwvcGFyYT4KKzwvZW50cnk+CisgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKKzxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+CisgIDxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+RU9QTk9UU1VQUDwvcGFyYT48L2VudHJ5PgorICA8ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPlByb3BlcnR5IHR5cGUgbm90IHN1cHBvcnRlZC48L3BhcmE+PC9lbnRyeT4KKyA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gaWQ9IkZFX1NFVF9QUk9QRVJUWSI+Cis8dGl0bGU+RkVfU0VUX1BST1BFUlRZPC90aXRsZT4KKzxwYXJhPkRFU0NSSVBUSU9OCis8L3BhcmE+Cis8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjEiPjx0Ym9keT48cm93PjxlbnRyeQorIGFsaWduPSJjaGFyIj4KKzxwYXJhPlRoaXMgaW9jdGwgY2FsbCBzZXRzIG9uZSBvciBtb3JlIGZyb250ZW5kIHByb3BlcnRpZXMuIFRoaXMgY2FsbCBvbmx5CisgcmVxdWlyZXMgcmVhZC1vbmx5IGFjY2VzcyB0byB0aGUgZGV2aWNlLjwvcGFyYT4KKzwvZW50cnk+CisgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Cis8cGFyYT5TWU5PUFNJUworPC9wYXJhPgorPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz48ZW50cnkKKyBhbGlnbj0iY2hhciI+Cis8cGFyYT5pbnQgaW9jdGwoaW50IGZkLCBpbnQgcmVxdWVzdCA9IDxsaW5rIGxpbmtlbmQ9IkZFX1NFVF9QUk9QRVJUWSI+RkVfU0VUX1BST1BFUlRZPC9saW5rPiwKKyBkdHZfcHJvcGVydGllcyAmI3gyMkM2O3Byb3BzKTs8L3BhcmE+Cis8L2VudHJ5PgorIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorPHBhcmE+UEFSQU1FVEVSUworPC9wYXJhPgorPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkgYWxpZ249ImNoYXIiPgorPHBhcmE+aW50IGZkPC9wYXJhPgorPC9lbnRyeT48ZW50cnkKKyBhbGlnbj0iY2hhciI+Cis8cGFyYT5GaWxlIGRlc2NyaXB0b3IgcmV0dXJuZWQgYnkgYSBwcmV2aW91cyBjYWxsIHRvIG9wZW4oKS48L3BhcmE+Cis8L2VudHJ5PgorIDwvcm93Pjxyb3c+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+aW50IG51bTwvcGFyYT4KKzwvZW50cnk+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+RXF1YWxzIDxsaW5rIGxpbmtlbmQ9IkZFX1NFVF9QUk9QRVJUWSI+RkVfU0VUX1BST1BFUlRZPC9saW5rPiBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KKzwvZW50cnk+CisgPC9yb3c+PHJvdz48ZW50cnkKKyBhbGlnbj0iY2hhciI+Cis8cGFyYT5zdHJ1Y3QgZHR2X3Byb3BlcnR5ICpwcm9wczwvcGFyYT4KKzwvZW50cnk+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+UG9pbnRzIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgZnJvbnQtZW5kIHByb3BlcnR5IGNvbW1hbmRzIGFyZSBzdG9yZWQuPC9wYXJhPgorPC9lbnRyeT4KKyA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOworPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz4KKyAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5FT1BOT1RTVVBQPC9wYXJhPjwvZW50cnk+CisgIDxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+UHJvcGVydHkgdHlwZSBub3Qgc3VwcG9ydGVkLjwvcGFyYT48L2VudHJ5PgorIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbj4KKwk8dGl0bGU+UHJvcGVydHkgdHlwZXM8L3RpdGxlPgorPHBhcmE+CitPbiA8bGluayBsaW5rZW5kPSJGRV9HRVRfUFJPUEVSVFkiPkZFX0dFVF9QUk9QRVJUWTwvbGluaz4vPGxpbmsgbGlua2VuZD0iRkVfU0VUX1BST1BFUlRZIj5GRV9TRVRfUFJPUEVSVFk8L2xpbms+LAordGhlIGFjdHVhbCBhY3Rpb24gaXMgZGV0ZXJtaW5lZCBieSB0aGUgZHR2X3Byb3BlcnR5IGNtZC9kYXRhIHBhaXJzLiBXaXRoIG9uZSBzaW5nbGUgaW9jdGwsIGlzIHBvc3NpYmxlIHRvCitnZXQvc2V0IHVwIHRvIDY0IHByb3BlcnRpZXMuIFRoZSBhY3R1YWwgbWVhbmluZyBvZiBlYWNoIHByb3BlcnR5IGlzIGRlc2NyaWJlZCBvbiB0aGUgbmV4dCBzZWN0aW9ucy4KKzwvcGFyYT4KKworPHBhcmE+VGhlIGF2YWlsYWJsZSBmcm9udGVuZCBwcm9wZXJ0eSB0eXBlcyBhcmUgc2hvd24gb24gdGhlIG5leHQgc2VjdGlvbi48L3BhcmE+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIGlkPSJmZV9wcm9wZXJ0eV9wYXJhbWV0ZXJzIj4KKwk8dGl0bGU+RGlnaXRhbCBUViBwcm9wZXJ0eSBwYXJhbWV0ZXJzPC90aXRsZT4KKwk8c2VjdGlvbiBpZD0iRFRWLVVOREVGSU5FRCI+CisJPHRpdGxlPjxjb25zdGFudD5EVFZfVU5ERUZJTkVEPC9jb25zdGFudD48L3RpdGxlPgorCTxwYXJhPlVzZWQgaW50ZXJuYWxseS4gQSBHRVQvU0VUIG9wZXJhdGlvbiBmb3IgaXQgd29uJ3QgY2hhbmdlIG9yIHJldHVybiBhbnl0aGluZy48L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtVFVORSI+CisJPHRpdGxlPjxjb25zdGFudD5EVFZfVFVORTwvY29uc3RhbnQ+PC90aXRsZT4KKwk8cGFyYT5JbnRlcnByZXQgdGhlIGNhY2hlIG9mIGRhdGEsIGJ1aWxkIGVpdGhlciBhIHRyYWRpdGlvbmFsIGZyb250ZW5kIHR1bmVyZXF1ZXN0IHNvIHdlIGNhbiBwYXNzIHZhbGlkYXRpb24gaW4gdGhlIDxjb25zdGFudD5GRV9TRVRfRlJPTlRFTkQ8L2NvbnN0YW50PiBpb2N0bC48L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtQ0xFQVIiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0NMRUFSPC9jb25zdGFudD48L3RpdGxlPgorCTxwYXJhPlJlc2V0IGEgY2FjaGUgb2YgZGF0YSBzcGVjaWZpYyB0byB0aGUgZnJvbnRlbmQgaGVyZS4gVGhpcyBkb2VzIG5vdCBlZmZlY3QgaGFyZHdhcmUuPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLUZSRVFVRU5DWSI+CisJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0ZSRVFVRU5DWTwvY29uc3RhbnQ+PC90aXRsZT4KKworCQk8cGFyYT5DZW50cmFsIGZyZXF1ZW5jeSBvZiB0aGUgY2hhbm5lbCwgaW4gSFouPC9wYXJhPgorCisJCTxwYXJhPk5vdGVzOjwvcGFyYT4KKwkJPHBhcmE+MSlGb3IgSVNEQi1ULCB0aGUgY2hhbm5lbHMgYXJlIHVzdWFsbHkgdHJhbnNtaXR0ZWQgd2l0aCBhbiBvZmZzZXQgb2YgMTQza0h6LgorCQkJRS5nLiBhIHZhbGlkIGZyZXF1bmN5IGNvdWxkIGJlIDQ3NDE0MyBrSHouIFRoZSBzdGVwcGluZyBpcyBib3VuZCB0byB0aGUgYmFuZHdpZHRoIG9mCisJCQl0aGUgY2hhbm5lbCB3aGljaCBpcyA2TUh6LjwvcGFyYT4KKworCQk8cGFyYT4yKUFzIGluIElTREItVHNiIHRoZSBjaGFubmVsIGNvbnNpc3RzIG9mIG9ubHkgb25lIG9yIHRocmVlIHNlZ21lbnRzIHRoZQorCQkJZnJlcXVlbmN5IHN0ZXAgaXMgNDI5a0h6LCAzKjQyOSByZXNwZWN0aXZlbHkuIEFzIGZvciBJU0RCLVQgdGhlCisJCQljZW50cmFsIGZyZXF1ZW5jeSBvZiB0aGUgY2hhbm5lbCBpcyBleHBlY3RlZC48L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtTU9EVUxBVElPTiI+CisJPHRpdGxlPjxjb25zdGFudD5EVFZfTU9EVUxBVElPTjwvY29uc3RhbnQ+PC90aXRsZT4KKzxwYXJhPlNwZWNpZmllcyB0aGUgZnJvbnRlbmQgbW9kdWxhdGlvbiB0eXBlIGZvciBjYWJsZSBhbmQgc2F0ZWxsaXRlIHR5cGVzLiBUaGUgbW9kdWxhdGlvbiBjYW4gYmUgb25lIG9mIHRoZSB0eXBlcyBiZWxsb3c6PC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorIHR5cGVkZWYgZW51bSBmZV9tb2R1bGF0aW9uIHsKKwlRUFNLLAorCVFBTV8xNiwKKwlRQU1fMzIsCisJUUFNXzY0LAorCVFBTV8xMjgsCisJUUFNXzI1NiwKKwlRQU1fQVVUTywKKwlWU0JfOCwKKwlWU0JfMTYsCisJUFNLXzgsCisJQVBTS18xNiwKKwlBUFNLXzMyLAorCURRUFNLLAorIH0gZmVfbW9kdWxhdGlvbl90OworPC9wcm9ncmFtbGlzdGluZz4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1CQU5EV0lEVEgtSFoiPgorCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9CQU5EV0lEVEhfSFo8L2NvbnN0YW50PjwvdGl0bGU+CisKKwkJPHBhcmE+QmFuZHdpZHRoIGZvciB0aGUgY2hhbm5lbCwgaW4gSFouPC9wYXJhPgorCisJCTxwYXJhPlBvc3NpYmxlIHZhbHVlczoKKwkJCTxjb25zdGFudD4xNzEyMDAwPC9jb25zdGFudD4sCisJCQk8Y29uc3RhbnQ+NTAwMDAwMDwvY29uc3RhbnQ+LAorCQkJPGNvbnN0YW50PjYwMDAwMDA8L2NvbnN0YW50PiwKKwkJCTxjb25zdGFudD43MDAwMDAwPC9jb25zdGFudD4sCisJCQk8Y29uc3RhbnQ+ODAwMDAwMDwvY29uc3RhbnQ+LAorCQkJPGNvbnN0YW50PjEwMDAwMDAwPC9jb25zdGFudD4uCisJCTwvcGFyYT4KKworCQk8cGFyYT5Ob3Rlczo8L3BhcmE+CisKKwkJPHBhcmE+MSkgRm9yIElTREItVCBpdCBzaG91bGQgYmUgYWx3YXlzIDYwMDAwMDBIeiAoNk1Ieik8L3BhcmE+CisJCTxwYXJhPjIpIEZvciBJU0RCLVRzYiBpdCBjYW4gdmFyeSBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBjb25uZWN0ZWQgc2VnbWVudHM8L3BhcmE+CisJCTxwYXJhPjMpIEJhbmR3aWR0aCBkb2Vzbid0IGFwcGx5IGZvciBEVkItQyB0cmFuc21pc3Npb25zLCBhcyB0aGUgYmFuZHdpZHRoCisJCQkgZm9yIERWQi1DIGRlcGVuZHMgb24gdGhlIHN5bWJvbCByYXRlPC9wYXJhPgorCQk8cGFyYT40KSBCYW5kd2lkdGggaW4gSVNEQi1UIGlzIGZpeGVkICg2TUh6KSBvciBjYW4gYmUgZWFzaWx5IGRlcml2ZWQgZnJvbQorCQkJb3RoZXIgcGFyYW1ldGVycyAoRFRWX0lTREJUX1NCX1NFR01FTlRfSURYLAorCQkJRFRWX0lTREJUX1NCX1NFR01FTlRfQ09VTlQpLjwvcGFyYT4KKwkJPHBhcmE+NSkgRFZCLVQgc3VwcG9ydHMgNiwgNyBhbmQgOE1Iei48L3BhcmE+CisJCTxwYXJhPjYpIEluIGFkZGl0aW9uLCBEVkItVDIgc3VwcG9ydHMgMS4xNzIsIDUgYW5kIDEwTUh6LjwvcGFyYT4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1JTlZFUlNJT04iPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lOVkVSU0lPTjwvY29uc3RhbnQ+PC90aXRsZT4KKwk8cGFyYT5UaGUgSW52ZXJzaW9uIGZpZWxkIGNhbiB0YWtlIG9uZSBvZiB0aGVzZSB2YWx1ZXM6CisJPC9wYXJhPgorCTxwcm9ncmFtbGlzdGluZz4KKwl0eXBlZGVmIGVudW0gZmVfc3BlY3RyYWxfaW52ZXJzaW9uIHsKKwkJSU5WRVJTSU9OX09GRiwKKwkJSU5WRVJTSU9OX09OLAorCQlJTlZFUlNJT05fQVVUTworCX0gZmVfc3BlY3RyYWxfaW52ZXJzaW9uX3Q7CisJPC9wcm9ncmFtbGlzdGluZz4KKwk8cGFyYT5JdCBpbmRpY2F0ZXMgaWYgc3BlY3RyYWwgaW52ZXJzaW9uIHNob3VsZCBiZSBwcmVzdW1lZCBvciBub3QuIEluIHRoZSBhdXRvbWF0aWMgc2V0dGluZworCSg8Y29uc3RhbnQ+SU5WRVJTSU9OX0FVVE88L2NvbnN0YW50PikgdGhlIGhhcmR3YXJlIHdpbGwgdHJ5IHRvIGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3Qgc2V0dGluZyBieQorCWl0c2VsZi4KKwk8L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtRElTRVFDLU1BU1RFUiI+CisJPHRpdGxlPjxjb25zdGFudD5EVFZfRElTRVFDX01BU1RFUjwvY29uc3RhbnQ+PC90aXRsZT4KKwk8cGFyYT5DdXJyZW50bHkgbm90IGltcGxlbWVudGVkLjwvcGFyYT4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1TWU1CT0wtUkFURSI+CisJPHRpdGxlPjxjb25zdGFudD5EVFZfU1lNQk9MX1JBVEU8L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+RGlnaXRhbCBUViBzeW1ib2wgcmF0ZSwgaW4gYmF1ZHMgKHN5bWJvbHMvc2Vjb25kKS4gVXNlZCBvbiBjYWJsZSBzdGFuZGFyZHMuPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLUlOTkVSLUZFQyI+CisJPHRpdGxlPjxjb25zdGFudD5EVFZfSU5ORVJfRkVDPC9jb25zdGFudD48L3RpdGxlPgorCTxwYXJhPlVzZWQgY2FibGUvc2F0ZWxsaXRlIHRyYW5zbWlzc2lvbnMuIFRoZSBhY2NlcHRhYmxlIHZhbHVlcyBhcmU6CisJPC9wYXJhPgorCTxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgZW51bSBmZV9jb2RlX3JhdGUgeworCUZFQ19OT05FID0gMCwKKwlGRUNfMV8yLAorCUZFQ18yXzMsCisJRkVDXzNfNCwKKwlGRUNfNF81LAorCUZFQ181XzYsCisJRkVDXzZfNywKKwlGRUNfN184LAorCUZFQ184XzksCisJRkVDX0FVVE8sCisJRkVDXzNfNSwKKwlGRUNfOV8xMCwKK30gZmVfY29kZV9yYXRlX3Q7CisJPC9wcm9ncmFtbGlzdGluZz4KKwk8cGFyYT53aGljaCBjb3JyZXNwb25kIHRvIGVycm9yIGNvcnJlY3Rpb24gcmF0ZXMgb2YgMS8yLCAyLzMsIGV0Yy4sCisJbm8gZXJyb3IgY29ycmVjdGlvbiBvciBhdXRvIGRldGVjdGlvbi48L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtVk9MVEFHRSI+CisJPHRpdGxlPjxjb25zdGFudD5EVFZfVk9MVEFHRTwvY29uc3RhbnQ+PC90aXRsZT4KKwk8cGFyYT5UaGUgdm9sdGFnZSBpcyB1c3VhbGx5IHVzZWQgd2l0aCBub24tRGlTRXFDIGNhcGFibGUgTE5CcyB0byBzd2l0Y2gKKwl0aGUgcG9sYXJ6YXRpb24gKGhvcml6b250YWwvdmVydGljYWwpLiBXaGVuIHVzaW5nIERpU0VxQyBlcHVpcG1lbnQgdGhpcworCXZvbHRhZ2UgaGFzIHRvIGJlIHN3aXRjaGVkIGNvbnNpc3RlbnRseSB0byB0aGUgRGlTRXFDIGNvbW1hbmRzIGFzCisJZGVzY3JpYmVkIGluIHRoZSBEaVNFcUMgc3BlYy48L3BhcmE+CisJPHByb2dyYW1saXN0aW5nPgorCQl0eXBlZGVmIGVudW0gZmVfc2VjX3ZvbHRhZ2UgeworCQlTRUNfVk9MVEFHRV8xMywKKwkJU0VDX1ZPTFRBR0VfMTgKKwkJfSBmZV9zZWNfdm9sdGFnZV90OworCTwvcHJvZ3JhbWxpc3Rpbmc+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtVE9ORSI+CisJPHRpdGxlPjxjb25zdGFudD5EVFZfVE9ORTwvY29uc3RhbnQ+PC90aXRsZT4KKwk8cGFyYT5DdXJyZW50bHkgbm90IHVzZWQuPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLVBJTE9UIj4KKwk8dGl0bGU+PGNvbnN0YW50PkRUVl9QSUxPVDwvY29uc3RhbnQ+PC90aXRsZT4KKwk8cGFyYT5TZXRzIERWQi1TMiBwaWxvdDwvcGFyYT4KKwk8c2VjdGlvbiBpZD0iZmUtcGlsb3QtdCI+CisJCTx0aXRsZT5mZV9waWxvdCB0eXBlPC90aXRsZT4KKwkJPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBlbnVtIGZlX3BpbG90IHsKKwlQSUxPVF9PTiwKKwlQSUxPVF9PRkYsCisJUElMT1RfQVVUTywKK30gZmVfcGlsb3RfdDsKKwkJPC9wcm9ncmFtbGlzdGluZz4KKwkJPC9zZWN0aW9uPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLVJPTExPRkYiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX1JPTExPRkY8L2NvbnN0YW50PjwvdGl0bGU+CisJCTxwYXJhPlNldHMgRFZCLVMyIHJvbGxvZmY8L3BhcmE+CisKKwk8c2VjdGlvbiBpZD0iZmUtcm9sbG9mZi10Ij4KKwkJPHRpdGxlPmZlX3JvbGxvZmYgdHlwZTwvdGl0bGU+CisJCTxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgZW51bSBmZV9yb2xsb2ZmIHsKKwlST0xMT0ZGXzM1LCAvKiBJbXBsaWVkIHZhbHVlIGluIERWQi1TLCBkZWZhdWx0IGZvciBEVkItUzIgKi8KKwlST0xMT0ZGXzIwLAorCVJPTExPRkZfMjUsCisJUk9MTE9GRl9BVVRPLAorfSBmZV9yb2xsb2ZmX3Q7CisJCTwvcHJvZ3JhbWxpc3Rpbmc+CisJCTwvc2VjdGlvbj4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1ESVNFUUMtU0xBVkUtUkVQTFkiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0RJU0VRQ19TTEFWRV9SRVBMWTwvY29uc3RhbnQ+PC90aXRsZT4KKwk8cGFyYT5DdXJyZW50bHkgbm90IGltcGxlbWVudGVkLjwvcGFyYT4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1GRS1DQVBBQklMSVRZLUNPVU5UIj4KKwk8dGl0bGU+PGNvbnN0YW50PkRUVl9GRV9DQVBBQklMSVRZX0NPVU5UPC9jb25zdGFudD48L3RpdGxlPgorCTxwYXJhPkN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQuPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLUZFLUNBUEFCSUxJVFkiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0ZFX0NBUEFCSUxJVFk8L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+Q3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZC48L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtREVMSVZFUlktU1lTVEVNIj4KKwkJPHRpdGxlPjxjb25zdGFudD5EVFZfREVMSVZFUllfU1lTVEVNPC9jb25zdGFudD48L3RpdGxlPgorCQk8cGFyYT5TcGVjaWZpZXMgdGhlIHR5cGUgb2YgRGVsaXZlcnkgc3lzdGVtPC9wYXJhPgorCQk8c2VjdGlvbiBpZD0iZmUtZGVsaXZlcnktc3lzdGVtLXQiPgorCQk8dGl0bGU+ZmVfZGVsaXZlcnlfc3lzdGVtIHR5cGU8L3RpdGxlPgorCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgZW51bSBmZV9kZWxpdmVyeV9zeXN0ZW0geworCVNZU19VTkRFRklORUQsCisJU1lTX0RWQkNfQU5ORVhfQUMsCisJU1lTX0RWQkNfQU5ORVhfQiwKKwlTWVNfRFZCVCwKKwlTWVNfRFNTLAorCVNZU19EVkJTLAorCVNZU19EVkJTMiwKKwlTWVNfRFZCSCwKKwlTWVNfSVNEQlQsCisJU1lTX0lTREJTLAorCVNZU19JU0RCQywKKwlTWVNfQVRTQywKKwlTWVNfQVRTQ01ILAorCVNZU19ETUJUSCwKKwlTWVNfQ01NQiwKKwlTWVNfREFCLAorCVNZU19EVkJUMiwKK30gZmVfZGVsaXZlcnlfc3lzdGVtX3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorCQk8L3NlY3Rpb24+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtSVNEQlQtUEFSVElBTC1SRUNFUFRJT04iPgorCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9QQVJUSUFMX1JFQ0VQVElPTjwvY29uc3RhbnQ+PC90aXRsZT4KKworCQk8cGFyYT5JZiA8Y29uc3RhbnQ+RFRWX0lTREJUX1NPVU5EX0JST0FEQ0FTVElORzwvY29uc3RhbnQ+IGlzICcwJyB0aGlzIGJpdC1maWVsZCByZXByZXNlbnRzIHdoZXRoZXIKKwkJCXRoZSBjaGFubmVsIGlzIGluIHBhcnRpYWwgcmVjZXB0aW9uIG1vZGUgb3Igbm90LjwvcGFyYT4KKworCQk8cGFyYT5JZiAnMScgPGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUkFfKjwvY29uc3RhbnQ+IHZhbHVlcyBhcmUgYXNzaWduZWQgdG8gdGhlIGNlbnRlciBzZWdtZW50IGFuZAorCQkJPGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUkFfU0VHTUVOVF9DT1VOVDwvY29uc3RhbnQ+IGhhcyB0byBiZSAnMScuPC9wYXJhPgorCisJCTxwYXJhPklmIGluIGFkZGl0aW9uIDxjb25zdGFudD5EVFZfSVNEQlRfU09VTkRfQlJPQURDQVNUSU5HPC9jb25zdGFudD4gaXMgJzEnCisJCQk8Y29uc3RhbnQ+RFRWX0lTREJUX1BBUlRJQUxfUkVDRVBUSU9OPC9jb25zdGFudD4gcmVwcmVzZW50cyB3aGV0aGVyIHRoaXMgSVNEQi1Uc2IgY2hhbm5lbAorCQkJaXMgY29uc2lzdGluZyBvZiBvbmUgc2VnbWVudCBhbmQgbGF5ZXIgb3IgdGhyZWUgc2VnbWVudHMgYW5kIHR3byBsYXllcnMuPC9wYXJhPgorCisJCTxwYXJhPlBvc3NpYmxlIHZhbHVlczogMCwgMSwgLTEgKEFVVE8pPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLUlTREJULVNPVU5ELUJST0FEQ0FTVElORyI+CisJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lTREJUX1NPVU5EX0JST0FEQ0FTVElORzwvY29uc3RhbnQ+PC90aXRsZT4KKworCQk8cGFyYT5UaGlzIGZpZWxkIHJlcHJlc2VudHMgd2hldGhlciB0aGUgb3RoZXIgRFRWX0lTREJUXyotcGFyYW1ldGVycyBhcmUKKwkJCXJlZmVycmluZyB0byBhbiBJU0RCLVQgYW5kIGFuIElTREItVHNiIGNoYW5uZWwuIChTZWUgYWxzbworCQkJPGNvbnN0YW50PkRUVl9JU0RCVF9QQVJUSUFMX1JFQ0VQVElPTjwvY29uc3RhbnQ+KS48L3BhcmE+CisKKwkJPHBhcmE+UG9zc2libGUgdmFsdWVzOiAwLCAxLCAtMSAoQVVUTyk8L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtSVNEQlQtU0ItU1VCQ0hBTk5FTC1JRCI+CisJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lTREJUX1NCX1NVQkNIQU5ORUxfSUQ8L2NvbnN0YW50PjwvdGl0bGU+CisKKwkJPHBhcmE+VGhpcyBmaWVsZCBvbmx5IGFwcGxpZXMgaWYgPGNvbnN0YW50PkRUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PiBpcyAnMScuPC9wYXJhPgorCisJCTxwYXJhPihOb3RlIG9mIHRoZSBhdXRob3I6IFRoaXMgbWlnaHQgbm90IGJlIHRoZSBjb3JyZWN0IGRlc2NyaXB0aW9uIG9mIHRoZQorCQkJPGNvbnN0YW50PlNVQkNIQU5ORUwtSUQ8L2NvbnN0YW50PiBpbiBhbGwgZGV0YWlscywgYnV0IGl0IGlzIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIHRlY2huaWNhbAorCQkJYmFja2dyb3VuZCBuZWVkZWQgdG8gcHJvZ3JhbSBhIGRldmljZSk8L3BhcmE+CisKKwkJPHBhcmE+QW4gSVNEQi1Uc2IgY2hhbm5lbCAoMSBvciAzIHNlZ21lbnRzKSBjYW4gYmUgYnJvYWRjYXN0ZWQgYWxvbmUgb3IgaW4gYQorCQkJc2V0IG9mIGNvbm5lY3RlZCBJU0RCLVRzYiBjaGFubmVscy4gSW4gdGhpcyBzZXQgb2YgY2hhbm5lbHMgZXZlcnkKKwkJCWNoYW5uZWwgY2FuIGJlIHJlY2VpdmVkIGluZGVwZW5kZW50bHkuIFRoZSBudW1iZXIgb2YgY29ubmVjdGVkCisJCQlJU0RCLVRzYiBzZWdtZW50IGNhbiB2YXJ5LCBlLmcuIGRlcGVuZGluZyBvbiB0aGUgZnJlcXVlbmN5IHNwZWN0cnVtCisJCQliYW5kd2lkdGggYXZhaWxhYmxlLjwvcGFyYT4KKworCQk8cGFyYT5FeGFtcGxlOiBBc3N1bWUgOCBJU0RCLVRzYiBjb25uZWN0ZWQgc2VnbWVudHMgYXJlIGJyb2FkY2FzdGVkLiBUaGUKKwkJCWJyb2FkY2FzdGVyIGhhcyBzZXZlcmFsIHBvc3NpYmlsaXRpZXMgdG8gcHV0IHRob3NlIGNoYW5uZWxzIGluIHRoZQorCQkJYWlyOiBBc3N1bWluZyBhIG5vcm1hbCAxMy1zZWdtZW50IElTREItVCBzcGVjdHJ1bSBoZSBjYW4gYWxpZ24gdGhlIDgKKwkJCXNlZ21lbnRzIGZyb20gcG9zaXRpb24gMS04IHRvIDUtMTMgb3IgYW55dGhpbmcgaW4gYmV0d2Vlbi48L3BhcmE+CisKKwkJPHBhcmE+VGhlIHVuZGVybHlpbmcgbGF5ZXIgb2Ygc2VnbWVudHMgYXJlIHN1YmNoYW5uZWxzOiBlYWNoIHNlZ21lbnQgaXMKKwkJCWNvbnNpc3Rpbmcgb2Ygc2V2ZXJhbCBzdWJjaGFubmVscyB3aXRoIGEgcHJlZGVmaW5lZCBJRHMuIEEgc3ViLWNoYW5uZWwKKwkJCWlzIHVzZWQgdG8gaGVscCB0aGUgZGVtb2R1bGF0b3IgdG8gc3luY2hyb25pemUgb24gdGhlIGNoYW5uZWwuPC9wYXJhPgorCisJCTxwYXJhPkFuIElTREItVCBjaGFubmVsIGlzIGFsd2F5cyBjZW50ZXJlZCBvdmVyIGFsbCBzdWItY2hhbm5lbHMuIEFzIGZvcgorCQkJdGhlIGV4YW1wbGUgYWJvdmUsIGluIElTREItVHNiIGl0IGlzIG5vIGxvbmdlciBhcyBzaW1wbGUgYXMgdGhhdC48L3BhcmE+CisKKwkJPHBhcmE+PGNvbnN0YW50PlRoZSBEVFZfSVNEQlRfU0JfU1VCQ0hBTk5FTF9JRDwvY29uc3RhbnQ+IHBhcmFtZXRlciBpcyB1c2VkIHRvIGdpdmUgdGhlCisJCQlzdWItY2hhbm5lbCBJRCBvZiB0aGUgc2VnbWVudCB0byBiZSBkZW1vZHVsYXRlZC48L3BhcmE+CisKKwkJPHBhcmE+UG9zc2libGUgdmFsdWVzOiAwIC4uIDQxLCAtMSAoQVVUTyk8L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtSVNEQlQtU0ItU0VHTUVOVC1JRFgiPgorCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9TQl9TRUdNRU5UX0lEWDwvY29uc3RhbnQ+PC90aXRsZT4KKwkJPHBhcmE+VGhpcyBmaWVsZCBvbmx5IGFwcGxpZXMgaWYgPGNvbnN0YW50PkRUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PiBpcyAnMScuPC9wYXJhPgorCQk8cGFyYT48Y29uc3RhbnQ+RFRWX0lTREJUX1NCX1NFR01FTlRfSURYPC9jb25zdGFudD4gZ2l2ZXMgdGhlIGluZGV4IG9mIHRoZSBzZWdtZW50IHRvIGJlCisJCQlkZW1vZHVsYXRlZCBmb3IgYW4gSVNEQi1Uc2IgY2hhbm5lbCB3aGVyZSBzZXZlcmFsIG9mIHRoZW0gYXJlCisJCQl0cmFuc21pdHRlZCBpbiB0aGUgY29ubmVjdGVkIG1hbm5lci48L3BhcmE+CisJCTxwYXJhPlBvc3NpYmxlIHZhbHVlczogMCAuLiA8Y29uc3RhbnQ+RFRWX0lTREJUX1NCX1NFR01FTlRfQ09VTlQ8L2NvbnN0YW50PiAtIDE8L3BhcmE+CisJCTxwYXJhPk5vdGU6IFRoaXMgdmFsdWUgY2Fubm90IGJlIGRldGVybWluZWQgYnkgYW4gYXV0b21hdGljIGNoYW5uZWwgc2VhcmNoLjwvcGFyYT4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1JU0RCVC1TQi1TRUdNRU5ULUNPVU5UIj4KKwkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfU0JfU0VHTUVOVF9DT1VOVDwvY29uc3RhbnQ+PC90aXRsZT4KKwkJPHBhcmE+VGhpcyBmaWVsZCBvbmx5IGFwcGxpZXMgaWYgPGNvbnN0YW50PkRUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PiBpcyAnMScuPC9wYXJhPgorCQk8cGFyYT48Y29uc3RhbnQ+RFRWX0lTREJUX1NCX1NFR01FTlRfQ09VTlQ8L2NvbnN0YW50PiBnaXZlcyB0aGUgdG90YWwgY291bnQgb2YgY29ubmVjdGVkIElTREItVHNiCisJCQljaGFubmVscy48L3BhcmE+CisJCTxwYXJhPlBvc3NpYmxlIHZhbHVlczogMSAuLiAxMzwvcGFyYT4KKwkJPHBhcmE+Tm90ZTogVGhpcyB2YWx1ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBieSBhbiBhdXRvbWF0aWMgY2hhbm5lbCBzZWFyY2guPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iaXNkYi1oaWVycS1sYXllcnMiPgorCQk8dGl0bGU+PGNvbnN0YW50PkRUVi1JU0RCVC1MQVlFUio8L2NvbnN0YW50PiBwYXJhbWV0ZXJzPC90aXRsZT4KKwkJPHBhcmE+SVNEQi1UIGNoYW5uZWxzIGNhbiBiZSBjb2RlZCBoaWVyYXJjaGljYWxseS4gQXMgb3Bwb3NlZCB0byBEVkItVCBpbgorCQkJSVNEQi1UIGhpZXJhcmNoaWNhbCBsYXllcnMgY2FuIGJlIGRlY29kZWQgc2ltdWx0YW5lb3VzbHkuIEZvciB0aGF0CisJCQlyZWFzb24gYSBJU0RCLVQgZGVtb2R1bGF0b3IgaGFzIDMgdml0ZXJiaSBhbmQgMyByZWVkLXNvbG9tb24tZGVjb2RlcnMuPC9wYXJhPgorCQk8cGFyYT5JU0RCLVQgaGFzIDMgaGllcmFyY2hpY2FsIGxheWVycyB3aGljaCBlYWNoIGNhbiB1c2UgYSBwYXJ0IG9mIHRoZQorCQkJYXZhaWxhYmxlIHNlZ21lbnRzLiBUaGUgdG90YWwgbnVtYmVyIG9mIHNlZ21lbnRzIG92ZXIgYWxsIGxheWVycyBoYXMKKwkJCXRvIDEzIGluIElTREItVC48L3BhcmE+CisJCTxwYXJhPlRoZXJlIGFyZSAzIHBhcmFtZXRlciBzZXRzLCBmb3IgTGF5ZXJzIEEsIEIgYW5kIEMuPC9wYXJhPgorCQk8c2VjdGlvbiBpZD0iRFRWLUlTREJULUxBWUVSLUVOQUJMRUQiPgorCQkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJfRU5BQkxFRDwvY29uc3RhbnQ+PC90aXRsZT4KKwkJCTxwYXJhPkhpZXJhcmNoaWNhbCByZWNlcHRpb24gaW4gSVNEQi1UIGlzIGFjaGlldmVkIGJ5IGVuYWJsaW5nIG9yIGRpc2FibGluZworCQkJCWxheWVycyBpbiB0aGUgZGVjb2RpbmcgcHJvY2Vzcy4gU2V0dGluZyBhbGwgYml0cyBvZgorCQkJCTxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJfRU5BQkxFRDwvY29uc3RhbnQ+IHRvICcxJyBmb3JjZXMgYWxsIGxheWVycyAoaWYgYXBwbGljYWJsZSkgdG8gYmUKKwkJCQlkZW1vZHVsYXRlZC4gVGhpcyBpcyB0aGUgZGVmYXVsdC48L3BhcmE+CisJCQk8cGFyYT5JZiB0aGUgY2hhbm5lbCBpcyBpbiB0aGUgcGFydGlhbCByZWNlcHRpb24gbW9kZQorCQkJCSg8Y29uc3RhbnQ+RFRWX0lTREJUX1BBUlRJQUxfUkVDRVBUSU9OPC9jb25zdGFudD4gPSAxKSB0aGUgY2VudHJhbCBzZWdtZW50IGNhbiBiZSBkZWNvZGVkCisJCQkJaW5kZXBlbmRlbnRseSBvZiB0aGUgb3RoZXIgMTIgc2VnbWVudHMuIEluIHRoYXQgbW9kZSBsYXllciBBIGhhcyB0bworCQkJCWhhdmUgYSA8Y29uc3RhbnQ+U0VHTUVOVF9DT1VOVDwvY29uc3RhbnQ+IG9mIDEuPC9wYXJhPgorCQkJPHBhcmE+SW4gSVNEQi1Uc2Igb25seSBsYXllciBBIGlzIHVzZWQsIGl0IGNhbiBiZSAxIG9yIDMgaW4gSVNEQi1Uc2IKKwkJCQlhY2NvcmRpbmcgdG8gPGNvbnN0YW50PkRUVl9JU0RCVF9QQVJUSUFMX1JFQ0VQVElPTjwvY29uc3RhbnQ+LiA8Y29uc3RhbnQ+U0VHTUVOVF9DT1VOVDwvY29uc3RhbnQ+IG11c3QgYmUgZmlsbGVkCisJCQkJYWNjb3JkaW5nbHkuPC9wYXJhPgorCQkJPHBhcmE+UG9zc2libGUgdmFsdWVzOiAweDEsIDB4MiwgMHg0ICh8LWFibGUpPC9wYXJhPgorCQkJPHBhcmE+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUl9FTkFCTEVEWzA6MF08L2NvbnN0YW50PiAtIGxheWVyIEE8L3BhcmE+CisJCQk8cGFyYT48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSX0VOQUJMRURbMToxXTwvY29uc3RhbnQ+IC0gbGF5ZXIgQjwvcGFyYT4KKwkJCTxwYXJhPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJfRU5BQkxFRFsyOjJdPC9jb25zdGFudD4gLSBsYXllciBDPC9wYXJhPgorCQkJPHBhcmE+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUl9FTkFCTEVEWzMxOjNdPC9jb25zdGFudD4gdW51c2VkPC9wYXJhPgorCQk8L3NlY3Rpb24+CisJCTxzZWN0aW9uIGlkPSJEVFYtSVNEQlQtTEFZRVItRkVDIj4KKwkJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSKl9GRUM8L2NvbnN0YW50PjwvdGl0bGU+CisJCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDxjb25zdGFudD5GRUNfQVVUTzwvY29uc3RhbnQ+LCA8Y29uc3RhbnQ+RkVDXzFfMjwvY29uc3RhbnQ+LCA8Y29uc3RhbnQ+RkVDXzJfMzwvY29uc3RhbnQ+LCA8Y29uc3RhbnQ+RkVDXzNfNDwvY29uc3RhbnQ+LCA8Y29uc3RhbnQ+RkVDXzVfNjwvY29uc3RhbnQ+LCA8Y29uc3RhbnQ+RkVDXzdfODwvY29uc3RhbnQ+PC9wYXJhPgorCQk8L3NlY3Rpb24+CisJCTxzZWN0aW9uIGlkPSJEVFYtSVNEQlQtTEFZRVItTU9EVUxBVElPTiI+CisJCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUipfTU9EVUxBVElPTjwvY29uc3RhbnQ+PC90aXRsZT4KKwkJCTxwYXJhPlBvc3NpYmxlIHZhbHVlczogPGNvbnN0YW50PlFBTV9BVVRPPC9jb25zdGFudD4sIFFQPGNvbnN0YW50PlNLLCBRQU1fMTY8L2NvbnN0YW50PiwgPGNvbnN0YW50PlFBTV82NDwvY29uc3RhbnQ+LCA8Y29uc3RhbnQ+RFFQU0s8L2NvbnN0YW50PjwvcGFyYT4KKwkJCTxwYXJhPk5vdGU6IElmIGxheWVyIEMgaXMgPGNvbnN0YW50PkRRUFNLPC9jb25zdGFudD4gbGF5ZXIgQiBoYXMgdG8gYmUgPGNvbnN0YW50PkRRUFNLPC9jb25zdGFudD4uIElmIGxheWVyIEIgaXMgPGNvbnN0YW50PkRRUFNLPC9jb25zdGFudD4KKwkJCQlhbmQgPGNvbnN0YW50PkRUVl9JU0RCVF9QQVJUSUFMX1JFQ0VQVElPTjwvY29uc3RhbnQ+PTAgbGF5ZXIgaGFzIHRvIGJlIDxjb25zdGFudD5EUVBTSzwvY29uc3RhbnQ+LjwvcGFyYT4KKwkJPC9zZWN0aW9uPgorCQk8c2VjdGlvbiBpZD0iRFRWLUlTREJULUxBWUVSLVNFR01FTlQtQ09VTlQiPgorCQkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVIqX1NFR01FTlRfQ09VTlQ8L2NvbnN0YW50PjwvdGl0bGU+CisJCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAtMSAoQVVUTyk8L3BhcmE+CisJCQk8cGFyYT5Ob3RlOiBUcnV0aCB0YWJsZSBmb3IgPGNvbnN0YW50PkRUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PiBhbmQKKwkJCQk8Y29uc3RhbnQ+RFRWX0lTREJUX1BBUlRJQUxfUkVDRVBUSU9OPC9jb25zdGFudD4gYW5kIDxjb25zdGFudD5MQVlFUjwvY29uc3RhbnQ+Kl9TRUdNRU5UX0NPVU5UPC9wYXJhPgorCQkJPGluZm9ybWFsdGFibGUgaWQ9ImlzZGJ0LWxheWVyX3NlZy1jbnQtdGFibGUiPgorCQkJCTx0Z3JvdXAgY29scz0iNiI+CisJCQkJCTx0Ym9keT4KKwkJCQkJCTxyb3c+CisJCQkJCQkJPGVudHJ5PlBSPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+U0I8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT5MYXllciBBIHdpZHRoPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+TGF5ZXIgQiB3aWR0aDwvZW50cnk+CisJCQkJCQkJPGVudHJ5PkxheWVyIEMgd2lkdGg8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT50b3RhbCB3aWR0aDwvZW50cnk+CisJCQkJCQk8L3Jvdz4KKwkJCQkJCTxyb3c+CisJCQkJCQkJPGVudHJ5PjA8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4wPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+MSAuLiAxMzwvZW50cnk+CisJCQkJCQkJPGVudHJ5PjEgLi4gMTM8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4xIC4uIDEzPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+MTM8L2VudHJ5PgorCQkJCQkJPC9yb3c+CisJCQkJCQk8cm93PgorCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+MDwvZW50cnk+CisJCQkJCQkJPGVudHJ5PjE8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4xIC4uIDEzPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+MSAuLiAxMzwvZW50cnk+CisJCQkJCQkJPGVudHJ5PjEzPC9lbnRyeT4KKwkJCQkJCTwvcm93PgorCQkJCQkJPHJvdz4KKwkJCQkJCQk8ZW50cnk+MDwvZW50cnk+CisJCQkJCQkJPGVudHJ5PjE8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+MDwvZW50cnk+CisJCQkJCQkJPGVudHJ5PjA8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KKwkJCQkJCTwvcm93PgorCQkJCQkJPHJvdz4KKwkJCQkJCQk8ZW50cnk+MTwvZW50cnk+CisJCQkJCQkJPGVudHJ5PjE8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+MjwvZW50cnk+CisJCQkJCQkJPGVudHJ5PjA8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4xMzwvZW50cnk+CisJCQkJCQk8L3Jvdz4KKwkJCQkJPC90Ym9keT4KKwkJCQk8L3Rncm91cD4KKwkJCTwvaW5mb3JtYWx0YWJsZT4KKwkJPC9zZWN0aW9uPgorCQk8c2VjdGlvbiBpZD0iRFRWLUlTREJULUxBWUVSLVRJTUUtSU5URVJMRUFWSU5HIj4KKwkJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSKl9USU1FX0lOVEVSTEVBVklORzwvY29uc3RhbnQ+PC90aXRsZT4KKwkJCTxwYXJhPlBvc3NpYmxlIHZhbHVlczogMCwgMSwgMiwgMywgLTEgKEFVVE8pPC9wYXJhPgorCQkJPHBhcmE+Tm90ZTogVGhlIHJlYWwgaW50ZXItbGVhdmVyIGRlcHRoLW5hbWVzIGRlcGVuZCBvbiB0aGUgbW9kZSAoZmZ0LXNpemUpOyB0aGUgdmFsdWVzCisJCQkJaGVyZSBhcmUgcmVmZXJyaW5nIHRvIHdoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBUTUNDLXN0cnVjdHVyZSAtCisJCQkJaW5kZXBlbmRlbnQgb2YgdGhlIG1vZGUuPC9wYXJhPgorCQk8L3NlY3Rpb24+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtQVBJLVZFUlNJT04iPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0FQSV9WRVJTSU9OPC9jb25zdGFudD48L3RpdGxlPgorCTxwYXJhPlJldHVybnMgdGhlIG1ham9yL21pbm9yIHZlcnNpb24gb2YgdGhlIERWQiBBUEk8L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtQ09ERS1SQVRFLUhQIj4KKwk8dGl0bGU+PGNvbnN0YW50PkRUVl9DT0RFX1JBVEVfSFA8L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+VXNlZCBvbiB0ZXJyZXN0cmlhbCB0cmFuc21pc3Npb25zLiBUaGUgYWNjZXB0YWJsZSB2YWx1ZXMgYXJlOgorCTwvcGFyYT4KKwk8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIGVudW0gZmVfY29kZV9yYXRlIHsKKwlGRUNfTk9ORSA9IDAsCisJRkVDXzFfMiwKKwlGRUNfMl8zLAorCUZFQ18zXzQsCisJRkVDXzRfNSwKKwlGRUNfNV82LAorCUZFQ182XzcsCisJRkVDXzdfOCwKKwlGRUNfOF85LAorCUZFQ19BVVRPLAorCUZFQ18zXzUsCisJRkVDXzlfMTAsCit9IGZlX2NvZGVfcmF0ZV90OworCTwvcHJvZ3JhbWxpc3Rpbmc+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtQ09ERS1SQVRFLUxQIj4KKwk8dGl0bGU+PGNvbnN0YW50PkRUVl9DT0RFX1JBVEVfTFA8L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+VXNlZCBvbiB0ZXJyZXN0cmlhbCB0cmFuc21pc3Npb25zLiBUaGUgYWNjZXB0YWJsZSB2YWx1ZXMgYXJlOgorCTwvcGFyYT4KKwk8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIGVudW0gZmVfY29kZV9yYXRlIHsKKwlGRUNfTk9ORSA9IDAsCisJRkVDXzFfMiwKKwlGRUNfMl8zLAorCUZFQ18zXzQsCisJRkVDXzRfNSwKKwlGRUNfNV82LAorCUZFQ182XzcsCisJRkVDXzdfOCwKKwlGRUNfOF85LAorCUZFQ19BVVRPLAorCUZFQ18zXzUsCisJRkVDXzlfMTAsCit9IGZlX2NvZGVfcmF0ZV90OworCTwvcHJvZ3JhbWxpc3Rpbmc+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtR1VBUkQtSU5URVJWQUwiPgorCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9HVUFSRF9JTlRFUlZBTDwvY29uc3RhbnQ+PC90aXRsZT4KKworCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXMgYXJlOjwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgZW51bSBmZV9ndWFyZF9pbnRlcnZhbCB7CisJR1VBUkRfSU5URVJWQUxfMV8zMiwKKwlHVUFSRF9JTlRFUlZBTF8xXzE2LAorCUdVQVJEX0lOVEVSVkFMXzFfOCwKKwlHVUFSRF9JTlRFUlZBTF8xXzQsCisJR1VBUkRfSU5URVJWQUxfQVVUTywKKwlHVUFSRF9JTlRFUlZBTF8xXzEyOCwKKwlHVUFSRF9JTlRFUlZBTF8xOV8xMjgsCisJR1VBUkRfSU5URVJWQUxfMTlfMjU2LAorfSBmZV9ndWFyZF9pbnRlcnZhbF90OworPC9wcm9ncmFtbGlzdGluZz4KKworCQk8cGFyYT5Ob3Rlczo8L3BhcmE+CisJCTxwYXJhPjEpIElmIDxjb25zdGFudD5EVFZfR1VBUkRfSU5URVJWQUw8L2NvbnN0YW50PiBpcyBzZXQgdGhlIDxjb25zdGFudD5HVUFSRF9JTlRFUlZBTF9BVVRPPC9jb25zdGFudD4gdGhlIGhhcmR3YXJlIHdpbGwKKwkJCXRyeSB0byBmaW5kIHRoZSBjb3JyZWN0IGd1YXJkIGludGVydmFsIChpZiBjYXBhYmxlKSBhbmQgd2lsbCB1c2UgVE1DQyB0byBmaWxsCisJCQlpbiB0aGUgbWlzc2luZyBwYXJhbWV0ZXJzLjwvcGFyYT4KKwkJPHBhcmE+MikgSW50ZXJ2YWxzIDEvMTI4LCAxOS8xMjggYW5kIDE5LzI1NiBhcmUgdXNlZCBvbmx5IGZvciBEVkItVDIgYXQgcHJlc2VudDwvcGFyYT4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1UUkFOU01JU1NJT04tTU9ERSI+CisJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX1RSQU5TTUlTU0lPTl9NT0RFPC9jb25zdGFudD48L3RpdGxlPgorCisJCTxwYXJhPlNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNhcnJpZXJzIHVzZWQgYnkgdGhlIHN0YW5kYXJkPC9wYXJhPgorCisJCTxwYXJhPlBvc3NpYmxlIHZhbHVlcyBhcmU6PC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBlbnVtIGZlX3RyYW5zbWl0X21vZGUgeworCVRSQU5TTUlTU0lPTl9NT0RFXzJLLAorCVRSQU5TTUlTU0lPTl9NT0RFXzhLLAorCVRSQU5TTUlTU0lPTl9NT0RFX0FVVE8sCisJVFJBTlNNSVNTSU9OX01PREVfNEssCisJVFJBTlNNSVNTSU9OX01PREVfMUssCisJVFJBTlNNSVNTSU9OX01PREVfMTZLLAorCVRSQU5TTUlTU0lPTl9NT0RFXzMySywKK30gZmVfdHJhbnNtaXRfbW9kZV90OworPC9wcm9ncmFtbGlzdGluZz4KKwkJPHBhcmE+Tm90ZXM6PC9wYXJhPgorCQk8cGFyYT4xKSBJU0RCLVQgc3VwcG9ydHMgdGhyZWUgY2Fycmllci9zeW1ib2wtc2l6ZTogOEssIDRLLCAySy4gSXQgaXMgY2FsbGVkCisJCQknbW9kZScgaW4gdGhlIHN0YW5kYXJkOiBNb2RlIDEgaXMgMkssIG1vZGUgMiBpcyA0SywgbW9kZSAzIGlzIDhLPC9wYXJhPgorCisJCTxwYXJhPjIpIElmIDxjb25zdGFudD5EVFZfVFJBTlNNSVNTSU9OX01PREU8L2NvbnN0YW50PiBpcyBzZXQgdGhlIDxjb25zdGFudD5UUkFOU01JU1NJT05fTU9ERV9BVVRPPC9jb25zdGFudD4gdGhlCisJCQloYXJkd2FyZSB3aWxsIHRyeSB0byBmaW5kIHRoZSBjb3JyZWN0IEZGVC1zaXplIChpZiBjYXBhYmxlKSBhbmQgd2lsbAorCQkJdXNlIFRNQ0MgdG8gZmlsbCBpbiB0aGUgbWlzc2luZyBwYXJhbWV0ZXJzLjwvcGFyYT4KKwkJPHBhcmE+MykgRFZCLVQgc3BlY2lmaWVzIDJLIGFuZCA4SyBhcyB2YWxpZCBzaXplcy48L3BhcmE+CisJCTxwYXJhPjQpIERWQi1UMiBzcGVjaWZpZXMgMUssIDJLLCA0SywgOEssIDE2SyBhbmQgMzJLLjwvcGFyYT4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1ISUVSQVJDSFkiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0hJRVJBUkNIWTwvY29uc3RhbnQ+PC90aXRsZT4KKwk8cGFyYT5Gcm9udGVuZCBoaWVyYXJjaHk8L3BhcmE+CisJPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBlbnVtIGZlX2hpZXJhcmNoeSB7CisJIEhJRVJBUkNIWV9OT05FLAorCSBISUVSQVJDSFlfMSwKKwkgSElFUkFSQ0hZXzIsCisJIEhJRVJBUkNIWV80LAorCSBISUVSQVJDSFlfQVVUTworIH0gZmVfaGllcmFyY2h5X3Q7CisJPC9wcm9ncmFtbGlzdGluZz4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1JU0RCUy1UUy1JRCI+CisJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlNfVFNfSUQ8L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+Q3VycmVudGx5IHVudXNlZC48L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtRFZCVDItUExQLUlEIj4KKwkJPHRpdGxlPjxjb25zdGFudD5EVFZfRFZCVDJfUExQX0lEPC9jb25zdGFudD48L3RpdGxlPgorCQk8cGFyYT5EVkItVDIgc3VwcG9ydHMgUGh5c2ljYWwgTGF5ZXIgUGlwZXMgKFBMUCkgdG8gYWxsb3cgdHJhbnNtaXNzaW9uIG9mCisJCQltYW55IGRhdGEgdHlwZXMgdmlhIGEgc2luZ2xlIG11bHRpcGxleC4gVGhlIEFQSSB3aWxsIHNvb24gc3VwcG9ydCB0aGlzCisJCQlhdCB3aGljaCBwb2ludCB0aGlzIHNlY3Rpb24gd2lsbCBiZSBleHBhbmRlZC48L3BhcmE+CisJPC9zZWN0aW9uPgorPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJmcm9udGVuZC1wcm9wZXJ0eS10ZXJyZXN0cmlhbC1zeXN0ZW1zIj4KKwk8dGl0bGU+UHJvcGVydGllcyB1c2VkIG9uIHRlcnJlc3RyaWFsIGRlbGl2ZXJ5IHN5c3RlbXM8L3RpdGxlPgorCQk8c2VjdGlvbiBpZD0iZHZidC1wYXJhbXMiPgorCQkJPHRpdGxlPkRWQi1UIGRlbGl2ZXJ5IHN5c3RlbTwvdGl0bGU+CisJCQk8cGFyYT5UaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHZhbGlkIGZvciBEVkItVDo8L3BhcmE+CisJCQk8aXRlbWl6ZWRsaXN0IG1hcms9J29wZW5jaXJjbGUnPgorCQkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQVBJLVZFUlNJT04iPjxjb25zdGFudD5EVFZfQVBJX1ZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLURFTElWRVJZLVNZU1RFTSI+PGNvbnN0YW50PkRUVl9ERUxJVkVSWV9TWVNURU08L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVRVTkUiPjxjb25zdGFudD5EVFZfVFVORTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQ0xFQVIiPjxjb25zdGFudD5EVFZfQ0xFQVI8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUZSRVFVRU5DWSI+PGNvbnN0YW50PkRUVl9GUkVRVUVOQ1k8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLU1PRFVMQVRJT04iPjxjb25zdGFudD5EVFZfTU9EVUxBVElPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQkFORFdJRFRILUhaIj48Y29uc3RhbnQ+RFRWX0JBTkRXSURUSF9IWjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSU5WRVJTSU9OIj48Y29uc3RhbnQ+RFRWX0lOVkVSU0lPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQ09ERS1SQVRFLUhQIj48Y29uc3RhbnQ+RFRWX0NPREVfUkFURV9IUDwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQ09ERS1SQVRFLUxQIj48Y29uc3RhbnQ+RFRWX0NPREVfUkFURV9MUDwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtR1VBUkQtSU5URVJWQUwiPjxjb25zdGFudD5EVFZfR1VBUkRfSU5URVJWQUw8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVRSQU5TTUlTU0lPTi1NT0RFIj48Y29uc3RhbnQ+RFRWX1RSQU5TTUlTU0lPTl9NT0RFPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ISUVSQVJDSFkiPjxjb25zdGFudD5EVFZfSElFUkFSQ0hZPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8L2l0ZW1pemVkbGlzdD4KKwkJPC9zZWN0aW9uPgorCQk8c2VjdGlvbiBpZD0iZHZidDItcGFyYW1zIj4KKwkJCTx0aXRsZT5EVkItVDIgZGVsaXZlcnkgc3lzdGVtPC90aXRsZT4KKwkJCTxwYXJhPkRWQi1UMiBzdXBwb3J0IGlzIGN1cnJlbnRseSBpbiB0aGUgZWFybHkgc3RhZ2VzCisJCQlvZiBkZXZlbG9wbWVudCwgc28gZXhwZWN0IHRoYXQgdGhpcyBzZWN0aW9uIG1heWdyb3cgYW5kIGJlY29tZQorCQkJbW9yZSBkZXRhaWxlZCB3aXRoIHRpbWUuPC9wYXJhPgorCQk8cGFyYT5UaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHZhbGlkIGZvciBEVkItVDI6PC9wYXJhPgorCQk8aXRlbWl6ZWRsaXN0IG1hcms9J29wZW5jaXJjbGUnPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1BUEktVkVSU0lPTiI+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+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtRFZCVDItUExQLUlEIj48Y29uc3RhbnQ+RFRWX0RWQlQyX1BMUF9JRDwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQk8L2l0ZW1pemVkbGlzdD4KKwkJPC9zZWN0aW9uPgorCQk8c2VjdGlvbiBpZD0iaXNkYnQiPgorCQk8dGl0bGU+SVNEQi1UIGRlbGl2ZXJ5IHN5c3RlbTwvdGl0bGU+CisJCTxwYXJhPlRoaXMgSVNEQi1UL0lTREItVHNiIEFQSSBleHRlbnNpb24gc2hvdWxkIHJlZmxlY3QgYWxsIGluZm9ybWF0aW9uCisJCQluZWVkZWQgdG8gdHVuZSBhbnkgSVNEQi1UL0lTREItVHNiIGhhcmR3YXJlLiBPZiBjb3Vyc2UgaXQgaXMgcG9zc2libGUKKwkJCXRoYXQgc29tZSB2ZXJ5IHNvcGhpc3RpY2F0ZWQgZGV2aWNlcyB3b24ndCBuZWVkIGNlcnRhaW4gcGFyYW1ldGVycyB0bworCQkJdHVuZS48L3BhcmE+CisJCTxwYXJhPlRoZSBpbmZvcm1hdGlvbiBnaXZlbiBoZXJlIHNob3VsZCBoZWxwIGFwcGxpY2F0aW9uIHdyaXRlcnMgdG8ga25vdyBob3cKKwkJCXRvIGhhbmRsZSBJU0RCLVQgYW5kIElTREItVHNiIGhhcmR3YXJlIHVzaW5nIHRoZSBMaW51eCBEVkItQVBJLjwvcGFyYT4KKwkJPHBhcmE+VGhlIGRldGFpbHMgZ2l2ZW4gaGVyZSBhYm91dCBJU0RCLVQgYW5kIElTREItVHNiIGFyZSBqdXN0IGVub3VnaCB0bworCQkJYmFzaWNhbGx5IHNob3cgdGhlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZSBuZWVkZWQgcGFyYW1ldGVyIHZhbHVlcywKKwkJCWJ1dCBzdXJlbHkgc29tZSBpbmZvcm1hdGlvbiBpcyBsZWZ0IG91dC4gRm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24KKwkJCXNlZSB0aGUgZm9sbG93aW5nIGRvY3VtZW50czo8L3BhcmE+CisJCTxwYXJhPkFSSUIgU1RELUIzMSAtICJUcmFuc21pc3Npb24gU3lzdGVtIGZvciBEaWdpdGFsIFRlcnJlc3RyaWFsCisJCQlUZWxldmlzaW9uIEJyb2FkY2FzdGluZyIgYW5kPC9wYXJhPgorCQk8cGFyYT5BUklCIFRSLUIxNCAtICJPcGVyYXRpb25hbCBHdWlkZWxpbmVzIGZvciBEaWdpdGFsIFRlcnJlc3RyaWFsCisJCQlUZWxldmlzaW9uIEJyb2FkY2FzdGluZyIuPC9wYXJhPgorCQk8cGFyYT5JbiBvcmRlciB0byB1bmRlcnN0YW5kIHRoZSBJU0RCIHNwZWNpZmljIHBhcmFtZXRlcnMsCisJCQlvbmUgaGFzIHRvIGhhdmUgc29tZSBrbm93bGVkZ2UgdGhlIGNoYW5uZWwgc3RydWN0dXJlIGluCisJCQlJU0RCLVQgYW5kIElTREItVHNiLiBJLmUuIGl0IGhhcyB0byBiZSBrbm93biB0bworCQkJdGhlIHJlYWRlciB0aGF0IGFuIElTREItVCBjaGFubmVsIGNvbnNpc3RzIG9mIDEzIHNlZ21lbnRzLAorCQkJdGhhdCBpdCBjYW4gaGF2ZSB1cCB0byAzIGxheWVyIHNoYXJpbmcgdGhvc2Ugc2VnbWVudHMsCisJCQlhbmQgdGhpbmdzIGxpa2UgdGhhdC48L3BhcmE+CisJCTxwYXJhPlRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgdmFsaWQgZm9yIElTREItVDo8L3BhcmE+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+PGxpbmsgbGlua2VuZD0iRFRWLUJBTkRXSURUSC1IWiI+PGNvbnN0YW50PkRUVl9CQU5EV0lEVEhfSFo8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSU5WRVJTSU9OIj48Y29uc3RhbnQ+RFRWX0lOVkVSU0lPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1DT0RFLVJBVEUtSFAiPjxjb25zdGFudD5EVFZfQ09ERV9SQVRFX0hQPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUNPREUtUkFURS1MUCI+PGNvbnN0YW50PkRUVl9DT0RFX1JBVEVfTFA8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtR1VBUkQtSU5URVJWQUwiPjxjb25zdGFudD5EVFZfR1VBUkRfSU5URVJWQUw8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtVFJBTlNNSVNTSU9OLU1PREUiPjxjb25zdGFudD5EVFZfVFJBTlNNSVNTSU9OX01PREU8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSElFUkFSQ0hZIj48Y29uc3RhbnQ+RFRWX0hJRVJBUkNIWTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JU0RCVC1MQVlFUi1FTkFCTEVEIj48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSX0VOQUJMRUQ8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlQtUEFSVElBTC1SRUNFUFRJT04iPjxjb25zdGFudD5EVFZfSVNEQlRfUEFSVElBTF9SRUNFUFRJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlQtU09VTkQtQlJPQURDQVNUSU5HIj48Y29uc3RhbnQ+RFRWX0lTREJUX1NPVU5EX0JST0FEQ0FTVElORzwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JU0RCVC1TQi1TVUJDSEFOTkVMLUlEIj48Y29uc3RhbnQ+RFRWX0lTREJUX1NCX1NVQkNIQU5ORUxfSUQ8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlQtU0ItU0VHTUVOVC1JRFgiPjxjb25zdGFudD5EVFZfSVNEQlRfU0JfU0VHTUVOVF9JRFg8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlQtU0ItU0VHTUVOVC1DT1VOVCI+PGNvbnN0YW50PkRUVl9JU0RCVF9TQl9TRUdNRU5UX0NPVU5UPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJULUxBWUVSLUZFQyI+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUkFfRkVDPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJULUxBWUVSLU1PRFVMQVRJT04iPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJBX01PRFVMQVRJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlQtTEFZRVItU0VHTUVOVC1DT1VOVCI+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUkFfU0VHTUVOVF9DT1VOVDwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JU0RCVC1MQVlFUi1USU1FLUlOVEVSTEVBVklORyI+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUkFfVElNRV9JTlRFUkxFQVZJTkc8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlQtTEFZRVItRkVDIj48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSQl9GRUM8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlQtTEFZRVItTU9EVUxBVElPTiI+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUkJfTU9EVUxBVElPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JU0RCVC1MQVlFUi1TRUdNRU5ULUNPVU5UIj48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSQl9TRUdNRU5UX0NPVU5UPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJULUxBWUVSLVRJTUUtSU5URVJMRUFWSU5HIj48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSQl9USU1FX0lOVEVSTEVBVklORzwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JU0RCVC1MQVlFUi1GRUMiPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJDX0ZFQzwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JU0RCVC1MQVlFUi1NT0RVTEFUSU9OIj48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSQ19NT0RVTEFUSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJULUxBWUVSLVNFR01FTlQtQ09VTlQiPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJDX1NFR01FTlRfQ09VTlQ8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlQtTEFZRVItVElNRS1JTlRFUkxFQVZJTkciPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJDX1RJTUVfSU5URVJMRUFWSU5HPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCTwvaXRlbWl6ZWRsaXN0PgorCQk8L3NlY3Rpb24+CisJCTxzZWN0aW9uIGlkPSJhdHNjLXBhcmFtcyI+CisJCQk8dGl0bGU+QVRTQyBkZWxpdmVyeSBzeXN0ZW08L3RpdGxlPgorCQkJPHBhcmE+VGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB2YWxpZCBmb3IgQVRTQzo8L3BhcmE+CisJCQk8aXRlbWl6ZWRsaXN0IG1hcms9J29wZW5jaXJjbGUnPgorCQkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQVBJLVZFUlNJT04iPjxjb25zdGFudD5EVFZfQVBJX1ZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLURFTElWRVJZLVNZU1RFTSI+PGNvbnN0YW50PkRUVl9ERUxJVkVSWV9TWVNURU08L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVRVTkUiPjxjb25zdGFudD5EVFZfVFVORTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQ0xFQVIiPjxjb25zdGFudD5EVFZfQ0xFQVI8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUZSRVFVRU5DWSI+PGNvbnN0YW50PkRUVl9GUkVRVUVOQ1k8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLU1PRFVMQVRJT04iPjxjb25zdGFudD5EVFZfTU9EVUxBVElPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQkFORFdJRFRILUhaIj48Y29uc3RhbnQ+RFRWX0JBTkRXSURUSF9IWjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPC9pdGVtaXplZGxpc3Q+CisJCTwvc2VjdGlvbj4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9ImZyb250ZW5kLXByb3BlcnR5LWNhYmxlLXN5c3RlbXMiPgorCTx0aXRsZT5Qcm9wZXJ0aWVzIHVzZWQgb24gY2FibGUgZGVsaXZlcnkgc3lzdGVtczwvdGl0bGU+CisJPHNlY3Rpb24gaWQ9ImR2YmMtcGFyYW1zIj4KKwkJPHRpdGxlPkRWQi1DIGRlbGl2ZXJ5IHN5c3RlbTwvdGl0bGU+CisJCTxwYXJhPlRoZSBEVkItQyBBbm5leC1BL0MgaXMgdGhlIHdpZGVseSB1c2VkIGNhYmxlIHN0YW5kYXJkLiBUcmFuc21pc3Npb24gdXNlcyBRQU0gbW9kdWxhdGlvbi48L3BhcmE+CisJCTxwYXJhPlRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgdmFsaWQgZm9yIERWQi1DIEFubmV4IEEvQzo8L3BhcmE+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+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtU1lNQk9MLVJBVEUiPjxjb25zdGFudD5EVFZfU1lNQk9MX1JBVEU8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSU5ORVItRkVDIj48Y29uc3RhbnQ+RFRWX0lOTkVSX0ZFQzwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQk8L2l0ZW1pemVkbGlzdD4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9ImR2YmMtYW5uZXgtYi1wYXJhbXMiPgorCQk8dGl0bGU+RFZCLUMgQW5uZXggQiBkZWxpdmVyeSBzeXN0ZW08L3RpdGxlPgorCQk8cGFyYT5UaGUgRFZCLUMgQW5uZXgtQiBpcyBvbmx5IHVzZWQgb24gYSBmZXcgQ291bnRyaWVzIGxpa2UgdGhlIFVuaXRlZCBTdGF0ZXMuPC9wYXJhPgorCQk8cGFyYT5UaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHZhbGlkIGZvciBEVkItQyBBbm5leCBCOjwvcGFyYT4KKwkJPGl0ZW1pemVkbGlzdCBtYXJrPSdvcGVuY2lyY2xlJz4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQVBJLVZFUlNJT04iPjxjb25zdGFudD5EVFZfQVBJX1ZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtREVMSVZFUlktU1lTVEVNIj48Y29uc3RhbnQ+RFRWX0RFTElWRVJZX1NZU1RFTTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1UVU5FIj48Y29uc3RhbnQ+RFRWX1RVTkU8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQ0xFQVIiPjxjb25zdGFudD5EVFZfQ0xFQVI8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtRlJFUVVFTkNZIj48Y29uc3RhbnQ+RFRWX0ZSRVFVRU5DWTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1NT0RVTEFUSU9OIj48Y29uc3RhbnQ+RFRWX01PRFVMQVRJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSU5WRVJTSU9OIj48Y29uc3RhbnQ+RFRWX0lOVkVSU0lPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQk8L2l0ZW1pemVkbGlzdD4KKwk8L3NlY3Rpb24+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJmcm9udGVuZC1wcm9wZXJ0eS1zYXRlbGxpdGFsLXN5c3RlbXMiPgorCTx0aXRsZT5Qcm9wZXJ0aWVzIHVzZWQgb24gc2F0ZWxsaXRhbCBkZWxpdmVyeSBzeXN0ZW1zPC90aXRsZT4KKwk8c2VjdGlvbiBpZD0iZHZicy1wYXJhbXMiPgorCQk8dGl0bGU+RFZCLVMgZGVsaXZlcnkgc3lzdGVtPC90aXRsZT4KKwkJPHBhcmE+VGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB2YWxpZCBmb3IgRFZCLVM6PC9wYXJhPgorCQk8aXRlbWl6ZWRsaXN0IG1hcms9J29wZW5jaXJjbGUnPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1BUEktVkVSU0lPTiI+PGNvbnN0YW50PkRUVl9BUElfVkVSU0lPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ERUxJVkVSWS1TWVNURU0iPjxjb25zdGFudD5EVFZfREVMSVZFUllfU1lTVEVNPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVRVTkUiPjxjb25zdGFudD5EVFZfVFVORTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1DTEVBUiI+PGNvbnN0YW50PkRUVl9DTEVBUjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1GUkVRVUVOQ1kiPjxjb25zdGFudD5EVFZfRlJFUVVFTkNZPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOVkVSU0lPTiI+PGNvbnN0YW50PkRUVl9JTlZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtU1lNQk9MLVJBVEUiPjxjb25zdGFudD5EVFZfU1lNQk9MX1JBVEU8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSU5ORVItRkVDIj48Y29uc3RhbnQ+RFRWX0lOTkVSX0ZFQzwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQk8L2l0ZW1pemVkbGlzdD4KKwkJPHBhcmE+RnV0dXJlIGltcGxlbWVudGF0aW9ucyBtaWdodCBhZGQgdGhvc2UgdHdvIG1pc3NpbmcgcGFyYW1ldGVyczo8L3BhcmE+CisJCTxpdGVtaXplZGxpc3QgbWFyaz0nb3BlbmNpcmNsZSc+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLURJU0VRQy1NQVNURVIiPjxjb25zdGFudD5EVFZfRElTRVFDX01BU1RFUjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ESVNFUUMtU0xBVkUtUkVQTFkiPjxjb25zdGFudD5EVFZfRElTRVFDX1NMQVZFX1JFUExZPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCTwvaXRlbWl6ZWRsaXN0PgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iZHZiczItcGFyYW1zIj4KKwkJPHRpdGxlPkRWQi1TMiBkZWxpdmVyeSBzeXN0ZW08L3RpdGxlPgorCQk8cGFyYT5UaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHZhbGlkIGZvciBEVkItUzI6PC9wYXJhPgorCQk8aXRlbWl6ZWRsaXN0IG1hcms9J29wZW5jaXJjbGUnPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1BUEktVkVSU0lPTiI+PGNvbnN0YW50PkRUVl9BUElfVkVSU0lPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ERUxJVkVSWS1TWVNURU0iPjxjb25zdGFudD5EVFZfREVMSVZFUllfU1lTVEVNPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVRVTkUiPjxjb25zdGFudD5EVFZfVFVORTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1DTEVBUiI+PGNvbnN0YW50PkRUVl9DTEVBUjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1GUkVRVUVOQ1kiPjxjb25zdGFudD5EVFZfRlJFUVVFTkNZPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOVkVSU0lPTiI+PGNvbnN0YW50PkRUVl9JTlZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtU1lNQk9MLVJBVEUiPjxjb25zdGFudD5EVFZfU1lNQk9MX1JBVEU8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSU5ORVItRkVDIj48Y29uc3RhbnQ+RFRWX0lOTkVSX0ZFQzwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1WT0xUQUdFIj48Y29uc3RhbnQ+RFRWX1ZPTFRBR0U8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtVE9ORSI+PGNvbnN0YW50PkRUVl9UT05FPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVBJTE9UIj48Y29uc3RhbnQ+RFRWX1BJTE9UPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVJPTExPRkYiPjxjb25zdGFudD5EVFZfUk9MTE9GRjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQk8L2l0ZW1pemVkbGlzdD4KKwkJPHBhcmE+RnV0dXJlIGltcGxlbWVudGF0aW9ucyBtaWdodCBhZGQgdGhvc2UgdHdvIG1pc3NpbmcgcGFyYW1ldGVyczo8L3BhcmE+CisJCTxpdGVtaXplZGxpc3QgbWFyaz0nb3BlbmNpcmNsZSc+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLURJU0VRQy1NQVNURVIiPjxjb25zdGFudD5EVFZfRElTRVFDX01BU1RFUjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ESVNFUUMtU0xBVkUtUkVQTFkiPjxjb25zdGFudD5EVFZfRElTRVFDX1NMQVZFX1JFUExZPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCTwvaXRlbWl6ZWRsaXN0PgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iaXNkYnMtcGFyYW1zIj4KKwkJPHRpdGxlPklTREItUyBkZWxpdmVyeSBzeXN0ZW08L3RpdGxlPgorCQk8cGFyYT5UaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHZhbGlkIGZvciBJU0RCLVM6PC9wYXJhPgorCQk8aXRlbWl6ZWRsaXN0IG1hcms9J29wZW5jaXJjbGUnPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1BUEktVkVSU0lPTiI+PGNvbnN0YW50PkRUVl9BUElfVkVSU0lPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ERUxJVkVSWS1TWVNURU0iPjxjb25zdGFudD5EVFZfREVMSVZFUllfU1lTVEVNPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVRVTkUiPjxjb25zdGFudD5EVFZfVFVORTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1DTEVBUiI+PGNvbnN0YW50PkRUVl9DTEVBUjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1GUkVRVUVOQ1kiPjxjb25zdGFudD5EVFZfRlJFUVVFTkNZPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOVkVSU0lPTiI+PGNvbnN0YW50PkRUVl9JTlZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtU1lNQk9MLVJBVEUiPjxjb25zdGFudD5EVFZfU1lNQk9MX1JBVEU8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSU5ORVItRkVDIj48Y29uc3RhbnQ+RFRWX0lOTkVSX0ZFQzwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1WT0xUQUdFIj48Y29uc3RhbnQ+RFRWX1ZPTFRBR0U8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlMtVFMtSUQiPjxjb25zdGFudD5EVFZfSVNEQlNfVFNfSUQ8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJPC9pdGVtaXplZGxpc3Q+CisJPC9zZWN0aW9uPgorCTwvc2VjdGlvbj4KKzwvc2VjdGlvbj4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZHZic3RiLnBkZiBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvZHZic3RiLnBkZgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9kdmJzdGIucGRmCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2R2YnN0Yi5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9leGFtcGxlcy54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2V4YW1wbGVzLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9leGFtcGxlcy54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvZXhhbXBsZXMueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2Zyb250ZW5kLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvZnJvbnRlbmQueG1sCnNpbWlsYXJpdHkgaW5kZXggNzUlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZnJvbnRlbmQueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2Zyb250ZW5kLnhtbAppbmRleCA2MGM2OTc2Li42MTQwN2VhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2Zyb250ZW5kLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2Zyb250ZW5kLnhtbApAQCAtMjAsMjIgKzIwLDUyIEBACiA8c2VjdGlvbiBpZD0iZnJvbnRlbmRfdHlwZXMiPgogPHRpdGxlPkZyb250ZW5kIERhdGEgVHlwZXM8L3RpdGxlPgogCi08c2VjdGlvbiBpZD0iZnJvbnRlbmRfdHlwZSI+Ci08dGl0bGU+ZnJvbnRlbmQgdHlwZTwvdGl0bGU+Cis8c2VjdGlvbiBpZD0iZmUtdHlwZS10Ij4KKzx0aXRsZT5Gcm9udGVuZCB0eXBlPC90aXRsZT4KIAotPHBhcmE+Rm9yIGhpc3RvcmljYWwgcmVhc29ucyBmcm9udGVuZCB0eXBlcyBhcmUgbmFtZWQgYWZ0ZXIgdGhlIHR5cGUgb2YgbW9kdWxhdGlvbiB1c2VkIGluCi10cmFuc21pc3Npb24uPC9wYXJhPgotPHByb2dyYW1saXN0aW5nPgotCXR5cGVkZWYgZW51bSBmZV90eXBlIHsKLQlGRV9RUFNLLCAgIC8mI3gyMkM2OyBEVkItUyAmI3gyMkM2Oy8KLQlGRV9RQU0sICAgIC8mI3gyMkM2OyBEVkItQyAmI3gyMkM2Oy8KLQlGRV9PRkRNICAgIC8mI3gyMkM2OyBEVkItVCAmI3gyMkM2Oy8KLQl9IGZlX3R5cGVfdDsKLTwvcHJvZ3JhbWxpc3Rpbmc+Cis8cGFyYT5Gb3IgaGlzdG9yaWNhbCByZWFzb25zLCBmcm9udGVuZCB0eXBlcyBhcmUgbmFtZWQgYnkgdGhlIHR5cGUgb2YgbW9kdWxhdGlvbiB1c2VkIGluCit0cmFuc21pc3Npb24uIFRoZSBmb250ZW5kIHR5cGVzIGFyZSBnaXZlbiBieSBmZV90eXBlX3QgdHlwZSwgZGVmaW5lZCBhczo8L3BhcmE+CiAKKzx0YWJsZSBwZ3dpZGU9IjEiIGZyYW1lPSJub25lIiBpZD0iZmUtdHlwZSI+Cis8dGl0bGU+RnJvbnRlbmQgdHlwZXM8L3RpdGxlPgorPHRncm91cCBjb2xzPSIzIj4KKyAgICZjcy1kZWY7CisgICA8dGhlYWQ+CisgICAgIDxyb3c+CisgICAgICAgPGVudHJ5PmZlX3R5cGU8L2VudHJ5PgorICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgPGVudHJ5PjxsaW5rIGxpbmtlbmQ9IkRUVi1ERUxJVkVSWS1TWVNURU0iPkRUVl9ERUxJVkVSWV9TWVNURU08L2xpbms+IGVxdWl2YWxlbnQgdHlwZTwvZW50cnk+CisgICAgIDwvcm93PgorICA8L3RoZWFkPgorICA8dGJvZHkgdmFsaWduPSJ0b3AiPgorICA8cm93PgorICAgICA8ZW50cnkgaWQ9IkZFX1FQU0siPjxjb25zdGFudD5GRV9RUFNLPC9jb25zdGFudD48L2VudHJ5PgorICAgICA8ZW50cnk+Rm9yIERWQi1TIHN0YW5kYXJkPC9lbnRyeT4KKyAgICAgPGVudHJ5Pjxjb25zdGFudD5TWVNfRFZCUzwvY29uc3RhbnQ+PC9lbnRyeT4KKyAgPC9yb3c+CisgIDxyb3c+CisgICAgIDxlbnRyeSBpZD0iRkVfUUFNIj48Y29uc3RhbnQ+RkVfUUFNPC9jb25zdGFudD48L2VudHJ5PgorICAgICA8ZW50cnk+Rm9yIERWQi1DIGFubmV4IEEvQyBzdGFuZGFyZDwvZW50cnk+CisgICAgIDxlbnRyeT48Y29uc3RhbnQ+U1lTX0RWQkNfQU5ORVhfQUM8L2NvbnN0YW50PjwvZW50cnk+CisgIDwvcm93PgorICA8cm93PgorICAgICA8ZW50cnkgaWQ9IkZFX09GRE0iPjxjb25zdGFudD5GRV9PRkRNPC9jb25zdGFudD48L2VudHJ5PgorICAgICA8ZW50cnk+Rm9yIERWQi1UIHN0YW5kYXJkPC9lbnRyeT4KKyAgICAgPGVudHJ5Pjxjb25zdGFudD5TWVNfRFZCVDwvY29uc3RhbnQ+PC9lbnRyeT4KKyAgPC9yb3c+CisgIDxyb3c+CisgICAgIDxlbnRyeSBpZD0iRkVfQVRTQyI+PGNvbnN0YW50PkZFX0FUU0M8L2NvbnN0YW50PjwvZW50cnk+CisgICAgIDxlbnRyeT5Gb3IgQVRTQyBzdGFuZGFyZCAodGVycmVzdHJpYWwpIG9yIGZvciBEVkItQyBBbm5leCBCIChjYWJsZSkgdXNlZCBpbiBVUy48L2VudHJ5PgorICAgICA8ZW50cnk+PGNvbnN0YW50PlNZU19BVFNDPC9jb25zdGFudD4gKHRlcnJlc3RyaWFsKSBvciA8Y29uc3RhbnQ+U1lTX0RWQkNfQU5ORVhfQjwvY29uc3RhbnQ+IChjYWJsZSk8L2VudHJ5PgorICA8L3Jvdz4KKzwvdGJvZHk+PC90Z3JvdXA+PC90YWJsZT4KKworPHBhcmE+TmV3ZXIgZm9ybWF0cyBsaWtlIERWQi1TMiwgSVNEQi1ULCBJU0RCLVMgYW5kIERWQi1UMiBhcmUgbm90IGRlc2NyaWJlZCBhdCB0aGUgYWJvdmUsIGFzIHRoZXkncmUKK3N1cHBvcnRlZCB2aWEgdGhlIG5ldyA8bGluayBsaW5rZW5kPSJGRV9HRVRfU0VUX1BST1BFUlRZIj5GRV9HRVRfUFJPUEVSVFkvRkVfR0VUX1NFVF9QUk9QRVJUWTwvbGluaz4gaW9jdGwncywgdXNpbmcgdGhlIDxsaW5rIGxpbmtlbmQ9IkRUVi1ERUxJVkVSWS1TWVNURU0iPkRUVl9ERUxJVkVSWV9TWVNURU08L2xpbms+IHBhcmFtZXRlci4KKzwvcGFyYT4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImZyb250ZW5kX2NhcHMiPgorPHNlY3Rpb24gaWQ9ImZlLWNhcHMtdCI+CiA8dGl0bGU+ZnJvbnRlbmQgY2FwYWJpbGl0aWVzPC90aXRsZT4KIAogPHBhcmE+Q2FwYWJpbGl0aWVzIGRlc2NyaWJlIHdoYXQgYSBmcm9udGVuZCBjYW4gZG8uIFNvbWUgY2FwYWJpbGl0aWVzIGNhbiBvbmx5IGJlIHN1cHBvcnRlZCBmb3IKQEAgLTc2LDcgKzEwNiw3IEBACiA8L3Byb2dyYW1saXN0aW5nPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZnJvbnRlbmRfaW5mbyI+Cis8c2VjdGlvbiBpZD0iZHZiLWZyb250ZW5kLWluZm8iPgogPHRpdGxlPmZyb250ZW5kIGluZm9ybWF0aW9uPC90aXRsZT4KIAogPHBhcmE+SW5mb3JtYXRpb24gYWJvdXQgdGhlIGZyb250ZW5kIGNhIGJlIHF1ZXJpZWQgd2l0aApAQCAtOTksNyArMTI5LDcgQEAKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJmcm9udGVuZF9kaXNlcWMiPgorPHNlY3Rpb24gaWQ9ImR2Yi1kaXNlcWMtbWFzdGVyLWNtZCI+CiA8dGl0bGU+ZGlzZXFjIG1hc3RlciBjb21tYW5kPC90aXRsZT4KIAogPHBhcmE+QSBtZXNzYWdlIHNlbnQgZnJvbSB0aGUgZnJvbnRlbmQgdG8gRGlTRXFDIGNhcGFibGUgZXF1aXBtZW50LjwvcGFyYT4KQEAgLTExMCw3ICsxNDAsNyBAQAogCX07CiA8L3Byb2dyYW1saXN0aW5nPgogPC9zZWN0aW9uPgotPHNlY3Rpb24gcm9sZT0ic3Vic2VjdGlvbiI+Cis8c2VjdGlvbiByb2xlPSJzdWJzZWN0aW9uIiBpZD0iZHZiLWRpc2VxYy1zbGF2ZS1yZXBseSI+CiA8dGl0bGU+ZGlzZXFjIHNsYXZlIHJlcGx5PC90aXRsZT4KIAogPHBhcmE+QSByZXBseSB0byB0aGUgZnJvbnRlbmQgZnJvbSBEaVNFcUMgMi4wIGNhcGFibGUgZXF1aXBtZW50LjwvcGFyYT4KQEAgLTEyMyw3ICsxNTMsNyBAQAogPC9wcm9ncmFtbGlzdGluZz4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImZyb250ZW5kX2Rpc2VxY19zbGF2ZV9yZXBseSI+Cis8c2VjdGlvbiBpZD0iZmUtc2VjLXZvbHRhZ2UtdCI+CiA8dGl0bGU+ZGlzZXFjIHNsYXZlIHJlcGx5PC90aXRsZT4KIDxwYXJhPlRoZSB2b2x0YWdlIGlzIHVzdWFsbHkgdXNlZCB3aXRoIG5vbi1EaVNFcUMgY2FwYWJsZSBMTkJzIHRvIHN3aXRjaCB0aGUgcG9sYXJ6YXRpb24KIChob3Jpem9udGFsL3ZlcnRpY2FsKS4gV2hlbiB1c2luZyBEaVNFcUMgZXB1aXBtZW50IHRoaXMgdm9sdGFnZSBoYXMgdG8gYmUgc3dpdGNoZWQKQEAgLTEzNiw3ICsxNjYsNyBAQAogPC9wcm9ncmFtbGlzdGluZz4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImZyb250ZW5kX3NlY190b25lIj4KKzxzZWN0aW9uIGlkPSJmZS1zZWMtdG9uZS1tb2RlLXQiPgogPHRpdGxlPlNFQyBjb250aW51b3VzIHRvbmU8L3RpdGxlPgogCiA8cGFyYT5UaGUgY29udGludW91cyAyMktIeiB0b25lIGlzIHVzdWFsbHkgdXNlZCB3aXRoIG5vbi1EaVNFcUMgY2FwYWJsZSBMTkJzIHRvIHN3aXRjaCB0aGUKQEAgLTE1MSw3ICsxODEsNyBAQAogPC9wcm9ncmFtbGlzdGluZz4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImZyb250ZW5kX3NlY19idXJzdCI+Cis8c2VjdGlvbiBpZD0iZmUtc2VjLW1pbmktY21kLXQiPgogPHRpdGxlPlNFQyB0b25lIGJ1cnN0PC90aXRsZT4KIAogPHBhcmE+VGhlIDIyS0h6IHRvbmUgYnVyc3QgaXMgdXN1YWxseSB1c2VkIHdpdGggbm9uLURpU0VxQyBjYXBhYmxlIHN3aXRjaGVzIHRvIHNlbGVjdApAQCAtMTY4LDcgKzE5OCw3IEBACiA8cGFyYT48L3BhcmE+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJmcm9udGVuZF9zdGF0dXMiPgorPHNlY3Rpb24gaWQ9ImZlLXN0YXR1cy10Ij4KIDx0aXRsZT5mcm9udGVuZCBzdGF0dXM8L3RpdGxlPgogPHBhcmE+U2V2ZXJhbCBmdW5jdGlvbnMgb2YgdGhlIGZyb250ZW5kIGRldmljZSB1c2UgdGhlIGZlX3N0YXR1cyBkYXRhIHR5cGUgZGVmaW5lZAogYnk8L3BhcmE+CkBAIC0xODgsMzEgKzIxOCw1NCBAQAogCiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJmcm9udGVuZF9wYXJhbXMiPgorPHNlY3Rpb24gaWQ9ImR2Yi1mcm9udGVuZC1wYXJhbWV0ZXJzIj4KIDx0aXRsZT5mcm9udGVuZCBwYXJhbWV0ZXJzPC90aXRsZT4KIDxwYXJhPlRoZSBraW5kIG9mIHBhcmFtZXRlcnMgcGFzc2VkIHRvIHRoZSBmcm9udGVuZCBkZXZpY2UgZm9yIHR1bmluZyBkZXBlbmQgb24KLXRoZSBraW5kIG9mIGhhcmR3YXJlIHlvdSBhcmUgdXNpbmcuIEFsbCBraW5kcyBvZiBwYXJhbWV0ZXJzIGFyZSBjb21iaW5lZCBhcyBhbgotdW5pb24gaW4gdGhlIEZyb250ZW5kUGFyYW1ldGVycyBzdHJ1Y3R1cmU6PC9wYXJhPgordGhlIGtpbmQgb2YgaGFyZHdhcmUgeW91IGFyZSB1c2luZy48L3BhcmE+Cis8cGFyYT5UaGUgc3RydWN0IDxjb25zdGFudD5kdmJfZnJvbnRlbmRfcGFyYW1ldGVyczwvY29uc3RhbnQ+IHVzZXMgYW4KK3VuaW9uIHdpdGggc3BlY2lmaWMgcGVyLXN5c3RlbSBwYXJhbWV0ZXJzLiBIb3dldmVyLCBhcyBuZXdlciBkZWxpdmVyeSBzeXN0ZW1zCityZXF1aXJlZCBtb3JlIGRhdGEsIHRoZSBzdHJ1Y3R1cmUgc2l6ZSB3ZXJlbid0IGVub3VnaCB0byBmaXQsIGFuZCBqdXN0CitleHRlbmRpbmcgaXRzIHNpemUgd291bGQgYnJlYWsgdGhlIGV4aXN0aW5nIGFwcGxpY2F0aW9ucy4gU28sIHRob3NlIHBhcmFtZXRlcnMKK3dlcmUgcmVwbGFjZWQgYnkgdGhlIHVzYWdlIG9mIDxsaW5rIGxpbmtlbmQ9IkZFX0dFVF9TRVRfUFJPUEVSVFkiPgorPGNvbnN0YW50PkZFX0dFVF9QUk9QRVJUWS9GRV9TRVRfUFJPUEVSVFk8L2NvbnN0YW50PjwvbGluaz4gaW9jdGwncy4gVGhlCituZXcgQVBJIGlzIGZsZXhpYmxlIGVub3VnaCB0byBhZGQgbmV3IHBhcmFtZXRlcnMgdG8gZXhpc3RpbmcgZGVsaXZlcnkgc3lzdGVtcywKK2FuZCB0byBhZGQgbmV3ZXIgZGVsaXZlcnkgc3lzdGVtcy48L3BhcmE+Cis8cGFyYT5TbywgbmV3ZXIgYXBwbGljYXRpb25zIHNob3VsZCB1c2UgPGxpbmsgbGlua2VuZD0iRkVfR0VUX1NFVF9QUk9QRVJUWSI+Cis8Y29uc3RhbnQ+RkVfR0VUX1BST1BFUlRZL0ZFX1NFVF9QUk9QRVJUWTwvY29uc3RhbnQ+PC9saW5rPiBpbnN0ZWFkLCBpbgorb3JkZXIgdG8gYmUgYWJsZSB0byBzdXBwb3J0IHRoZSBuZXdlciBTeXN0ZW0gRGVsaXZlcnkgbGlrZSAgRFZCLVMyLCBEVkItVDIsCitEVkItQzIsIElTREIsIGV0Yy48L3BhcmE+Cis8cGFyYT5BbGwga2luZHMgb2YgcGFyYW1ldGVycyBhcmUgY29tYmluZWQgYXMgYW4gdW5pb24gaW4gdGhlIEZyb250ZW5kUGFyYW1ldGVycyBzdHJ1Y3R1cmU6PC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgotIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyB7Ci0JIHVpbnQzMl90IGZyZXF1ZW5jeTsgICAgICAgLyYjeDIyQzY7IChhYnNvbHV0ZSkgZnJlcXVlbmN5IGluIEh6IGZvciBRQU0vT0ZETSAmI3gyMkM2Oy8KLQkJCQkgICAvJiN4MjJDNjsgaW50ZXJtZWRpYXRlIGZyZXF1ZW5jeSBpbiBrSHogZm9yIFFQU0sgJiN4MjJDNjsvCi0JIGZlX3NwZWN0cmFsX2ludmVyc2lvbl90IGludmVyc2lvbjsKLQkgdW5pb24gewotCQkgc3RydWN0IGR2Yl9xcHNrX3BhcmFtZXRlcnMgcXBzazsKLQkJIHN0cnVjdCBkdmJfcWFtX3BhcmFtZXRlcnMgIHFhbTsKLQkJIHN0cnVjdCBkdmJfb2ZkbV9wYXJhbWV0ZXJzIG9mZG07Ci0JIH0gdTsKLSB9Oworc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzIHsKKwl1aW50MzJfdCBmcmVxdWVuY3k7ICAgICAvJiN4MjJDNjsgKGFic29sdXRlKSBmcmVxdWVuY3kgaW4gSHogZm9yIFFBTS9PRkRNICYjeDIyQzY7LworCQkJCS8mI3gyMkM2OyBpbnRlcm1lZGlhdGUgZnJlcXVlbmN5IGluIGtIeiBmb3IgUVBTSyAmI3gyMkM2Oy8KKwlmZV9zcGVjdHJhbF9pbnZlcnNpb25fdCBpbnZlcnNpb247CisJdW5pb24geworCQlzdHJ1Y3QgZHZiX3Fwc2tfcGFyYW1ldGVycyBxcHNrOworCQlzdHJ1Y3QgZHZiX3FhbV9wYXJhbWV0ZXJzICBxYW07CisJCXN0cnVjdCBkdmJfb2ZkbV9wYXJhbWV0ZXJzIG9mZG07CisJCXN0cnVjdCBkdmJfdnNiX3BhcmFtZXRlcnMgIHZzYjsKKwl9IHU7Cit9OwogPC9wcm9ncmFtbGlzdGluZz4KLTxwYXJhPkZvciBzYXRlbGxpdGUgUVBTSyBmcm9udGVuZHMgeW91IGhhdmUgdG8gdXNlIHRoZSA8Y29uc3RhbnQ+UVBTS1BhcmFtZXRlcnM8L2NvbnN0YW50PiBtZW1iZXIgZGVmaW5lZCBieTwvcGFyYT4KKzxwYXJhPkluIHRoZSBjYXNlIG9mIFFQU0sgZnJvbnRlbmRzIHRoZSA8Y29uc3RhbnQ+ZnJlcXVlbmN5PC9jb25zdGFudD4gZmllbGQgc3BlY2lmaWVzIHRoZSBpbnRlcm1lZGlhdGUKK2ZyZXF1ZW5jeSwgaS5lLiB0aGUgb2Zmc2V0IHdoaWNoIGlzIGVmZmVjdGl2ZWx5IGFkZGVkIHRvIHRoZSBsb2NhbCBvc2NpbGxhdG9yIGZyZXF1ZW5jeSAoTE9GKSBvZgordGhlIExOQi4gVGhlIGludGVybWVkaWF0ZSBmcmVxdWVuY3kgaGFzIHRvIGJlIHNwZWNpZmllZCBpbiB1bml0cyBvZiBrSHouIEZvciBRQU0gYW5kCitPRkRNIGZyb250ZW5kcyB0aGUgPGNvbnN0YW50PmZyZXF1ZW5jeTwvY29uc3RhbnQ+IHNwZWNpZmllcyB0aGUgYWJzb2x1dGUgZnJlcXVlbmN5IGFuZCBpcyBnaXZlbiBpbiBIei4KKzwvcGFyYT4KKzxzZWN0aW9uIGlkPSJkdmItcXBzay1wYXJhbWV0ZXJzIj4KKzx0aXRsZT5RUFNLIHBhcmFtZXRlcnM8L3RpdGxlPgorPHBhcmE+Rm9yIHNhdGVsbGl0ZSBRUFNLIGZyb250ZW5kcyB5b3UgaGF2ZSB0byB1c2UgdGhlIDxjb25zdGFudD5kdmJfcXBza19wYXJhbWV0ZXJzPC9jb25zdGFudD4gc3RydWN0dXJlOjwvcGFyYT4KIDxwcm9ncmFtbGlzdGluZz4KICBzdHJ1Y3QgZHZiX3Fwc2tfcGFyYW1ldGVycyB7CiAJIHVpbnQzMl90ICAgICAgICBzeW1ib2xfcmF0ZTsgIC8mI3gyMkM2OyBzeW1ib2wgcmF0ZSBpbiBTeW1ib2xzIHBlciBzZWNvbmQgJiN4MjJDNjsvCiAJIGZlX2NvZGVfcmF0ZV90ICBmZWNfaW5uZXI7ICAgIC8mI3gyMkM2OyBmb3J3YXJkIGVycm9yIGNvcnJlY3Rpb24gKHNlZSBhYm92ZSkgJiN4MjJDNjsvCiAgfTsKIDwvcHJvZ3JhbWxpc3Rpbmc+Ci08cGFyYT5mb3IgY2FibGUgUUFNIGZyb250ZW5kIHlvdSB1c2UgdGhlIDxjb25zdGFudD5RQU1QYXJhbWV0ZXJzPC9jb25zdGFudD4gc3RydWN0dXJlPC9wYXJhPgorPC9zZWN0aW9uPgorPHNlY3Rpb24gaWQ9ImR2Yi1xYW0tcGFyYW1ldGVycyI+Cis8dGl0bGU+UUFNIHBhcmFtZXRlcnM8L3RpdGxlPgorPHBhcmE+Zm9yIGNhYmxlIFFBTSBmcm9udGVuZCB5b3UgdXNlIHRoZSA8Y29uc3RhbnQ+ZHZiX3FhbV9wYXJhbWV0ZXJzPC9jb25zdGFudD4gc3RydWN0dXJlOjwvcGFyYT4KIDxwcm9ncmFtbGlzdGluZz4KICBzdHJ1Y3QgZHZiX3FhbV9wYXJhbWV0ZXJzIHsKIAkgdWludDMyX3QgICAgICAgICBzeW1ib2xfcmF0ZTsgLyYjeDIyQzY7IHN5bWJvbCByYXRlIGluIFN5bWJvbHMgcGVyIHNlY29uZCAmI3gyMkM2Oy8KQEAgLTIyMCw4ICsyNzMsMTkgQEAKIAkgZmVfbW9kdWxhdGlvbl90ICBtb2R1bGF0aW9uOyAgLyYjeDIyQzY7IG1vZHVsYXRpb24gdHlwZSAoc2VlIGFib3ZlKSAmI3gyMkM2Oy8KICB9OwogPC9wcm9ncmFtbGlzdGluZz4KLTxwYXJhPkRWQi1UIGZyb250ZW5kcyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSA8Y29uc3RhbnQ+T0ZETVBhcmFtdGVyczwvY29uc3RhbnQ+IHN0cnVjdHVyZQotPC9wYXJhPgorPC9zZWN0aW9uPgorPHNlY3Rpb24gaWQ9ImR2Yi12c2ItcGFyYW1ldGVycyI+Cis8dGl0bGU+VlNCIHBhcmFtZXRlcnM8L3RpdGxlPgorPHBhcmE+QVRTQyBmcm9udGVuZHMgYXJlIHN1cHBvcnRlZCBieSB0aGUgPGNvbnN0YW50PmR2Yl92c2JfcGFyYW1ldGVyczwvY29uc3RhbnQ+IHN0cnVjdHVyZTo8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+CitzdHJ1Y3QgZHZiX3ZzYl9wYXJhbWV0ZXJzIHsKKwlmZV9tb2R1bGF0aW9uX3QgbW9kdWxhdGlvbjsJLyYjeDIyQzY7IG1vZHVsYXRpb24gdHlwZSAoc2VlIGFib3ZlKSAmI3gyMkM2Oy8KK307Cis8L3Byb2dyYW1saXN0aW5nPgorPC9zZWN0aW9uPgorPHNlY3Rpb24gaWQ9ImR2Yi1vZmRtLXBhcmFtZXRlcnMiPgorPHRpdGxlPk9GRE0gcGFyYW1ldGVyczwvdGl0bGU+Cis8cGFyYT5EVkItVCBmcm9udGVuZHMgYXJlIHN1cHBvcnRlZCBieSB0aGUgPGNvbnN0YW50PmR2Yl9vZmRtX3BhcmFtZXRlcnM8L2NvbnN0YW50PiBzdHJ1Y3R1cmU6PC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgogIHN0cnVjdCBkdmJfb2ZkbV9wYXJhbWV0ZXJzIHsKIAkgZmVfYmFuZHdpZHRoX3QgICAgICBiYW5kd2lkdGg7CkBAIC0yMzMsODYgKzI5NywxMjQgQEAKIAkgZmVfaGllcmFyY2h5X3QgICAgICBoaWVyYXJjaHlfaW5mb3JtYXRpb247CiAgfTsKIDwvcHJvZ3JhbWxpc3Rpbmc+Ci08cGFyYT5JbiB0aGUgY2FzZSBvZiBRUFNLIGZyb250ZW5kcyB0aGUgPGNvbnN0YW50PkZyZXF1ZW5jeTwvY29uc3RhbnQ+IGZpZWxkIHNwZWNpZmllcyB0aGUgaW50ZXJtZWRpYXRlCi1mcmVxdWVuY3ksIGkuZS4gdGhlIG9mZnNldCB3aGljaCBpcyBlZmZlY3RpdmVseSBhZGRlZCB0byB0aGUgbG9jYWwgb3NjaWxsYXRvciBmcmVxdWVuY3kgKExPRikgb2YKLXRoZSBMTkIuIFRoZSBpbnRlcm1lZGlhdGUgZnJlcXVlbmN5IGhhcyB0byBiZSBzcGVjaWZpZWQgaW4gdW5pdHMgb2Yga0h6LiBGb3IgUUFNIGFuZAotT0ZETSBmcm9udGVuZHMgdGhlIEZyZXF1ZW5jeSBzcGVjaWZpZXMgdGhlIGFic29sdXRlIGZyZXF1ZW5jeSBhbmQgaXMgZ2l2ZW4gaW4KLUh6LgotPC9wYXJhPgorPC9zZWN0aW9uPgorPHNlY3Rpb24gaWQ9ImZlLXNwZWN0cmFsLWludmVyc2lvbi10Ij4KKzx0aXRsZT5mcm9udGVuZCBzcGVjdHJhbCBpbnZlcnNpb248L3RpdGxlPgogPHBhcmE+VGhlIEludmVyc2lvbiBmaWVsZCBjYW4gdGFrZSBvbmUgb2YgdGhlc2UgdmFsdWVzOgogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bSBmZV9zcGVjdHJhbF9pbnZlcnNpb24gewotCSBJTlZFUlNJT05fT0ZGLAotCSBJTlZFUlNJT05fT04sCi0JIElOVkVSU0lPTl9BVVRPCi0gfSBmZV9zcGVjdHJhbF9pbnZlcnNpb25fdDsKK3R5cGVkZWYgZW51bSBmZV9zcGVjdHJhbF9pbnZlcnNpb24geworCUlOVkVSU0lPTl9PRkYsCisJSU5WRVJTSU9OX09OLAorCUlOVkVSU0lPTl9BVVRPCit9IGZlX3NwZWN0cmFsX2ludmVyc2lvbl90OwogPC9wcm9ncmFtbGlzdGluZz4KIDxwYXJhPkl0IGluZGljYXRlcyBpZiBzcGVjdHJhbCBpbnZlcnNpb24gc2hvdWxkIGJlIHByZXN1bWVkIG9yIG5vdC4gSW4gdGhlIGF1dG9tYXRpYyBzZXR0aW5nCiAoPGNvbnN0YW50PklOVkVSU0lPTl9BVVRPPC9jb25zdGFudD4pIHRoZSBoYXJkd2FyZSB3aWxsIHRyeSB0byBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IHNldHRpbmcgYnkKIGl0c2VsZi4KIDwvcGFyYT4KLTxwYXJhPlRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSA8Y29uc3RhbnQ+RkVDX2lubmVyPC9jb25zdGFudD4gZmllbGQgYXJlCis8L3NlY3Rpb24+Cis8c2VjdGlvbiBpZD0iZmUtY29kZS1yYXRlLXQiPgorPHRpdGxlPmZyb250ZW5kIGNvZGUgcmF0ZTwvdGl0bGU+Cis8cGFyYT5UaGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgPGNvbnN0YW50PmZlY19pbm5lcjwvY29uc3RhbnQ+IGZpZWxkIHVzZWQgb24KKzxsaW5rIHJlZmVuZD0iZHZiLXFwc2stcGFyYW1ldGVycyI+PGNvbnN0YW50PnN0cnVjdCBkdmJfcXBza19wYXJhbWV0ZXJzPC9jb25zdGFudD48L2xpbms+IGFuZAorPGxpbmsgcmVmZW5kPSJkdmItcWFtLXBhcmFtZXRlcnMiPjxjb25zdGFudD5zdHJ1Y3QgZHZiX3FhbV9wYXJhbWV0ZXJzPC9jb25zdGFudD48L2xpbms+IGFyZToKIDwvcGFyYT4KIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIGVudW0gZmVfY29kZV9yYXRlIHsKLQkgRkVDX05PTkUgPSAwLAotCSBGRUNfMV8yLAotCSBGRUNfMl8zLAotCSBGRUNfM180LAotCSBGRUNfNF81LAotCSBGRUNfNV82LAotCSBGRUNfNl83LAotCSBGRUNfN184LAotCSBGRUNfOF85LAotCSBGRUNfQVVUTwotIH0gZmVfY29kZV9yYXRlX3Q7Cit0eXBlZGVmIGVudW0gZmVfY29kZV9yYXRlIHsKKwlGRUNfTk9ORSA9IDAsCisJRkVDXzFfMiwKKwlGRUNfMl8zLAorCUZFQ18zXzQsCisJRkVDXzRfNSwKKwlGRUNfNV82LAorCUZFQ182XzcsCisJRkVDXzdfOCwKKwlGRUNfOF85LAorCUZFQ19BVVRPLAorCUZFQ18zXzUsCisJRkVDXzlfMTAsCit9IGZlX2NvZGVfcmF0ZV90OwogPC9wcm9ncmFtbGlzdGluZz4KIDxwYXJhPndoaWNoIGNvcnJlc3BvbmQgdG8gZXJyb3IgY29ycmVjdGlvbiByYXRlcyBvZiAxLzIsIDIvMywgZXRjLiwgbm8gZXJyb3IgY29ycmVjdGlvbiBvciBhdXRvCiBkZXRlY3Rpb24uCiA8L3BhcmE+Ci08cGFyYT5Gb3IgY2FibGUgYW5kIHRlcnJlc3RyaWFsIGZyb250ZW5kcyAoUUFNIGFuZCBPRkRNKSBvbmUgYWxzbyBoYXMgdG8gc3BlY2lmeSB0aGUgcXVhZHJhdHVyZQotbW9kdWxhdGlvbiBtb2RlIHdoaWNoIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKzwvc2VjdGlvbj4KKzxzZWN0aW9uIGlkPSJmZS1tb2R1bGF0aW9uLXQiPgorPHRpdGxlPmZyb250ZW5kIG1vZHVsYXRpb24gdHlwZSBmb3IgUUFNLCBPRkRNIGFuZCBWU0I8L3RpdGxlPgorPHBhcmE+Rm9yIGNhYmxlIGFuZCB0ZXJyZXN0cmlhbCBmcm9udGVuZHMsIGUuIGcuIGZvcgorPGxpbmsgcmVmZW5kPSJkdmItcWFtLXBhcmFtZXRlcnMiPjxjb25zdGFudD5zdHJ1Y3QgZHZiX3Fwc2tfcGFyYW1ldGVyczwvY29uc3RhbnQ+PC9saW5rPiwKKzxsaW5rIHJlZmVuZD0iZHZiLW9mZG0tcGFyYW1ldGVycyI+PGNvbnN0YW50PnN0cnVjdCBkdmJfcWFtX3BhcmFtZXRlcnM8L2NvbnN0YW50PjwvbGluaz4gYW5kCis8bGluayByZWZlbmQ9ImR2Yi12c2ItcGFyYW1ldGVycyI+PGNvbnN0YW50PnN0cnVjdCBkdmJfcWFtX3BhcmFtZXRlcnM8L2NvbnN0YW50PjwvbGluaz4sCitpdCBuZWVkcyB0byBzcGVjaWZ5IHRoZSBxdWFkcmF0dXJlIG1vZHVsYXRpb24gbW9kZSB3aGljaCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CiA8L3BhcmE+CiA8cHJvZ3JhbWxpc3Rpbmc+CiAgdHlwZWRlZiBlbnVtIGZlX21vZHVsYXRpb24gewotIFFQU0ssCi0JIFFBTV8xNiwKLQkgUUFNXzMyLAotCSBRQU1fNjQsCi0JIFFBTV8xMjgsCi0JIFFBTV8yNTYsCi0JIFFBTV9BVVRPCisJUVBTSywKKwlRQU1fMTYsCisJUUFNXzMyLAorCVFBTV82NCwKKwlRQU1fMTI4LAorCVFBTV8yNTYsCisJUUFNX0FVVE8sCisJVlNCXzgsCisJVlNCXzE2LAorCVBTS184LAorCUFQU0tfMTYsCisJQVBTS18zMiwKKwlEUVBTSywKICB9IGZlX21vZHVsYXRpb25fdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+Cis8L3NlY3Rpb24+CiA8cGFyYT5GaW5hbGx5LCB0aGVyZSBhcmUgc2V2ZXJhbCBtb3JlIHBhcmFtZXRlcnMgZm9yIE9GRE06CiA8L3BhcmE+Cis8c2VjdGlvbiBpZD0iZmUtdHJhbnNtaXQtbW9kZS10Ij4KKzx0aXRsZT5OdW1iZXIgb2YgY2FycmllcnMgcGVyIGNoYW5uZWw8L3RpdGxlPgogPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bSBmZV90cmFuc21pdF9tb2RlIHsKLQkgVFJBTlNNSVNTSU9OX01PREVfMkssCi0JIFRSQU5TTUlTU0lPTl9NT0RFXzhLLAotCSBUUkFOU01JU1NJT05fTU9ERV9BVVRPCit0eXBlZGVmIGVudW0gZmVfdHJhbnNtaXRfbW9kZSB7CisJVFJBTlNNSVNTSU9OX01PREVfMkssCisJVFJBTlNNSVNTSU9OX01PREVfOEssCisJVFJBTlNNSVNTSU9OX01PREVfQVVUTywKKwlUUkFOU01JU1NJT05fTU9ERV80SywKKwlUUkFOU01JU1NJT05fTU9ERV8xSywKKwlUUkFOU01JU1NJT05fTU9ERV8xNkssCisJVFJBTlNNSVNTSU9OX01PREVfMzJLLAogIH0gZmVfdHJhbnNtaXRfbW9kZV90OwogPC9wcm9ncmFtbGlzdGluZz4KLSA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBlbnVtIGZlX2JhbmR3aWR0aCB7Ci0JIEJBTkRXSURUSF84X01IWiwKLQkgQkFORFdJRFRIXzdfTUhaLAotCSBCQU5EV0lEVEhfNl9NSFosCi0JIEJBTkRXSURUSF9BVVRPCi0gfSBmZV9iYW5kd2lkdGhfdDsKKzwvc2VjdGlvbj4KKzxzZWN0aW9uIGlkPSJmZS1iYW5kd2lkdGgtdCI+Cis8dGl0bGU+ZnJvbnRlbmQgYmFuZHdpZHRoPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgZW51bSBmZV9iYW5kd2lkdGggeworCUJBTkRXSURUSF84X01IWiwKKwlCQU5EV0lEVEhfN19NSFosCisJQkFORFdJRFRIXzZfTUhaLAorCUJBTkRXSURUSF9BVVRPLAorCUJBTkRXSURUSF81X01IWiwKKwlCQU5EV0lEVEhfMTBfTUhaLAorCUJBTkRXSURUSF8xXzcxMl9NSFosCit9IGZlX2JhbmR3aWR0aF90OwogPC9wcm9ncmFtbGlzdGluZz4KLSA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBlbnVtIGZlX2d1YXJkX2ludGVydmFsIHsKLQkgR1VBUkRfSU5URVJWQUxfMV8zMiwKLQkgR1VBUkRfSU5URVJWQUxfMV8xNiwKLQkgR1VBUkRfSU5URVJWQUxfMV84LAotCSBHVUFSRF9JTlRFUlZBTF8xXzQsCi0JIEdVQVJEX0lOVEVSVkFMX0FVVE8KLSB9IGZlX2d1YXJkX2ludGVydmFsX3Q7Cis8L3NlY3Rpb24+Cis8c2VjdGlvbiBpZD0iZmUtZ3VhcmQtaW50ZXJ2YWwtdCI+Cis8dGl0bGU+ZnJvbnRlbmQgZ3VhcmQgaW52ZXJ2YWw8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBlbnVtIGZlX2d1YXJkX2ludGVydmFsIHsKKwlHVUFSRF9JTlRFUlZBTF8xXzMyLAorCUdVQVJEX0lOVEVSVkFMXzFfMTYsCisJR1VBUkRfSU5URVJWQUxfMV84LAorCUdVQVJEX0lOVEVSVkFMXzFfNCwKKwlHVUFSRF9JTlRFUlZBTF9BVVRPLAorCUdVQVJEX0lOVEVSVkFMXzFfMTI4LAorCUdVQVJEX0lOVEVSVkFMXzE5XzEyOCwKKwlHVUFSRF9JTlRFUlZBTF8xOV8yNTYsCit9IGZlX2d1YXJkX2ludGVydmFsX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgotIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIGVudW0gZmVfaGllcmFyY2h5IHsKKzwvc2VjdGlvbj4KKzxzZWN0aW9uIGlkPSJmZS1oaWVyYXJjaHktdCI+Cis8dGl0bGU+ZnJvbnRlbmQgaGllcmFyY2h5PC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgZW51bSBmZV9oaWVyYXJjaHkgewogCSBISUVSQVJDSFlfTk9ORSwKIAkgSElFUkFSQ0hZXzEsCiAJIEhJRVJBUkNIWV8yLApAQCAtMzIwLDEwICs0MjIsMTEgQEAKIAkgSElFUkFSQ0hZX0FVVE8KICB9IGZlX2hpZXJhcmNoeV90OwogPC9wcm9ncmFtbGlzdGluZz4KKzwvc2VjdGlvbj4KIAogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZnJvbnRlbmRfZXZlbnRzIj4KKzxzZWN0aW9uIGlkPSJkdmItZnJvbnRlbmQtZXZlbnQiPgogPHRpdGxlPmZyb250ZW5kIGV2ZW50czwvdGl0bGU+CiAgPHByb2dyYW1saXN0aW5nPgogIHN0cnVjdCBkdmJfZnJvbnRlbmRfZXZlbnQgewpAQCAtNDEyLDggKzUxNSw3IEBACiA8cGFyYT4oYmxvY2tpbmcgbW9kZSBpcyB0aGUgZGVmYXVsdCk8L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Cis8cGFyYT5SRVRVUk4gVkFMVUU8L3BhcmE+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVOT0RFVjwvcGFyYT4KQEAgLTQ3Myw4ICs1NzUsNyBAQAogPHBhcmE+RmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBvcGVuKCkuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FQkFERjwvcGFyYT4KQEAgLTUzMCw4ICs2MzEsNyBAQAogIHRvIGJlIHN0b3JlZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Cis8cGFyYT5SRVRVUk4gVkFMVUU8L3BhcmE+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVCQURGPC9wYXJhPgpAQCAtNTkyLDM4ICs2OTIsOCBAQAogPHBhcmE+VGhlIGJpdCBlcnJvciByYXRlIGlzIHN0b3JlZCBpbnRvICpiZXIuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVGQVVMVDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+YmVyIHBvaW50cyB0byBpbnZhbGlkIGFkZHJlc3MuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVOT1NJR05BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+VGhlcmUgaXMgbm8gc2lnbmFsLCB0aHVzIG5vIG1lYW5pbmdmdWwgYml0IGVycm9yIHJhdGUuIEFsc28KLSByZXR1cm5lZCBpZiB0aGUgZnJvbnQtZW5kIGlzIG5vdCB0dXJuZWQgb24uPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVOT1NZUzwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RnVuY3Rpb24gbm90IGF2YWlsYWJsZSBmb3IgdGhpcyBkZXZpY2UuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKworJnJldHVybi12YWx1ZS1kdmI7CiA8L3NlY3Rpb24+CiAKIDxzZWN0aW9uIGlkPSJGRV9SRUFEX1NOUiI+CkBAIC02NzAsMzggKzc0MCw3IEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FRkFVTFQ8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPnNuciBwb2ludHMgdG8gaW52YWxpZCBhZGRyZXNzLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FTk9TSUdOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPlRoZXJlIGlzIG5vIHNpZ25hbCwgdGh1cyBubyBtZWFuaW5nZnVsIHNpZ25hbCBzdHJlbmd0aAotIHZhbHVlLiBBbHNvIHJldHVybmVkIGlmIGZyb250LWVuZCBpcyBub3QgdHVybmVkIG9uLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FTk9TWVM8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkZ1bmN0aW9uIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgZGV2aWNlLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIDwvc2VjdGlvbj4KIAogPHNlY3Rpb24gaWQ9IkZFX1JFQURfU0lHTkFMX1NUUkVOR1RIIj4KQEAgLTc0OCwzOCArNzg3LDggQEAKIDxwYXJhPlRoZSBzaWduYWwgc3RyZW5ndGggdmFsdWUgaXMgc3RvcmVkIGludG8gKnN0cmVuZ3RoLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FRkFVTFQ8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPnN0YXR1cyBwb2ludHMgdG8gaW52YWxpZCBhZGRyZXNzLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FTk9TSUdOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPlRoZXJlIGlzIG5vIHNpZ25hbCwgdGh1cyBubyBtZWFuaW5nZnVsIHNpZ25hbCBzdHJlbmd0aAotIHZhbHVlLiBBbHNvIHJldHVybmVkIGlmIGZyb250LWVuZCBpcyBub3QgdHVybmVkIG9uLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FTk9TWVM8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkZ1bmN0aW9uIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgZGV2aWNlLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CisKKyZyZXR1cm4tdmFsdWUtZHZiOwogPC9zZWN0aW9uPgogCiA8c2VjdGlvbiBpZD0iRkVfUkVBRF9VTkNPUlJFQ1RFRF9CTE9DS1MiPgpAQCAtODMzLDMwICs4NDIsOCBAQAogIHNvIGZhci48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT51YmxvY2tzIHBvaW50cyB0byBpbnZhbGlkIGFkZHJlc3MuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVOT1NZUzwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RnVuY3Rpb24gbm90IGF2YWlsYWJsZSBmb3IgdGhpcyBkZXZpY2UuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKworJnJldHVybi12YWx1ZS1kdmI7CiA8L3NlY3Rpb24+CiAKIDxzZWN0aW9uIGlkPSJGRV9TRVRfRlJPTlRFTkQiPgpAQCAtOTA5LDI0ICs4OTYsMTAgQEAKIDxwYXJhPlBvaW50cyB0byBwYXJhbWV0ZXJzIGZvciB0dW5pbmcgb3BlcmF0aW9uLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKworJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5wIHBvaW50cyB0byBpbnZhbGlkIGFkZHJlc3MuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVJTlZBTDwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpAQCAtOTgyLDI1ICs5NTUsOSBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci0KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVGQVVMVDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+cCBwb2ludHMgdG8gaW52YWxpZCBhZGRyZXNzLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTEwODQsMjQgKzEwNDEsOSBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPHBhcmE+RVJST1JTCi08L3BhcmE+CismcmV0dXJuLXZhbHVlLWR2YjsKIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FRkFVTFQ8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmV2IHBvaW50cyB0byBpbnZhbGlkIGFkZHJlc3MuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVXT1VMREJMT0NLPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CkBAIC0xMTEzLDExICsxMDU1LDYgQEAKIDxwYXJhPkVPVkVSRkxPVzwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+T3ZlcmZsb3cgaW4gZXZlbnQgcXVldWUgLSBvbmUgb3IgbW9yZSBldmVudHMgd2VyZSBsb3N0LjwvcGFyYT4KIDwvZW50cnk+CiA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KQEAgLTExNzAsMjMgKzExMDcsNyBAQAogIHRvIGJlIHN0b3JlZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5pbmZvIHBvaW50cyB0byBpbnZhbGlkIGFkZHJlc3MuPC9wYXJhPgotPC9lbnRyeT4KLTwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiA8L3NlY3Rpb24+CiAKIDxzZWN0aW9uIGlkPSJGRV9ESVNFUUNfUkVTRVRfT1ZFUkxPQUQiPgpAQCAtMTIyOSwzMCArMTE1MCw3IEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RVBFUk08L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPlBlcm1pc3Npb24gZGVuaWVkIChuZWVkcyByZWFkL3dyaXRlIGFjY2VzcykuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IgaW4gdGhlIGRldmljZSBkcml2ZXIuPC9wYXJhPgotPC9lbnRyeT4KLTwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiA8L3NlY3Rpb24+CiAKIDxzZWN0aW9uIGlkPSJGRV9ESVNFUUNfU0VORF9NQVNURVJfQ01EIj4KQEAgLTEzMDIsNDUgKzEyMDAsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVGQVVMVDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+U2VxIHBvaW50cyB0byBhbiBpbnZhbGlkIGFkZHJlc3MuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+VGhlIGRhdGEgc3RydWN0dXJlIHJlZmVycmVkIHRvIGJ5IHNlcSBpcyBpbnZhbGlkIGluIHNvbWUKLSB3YXkuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVQRVJNPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5QZXJtaXNzaW9uIGRlbmllZCAobmVlZHMgcmVhZC93cml0ZSBhY2Nlc3MpLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yIGluIHRoZSBkZXZpY2UgZHJpdmVyLjwvcGFyYT4KLTwvZW50cnk+Ci08L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPC9zZWN0aW9uPgogCiA8c2VjdGlvbiBpZD0iRkVfRElTRVFDX1JFQ1ZfU0xBVkVfUkVQTFkiPgpAQCAtMTM5MCw0NSArMTI1MCw3IEBACiA8cGFyYT5Qb2ludGVyIHRvIHRoZSBjb21tYW5kIHRvIGJlIHJlY2VpdmVkLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5TZXEgcG9pbnRzIHRvIGFuIGludmFsaWQgYWRkcmVzcy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5UaGUgZGF0YSBzdHJ1Y3R1cmUgcmVmZXJyZWQgdG8gYnkgc2VxIGlzIGludmFsaWQgaW4gc29tZQotIHdheS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RVBFUk08L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPlBlcm1pc3Npb24gZGVuaWVkIChuZWVkcyByZWFkL3dyaXRlIGFjY2VzcykuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IgaW4gdGhlIGRldmljZSBkcml2ZXIuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPC9zZWN0aW9uPgogCiA8c2VjdGlvbiBpZD0iRkVfRElTRVFDX1NFTkRfQlVSU1QiPgpAQCAtMTQ3Niw0NSArMTI5OCw3IEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5TZXEgcG9pbnRzIHRvIGFuIGludmFsaWQgYWRkcmVzcy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5UaGUgZGF0YSBzdHJ1Y3R1cmUgcmVmZXJyZWQgdG8gYnkgc2VxIGlzIGludmFsaWQgaW4gc29tZQotIHdheS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RVBFUk08L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPlBlcm1pc3Npb24gZGVuaWVkIChuZWVkcyByZWFkL3dyaXRlIGFjY2VzcykuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IgaW4gdGhlIGRldmljZSBkcml2ZXIuPC9wYXJhPgotPC9lbnRyeT4KLTwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiA8L3NlY3Rpb24+CiAKIDxzZWN0aW9uIGlkPSJGRV9TRVRfVE9ORSI+CkBAIC0xNTYwLDQ0ICsxMzQ0LDcgQEAKIDxwYXJhPlRoZSByZXF1ZXN0ZWQgdG9uZSBnZW5lcmF0aW9uIG1vZGUgKG9uL29mZikuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FTk9ERVY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkRldmljZSBkcml2ZXIgbm90IGxvYWRlZC9hdmFpbGFibGUuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCVVNZPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5EZXZpY2Ugb3IgcmVzb3VyY2UgYnVzeS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnZhbGlkIGFyZ3VtZW50LjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FUEVSTTwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RmlsZSBub3Qgb3BlbmVkIHdpdGggcmVhZCBwZXJtaXNzaW9ucy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvciBpbiB0aGUgZGV2aWNlIGRyaXZlci48L3BhcmE+Ci08L2VudHJ5PgotPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIDwvc2VjdGlvbj4KIAogPHNlY3Rpb24gaWQ9IkZFX1NFVF9WT0xUQUdFIj4KQEAgLTE2NDUsNDQgKzEzOTIsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVOT0RFVjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RGV2aWNlIGRyaXZlciBub3QgbG9hZGVkL2F2YWlsYWJsZS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJVU1k8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkRldmljZSBvciByZXNvdXJjZSBidXN5LjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5WQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludmFsaWQgYXJndW1lbnQuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVQRVJNPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5GaWxlIG5vdCBvcGVuZWQgd2l0aCByZWFkIHBlcm1pc3Npb25zLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yIGluIHRoZSBkZXZpY2UgZHJpdmVyLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIDwvc2VjdGlvbj4KIAogPHNlY3Rpb24gaWQ9IkZFX0VOQUJMRV9ISUdIX0xOQl9WT0xUQUdFIj4KQEAgLTE3MzEsNDQgKzE0NDEsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVOT0RFVjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RGV2aWNlIGRyaXZlciBub3QgbG9hZGVkL2F2YWlsYWJsZS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJVU1k8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkRldmljZSBvciByZXNvdXJjZSBidXN5LjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5WQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludmFsaWQgYXJndW1lbnQuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVQRVJNPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5GaWxlIG5vdCBvcGVuZWQgd2l0aCByZWFkIHBlcm1pc3Npb25zLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yIGluIHRoZSBkZXZpY2UgZHJpdmVyLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIDwvc2VjdGlvbj4KIAogPHNlY3Rpb24gaWQ9IkZFX1NFVF9GUk9OVEVORF9UVU5FX01PREUiPgpAQCAtMTgwMCwxMSArMTQ3Myw3IEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08cGFyYT5FUlJPUlM8L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PgotPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5FSU5WQUw8L3BhcmE+PC9lbnRyeT4KLTxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+SW52YWxpZCBhcmd1bWVudC48L3BhcmE+PC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPC9zZWN0aW9uPgogCiA8c2VjdGlvbiBpZD0iRkVfRElTSE5FVFdPUktfU0VORF9MRUdBQ1lfQ01EIj4KQEAgLTE4MzgsMTIgKzE1MDcsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPHBhcmE+RVJST1JTPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz4KLTxlbnRyeSBhbGlnbj0iY2hhciI+Ci0JPHBhcmE+VGhlcmUgYXJlIG5vIGVycm9ycyBpbiB1c2UgZm9yIHRoaXMgY2FsbDwvcGFyYT4KLTwvZW50cnk+Ci08L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPC9zZWN0aW9uPgogCiA8L3NlY3Rpb24+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2ludHJvLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvaW50cm8ueG1sCnNpbWlsYXJpdHkgaW5kZXggOTIlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvaW50cm8ueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2ludHJvLnhtbAppbmRleCAwZGM4M2Y2Li5jNzVkYzdjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2ludHJvLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2ludHJvLnhtbApAQCAtMTU0LDYgKzE1NCwxMCBAQAogPC9saXN0aXRlbT4KICA8bGlzdGl0ZW0+CiAKKzxwYXJhPjxlbXBoYXNpcyByb2xlPSJ0dCI+L2Rldi9kdmIvYWRhcHRlck4vZHZyTTwvZW1waGFzaXM+LDwvcGFyYT4KKzwvbGlzdGl0ZW0+CisgPGxpc3RpdGVtPgorCiA8cGFyYT48ZW1waGFzaXMgcm9sZT0idHQiPi9kZXYvZHZiL2FkYXB0ZXJOL2NhTTwvZW1waGFzaXM+LDwvcGFyYT48L2xpc3RpdGVtPjwvaXRlbWl6ZWRsaXN0PgogCiA8cGFyYT53aGVyZSBOIGVudW1lcmF0ZXMgdGhlIERWQiBQQ0kgY2FyZHMgaW4gYSBzeXN0ZW0gc3RhcnRpbmcKQEAgLTE3NSwxMCArMTc5LDI3IEBACiBUaGUgRFZCIEFQSSBpbmNsdWRlIGZpbGVzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhcHBsaWNhdGlvbiBzb3VyY2VzIHdpdGgKIGEgcGFydGlhbCBwYXRoIGxpa2U6PC9wYXJhPgogCi0KKzxwcm9ncmFtbGlzdGluZz4KKwkjaW5jbHVkZSAmI3gwMDNDO2xpbnV4L2R2Yi9hdWRpby5oJiN4MDAzRTsKKzwvcHJvZ3JhbWxpc3Rpbmc+Cis8cHJvZ3JhbWxpc3Rpbmc+CisJI2luY2x1ZGUgJiN4MDAzQztsaW51eC9kdmIvY2EuaCYjeDAwM0U7Cis8L3Byb2dyYW1saXN0aW5nPgorPHByb2dyYW1saXN0aW5nPgorCSNpbmNsdWRlICYjeDAwM0M7bGludXgvZHZiL2RteC5oJiN4MDAzRTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CiA8cHJvZ3JhbWxpc3Rpbmc+CiAJI2luY2x1ZGUgJiN4MDAzQztsaW51eC9kdmIvZnJvbnRlbmQuaCYjeDAwM0U7CiA8L3Byb2dyYW1saXN0aW5nPgorPHByb2dyYW1saXN0aW5nPgorCSNpbmNsdWRlICYjeDAwM0M7bGludXgvZHZiL25ldC5oJiN4MDAzRTsKKzwvcHJvZ3JhbWxpc3Rpbmc+Cis8cHJvZ3JhbWxpc3Rpbmc+CisJI2luY2x1ZGUgJiN4MDAzQztsaW51eC9kdmIvb3NkLmgmI3gwMDNFOworPC9wcm9ncmFtbGlzdGluZz4KKzxwcm9ncmFtbGlzdGluZz4KKwkjaW5jbHVkZSAmI3gwMDNDO2xpbnV4L2R2Yi92aWRlby5oJiN4MDAzRTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CiAKIDxwYXJhPlRvIGVuYWJsZSBhcHBsaWNhdGlvbnMgdG8gc3VwcG9ydCBkaWZmZXJlbnQgQVBJIHZlcnNpb24sIGFuCiBhZGRpdGlvbmFsIGluY2x1ZGUgZmlsZSA8ZW1waGFzaXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIva2RhcGkueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9rZGFwaS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay9kdmIva2RhcGkueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2tkYXBpLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9uZXQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9uZXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDM3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL25ldC54bWwKQEAgLTAsMCArMSwyOSBAQAorPHRpdGxlPkRWQiBOZXR3b3JrIEFQSTwvdGl0bGU+Cis8cGFyYT5UaGUgRFZCIG5ldCBkZXZpY2UgZW5hYmxlcyBmZWVkaW5nIG9mIE1QRSAobXVsdGkgcHJvdG9jb2wgZW5jYXBzdWxhdGlvbikgcGFja2V0cworcmVjZWl2ZWQgdmlhIERWQiBpbnRvIHRoZSBMaW51eCBuZXR3b3JrIHByb3RvY29sIHN0YWNrLCBlLmcuIGZvciBpbnRlcm5ldCB2aWEgc2F0ZWxsaXRlCithcHBsaWNhdGlvbnMuIEl0IGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIDxlbXBoYXNpcyByb2xlPSJ0dCI+L2Rldi9kdmIvYWRhcHRlcjAvbmV0MDwvZW1waGFzaXM+LiBEYXRhIHR5cGVzIGFuZAorYW5kIGlvY3RsIGRlZmluaXRpb25zIGNhbiBiZSBhY2Nlc3NlZCBieSBpbmNsdWRpbmcgPGVtcGhhc2lzIHJvbGU9InR0Ij5saW51eC9kdmIvbmV0Lmg8L2VtcGhhc2lzPiBpbiB5b3VyCithcHBsaWNhdGlvbi4KKzwvcGFyYT4KKzxzZWN0aW9uIGlkPSJkdmJfbmV0X3R5cGVzIj4KKzx0aXRsZT5EVkIgTmV0IERhdGEgVHlwZXM8L3RpdGxlPgorCis8c2VjdGlvbiBpZD0iZHZiLW5ldC1pZiI+Cis8dGl0bGU+c3RydWN0IGR2Yl9uZXRfaWY8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorc3RydWN0IGR2Yl9uZXRfaWYgeworCV9fdTE2IHBpZDsKKwlfX3UxNiBpZl9udW07CisJX191OCAgZmVlZHR5cGU7CisjZGVmaW5lIERWQl9ORVRfRkVFRFRZUEVfTVBFIDAJLyYjeDIyQzY7IG11bHRpIHByb3RvY29sIGVuY2Fwc3VsYXRpb24gJiN4MjJDNjsvCisjZGVmaW5lIERWQl9ORVRfRkVFRFRZUEVfVUxFIDEJLyYjeDIyQzY7IHVsdHJhIGxpZ2h0d2VpZ2h0IGVuY2Fwc3VsYXRpb24gJiN4MjJDNjsvCit9OworPC9wcm9ncmFtbGlzdGluZz4KKzwvc2VjdGlvbj4KKworPC9zZWN0aW9uPgorPHNlY3Rpb24gaWQ9Im5ldF9mY2FsbHMiPgorPHRpdGxlPkRWQiBuZXQgRnVuY3Rpb24gQ2FsbHM8L3RpdGxlPgorPHBhcmE+VG8gYmUgd3JpdHRlbiYjeDIwMjY7Cis8L3BhcmE+Cis8L3NlY3Rpb24+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL3ZpZGVvLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvdmlkZW8ueG1sCnNpbWlsYXJpdHkgaW5kZXggODAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvdmlkZW8ueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL3ZpZGVvLnhtbAppbmRleCA3YmIyODdlLi4yNWZiODIzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL3ZpZGVvLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL3ZpZGVvLnhtbApAQCAtMTgsMTUgKzE4LDE2IEBACiA8c2VjdGlvbiBpZD0idmlkZW9fdHlwZXMiPgogPHRpdGxlPlZpZGVvIERhdGEgVHlwZXM8L3RpdGxlPgogCi08c2VjdGlvbiBpZD0idmlkZW9fZm9ybWF0X3QiPgorPHNlY3Rpb24gaWQ9InZpZGVvLWZvcm1hdC10Ij4KIDx0aXRsZT52aWRlb19mb3JtYXRfdDwvdGl0bGU+CiA8cGFyYT5UaGUgPGVtcGhhc2lzIHJvbGU9InR0Ij52aWRlb19mb3JtYXRfdDwvZW1waGFzaXM+IGRhdGEgdHlwZSBkZWZpbmVkIGJ5CiA8L3BhcmE+CiA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBlbnVtIHsKLQkgVklERU9fRk9STUFUXzRfMywKLQkgVklERU9fRk9STUFUXzE2XzkKLSB9IHZpZGVvX2Zvcm1hdF90OwordHlwZWRlZiBlbnVtIHsKKwlWSURFT19GT1JNQVRfNF8zLCAgICAgLyYjeDIyQzY7IFNlbGVjdCA0OjMgZm9ybWF0ICYjeDIyQzY7LworCVZJREVPX0ZPUk1BVF8xNl85LCAgICAvJiN4MjJDNjsgU2VsZWN0IDE2OjkgZm9ybWF0LiAmI3gyMkM2Oy8KKwlWSURFT19GT1JNQVRfMjIxXzEgICAgLyYjeDIyQzY7IDIuMjE6MSAmI3gyMkM2Oy8KK30gdmlkZW9fZm9ybWF0X3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogPHBhcmE+aXMgdXNlZCBpbiB0aGUgVklERU9fU0VUX0ZPUk1BVCBmdW5jdGlvbiAoPz8pIHRvIHRlbGwgdGhlIGRyaXZlciB3aGljaCBhc3BlY3QgcmF0aW8KIHRoZSBvdXRwdXQgaGFyZHdhcmUgKGUuZy4gVFYpIGhhcy4gSXQgaXMgYWxzbyB1c2VkIGluIHRoZSBkYXRhIHN0cnVjdHVyZXMgdmlkZW9fc3RhdHVzCkBAIC0zNiwzNCArMzcsMzYgQEAKIDwvcGFyYT4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9InZpZGVvX2Rpc3BsYXlfZm9ybWF0X3QiPgotPHRpdGxlPnZpZGVvX2Rpc3BsYXlfZm9ybWF0X3Q8L3RpdGxlPgorPHNlY3Rpb24gaWQ9InZpZGVvLWRpc3BsYXlmb3JtYXQtdCI+Cis8dGl0bGU+dmlkZW9fZGlzcGxheWZvcm1hdF90PC90aXRsZT4KIDxwYXJhPkluIGNhc2UgdGhlIGRpc3BsYXkgZm9ybWF0IG9mIHRoZSB2aWRlbyBzdHJlYW0gYW5kIG9mIHRoZSBkaXNwbGF5IGhhcmR3YXJlIGRpZmZlciB0aGUKIGFwcGxpY2F0aW9uIGhhcyB0byBzcGVjaWZ5IGhvdyB0byBoYW5kbGUgdGhlIGNyb3BwaW5nIG9mIHRoZSBwaWN0dXJlLiBUaGlzIGNhbiBiZSBkb25lIHVzaW5nCiB0aGUgVklERU9fU0VUX0RJU1BMQVlfRk9STUFUIGNhbGwgKD8/KSB3aGljaCBhY2NlcHRzCiA8L3BhcmE+CiA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBlbnVtIHsKLQkgVklERU9fUEFOX1NDQU4sCi0JIFZJREVPX0xFVFRFUl9CT1gsCi0JIFZJREVPX0NFTlRFUl9DVVRfT1VUCi0gfSB2aWRlb19kaXNwbGF5X2Zvcm1hdF90OwordHlwZWRlZiBlbnVtIHsKKwlWSURFT19QQU5fU0NBTiwgICAgICAgLyYjeDIyQzY7IHVzZSBwYW4gYW5kIHNjYW4gZm9ybWF0ICYjeDIyQzY7LworCVZJREVPX0xFVFRFUl9CT1gsICAgICAvJiN4MjJDNjsgdXNlIGxldHRlcmJveCBmb3JtYXQgJiN4MjJDNjsvCisJVklERU9fQ0VOVEVSX0NVVF9PVVQgIC8mI3gyMkM2OyB1c2UgY2VudGVyIGN1dCBvdXQgZm9ybWF0ICYjeDIyQzY7LworfSB2aWRlb19kaXNwbGF5Zm9ybWF0X3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogPHBhcmE+YXMgYXJndW1lbnQuCiA8L3BhcmE+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJ2aWRlb19zdHJlYW1fc291cmNlIj4KKzxzZWN0aW9uIGlkPSJ2aWRlby1zdHJlYW0tc291cmNlLXQiPgogPHRpdGxlPnZpZGVvIHN0cmVhbSBzb3VyY2U8L3RpdGxlPgogPHBhcmE+VGhlIHZpZGVvIHN0cmVhbSBzb3VyY2UgaXMgc2V0IHRocm91Z2ggdGhlIFZJREVPX1NFTEVDVF9TT1VSQ0UgY2FsbCBhbmQgY2FuIHRha2UKIHRoZSBmb2xsb3dpbmcgdmFsdWVzLCBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSBhcmUgcmVwbGF5aW5nIGZyb20gYW4gaW50ZXJuYWwgKGRlbXV4ZXIpIG9yCiBleHRlcm5hbCAodXNlciB3cml0ZSkgc291cmNlLgogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bSB7Ci0JIFZJREVPX1NPVVJDRV9ERU1VWCwKLQkgVklERU9fU09VUkNFX01FTU9SWQotIH0gdmlkZW9fc3RyZWFtX3NvdXJjZV90OwordHlwZWRlZiBlbnVtIHsKKwlWSURFT19TT1VSQ0VfREVNVVgsIC8mI3gyMkM2OyBTZWxlY3QgdGhlIGRlbXV4IGFzIHRoZSBtYWluIHNvdXJjZSAmI3gyMkM2Oy8KKwlWSURFT19TT1VSQ0VfTUVNT1JZIC8mI3gyMkM2OyBJZiB0aGlzIHNvdXJjZSBpcyBzZWxlY3RlZCwgdGhlIHN0cmVhbQorCQkJICAgICAgIGNvbWVzIGZyb20gdGhlIHVzZXIgdGhyb3VnaCB0aGUgd3JpdGUKKwkJCSAgICAgICBzeXN0ZW0gY2FsbCAmI3gyMkM2Oy8KK30gdmlkZW9fc3RyZWFtX3NvdXJjZV90OwogPC9wcm9ncmFtbGlzdGluZz4KIDxwYXJhPlZJREVPX1NPVVJDRV9ERU1VWCBzZWxlY3RzIHRoZSBkZW11bHRpcGxleGVyIChmZWQgZWl0aGVyIGJ5IHRoZSBmcm9udGVuZCBvciB0aGUKIERWUiBkZXZpY2UpIGFzIHRoZSBzb3VyY2Ugb2YgdGhlIHZpZGVvIHN0cmVhbS4gSWYgVklERU9fU09VUkNFX01FTU9SWQpAQCAtNzIsNDkgKzc1LDk4IEBACiA8L3BhcmE+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJ2aWRlb19wbGF5X3N0YXRlIj4KKzxzZWN0aW9uIGlkPSJ2aWRlby1wbGF5LXN0YXRlLXQiPgogPHRpdGxlPnZpZGVvIHBsYXkgc3RhdGU8L3RpdGxlPgogPHBhcmE+VGhlIGZvbGxvd2luZyB2YWx1ZXMgY2FuIGJlIHJldHVybmVkIGJ5IHRoZSBWSURFT19HRVRfU1RBVFVTIGNhbGwgcmVwcmVzZW50aW5nIHRoZQogc3RhdGUgb2YgdmlkZW8gcGxheWJhY2suCiA8L3BhcmE+CiA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBlbnVtIHsKLQkgVklERU9fU1RPUFBFRCwKLQkgVklERU9fUExBWUlORywKLQkgVklERU9fRlJFRVpFRAotIH0gdmlkZW9fcGxheV9zdGF0ZV90OwordHlwZWRlZiBlbnVtIHsKKwlWSURFT19TVE9QUEVELCAvJiN4MjJDNjsgVmlkZW8gaXMgc3RvcHBlZCAmI3gyMkM2Oy8KKwlWSURFT19QTEFZSU5HLCAvJiN4MjJDNjsgVmlkZW8gaXMgY3VycmVudGx5IHBsYXlpbmcgJiN4MjJDNjsvCisJVklERU9fRlJFRVpFRCAgLyYjeDIyQzY7IFZpZGVvIGlzIGZyZWV6ZWQgJiN4MjJDNjsvCit9IHZpZGVvX3BsYXlfc3RhdGVfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJ2aWRlb19ldmVudCI+Cis8c2VjdGlvbiBpZD0idmlkZW8tY29tbWFuZCI+Cis8cGFyYT5UaGUgc3RydWN0dXJlIG11c3QgYmUgemVyb2VkIGJlZm9yZSB1c2UgYnkgdGhlIGFwcGxpY2F0aW9uCitUaGlzIGVuc3VyZXMgaXQgY2FuIGJlIGV4dGVuZGVkIHNhZmVseSBpbiB0aGUgZnV0dXJlLjwvcGFyYT4KKzx0aXRsZT5zdHJ1Y3QgdmlkZW8tY29tbWFuZDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitzdHJ1Y3QgdmlkZW9fY29tbWFuZCB7CisJX191MzIgY21kOworCV9fdTMyIGZsYWdzOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTY0IHB0czsKKwkJfSBzdG9wOworCisJCXN0cnVjdCB7CisJCQkvJiN4MjJDNjsgMCBvciAxMDAwIHNwZWNpZmllcyBub3JtYWwgc3BlZWQsCisJCQkgICAxIHNwZWNpZmllcyBmb3J3YXJkIHNpbmdsZSBzdGVwcGluZywKKwkJCSAgIC0xIHNwZWNpZmllcyBiYWNrd2FyZCBzaW5nbGUgc3RlcHBpbmcsCisJCQkgICAmZ3Q7PjE6IHBsYXliYWNrIGF0IHNwZWVkLzEwMDAgb2YgdGhlIG5vcm1hbCBzcGVlZCwKKwkJCSAgICZsdDstMTogcmV2ZXJzZSBwbGF5YmFjayBhdCAoLXNwZWVkLzEwMDApIG9mIHRoZSBub3JtYWwgc3BlZWQuICYjeDIyQzY7LworCQkJX19zMzIgc3BlZWQ7CisJCQlfX3UzMiBmb3JtYXQ7CisJCX0gcGxheTsKKworCQlzdHJ1Y3QgeworCQkJX191MzIgZGF0YVsxNl07CisJCX0gcmF3OworCX07Cit9OworPC9wcm9ncmFtbGlzdGluZz4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24gaWQ9InZpZGVvLXNpemUtdCI+Cis8dGl0bGU+c3RydWN0IHZpZGVvX3NpemUtdDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHc7CisJaW50IGg7CisJdmlkZW9fZm9ybWF0X3QgYXNwZWN0X3JhdGlvOworfSB2aWRlb19zaXplX3Q7Cis8L3Byb2dyYW1saXN0aW5nPgorPC9zZWN0aW9uPgorCisKKzxzZWN0aW9uIGlkPSJ2aWRlby1ldmVudCI+CiA8dGl0bGU+c3RydWN0IHZpZGVvX2V2ZW50PC90aXRsZT4KIDxwYXJhPlRoZSBmb2xsb3dpbmcgaXMgdGhlIHN0cnVjdHVyZSBvZiBhIHZpZGVvIGV2ZW50IGFzIGl0IGlzIHJldHVybmVkIGJ5IHRoZSBWSURFT19HRVRfRVZFTlQKIGNhbGwuCiA8L3BhcmE+CiA8cHJvZ3JhbWxpc3Rpbmc+Ci0gc3RydWN0IHZpZGVvX2V2ZW50IHsKLQkgaW50MzJfdCB0eXBlOwotCSB0aW1lX3QgdGltZXN0YW1wOwotCSB1bmlvbiB7Ci0JCSB2aWRlb19mb3JtYXRfdCB2aWRlb19mb3JtYXQ7Ci0JIH0gdTsKLSB9Oworc3RydWN0IHZpZGVvX2V2ZW50IHsKKwlfX3MzMiB0eXBlOworI2RlZmluZSBWSURFT19FVkVOVF9TSVpFX0NIQU5HRUQJMQorI2RlZmluZSBWSURFT19FVkVOVF9GUkFNRV9SQVRFX0NIQU5HRUQJMgorI2RlZmluZSBWSURFT19FVkVOVF9ERUNPREVSX1NUT1BQRUQgCTMKKyNkZWZpbmUgVklERU9fRVZFTlRfVlNZTkMgCQk0CisJX19rZXJuZWxfdGltZV90IHRpbWVzdGFtcDsKKwl1bmlvbiB7CisJCXZpZGVvX3NpemVfdCBzaXplOworCQl1bnNpZ25lZCBpbnQgZnJhbWVfcmF0ZTsJLyYjeDIyQzY7IGluIGZyYW1lcyBwZXIgMTAwMHNlYyAmI3gyMkM2Oy8KKwkJdW5zaWduZWQgY2hhciB2c3luY19maWVsZDsJLyYjeDIyQzY7IHVua25vd24vb2RkL2V2ZW4vcHJvZ3Jlc3NpdmUgJiN4MjJDNjsvCisJfSB1OworfTsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJ2aWRlb19zdGF0dXMiPgorPHNlY3Rpb24gaWQ9InZpZGVvLXN0YXR1cyI+CiA8dGl0bGU+c3RydWN0IHZpZGVvX3N0YXR1czwvdGl0bGU+CiA8cGFyYT5UaGUgVklERU9fR0VUX1NUQVRVUyBjYWxsIHJldHVybnMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaW5mb3JtaW5nIGFib3V0IHZhcmlvdXMKIHN0YXRlcyBvZiB0aGUgcGxheWJhY2sgb3BlcmF0aW9uLgogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgotIHN0cnVjdCB2aWRlb19zdGF0dXMgewotCSBib29sZWFuIHZpZGVvX2JsYW5rOwotCSB2aWRlb19wbGF5X3N0YXRlX3QgcGxheV9zdGF0ZTsKLQkgdmlkZW9fc3RyZWFtX3NvdXJjZV90IHN0cmVhbV9zb3VyY2U7Ci0JIHZpZGVvX2Zvcm1hdF90IHZpZGVvX2Zvcm1hdDsKLQkgdmlkZW9fZGlzcGxheWZvcm1hdF90IGRpc3BsYXlfZm9ybWF0OwotIH07CitzdHJ1Y3QgdmlkZW9fc3RhdHVzIHsKKwlpbnQgICAgICAgICAgICAgICAgICAgdmlkZW9fYmxhbms7ICAgLyYjeDIyQzY7IGJsYW5rIHZpZGVvIG9uIGZyZWV6ZT8gJiN4MjJDNjsvCisJdmlkZW9fcGxheV9zdGF0ZV90ICAgIHBsYXlfc3RhdGU7ICAgIC8mI3gyMkM2OyBjdXJyZW50IHN0YXRlIG9mIHBsYXliYWNrICYjeDIyQzY7LworCXZpZGVvX3N0cmVhbV9zb3VyY2VfdCBzdHJlYW1fc291cmNlOyAvJiN4MjJDNjsgY3VycmVudCBzb3VyY2UgKGRlbXV4L21lbW9yeSkgJiN4MjJDNjsvCisJdmlkZW9fZm9ybWF0X3QgICAgICAgIHZpZGVvX2Zvcm1hdDsgIC8mI3gyMkM2OyBjdXJyZW50IGFzcGVjdCByYXRpbyBvZiBzdHJlYW0gJiN4MjJDNjsvCisJdmlkZW9fZGlzcGxheWZvcm1hdF90IGRpc3BsYXlfZm9ybWF0Oy8mI3gyMkM2OyBzZWxlY3RlZCBjcm9wcGluZyBtb2RlICYjeDIyQzY7LworfTsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8cGFyYT5JZiB2aWRlb19ibGFuayBpcyBzZXQgdmlkZW8gd2lsbCBiZSBibGFua2VkIG91dCBpZiB0aGUgY2hhbm5lbCBpcyBjaGFuZ2VkIG9yIGlmIHBsYXliYWNrIGlzCiBzdG9wcGVkLiBPdGhlcndpc2UsIHRoZSBsYXN0IHBpY3R1cmUgd2lsbCBiZSBkaXNwbGF5ZWQuIHBsYXlfc3RhdGUgaW5kaWNhdGVzIGlmIHRoZSB2aWRlbyBpcwpAQCAtMTI3LDE3ICsxNzksMTcgQEAKIDwvcGFyYT4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9InZpZGVvX3N0aWxsX3BpY3R1cmUiPgorPHNlY3Rpb24gaWQ9InZpZGVvLXN0aWxsLXBpY3R1cmUiPgogPHRpdGxlPnN0cnVjdCB2aWRlb19zdGlsbF9waWN0dXJlPC90aXRsZT4KIDxwYXJhPkFuIEktZnJhbWUgZGlzcGxheWVkIHZpYSB0aGUgVklERU9fU1RJTExQSUNUVVJFIGNhbGwgaXMgcGFzc2VkIG9uIHdpdGhpbiB0aGUKIGZvbGxvd2luZyBzdHJ1Y3R1cmUuCiA8L3BhcmE+CiA8cHJvZ3JhbWxpc3Rpbmc+Ci0gLyYjeDIyQzY7IHBvaW50ZXIgdG8gYW5kIHNpemUgb2YgYSBzaW5nbGUgaWZyYW1lIGluIG1lbW9yeSAmI3gyMkM2Oy8KLSBzdHJ1Y3QgdmlkZW9fc3RpbGxfcGljdHVyZSB7Ci0JIGNoYXIgJiN4MjJDNjtpRnJhbWU7Ci0JIGludDMyX3Qgc2l6ZTsKLSB9OworLyYjeDIyQzY7IHBvaW50ZXIgdG8gYW5kIHNpemUgb2YgYSBzaW5nbGUgaWZyYW1lIGluIG1lbW9yeSAmI3gyMkM2Oy8KK3N0cnVjdCB2aWRlb19zdGlsbF9waWN0dXJlIHsKKwljaGFyICYjeDIyQzY7aUZyYW1lOyAgICAgICAgLyYjeDIyQzY7IHBvaW50ZXIgdG8gYSBzaW5nbGUgaWZyYW1lIGluIG1lbW9yeSAmI3gyMkM2Oy8KKwlpbnQzMl90IHNpemU7Cit9OwogPC9wcm9ncmFtbGlzdGluZz4KIDwvc2VjdGlvbj4KIApAQCAtMTY0LDI2ICsyMTYsMjYgQEAKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJ2aWRlb19zeXN0ZW0iPgorPHNlY3Rpb24gaWQ9InZpZGVvLXN5c3RlbSI+CiA8dGl0bGU+dmlkZW8gc3lzdGVtPC90aXRsZT4KIDxwYXJhPkEgY2FsbCB0byBWSURFT19TRVRfU1lTVEVNIHNldHMgdGhlIGRlc2lyZWQgdmlkZW8gc3lzdGVtIGZvciBUViBvdXRwdXQuIFRoZQogZm9sbG93aW5nIHN5c3RlbSB0eXBlcyBjYW4gYmUgc2V0OgogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bSB7Ci0JICBWSURFT19TWVNURU1fUEFMLAotCSAgVklERU9fU1lTVEVNX05UU0MsCi0JICBWSURFT19TWVNURU1fUEFMTiwKLQkgIFZJREVPX1NZU1RFTV9QQUxOYywKLQkgIFZJREVPX1NZU1RFTV9QQUxNLAotCSAgVklERU9fU1lTVEVNX05UU0M2MCwKLQkgIFZJREVPX1NZU1RFTV9QQUw2MCwKLQkgIFZJREVPX1NZU1RFTV9QQUxNNjAKLSB9IHZpZGVvX3N5c3RlbV90OwordHlwZWRlZiBlbnVtIHsKKwkgVklERU9fU1lTVEVNX1BBTCwKKwkgVklERU9fU1lTVEVNX05UU0MsCisJIFZJREVPX1NZU1RFTV9QQUxOLAorCSBWSURFT19TWVNURU1fUEFMTmMsCisJIFZJREVPX1NZU1RFTV9QQUxNLAorCSBWSURFT19TWVNURU1fTlRTQzYwLAorCSBWSURFT19TWVNURU1fUEFMNjAsCisJIFZJREVPX1NZU1RFTV9QQUxNNjAKK30gdmlkZW9fc3lzdGVtX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0idmlkZW9faGlnaGxpZ2h0Ij4KKzxzZWN0aW9uIGlkPSJ2aWRlby1oaWdobGlnaHQiPgogPHRpdGxlPnN0cnVjdCB2aWRlb19oaWdobGlnaHQ8L3RpdGxlPgogPHBhcmE+Q2FsbGluZyB0aGUgaW9jdGwgVklERU9fU0VUX0hJR0hMSUdIVFMgcG9zdHMgdGhlIFNQVSBoaWdobGlnaHQgaW5mb3JtYXRpb24uIFRoZQogY2FsbCBleHBlY3RzIHRoZSBmb2xsb3dpbmcgZm9ybWF0IGZvciB0aGF0IGluZm9ybWF0aW9uOgpAQCAtMjEwLDcgKzI2Miw3IEBACiA8L3Byb2dyYW1saXN0aW5nPgogCiA8L3NlY3Rpb24+Ci08c2VjdGlvbiBpZD0idmlkZW9fc3B1Ij4KKzxzZWN0aW9uIGlkPSJ2aWRlby1zcHUiPgogPHRpdGxlPnZpZGVvIFNQVTwvdGl0bGU+CiA8cGFyYT5DYWxsaW5nIFZJREVPX1NFVF9TUFUgZGVhY3RpdmF0ZXMgb3IgYWN0aXZhdGVzIFNQVSBkZWNvZGluZywgYWNjb3JkaW5nIHRvIHRoZQogZm9sbG93aW5nIGZvcm1hdDoKQEAgLTIyNCw3ICsyNzYsNyBAQAogPC9wcm9ncmFtbGlzdGluZz4KIAogPC9zZWN0aW9uPgotPHNlY3Rpb24gaWQ9InZpZGVvX3NwdV9wYWxldHRlIj4KKzxzZWN0aW9uIGlkPSJ2aWRlby1zcHUtcGFsZXR0ZSI+CiA8dGl0bGU+dmlkZW8gU1BVIHBhbGV0dGU8L3RpdGxlPgogPHBhcmE+VGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzZXQgdGhlIFNQVSBwYWxldHRlIGJ5IGNhbGxpbmcgVklERU9fU1BVX1BBTEVUVEU6CiA8L3BhcmE+CkBAIC0yMzcsNyArMjg5LDcgQEAKIDwvcHJvZ3JhbWxpc3Rpbmc+CiAKIDwvc2VjdGlvbj4KLTxzZWN0aW9uIGlkPSJ2aWRlb19uYXZpX3BhY2siPgorPHNlY3Rpb24gaWQ9InZpZGVvLW5hdmktcGFjayI+CiA8dGl0bGU+dmlkZW8gTkFWSSBwYWNrPC90aXRsZT4KIDxwYXJhPkluIG9yZGVyIHRvIGdldCB0aGUgbmF2aWdhdGlvbmFsIGRhdGEgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaGFzIHRvIGJlIHBhc3NlZCB0byB0aGUgaW9jdGwKIFZJREVPX0dFVF9OQVZJOgpAQCAtMjUyLDcgKzMwNCw3IEBACiA8L3NlY3Rpb24+CiAKIAotPHNlY3Rpb24gaWQ9InZpZGVvX2F0dHJpYnV0ZXMiPgorPHNlY3Rpb24gaWQ9InZpZGVvLWF0dHJpYnV0ZXMtdCI+CiA8dGl0bGU+dmlkZW8gYXR0cmlidXRlczwvdGl0bGU+CiA8cGFyYT5UaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgY2FuIGJlIHNldCBieSBhIGNhbGwgdG8gVklERU9fU0VUX0FUVFJJQlVURVM6CiA8L3BhcmE+CkBAIC0zNDcsOCArMzk5LDcgQEAKIDxwYXJhPihibG9ja2luZyBtb2RlIGlzIHRoZSBkZWZhdWx0KTwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKzxwYXJhPlJFVFVSTiBWQUxVRTwvcGFyYT4KIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgogPHBhcmE+RU5PREVWPC9wYXJhPgpAQCAtNDA2LDggKzQ1Nyw3IEBACiA8cGFyYT5GaWxlIGRlc2NyaXB0b3IgcmV0dXJuZWQgYnkgYSBwcmV2aW91cyBjYWxsIHRvIG9wZW4oKS48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Cis8cGFyYT5SRVRVUk4gVkFMVUU8L3BhcmE+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVCQURGPC9wYXJhPgpAQCAtNDYyLDggKzUxMiw3IEBACiA8cGFyYT5TaXplIG9mIGJ1Zi48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Cis8cGFyYT5SRVRVUk4gVkFMVUU8L3BhcmE+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVQRVJNPC9wYXJhPgpAQCAtNDg4LDcgKzUzNyw3IEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fU1RPUCIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19TVE9QPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC01NDMsMjYgKzU5Miw5IEBACiA8cGFyYT5GQUxTRTogU2hvdyBsYXN0IGRlY29kZWQgZnJhbWUuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvciwgcG9zc2libHkgaW4gdGhlIGNvbW11bmljYXRpb24gd2l0aCB0aGUKLSBEVkIgc3Vic3lzdGVtLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IlZJREVPX1BMQVkiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fUExBWTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtNTk2LDI2ICs2MjgsOSBAQAogPHBhcmE+RXF1YWxzIFZJREVPX1BMQVkgZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLCBwb3NzaWJseSBpbiB0aGUgY29tbXVuaWNhdGlvbiB3aXRoIHRoZQotIERWQiBzdWJzeXN0ZW0uPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fRlJFRVpFIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX0ZSRUVaRTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtNjUzLDI2ICs2NjgsOSBAQAogPHBhcmE+RXF1YWxzIFZJREVPX0ZSRUVaRSBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IsIHBvc3NpYmx5IGluIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggdGhlCi0gRFZCIHN1YnN5c3RlbS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19DT05USU5VRSIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19DT05USU5VRTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtNzA2LDI2ICs3MDQsOSBAQAogPHBhcmE+RXF1YWxzIFZJREVPX0NPTlRJTlVFIGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvciwgcG9zc2libHkgaW4gdGhlIGNvbW11bmljYXRpb24gd2l0aCB0aGUKLSBEVkIgc3Vic3lzdGVtLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IlZJREVPX1NFTEVDVF9TT1VSQ0UiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fU0VMRUNUX1NPVVJDRTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtNzY5LDI2ICs3NTAsOSBAQAogPHBhcmE+SW5kaWNhdGVzIHdoaWNoIHNvdXJjZSBzaGFsbCBiZSB1c2VkIGZvciB0aGUgVmlkZW8gc3RyZWFtLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IsIHBvc3NpYmx5IGluIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggdGhlCi0gRFZCIHN1YnN5c3RlbS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19TRVRfQkxBTksiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fU0VUX0JMQU5LPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC04MzUsMzMgKzc5OSw5IEBACiA8cGFyYT5GQUxTRTogU2hvdyBsYXN0IGRlY29kZWQgZnJhbWUuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvciwgcG9zc2libHkgaW4gdGhlIGNvbW11bmljYXRpb24gd2l0aCB0aGUKLSBEVkIgc3Vic3lzdGVtLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5WQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPklsbGVnYWwgaW5wdXQgcGFyYW1ldGVyPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fR0VUX1NUQVRVUyIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19HRVRfU1RBVFVTPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC05MDMsMzMgKzg0Myw5IEBACiA8cGFyYT5SZXR1cm5zIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgVmlkZW8gRGV2aWNlLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IsIHBvc3NpYmx5IGluIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggdGhlCi0gRFZCIHN1YnN5c3RlbS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5zdGF0dXMgcG9pbnRzIHRvIGludmFsaWQgYWRkcmVzczwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IlZJREVPX0dFVF9FVkVOVCIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19HRVRfRVZFTlQ8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTk4MCwyNCArODk2LDkgQEAKICBzdG9yZWQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FRkFVTFQ8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmV2IHBvaW50cyB0byBpbnZhbGlkIGFkZHJlc3M8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+RVdPVUxEQkxPQ0s8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTEwMDksMTYgKzkxMCwxMSBAQAogPHBhcmE+RU9WRVJGTE9XPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5PdmVyZmxvdyBpbiBldmVudCBxdWV1ZSAtIG9uZSBvciBtb3JlIGV2ZW50cyB3ZXJlIGxvc3QuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IlZJREVPX1NFVF9ESVNQTEFZX0ZPUk1BVCIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19TRVRfRElTUExBWV9GT1JNQVQ8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTEwNjMsMzIgKzk1OSw5IEBACiA8cGFyYT5TZWxlY3RzIHRoZSB2aWRlbyBmb3JtYXQgdG8gYmUgdXNlZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5WQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPklsbGVnYWwgcGFyYW1ldGVyIGZvcm1hdC48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19TVElMTFBJQ1RVUkUiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fU1RJTExQSUNUVVJFPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xMTMzLDMyICsxMDA2LDkgQEAKIDxwYXJhPlBvaW50ZXIgdG8gYSBsb2NhdGlvbiB3aGVyZSBhbiBJLWZyYW1lIGFuZCBzaXplIGlzIHN0b3JlZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FRkFVTFQ8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPnNwIHBvaW50cyB0byBhbiBpbnZhbGlkIGlmcmFtZS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19GQVNUX0ZPUldBUkQiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fRkFTVF9GT1JXQVJEPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xMjAwLDM5ICsxMDUwLDE3IEBACiA8cGFyYT5UaGUgbnVtYmVyIG9mIGZyYW1lcyB0byBza2lwLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+RVBFUk08L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPk1vZGUgVklERU9fU09VUkNFX01FTU9SWSBub3Qgc2VsZWN0ZWQuPC9wYXJhPgogPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SWxsZWdhbCBwYXJhbWV0ZXIgZm9ybWF0LjwvcGFyYT4KLTwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19TTE9XTU9USU9OIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX1NMT1dNT1RJT048L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTEyNzQsMzkgKzExMDIsMTcgQEAKIDxwYXJhPlRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IGVhY2ggZnJhbWUuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FUEVSTTwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgogPHBhcmE+TW9kZSBWSURFT19TT1VSQ0VfTUVNT1JZIG5vdCBzZWxlY3RlZC48L3BhcmE+CiA8L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbGxlZ2FsIHBhcmFtZXRlciBmb3JtYXQuPC9wYXJhPgotPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IlZJREVPX0dFVF9DQVBBQklMSVRJRVMiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fR0VUX0NBUEFCSUxJVElFUzwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTM1MCwyNSArMTE1Niw5IEBACiAgaW5mb3JtYXRpb24uPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5jYXAgcG9pbnRzIHRvIGFuIGludmFsaWQgaWZyYW1lLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IlZJREVPX1NFVF9JRCIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19TRVRfSUQ8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTE0MTAsMjQgKzEyMDAsOSBAQAogPHBhcmE+dmlkZW8gc3ViLXN0cmVhbSBpZDwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVJTlZBTDwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpAQCAtMTQzNSw3ICsxMjEwLDcgQEAKIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19DTEVBUl9CVUZGRVIiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fQ0xFQVJfQlVGRkVSPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xNDY4LDE4ICsxMjQzLDkgQEAKIDxwYXJhPkVxdWFscyBWSURFT19DTEVBUl9CVUZGRVIgZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IlZJREVPX1NFVF9TVFJFQU1UWVBFIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX1NFVF9TVFJFQU1UWVBFPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xNTIyLDI1ICsxMjg4LDkgQEAKIDxwYXJhPnN0cmVhbSB0eXBlPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT50eXBlIGlzIG5vdCBhIHZhbGlkIG9yIHN1cHBvcnRlZCBzdHJlYW0gdHlwZS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19TRVRfRk9STUFUIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX1NFVF9GT1JNQVQ8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTE1ODMsMTcgKzEzMzMsOSBAQAogPHBhcmE+dmlkZW8gZm9ybWF0IG9mIFRWIGFzIGRlZmluZWQgaW4gc2VjdGlvbiA/Py48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+CismcmV0dXJuLXZhbHVlLWR2YjsKIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVJTlZBTDwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpAQCAtMTYwMSw3ICsxMzQzLDcgQEAKIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19TRVRfU1lTVEVNIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX1NFVF9TWVNURU08L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTE2NDUsMTcgKzEzODcsOSBAQAogPHBhcmE+dmlkZW8gc3lzdGVtIG9mIFRWIG91dHB1dC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+CismcmV0dXJuLXZhbHVlLWR2YjsKIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVJTlZBTDwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpAQCAtMTY2Myw3ICsxMzk3LDcgQEAKIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19TRVRfSElHSExJR0hUIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX1NFVF9ISUdITElHSFQ8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTE3MDUsMjUgKzE0MzksOSBAQAogPHBhcmE+U1BVIEhpZ2hsaWdodCBpbmZvcm1hdGlvbiBhY2NvcmRpbmcgdG8gc2VjdGlvbiA/Py48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5pbnB1dCBpcyBub3QgYSB2YWxpZCBoaWdobGlnaHQgc2V0dGluZy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19TRVRfU1BVIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX1NFVF9TUFU8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTE3NjYsMTcgKzE0ODQsOSBAQAogIHRvIHNlY3Rpb24gPz8uPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTE3ODUsNyArMTQ5NSw3IEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fU0VUX1NQVV9QQUxFVFRFIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX1NFVF9TUFVfUEFMRVRURTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTgyNywxNyArMTUzNyw5IEBACiA8cGFyYT5TUFUgcGFsZXR0ZSBhY2NvcmRpbmcgdG8gc2VjdGlvbiA/Py48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+CismcmV0dXJuLXZhbHVlLWR2YjsKIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVJTlZBTDwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpAQCAtMTg0NSw3ICsxNTQ3LDcgQEAKIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19HRVRfTkFWSSIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19HRVRfTkFWSTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTg4OSwxNyArMTU5MSw5IEBACiAgPz8uPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FRkFVTFQ8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTE5MDcsNyArMTYwMSw3IEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fU0VUX0FUVFJJQlVURVMiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fU0VUX0FUVFJJQlVURVM8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTE5NTEsMTcgKzE2NDUsOSBAQAogPHBhcmE+dmlkZW8gYXR0cmlidXRlcyBhY2NvcmRpbmcgdG8gc2VjdGlvbiA/Py48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+CismcmV0dXJuLXZhbHVlLWR2YjsKIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVJTlZBTDwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2YnN0Yi5wbmcuYjY0IGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2YnN0Yi5wbmcuYjY0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YjUyZmQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZic3RiLnBuZy5iNjQKQEAgLTAsMCArMSwzOTggQEAKK2lWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUF6TUFBQUdhQ0FZQUFBQTdKeDI1QUFBQUJtSkxSMFFBQUFBQUFBRDVRN3QvQUFBQUNYQkkKK1dYTUFBQTNYQUFBTmlRRm1FT3VpQUFBZ0FFbEVRVlI0MnV6ZGQxUlUxOEkyOEdkZ0tGWlVCRTBzYUZBMEtvcUZGa0VoS2hiQVFteEoKK2JJa05ORXBNRVV3c01aYXJKTVpydzRLeFJFeFFjelVxaWwwalJCQTFHQWpHUXFMWUM0VGVtZG5mSDc2Y2ozSG9kWURudHhhTG1UbGwKK3p1dzU3Wm16OXo0eUlZUUFrWVp6Y25KQ1Nrb0tHalpzeU1JZ0lpSWlxdVBTMDlQUm9FRUR5QmhtcUNhUXlXUm8wNllOM252dlBSWUcKK0VSRVJVUjEzN05neC9Qbm5uNUN6S0tnbU1EQXd3S3BWcXhobWlJaUlpQWoyOXZaNC8vMzNvY1dpSUNJaUlpS2ltb2hoaG9pSWlJaUkKK0dHYUlpSWlJaUlnWVpvaUlpSWlJaUJobWlJaUlpSWlJWVlhSWlJaUlpSWhoaG9pSWlJaUlpR0dHaUlpSWlJZ1lab2lJaUlpSWlCaG0KK2lJaUlpSWlJR0dhSWlJaUlpSWdZWm9pSWlJaUlpR0dHaUlpSWlJaUlZWWFJaUlpSWlJaGhob2lJaUlpSUdHYUlpSWlJaUlnWVpvaUkKK2lJaUlpQmhtaUlpSWlJaUlZWWFJaUlpSWlJaGhob2lJaUlpSXFGTElXUVJFbFNNc0xBeTJ0clpvMUtnUjVISnVhbFR4RWhJUzhQMzMKKzMrUEREeitzTTUrNWJkdTJlUERnQVpvMmJjb1ZnQ3BsbTNKMGRNUzVjK2ZxekdmKyt1dXZzV1RKRW01VFZDbFNVMU9SazVPREJ3OGUKK29IWHIxZ3d6UkRWSmJtNHVBR0RSb2tVd01EQmdnVkNGbXpsekpyS3lzdXJVWjM3MjdCa3NMQ3pnNGVIQkZZQXEzSUlGQzVDUWtGQ24KK1BuTkdSZ1lBWU5XcVZWd0JxTUpGUlVWaDQ4YU5VQ3FWbGZZZURETkVsV3pHakJrTU0xUXBObTdjV09jK2M4dVdMVEZqeGd6TW1ER0QKK0t3QlZ1THQzN3lJa0pLVE9mVzVuWjJkdVUxU3BZYVl5c2MwTUVSRVJFUkhWU0F3elJFUkVSRVRFTUVORVJFUkVSTVF3UTBSRVJFUkUKK3hEQkRSRVJFUkVRTU0wUkVSRVJFUkF3elJFUkVSRVJFRERORVJFUkVSTVF3UTBSRVJFUkV4REJEUkVSRVJFVEVNRU5FUkVSRVJNUXcKK1EwUkVSRVJFRERORVJFUkVSRVFNTTBSRVJFUkVSQXd6UkVSRVJFVEVNRU5FUkVSRVJNUXdRMFJFUkVSRXhEQkRSRVJFUkVRTU0wUkUKK1JFUkVSQXd6UkVSRVJFUkVERE5FUkVSRVJFUU1NMFJFUkVSRXhEQkRSRVJFUkVURU1FTkVSRVJFUk1Rd1EwUkVSRVJFRERORVJFUkUKK1JFUU1NMFJFUkVSRVJBd3pSRVJFUkVURU1FTkVSRVJFUk1Rd1EwUkVSRVJFVkdua0xBS2ltdW5CZ3dkSVNrb3E4L1NHaG9aNDdiWFgKK1dKQ1Y2Tm16WndnTURNUzVjK2V3ZCs5ZUZnaVZTVlpXRmtKQ1FuRDE2bFU4ZXZRSUNvVUNob2FHNk5DaEEyeHNiTkN4WTBmSVpESTgKK2VmSUVwMDZkd3VUSmswczg3NkNnSUppWW1LQkxseTRzYUtxMlk1V3VyaTZhTm0wS1EwTkRhR254ZDNaaW1DR3FFLzc4ODA4RUJnYmkKK3A1OStRa0pDZ3Nvd0xTMHR5R1F5NmJsU3FZUVFRbVdjanovK0dHdlhybVZCVm9LdFc3ZGkrL2J0dUhidEdvUVFNRFEwWktGUXFmMzcKKzc3L3c4ZkhCdG0zYmtKQ1FnQ1pObXNEUzBoTEd4c1o0OE9BQnRtL2ZqaWRQbnNEVTFCUjJkbllJQ3d0RHo1NDlTeHhtbEVvbDVzNmQKK0N4c2JHK3paczRjRlRwVjJyRHB4NGdRT0hEaUFKMCtlcUF6VDA5T0RVcWxFVGs0T0FFQmZYeC9kdW5XRHZiMDkzTnpjMExkdlg1VmoKK0dWRkJHSCtKYXFpaFE0ZGkwNlpOT0hyMHFNcnJseTVkZ2tLaFFHNXVydlNuVkNxUmxaV0YyN2R2WThtU0pRQ0E3T3hzRm1JbG1URmoKK0JzNmVQY3RmdTZuTVRwNDhpVGZmZkJPclY2K0ducDRlOXV6WmcrZlBuK1BVcVZQdzkvZkhrU05IOFBEaFF4dzllaFJDQ096ZXZSdTMKK2J0MUNXbHBhcWQ0akppWUcrL2J0dytQSGoxbm9WR25IcW5YcjF1SGN1WE1xcisvZnZ4OFpHUm5JenM1R1Nrb0tJaUlpOE0wMzMwQkgKK1J3ZHIxNjZGdmIwOWV2WHFoZE9uVDdNUWlXR0dxRGF6c3JKU2VWNVkxVEZkWFYxMDdOZ1JYMzMxRlNaUG5pejlFbGJUbkRwMVN1T1gKK1VTYVRvWEhqeHVqZXZUdFhVQ3ExSDMvOEVjT0dEY1B6NTgvUnRXdFhSRVJFWU1LRUNkRFIwVkU5Z0d0cHdjWEZCZGV1WFlPTmpRMEEKK0lEMDl2Y1R2czJIREJnQkFUazRPZkgxOVdmQlVxVHAxNmdTNS9QOVhDREkzTjVldXVqUnMyQkFXRmhiNDZLT1A4TnR2ditISWtTTm8KKzNydzVybCsvRGljbkozejY2YWRRS3BVc1JHS1lJYXFOZEhSMFNsM0hlTnk0Y1RYeXlzeUJBd2RxMUVrWDYzNVRhVjI5ZWhWVHBreUIKK1VxbEV3NFlOY2ZUb1ViUnMyYkxJYVpvMGFZSWpSNDdBeU1pb3hGZG03dHk1ZzZDZ0lHaHJhd01BdG16WmdveU1ESDRCVkdsa01obDAKK2RYVkxOSjZycXl2Q3dzTFFxbFVyQU1CMzMzMkhqei8rbUlWSURETkV0ZmtnVVJxT2pvNVl1blJwamZxTWQrN2N3ZlRwMC9sbFU2MmwKK1ZDb3hZOFlNNmFycC9QbnowYjU5K3hKTmEyUmtCQzh2cnhKZm1mSDE5WVdWbFJVbVRKZ0FBSWlQajJjbkZhUlJ4eXBUVTFNY09uUkkKK0N0d2JObXpBNGNPSFdZakVNRU5VbCtYbTVpSWhJUUg2K3Zvd01URXBjSno4SFFVSUlkUTZEaWpvQkt5MENwcG5VZk41OXV3Wm5KMmQKK1M5VjdteENpVk10VzJtV3FpUGNreXUvRWlST0lpSWdBQUdocmE4UGQzYjFVMDArYU5BbFpXVm5GanBlYW1vcWRPM2RpOXV6Wm1EMTcKK3R2VDZmLy83MzJLM2Q2S3FaR2xwaVJrelpralB2Ynk4aXQzSGxtWS9YTmgrdjZqdG9DVEhSVTFSbG1OU2FjOEJHR2FJcUVwZHVYSUYKK0N4WXNVSHM5TVRFUmZuNStzTGEyeHJWcjE1Q1Nrb0pKa3laQlgxOGZiZHEwUVdSa3BNck9MVEF3RU1PSEQ0ZXBxU25hdDIrUHhvMGIKK28zLy8vdkR6OHl1MExVNXViaTdPbno4UER3OFBtSnViUys4N2QrNWNHQm9hUWk2WHc4TENRcTJ4NStYTGwyRnJhNHM3ZCs0QUFFSkQKK1ErSGk0Z0lYRnhmTW56OWZaZHpzN0d6NCt2ckMydG9hK3ZyNjBOSFJRZGV1WGVIajQxUGdTVjVabCtsVng0NGR3OENCQS9IYWE2K2gKK1E0Y082Tm16Snc0Y09GQm4xN09nb0NDMVhvdW9lRC8rK0tQMDJOYldGa1pHUnFXYTNzaklDRHQzN2l4MlBIOS9mOGpsY293ZE94YVcKK2xwYXd0cllHQUVSSFIrUHMyYlA4SWpSUWFHZ29vcUtpNm1UWW5ETm5qdlQ0MXExYnVIVHBrdG80cGRuM0N5Rnc3ZG8xZUh0N28xMjcKK2RraE1USVFRQXY3Ky9yQ3dzSUJjTGtmVHBrM3g4Y2NmUzlXeGMzTnpzWG56WnZUdTNSdTZ1cnFvWDc4KzNuMzNYYldlUlBmdjM0L3gKKzQ4ZEx4NmpGaXhkTHc1S1NrakIzN2x3TUh6NWNHcDYvaGtSc2JDem16NTh2RGN2NysrS0xMNUNibTR2RGh3OWo3Tml4MHV0ejU4N0YKK3MyZlB5bFVXWlRrSDBOVFVScVR4REF3TXhONjllMnZVTWdjSEJ3c0FJakV4c2RMZlMxdGJXd0FRQU1UZHUzY0xIVy9od29WaTVzeVoKKzB2TXJWNjZJRVNOR0NGMWRYV242MzM3N1RmVHYzMS9vNit0THJ5MVlzRUFJSVVSNmVyb1lQWHEwME5QVEU3dDM3eFk1T1RsQ0NDRnUKKzM3NHQrdmJ0S3dDSUhqMTZpTmpZV0pYM1BYWHFsSEJ5Y3BMbTE2SkZDeEVkSFMwNmR1d29IQjBkaFl1TGk2aGZ2NzRBSUhSMGRNUWYKK2Yvd2hUZnZYWDMrSjA2ZFBDMk5qWXdGQTJOcmFpdE9uVDR2VHAwK0w4UEJ3YWJ5blQ1K0tQbjM2aU9uVHA0dkl5RWp4Nk5FamNlalEKK0lkR2lSUXNCUVBUdDIxZWtwYVZWeURMbFVTZ1VZdmJzMlVJdWw0c3RXN2FJN094c0lZUVEwZEhSd3NMQ1FqUnExRWdBRUlhR2hwWHkKK3ZadWJtd3RmWDErTlcvZnp5clJkdTNaaTVzeVpJaUFnUUR4NThxUkM1dDIyYlZ1Ti9Nd1ZvVldyVmxMWmVYcDZWc3A3S0pWSzBiVnIKK1YrSGw1U1c5NXUvdkw3MnZzN056blQ3V2VIdDdDenM3TzQxYnJtblRwZ2tBd3NEQVFJd1lNVUtzWDc5ZVJFWkdDcVZTV1NHZnVhcSsKKzl3WU5Ha2pyMmw5Ly9WWGk2ZHEzYnk5TnQzanhZcFZocGRuM1g3cDBTWXdlUFZySTVYS1Y1Umc4ZUxDd3NySVM3dTd1NHUyMzM1YUcKK2ZmNzU1K0xKa3lmaXJiZmVFbzZPam1MV3JGbGkxS2hSUWt0TFN3QVFycTZ1YXN0Njc5NDlhZjZEQnc5V0d4NGRIUzBkczE4dGQ2VlMKK0taWXRXeWE5ZisvZXZWV0dyMXk1VXVqcTZvcUFnSUFDdi92U0hnZExldzVRRnBHUmtRS0EybmxCUlFnTURCUUdCZ2FDWVlZWVptcFoKK21EbDQ4S0FJRFEyVi9pNWR1aVRPbmowcnZ2NzZhNkdycTZzU1p0TFMwa1IyZHJaMG9BUWduSnljeEtGRGgwUnFhcXFZT0hHaWFOS2sKK2lUaDkrclJRS3BWaTdOaXhBa0NCSjVNcEtTbWljK2ZPQW9EbzFLbVRTRWxKVVJ0bjZOQ2hBb0RRMTljWGxwYVdJaUlpUWhyMnh4OS8KK1NKOWp5cFFwYXRPYW1KZ0lBR0xFaUJGcXc3S3pzMFdmUG4zRXFGR2oxSGJ3Ky9mdmx6NmJ0N2QzaFM3VG9rV0xCQUN4WnMwYXRXR1AKK0h6K1dEdHgxTGN3MGE5Wk1Lbk1kSFIzcHdGNFI0YWEyaHBuazVHU3B6QXBicHlyQzJiTm5oVXdtVS9uUkl6TXpVL3F4QUlDNGVmTW0KK3c0eUc4ZkR3a0U2Z3RiUzBoSjZlWG9XRm01b1Faa2FPSENsTk4zcjA2SEx2K3hjc1dDQU5zN0d4VWZsaFRLbFVTdS9Yb0VFRFlXbHAKK0tTNWN1S0F5L2VyVnE2WHBZMkppMUpiWDFOUzAwRENULzNoV1VMa3JsVW94Wk1nUTZidk9LNmYwOUhUUnNXTkg4ZDEzM3hVNHo3S1UKK1JXbk9BUmhtaUJobXFpek1GUGVYUDh6aytlR0hINlRoWDMzMVZZSHZjZXpZTVFGQU5HM2FWR1JsWlJVNHpwRWpSNlQ1ZlBIRkYyckQKK1Avcm9JMm40czJmUDFJYjM2OWRQQ2tPbENUTmJ0MjRWQU1TNWMrZlVobVZtWmtxL01EVnQybFM2bWxUZVpicHg0NGJRMXRZV2hvYUcKK2haYkg4T0hENjJTWU1USXlLblQ5SzIrNHFhMWg1cDkvL2xFcHA2MWJ0MWJLKzR3YU5hckFYNVB6Z2prQU1XdldMSVlaRFF3eithOG0KKzVQOHJiN2lwQ1dGbXhvd1owblNPam83bDN2ZHYzNzVkbWw5WVdKamF0UHYyN1pPR2I5cTBTVzM0elpzM3BlRzdkdTFTRzk2cFU2Y2kKK3cweGUyQ21zM08vZnZ5OWQyWGR5Y2hKS3BWSk1telpOT0RnNENJVkNVZUEwNVRrT2x1UWNRSlBEakp3MVVZbHFsNXMzYjZvMDdoZEMKK0lDMHREWmN1WGNLSEgzNVk0RFQ1NzE4eFpNaVFBc2ZKNnhMWnlzcXEwTzQxaHcwYkJtTmpZengvL2h4YnQyN0YwcVZMVmU0cmtOY3IKK0RRQVlHeHVyVFovWERXZDhmSHlwUHJPZm54OEFJRHc4SE5IUjBXckRtelZyaHNlUEh5TWhJUUUzYnR4UXVmOUxXWmRwM2JwMVVDZ1UKK0dEaHdZS0hsMGFoUkk2NlFyOGpmcHVyZXZYdllzV01IdnYvK2UrVG01cUpkdTNZWVBIZ3dIQjBkMGI5Ly8ySzdKSzdORkFwRmhjOHoKK05qWVdodzhmeHZIang5V0d6Wnc1RXl0WHJvUkNvY0N1WGJ1d2ZQbHlORzNhbEN0c0RaQjNVK1M4ZGhsSGp4N0ZpUk1ua0pXVkJRTUQKK0F6ZzRPR0RBZ0FGd2NIQkF0MjdkU3QzN3BTYkl2OHo1ajFkbDNmZm4zKzgzYU5DZzBQMSszanhlMWFKRkMrbnh3NGNQSy96enRtblQKK0J0OTg4dzNjM2QxeDZ0UXBUSm8wQ1ljUEgwWlVWRlNoWGY2WDV6aFlrbk1BVGNZd1ExVEw2T25wUVY5ZlgrVzFldlhxWWZqdzRWaXcKK1lJSFVrTDR3K1hmeStRK1dGeTVjQUFBMGI5Njh5R243OSsrUEF3Y09JRDQrSHRIUjBlalJvMGVKbHoxdkp5MUswY2cxT1RrWjE2NWQKK2c3YTJkcUdOenNlTUdhUDJIdVZaSmlHRTFFVm81ODZkcS9VazV2NzkrN2gyN1pwR3JZTzV1YmxsRGpmZmYvODl0bS9mRG9WQ0lZV2IKKzNyMTd3OVhWdFZhSG0xZURRMXhjWElXL3g1WXRXL0RHRzI5ZzBLQkJCWjY4dWJtNTRjQ0JBMGhQVDhmMjdkdngrZWVmMThsOWFGcGEKK21zWnRVeTlldkNoenVEbHk1QWlDZ29LUW5aMk54bzBidzlIUkVmMzY5WU85dlQzNjlPbFRJNzZUZi8vOVYzcjgrdXV2Vi9xK3Y2RGoKK29NckpjNzRmNlNyci9relRwMC9Idm4zN2NQNzhlZmo3KzJQanhvMkY5a0pha1dWUjNHZG5tQ0dxUTRRRzlqcno5dHR2NCs3ZHU2V2UKK0xqNCtYcm9aWDNFbnFwMDZkWkllUDN6NHNGUmhwaXp1M3IwcmRUKzVaczJhS3RrUnYzanhBaytmUGdWUXZWZGZzck96c1dyVktxeGEKK3RhcldiRGY1MTY5NzkrNWg2OWF0VWtpZk9uVnFwVnl4MEFSTm1qU1JybW9DUUV4TVRJWE9QeU1qQTM1K2ZsQW9GQ3EveUw2Nm5lZloKK3NHRUQ1czJicDNMU1ZsZmN1SEdqeHB6a2wvUllsTmNyVjNKeU1nNGZQaXo5R09QbzZDaUZBMDEyNjlZdDZYSHYzcjJyYmQ5ZmxiUzAKK3RPRG41d2R6YzNOa1pHVGcxS2xUbURWclZvRlgxbXA3V1RETUVGV0RGeTllWVBueTVScTNYRDE3OXNUR2pSdExQVjMrRThpOGsvakMKK0dCb2FTbytyWW9lYUY3S0VFTGgvLzM2SmJ6SllIdmwvTmMvTXpLeTI3MU5QVHcvZmZ2dHRvZFVIcTR1Wm1WbVpyeXpvNmVraEt5c0wKK2VucDZzTFMwaEpPVEUvcjM3dzhiR3h2bzZ1b2lNREN3MXU0MzdPenNjUERnUVFBdnUrS3RTQUVCQVVoTlRZV1BqMCtSdjhxdVdMRUMKK1Q1OCt4WU1IRDNEbzBDR1ZYM1ByaXA0OWV4WllGYTg2ZmZiWlovamhoeDlLZGRVemo0Nk9EcFJLSlpSS0pUcDA2SUNoUTRmQ3djRUIKK2ZmdjJoYkd4TVJZc1dJREV4RVNOUHA1R1JVVkp6MTFjWEtwdDMxL1YwdExTcE9QdmtTTkhzRy9mUG93ZlAxNGpqb01NTTBTMTJMbHoKKzV6Qmd3QUJNblRxMTFueW01czJiUTBkSEJ6azVPWWlPam9ZUW90QjYxL2x2MFBYR0cyOVUrckxWcjE5ZmVod1NFbElsTzNFOVBUM3AKKzhkOS8vMTF0MzR0TUprUDkrdlUxcm0xRGFlcms2K3ZySXpNelV5VzhPRG82RnRrMnE3WWFPM2FzRkdidTNMbURxS2dvNmY1SDVTR0UKK3dJWU5HekJtekJqTW5UdTN5SEhqNCtQeDFWZGZBWGg1RTgyNkdHYnk3ak9pU2ZMdmM0cWpxNnNMaFVJQnBWS0pqaDA3WXNpUUlYQncKK2NJQzl2WDJSMVlRMTFjNmRPNldhRGk0dUxtalhybDIxN2Z1clVsWldGaVpNbUlDbFM1ZGk0OGFOZVBUb0VlYk1tWU1CQXdhbzNZT3EKK3RwZEZjWGpUVEtJS29sUXFzWHo1Y2d3WU1BQUFNSHo0OEZwMWNNKzdzVjVjWEJ4dTNMaFI2TGg1OVhWYnRXcUZqaDA3VnZxeW1acWEKK1NpZlBmbjUrUlZidlMwMU54Y3laTTh2OW5xMWJ0NVlhVEY2NGNJRjNUUytGdlBaY2VucDZzTE96d3hkZmZJSGc0R0FrSnljak9EZ1kKK2l4WXRncDJkWFowTE1nRGc1dWFtY2hMeTNYZmZWY2g4TDE2OGlJaUlDRXlmUHIzWWNXZk9uQ210MjVjdVhVSjRlRGhYV2cybnE2c0wKK2JXMXR5R1F5bUptWndkM2RIUWNPSE1DTEZ5OXc2OVl0ckZ1M0RxTkdqYXFSUWVieDQ4ZFNOVnBkWFYyc1hyMjZXdmY5RmFVa3g0eUYKK0N4ZWljZVBHbUQ5L1BqWnYzaXdkZnowOVBUWGlPTWd3UTFUTHZIanhBb01HRGNLU0pVc0F2THhqY1VFOW9GVFdUakgvMVpES09ySCsKKzRJTVBwTWNCQVFHRmpwZDM4dVB1N2w3cVhuT0tXdmE4ZWVYVi9jN1RxRkVqS1dnRkJ3ZGp6NTQ5QlU2Zm01dUxLVk9td01uSnFkekwKK3BLZW5oLzc5K3dONFdWYzVLQ2lveUducld0akpxL0x3YW5peHQ3ZG5lQ21Dam80T05tM2FKRDNmdFdzWFRwOCtYZUxwRXhNVDRlcnEKK3FuWlg4TldyVjhQTXpBejI5dmJGenFObHk1WVlQWHEwOUh6dDJyWGN3V3NBcFZJcFZUY3FhWGpKWCtXM0pwM0U1MGxJU01ESWtTT1IKK2tKQUFBTmkwYVJPNmRPbFNaZnYrOHNpcllwMmVubDVnR2FTa3BCUTUvYSsvL29xTkd6ZkN6ODhQV2xwYWNIVjF4YnZ2dmdzQStPbW4KK24zRDA2TkVxUFE0eXpCRFZjdWZQbjBmWHJsMXg4ZUpGS0pWS2FHbHA0YlBQUHF1eTkwOVBUMWM1UUpTbFo1WDhZYWl3T3RtVEprMkMKK3BhVWxBR0R6NXMwRjFyRytmZnMyZ29PRFlXWm1obm56NXFrTkw2N3hkbDdQVmdVZDhQS3FmZHkrZlZzYW5wMmRqY2VQSDZ2OFVqVnQKKzJqU3NYNzllNnMwSGVGbGx4OFhGQmRuWjJYQnpjNnVRWmNyLytUdzhQTlM2NTB4TVRFUklTQWlBbDQxdVUxTlQ2OHcya1hjQWZ6VzgKK1hMeDRrZUdsR0VPSERzV2FOV3VrNTI1dWJpVnFKeFFhR2dwTFMwdjA2OWRQcGR2WUsxZXVJQ2dvQ0dQR2pDbnhqd3Z2dmZlZTlQakEKK2dRUFZXcFdTL3Y4SnNCQ2l4b1dYVi9lMStkc1lGaFpzaEJBNGRlb1UrdlRwZ3l0WHJrQlhWeGZidG0zRHRHblQxTVl0Njc0Ly96R3YKK0xNZkU0bjVBekx2Q2V2bnlaZHkrZlZ1bERGYXNXQ0h0SXd1NkRVRnljakltVDU2TUJRc1c0TTAzMzVSZVg3ZHVuZlFkdTd1N3F4MkQKK3kzTWNMTWs1QU1NTVVTMmtWQ3J4OWRkZlkrREFnWWlQajBkdWJpN2tjam5HangrUHRtM2JWdGx5bkR4NVV1VjVZVmNKaXBLL3UrYmYKK2YvKzl3SEhrY2prT0hUcUVUcDA2SVQ0K0hoTW1URkQ1QlQ0aElRRVRKMDVFbXpadEVCZ1lXR0RmL2ZsUGl2SjZiY3AvUVBqenp6OEIKK3ZPeE9ORGs1V1dXNHJhMnROSS81OCtmajRNR0RlT2VkZC9EdnYvOWkzTGh4R0RkdW5CUStQRDA5MGJ4NWMvVG8wUU9tcHFZd016TkQKK1VsSVMvUDM5MVU3b3lycE13NFlOZzRlSEJ3RGcvdjM3Nk5XckYxYXNXSUhBd0VCczI3WU5qbzZPTURBd2tBNE8zYnQzcjNXWDlndHoKKzdkbzFaR1ZsTWJ5VTBTZWZmSUo5Ky9haFdiTm1TRTFOaGF1cks5emMzSER5NUVtVlgzcFRVMU1SRkJTRWQ5NTVCeTR1TGxpMmJKbEsKK2Q4cVptWm1ZTld1V3RQMldWRjZiaEx5VHIzbno1aFY3OGtlVmE5NjhlWWlMaTZ0UjRlVlY1OCtmVjFtUDl1M2JoNWlZR1B6OTk5LzQKKy9mZmZjZmp3WVN4YXRBZzlldlRBNE1HRGNlL2VQYmk1dWVINjlldUZWcEVzNjc0L2YyK0JCUVdLMk5oWTZYRkIxYW9mUEhnZ1BYNzgKKytMSGE4THlhRE5uWjJiQ3pzNE9YbHhlOHZiMWhibTRPSVFRY0hCd0FBR0ZoWVhqLy9mZHg3Tmd4NmJ4aTJyUnBVQ3FWOFBMeVVwbW4KK2taR1JWUHZqOGVQSG1ESmxpa3J3S005eHNDVG5BSnFlOW9rMG5vR0JnZGk3ZDYvR0xNK1RKMCtFZzRPRDJoMlpaVEtaaUl5TUZFSUkKK0VSd2NMQUNJeE1URVNsa0dQejgvTVdqUW9BTHZDbTFuWnljKy9mVFRZdWR4NXN3WjRlcnFLclMwdEtScDlmVDB4S1JKazhUMjdkc0wKK25DWXBLVW5NbXpkUE5HclVTTHorK3V0aXhvd1o0c01QUHhRbUppYkMzZDFkeE1YRnFVMFRHaG9xeG84ZnI3S01YYnAwRVY5KythVVEKK1FvaVRKMDhLSnljbmxlRTllL1lVMjdadGsrWVJHeHNyV3JkdUxRMS8vZlhYeGZuejU2WGhPVGs1WXNtU0pkSmRrL1ArREF3TXhNS0YKK0MwVkdSa2FGTDVOQ29SRGZmUE9OYU5xMHFjcDRKaVltNHR5NWMrTDk5OThYaG9hR3dzUERRd1FIQnhkNjUrYXlNamMzRjc2K3ZuVnEKK1g5QzJiZHM2ODVuajR1TEVraVZMUk51MmJWWDJNWWFHaHFKWnMyWUNnR2pUcG8xWXRHaVIybmEzZi85KzBibHpaMms2dVZ3dVJvMGEKK0pZNGZQMTdvKy8zMTExOWk4dVRKb2wyN2RtcjdsTjY5ZTR0ZmZ2bWwxcGU1dDdlM3NMT3pxMVBibExlM2Q2RjNvcStvWTVXVGs1UFEKKzFkVlZXNi95L3pWdTNGaDA2ZEpGakIwN1ZtemF0RWs4ZlBpd1JQTXZ6YjcvMTE5L0ZiTm16Uko2ZW5vcSsydHZiMjhSR3hzci92NzcKK2J6RnYzanpSdkhsemFiaXVycTd3OFBBUUZ5NWNFQmtaR2VMenp6OFg3ZHUzVjltMjNOM2RSV0Jnb1BRK1NxVlNMRjI2Vk9YNDNLeFoKK00rbjQ0ZXpzTE5xM2J5Kzh2YjFGYUdpb3lNM05GY0hCd2VMdHQ5OFdBSVNSa1pIdzhmRlIrWnpuenAwVERnNE9LcC9SMXRaV1pac3UKKzdYR3dMT2NBcFJVWkdTa0FpTmpZMkFwZnR3SURBNFdCZ1lHUUNiWmNwUnFnU1pNbThQWDFWYW4rVUoyL0xvMFpNd1lwS1NrcTdUZmsKK2Nqa2NIUjF4NnRRcEFDOTdGTEczdDBkaVlxTDBDMzF0a3BXVmhULysrQU54Y1hGbzJyUXBldlRvb2RLalNtVklTMHREV0ZpWTFQTlYKK1FUMzhaR1JrNFByMTYwaElTSUNSa1JHNmQrOWVxcDZBeWxvVzE2OWZSMXhjSEl5TmpkR3paMC9JNVhMRXhNVEF4TVJFNWU3S0ZhbDcKKzkrN3c4UENRcmhEVkJTWW1KdkQyOXE1VG4xa0lnZHUzYitQUFAvOUVYRndjbEVvbGpJMk4wYlZyVjNUcTFLbEczdEZkVXkxWXNBQWgKK0lTRUlEZzZ1VTU4NUtpcXF4bmQ3WGgzNy91SzhlUEVDMTY5ZlI3MTY5ZENuVHgrcERlRS8vL3lEZHUzYWxmb216ald4TEtLaW90QzkKK2UzZkV4c1pXZUsyVlk4ZU80ZjMzMzJmWHpFUWxwVkFvc0d6Wk1peGJ0a3k2SFB6cThDKysrS0xPbEllZW5oNnNyS3lxOUQwYk5HZ2cKKzlSWlhtSHIxNmtsVjBxcXlMUElhWCtiWG9VTUhiamhVYmpLWkRKMDZkVks1SVMwUlZmKyt2emhHUmtZWU5HaVEydXVWZmRzQ1RTeUwKK3lzUXdRMVFDVDU4K3haZ3hZeEFXRmxaZzNYRXRMUzFZV0ZoSTlXQ0ppSWlJcVBLeEF3Q2lZcHc1Y3diZHVuVkRlSGg0a2IxOExGeTQKK2tJVkZSRVJFeERCRFZQMFVDZ1VXTDE0TUp5Y25KQ1FrcU4zZkpJOU1Kb09KaVFsR2pCakJRaU1pSWlLcVFxeG1SbFNBUjQ4ZVlmejQKKzhRZ0xDNVA2OXkrTXRyWTJ2dmppaTBwcnlFZEVSRVJFRERORUpYTHExQ2tNSGp3WXVycTZKYnA1bElHQkFTWk5tc1NDSXlJaUlxcGkKKy9DbVpLQjhoQlBidjN3OEFoVllyeTA5WFZ4ZGVYbDY4SVNBUkVSRVJ3d3hSOVpMSlpOaStmVHZXcjE4UExTMnRZcXVPNmVqb1lNYU0KK0dTdzRJaUlpSW9ZWklzMHdaODRjbkRsekJvMGFOU3IwaG9lNnVycjQ2S09QYXVVTk1ZbUlpSWdZWm9ocU1FZEhSNFNHaGtKYlc3dkEKK08yd3JsVXA0ZW5xeW9JaUlpSWdZWm9nMHo2cFZxOUNzV1RPNHVMaEFXMXRiZWwxWFZ4ZVRKMC9HYTYrOXhrSWlJaUlpWXBnaDBpenIKKzFxMURRRUFBL3ZlLy8rSHc0Y05Zdm53NXRMUzBJSlBKa0oyZERTOHZMeFlTRVJFUkVjTU1rV2E1Y09FQ1B2dnNNL2o2K3NMR3hnWXkKK21RemUzdDRJREF5RUVBSTJOamJvMkxFakM0cUlpSWlvR3ZFK00wU3Z1SC8vUHNhT0hZdHAwNlpoNnRTcEtzT0dEaDJLVzdkdUlTc3IKK2l3VkZSRVJFeERCRHBEblMwOVBoNXVZR016TXpyRnUzcnNCeHpNek1XRkJFUkVSRURETkVtc1hEd3dOUG56N0YxYXRYZVNOTUlpSWkKK0lvWVpvcG9ocjhIL3I3LytpcFl0VzdKQWlJaUlpQmhtaURSZlhvUC9MVnUyd01iR2hnVkNSRVJFVkFPd056T3E4NHBxOEU5RVJFUkUKK0RETkVHcWtrRGY2SmlJaUlTRE94bWhuVmFXendUMFJFUkZRTHdzejMzMytQNzcvL0hnMGFOR0NwVUlWVEtCVEl5Y25CLy83M1B4Z2IKK0cydkVNckhCUHhFUkVWRXRDVE14TVRFSURRMkZsNWNYUzRVcVhGUlVGTTZmUDQvTXpFeU5XQjQyK0NjaUlpS3FSV0VHQUp5ZG5iRnEKKzFTcVdDbFZLbURsKy9MaEdMQXNiL0JNUkVSSFZEdXdBZ09vVU52Z25JaUlpcWozWUFRRFZLV3p3VDBSRVJNUXdRMVRqc01FL0VSRVIKK0VjTU1VWTNEQnY5RVJFUkV0US9iekZDdHh3Yi9SRVJFUkF3elJEVU9HL3dURVJFUjFWNnNaa2ExR2h2OEV4RVJFVEhNRU5VNGJQQlAKK1JFUkV4REJEVk9Pd3dUOFJFUkZSN2NjMk0xVHJzTUUvRVJFUkVjTU1VWTNEQnY5RVJFUkVkUWVybVZHdHdnYi9SRVJFUkF3elJEV08KK3BqYjRYNzE2TlF3TURQZ0ZVWVdMaW9xcWM1LzU0Y09IV0wxNk5aS1RrN2tDVUtYc3I4M056ZXZjNXo1MjdCaFdyMTdORmFBWXljbkoKK3VILy9QdHExYTRlR0RSdXlRRFRrT01Vd1E3V0NKamI0Yjlpd0lVeE1USERpeEFsb2FiRkdKMVc4Tm0zYXdNaklxRTU5WmtkSFI5eS8KK2Z4OEhEaHpnQ2tBVnJsMjdkdWpaczJlZCtzeXRXclZDbXpadHVFMjlRcWxVSWkwdFRlVXZKeWNITXBrTSt2cjY2TktsQ3d1cEJMS3oKK3MyRnFhbHFwdFdVWVpxakcwOVFHL3hZV0ZyaDM3eDYvSUtJS2RPYk1HUllDVVFYNjZLT1A4TkZISDlYcE1sQW9GSWlPamtaNGVEZ3UKK1g3Nk15NWN2NDhhTkd4QkNvSFBuem5CeWNvS1ZsUlZzYkd3UUZSV0ZoUXNYNHVyVnExeDVOQVRERE5Wb2JQQlBSRVJFcGZIbzBTTXAKK3RGeStmQm5YcmhPSmxVUUFBQ0FBU1VSQlZGMURhbW9xV3Jac0NXdHJhNHdmUHg0Mk5qYm8wNmNQR2pkdXJETHRqUnMzV0lBTU0wUVYKK2h3MytpWWlJcURDcHFhbTRldlVxd3NQREVSWVdodkR3Y0R4NjlBajE2OWRINzk2OVlXVmxoZG16WjhQYTJocHQyN1psZ1RITUVGVWQKK1RXM3dUMFJFUkZXdnVPcGkxdGJXV0xod0lXeHNiTkN0V3pmSTVUd05acGdocWlhYTJPQ2ZpSWlJcWs1NXFvc1J3d3hSdGRIVUJ2OUUKK1JFUlVPVmhkakJobXFGWmdnMzhpSXFMYWpkWEZpR0dHYWkwMitDY2lJcXBkV0YyTUdHYW9Uamh4NGdUMjdkdkhCdjlFUkVRMUZLdUwKK0VjTU0xVW01dWJuNDhjY2ZzWFhyVmpiNEp5SWlxZ0ZZWFl3WVpvandzc0YvZW5vNjNuNzdiVGI0SnlJaTBsQ3NMa1lNTTBTdnlHdncKK3I2V2xoVW1USnJGQWlJaUlOQUNyaXhIRERGRUplSGg0NE5teloyalFvQUV2UHhNUkVWVURWaGNqaGhtaU1saTNiaDBDQWdMdzY2Ky8KK1lzaVFJU3dRSWlLaUtsQ1M2bUxXMXRhd3RMUmtkVEZpbUNFcXlJVUxGL0RaWjU5aHk1WXRiUEJQUkVSVVNWaGRqQmhtaUNyWS9mdjMKK01YYnNXRXliTm8wTi9vbUlpQ29JcTRzUncwd1ZDQW9LZ29tSkNicDA2Y0p2cHc3S2EvQnZabWFHZGV2V3NVQ0lpSWpLaU5YRmlHR20KK2lpbVZTc3lkT3hjMk5qYllzMmNQdjUwNktLL0IvNVVyVjZDcnE4c0NJU0lpS2dGV0Z5T0dHUTF3OHVSSnhNVEVJRFkyRnF0WHI4YnIKK3I3L09iNmdPeWQvZ3YyWExsaXdRSWlLaUFpZ1VDdHk0Y1VQbHFndXJpeEhEakFiWXNHRURBQ0FuSndlK3ZyNVl2bng1bGI3L3FWT24KKzRPVGt4TFdpR3JEQlB4RVJVY0ZZWFl5b0JvU1pPM2Z1SUNnb0NOcmEybEFvRk5peVpRdSsvUEpMMUt0WHIwcmUvOENCQTlpN2R5L0QKK1REVmdnMzhpSXFLWFdGMk1xSWFHR1Y5ZlgxaFpXZUhOTjkvRTd0MjdFUjhmajcxNzkyTGF0R2xWRXFTbVQ1OE9Cd2NIcmhGVmpBMysKK2lZaW9ybUoxTWMzMjlPbFRoSVNFWVBUbzBVV09GeE1UZzMvKytZYy9pTmZsTUpPYW1vcWRPM2RpL2ZyMVVwZ0JnUC8rOTcrWU9uVXEKK1pESlppZWNsaEZBYlg2bFVRa3RMcThEeG56MTdCbWRuWnlRbEpaVnFtWVVRRUVJVU90L3lMRk5GVGZ2cWZBQ1VxaXlyQWh2OEV4RlIKK1hjSHFZalhMelpzM01XN2NPTVRGeGFGcDA2YUZqcmRueng0Y1BYcVVZYWFhYUduQ1F2ajcrME11bDJQczJMR3d0TFNFdGJVMUFDQTYKK09ocG56NTR0ZHZyYzNGeWNQMzhlSGg0ZU1EYzNCd0FrSmlaaTd0eTVNRFEwaEZ3dWg0V0ZCVTZmUHEweTNlWExsMkZyYTRzN2QrNEEKK0FFSkRRK0hpNGdJWEZ4Zk1uejlmN1gyeXM3UGg2K3NMYTJ0cjZPdnJRMGRIQjEyN2RvV1Bqdyt5c3JJcVpKbktPMjErVjY5ZXhjU0oKK0UyRnZiNC9CZ3dlamJkdTI2TjI3TjNiczJDR0ZtK3FVMStEL3dJRURiUEJQUkVTMVNtcHFLaTVjdUFBZkh4KzR1Ym1oZGV2V2FOMjYKK05TWk9uSWpRMEZEMDZkTUhPM2JzUUd4c0xKNDhlWUpmZnZrRlgzenhCUVlNR01BZ295RnNiR3lncTZ1TGtKQ1FJc2U3Y09FQ0hCMGQKK1dXRFZSZndmYjI5djRlenNMS3FhVXFrVVhidDJGVjVlWHRKci92NytBb0FBVU93eW5UcDFTamc1T1VuanQyalJRa1JIUjR1T0hUc0sKK1IwZEg0ZUxpSXVyWHJ5OEFDQjBkSGZISEgzOUkwLzcxMTEvaTlPblR3dGpZV0FBUXRyYTI0dlRwMCtMMDZkTWlQRHhjNVgyZVBuMHEKKyt2VHBJNlpQbnk0aUl5UEZvMGVQeEtGRGgwU0xGaTBFQU5HM2IxK1JscFpXN21VcXo3VDViZHEwU2Noa011SHA2U2tVQ29VUVFvaTAKK3REUmhaMmNuQUlnVksxWlU2ZmNjR1JrcEFJalkyRmdoaEJEbno1OFhjcmxjYk4rK3ZVVFRHeGdZaUwxNzl3b2lJaUpOazV1Ykt5SWoKK0k0V2ZuNStZTm0yYU1EYzNGOXJhMmtKTFMwdDA2ZEpGZlBEQkIyTHo1czBpSWlKQzVPVGtzTUJxa0g3OStvbFBQdmxFZXI1MzcxN1IKK3RtMWI2WGw2ZXJyUTA5TVRSNDRjWVdGVnNjREFRR0ZnWUNDcVBjeWNQWHRXeUdReWNmZnVYZW0xek14TUtXQUFFRGR2M2l4MlBrT0gKK0RoVUFoTDYrdnJDMHRCUVJFUkhTc0QvKytFTm9hMnNMQUdMS2xDbHEwNXFZbUFnQVlzU0lFUVhPT3pzN1cvVHAwMGVNR2pWS0tKVksKK2xXSDc5KytYbHRQYjI3dkNscWs4MHo1NDhFQWFmdXJVS1pWaEFRRUJBb0JvMUtpUnlNcktxcFl3RXhzYks0eU1qSVM3dTN1SnAyZVkKK0lTSWlUZkh3NFVQeHYvLzlUOHlmUDEvMDc5OWZOR3pZVUFBUUxWdTJGQ05HakJBclZxd1FaODZjRVVsSlNTeXNHbTd4NHNXaVo4K2UKK2hZYVo4K2ZQQzIxdGJaR1FrTURDcXFZd1UrM1Z6RFp1M0FnWEZ4ZTBhOWRPZWsxUFR3OHpaODZVbnE5ZnY3N1krWmlhbWdJQU1qTXoKK0VSZ1lDQXNMQzJsWTkrN2QwYmR2WDZrcVdXbnQzTGtUVjY5ZXhadzVjOVRhbkF3ZlBoejYrdm9BZ0sxYnR5STNON2RDbHFrODA5NisKK2ZSc0toUUlBRUJjWHB6TE0yTmdZQUpDU2tvSzdkKzlXK2ZlZGtaSEJCdjlFUk1UcVlsUWpPRG82NG84Ly9rQkNRa0tCdzgrZlA0L3UKKzNidWpTWk1tTEt4cVVxMGRBTVRHeHVMdzRjTTRmdnk0MnJDWk0yZGk1Y3FWVUNnVTJMVnJGNVl2WDE1azR5dHRiVzIxRS9iOFdyVnEKK0JRQ0lqNDh2OVhMNitma0JBTUxEd3hFZEhhMDJ2Rm16Wm5qOCtERVNFaEp3NDhZTmRPL2V2ZHpMVko1cCsvWHJoMDgvL1JSWldWa1kKK09YS2t5ckQ4WWF5MG5SNVVoQysvL0pJTi9vbUlTQ094ZHpGNmxZMk5EWFIwZEJBU0VnSlhWMWUxNFd3dlU4ZkR6Sll0Vy9ER0cyOWcKKzBLQkJCWjZzdTdtNTRjQ0JBMGhQVDhmMjdkdngrZWVmbC9tOThuci9FcVZzK0o2Y25JeHIxNjVCVzFzYlQ1NDhLWENjTVdQR3FMMVAKK1pTNVRjZFBLNVhKOCsrMjNLcStscDZjaklDQUFPM2Jza0Y1VEtwVlYvcDBmT1hJRUZ5OWVaSU4vSWlLcWR1eGRqSXFqcjY4UGEydHIKK1hMaHdRUzNNWkdSazRQTGx5L2pzczg5WVVIVXh6R1JrWk1EUHp3OEtoVUs2a3ZHcS9GY2RObXpZZ0huejVsWDVyeUIzNzk2RkVBSksKK3BSSnIxcXhSdVdKU0U5eTdkdy9yMTYvSHJWdTNNSFhxVkN4WnNxUmF1dzVjc1dJRmJHeHN1T1VSRVZHVjRzMG9xYXdjSEJ4dzlPaFIKK3RkY3ZYNzZNM054YzJOdmJzNURxWXBnSkNBaEFhbW9xZkh4OGlyeWFzV0xGQ2p4OStoUVBIanpBb1VPSFZLNkNWSVcwdERRQUw2K0EKKzNMOS9IKzNidDY4UlgyeGFXaG9XTEZnQWYzOS8rUHI2WXMyYU5aREpaTGh3NFVLMUx0ZnQyN2R4Ly81OUhpaUlpS2pTc0xvWVZTUkgKK1IwY3NYNzRjaVltSktxK3p2VXdkRGpOQ0NHellzQUZqeG96QjNMbHppeHczUGo0ZVgzMzFGWUNYTjlHczZqQlR2MzU5NlhGSVNFaU4KK0NETkpTVWx3ZEhSRVJFUUVnb0tDTUdUSUVJMVp0bDY5ZXNIRXhBU1RKazJDbjU4ZjI4MFFFVkc1c2JvWVZhYThkalBCd2NFcXI3TzkKK2pHYW9sdDdNTGw2OGlJaUlDRXlmUHIzWWNXZk9uQWtkSFIwQXdLVkxseEFlSGw2bHkycHFhaW8xbXZmejh5dXlmVXRxYXFwS0wyelYKK1plWEtsWWlJaUlDSmlZbEdCUmtBY0haMkJnRDg4TU1QZVBQTk4zSGl4QWx1aFVSRVZHTHNYWXlxV3Y1Mk0zbnkyc3M0T0Rpd2dPcGkKK21GbTllalhNek14S1ZNZXdaY3VXR0QxNnRQUjg3ZHExWlhyUG9rSklYbGpKenM1V0c5YW9VU05ZVzFzREFJS0RnN0ZuejU0QzU1R2IKK200c3BVNmFVcWoxS1dScitsMlRhdk43aDlQVDAxSWJsNU9SVSswb1hGUlVGNEdWN0pHZG5aNHdjT1JMLy9QTVB0MFlpSWxLaFVDZ1EKK0ZSV0Y3ZHUzWS9yMDZWS1ZuZ0VEQm1EMzd0MW8wcVFKRmk1Y2lJaUlDQ1FsSmVIaXhZdjQ5dHR2TVdiTUdGWm5wZ3JsNE9DQTgrZlAKK1M4L0R3c0xZWHFhdWhwa3JWNjRnS0NnSVk4YU1VYnRuUzJIZWUrODk2ZkdCQXdmdzk5OS9GN2pESzByZVNYeEJJU0N2eStmYnQyOUwKK3c3T3pzL0g0OFdNQWdLZW5welR1dEduVHNINzllbVJsWlVtdjNibHpCeTR1THNqT3pvYWJtMXVGTEZONXBzM3JwZXpPblR2NDg4OC8KK3BkY3pNek94ZS9kdWxWOFZ5aHVxeXFKYnQyNzQ1Sk5QWUdCZ0FGMWRYY1RFeEtCYnQyNzQ2cXV2cEdVaUlpTE5kUDM2ZGR5NWM2ZFMKKzV2M28wU01jUEhnUVhsNWVjSEJ3UUpNbVRkQzllM2NzV3JRSUwxNjh3UGp4NDNIeTVFa2tKQ1FnT2pvYU8zYnNnTHU3T3l3c0xOanUKK2hTcFYzdjFtMHRQVEFieXNZdGFqUncrMmw2bHJZU1l6TXhPelpzMENnRkx0ZFBMZlVGT2hVR0RldkhscTNRcm5EempQbno5WEdTYUUKK2tFN3FrNUtTa0p5Y3JETGMxdFpXbXNmOCtmTng4T0JCdlBQT08vajMzMzhCQU9QR2pjTzRjZU9rRU9IcDZZbm16WnVqUjQ4ZU1EVTEKK2habVpHWktTa3VEdjc2OFMwTXF6VE9XWk51L3FrQkFDZ3dZTndzS0ZDekY3OW16MDZORURYYnQybGNaYnRXb1ZsaXhaZ2g5KytLSEsKK1Y3d2xTNVpBWDE4ZlBYcjB3TjI3ZHpGcjFpeHMzcndaWGJwMHdhRkRoN2hsRWhGcG1OOS8veDBqUjQ1RXIxNjlFQkFRVU83NXNib1kKKzFTUjU3V1p1M3J3cGhSbFdNZE1RNHY5NGUzc0xaMmRuVVZuMjc5OHZPbmZ1TEFBSUFFSXVsNHRSbzBhSjQ4ZVBGenJOWDMvOUpTWlAKK25pemF0V3NuVFpmMzE3dDNiL0hMTDcrSTBOQlFNWDc4ZUpWaFhicDBFVjkrK2FVUVFvaVRKMDhLSnljbmxlRTllL1lVMjdadGs5NG4KK05qWld0RzdkV2hyKyt1dXZpL1BuejZzc1MwNU9qbGl5WklsbzFLaVJ5cndNREF6RXdvVUxSVVpHaGpSdWVaYXBJajVQVWxLU2NIQncKK1VCbkgyZGxaeE1URUNJVkNJY3pOemFYWFI0MGFKZExUMDBWbGk0eU1GQUJFYkd5czlOcXVYYnVFdnI2K21EeDVzcWhmdjc0NGRPaVEKK21EdDNycERMNVdMSWtDSGkxcTFiMHJnR0JnWmk3OTY5Z29pSXF0YVZLMWVFcTZ1cmtNbGt3c25KU1lTRWhKUjZIcm01dVNJeU1sTDQKKytmbUphZE9tQ1hOemM2R3RyUzIwdExSRWx5NWR4QWNmZkNBMmI5NHNJaUlpUkU1T0RndWRORksvZnYzRXNHSERSSnMyYllTZW5wNDQKK2N1UUlDNlVhQlFZR0NnTURBeUVULzFmSGFNR0NCWWlLaWtKZ1lHQ2RESFZwYVdrSUN3dURucDRlTEMwdEMyeHZBcnlzbW5YOStuVWsKK0pDVEF5TWdJM2J0M0wzVGNhZzZwaUl5TXhKTW5UL0RtbTIvQ3hNUkVHcGFTa29MUTBGQTBiOTRjUFh2MkxIRjF2L0tJaW9wQzkrN2QKK0VSc2JLOVZqRmtMQTN0NGVUWm8wUVljT0hlRG41NGZEaHcralJZc1dtRE5uRGtKRFEvSEpKNS9neXkrL1JPdldyZUhyNjZ0UzVaQ0kKK2lDcFBlSGc0dnY3NmF4dzdkZ3hEaGd6QjRzV0xwWm9NeFNtdWR6RXJLeXYyTGtZMXpwSWxTK0R2NzQvVTFGVEV4OGNqTGk2TzFjeXEKKzBiRmp4L0QrKysrREZVei9UNE1HRFRCZ3dJQml4NnRYcjE2SmQrYlZTU2FUb1VlUEh1alJvNGZhc0VhTkdsWHJqVFB6TCtQR2pSdlIKK3AwOGYvUExMTHdDQUVTTkc0UERod3poLy9qd0NBZ0x3NmFlZnd0L2ZYeU02TGlBaXFndkN3c0x3OWRkZkl5Z29DTU9HRFVOWVdKalUKK0VVNUJlRE5LcWl2eTdqZlRvRUVEdHBmUklBd3pWSzBzTEN3d1k4WU16SnMzRDVHUmtTcUI1dDEzMzRXcnF5dSsvdnByZlBQTk4xaSsKK2ZMbGF1eDhpSXFvWXYvMzJHNzcrK211Y1BuMGF6czdPQ0E4UGg2V2xwY280dkJrbDFXWFcxdGFReStWSVNVbGhleG1HR2FML2I5bXkKK1pmajU1NS94N2JmZlNsMXY1d1dhZ1FNSHdzZkhCMXUyYklGY0xvZUZoUVhtekptRHhZc1g4eGNSSXFJS0VCd2NqS1ZMbCtMY3VYTncKK2RYWEZsU3RYMEx0M2J3QkZWeGV6c3JMaXpTaXBUcWxYcng3TXpjMXg3ZG8xaGhtR0dhTC96OURRRUN0WHJvU25weWNtVDU1Y1lLRFIKKzB0S0N0N2MzOVBYMU1XL2VQQVFFQkdEOSt2VXE5eUFpSXFLUysvWFhYN0YwNlZKY3VIQUJJMGVPUkVoSUNMS3pzM0gyN0Ztc1dMR0MKKzFjV0lDdEM4ZVhNQTRQMWxHR2FJVkgzNDRZZll1blVyUHYzMFV4dzRjRUF0ME9SeGMzUEQwS0ZEc1hMbFNyWHV1WW1JcUhqbno1L0gKKzBxVkxFUndjakY2OWVtSFVxRkc0YytjTyt2WHJ4K3BpUk1Ydzl2YkdpeGN2V0R1RVlZWklsWmFXRmpaczJJQytmZnZpMUtsVGNISnkKK1VnazArWHRjcTFldkhwWXRXOFpDSXlJcWhiMTc5MkxDaEFrQUFHMXRiU2lWU3NUR3hzTEl5QWdqUjQ3RTJyVnJXVjJNcUJqVzF0WVkKK1BIZ3dDNEpoaGtpZGpZME5Qdnp3UTNoNmVpSXlNaEk2T2pwU29GbS9mcjEwbzlDYTRzOC8vOFRFaVJQUnJGa3phR2xwOFF1bUN2ZjgKKytYTXNYNzRjcnE2dWRlWXp2L1BPTzNqNDhDRlB1RXNoT1RrWk1URXgwbzJnZ1pjTitRSGd4WXNYQ0FvS1FsQlFFSll0V3dhWlRDWmQKK2hjbjdyNk9qby9KY0xwZERKcE5CVzFzYkxWcTBnS0doWWEwcHEzLy8vUmR2dmZVV05tellVR2ZXaisrLy94N3IxNitIc2JFeE41WVMKK3lzckt3cUJCZzFnUUpaQ2RuWTMwOUhRY08zYXMwdFl4aGhuU0tDdFhyb1NabVJuV3JWdUh6ejc3RERLWkRHdlhyc1dXTFZ1d1pzMGEKK3ZQMzIyeGc0Y0dDTitDeUppWW00ZnYwNjNOM2RZV0Jnd0MrWEt0enExYXZ4OE9IRE92V1pEeDQ4aU1hTkc4UER3NE1yUUNrNE9qcEsKK0lTWW5KMGY2cjFRcWtaMmRyZlpmQ0lHc3JDenBmOTRKSEFCa1ptWksvOXUzYjQrT0hUdldxbTBxT3p1N1RxMGJNVEV4aUl5TWhKZVgKK0Z6Y1VxbkJSVVZHNGVQR2l0TjlnbUtGYXo4aklDRXVYTHNXWFgzNkpkOTk5RjYxYXRZSk1Kb08rdmo1c2JXMVZPZ1dvS1ZhdFdzVXcKK1E1WGkrUEhqZGU0enQyM2JGdDdlM2d3elZDbGtNaGxDUWtMcTNPZDJkbmJHcWxXcnVBSlFwWVNaeWo1V3NlNExhWnpaczJlalE0Y08KK21EOS92c3JyRXlaTXdQVHAwekZpeEFpY09YT0dCVVZFUkVSVXh6SE1rTWJSMXRiRyt2WHJFUkFRZ09EZ1lPbjF2Q3BuRERSRVJFUkUKK0JMQ2FHV2tvZTN0N3pKdzVFOCtlUFZONVBTL1FBS2lSVmM2SWlJaUlpR0dHNmdCZlg5OENYMmVnSVNJaUlpS0dHYXF4R0dpSWlJaUkKK2lHR0dHR2lJaUlpSWlHR0dpSUdHaUlpSWlCaG1pQmhvaUlpSWlJaGhoaGhvaUlpSWlJaGhob2lCaG9pSWlJZ1lab2dZYUlpSWlJaUkKK1lZYUlnWWFJaUlpSVlZYUlnWWFJaUlpSUdHYUlHR2lJaUlpSWlHR0dpSUdHaUlpSWlCaG1pSUdHaUlpSWlCaG1pQmhvaUlpSWlJaGgKK2hvaUJob2lJaUlnWVpvZ1lhSWlJaUlnWVpvZ1lhSWlJaUlpSVlZYUlnWWFJaUlpSUdHYUlHR2lJaUlpSUdHYUlHR2lJaUlpSWlHR0cKK2lJR0dpSWlJaUJobWlCaG9pSWlJaUloaGhvaUJob2lJaUloaGhvaUJob2lJaUlpcU5jeGN1SEFCWjg2Y1lhbFFoWXVLaW1LZ0lTSWkKK0lxTEtDek5wYVdrWU5HZ1FTNFhxUEFZYUlpSWlvaG9VWnY3em4vL2dQLy81RDB1RWlJR0dpSWlJcUdhRkdTSmlvQ21NRUFMaDRlRTQKK2NlSUVuajE3Qm1OalkxaGFXdUx0dDk5R3ZYcjFrSmlZaUo5Ly9oblRwazJUcG5udzRBR1NrcExLL0o2R2hvWjQ3YlhYaWgwdkt5c0wKK0lTRWh1SHIxS2g0OWVnU0ZRZ0ZEUTBOMDZOQUJOalkyNk5peEkyUXlHWjQ4ZVlKVHAwNWg4dVRKWExHcFdnVUZCY0hFeEFSZHVuVFIKK21HVjY5dXdaQWdNRGNlN2NPZXpkdTFkbDJMMTc5K0RoNFFFREF3TnMzYm9WQmdZRy9CS3B5dGJMRnk5ZUZEcThhZE9tYU5XcVZZSEgKK3JPam82QUtuYWQrK1BSbzBhRkJoNjNaUjJ3NHh6QkF4MEdpQUZ5OWVZTktrU1RoeDRnU2FOMjhPVzF0YjNMOS9INzYrdnNqS3lvS0wKK2l3c2VQbndJdVZ5dUVtYisvUE5QQkFZRzRxZWZma0pDUW9MS1BMVzB0Q0NUeWFUblNxVVNRZ2lWY1Q3KytHT3AzQXZ5NzcvL3dzZkgKK0I5dTJiVU5DUWdLYU5Ha0NTMHRMR0JzYjQ4R0RCOWkrZlR1ZVBIa0NVMU5UMk5uWklTd3NERDE3OW1TWW9XcWxWQ294ZCs1YzJOalkKK1lNK2VQZFcrUEZ1M2JzWDI3ZHR4N2RvMUNDRmdhR2lvTnM2YU5XdHc0c1FKQUlDdHJTMDhQVDM1UlZLVitPZWZmK0RuNTRkZHUzYXAKK0hDTTZkZXFFOGVQSG8xKy9mb1dHbWFDZ0lQejIyMjg0ZlBnd0FNREF3QUN6WnMzQ1J4OTlKSVdaOHF6YkpkbDJxSW9Jb2hyQXdNQkEKKzdOMjd0MXFYUWFsVUNrOVBUMUcvZm4xeCt2VHBZc2NQRGc0V0FFUmlZbUtOTGZlTWpBeGhZV0VoQUlqSmt5ZUxqSXdNYVZoMmRyYlkKK3ZIbXpxRmV2bmdBZ09uZnVYT0E4UWtKQ0JBRHBMeVFrcE1EeHNyS3l4TzNidDhXU0pVc0VBREZyMXF4Q2wrdkVpUlBDMk5oWUFCQXQKK1c3WVVlL2JzRWRuWjJTcmpLQlFLY2ZUb1VmSEdHMjlJNyszcTZscXJ0Z3R6YzNQaDYrdGJwL1lGYmR1MnJkR2YrZmp4NHdLQTBOSFIKK0VZOGVQYXIyNVZFcWxTSXBLVWwwN2RwVkFCQ0dob1pxNDJ6YnRrMEFFREtaVEp3OWU3WldyMS9lM3Q3Q3pzNnVUbTFUM3Q3ZXd0bloKK1dhT1gwY2ZIUitVNDh0TlBQNVY0Mmk1ZHVnZ0E0c1NKRXhXNmJwZGsyeUVoSWlNakJRQVJHeHRiNGZNT0RBd1VCZ1lHUW90eGpxaDAKK1YyaW1UNStPRVNORzFJbWUvN1p0MjRicjE2K2pTWk1tMkx4NU0vVDE5YVZoT2pvNmNIZDN4NWt6WjFDdlhqMDhldlNvd0hsWVdWbXAKK1BDL29WelFBME5YVlJjZU9IZkhWVjE5aDh1VEp5TW5KS1hDOEgzLzhFY09HRGNQejU4L1J0V3RYUkVSRVlNS0VDZERSMFZHNyt1UGkKKzRvSnIxNjdCeHNZR0FKQ2VuczRWbWFyVmhnMGJBQUE1T1RudzlmWFZpUDFhNDhhTjBiMTc5MExIbVQ1OU9pNWZ2b3lvcUNpOC9mYmIKKy9CS3B5czJiTnc5dnZ2bW05RHdrSktTa1A5Z2pMaTRPZG5aMkdEeDRjSVd1MnlYWmRxaHFNTXdRTWRBVTZzaVJJd0FBVTFOVDFLdFgKK3I4QngzbnJyTFh6enpUZElTVWxCU2txSzJuQWRIUjFvYVpWdVZ6TnUzRGhrWjJlcnZYNzE2bFZNbVRJRlNxVVNEUnMyeE5HalI5R3kKK1pjc2k1OVdrU1JNY09YSUVSa1pHU0V0TDQwcE0xZWJPblRzSUNncUN0clkyQUdETGxpM0l5TWpRakpPQllyWlJLeXNyZE8zYWxWOGkKK1ZRdTVYSTdGaXhkTHovMzkvVXUwUHc4UEQ4Zno1OC94MFVjZlZkcTZYZHJqR3pITUVESFFWS0hIang5TEoyRkZYZFdZUG4wNldyUm8KK0lZMWZVSm1WaHFPakk1WXVYYXJ5bWxLcHhJd1pNNlFyTnZQbnowZjc5dTFMTkQ4akl5TjRlWG54eWd4VksxOWZYMWhaV1dIQ2hBa0EKK2dQajRlRFlZSmlxaDBhTkh3OFRFQkFDUWxKU0VIVHQyRkR2Tjk5OS9qK2JObTJQa3lKRXNRSVlaSXFxTGdhWkpreVlBZ09Ua1pDeFkKK3NLRFE4WFIxZFRGcDBpVDgrKysvNVg3UEZ5OWVRRjlmWHpwbzVUbHg0Z1FpSWlJQUFOcmEybkIzZHkvVmZDZE5tb1NzckN5dXZGUXQKK1VsTlRzWFBuVHN5ZVBSdXpaOCtXWHYvdmYvK3IxdmxGVlJCQ1FLbFVsbW02a2lyTC9Ja0tJNWZMOGZISEgwdlAxNjVkQzRWQ1VlajQKK0tTa3ArUEhISHpGNThtVG82ZWxWMkxwZDFtMm5QTk55VzJLWUlXS2dLYVA4TjlGZHYzNDlQdjc0NHdLcmZ3R0FqNDhQYkcxdHkvVisKK1NxV3kwSjdpZnZ6eFIrbXhyYTB0akl5TVNqVnZJeU1qN055NWt5c3VWUXQvZjMvSTVYS01IVHNXbHBhV3NMYTJCZ0JFUjBmajdObXoKK1JVNjdmLzkrakI4L0hpNHVMbkJ4Y1ZHcGJwT1VsSVM1YytkaStQRGgwdkJYcjJybWQrellNUXdjT0JDdnZmWWFPblRvZ0o0OWUrTEEKK2dRTkZ2bjlLU2dwKytPRUhEQjQ4R092V3JTdnlSQzB3TUJERGh3K0hxYWtwMnJkdmo4YU5HNk4vLy83dzgvTXJ0QjBjVVVsTm5UcFYKKzZqNzU3dDI3VWs5bGhSMHowdExTTUgzNjlIS3YyMlhkZGdBZ096c2J2cjYrc0xhMmhyNitQblIwZE5DMWExZjQrUGdVK2dNYnQ2WFMKK3AwUWk5bVpXQ2IyYzFZYmV6T0xpNHNScnI3Mm0wb3VNaFlXRkNBOFBMOVY4dExXMXBlbnYzcjFiNkhnaElTSEN4TVNrd0dHdFdyV1MKKzV1SHA2Y21OZ3IyWjFSaEtwVkowN2RwVmVIbDVTYS81Ky90TDYzTkplcEs2ZCsrZWtNdmxBb0FZUEhpdzJ2RG82R2hwT3l0b2ZncUYKK1FzeWVQVnZJNVhLeFpjc1dxZmUvNk9ob1lXRmhJUm8xYXFUV0kxTjBkTFFZTzNhczBOZlhsNWIxbTIrK0tYRDUwdFBUeGVqUm80V2UKK25wN1l2WHUzeU1uSkVVSUljZnYyYmRHM2IxOEJRUFRvMGFOU2VqUmliMmExdnplei9ENy8vSE5wZmV6YnQyK2gyMXpQbmoxRnYzNzkKK0NoeGVtblc3TE50T25xZFBuNG8rZmZxSTZkT25pOGpJU1BIbzBTTng2TkFoMGFKRkMybjUwOUxTYXVXMlZKVzltVEhNRU1OTUpRV2EKKzJoQm1oQkRpOTk5L0Y4MmJOMWNKTkFERXhJa1R4Y09IRDBzZFpnNGVQQ2hDUTBOVi9uNzk5VmV4WmNzVzBhNWR1d0xEVEhKeXNzcDcKK3IxbXpoaHNGdzB5TmNmYnNXU0dUeVZTQ2ZHWm1wdFM5T0FCeDgrYk5ZdWRqYW1wYWFKZ1JRZ2dURTVOQ3c4eWlSWXNLM1hZZVAzNHMKK0dqUm9vSFpDbHBxYUtqSXpNOFh1M2J1TFBPRlRLcFZpN05peEFrQ0IzMDFLU29ybzNMbXpBQ0E2ZGVva1VsSlNHR1lZWnNyc3dZTUgKK1VyQUhJTUxDd3RUR3VYTGxpZ0FnL1AzOUM1eEhTZGZ0c200N1FyeThmVUdmUG4zRXFGR2poRktwVkJtMmYvOSs2WDI5dmIxcjViWlUKK2xXR0cxY3lJV09Xc1NEMTc5c1MxYTlmVXVxM2NzMmNQT25mdWpHM2J0cFdxSHIyYm14dHNiVzFWL3ZyMzd3OTNkM2ZjdTNldndHbmkKKzR1SlVuamRzMkpBckhkVVlHemR1aEl1TEM5cTFheWU5cHFlbmg1a3paNnBVNHl5T1hDNHYwL0MvL3ZvTEsxZXVoS0doWVlHOU9yMzIKKzJtc1lNR0NBMnVzTkdqU0FucDRlN08zdGkzemZvS0FnN04rL0gwMmJOc1hVcVZQVmhqZHMyQkErUGo0QWdGdTNidUUvLy9rUFZ3b3EKK3M5YXRXMlBjdUhIUzgrKysrMDV0bksxYnQ2SnAwNlo0NTUxM0NweEhTZGZ0c200N0FMQno1MDVjdlhvVmMrYk1VZXNFWi9qdzRkS3QKK0RyWnUzWXJjM0Z4dVMrWEFNRU5VU1lIbTZ0V3J0ZWF6dFczYkZtZk9uTUcrZmZ2d3hodHZTSytucHFaaTVzeVpSZDRYNWxVM2I5NUUKK1JrYUc5SmVlbm82a3BDUmN2WG9WZmZ2MkxkRThpbXIwU2FSSlltTmpjZmp3WVpWRy8zbG16cHdwZGRPOGE5Y3VKQ1FrVk1veXJGdTMKK0RncUZBZ01IRG9TdXJtNkI0elJxMUtqUTZWKzloOU9yOHU2WFkyVmxWZWo4aHcwYkJtTmpZN1dUTjZLeStPU1RUNlRIUC8vOE0ySmoKK1k2WG55Y25KK09tbm56Qng0a1NWZTZPVlpkMHV6N2JqNStjSDRHWDMwQnMzYmxUNTgvUHpRN05telFBQUNRa0p1SEhqQnJjbGhoa2kKK3pRczBSZlgrVlZNLzI5aXhZM0hqeGcwc1hicFU1VmZnUFh2MllQTGt5U1c2UXFPbnB3ZDlmWDNwcjE2OWVtamN1REY2OSs2TnpaczMKK0Z6aE4wNlpOVlo2L2VxV0dTRk50MmJJRmI3enhoa3BuR25sYXRXb0ZOemMzQUM5djZMcDkrL1lLZjM4aGhOUkl1blBuemhVK2Y2VlMKK2lRc1hMZ0FBbWpkdlh1aDQydHJhNk4rL1A0Q1hYVkpIUjBkejVhQXk2OVdyRnh3Y0hLUjFNUCtWelpJMC9LL3NiU2M1T1JuWHJsMkQKK3RyWTJuang1Z3BpWUdMVy9NV1BHd05QVEU1NmVudERTMHVLMlZBNXliaEpFbFJOb0hqOStYS0tlVG1vYVBUMDlMRjY4R0VPR0RNR0kKK0VTUHc5T2xUQU1CUFAvMkVVYU5HWWN5WU1XV2VkN2R1M2RDcVZTdTExNXMwYVFKalkyTThmLzRjQUJBVEU4TVZqVFJlUmtZRy9QejgKK29GQW9DcjFMZUh4OHZQUjR3NFlObURkdlhySFZ5VXJqeFlzWDBqWmExTldYc29xUGo1ZHVYbGpjTDhTZE9uV1NIajk4K0JBOWV2VGcKK1NrSmw5dW1ubjBvbi8zNStmbGl5WkFrYU5XcUVyVnUzd3RiV0Z0MjZkYXUyYmVmdTNidFNOOHhyMXF5UnJzQVc5MzdjbGhobWlEUXEKKzBNeVpNNmRHaDVuVTFGUTBhTkNnMEJ0ZVdsbFpJVGc0R0xhMnR0S1ZFbDlmMzNLRkdabE1odDkrKzYzQVlYWjJkamg0OENBQUlEUTAKK2xDc1pERTlRSndBQUdBZEpSRUZVYWJ5QWdBQ2twcWJDeDhlbnlMdUVyMWl4QWsrZlBzV0RCdzl3Nk5DaGNtMURyOHAvRlRNek03UEMKK1AyUCtLcDk1SjM2Rk1UUTBsQjZYNU9TT3FDakRoZzFEcDA2ZGNPdldMYVNrcEdENzl1Mnd0N2ZIOWV2WEs2UWIvdkpzTzNtaFJBaUIKKysvZnZsK2dHejl5V0dHYUlORExRMUdUdTd1NllOV3NXM25ycnJVTEg2ZENoQTN4OGZQRGhoeDhDQVA3NDQ0OEtYWWFIRHgvQ3lNZ0kKK2VucDZHRHQyckJSbTd0eTVnNmlvS0ppYm0zTkZJNDBraE1DR0RSc3dac3dZekowN3Q4aHg0K1BqOGRWWFh3RjRlUlBOaWd3eitXOFcKKytQZmZmMWY0NTJ6ZXZEbDBkSFNRazVPRDZPaG9DQ0VLM2ZmbHYvRmYvclozUkdXaHBhV0ZUejc1Uk9wSVk5MjZkWWlNakVUanhvMHIKK1pCc3F6N1pUdjM1OTZYRklTRWlKd2d5M3BYS3NDOXdjaUtpd29MSjgrZkppeDh0L284eVMzR1c1cEpLU2ttQnBhU2xkYm5kemMxTTUKK0lCVFVndzJScHJoNDhTSWlJaUpLVkc5LzVzeVpVa1BrUzVjdUlUdzh2TXdCNmxXdFc3ZVc1bjNod29WUzlUeFlFbks1WExvQmFGeGMKK25OU1F1U0JQbmp3QjhMS3RVTWVPSGJtU1VMbE5uRGhSYWw5eS8vNTk3TjY5R3hNbVRFQ0RCZzNLUGUveWJEdW1wcVpTRVBIejh5dHkKKzJyeU9kTGd0TWN3UVVTV0VtYUNnb0NMdnNBeThiQmVReDhiR3BzUW5XY1ZadEdnUk9uZnVMQjJVZEhSMHNHblRKbW40cmwyN2NQcjAKKzZSTFBMekV4RWE2dXJuajI3Qm0vWEtwMHExZXZocG1aV2JGZHZ3SkF5NVl0TVhyMGFPbjUyclZyQ3h3dnJ6cEplbnA2Z2R0WVNrcUsKKzJ1dDZlbnBTWStHN2QrOGlLQ2lveUcyMG9HMjF1TzMzZ3c4K2tCNEhCQVFVT2w1ZVNITjNkNi94VjY1Sk05U3JWdyt6WnMxU2VhMDAKK0RmK0xXcmZMcyswMGF0UklDaWJCd2NIWXMyZFBnZFBtNXVaaXlwUXBjSEp5NHJiRU1FTkVsUkZtOG5hdVJmMUNsTDlkVVA3dU12TmsKK1ptYXFYQkl2N3NRb3Izck9oZzBiMUhxQUdqcDBLTmFzV1NNOWQzTnpRMkJnWUxHZkpUUTBGSmFXbHVqWHJ4OWF0R2pCTDVjcTFaVXIKK1Z4QVVGSVF4WThhVStFVGp2ZmZlVTltbUNxcldrbmRsOHZMbHk3aDkrN2IwdWtLaHdJb1ZLNlNRazc5VEFRQ1lOMitlOU5qRHd3TVAKK0h6NVVDL29oSVNFQVh2YkNsSnFhcWpJOGY3ZnJCVFZNbmpScEVpd3RMUUVBbXpkdlJtSmlvdG80dDIvZlJuQndNTXpNekZTV2g2aTgKK1pzMmFKZFVLNk5PbkR5d3NMRW84YlhIcmRubTJIVTlQVCtueHRHblRzSDc5ZW1SbFpVbXYzYmx6Qnk0dUxzak96cFo2TmVTMnhEQkQKK1JKVVFaaElTRW1Cblo0ZWZmdnBKcFlHaVVxbkVqaDA3cEJ0NExWKyt2TUJmb1Y4Tkd6dDI3RUJZV0JoaVltSnc3OTQ5M0wxN0Z6ZHYKKzNzVEZpeGV4YWRNbTJOdmJTMjBNQmc0Y3FEYS9Uejc1QlB2MjdVT3paczJRbXBvS1YxZFh1TG01NGVUSmt5cS9XS2VtcGlJb0tBanYKK3ZQTU9YRnhjc0d6Wk1ueisrZWY4WXFsU1pXWm1TcjhVbDZaWHN2dzMxRlFvRkpnM2I1N0tqd0I1UHl3QVFIWjJOdXpzN09EbDVRVnYKK2IyK1ltNXREQ0NGMVZSc1dGb2IzMzM4Zng0NGRBL0N5b2JTSGh3ZUFsMVZ4ZXZYcWhSVXJWaUF3TUJEYnRtMkRvNk1qREF3TXBCTzYKKzd0MjdxOXpRTS8rUEdiZHUzVkpiZHJsY2prT0hEcUZUcDA2SWo0L0hoQWtUcEFiUWVmdVFpUk1ub2syYk5nZ01ES3lRS2tCRWVWcTAKK2FJR0pFeWNDQUdiTW1GR3FhWXRidDh1ejdZd2JOMDY2dVdkT1RnNDhQVDNSdkhsejlPalJBNmFtcGpBek0wTlNVaEw4L2YybEh6MjQKK0xaV1JJS29CREF3TXhONjllMnZVTWdjSEJ3c0FJakV4c1VhV3VWS3BGQVlHQm1MSmtpWEN5OHRMbUptWmlSWXRXb2doUTRZSVYxZFgKKzBiWnRXd0ZBbUpxYWlwOS8vbGx0ZWo4L1B6Rmd3QUNocmEwdEFKVDZ6OERBUU9UbTVoYTZmSEZ4Y1dMSmtpWFNjZ0FRTXBsTUdCb2EKK2ltYk5tZ2tBb2syYk5tTFJva1VpTGk2dVZtNFg1dWJtd3RmWHQwN3RDOXEyYmF1eG4zbi8vdjJpYytmTzB2b29sOHZGcUZHanhQSGoKK3h3dWQ1cSsvL2hLVEowOFc3ZHExVTlzR2V2ZnVMWDc1NVJlVmJYTHAwcVZDTHBkTDR6UnIxa3hzMjdaTkNDR0VzN096YU4rK3ZmRDIKKzloYWhvYUVxMjQ5Q29SRGZmUE9OYU5xMHFjcDdtSmlZaUhQbnpvbjMzLzkvN2QxL2ROVjEvY0R4Rjl2ZHhnWnpUbjRWRVQvcTJESUMKK0E5RWdFYXhPQnhJOWtPbVJVQTZkT3FFUUVUK1VNRHJRT1hLQzZtUUhTNHFBbEhNOG1nZFBIVE1NekJONEdIRlUxQ1VKeVZrb25GSisKK2pETVlzckdON2RNZmZ0blh4YThwRzl5N1BSNS83VzczZm5idiszTXY3TG5QZlgxMmU5S3RXN2RrMnJScHllYk5tNU9HaG9aazA2Wk4KK3lZd1pNNUx1M2JzM2U0MU5uRGd4ZWV5eHgwNTVMRWVPSEVsbXo1NmRGQllXSnIxNzkwNm1UcDJhZk9NYjMwajY5ZXVYM0hYWFhSbngKK09wdy9mMzR5Y3VUSUR2V2FtajkvZmpKdTNMaU1mZ3c3ZHV4SUNnc0xrNnFxcWhaZC8vMDh0ei9JYStlayt2cjZaTkdpUlVsaFllRXAKKy83Lzk0QWMvU0dwcWFrNTcvOXJEYStta1YxOTlOWW1JWk0rZVBhMis3VC85NlU5SlVWRlIwaWxwN1dsQWFBT1hYbnBwTEYrK3ZObGIKK01kSmRhV2xwWEhmZGRYSDQ4T0dtMzl4a21xZWZmanB1dU9HR2s3LzRpRjI3ZGtWWldWa2NPblFvOHZQelk5Q2dRVEYwNk5Dem5uYjIKK0F2eENKbmJ0MmhYLytNYy9vcUtpSWhvYkc2Tm56NTR4Y09EQUtDa3BhZGZ2Sng0OGVIQk1temF0NlRlSEhVRy9mdjFpL3Z6NUhlb3gKKy82K0RCdzlHV1ZsWjVPZm54N0JodzVyK3l2bnUzYnVqZi8vK1ozMDkxdGJXUmxsWldWUlVWRVRQbmoxanlKQWhrVXFsb3J5OFBQcjEKKzYzZk92NGplRXJXMXRmSDN2Lzg5S2lvcW9yaTRPSzY4OHNwbVozZEtaL2ZlZTIrVWxwYkc1czJiTzh6ejZkNTc3NDN0MjdlMzZDMjcKKzZlemxsMStPb1VPSHR0bjJ6K2UxVTFOVEUyVmxaVkZaV1JrOWV2U0l3WU1IdCtpRU9abjhXanBwKy9idE1Yanc0Tml6WjAvMDdkdTMKK1ZiZTlidDI2dVAzMjI1MmFHVGl6a3lFVDhlNnBwa3RLU3ByOXNhNTBrSzczQzlwS2p4NDlUcGtuaTJqWktWcno4dkthQnBQZjYrVGIKK1NsdERYbDVlWEhQTk5YWVVGMVJiaHN6NXZuYnk4L09ibmZuVGE2bDFtWmtCQUFERURBQUFnSmdCQUFBUU13QUFnSmdCQUFBUU13QUEKK0FHSUdBQUFRTXdBQUFHSUdBQUJBekFBQUFJZ1pBQUJBekFBQUFJZ1pBQUFBTVFNQUFJZ1pBQUFBTVFNQUFDQm1BQUFBTVFNQUFDQm0KK0FBQUF4QXdBQUlDWUFRQUF4QXdBQUlDWUFRQUFFRE1BQUlDWUFRQUFFRE1BQUFCaUJnQUFFRE1BQUFCaUJnQUFRTXdBQUFDSUdRQUEKK1FNd0FBQUNJR1FBQUFERURBQUNJR1FBQWdEU1RzZ1RRdHRhdVhSdEZSVVVXZ2xhM2ZmdjJEdmVZS3lvcVl1M2F0ZEc5ZS9jTzg1Z2IKK0docmkrUEhqMGFWTEYwOTYvMTYzaVhYcjFzWGF0V3M5QVZxZ3VybzY4dlB6bzFPblRoWWpUZjZmRWpQUVZpK3UxTHN2cjltelowZE8KK1RvNEZvVTNrNWVWMXFNZGJWRlFVR3pkdWpMS3lzZzd6bU92cTZxSzZ1anJ5OHZLaWMrZk9mb2hxUTVXVmxURjY5T2dPOVpqejgvTWoKK0l1TE9PKy8wQkRpSDJ0cmFxS21waVlLQ2dzak56YlVnTFhEa3lKR0lpTWpLYXJzM2c0a1phQ1BEaHcrUEpFa3NCTFNpdDk1NnE4TTkKKzVycTZ1bGkxYWxVc1hibzBxcXFxWXViTW1URnIxcXdvTGk3MmhPQzhMVnk0TUJZdVhHZ2h6bUw5K3ZVeGQrN2MyTHQzYjl4MzMzMHgKK1o4NmNwZ2prNGpNekF3QnBMRGMzTjZaUG54N2w1ZVh4b3gvOUtCNTY2S0VZTUdCQUxGcTBLQ29yS3kwUXRKSHk4dklZUDM1OGpCczMKK0xvWVBIeDY3ZHUyS0JRc1dDQmt4QXdDSUdraFBodzhmanJ2dnZqc0dEaHdZVlZWVnNXM2J0bGk5ZW5WOCtNTWZ0amhpQmdBUU5aQisKK1RwdzRFY3VYTDQvTEw3ODgxcTVkRzJ2V3JJbU5HemZHa0NGRExJNllBUUJFRGFTbjlldlh4NVZYWGhuZis5NzNZdGFzV2ZIUGYvNHoKK0prNmNhR0hFREFBZ2FpQTltWXNSTXdDQXFJR01ZaTVHekFBQW9nWXlpcmtZTVFNQWlCcklPT1ppeEF3QUlHb2dvNWlMRVRNQVFEdU4KK21vVUxGNG9hMmlWek1XSUdBR2puVWZQd3d3K0xHdG9WY3pGaUJnQVFOWkJ4ek1XSUdRQkExSWdhTWtwNWVYbE1tRERCWEl5WUFRQkUKK2phZ2hNN3gzTHViSWtTUG1Zc1FNQUNCcVJBM3B6VndNWWdZQUVEVmtISE14aUJrQVFOU1FVY3pGSUdZQUFGRkRSakVYZzVnQkFGbzkKK2FwWXNXU0pxYURQbVloQXpBRUNiUmMyMGFkTkVEVzNDWEF3dDFTbEprc1F5a1BaUDFFNmRZdkRnd1RGcDBpU0xBWkNHR2hvYTRzVVgKK1g0eU5HemRHYlcxdFhIdnR0VEZ5NUVqekRMd3ZodzRkaW5YcjFzWE9uVHZqcXF1dWlqRmp4a1JoWWFHRjRSVHIxcTJMelpzM2l4a3kKK3d6WFhYQk5WVlZYUnRXdFhpd0dReHBJa2lZcUtpdGkzYjE4ME5EUkV6NTQ5bzFldlhwR2RuVzF4T0dzTXYvMzIyM0hnd0lIbzJyVnIKKzlPblRKd29LQ2l3TVoxUmRYUjFkdTNZVk13QkE2NnVycTR2VnExZkhraVZMb3FxcUttYk9uQm16WjgrTzR1SmlpME9URXlkT3hHOSsKKzg1dFl0R2hSRkJRVXhJOS8vR052SitOOUVUTUFnS2poZ2x1L2ZuM01uVHMzOXU3ZEcvUG56NDg1YytaNFd5SmlCZ0FRTmFTdjh2THkKK3VQdnV1K09wcDU2S3IzLzk2N0Y0OFdLbldlWURjell6QUtETk9mc1ovbDRNYmNHUkdRRGdnbk9rcHVNd0Y0T1lBUUJFRFJuSFhBeGkKK0JnQVFOV1FVY3pGY0tHWm1BSUNMemt4TisyQXVoZ3ZOa1JrQUlPMDRVcE5aek1VZ1pnQUFSRTNHTVJlRG1BRUFFRFVaeFZ3TTZjRE0KK0RBQ1E5c3pVcEE5ek1hUVRSMllBZ0l6alNNMkZaeTRHTVFNQUlHb3lqcmtZeEF3QWdLakpLT1ppU0hkbVpnQ0FqR2VtcG5XWml5RlQKK09ESURBTFE3anRSOE1QODdGN04wNmRMNDJ0ZStabUVRTXdBQW9pWjltWXRCekFBQWlKcU1ZaTZHVEdabUJnQm85OHpVbk1wY0RPMkIKK0l6TUFRSWZUSG8vVXZQbm1tL0htbTIvRzlkZGZmOWJybVl0QnpBQUFkUENvT1hic1dEejc3TE14ZnZ6NGkvNDRkdTNhRlNVbEpVMlAKK0tTY241N1RYTXhkRGUrTnRaZ0JBaDNVK2J6Lzc1UzkvR1JNbVRJaWxTNWRlMU1ld2MrZk91UGJhYXlNN096dXlzckxpZ1FjZU9PVTYKKzVlWGxNV0hDaEJnM2Jsd01IejQ4ZHUzYUZRc1dMQkF5WkR4SFpnQUEvazlMajlRY08zWXNQdnJSajBabFpXVmtaMmZIbENsVFlzV0sKK0ZaRktwUzdvL1Mwcks0c3ZmT0VMY2ZUbzBUaHg0a1JFUkhUcDBpWGVlT09ONk5HalJ4dytmRGdXTDE0Y3YvakZMK0p6bi90YzNILy8KKy9URmt5QkE3R2pFREFOQlJvK2FuUC8xcExGaXdJT3JyNnlNaUlpY25KMGFPSEJsLytNTWZvcWlvNklMY3g1ZGVlaWsrLy9uUFIzVjEKK2RUUTBORFI5UGpjM055Wk5taFJYWDMyMXVSakVEQUNBcVBuL3FMbnp6anRqMEtCQnA3d05MVGMzTndZTUdCRFBQUE5NOU8zYnQwM3YKKzE1WXRXMkxNbURGeC9QanhaaUh6WGdVRkJmSDk3My9mWEF4aUJnQkExTHdiTlFjUEhvejYrdnJUUmtST1RrNWNjc2tsc1dIRGhyanEKK3FxdmE1TDVzMnJRcHZ2emxMMGRkWFYwME5qYWU5anBaV1ZreFpNaVEyTFp0bTUySG1BRUFJS0t5c2pMNjlPa1QxZFhWWjd4T2RuWjIKK3BGS3BlUHp4eDF2OVRHY2JObXlJOGVQSFIzMTkvUmxENXIxQjg3dmYvUzV1dmZWV080NTJ5OW5NQUFCYWFOV3FWVTF6TW1mUzBOQVEKK2RYVjFjZlBOTjhleVpjdGE3WHMvOWRSVGNlT05ONTcxaU14N0pVa1MzLzN1ZCtQNDhlTjJIR0lHQUtBak8zYnNXQ3hac3VTY01YTXkKK0pCb2JHMlBPbkRueDdXOS8rNHh6TFMzMXhCTlB4TTAzM3h3blRweUlscjZwSmttU2VQdnR0eS82cWFOQnpBQUFYR1RMbGkyTG8wZVAKK3ZxL2JORFkyeHNxVksrT21tMjZLZDk1NTV3TjkzMGNlZVNSdXUrMjI5eFZFZVhsNTBhbFRwNGlJZU8yMTE4SlVBZTJWbVJrQWdIT28KK3FhbUpnb0tDaUhqM3JHVjFkWFh2Ni9hNXVibnhpVTk4SWpaczJCQzllL2R1OGUxV3IxNGRVNmRPYmRGOFRDcVZpcnE2dWhnd1lFQk0KK21EQWh4bzRkRzZOR2pZck9uVHZiZ1lnWkFJQ09iTisrZmJGMTY5Yll1blZyUFBmY2MxRldWaFoxZFhXUmw1Zlhvb0g4bkp5Y0tDNHUKK2ptZWZmVFlHRFJwMHp1LzM0SU1QeG5lKzg1MHpIbFhKeTh1THVycTZ5TTNOalM5KzhZdHgwMDAzeGRpeFk2Ti8vLzUyRm1JR0FJQXoKK3E2K3ZqNWRmZmptZWYvNzUrTnZmL2hhYk5tMksvZnYzUnlxVml1enM3S2l0clQzbE5sbFpXWkdYbHhlLy8vM3ZZK3pZc1dmYzlzOSsKKzlyT1lOMjllczBCeTlBWEVEQUJBbS9uUGYvNFRMN3p3UW16WnNpVTJiZG9Vcjc3NmF0VFgxMGZuenAyanRyYTIyVkdXWC8zcVYzSFgKK1hYZWRzbzM3N3JzdkZpNWNHQkh2bnVhNXNiSFIwUmNRTXdBQUYxWmRYVjI4OHNvcnNYWHIxdGk4ZVhPVWxwYkdnUU1IbXI3K3BTOTkKK0tkYXZYeDlaV2UrZWsybmF0R254NjEvL09pSWkrdmZ2SDEvNXlsY2NmUUV4QXdCY0tQdjI3WXMvL3ZHUEZ1SU1EaDgrSFAvNjE3L2kKKzZhZWZqb2FHaHVqYnQyL2NjY2Nkc1g3OSt2ajN2LzhkSC9yUWgyTDA2TkhSclZzM2kzVVdJMGVPakU5OTZsTVdRc3lJR1FDZzlaU1cKK2xzWjExMTBYdlhyMWlpNWR1bGlRY3pqNU4ybXlzckthVHFmTTJlM2V2VHVXTDE4ZTA2Wk5zeGdkWE1vU0FBQnQ0ZlhYWDQraW9pSUwKK1Fhc2JQSGl3UlNBaS9ORk1BQUJBekFBQUFJZ1pBQUFBTVFNQUFJZ1pBQUFBTVFNQUFDQm1BQUFBTVFNQUFDQm1BQUFBeEF3QUFJQ1kKK0FRQUF4QXdBQUlDWUFRQUFFRE1BQUlDWUFRQUFFRE1BQUFCaUJnQUFFRE1BQUFCaUJnQUFRTXdBQUFDSUdRQUFRTXdBQUFDSUdRQUEKK0FERURBQUNJR1FBQUFERURBQUFnWmdBQUFERURBQUFnWmdBQUFNUU1BQUNBbUFFQUFOcUJsQ1VBQURoL1ZWVlZzWGZ2M3ZQN3dTeVYKK2lrOSs4cE94Zi8vK09Ianc0Qm12VjF4Y0hCLzV5RWRPK1h5U0pQSGFhNitkOWpZREJneUlMbDI2MkZHSUdRQUFtdnZMWC80U3Q5eHkKK3kzbHRvMmZQbnJGLy8vN1l2WHQzckZ5NU1oNSsrT0ZJa3FUcDZ5VWxKVEZ4NHNRWU5XclVHV1BtejMvK2MyelpzaVdlZlBMSmlJZ28KK0tpcUs2ZE9ueDR3Wk04UU1ZZ1lBZ0ZQVjFOUkVSRVR2M3IxandZSUY4ZG5QZmpZdXUreXlTS1ZTVVZwYUdwTW1UWXFJaUk5OTdHUHgKKzNIUFBSWklrY2Z6NDhYanJyYmZpeVNlZmpHWExsalZ0WThTSUVURml4SWk0NG9vcll0NjhlVTNmNDRjLy9HRk1uRGp4alBjaEt5c3IKKzdybm5ucmpubm50aTRNQ0JzV1BIam5qODhjZGp6Smd4ZGhCaUJnQ0EwNnV1cm82Y25KejQ2MS8vR2lVbEpjMisxcU5IajZhUGMzSnkKK29rK2ZQazJYTDcvODhoZzllblJjZXVtbHNYang0bWEzbXoxN2RqejAwRU94YytmT2lJZ29MUzA5YTh5Y2xDUkpWRlJVeE1pUkk0VU0KKzdab1RBQUFBdElLYW1wb1lQMzc4S1NIVFVqTm16SWpHeHNab2FHaG8rbHdxbFlxRkN4YzJYWDdra1VmaTJMRmo1OXpXQ3krOEVBY08KK0hJZ1pNMmJZTVlnWkFBRE9IVFBqeG8zN3dMZS83TExMWXRpd1lYSDgrUEZtbjcvbGxsdWlYNzkrRVJGeDVNaVIrTzF2ZjN2T2JhMWUKK3ZUcTZkKzhlRXlaTXNHTVFNd0FBbk4yOGVmTml5cFFwNTdXTkxWdTJSRUZCUWJQUHBWS3BtRFZyVnRQbG4vLzg1ODJPM3Z5dm8wZVAKK3hxT1BQaHBUcGt5SnZMdzhPd1l4QXdEQU9YNm95c3FLVHAwNm5kYzJzck96VDd1TmIzN3ptMUZVVkJRUkVXKzg4VWJUbWNwTzU5RkgKK0g0MWp4NDdGdDc3MUxUc0ZNUU1Bd01WVldGZ1lVNmRPYmJwOC8vMzNuL1o2U1pMRWloVXJZdFNvVVI5NGRnZkVEQUFBcldybXpKbVIKK1NyMTdJdG90VzdiRTg4OC9mOHAxWG5ycHBYamxsVmVhaFErSUdRQUFMcW8rZmZyRWJiZmQxblQ1ZEVkblZxeFlFY1hGeGZIVnIzN1YKK2dpRm1BQUJJSDNQbXpHbjYrSWtubm9nOWUvWTBYYTZxcW9ySEhuc3NKaytlSEowN2Q3WllpQmtBQU5MSDBLRkQ0L3JycjQrSWlNYkcKK3huamdnUWVhdm1id0h6RURBRUJhbXp0M2J0UEhLMWV1aktxcXFxYkIveEVqUnNTblAvMXBpNFNZQVFBZy9keHd3dzFOWnlvN2V2Um8KK3JGcTFLclp0MnhabFpXVUcveEV6QUFDazhROXZXVm5OWm1lV0xWc1dEejc0WUZ4eXlTVng2NjIzV2lERURBQUE2V3Z5NU1uUnZYdjMKK2lJall1M2R2ckZtekp1NjQ0NDdvMHFXTHhVSE1BQURRZWhvYkcxdDFlL241K1RGOSt2Um1uelA0ajVnQkFLRFZ2ZlBPTzAwZjE5VFUKK3RNbzJwMCtmSG5sNWVSRVJNV3pZc1BqTVp6NWpvUkV6QUFDMHJtZWVlYWJwNDcxNzk4YU9IVHZPZTV1OWV2V0t5Wk1uUjBRWS9FZk0KK0FBRFFlZzRkT2hSVHBreUpJVU9HeElvVks1cDk3ZXFycjQ0YmI3d3hmdktUbjV6WDk1Z3paMDRVRmhiR3hJa1RMVGdkVXNvU0FBQzAKK3ZtN2R1c1dhTld2YTlIdGNjY1VWc1duVHBpZ3NMTFRnZEVpT3pBQUFaTENoUTRkYUJNUU1BQUNBbUFFQUFCQXpBQUFBWWdZQUFCQXoKK0FBQUFZZ1lBQUVETUFBQUFZZ1lBQUVETUFBQUFpQmtBQUVETUFBQUFpQmtBQUFBeEF3QUFJR1lBQUFBeEF3QUFJR1lBQUFERURBQUEKK0lHWUFBQURFREFBQWdKZ0JBQURFakNVQUFBREVEQUFBZ0pnQkFBQVFNd0FBZ0pnQkFBQVFNd0FBQUdJR0FBQVFNd0FBQUdJR0FBQkEKK3pBQUFBSWdaQUFCQXpBQUFBSWdaQUFBQU1RTUFBSWdaQUFDQTlKQ3lCQUJBVytqVnExY1VGQlJZQ0ZwZFpXV2xSU0FpSWpvbFNaSlkKK0JnQ2d0VlJVVk1UR2pSc3RCRzFxNk5DaDhmR1BmOXhDaUJreEF3QUFaQjR6TXdBQVFFWkt2Yjc5eGFZTEpZT3V0aUlBQUVCR2NHUUcKK0FBRElTUDhGcHhabldTMFUzN2NBQUFBQVNVVk9SSzVDWUlJPQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2ZpZWxkc2VxX2J0LmdpZi5iNjQgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZmllbGRzZXFfYnQuZ2lmLmI2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWI1NTdiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2ZpZWxkc2VxX2J0LmdpZi5iNjQKQEAgLTAsMCArMSw0NDcgQEAKK1IwbEdPRGxoY3dLZkF1Y0FBQUFBQUVsSkRLK3ZyMGdTRWxZTURDOGtEVjViRUJjSE93WUdTRVFPRG1FYUdnb0tPQmtUVkMwdFZ5QWcKK2FEY0pDNk9qb3lzOERBQVlHcVNreFY5ZkZGdGRFSm1abVVBNEVGMHdNQUFBY0FvVEhUWkhKMGdZR0FjTVR3Y1NPMjlJU0ZVSEIyQVYKK0ZYZDNZQWNITVJVVlFpSUFHZzRIVDN0N2V5d09KM2QzZHdjSFNFRWdBQk11RG5kM09HcGtTUUFBWWxaR0J6RUVCR0psRENzdEN4d2MKK1dRY0hTemtSR1dCdFlDMEFBQ0EzQUJBS05oQVFUVE13REEwVlFENEFBRVlWRlZWVlZTUU1KUVVMT0I4ZlFTY25ZQmdZUkQ1VlBtWm0KK0RFWlJCMlppREFvS1NnQUFWQXdRT0g1K2xCd2NTKzd1N2hvYVNUNCtYM2QzV0FDUEFETXpNeUJSSURnQUFHQmdjMEpDRUhFQUFFd04KK0RSa3dEQW9LT1I4a1BaUjdleUExSUFCcEFCZ05RQkE5RUFCVkFBc0xSd3cvREF3TVBnQk5BRU5EQ2djOUI4ek16QVVGUVFCREFENE0KK0RBd09LZ0FBY1FBNUFFdExGWXFLQUEwTlRDOEhCeEVSRVFnZkNBQXJBQUFwQUNJcU1ra0dCaG9xS253QUFBc0dRNnFxcWtvS0NnNE8KK01sa2NIQW9aSkNjclc2U2twRlFBQUFBQU9CQU9Td0FWR2gwUk9nTVBIV1ptQjAwUUVHVUFBRlFhR2pFeUMydzRPTGUzbjRxS2lvaUkKK2lCQVZNQzR1WGhrWlVHSUFBSEpZV0hkM0FBQUFQaEFRVVFVR0wwQkFJR2dnSUJnQUdrSVZGVjlmRUF3Y0pSOEtKQThNVTlFQUFBY0gKK1ZSb2FZV2hvYURjQUFMdTdBR1ptWm5BQUFHUmtaR1FWRlZocVdENEtDZ3dPVXpNekRBQUFtZ2tsQnpFSEJ6RXhDbGhZV0JNVFBBWUoKK1F5OGZDRnBhQi8vLy8vLy9BQ0lTUkV4VURVUXJEQXdNVmhJU1NFWVlHSGQzSURoY09FUkVSRWxKQUFrUE5Uc0hGMWhZY2tnR0JqMDUKK0NGWUFBRGc0T0NBVk8waENEREF3TUx1N2lscGFEUjhxQ0RnK0VCeEdITjNkM1JFR05qbzlDRFE4REJ3WVJHWm1IRk1BQUJRK0ZCRSsKK0VTSWlJaHMrQnhVMEZXVmVCdzA0RFlxS3N4QXNFQjhoUUF3dURBYzJCd3dxREFvcUNnY0lMMWRNRFFBQTBRMGlEUXdpREFja0J4QVEKK0VEd0FBQUFBVTBKQ0RBa0pQcnU3dTVvQUFEZzRiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0g1QkFFQUFMd0FMQUFBQUFCekFwOEMKK0FBaitBSGtKSEVpd29NR0RDQk1xWE1pd29jT0hFQ05LbkVpeG9zV0xHRE5xM01peG84ZVBJRU9LSEVteXBNbVRLRk9xWE1teXBjdVgKK01HUEtuRW16cHMyYk9IUHEzTWt6NXowQVFJTUNTTkh5WjBXakU1R3FOQVpBcWNHbVQrOFZaTW9MNms2ckVwMEtmRUpsNDg5VkJjRUIKK0dHakJ3azhMQkpzeUZRcVUxNU1VZFFEVVdmVms0Sk5WY2NFUjVaWENUOCsvZ0FOL3hGcDBMRVd0RHhFZlJLbzQ0czhuMS9ZZUpDeVEKKzhHTysxeGhTYnZ3eFJXYWtsQkVpWG9WVzQ4ODZCTlcwRlFqa3llbTZsYVVLZExxS1N1WnJRSXh0cGJMcWM1MUpic0hCRmt3OHBZVVQKK3c0dUhESzJTTTBQbkNxSFBOaXo5dVdHRm9TMWZiN2g1dTBuUXNoZithcjJHMmlzQUtuNEZwcUJ5SFFpdm44WWtZM1dLOVJvQU5YeDEKK2t3VW5jQlZ3NVFDU2RBc0E4amlEWElBZUVRWVhBTWJncDBZS0tRQUZZVnhFUGJqZ1htL0ZCVVJtRDFwUXh6MXFzRGZVZEFWbENNQ0cKK3ZGZzRsaHBNZ2JPS1lYNklCWTVmSFg2NDJGQngwY1VMYm5LbFVGZFFrZ1MxSXhBOTFtV01CV0pSWVFGN2RaUTJIVkJJc2RoamJHNFIKK1dVZUU0ZjNVRmxRTjZoVWlVSzFwdVYxUTkzU3AyNExnbE5ZbEFHbW1LR0pydkJ4SjRZV3hpVWttTHpHeW1aNlVMbnFYQWxnQzVUbWoKK1FSRTJxZCtOa3dES0N6aVR3QWpjVDZyaFYxV1cyODAxM0QxMVVmSGZWckl0aWVDbkh3MFlWSUVIZ25vUlZ1dGxsZ0ovWCtGNTRoUCsKK2ZqVDFGV1I2OFdYYlhWM2RVNGN4bUJvRG5HcFNhWlVxcnUvTkpSVVZyVjNEWHJIQkFuQ05ycndtTjlDczE3aklDMitRVVVFVVk0WmgKK3F5eFI1MlgySWxGd0ZXU1VVVS84dG1PYlhCcnp4Qk5FaHZlZVlWQ2Q1d2Q1UkQxUmEzZVZ6YWpHUGVDb1NxOHg0cUoyWlhEZ2h2bHEKK3JGSkJCUjZ6ODJhR2JMYmUrVHFialQ5bE50Q3E0bnBIVU1ibHFRRU9VcjNObXgrVkpKSVZsN2FTVG9xUWFuL1p5ZGJNTk5kczg4MDQKKzU2enp6anpYYkdwRldBMHEwSWRLV1NXcnN3SWh5VXVUQXRuM0w5SUUyZGRzUVV6dmVGL0dLVUp0d1ZpclNBWkVDbGlMcG5VZHFtbnMKK29ja21sNTAwYWdDa3g2MjVZeG5scVVDVDZOYVUybGJMK3pEK0FLWE5wVEhLMDlMcjVNYUNrK2gzV3JJWjNmRFVMbmM5ME5kNGIxMlEKK1ZZNnpKdG1pVG5vYytMVitRWWlVZnVpeVM2bEI5NndIQUtETUFhNVRaQkMyN3ZycnNNY3UrK3kwMTI3NzdiakRIZzNONERnajdjOFAKK1lUWHpQVVVuVHZ4MVJnbC9QRmxVZ0JNdjJnTXAvemFKYXdVRnR1YWJUNmZVdWRURmpmeFlWazIvdVZFUkNtWDM4dEhyVGUvaVRhOEMKK1RoMUE0TWV2eXlrQ3NTdFY5QnQxamZ2d3kyODhsUTViWDV6WWNyM3NwVThnMVpNUTRnYkNIN0h4SWxHTGV0cDcvc09ZT2p4aFB0aHoKK0ZYNDBWUkRQcUE1NElJU0lxQWhrb04rRjBDRkJreGYwRkJlMnMxWE5hVkc2RDVXMDhzS3JHY1krWnVQYTVhQjNJN09CSTNMK3FIa2IKK0VQUFhQYmlaekFLSFNoOE9tNllkQUtvd1EvVExubFVPaHJid2JRZUtpbk5pRmFWU3VZRXNrUmVTSTRpTmVORkZnMVN0S2duUkg5bFkKK05aWVVTRW9wWDhOZ1dwSURsVlVSSkZhd1NkMEo5MmlRVzVES2hIemtUbmhTOVVBTEZxOU9wNk1WdVc1Vkc3UkY2b0Z0NDZHdHJrRXMKK3BSZ2pXY3ZTVmJDSWhyd2RVcXRXM3RMV3ZPcUNsRkNDU3piaUl4RzYxUFV0bHhuRFhmQnFvc3VzQWdRNDJUR1NId1BBajJURFNxYnMKK2trUzFyTXN0L3pkTHhqa01ZemE2Sk1XbXNoZE5RcXgwZkFrWUdhbmp5VzZKMGlpSFVrcTY1RGlRVjJhR1dNRkIwVDFFbWJWQW1qTWgKK2xEd25SUlMwTXZ3Y2NsSS9XWkNPVEFRbnBTd29QZ0QrbUlSVzZFbks2enlCS1laS21velFZay92cUlpS1BFS29XTlJBSHRRa2RDOVcKK1RObjREUE1sS2tJbGxsZHlZeTYxbUtLMVVBRS9BSTNhUXEyQ0pEYkJoVzJvWEpGSC9ZZXlla21sb2RlU1lVbmI1QmFBSXJFZ2szQ1AKK1FObFVtZ2k1NVVWTk1veFBOd3BKZDk1SE1rNXAxT2pzZ2hlNWxHd3JUYTFWMG5TcXpxcGFkU1hWbWNrT3I3ckhkQUV5TmJEUlZVK0EKK01EaXVtdldzSGNscVRPNnhLYlNlTUFWbFBjZ3FXZ012UmVXa1dtN05xMTR0b3RhOSt2VWpiMkZJTEYvRkU3UDg5YkNJVGF4aUY4dlkKK3hqcjJzWkNOckdRblM5bktXdmF5bU0yc1pqZkwyYzU2OXJPZ0RhMW9SMXVTZnhIdnRLaE5yV3BYeTlyV3V2YTFzSTMrN1drQmFWcloKKzJ2YTJ1TTB0Yk5PbzI5NzY5cmU3RlExd2gwdmMzL0sydU1oTmJuQU40aHJsT3ZlNXAyMVpRdkl4aStwYTk3cll6YTUydDh2ZDducjMKK3UrQ3RiZ1pVT0JCUDRPTzg2RTJ2ZXRmTDN2YTY5NzN3amE5OHoxdUloSEJERmZqTnIzNzN5OS8rK3ZlL0FBNndnQWVNWDI0a3hCcGcKK1NMQ0NGOHpnQmp2NHdSQ09zSVFuVE9FRVd5TWhTd2l2aGpmTTRRNkRsd2FpWWNWOFIwemlFcHRZdnA1Z1NEN2N3ZUlXdS9qRk1JNngKK2pHZE00eHJiK01Zc25nVjVCZUtKVXZqNHgwQU9zcENIVE9RaUcvbklTRTZ5ankrUkVHTDA0c2xRanJLVXAwemxLbHY1eWxqT3NwYWYKK1RJeUVWR0VLWUE2em1NZE01aktiK2N4b1RyUCttdGNNNWlvazVBVTRqck9jNTB6bkd6dEFOUGhRc3A3M3pPYytKem5GQzFseG5RZE4KKzZFTFRXTWNJNmJHZkY4M29SaHVaeVFoeDhwWW5UZWxLV3pyTFhVYklsOW5NNlU1Nyt0TnFkak5DNEd6b1VwdDYwSGRlVEo0ZHplcFcKK0x4clFDaEgwcVdkTjYwUHZtQmVLZHJXdWQvM29KbC82MThBT05wWXpmWkJOZy9yWXlFNzJtVVY5RUZMWCt0blFka2VxU2JkcVhsdjcKKzJxV0FkVUxPWVladWUvdmI0QTYzdU1kTjduS2IrOXpvN2pZWElJQVFEaERnM2ZDT3Q3em5UZTk2Mi92ZStNNjN2dDlkaTRUSTRnZ0EKK0Q3akFCMDd3Z2h2ODRBaFB1TUlYRG5CWkpPUWQ2SWk0eENkTzhZcGIvT0lZejdqR044N3hpTDhqSWV4SXQ4aitSMDd5a3FQYkRRaUIKK3dCLzJ6ZktXdS96bCt1YUFpcU5OYzFvaitpQzV4cmJPV3czcGcwaGEyRUFQK3FXSmJSQmpLL3ZvU1A4MHN3M2k3Sm83bmREVE5sZTEKK2QwNTFSbXNiSWJKK3V0Ym5mSE9ENUx6cVlOOXp6dzN5YzZHYi9leFdKbnBCako3MHRydmR6RXN2U05PM1RuY2JSLzFqVXcrNzNwRjgKKzlZTmt2ZTZBbDNIWEMvTDF2UnQreUdNdlNOblJ6bmpHcTUwZ2JIKzc1TjhlZDRMTVBmQ1liL0hkcDVYM3czdit4MzAzeU44em4vbkIKK0U2VHduL2Q4NGdteStNYTdQdWlQSDBqa0owLzdvMWQrSUpjbmZlQTNQNXZPcC83d29TL0lFT1pBL09JYi8vaklUNzd5bDgvODVqdi8KKytjVW5CRUorb0lYcVcvLzYyTSsrOXJmK3ovM3VlLy83NEs4K0xCS0NoV21ZLy96b1Q3LzYxOC8rOXJ2Ly9mQ1B2L214a0JCemtPUCsKKytNKy8vdmZQLy83Ny8vOEFHSUFDZUgvbWtCRDJBSDBJbUlBS3VJRFB4d1FJUVFqaEY0RVNPSUVVR0g0L01ITzZwM3VtVjE2LzE0R3IKK054Q3Q5M29pK0d1eEp4Q3pWM3NvQ0dxM0p4QzVsNEYweDN2djRYc2RxSGZCUnhDajU0SjB0NEU4Tm9PcDk0RUNFWUlqR0lTVFZvSzgKK2NJSXBlSVJzdG9LODBJSTQrSFF3ZUE4eXlJTlZWNE1EY1lOTitIUTZpR3RTcUhxK0pvUmVXR2xFYUlSSU9JYkw5bVpYdUh0NHRvWEEKK2g0Rm5tSU8zaG5wcXVITSt5QXRBK0lWMk9HVmhTSVo2bUlSbTJJWXZtSVp4U0lNTUFRVXZVSWlHZUlqK2lKaUlpcmlJak5pSWp2aUkKK2tGaUlTOEJ1QjVFQTgzQ0ptSmlKbXJpSm5OaUpudmlKb0JpS29uaUpPSkFRMlpBSnFKaUtxcmlLck5pS3J2aUtzQmlMc2ppTHFKZ04KK0NSRVBiSkNMdXJpTHZOaUx2dmlMd0JpTXdqaU14SmlMOFpBUWhoQ0p5cmlNek5pTWtEZ0NLWmNLb3ppTjFGaU4xaWlLQ2NDR2ZvaUYKK2J4aUllamVIZFhpSDR0Z0xlYmlINWxpR283YU5XL2VFVWVpTnZFYUZBbUdGNmxocldRaUg3c2hyNERpTytvaUhYbmFPL2tobVNzaUUKKzh6aHI3SGlQVTZpTkF3bHQ5V2lRVkplUCsvaVE1TmlQL3ppUlV4Q1FDVmx6QmNtUU9nZVB2RUFFSHZhUklCbVMzcFVCQW9BUXJzQUgKK0tKbVNLcm1TTE5tU0x2bVNNQm4ra3pJNWt5alpEQWtSQ2dTV2t6cTVrenc1WUtHUUVHSlFZVUk1bEVSWmxCUW1CaGdta2txNWxDQzUKK0NRZ2hBSTFBazFJNWxWUlpsVFBwQ2d6UkFHK3dsVnpabFY3NWxXQVpsbUk1bG1SWmxtYTVsZlJRa2dlaEFDZldsbTc1bHZCVlh3Z1IKK0IzSlFsM1o1bDNpWmwzcTVsM3pabDM3NWw0QlpsM0dRRU9Kd0JvWjVtSWlabUlxNW1JelptSTc1bUpBWm1ZWXBEZ21oQ1dkNW1aaVoKK21acHBsaVR3bENJR2w2QVptbTJwQUFoNWtUYlhqUnFKYlE0SmtmcFlqaFRwanhacG10Q1drYWxwYlJ3cGo3SlphQXRabTlhMm1xd3AKK2pxNzVtdVlZbTdsSmE3VEptN3AybThWSmo2aUpuTHJtbTc5cGg4RXBuSHBJbk10cGFzZnBuS3oreHBGT1VBUGUrWjNnR1o3aU9aN2sKK1daN21lWjdvbVo3ZXFRS1VhQkFEQUFMd0daL3lPWi8wV1ovMmVaLzRtWi82dVovd0dRTUpnUWE3RUtBQ09xQUVXcUFHZXFBSW1xQUsKK3VxQU1HcUJva0JEcmtBNFNPcUVVV3FFV2VxRVltcUVhdXFFYzJxRVN1ZzRKc1FicU9hSWtXcUltbXA0TGtISjZ3SjhzMnFJdStxTDcKK09RQ2xlWjJFdHB2YXlYTmRHSjEzT0ozVU9ZYldTYU9GbHAwM2FuVXpDcVIwWnFORDJtalFxYU5DeUtNOWVvUS9hcVIxSnFSSjJtZksKK0thVzYyWnhWdW1oTHlxUWo2S1JQaW9KUmlxVnlScVZicW1kWFNxWjFocVJueW1kZDZxV3ZCNlpoU250anFxWjJCb2h0YXFVTTBaMG4KKzJxZCsrcWZteVo0SThaNytNRnFvaG5xbytPbWZDQUdnRGRxb2p2cW9rTHFnRDRvUUVlcWhsbnFwbUpxcEhBcWlDQ0dpZ1BxcG9OcW4KK0tYb1FFTENpaUhxcXFGcW9NaHBvZHJxbVdwcW5ldmFtY05wNGNqcW5rbGVuclVwalpncXJScGFtdVlwamJNcXJTQ2FyczRwMnRXcXIKK2JvZXJ2eHBqdXlxc1ErYXJ5MXBqd2Vxc1JVYXN4V3AyeDRxc1NhZXMwZXBpelVxdFFNYVJXcm1aNUZxdTVqcVdhWWtRYkNtYTdOcXUKK2Naa1FkQm1ZOGpxdjlGcXZmem1ZQ0ZHWWtybXYvTnF2L2dxWmxJa1Fsbm11QkZ1dzVOcVpCeUVBbittdUROdXcrRUNhQytHUlREbXgKK0ZEdVNhbWtRSjJtVkdydXhIQXVUTm9rUU9ObVRJanV5SkF0Z1A0a1FRV21VS3J1eUxCditZVWlKRUJsV3NUSTdzOVhsbEFrYmxSMmIKK3N6cXJzVmpKcXQxcVk5TUtya0ptcmRjS2V4S3ByV0xhaHorcnEzZ3F0RVVHclVzTFkwSHJ0RDlHdEVVcmJObUt0TXJHclV2N3JVNEwKK3RWSHJZbE5MdGFWZ3RWY0xiRm1ydGNqR3RUL3J0VUxMa1ZIZ0FISTd0M1JidDNaN3QzaWJ0M3E3dDN6YnQzSkxBN2VHQVo0d3VJUmIKK3VJWjd1SWlidUlxN3VJemJ1STQ3dUtDUUVKMUFESlJidVpaN3VaaWJ1WnE3dVp6YnVaNzd1WlRiQ1FueEJWVlF1cVo3dXFpYnVxcTcKK3VxemJ1cTc3dXJCYnVsK1FFTGpndDdaN3U3aWJ1MzE3RHFJUkNJLzd1OEFidk1McnVCaEFXc1o3dk1pYnZNcTd2TXpidk03N3ZOQWIKK3ZkSTd2ZFJidmRiK2U3M1ltNzNhdTczYzI3M2UrNzNnRzc3aU83N2tXNzdtZTc3b203N3F5MVZuQkVibHNSWE5sRUdhd1JhNkFScjAKK0swbnpFaFJDY3hEbHd4WlNjUmR4WVNuUkl4UndzcjRHZk1BUGtRSlV4UXRBWUZkRGhSaHFRQ1NFaFJDaDhUQkdkTUh1bXg1cHRCM2sKK2dTSzRVUWNhWXhYS3NzQUlYTUltUEJDcUFSc1hwTUYrRUJjU3hVQjB3UlZKTkRua1pjRkVkY1BSSkI3YmNVa0ZVVXVBRXlzbkhNUkIKK1RGTXQ3RVZwVWtSVEVWWVpWTUVDaE1FR1pEVi9jeU4ySVVPcG9VdFJCTVJDbk1VSHJNRDlJUm0ra2txRTBrQ1RVY05Oak1NdkhFVlMKK2ZNWWNOY0phM01icW04SkxJeWxjRE1aMkFSZTNWaFZza1RJenN5MGVveFY2QkQzK2lsRXY1dk5WYmx6STNxc2tNWEl4L2FUR2hVUXcKKzJFSEdINFMvVHZGRkRyUVZWSXpDVnZ6SGhyekozcHRUbGRPL1pJSVlxM0xIQjNUQlRFdzYyMkZIMGJIREpPekRhTXpKc0F5Kzl2RkQKK3FIekdGeVJkQ1hIS3J5ekoxK0VoR2x6SlRRTS90MkUvSVV6S3NYek0xOXM4YVN3enZESXp1UXpKZUp6SHpKeS9RTEcvRzF3aVRYVTQKK2tZek0zTnpOM3Z6TjRCek80anpPWnBVQ3IzVE9yNFRMSDRGRTZQeEtjVVhPOEJ6UDhqelA5RnpQOW56UCtKelArcnpQL056UC92elAKK0FQMVl1VFBRQkYzUUJuM1FVZXhYckhQUUROM1FEazNRQ2IxWHBmUFFGRjNSRmcwaGp0VXpHcjNSSE4zUlBHUE1aaVV6SGozU0pGM1MKK053UFNYQVgreWlhOTBpeE4waG05VlhyMUV5aDlWVEtkV0RXTldFT0YwL0s3VnlPQ1dEZDlXRC85VjBIdFZ6bDlXRVd0V0QwTjFKb2MKKzBrdk5WVU85VjBkTjFEdXRWMG50QlpodzFWaWQxVnE5MVZ6ZDFWNzkxV0FkMW1LTjFZRXowMWIxMHpmd0NtcTkxbXpkMW03OTFuQWQKKzEzSTkxM1JkMTJwOUEyV2RXRGw5RFdQZDEzNzkxNEE5MWw1QU9DL05nV1JMWkQzMzFER05GV0tvdGx1YjF6ck5lWWROWkxBVzFZaVYKKzFQWkl0b25kMURUTjJJNU5wNUJ0MU1qVGpsUmIyVk9kVjVnOTJZZ1gya0x0Mlo5OXE2d3QxWkt0MmtGbTJvVzlnN1FOWkp0dDFsWDEKKzA0MzkyaW9ZMjFBOTJya2Ryb1RkV0VuTkNLbTYzTXl0bjhzZzNJc2RIdXIrb0tuVVhkM1d2YUhxQU4xNWxkT0UwTnplL2QzeXlRakgKK3pWaXBYZHhMcHQxdTVkdkFUWG5valZZNURZWG03V08yamR5U2tkbFV1OXMyN2RycnZhM3RmVmJ2VGRwZk85NkxWZDdtamQ4K3JkLzcKK2JYdjlYYzdFSGQvelRkNzFIZDlsdStCT2plQUpubXpNcHRqYjNlRG0vZUFETGhtRUN0NGlucXFLT2krOHJVNC9YYW5YdmVJc3JxbWMKK2F1SjZmUjJsT3VJMGZxcXJ5aGVuN1ZZRVh0d0dydFRoOGRzWHZtWVp6dGxXOWQ4Uzd1RklIZUh4M2VPdC9lTkJydURhRStPejNlRUMKK251U0dYZUFVM3RsTy91UVludVZGenVIRmplU0psZFRyNnJCbUxwcHlDZU1ISGg3NitxOXUvdVp3M3BnQnErYWlQUkFLZStaNERwb1EKK2krUCt0ODBManBBRmdCN29najdvaEY3b2huN29pSjdvaXI3b2dPNERYdDdiV09FTkxUdnBsTDZ5M3ZEbzZwVFRBdEFOak43cG52N3AKK29MN29qbERsWTY3a1dCN2xheTU3WE43bHFGN252WGZrcEg3WnBzN2ptSDVPNnIzcXh6YmtKMzVPUnU3Z3NYNVlPNTdiVE81WHQ0N3IKK1NsZnI1dFRyVks0ZU9ZNVdTVDBNYlJEdDBqN3QxRjd0MW43dDJKN3Qycjd0M0I3dGRJRHNnZlRUOEZBRzVGN3U1bjd1Nko3dTZyN3UKKzdON3U3djd1NUE0UDRNNUhPUTBCRDlEdCtKN3Yrcjd2M0Q0TXYvNVh3VTdid3k3UkZtN3NmTmpxZjZYc1lmN3ZmaFh3cWozdzBhM3EKK0J1OXB1aTdscis3cnpON245dTIwRUo5WHhUN3hCMC9uQ1EvbXVTMys1ckorNWJTTzhNUmU4Q0NQWmhVZjJSZS83SHhPM3dOQmZSVjQKKzh6aWY4OTAzZmlwUDhPRmhmd01ZOUVJLzlFUWZnQVhZODNyRjNUcS85RXlmOHhlWThUU1AyNmN1OGl1LzVTMHY1UE8rUndwZjhnelAKKzA3TXU3RmwvUWg5LzlTNGY5aUcwOWJSdDhzRCs5UUp2OWlBMDltUVBkMjRQUEdpdjJtb1A4R3ovOEhQL00zQWY5d0M1OTZaUzk1TjkKKzl3MHZHZTRHYzRpZitJcC9iLzJHOUI2UEZSRFhjWkkvK1pSZitSdjNjWTd2VnZXK2NvdmYrWjZQK0RJSDlSQ084bUNmK1dqVjkzNHYKK1ppL3Y2akVJNjZMLzRhVGY5cVovVnFpZittMEcrS0FpK0lkTitGNGYrM28vKzB4dDliYi85OENmMGlTZjlsMVAxWklSQW5uZS9HMysKK21lWWFudDVZOFExalVQM1dmLzNZbi8zYXYvM2MzLzNlLy8zZ1gvM2ZnUHVmb3VrTDYvem9MMThoa1B5b0xSbC9IdXJ3SC8veWoraU8KK1h2eGFQaENTWHVuNnYvOFNkdW4yLytVQXdVdWdnRzVaREI1RW1GRGhRb1lOSFQ2RUdOR2dJNEc4VWdDb21GSGpSbzRkUFg0RUdWTGsKK3lJd0FVbFQwVkVybFNwWXRYYjZFR1ZQbVRKbzFWVjZxZUEvQVBaSTlmZjRFMmxNblQ0RlZwaHhGbWxUcFVxWk5uVDZGR2xYcTBTbzUKK2R3YkZtbFVyeVlzNThka0VHMWJzMkpxZUtuYmRtbGJ0Mm9vbVVaS0ZHMWZ1VEp3Q2g3TEZtM2ZrM2FKVC9mNEZIRmhxVmJ0WDlSNUcKK25CRXRyM3RmNXo2R0ROZXN3TVdKTFNkMkt6QmxaTTZkNlZyK0pYcFp0RnErdkl3S1JwMWE5VlBDakEyUGhwMTFjV1BQdFcydm5Hd1IKK1kyemVXelB6d3VCSitIRGl4WTBmUjU1YytYTG16WVdEQXQxYnV0RFhYNnBjeDU1ZCszYnUzYjEvQng5ZS9QVXYwYWVmQnprN2tIUDIKKzdkMi9iNDdoN0c3MDlVSCt0cC9mZFdqOTlrdjNyKzgvQU0rcmJFQUM2VE13UC93UzdFMUFCbU56OE1IUklwVHdzZ0lySE8xQ0RHTmIKK2NFUExLUFJRTHhCRHhHdEVFdGZTOE1TOFVsVHhNQUJXdVNkR0dXZWtzVVliYjhReFJ4MTM1REhIU1Y1clVVUUFKdW14U0NPUFJETEoKK0dIL2tMMGk4TGxJeVNpbW5OSElWQkoxRURBQXR0K1N5U3krL0JETk1NY2NrczB3em04U1NORFBYWkxOTk45LzBFczAwdDdyK0NFNDcKKzc4VFR6VGtUbzdKUFAvK1U4WWs5MlhvQ1VFTVBSVkxRUWRXNkJsRkhIOFZ4VVVrbnBiUlNTeS9GTkZOTk4rVzBVMDgvQlRWVVVVY2wKK3RWUlRUMFUxVlZWWFpiVlZWMStGTlZaWlo2VzFWbHR2eFRWWFhYZmx0ZGZENnJBZ0l3dnF5T2lKazF6RHlrdGprT1ZGV1dZejBtbEwKK2NQejRxRXNxUXJ0bWxUb0FBQ2NGUWFQdDhwWXZqN1dBQ2kycENGWWdiald5VWs1ZjM0VjMxeFNBeUFpSVZSVGJUYWVOMUFCQ1N5QVUKKzVRakl3dFJGVTErTkRPWmxXR283TXV3SmJRVzlwbzVWcnVGRkRTcW8wRWpnWnZsYmhZcUYvYURpM21ZQlVDT2piZDJOTjJXVlkxVUQKK0FFV2ZBR0JoWHZ6WWRtQ053Rm5saVNlb1dKYmhnbmYrMHhoaHF4UUR4NlBYWU9iSkdIb3JlcUxia3RCOHpRSndBT2JsQ1dDYnBlTFkKK21jMUZlV1d2djBZVm5IUnBydWdhc2ZPOWtoZGpGQlU2NDU4SjNxanRaM201QmdDS0F3N05hcDFKMW1nU2pOdUNPalFxSnRrb0JZeUgKK0xGcWdWWmdFdTNISFVaMVhjYTJOSVJMdGoxSklITys0Z1g3NzRDczFocnZxVmFpVlcyaU5Yd3NhbzUzQUtabVhPdXJ1K25IWlo2KzAKK1pVSHJhRDF5ZytVV3lOZzZVUGJTWmk5UEt2MXpkNTB0L3VtTlVIOTdweFJPQW5sajJxZW4vbEowL1VqOG5qcSt0WHlqU2VvdzVtNmYKK053OGQyclNGcmx0OHR5djZVUTJZVzJmLzcvSUJyMmh3N3crL1I0MmlGNWUrZXYvL1Q5TWs3SFdzT25FcFJtbkRYT3orK21lKytkbU0KK2dXZkozUEw0Y3hXbEZjdHA5RnVmUUlaRk5hc0Y2eXFzZTkwQ0FUaENFbUtvYnF3ajM5eXF4cmVRcEs2QktueVd3b3dXbXU4SkpHSVQKK3E5akZNcWk4aW5Uc1l5R0RtK0grQnJvU0Z0R0k5cUZDQklmbUdpNFpBMXhibW1FS3Y4VEVMUzNyaWRPcUZwZW9BTDlzYmF0YlZCTmgKK0E4dDFMc0xCcldWbEpPSVIxYmhHTnJiUmpXK0VZeHpsT01kUXBjQVlkOFNqTWVDSEdBdmtFWS9wb21NZ0JUbElRaGJTa0lkRVpDSVYKK3VVaEdOdEtSajRSa0pDVTVTVXBXMHBLWHhHUjk4clJKVG5aeVMxcEQxUk05T1VwU25tbFZvaXhsS2xYSkpWZ0J3QmpQZzJVc1pUbEwKK1d0YlNscmZFWlM1MW1jc09sVW9ucTlobE1JWCtPVXhpRnZONTdUcmxpNHk1VEdZMk01akdTSnVxZWxtcWFZN0tSS0M2NXFleTZTa1cKK25hcWFvL3BtcUxiWnFYRnlxcHliNnFhcHdobXFkV296amFJNnA2YmltYWwwVWxOcnlzaEhQdlc1VDM3MjA1Ly9CR2hBQlRwUWd1b1QKK2Z1MzBWR2xjMEFLR050U2hENFZvUkNVNlVZcFcxS0lYWmFnTHpKT3EwbFNpb0I4RmFVaEZTdEFvektlVldzdUhPMVM2VXBhMjFLVXYKK2hXbE1aVHBUbXRaVXBiTUlEVUxKK1JwaTlNS25Qd1ZxVUlVNlZLSVcxYWhIUldwU2ZVcU1qWWJ5TlMrd2FWU2xPbFdxMXRRQkpuM1YKK2IxSmFWYTUyMWFzeXhXbGJRSG1xMHZSVXFXZEZhMXJWaWxTbUZrYUI3Z3dOVkw4NlY3cHk5YXFVaVdhcXRGcitWNzcybGFaaFZkZFkKK1RWWFd0UmJXc0ljOWFsdjNrOHk0K3RXeGoxM3BYWFZ6MG9wc0ZiS1hyU3RnbXlWWVgvSVVzWjhGcldFVk8wOU1sVWF1bUVXdFZ5VmIKK1QxTDlCZ292Z0cxc1pUdGIydGJXdHJmRmJXNTF1MXZZTGdFQ1ltVnNSV3h4RE9JVzE3akhSVzV5bGJ0YzVqYlh1YzhscmkyYVN0YlgKK0dJSzMxOFZ1ZHJXNzJ4RmcxVlY3VFcxNHE2cFpuWnJUczZGRmIzb1RPOTNCUGxXODc1WHFhdk9LS3ZEQzE3NWd6U2xuU1VWWTlmYlgKK3YwdGxiMmNiZTE4Q3YxUytsQldJWlF1OFlIZVFWNy9XUE85L0pSemEwYjVUbk81bE1JTVBuRld0RVdFV0h3WnhpRVU4WWhLWDJNUW4KK1JuR0tWZnpoREFnQXVLb3FUU2hVTVdQK0d0Zll4amZHY1k1MXZHTWU5OWpITXc1RmdQZjdtaVdzMk1oSFJuS1NWYndKNzdicU53MTQKK1E1U2xQR1VxVjluS1Y4Wnlsclc4WlM1SG1SNHVEbXh3QlJJSE9aVFp6R2RHYzVyVnZHWTJ0OW5OYjRaem1lTWdaQWlIUmhOZHhuT2UKKzlieG5McE9neWF5cWI0WUo3R0F4ODhLc0UwYjBZU3Y4MW9SaVdOQUUzdkIzVWZyb0FoTWF4aEZPZEtiVHV1aENuNWJTOEkyMGt5ZjkKK2FmdGFtcU9ZMW5TcTJVcG5lRHFhMU9JTk5hQzE1b1FhMU5yV3Q4WjFyblc5YTE3MzJ0ZS9CbmF0VmZEYk1GODZOR2pZUmJLVnZXeG0KK045dlp6NFoydEtVOWJXb25HdzJzdm5CbzFoQnNibmZiMjk4RzlnTCt2S3BBdnpxMXBuWnFhQTZ0YW5iK0Y1WFR4cTZJcDgyTjJsaVQKK2U5VHpQbmQrQzczdWR2Y2JxTzgrOVlEeFRlOXhTL1BlQTc4c3VxbXJibjgzL04vWXhxYXJFZjdZZWh1OHNoUEhyTUxieTNDSE94emcKKzZZNDN4aTliY2IzT0d0d25SM25LZlQzc0Z3ZThJc2l1ZHN4bFBuT2FUL3ZhYmkzMHRsVytjNTZmWE54NFJUQXZGQ3p5dm1wY3dCWGgKK2Q4ZlovZkdGaDV6b2ppVTVmUS8rOU16cUc5NENTYnJTVTgzMGpUdWQ2bnlOdWplbi92V3ZHbjNJSE5kNnU3bCtkSUhJbSt5cUxYakoKK0t3SmxQdGZkN25mUDhwZGJEdkl4eDludmZ3ZDg0T0U4WjV4Zm5SZDN4bnZpRlY5M1B3T2R3eFh4c0pJbFAzbktuN2pGZTIrNlFHVDgKK1k4NTMzdk9mNzNHUUMrOXlnUlQrdWZLblI3M2ttZXg0U1YvODdYUTFlNTJSbnZaK3IvM3NYbjg5M0ZrdmF0Zm4zcXV4YnpYYWFiOTEKK2lNTVY5NzZ2YXRqVk9YYmtTeFg0Mlo3OThGVnRlOW0zdmZsZFZiNDlLektFWUhUZis5OEhmL2pGUDM3eWw5Lzg1MGQvOTVWQTdNMFcKK1doWkhnSC84NVQ5Lyt0ZmYvdmZIZi83MXYzLzR5Nkw0alE2TkVVaS9BU1RBQWpSQTlIT0R1Sk82M3J1K3FYcStpQk0rNlVzMDZndSsKKzQydEFtOHErMW1LK0M1eXBCelErckpOQTRoczl2dU1GdCtQQW1jcEFjTnJBRTRRcER3VEE2QXZCQ2Z5L25SSTRGcVNwRkJTVmNyUEIKK21ISkJHb1RCR0p3d0NvUSs2OXZCRzFSQXNkdStPVkRDSldUQ0puVENKNFRDS0pUQ0thVENLbHorUWtMQXZLNFRDQ3lZaGk3MHdpOEUKK3d6QVV3ekVrd3pJMHd6TkV3eTdFZ2hrMHI5Q3dCeXVFd3ppVXd6bXNRaVk0d3VWandDSnNRYXNqUFVNRFFoa2N3Y3dyUVQxRXdUdlUKK3ZnUWpSUHpLUXJiend6OE1RamJjRk5OS3hKakNRWFphd1VUc3dUYjhRVWZzTHlHRVFBdWNSSldxUkZEUndWQnNNRDRrd2F6alJBcUQKK1JIbVNPRk4waDFIOGxOOW9BbVd3eFZ2RXhWelV4VjNreFY3MHhWOEV4bUM4UmZFcHIwaDhEUkdRZ21SVXhtVmt4bVoweG1lRXhtaVUKK3htbWt4bVFVZ1ZiTWxOSVF4bTNreG03MFJtRzhBa1BVUUZrck5CSTB4MU5oTFJVa1I4TTdSeTFNbFhUTXdRZFRSM1lVeEhZc0ZYaGsKK0ozRHdvMzNreDM3MHgzLytCTWlBRk1pQjVNZGlkRVdlSWNpRVZNaUZaRWlDNUpwa1FzaUdsTWlKcEVpQkJJZjVPcFdLMU1pTjVNZy8KK1doVTE2TWlRRk1tRjNLTlRBY21SUk1tVTdNZE1Zc21XZE1tWGhNbVlsTW1acE1tYXRNbWJ4TW1jMU1tZDVNbWU5TW1mQk1xZ0ZNcWgKK0pNcnp1SnFLR0paaU9SYmVHUW5rQVpvdXNhTHo0UklzQW9tV1dacjVRU1dUUUNYaXNaYUZjYVVIRW9oK09TaG5jWmFpTkV2MGlKeUsKK3NCZDhjYUNLNEJkL0FTTWVlaUFYOGh5a3JBT1o2WWc2QVJnaWVnM2VFWm9VMko2UkthTm5nWmtPQVJJTE84dkVGQTNiNloyWXFRaWEKKzZaNk13Qm1kNFprb3Fzc3dncUcvVktLTkFKYWp4TXp5OFV2amFSWmpDTXhubVFSd09FMytDWkpMeFdUTjNoQWJnU0FiR3pxYnRoU0kKK3RhSE4xUlNlemdGTHVyRWJqL0FEbDFtRnErVEwwQWpOaktHWW5hQ0NwVUdZckttYmtqeE1SbXZONkVTUnBRR21pcUNjM2NGSXpMSE0KK3VkVE5KY0lnamdqT21YR1pGd0xOYVBwTE5Nb2Z4elNZNXVTRnJObWh6NVRPK013THhzUWR5cUFYN093STN3R2VMaEdlTHVIS0ZQcE8KK3pseVlPa0RQOFNtTUx1RUpVVHJLcXdETVF0a052eEdJR2xyTjRaSFBDc1dMNjhtZXdNUlA3d0VmOVZITnk2VEwzVXlmanZoTkxTTFAKK0JTck9Ia29jd3dnWmd6RVhMc0hMNTdUUUdjMExBYXBPM1VCUXVVbWdGdXFjRVBWT2k5ak1IaElaOFR6TzR5Rk84MFFRZ3pHTWx1bUsKK0VSVUlJQXBReEtUKzBTa2RpUk1xU1dacG0vY1JDYnIwVVFlU0lZNndHcndrVVBqc1N5VGx6dm5BQ01QSkNBbWRIeW1sMGpmOWlDVGkKK0NPeHNJbFRhemlXYUlsR0tTbW5CUzQxSXlvem9tSkZocGU5RXBhak1pTHFoRmlBeEYxNUF6VU4xekRZTkhqaVYxRW1sMUVxMTFFdjEKK0h6dmF4eXZOaXo3YVIwREMxRkFWMVZFbDFWSTExVk5GMVZSVjFWVmwxVloxVlFOeHBsaVYxVmw5SG1lNEJWckYxVnpkSlZSd0JsVFEKKzFWOEZWbG5pVlY4TjFtTFYxV0UxMW1TbDFWdHdCbVYxMWxsVmwxV1MxbW1sMW1xMTFtdkYxbXpWMW0zbDFtNzExbThOazJLVEptZFkKK0ZVa0FBRWtvMTNOTlYzUlZGV2ZBU0ZGQkM0UFVGQUFnVjFVeFYzWk5sWHRkMTFYK2NWZFdpVmQ1ek1GNnpWZDF0VmVDSFZoOFJaVisKK1haVi9kVXRJY2RnKzJVdUJWWU9IcGRnb3FRaDl0WXVLMWRnanVWaUQzZGlQN1pHT3hWZVFKZGtjcVFpRnJacVNWVmthZ1IrR1RiRFUKK2c5bVlUYkVNeUNtQjlRUjh3Tm1jMWRtZDVkbWU5ZG1mQmRxZ0ZkcWh4ZGxDRU5tSzRBYlFVOXFsWlZvZTQ0YWpGUWhyQUlPcHBkcXEKK3RkcXJ4ZHFzMWRxdDVkcXU5ZHFwdFFhbzVRWFRrOW15TmR0Wm9JR1RwWTk3WUFXaWRkdTNoZHU0SGRyY2NGbWhnOFdXSWkrYnZZMjkKKzdZeTY0QVdNYmNSVjdFU3hQWTNWTU56REZZeldBRndUREVYSlFsbmE0TnZJblF1NkJacExKTVM4ZlF2SjFWeXk4RnZBVlVYQlJTekYKK0F0ekNSZHorMGpWZHAxQmNnMlhjU1hUY3RYV016WVZkbTZCY2NSMDZXTVJjellqZDNLV0p6alhZendWZDBTTGMweFhlNFVXSzFNWFgKKzFVM0UxdlVLM1dWZW1KamQ5aE9JY3pDRDZhWGU2clhlNjhYZTdOWGU3ZVhlN3ZYZTZlVUM5cVBYaXVBQUFqRGY4MFhmOUZYZjlXWGYKKzluWGY5NFhmK0RYZldoRGI5K08vKzhYZi9OVmYvZk0vZ1FEY2QwQ0hBQmJnQVNiZ0FqYmdBMGJnQkZiZ0JXYmdBSDRIc1dXSDc1WGcKK0NhYmdDdmJlQkJRSWxJV0FQNURmRHZiZ0R3YmgrT1VBckNyRlVMeGRYdGlNNWxYaG14QmIzLzNkdFJKZGd5VmQ0cVZod3pWZVVHeGMKK3RWM2VGVjdoNXkzaFNUemhGT1poNXVWZGZIWGhGOTYwNEszaEpWNk5HeWIrd3JzVlJSMjJpOWNkWXQzMVljdlZ3eUN1NHVZdDRrMUUKK1lrVlRZaVlXNDhCdzRrR0U0aWpPWU5mZFl1YTk0ankwM1pyTjNEV08zUzRHd1M4R3JSakcxeGtlNHoyR2lqSkdYa0pVM2ltVzQ5eHQKK1k0RVlBanBFNUVSV1pDckVRblVSMkIvUWdraVc1RW1tNUVxMjVFdkc1RXpXNUUzbTVFaUdCYkhsd2pRVTVWRW01Vkkrd3pYMFg0TTEKK0IzSmc1VloyNVZlRzVWaVc1Vm1tNVZxMjVWdG1aWE1RMnpkYzVGNzJaVVMyd3pTdUNFTG81R0kyNW1ORzVrNytBUkxHNGlMVTRrR0cKK1hUb09YRHNHNDFUT1l6N0c1cWp3NHpOR1kxNTRYQ3FHNXNndFpMdmw1bWNPWjhtVjVpT201bFd6NW9yUTQyeUdaNm9RMnovV3cwQm0KK0RIRCtQdWZiR09mYU5VVnp6dWU5VGVkMUR0MHdqdWVDbm9KdDVtWjdodHgvM3R0OTV1WlRiQXU5WldpQWJtR0JydWEvbFdHRDFtaUUKK1BtT0Z4dWVKNW94eDVyNERKT21TTnVueVc3K0lyb2hoYUlPV2R1bVhodW1ZbHVtWnB1bWF0dW1ieHVtV3BvUDYzZCtlOXVtZnpyLysKK3hXaDhoWWN5TU9xalJ1cWtWdXFsWnVxbWR1cW5odXFvTm1wNEVGc0JQT21yeG1xU3htQnZwZzhJZUlDY0J1dXdGdXV4eHVsaFlHWTMKKzdtYzR4bDJRdG8yQXR1akN3bU4zMW1pRDVtZ285bWkydGcySExtZTFSbUc4cmcyM2ZtdTFpdXUrbU90NHJ1dTd2V3UvN2d5OVBtTi8KK1Z1ekhBT3pBUnF2Qk5vM0NOdXg1ZnVqRWZteklHT2ZJTzl2UFRyMyt5M1BraW5BRlBqRHQwMGJ0MUZidDFXYnQxbmJ0MTRidDJEYnQKK1poRGJ6V3ZhMjhadDBCTzlvYTRJTWZqYTN3YnU0Qlp1cnhVRHNTVmIwRWJ1eVZzOXJxNElBV2dFMllidTZKYnU2WTV0VnpocmdhQzcKK3hkUHU3YzQ3TUdzV2dWVUF1Ulh2OFNidm9EWGFkdTQ3d1ZQdjlXYnZOaU04M2hZSWNUaUQrYWJ2K3Jidis4YnYvTmJ2L2Vidi92YnYKKytSWUhzVVU4N2lid0FuK0R4bVB1Z1dqYjhtYndCaGR2QmJodWNtNXN2aGJpelphTHlKWnNwYUxzZDdac0pqNXNXTlJzQzVjTHhvWmkKK3h4Wnh6cTNvREo5c2d1N3dNZjV3VXd6eEV5Y0xFcjliRTVmeHNNQndGVjh2OUs3c0Z1ZmpGODloWVJia0c1ZU1DS2UxbmtQeUpGLysKK09mRVYyQUVBZ1NlSDhpaVg4aW1uOGlxMzhpdkg4aXpYOGllUEFiR0Z1Wm9EOHpBWGMyaTdPZmptaFhWSWh6Ulg4elZuOHpaMzh6ZUgKKzh6aVg4em1uOHpSZkI3SFZPU1hYOHoydmdaOUxjRjZBQUQzWThrRW45RUkzZEMwZmdBam5aeE9tY0NLSGl4elhjWGRqY1I5ZllpQm4KK1hTbStaMGVmY1VWL2FCdlg5TS9nY1hXTzlGN1ljRXJmWTB0UFhreGY2RStYWFU3ZmE1VmVhMWEzQ1VnZmRhRXFkVk1YWTFRSFpGWC8KK2FGbDNYbGVmY0ZqdmExK3ZDVnF2OVlmamNRN0g5ZFBWOVhybWRXSXZpd2d2QWo2bmRpVnY1Tyt1Q0VZNDlHM245bTdIOG1VUTIzb1kKKzgzRW45ekN2QjdGVmh6cFg5M1ZuOTNhbmMzWEE4MnFYOTUzKzgzT1VKUVJ2eC9kODczWkdBUFlTYjNSb0IzVXpGL1ZJdi9WbHIrRm0KK0w4SVlCM2lYb1BFM0Z2WUtYL2lXTVBaakI3QmtOL2hLeCt5RWZ2YUkvM1hIKzJGTS9IZU9kNG1KcC9pQ3YvamhSZmdkVkhpUkw0VngKK3ptNERoM25GMDd2UkZvandkdkNieDNuekZsc3lhKytlOTNuMWZtL0FsZS8vSnZxaU4vcWo3KzhBNS9FQmovbW10enNFUjFrQldQQ2MKK3AvcXF4d2NJOS9nT1MrNnRsenpSeG5hQktHM3FGdnV4SjN2WHBtMGV0KzNjVnZ1MTE3SGRCbHpmSHU2NGwvdTUzOXJpNXZIajV2cTgKK1Q3SGxqdnJuTHZ1L0IzeXh0KzZzUjJ0R2YzaVdIL2tVcDNpaU12bVRaL2FNNytpTlIzemM2UGNhRC9uSkx3V1NQL2JHZC96KzBrMTUKK0cxeDVrVy80dEQ1OHpHZmhVRjk4U2JmNHpoZmV6MmZCME9mNGNhNkU3YUw5MnJmOTNGb0N2ZzZFUytEOTN2Zjkzd2YrNEJmKzRTZisKKzRqZis0K2Q5S3dEbFRHRCs1bmYrNTRmKzZKZis2YWYrNnJmKzYyZCtWRFp6Rm1DRDd2Zis3d2YvOEJmLzhTZi84amYvODBmLzdtY0IKK3NiV3UyM2YvOTZkOVhGRDFRa0QrK3JmLys4Zi80dytFQ05jcmdVVVZ3QVVJWGdJSEVpeG84Q0RDaEFvWE1teDRVQklBU1E0blVxeG8KKzhhSkFpQkl4Y3V6bzBhRXpBQjlIa2l5WlFpUXZBQ2xLc214cEVZQXpsekpuSXRSSTgrWk5temgzdHRUSjgrZkhrRUNIZWp3cFVDWFIKK3BCZGhLbTNxMEtmVHFBOGpTcTFxRUtyVnFrS3pjalgrbW5MVnZiQml4NUl0YS9ZczJyUnExN0pWQ3lCYTI3aHk1OUt0RzdZVmdGWjIKKzkvTHRHeGV2WHIrQ0J3c0dUUGd3NHJuUkFDUnU3Qmp0S3BRQUpsT3ViUGt5NXN5YU4zUHU3UGt6Nk5DaVI1TXViZm8wNnRTcVY3TnUKKzdmbzE3Tml5Wjc4VytQZzI3ckNTSU9UdWZWaUFKQUcraC9zRkxwdzQ4cnJHa3pPWEMwRlM4K2h4dVZLdmJ2MDY5dXphdDNQdjd2MDcKKytQRGl4NU12Yi80OCt2VHExN052Ny80OS9Qank1OU92Yi84Ky92ejY5L1B2Ny84L2dBRUtPQ0NCQlJwNElJSUpLcmdnZ3cwNitDQ0UKK0VVbzRJWVVWV25naGhobHEyTjBURnZCaXpFSWdKbVNNTVNsUW9VYUlhb2hJMElvZmJ2Z2lqREdpbHdLSUlGNURoVEgrSnhiVW9rRTEKK05zVGpRQzBDS1NPUlJScXAxQ1FlK3JIU2tqNWE0QWN2MS9CWUlvblh1UGpoTmVDa29PVTFKdXFZUWdvZThySmxsN3hZUUFVVkhvTG8KK0I0N2dDRFRra1hIS09hZEgxd0RCeXlyWFBPRmppMHZ1ZUE4djk2eHlKWis4cUhIbmpSK2lHS1NMVkR6QkN6aDc4dUxvRTNYUWVTbW0KK21WcmtJeEJXK21nb0VDdnR5S2lJaFZwUW9sRlRZcW5sbHZkOENxZW1zY3A2NlNTcnFFbGlIYWNHdXNxalBRSXE2S1NHRnFyR1NoMWUKK1NlcVZrelQ2UktXek92c3NuZGNBME91YkxxNkNZNGtGZ1VuaW85ZUM2YUtJWGtKWmFyVWdua25GU212aWVPZXgwTHI3THJ6eHlqc3YKK3ZReDFDU2FZVnRhN0w3LzkrdnN2d0FFTFBERCt3UVViZkREQ0NTdThNTU1OTy93d3hCRkxQSEYxVk9ocmdiSzhHTnV1UWlTU3FPYUgKK0hxZkxJb25vSGxSSHlZdDZ1WktLeHFCTTVjdEs0a2pGdUlNS3RBcXNDSVVwa0owRGlaa3p5U1NPek12THhxaFlVTkhVQnVreWlTaXUKKy9HYkpZbEwwaEpzM0wyb3MwQVFWaldLTklyZnJzY2tHdmF6am1HaXVkQ3JUMjhaY2R0akcySXhuMXRxSzJiTkFQenZrY2JaZGUveDEKK3lhSVMxUExMdkxDWkk1UWg1N2pvMUZYanVXamhjUXUwdFloRmd6eFEwaWZuS09yZ05KdUpLNVZNRzgyMnFHNFBoSE5GRnRlZHNablYKKy91Z3h5SGgvQ3ZYbEJxR05NcE16Rno0MjRoZE5rbkduQXRHb2VwUXo1dzU4dWFNeWVyUFV4MHU2czVsK0N6biswRDFBUFBvRUVLNHEKK0RvN2pBeDBxVUpLMm9kU2lsOGtUVHlpTHhnTjcwSXJNV3pCMHNCWUJzU2dWQS8zZTRvMkg5emlxcXNmaktmNlZ5NHU1dnY2T3BiNTAKK1hTOTdBdGtlTDdvM0puSU5CQWhvNHArcThnYzhXeUZFUk5HYlh2V3VSTGVLdkU4ZzhUUFU5d2h5RCtIZDczZ1N2Tkw1akJlL0Myb3MKK2c4UkwzLzhJT0JEc1ZXUjNBdW5kQW9GWFA3S1ZyM3duWEJFRjBXY2I2YlVRVUNMYTRFVVNSVFdCTkFsNFQ0b1NrQ0pvUEIyeXE0ZFAKK1lOK3hubmN6ZlVVSlo2dUFraDlJVjVGSVRjcEsxR1BnelR4WVFoUDJVSDl3V3RIelZ2VEJpZ0F3akV5Y0gwR2VLS1UxRnErTngwS2kKKzZxNzR0UURDMFlkZkZKd1lLVUpHMHhIK0M0M0VFb2ppQWdpdUtmNnhpc2JMMDBDdU1hZ2pXbklpZGJTWkdNR0hJa0FPa21OYTVKanEKK1FJUkpucjN0bEhFOFpCZ05HRHlOVmEyUlRvVFNIaWs1U1QrdWlKU3FXMlVYTmRoSmkxak1UNUpDNDBEOHRLTzlnWXQxcFJ3ZjBYQmwKK3hEYTZjcGxxR0JSWVpEa21DenpoZ3lrNEdpb2x0Y3ltWGFsb3BwU2tHMzBZdFlzc01RVlFPaVlxQmVjM3lnbXRYTTQ4SlNwZlZvZHAKK3ByT2Y1Ym9tbmx4bGtUQjE4NGJpQkJJcDhjWTF3K1dObHhVY245N0FNVHlIdEJOS2svQURNcE01ejhmVk0zSWVXNmcvdFpZamNPUXkKK3BJVWtGVUN6U2N4cktGTjZHWlZuajVpcHQ0WVM4cUhueEoxSGRyY0tGUFVPbVlmYUtFVFBxYitFQ3FUK29OWFVIekExQ2FMNHhVK2IKK2g4SllvSWJXb2l1bVFHbEJmU2J3M2xoVGJScmtmUi9zS2NkK0trUWZVcktYd3hTUlVhbXBWbVF4Tlo0TGVhcXlVc0RQcWE2Q1YzemMKK1pVMTVOc3hmY2xHVGJxV0lWMXRJUGhHdUFxaWwvQ0U2cjNTb3BMWnlyY1ZycXpaMTZyUzUvaTFVWTBXV1EvVnFVOGIrMVNKMitxREgKK2NuVXNRVmxWa3E5NzRlZ2d5S2dCNWpWUVJLU2VRRk5RMk00bWhBcTltOTFwTzNqWlZQb1JoVytiSW11NVdoQUwxQlYydVdvUmFXMksKKzJkWUdVYTJzUmEzdll1Z2kyV0p4SXJhMUVvMWN4cjQ5Y1ZHWHAzMW1jODMzMmd3S040L0ZCWnpSV2dSQTVRNDJyeW0wWXZYR0N5am8KK2JyTnVJNk11YlEveVdkL2hpbjMreWQwdFh1a2IzaDZ5RUxiNUJleEdQVXFpYTlYVHV3eE5GK3ZBWmxqSitjNXNtV1dpN1Z3a0xVL3AKK2JvNnFLNW9Bek9uZ2FEWU5ieXVwM0c2ZmRtQ0cxS0Z3cEJJWmc3UGxZQk9UT0wxOXM5ekhLaHcyK29LdVdodGVjVUVtNGVGeWV1d0UKKzJDUFJYV2M2MCt6R1RybVphOXhJV3R4REV4OVp4cG1sOE5aUWpMU1BDaTdEcmUyeGhnSEFZZmNsbUtNTHhoWlFJNGczaHFLdHlaZDkKK01qUXBKdWM1eStoZStPb3VSL0FGcHZtcVozMzQ0dDlGL0F3bVFHZkZ6dm42aUtGVGdPZno2Rm11SXhFMDg2NXpqMGFQSk5HTE5rK2oKKytkeVJUTk81MDU3K05LaERMZXBSazdyVXBqNDFxbE90NmxXenV0V3VmaldzWTkxcTBmck1VZ1ArRVdTZ1VMSVV5NERvSHBMaGRhNE4KKzRtdktnTVBGQi9GMXJwUEhtR0ZiWmlXWDZiVmxOSmNTVFd2TjFyZGVSUjBBVUllcUh1VXkzYVlNRHZrSWhOOUtLM2QrWXd4R21FMloKK1lLZkUyOU11aUxxTHJSQmtwd1M1SXNFTWlERHo3Y25JbTkxZEJjRHdYRFVaM2FwN01yK3FUTDhSRW0xQW5lUXkxSloxVkZKZ3lYRVQKK3hDdjBydXpBU3pzUWRNTmJNZysvT1BSMGJRRXBJd1RadnE0RHRUaCtGRTJyUE9RVlIvbTdEZUtIeWJpNG03MVRnMjFYZmhDT1B3SGIKK3BYMWtNcTJkd0VoNkplYlh6allQaGExcmx4dWRJQzMzOThpTjNmRnVvdzdrTFgrNnpuMEhjNURmZWpMelZBTUFsSFhGclMrZDZXWWkKKytjN24yM09ZZXcvaTFnSCtlNitlQUFBWCt5SGJiUzhJT0hqVlRWaGhuZDU5TDd1L3h4VEpxZnZheWxkbitjZkxqbTZzODJMY0ZQZGQKK0pNRnVKY2EzM01vRG1RUzEwYjdqZTlnOTY2TXpuYzlMRG5pL1A3enBnZDlTUXZ6dXNsNVpIZkZwZC9yQkR6SUpjTXllUmZOTVUrRE4KK0x2aUVxRnp1Zk9hNjI2MENEakhWUFpQRFJ3bndqY0Y2d0c4ODhaN1gvZDE1Sm1iUjV4cnNpem84N0pWZWtPbGpYZTUrR1BsQXFJQTYKKzJ6eUs4cHEyd09CUldWeU5BYnlvdE5mMTB4MzlmQkdPM3VPdnB6OUJmbnhzaitjODhOZzN5TldoQ1BCTmlxSzFIL3ZsamhwWXlRQ0MKK25QNEJJSjlWQ3JVTVlQQkZITHZNMXB0Z0h2SXhuL3lrWC9OcG4rbmxYdTR4WHJBaDIrLytOTjMvNFovOFpBeldnWi8zelY4SE9pQUsKK1p0SnZNWkd0blluOHlCWDhsWjczWEJvSWt0NzlRWjhJa2g3WVFVbnJaUjhNK283TkFGKzVFV0QwVFowSHZ1QVI5cHl4U2VBRU5nWGMKK0VZM0szQW05U2VEWTZXQzdWY2JkWGNaS0FCL1hCYUZJSUJ2VmVNZ0pmaUZsaktGbDBCcldXVmJqc1lzSVB0dnpjZDFGblF5VUFFSEcKK2pKQy9pZURJalYvSFZVYnNzZUZraU1qVGxhRU8rbUFLb0Z3UmJoeXdHU0pTZ0tDUWNZK3RTV0RCWmVEMjZhQWRRbDhWU2tXYStFSFYKK2NONmpiQ0h6VFFMSzhLQUwrcUFUeG1DVVROLytzUnNwcnVIZkVjUXFWTTNUeVoxbFBJcjREUmVnbUY4ZURkNWVqUW12VEYrbEZPSUgKKzNnTTRnSU1YOXFEKy9SMmg3aldnRTNJY0ZZREYwcTBoRkZyQTlBRWZGVmdHTGhtZ2JYaklBaTZkTkJwaEFvRWpGWDVpVWt6Q3VJbEsKK3d4RWk4TFVLUTlSaU10WmZ4WEZnMjExY3FOQ2k4ekhkMDZGZjEza0k2blVkbEFCamtNd1Q5U0NFR3VUS0IyV2lzMUViNXdsaUxFNWoKKzZTWGkwZzNrUkhJYzJCV2RDVmFrNjNGZEExYmptOHlUWlkzalBmS2U2eldoT2thRnRFaVVCM0tkM0UzVUQvcGpQOFpnMUtYZUdlcGEKK3BmRGpFN0xiMDFrZUVOeUp6Vm5Kalh5UVFhNmQwbGdBb1VFSzdUM2gwL1VpUTVEaE0yNWlLOTRrOVJsZHc1bmpCM1prN3BrSVFhQ2kKKzkwekNvNkNpQWpMZnhWbmxENEtsSjY1a1UxQUJCNXBpWlJoREpxS2tCK3Bid1VIK0c3RkpIZUV0M1NUUW9yY3g0TnhKSWdTQW81bE0KK2k4WmdtN2JabFNRdVhtV0VtMEVseEVrczJzVjVtOE5kSlFwaXhpOWFScTdsNWJ4TjVhUmNJOHRWWnN0cHlXYTJZVk5tVW1BR1NqY0MKK0FNR0pZV2tDUU1MdFhHVWtYVHF5cFczZUptN21wbTd1WnA2NURqbmhSSnZoelZKU1NIQTZFMDYwak9zWUZuc1VaNDd4cG5NK0ozUkcKK3AzUk9KM1ZXcDNWZUozWm1wM1p1NTRENHBuZCtKM2lHcDNpT0ozbVdwM25LcEg4Z3AzbXVKM3UycDN1eUozcjJCM08rSjMzV3AzMlMKK3A0TEE1bjN1SjMveVp6YzI0Mzc0R3JiMEo0RVdxSG4rWjRHY2hJRXVLSU9DSnpob29JQk00b0Q0R29EcUI0VVd5SVVTQ0VjS3lJWVcKK2lJUUtTSWIrVHFnSTlrZUljaWlFOWtlSEVzaUhCa2lKc3VpSThrZUxBa2lLL3NlTVJxamZlQUVtNUtpTzdpaVA5cWlQL2lpUUJxbVEKK0RpbVI2bWpJVldoK2hPZ052QUtUTnFtVFBpbVVScW1VVGltVlZxbVZYaW1UM3NDUkpxaXVYVU9SZmltWWhxbVlGcWtYeU0rSkFvaUUKK2VrSXByQ21idHFtYnZpbWN4cW1jemltZDFxbWRydWtsYkNtQmhHZ1ZUSUdmL2ltZ0JxcWdEaXFoRnFxaEhpcWlKcXFmVm9HZURralIKKzNRTSszS21rVGlxbFZxcWRlb0taNXFmZnFLbWxkcXFuZnVxYzVxbjNJQ2wrOEttaW5pcXFwcXFxSmlxamppcVhRaytrZ3Fxc3ptcW4KK1lxcnZuT2wvcENtdDdpcXYxcW1vNWhxcDNvZXByaXF4RnF1eEdtcXJBdXYrcTlwR3JQYXFzejVyS2RqcW1PQ3FmK2dxdEY3cnJ2NXEKK2pQN0hzQjZydDM3cnFpYnJ0dnJIb3pZcnRwNnJwMHByalFhSWhOcEFNcndydk1hcnZNNHJ2ZGFydmQ0cnZ1YXJ2cjdyQXpRcWlLcmMKK0ZvU0R3QTRzd1Jhc3dSNHN3aWFzd2k0c3d6YXN3RzZCdndaSTBSSEN2bGFzeFY0c3h1NnJEV1JxZ2tpb0E3Z0R5SWFzeUk0c3laYXMKK3laNHN5cWFzeXE0c3lMNUF4QUpJaUJKREw4d3N6ZGFzemQ0c3p1YXN6dTRzei9hc3o4NHNNYndzamVyYVBjd0N5eDR0MGlhdDBxNnMKK0EzQXNnbmpzMGthdDFFNXR5cnFzcSs2cHlzbnN6MjR0MTNhdDEvWnMwRjZ0b3hLdDBWS3QyWjV0MURidHJXcnFRSHdzMnI0dDNGYXQKKzBQcitSOHgrcmQzZUxkN3liTmdxcTRhU2JkeitMZUNHck5wT0s5c0toTnNHTHVLaXJkWHlyWWp5bWRibUxlUkc3dGZ1N2JpaXFOOG0KK0x1WlM3ZUN1SzVyNkRRcVVBT2lHcnVpT0x1bVdydW1lTHVxbXJ1cXVMdWgrd3R5U3FNclJBaHZNTHUzV3J1M2VMdTdtcnU3dUx1LzIKK3J1L09MaTI4TG44VUhRU3dydkVlTC9JbUwrdWlnTk1laUxXaUsvUldxcmErYUlDcVhKK0NLL1ptNzZHS0svWHFSN2xHTC9oT3FycFMKK2EzODhiL2llcjV4T2I3RGFSN2Rxci91K0wvZXViMzE4TC9yV0w1eU9iK0h5QXFmYUwvL2lxZkJXTDU5ZDcvc09jUGJHNzdJR2lybjIKK2IvM2liOGQ2cnZJK01BUkhjT3E2cnRqK0s1OVJRdzVrc0Fadk1BZitkN0FIZnpBSWg3QUlqekFKWnpBMS9LLzM2bHJ4U2pBTHR6QUUKK00rL2FObkRiWmk0TlIrM2lWaTZNWnEzazdqQVBneTBLNThlamxtME5EekhMYmk3NThnZlVFckVTeTIwRnU2amo5akFVUnpITlVtNzMKK0F2SGxMakVXazZ3UjUrL2hackVYdThNTlYzR3A2ckFVbC9FT1U3SDgwa2NRZnpFYmI3RU1HeTRiZjNFWXAvRjgxSzBaMzNIZW92RUIKK0YyMGNlN0ViUDYzZmhJRUpEREloRjdJaEh6SWlKN0lpTHpJak43SWpEM0lmL1BBWTgxbkFPcXdsWHpJbVp6TERRbXdUeTZpdUVjSWoKK2g3SW9qeklwUDNJWU5LK0JtSzhDbzYvNllxajFFakFzZzZzQjl5MnNyakwvTWpBZ0Q4VCsydkw1dGpMV0JuQXNCN094enZMWTFqTCsKK0w2TXZManZ2cGg0ekswdXlzTDZ5TUVkenFoS3ppUm96TTROdk1xZnlNbDh6K1BweTR3NkVBRXV6T0crdk05c0gvWEl6OUdhemgvck4KK05wQ0NPNzh6UE1lelBNOHpQZGV6UGQ4elB1ZXpPN05ET2RkSGlENkNEQVMwUUE4MFFSZTBRUjgwUWllMFFpODBRd2YwSS9Tekdxc3cKK0dlZ3pSVmUwUlY5MFBtOERLcS96RFBjeEZzK3hLejh4SG8vMDVFTDBmS3l4UnkveEh5dHpSNmMwRVlQMEx3L0U0NUkwVGZ1c0h0T3kKK2JRaXhTOWZ3U210elMrODBEY1AwTnd2RVROZTBVZWZzVFJkelRnUDFFUGMwUnd2RUtjeUNWRTgxVlZlMVZWODFWbWUxVm04MVYzZTEKK1ZDK0JTY3RIaUZLQUtwUzFXWjgxV3FlMVdxODFXN2UxVzcvK05WeVhOUVdFZFh3VW5RQmtnRmZudFY3dk5WOTM5U2xzdElyNmpTTmsKK0FXRVh0bUVmTm1JbnRtSXZObU0zdG1NL05tSDdBRjNEUjRpS3d4bGNObVpudG1adk5tZDN0bWQvTm1pSHRtaGZ0amhNOW52WWRUZEEKK3RtcXZObXUzOW1NN0FtQVBpQ3FqODdWNnN3V0Q4empuTnJLYXRudWNNMjFqcXpvSHRpNy9OcnJhdGhQanRtNG5kNkJTczhRU2JRSVQKK3Q3TUd0Mnh2TTNSRHEzSERMRFFydDNZenR5ZGJjM1ZIZDJ6YjZFQ2dRQkNVdDNtZk4zcW50M3F2TjN1M3QzdS9OM3lYTndVejdtMEwKK3hBeEVBSDdudDM3dk4zLzN0My8vTjRBSHVJQVBPSDdQQUcrM0IvR09Rbnd2T0lNM3VJUEROd3dUN2h2elFoY3pkZUlLZFgzKzgwSlIKK0h6V0hUL0dCc3dkS1d6am1PclZ3dzdHSVl5NkdIemRSZHppTDEyeFNWL05TbjNqaWt2aDAvN1NNLzIyS1k3ZEl0emlMdjNoelE0OU8KKzMzamMwcmg0bTdpUTQvaUhyNGNkODNpSCszaDN4L2lSRDNsNHM2dmZQRU1ZWERtV1o3bVdiem1YZDdtWGZ6bVloN21ZWDdrT0pMbDYKK2hHZzEvSUthcnptYnQ3bWJ2em1jeDdtY3p6bWQxN21hVjRPWnA4ZkVqam1mOTdtZi8vbVlQOE9VZCs1d2YvZXpYamUzWnJkMkp6ZDMKK0Q2MTNHL3F1U25lUjZ5K2tPeXVpMDYyaUwzcHVOenE1T25lbDk2cWtVM21oZnpxdFhqcnNBck9tTTNxZXo0aW5renF0aGpxaEM4UXUKK3UvcW5tbm9PbzNxcWIvcXFNMXFyMHpxb3ducXVzalArUmc4N3NSZjdQZk56SnljNm53RjBRemU3c3o4N3RDLzBReWQ3cHc4RUJFeTAKK3NXZTd0Zys3UnNkd0xodDVsTDl0aml1N1RETjVqKzg2cGwxeHVLTXRrWXM2dUsrNzJZNDdwdSs0dVJ1MWt6czZsTU83MmJaN3JGTzQKK3Zpc3V1cGZIa3RkN1RkOTd0ZWY3djBzdHZ3ZjdRRVIxWHo4OHhFZThWb00xdFovNlFGUkFYR2U4eG04OHg4TjFCUVE4ZWRnMVhrczgKK3laZjh3LysxdDdPMFFBeTJhN2U4eTc4OFkwdDJ4ZC82UUZqMmFOODh6dWU4em9kMmFjLzhmcUEyekFlOTBMczhiS2U4VDh1NnI4dXEKK3JRTXdjdWY2T0hPNjVUNTYwbGNxc0ZjcmRVKzlwUzY5aFdhNjB3c3oxQTl2cjJNOTFRODZ3eU85MkdjOXlJOUgrM2IrdmRlbnZYajQKKzl0bExhdFdYcjkvNHdnSGNQZDdudmQ3dlBkLzN2ZC8vUGVBSHZ1RGZQVGE0ZlhpRWFEWWdnZUl2UHVNM3Z1TS9QdVJIdnVSUFB1VlgKK3Z1Sm5nK0dEQi9FT1B1ZDN2dWQvL3VEN0F0bGJ2WTBuL05MS3U4V3ZPTUhiZStaL1I0aWJmdHFPUHQyWFB1d2pMZXJUdk9xdlBrMGIKK2ZOUWpmTzBqN2NLVC9ydi8vdEhlUHRQbnZ1NlBOTytEUFpBVC85SUcvK3dQdi9PcnJQRnZQYjBuL3gwdi84K3IrL1F6cmV3anNkOGsKK0F1aVBQL21YUCtBWHZzOWIvMEJvZytXM3YvdS9QL3hYdmphMHZuZE1yUG5mUC82WGZ5SjgvMzdNZHR6N0trRHdFbmdQd0QyQkJ4RW0KK1ZMaVFZVU9IRHlGR2ZFalFvTUFxVXpCbTFMaitrV05Iang5QmhoUTVFbU9WZ3hRbHBsUzVrbVZMZ1NrQW5NUlhpbVpObXpkeDV0UzUKK2syZFBuejlwZWpvSTAyVlJvMGRkQWtoeDBCTlFwMCtoUnYxNTZXUkJwRmV4WWtWcGtXUlhyMS9CampRNTBHcFdzMmRWRWgwNFUycGIKK3QyOTVDbjBaRTIxZHV4Q1ZNb1c3bDY5YnFtUXIzaFZzZHl1dmkyRVJKMVlNY2l5dndvTWhaMVhybUcxZnk1ZmpEcVVibWZQWnZBSWQKK1pSRTltblJwMDZkUnAxYTltblZyMFQ2cUJ1NDh1MlZoY1dkdzU5YTltM2R2MzcrQkJ4YytITGU0MkxTUnM1d3NvSnRyNTgraFIyL3QKK1NITnk2eTAvOHpvMWkzdDM3OS9CaHhjL25ueDU4K2U1THpsK25YM0R3aFZVeFpjL24zNTkrL2Z4NTllL24zLysvQXJyMndzUW9lVXkKK1FNL0FBeEZNOEx4VHFoUFFRWVd5YzhDZENTbXMwTUlMTWN4UXd3MDU3TkREQ1Y4QThNSDJDaU9tbHhOUlRGSEZGVmxzMGNVWFlZeFIKK3hoT0pFWEhFNnlhN1o1WVBlZXpSeHg4OWRLREJHeCtNRU1namtVeVN3eEFCSTVMRXNuZ3hjY1lwcWF6U3loaHJiTkpKSERmVFVja3YKK3dVUlN5TG0yZE5ESU1ORk1jMGtieSt5c3hDdmhqRk5PR0xOMERNbzJaOHR4UnpYNTdIUENNWG1aREUvcnNqdmtoVU1SVFZUUlJSbHQKKzFORkhJWTFVMGtNTllYUFF3UXJMSnBOTk9lM1UwMDlCRFZYVVVVa3QxZFJOczdIMDByc21nMkNKU1dHTlZkWlpKVDFreUZWcHk2NHAKK3pIanRsYWEvN0pRTlY4RUtPMnl4WTVIK0RhdXh4NFpsdGN2S2ZJMldMN2tDM2F4WnpuU1ZWdHU5Z0dYMldyU0tUVmJjY1VWYTlzNXYKKzBjb1IybTNaZllwYVFkRVZMTnQyNlhXcTIzUGp6U3BjY3ZudHR5UlY4ejFLM1hvSjl1bGRhd091YTk2Q0djYnBYbUVUUm1wZmZ5bE8KKzFseUlJelpxNElZNXJ1bmdqTzNLN3Brd1NDN1o1Sk5SVGxubGxWbHUyZVdYU2RZQllKQlhLcXlhWDNET1dlZWRlZTdaNTUrQkRscm8KK29YR3VabWFhVTVxTUVKaVpidHJwcDJGKzVsYWtyenJUejZ2RFpESllxbzk2Yzg2dndZYXpUbSs1VHF2TFBiRk9PMGxBNFMyN0tLdlYKK2p0dEhyY2wyT3lLdnc4NWI3eGZIeHRmdWlQU1VXL0FlMlViNGI1YmdIbHp4RE9uMiszQ0g4TjViOHNuKys4YjQ4WVlDWDF4ekRBdS8KK1BLbWxCSkp3ODlFcGJOeHl6eFdLZlBMVnc2NGNkY0RQSmwzMnpsOVhLYnNtbE1sZDk5MTU3OTMzMzRFUFh2amhpZGY5Nk5vTEUwR0sKKzVabHYzdm5ub1k5ZSt1bXByOTc2NVVVNC92WEpyaW5lKysvQkQ3LzRKcWF1L2FIc3pGK283dlMzWmw5OXg5bHYyMzB5NTNjSS9mcmIKK3gxOUwvZlBYWC83NS82ZS8rOVZ2ZmVrcm9Qa09XTHNBeHM5dy9PTUZBTUJoREFsT2tJSVZ0T0FGTVpoQkRXNlFneDNVSUJYZ1owQUEKK1VNR0RKVFRoQ1ZHWVFnbUM4SFRwZzRrS1lSaERHWm9RSEEzazN3eHhtRU1kVGxBTkR1U0ZHbllZUkNHaXNJY090TUFRa1pqRURQcVEKK2lVMTA0aE9oR0VVcFRwR0tWYlQrNGhXeG1FVXRicEdMWGZUaUY4RVlSakdPa1l4bE5PTVowWmhHTmE2UmpXMTA0eHZoR0VjNXpwR08KK2RiVGpIZkdZUnozdWtZOTk5T01mQVJsSVFRNlNrSVUwNUNFUnlRc2dyQUloMXdCQUVWOXlrQkJDRGdDVnRLU2RCR0pKVFdaU1dBU3gKK0pEajhRTWxNR2dNaEJIbWdKaXRKU2xSV01wT2FCQ1ZaR0FLRVJ5YmtIc2FvSkJDSzZFbE5Ha1NYRUF3bFEyQ3l5bnYwOHBVS1VRTWoKK3o5ZkNoRmhsa2lzcHlCT004WVJFVHZNdWZxZ0RRaVlCamdGdDVseFBXRVVkUmdqSjFCbk9sQS9FMkxuS3lRc0wxT0dYNzJ2bEpLcUMKK2tEdjVEVW9wcUlNMDA0bVFKMVFTZEFKUkF3RGcrUVI3NHJPQjZWeG5PeG1TejNUQ1JKb0pNWWIrT0lGNWpaUllKUVVTellwVkxJQk0KK2FtN1VMT3c4Q0JYNmVROXdTbEpZcTZDQ1JML1owSEd1MUp3TFFhZTFVcUROaE5JRkFNYTRKeXhKS3M5enlzWXErVHhJTnJPSkVHUDAKK2t4ZFVzQUFtV2ZvU21ickhXdms4bHhxV2VsRmxKc1VnVDZpRFJUbWExYU9zQXBuN0xPSVR3REVKYmdvckJZRnhuRStSU3M5T1dzdVIKK1dLVWxUZTlCQlNEZ2xKTTZkU2xQZTRqV29sWjBscnp3S2tMVUlGRzk1ck90b295bkpOMGFLTkFad3dJMU5Db0k2M0JVcTZnQnNxQ2oKK0xEL3JhcFVueURLeXBGUkRDdXo1R1c5V2NoWFNIRzBkWUZLUlZjQlRxNjExaVRVRllnRXFES1dzWTJWcVlnOWJTcmplOWEzTHRGdzUKK0MvTFBVRHFWcHpzZENqTCswZXJJSG9LVXJyMU5hbDJacWx2YUtzUVlyQjBoU3ZOaXo1YWlsaGZYcUlOQnF2dERaaHJFS3NZQXdoT2UKK0FFTEgxSUdSZnBpbE1VcTdXVWJHOUJxanJjZ2tTT2xhL2E3RW8wQmdiVnlSMnRLRnJKTzE3OXRsV2xHWjM1ZjZkcVoxSFNoeDVabmcKK1Ztb1NkR2lkeEd4NU1ZbHJCdml0cUd5dWdCdGNGVlFlMWE0UC9HVTVUV2tWOXVLMnUrTTFaMkV4U1pDR0ZzU1JEZjBuTHlJckVFZFcKK1JLLzc5ZkZDVWxCYUFFalVxcnkwTFMzQkFZNFdvaFc0eHBYdVFXRE0wckpRWVJVUXppbUVBbU9CSVhOWUlDRFVaQ2lWVzhxakRwYXQKK1c0NXVicjI1NFN1WEJjVXhzY28xVmdHT091QlNuVlFBaHl6Sm0rZDBPakxBQmVrbEs2SCt4R1liL3BqUS9vd3NoditjRjNUV29jQm4KK2ZySmFuYXZVTTVmbG40S2FwNVByNnRNb1Uxa2dRMFVJRUpaQzVnRkYxWjI1NVhKWkJBM0xPd20wRHY4c29vdURhMlpUcHBQR2hnTUgKK2lYYzhFRFVYbXRjSVNYS2o2WG91S2dBN3hJL0dORjBQT3VuQUJMUEUwR1Z3VG4yYUFnd0xSTU5rbVlRME5TellnbTRtMllhbHF6Zm4KK0tsVHI4cGd1S1RZSWR3TUZEbGRuR0FDaGRMRjUwYXRlV29NM3Zxc2dKWDN0KzVMODlwcmYxY0l0clQwc3pHSWZkcFhNOURBeEVTcGwKKzJhajN5aE0rOEozQUVXcFV4clRSamp5eGwrbHNwNGxydkpMRjlEYkhiNm5TbHlBejFaaTBpaDh3M3NQUURoV2dMb1ltQkZjUmszbjcKK1ZaWUFPTzljbEpMK2dpTDZ0OTg5OTdsRHJrSHF1dHlqb1NKRmlsVkYvbk9sLzd6S2c0azR6VFZhRk5BdW5lb3JPYUlGU1N3WUlGcVEKK3FGeTdlZ1d6M3BKcmRCMHRRQ1J0MGxzUzlhcXZuZTF0ZC92YjRSNTN1YytkN25XMys5M3hubmU5RjFLSmZmZDcyUEczZGI4UFhvZ1EKK3JaL2dDWjk0SEVJUmdvcDNQQXdIT0QrQ2tQRHhsUzhoQzMwNGVjdHZub00xWkR6WjZ4ZDU5eVh3ZGFSSG5lazl0OERRZzM1K29tY2YKKzZpOEgrOGZKL25DcWJ6M3IzZWQ2RVU2MTlNM3NQZTlSWi92YzkxTVNyekQrOFpHZmZPVXZuL25OZC83em9SLzk0Mk5WOXdpRUVpYXcKK24zM3RiNS83M2ZmKzk4RWZmdkdQWC92YU96MlVwSjkrOWErZi9kSy9RZmtjbUozK1lsU00vc2NDZzFseHYzdTlkS3hqMUtMOTN3cUQKK0RlcHZBQkdqTVlTUGZlU1BBQlhRSys1UGt2TFArZ0pqVi9pdllmelA5ODR2TUFSd0FUVXdKQXh3MFBBbkFUY3dCRHVpQVRQcEFaRUgKK1NpUndBZ3VtQW9IUGN3SlFCR0ZRSXpydzh3NWkvbUl3Qmtud2dVenc5L1pQQlZmUS9Gd1FTakx3QmtWd0JwOG9PN3FnQjVSd0NabXcKK0NaM3dDYUV3Q3FWd0NxbXdDcGVRRUJ3dzg2RGtBdHFoQzczd0M4RXdETVZ3RE1td0RNM3dETkd3Q3k4QUNHTVBTcERCQ3VFd0R1VncKK0RxdVFFdUNQZjdJakgyU0hkR1lCLzdRd01LU0VkUVR4YTF6SGdRcmpCZlp3ZEdqSGlmSXdFVGVuRDdQUUVLRWtFQWV4RXEra0VQbm4KK0VCMVJjeGIrc1lrYWNSTVZCeEpMOEE4UGdoSXQ4UlJuQkJQMVJ4TkJjWEE2a1lrK3NSWGxSaFIxa0JRRndoUlJNUmRkUkJYeGh4VmwKK01XNWUwWWV5SXc5RW9SaU44UmlSTVJtVmNSbVpzUm1kOFJtaHNSZ0ZBUUlpTVJPaHBBQ0FJUnUxY1J1NXNSdTk4UnZCTVJ6RmNSekoKK01Sc0xnQTFuRDBvMElCclpzUjNkOFIyaFVRUHVVSUQ2eVFhSk1BUnpzUHBPTUFKOWtHRlkwQlo1WVFqdlVRT05rQkhyY1NEeDBROGwKK2tSLzdrV0QrY1NFUFFpQVJrZ0FMMGhNUGNpSVhNQjkzOEFKN3NDSGI1U0d0RVFNeGNnRXJFaGI3YVFPSUl5VlZjaVZaY2pqZ1FBQ3EKK2NSV2hCQlNrb3ladDhpWlhBeFRROFhBSzR3NWE4aWVCTWlpRHd6am94eUQrRDZJU0ZDUXBsWElweXlNRFlISVVJVklnS0tBL3FMSXEKK3JmSXErWU1DZGhJQW9XUUptUElyd1ZJcEdXQWVQN0NmOVBBWDQ0WVc5WkVIYjFFWDNaSnZ0dEp1ZkJFdHNTWVk0ODhzNlZKdDFISWoKK2d4QVEzL0l2VjRRWENRaEtFREV2NjVJc1YrOGd6dEl3L1dRdkFSSVhBZE10QlZQeUNKTXhyOFl1OGJDZnVxQURPTE16UGZNelFUTTAKK1JYTTBTYk0wVGZNME9UTVhxQkVxUS9JZ2VHQWNZRE0yWlhNMmFiTTJiZk0yY1RNM2RYTTNZWk1INHRKdENvTVRVSE00aWJNNGpmTTAKKzNRQXhiNjhHUjFJQk5SSWdVOUFqdHdVa1pWSWttM01BUzFJWUwvSTY2ZTg1bzVJWG9sTTZwWVU2ZTFFSXViUCtzdk11bWZNOEs4WTcKK1cxUCtJTUpUUEgyRlBBZlRPdG5UWDlJek05ZnpQdnZGUGF1ekkrVXpXdWlUTXUyVFA4a2xQK254SUliZ09CbTBRUjNVTkxHUU5mOVQKK0lLQ0JOeTMwUWpFMFEzY1RHbjZ6YkFvakZ4NDBSRVcwUVpsQU9ZZFBNUzJ6TVJYeVBhTWtNbDEwTWtldk1sT1VUekF6UVFWaU1XY1UKK1RSenpPeUhUUlZFUlJsOVBSbk1VVFdxMExGRjBTSFYwUlNlMFJYMzBMNEZVL3dTaU1KRVVUSW8wTVc5MFNzTmtSMW0wUjV1MEVwOFUKK0FnOUNTckYwYlV3VUFmdHBEeVFnVGRWMFRkbTBUZDMwVGVFMFR1VjBUdWswVFJGaE5XdnhPM1ZoQmZpMFQvMzBUd0UxVUFWMVVBbTEKK1VBMzFVUGxVRnpxVWF3cERFZXIwVVNFMVVpV1ZUdVd4S0MxeVB3MytkRno4c3p3Wk1rREhjMUdwNWdVejlVRExOSDFBY0ZURlpWUHIKK0UwQTlsVmNHTkVZTEZGV1BCVUdOVkNEc1VWYnRUMGs1bFZWYjlUSmVOVWhqRlZjVGcxYXRsQmZRZEZLUk5WbVZOVTd2TkNaM1ZTRDIKK0ZGR2xkVnFwdFZvTlZWSDNaMGtkZFZtNXRWdVJ0VktyaFFhdmRFeVZSRXVYbEV1N1ZCQy9kQi9EbEZ5VnBFcVhjMXpkOVVqTTlWbVoKK05GMXpjVjNaa2hmRWRGNTlCRjVQVkY3OTFVZnFkVlhiRWwvekZWU1JaaTRIbGtjQTFreVB0R0Y3cEdBSnRCUVJObUd6MVY3N1ZXSTcKKzVHRk50WjhXZEVSRmRtUWgxRmtObGhjcVZFTlZkbVZaRmpjNU5HTlBGa1JKZG1acGxqTkwxRkpORWxPRk5URlV0V0xoczFjRlZHSCsKK2FVWlVkMVl4aURWZWVlRldpellzZWhaV2VSVm9wMFZvUVlab2wxWlpTdFY4VHJWcXdhSnBnZlZwb1JZdWZoVktBMUpyQy9CcWF5ZHIKK3liWXJ1RlpzNC9OcndWWnFNNFpxMDVZa2pqWmdlZUVjWWlGdjlYWnYrYlp2L2ZadkFUZHdCWGR3Q1RkdnlRQlAxNUlqQllJSGtxQngKK0hmZHhJVGR5SlhkeUtiZHlMZmR5TWJkeGZSTm1mWllYMktGd1FUZDBSWGQwQ1RjNWNWWTdJNVpqUFlSaW5mWmdMOVlTOVZWeCtWVjEKK0hkWnNYeWNXYVpkRFdMZHJYZmQxQnpGMis3SmRjN2RqYlJkMWNIZDRNMlIzeFJaZGZUZHZnTGNOQTJOamtkZENQQlpyK3drcHd6SjcKK3RiY3BuekpQV1hRcXNUSjh4WGQ4ODBNck9iZDFlY0VydDNmK2ZkbVhPOGJ5ZE5WVElGQlNLT20zZm4veUpVMjJjMmtTSi9tM2YydFMKK0o4K1hkM25CSisyM2dBMTRLSXZYYzlCMmJrVmliY0gwWjkzV1YrRTJZdVNXZ1Rrd2dTOW5nUzM0SXh5WVhTRTRndnNpYkI5NGJEZFkKK0xERDRjVFM0aERtaWcvZTFiVUZZS2tUWWcwbFloUm5qaEE5bkdPRXhoM1Y0aDUxeEd2TVhmYkd4SElWNGlJbTRpTWZ4SEFOWWJOZVIKK2g1bTRpWE1ZWEEvd1kxTjNlaTlFZVVlWWVac1hiSjQzSGFPWGlqV2tlczhXTDcwWVE2eFlockU0aStka2kzbFNTTWU0UXNENGRzVzQKK2pTdWtqUGYxak5FNFR0U1lLN3RZanQzWWh2L21lT1dZam1YWGp1LzRFaWM0WVJoV2p0L1llRFdURGgzNWtTR1pDaVBVZTVmK2xBdlQKKzhKSXhPWk0xK1F6WE1JbEgrQTBqT1pSRjJaSHRFSDcxMDFacE9DUllXSFpkK0lXaElvYjNWU0pUZVNQcUZtSlJlWlk5WXBXRDk0TmQKKytTMWdXWFpsR1pmL3haUnROR21GZVFSMTlXUmJ1WmVCNHBkM2VZYVBPU05xV1lwdk9ab3pRcGVoMTJ1WnVaa1BPV0FxK0ppbjJYb1AKK0FtOUp0NXpOK1p3RDkzQi9XSUFaTjNQZCtaM2hPWjR2ZDNQN3gxNC9GNTN4T1ovTDJYVEQ5UWpqbUkvZFFaQ2ZtWkFMdVVyeVdDN1oKK21JOFhXWUgvbVk4Rk9wdDd0NkNkdDV2ekpaSGJlS0V6dUtFRE9aazdsNkFsT2hVcE9sNHNlb3d4R29YN2FSRGFONlcxMXluWFdXd04KK2dIeGhPcWJGMXdCQ0dsMEtRMzFWT3FlWGNnZjgyRzcrc21OK0R6aW9oZm9NOEZkQzdYVi8vVGVwbFZvMUFMaWVUNWFBaHpxcTdaY28KKys5a29xOW1hcHdDYnVWaWJ0OWxnYXZwYnZsbVl3em1NZFRhYXRYcU5PN1dybzhLWklScWFyWG1zNGJpc2ovbXM5WmlyMVhvbjJIcXIKK0JTS1l4YnFuM1FZSlBTQ3dCWHV3Q2J1d0RmdXdFVHV4Rlh1eEdWdXdFWmN2MjVvWllHQ3lLYnV5TGZ1eU1UdXpOWHV6T2J1elBYdXkKK21lR3JyNlV3aEtDeFRmdTBVVHUxR1JzUS9McHNBTG1OSDFxdjcvV2pXMGUwbTJXa3ZiaWtiMWlqWVp1ajBkZWphWnRPYkh0WWNKdUsKK2RmdVBlWHVNWXh1dExUYTRhOXVUWlZoNlNicTF1ZWExbGR1M0JSaTRuYnRGRGhvNEUxcVJxWnRxc2tNWjhxRzh6ZnYrdk5FN3ZkVjcKK3ZkbTd2ZDM3dmVIYnZDRXBjWi9aQlZyZ3Z2RTd2L1Y3di9tN3YvMzd2d0U4d0FYOHZsMWd1SEdsTUNvaHZoVjh3Um04d2VFN0NzSWIKK2FlaWJvUUZ5U1MwY2Y2SlluRkgzT3kvOFpQM0hBNHYxbEZtMHd6djN3eGt2Z2pndnhURm93dE9SOGxUOHhWZklBb1BReFdGY3hUM3YKK2lXbzh4eVVJOEE1UHgzUGM4T1lIOFh3OHhmZXV5STM4eUpFOHlaVjh5Wm04eVozOHlhRTh5cVY4eXFtOHlxMzh5ckU4eTdWOHk3bTgKK3k3Mzh5OEU4ek1WOHpNbTh6TTM4ek5FY0luTHNJTlpKbnlvTXhPMUh3b0JMenNuSmxSSXVJVmdOQU5ocnhsWUp5cjRKZ2xJQTdVVE0KK2tvRGdHaEtOeGRQOHkxTWczQVJpa2JicHczNytxT1p1amlId3BjbWVDOWs4aWlGTVNxS3VBUWdVREdPOGF4VWtpckttTGFtdWdZU2EKK0xkRlZIYkFBb0tIMnFaMnNxZHhzTGI1UW5kSWh4dElqemRSaXFpR2dKTXo4eHJ6MEthd0d6cjFTZmRXTi9kWUVBclowN05aa25icUsKK2J0QXFmYmR5dmJtaUxDSDIvQ1NrQ1YvK0NwdEsvY21TZmQ5QXpOaU5mZEVGWWhYNnFicmF6Q0YyM2RZVjd0SlB6WExXYVlSMHJ1Rk0KK0RkTHBhdXhFVHNiRkhjei9TWnBhN1NYbUt0MFhndFZPcDg4UmpNSzQ3TjBoUjlvQWdPVG8zTjNKWXNTS2ZkOFQzYWo4UUtaRWlxRHMKK1hjT01nY1hvSGFlaS9ibXF2U0hjcTRlMHZhOStTdWkrN1pzbW51TFJmQklXQ1hTQ2FaZlFLcWFtS3VUREhkTCs4Mm5kWFNyZjgyd2gKK2dMM1Q3dUhwU3EyNTlOM2x1OXlSMUkybGZHcmJrNm5kcHozQXVnM29POTZ2VE1yWkdtbkYyTzJtaWg3Y1doN3B6ZHpPU3UzUGpDSFIKK2VQM1dhYXJQeVI3a1BHN2cvMXpyVHdtVktnTE93S21ta04zQUNOM253WDd2OVVjTmlJM3ZBVC93QmYrT1V1Q0NnUHdzdm82Q2VMd28KK01HandIZi94SVQveUpYL3lLYi95TGYveU1UL3pOWjh6UUt2elBmL3pRVC8wUlgvMFNiLzBUZi8wVWIraWZHanNVci8xWGYvMVlSLzIKK1BmNzFZci8yYmYvMllaL3hDbTczZWIvM2ZmLzNnVC80aFYvdXRYRDRqZi80a1QvNWc3OEZMMmZtbGYvNW9ULzZmMTljUjl4ZVNkeDkKK01yejU0ZHh1cjErQXU5K0Z0bjk3d3AvK21xdmZ3NjBmdzhjLzlkS2ZyQVZpQXNyaC9lRS8vdVYvL3VtLy91My8vdkUvLy9VZi9nMTgKK1ZRb2pFZ0JDbXNDQkJBc2FQSWd3b2NLRkRCc0tqTVFyNGowQTl5SmF2SWd4bzhhTkhEdDYvQWpTWXdvQUZwK1VPNGt5cGNxVkxGdTYKK2ZBa3pwa3lVRXl5T0RJa3pwODZkUERVQ1NHSFJ3YXloUklzYVBZbzBxZEtsVEpzNkhickU0c1NLUGF0YXZScHlxa1Z1cXJwNi9RbzIKK3JOaXhaTXVhUFl1Mkt6ZXBGTEc2ZmZ2MnBzUU1UK3Zhdll2WHFRT2JKT0g2L1Z2MVoxQjNoQXNiUG93NHNlTEZqQnM3Zmt6NEJWdXEKK2dDdGJ6cWcxSXJGZW5EdDcvZ3c2dE9qUnBFdWJQczJaMk9UTHJGbkw1WFZ2RnVUWnRHdmJmcnczNHV2KzFyd3RDNDdvNExidzRjUWIKK1M1Yll0cmR5dDVsNWJVWU5QYnIwNmFaVkk2ZThQRHZQMTdHTGUvOCtQRGV2M2RyTDgvek5Lemo0OWV5TnJ6WVBIMlR6NTlUcjI3OC8KKzJqcnM1UEg3YitRdVczc0NEa2lZZU9UNWgyQkc2TzFnU29NT1BnaGhoQkpPU0dHRkZsNklZWU1JdkpkZ2g4M1ZzMHVJSW81SVlva20KK25vaGlpaXF1eUdLSTlYRFlJWUt2RVpKaGpUYmVpR09HTy9BVlk0OFdvYWNlZ1VLQ2Q5eCsyUGtJMzN6NExjbWtmZm8xaHlSOEFBNUoKK3BYY0c5aFZsZ2tCV3lhVndSVUtacFhaS05rbG1tYVU5eVYrWTJrM1paWnV6WGFrbWdsdTZTYWQ3MThWWjNwaG03c2xuTDJnZWlTZHYKK2JOWkpLR0p3QmdyZm5JVXVHaG4raklpMnBtZWZrakw1NTZQS0RjcG9vWWRhbWgxNnd1UUlhcWlpV3NpSm81eFcxcHdzaTZ6S2FxdXUKK3ZncHJyTExPU211dHRxNHFpNm1uL3ZVYUJBaU1DbXl3b1FyRDQ2N0tLWm9wb1YrbWFleGZrVTRLYlgyVk5sc1pwc25TdVNtMWx5RjcKK3JadkxBcW90VnM5R1N5NTAwNFlMbDdYZGRwa3R1bjl4dXk2WDM3b0wxN2psM2t2YXVmUmVwVzY4VkxhN3Ixdm9uWkpYd1FZZnpGUlUKK2R3WjhWWE54eUFGeHhCSlBUSEhGRmwrTWNjWWFid3h4SExveW5OTnJBdENGY01rbUYzeEtzU0FMREZSRWxyd0JjOHd5ejB4enpUYmYKK2pIUE9PdThNc3lZZnJ5d2ZmeFNrUlhUUlJoK05GZ1UvQXkwU2xnTFF3M1BVVWs5TjljNldxTXorZEdBdHArZXZ0MHRudlpHOStJNzkKK21iNWdnOVJ2MXdRQ2ZEWk84S3BONEx4dFo4VWZmV1RmWGZiWGM2dmNIZHhWc3IyM1IyLzczWjdjZ1hja050NWptMzE0Um1rVHZoN2cKK2pmdTBkUkZtWEk1NTVwcHZ6bm5ubm44T2V1aWlYODZPM29FMzkwZ0FxcS9PZXV1dXZ3NTc3TExQVG52dHFqOWkrdDY5Y2pGNjc3Ny8KK0Ryem9SV0E5ZVVlRFEwNWs3bk1ucnZpOWpCZXZHNVo5SXorZzVORC91SFdRMUJldWZOdk1OMC91ODlBL3ZqMXgxbC9QeS9IbEQyYzQKKytnczdCMzd6NGhkUC92cTNuWCs5K3ZiYjFyNzczOGMvcWZsTnJuNzdvdzMrb0ljZUVzeGhnUXhzb0FNZkNNRUlTbkNDRkt5Z0JSZG8KK2orNmRyVGxZbUlZSFB3ait3aENLY0lRa0xLRUpUNGpDRkhvUUN4b0UyNHd1Q01NWXluQ0dGeVFCOGR4M0VmMFZjRGI5UTkvL0FOZ24KK0FUYU9nRHZFelExeEdCRWRGdEV4UGJ6ZUQ0RzRKeUVlam9oTFpNd0JpNmZFS2k2bWlkQjdJaFRMSk1YQVVWR0xpYm5pNUxKSVJzUncKK3NYaGUvR0tUd3FnNzZRVW9qYlV4WStQUUE0Vmc2SEdQZk95akgvOEl5RUFLY3BDRUxLUWVSOURDcktYcUNJeHNwQ01mQ2NsSVNuS1MKK2xLeWtKUy9KeUZ5OUQ0ZTlVb0loUHduS1VJcXlrRkE0SWhMUlNNZkNySEZ5YlhUamt1QTR0ekdtc2tDbXhDRXFaN25LeHJYU2xmZUIKK1pkdGtPVXM3SHU2V3Fjemw0WGJKUzJrbGttbkFUS1V3QXpld2swbHptazFSbUpHUStMNytoM0ZzbTl6c3BqYzE1ckZOdWs5a0pLT20KK09jODVpNVJGRDVzSzJ0ckxxZ2JQZU1vVFp6NFRwdytGaHJSODZuT2ZabEdhUGE4bk1xak5jNkFFaGVmVjFzbk9IR1p2bHJReDV1bnEKK2xzendMUk5vemFUak0vZEdURG82ZEcvSWpLaDBmSG0yaXFieG9uUExhQm8zdWp5SWVqU0FFMTJaU01sSTByYWhKeEVtcUtsTmI0clQKK25PcDBwenp0cVU5L0N0U2FsdXFmWGVRUEM4S0IxS1FxZGFsTWJhcFRud3JWcUVwMXFraGxRVXRCMXFzK0JIV3JYTzJxVjRHYWlGcTYKK0R6MmVLSVZaejRyV3RLcDFyV3h0cTF2ZkN0ZTRtdlVTVjJWWWM2b3doYnpxZGE5ODdhdGYvd3JZd0FwMnNJVE5heFhxR2pEdTRFT3UKK2pHMnNZeDhiVjAvK2lCVjlaSVdzWlMrTDJiZlNsYWhzNUE5ZUN3dmEwSXAydElNOUxHY0hLTDNGWm5hMXJMV3NaQkdhMENSdXJheXQKK3JhMXROWXZZZmQyVnRMenRyVzhGYTlwcllsT3h0eTJ1Y2MvNjJ2RmdLYmFWUGE1emE3dFo0U0p4dDcrdHJuVjVHMXd3b1krNHorMXUKK1pwTjdJR3lpaHhFZ0tLOTV6NHZlOUtwM3ZleHRyM3ZmQzkveUxpTzM5R3FPT3RLQjMvenFkNy84N2E5Ly93dmdBQXQ0d1BoVkIzM2QKK05hUDRLbmpCREc1d2ZCa3gyZnpOMXJzVXRteDB0ZXRFejE1M3d4d3U3WUhSeGQwS2kxaXU0RjF1UXBzNzRoUzc5Y0xNdWlkbFB0dmgKK0dNdDRDdGx0TVVCVHErSWNzN1hFc2NXZVJXaXI0eURQOWNQaG91Nk1qM3pkR29QK2EzdzRGcktRZWR6ajlFM1l5VUZtOFpJNysySWsKK2E3bTZTbVpuaUttc1lpajNHRDBKbUllWno0em1OS3Q1eld4dXM1dmZET2M0bXhrSFJOWldjK3lBaHp6cmVjOTg3ck9mL3d6b1FBdDYKKzBJVE9zeDNxVEsxZXBVTE9qRzYwb3g4ZDV3UkVHSUZUQnJPS3JjeE9JMjk1MDZMdDhuQ2JiT2tVaTVtNWxRNjFpREdOVFUxemV0VWUKK1B1MFFRVzNxQ28vNnhLV090WGRSUFYwTnMzclh3RVYwczc1czYrN09tcDFraHJTeGo0M3NOOVBaMWNma1R6ellBTzFvUzN2YTFLNjIKK3RhK043V3hyZTl2UWpvZXZqYVhvWkl0NzNNZVdOR3hKL2VOZ1Z4alhPRlExcjkrdFYwOGpFZGpxUHU2d3hWdnJlaHVYM2Y3VE5iei8KK2JkaHY3NHIrM3ZxKzdiMVBtZStDMjViZkxyWUlqQUVPYjNsekV0WUtOL2lrc1pqd2lyT1c0Um5PTXNUL0xmRnhVbHpqclQyNExiZEcKK1hnZXJmT1VzYis5OG1mMVF5cUFqRFRTdnVjMXZqdk9jNjN6blBPKzV6MzlPYzNRSS9GUUpicm5Sajc1eUNKK2IxdWttK1cwNVhsU1AKK2YvemRJZC91eUozKzNZdWZNZU5ZdC9EUU9lWHVxWE82NmplV2ltcTd6bHFUajVYcmFIY3MxTEhzY0xGVC9ldVdJbmpiSDZ0MnlyTDkKKzduSjlPeXY5TGZkVms1M0padWQ3MXBkTzdLMXhnQUNNYjd6akh3LzV5RXQrOHBTdnZPVXZ6L2hhMFAxUnpYa0hPajRQK3RDTGZ2U2sKK0w3M3BUNC82MUt2KzgrL1lQS0o2OVFmTXkzNzJ0Sy85NVRtZzlUdnUzZkQrdUlVNVJ3RWYrRTBQbm41WDV6Mkpjei9NM1J1ZnJYN1gKK0pmQ0RyK1hobzdid3k4Yzc4cUdwL09xbnRmbk5sanIwdHl6OVYxTmYrNHpOdTRRdG9nQjhxSC85N0crLys5OFAvL2pMZi83MHI3LzYKK0MrSDZRRFhIRzJEb3YvLy9ENEFCS0lBRFNJQUZhSUFIaUlEOTV3MzVoeWNpd3dyMkI0RVJLSUVUV0g4S2NIMFl0VFdPa0FVYnlJRWQKKzZJRWZDSUloS0lJalNJSWxhSUliNkFNTUdDZk5JUTVuNElJdkNJTXhLSU16U0lNMWFJTTNpSU01NklMaW9JSnFJakxkY0lKQktJUkQKK1NJUW02QWdYV0ZMWlIzNUQ1bnNwNVgzZmgyVGhOMFhGdDRSclpYNlUxblJWQ0ZmY0YzTnhCNFhnMTROaFluZGFtRlpYaUhGWlNJWnQKK3hZWCt2L2VFWHloalVpaEdWSmlHWm1XR1cyY1J3OUFHZWFpSGU4aUhmZWlIZndpSWdTaUlnMGlJZVVnSFlaZ2x6UUVQWmNDSWplaUkKK2p3aUprU2lKazBpSmxXaUpsOGlJOElDSVVkSXJEMUNJbndpS29TaUtoRGdNU0NoVFNyaUVhK2lFWHVpR1J3YUhjVFIrYzJpRnBuZzIKK0tDYUxhcVdLM3ZOOHJjaGhyeGhMY2ppSGRhaDdhSGlMYUpXTEc3U0x2SmhrbTRna1l5aUx3cGg4eEZpTVRDaGQ3WmFNeXNobHpPZ2oKK3poaU10QWcyNlBFQmtDQ080MGlPNVdpTzU0aU82YWlPNjhpTzdTaU9HS0NOUGRJY1JsQU05V2lQOTRpUCthaVArOGlQL2VpUC93aVEKKzlXZ0U4UmdqcjZFRzdvaVFDYW1RQyttT0grQ05XWU1lMW5obGZ6ZVRrYzVYa1ZPWVVPR0ZjSmxtWTFISGtSY1poeGxwWW9uM2tTV1oKK2FoMUpmQ0laWmVsakRDbmdraThKa3pFcGt6TkprelZwa3plSmt6bHBrNnVBa24rM0Nqb0psRUVwbEVOSmxDN0preUFaUjBXcGxFdkoKK2xFRnBEQ01wWGdBZ2xWTkpsVlZwbFZlSmxWbXBsVnZKbFYzWmxVaVpVbDRwbG1OSmxtVnBsbFVKbHI5MGxtdkpsbTFwbGlzSmwzRXAKK2wzTzVOd0VCQURzPQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2ZpZWxkc2VxX3RiLmdpZi5iNjQgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZmllbGRzZXFfdGIuZ2lmLmI2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjRjMTc2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2ZpZWxkc2VxX3RiLmdpZi5iNjQKQEAgLTAsMCArMSw0NDUgQEAKK1IwbEdPRGxoZFFLYUF1Y0FBQUFBQUVsSkRLK3ZyMVlNREJVVlpDOGtEUUFBVmtZUUVCY0hPd1lHU0NFSkhTQWdhS09qb3lzOERETXoKK0NnQVlHcCtmbjE5ZkZKbVptUW9LTzEwd01BMFZJQUFBY0RzSUNDc01EQWNNVDFNTUQyWm1BQWNTTzI5SVNGVUhCeUlBR29pSUFBNEgKK1QwcEtESmFGaFhkM2QwRWdBQm9hVkdZeUFDNEFLWGQzT0RzN0J3QUFOMU1BS1FBQVlsWkdCMkpsREJ3Y1dXQnRZQ0EzQUJBUVRRQUEKK1pRMFZRRDRBQUZWVlZVaGpTQ1FNSlFBQWZCTUhNa1FnSUV0TFN6QXlERDVWUG1abURFWlJCMkZoRVdaaURGbzJFVGtkQ3dBQVZFVXQKK0d1N3U3anM3T3pjM04zZDNXQUNQQURVMU5UTXpNeUJSSURnQUFFSkNFSEVBQUV3TkRaZVhBQUJwQUVRRkJTTWpJeGdOUURvb0NCQTkKK0VFaElid0JWQUF3L0RBd01QZ0JOQUVORENnYzlCOHpNekFCREFENE1EQXdPS2p3S0NrUVdLVXNjSEFBQWNVdExGUk1URXdvaENvcUsKK0FBME5UQkVSRVFnZkNCVXFJZ0FwQURJQUFBNFVMemcrREVFZkgzd0FBQWNIU2FxcXFsa2NIRGdNREtTa3BGUUFBQlVWUmpFd0NHWm0KK0IwMFFFREF3WFNVTUpHVUFBSmFXbGhRVVVueDhqVlFhR2djR0xnZ1NHeThHQm13NE9HTkFMNHFLaW9pSWlHSUFBRXNIQjNKWVdIZDMKK0FBQUFQbGN0TFlReUFHZ2dJQmdBR2tJVkZRd2NKUmdZU0E4TVU5RUFBQWNIVlFBQUxSb2FZYnU3QUVZMUgyWm1abHhkRUhBQUFEODIKK0RsaHFXRXhHSGd3T1V6TXpEQUFBbWdBNUtURUhCMlptUGxwYUIvLy8vLy8vQUNJU1JFeFVEVEpQSlVRckRBd01WaElTU0VoSVNIZDMKK0lDNHhDamhjT0E0T1JFUkVSQmtWWEVsSkFHNWdZRmhZY250MVprZ0dCbFlBQUFVRk1UZzRPRG8zQlRKckFGRVNFbVptTUY1akJ3b0cKK1ExcGFEVWtLQ2h4R0hOM2QzUndZUkdabUhDZ29LRk1BQUNZbUppNFlMaFErRkNJaUloVTBGVDBBS1I0ZUhtVmVCdzA0RFJBc0VBd3UKK0RBYzJCd29xQ2dBQVBGZE1EUUFBMFdBcUtnd2lERWdaR1JrUVJBY2tCeHNUUERFd0RCQVFFRHdBQUVKR0RBQUFVMEZCUUVKQ0RMdTcKK3UySVlHSm9BQUJnWVJqZzRiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ0g1QkFFQUFMQUFMQUFBQUFCMUFwb0MKK0FBaitBR0VKSEVpd29NR0RDQk1xWE1pd29jT0hFQ05LbkVpeG9zV0xHRE5xM01peG84ZVBJRU9LSEVteXBNbVRLRk9xWE1teXBjdVgKK01HT2VsQWVncGswQUpGclNyTGhUcFlRM0FIb2VERnBRcU1DZlFRSElYRWgwb2xHQllrWnRwR2tUVzU2QjBFWUJmVE1LQ1VFSkVxamEKKzdEcFFESUFiQkpzT0pIRjFxZHUzY09PcVZLdFRLY1duRU9ubWxRQUxXazZFZXA4QzRPdTNZV0M3SlVsQWc5VlVMMEs4dmNSTVJVd0MKK2dGZG9YQmRENitXRTRBMGtRcUU1a1Nxd3N1V0JlcEZnOHlxM3RldlhzUFBLZzRuM1lXMkhqbkhQWnJwN29PRGVob0hEdWkyeXNmREgKK2lLRmk0MmlVNkEyMEE1Rzg0U3NRcmRFOGlLZFBSMzE4MUtQWTRNUCtOeVNCQzRMNGxIUkpBSTBNU3d3SjArK0I1blN2SHFkQUpQVnYKK0xIYi9VNTRZSnpYOTlSUitRT25YM250S2lkRUxBTmlNWWxjZTJEQjRGWDl2SE1kWVRmSVFlTlorOGRsSGtGZzlRU2loUUVRcHlLQ0QKK0g5cTBFNFgrQWZoR1RpcjZaaE1za1dHVFUzM1k4RVdmZkZDNU9CK0NPTlgzVjFCaXhWZ2ZlN0RnV0ZsQjc2MjFubVJNQWpCZEx3azEKK0J3MFNBRUJaMW1LdzVQSGRkUTlhTmdwMGpCMG5RV2ZucGFubURUVk5VNTZhSTZsRmdoT0xrYkFjVFZKaDl4bDI4dUNKQkRRMkpra24KK0VxTjBKczhidldUWXkzZG16ZmJVbkZjV09oeFhzem54bVdoS0hlb29BTkFjbWlockJoRUZLYUdHQXRBVm9IOXhOMXltRmE2NkdGSCsKK2x2NEpZRUZFN2VScGhpLzIxZXBoSkRxUlI2ZlkxTWxxbmxuQ2tpdG1mWnJhNVZsSThGbm1zODlDbXVSeTZqa0tWRUdMbGtibnRFd0cKK0N3dUt5SzJWRTNIZkxoYWFwUUtOdVN4cmpwa0Y1MFNnOVNudnZQVFdhKys5K09hcjc3Nzg5bHN2UERjQnNFMFRxYjY3a1ZwV0RWU2gKK1VNYlJ4S1VFeTIzWFY1WU9Gd1JOcmNrWlM5M0ZZbFJzMXNOS2paTHFEU1JVbkJCUkVuTnNNc1MwYnZydHlERDZ4K2xSR1dQc3FrQ1oKK3BTVmNUNE1adENSTjdNNldzMEFNNzBiVTBVYlBsakRPOHVRNGtBUTE3N2Ewc2NBNVRXS1ZBUThtVkpFQ1VibnFUWi9oM05ZYjMwSGIKK3NzRVFGWm4xMm15MzdmYmJjTWN0OTl4eG82MlJXbGtucTJyK21Wc3JoYmZlUnptQkRac3U2OHhkVDMzVEdIREpHWWM2MjkrSkc3N1QKK2dqZkZITG1xdGlLV0ZUWnYzQ0FacjlDS2NRT2lDNjZxNnVhZGQ0eVljYyt5bnJkYXY1RVlNSEFJWXgyZFZsanVuR25adFdGM0U1cTUKKzVXYjNRZkg2YS96eHlDZXYvTHdBQjN4RkVvVU1ueEhDdXU5TjVNeXcvS1N4UUNyYlpSYVVOaE9VTXNWMlhRenl5MFUxZnZiNHFqLzgKK3h0azdpZXk0K1RURG4ybmpCSnBOdEYxTjVXcDYwUVFoRUFCYjk3aWt3UUlid3JGYTlxSW1FQVFtUkdLTXNaMk1hRVNtZENtRkJGQ3EKK3pTaElzNnhYV1VoNDBndGhTdGdFQUhaWVNrc2l0SWljdHZXSU40Qm1kVW56RTZvRUZhbFNRYVZZandEQVZSNDFLRWtKcFJmK2w1cVYKK3BpWUZ1T0VVakVTekdaVVBUZlduUUVtT1ZkWXFJQVZseGNETUtld3ZkdEtmNmFCRnRyNHM2SVdxOHArZEJvZzB4clJGVkN4MFliV0cKK0V5RnNsVTFhTGZSS3lhYTFHSEROTVVXM1F3dG1ET1NYYTNsdGl3RjhRMXR3OXAxMnFTK0ZpQ3hKb1R5WHlPa0JwejVPa0F3WmsxVWYKK3NtZ29iRUk1VW1VZU1hRDhlRVVvU0ZqUWxJNFNJYWRsc25FQUVzTWxQNGtUb0pEbGlhUmtFSFdJRWtvcFNlQ1BTUHdmWXZJQW9MTkkKK0pwVUV3Y3o3bWdJeEJxbW5RakRzVWk4OU44bG5pUklXd0lRa2xLU0p5eVJ4VUpva3lnbWhiTW0vSTZvdGJIM1JpakZwNUo0SkZrUjcKK0JKRlUzckpYd1VhNlV5U2dlbWRkeEhQRWhaQkxuaWorQVZSRFZFbTA5N1htQnRUQnAwQUhPcng3dWtVZVpYT0lRUWs2a2xGWXFDQmoKK1FnSVNic0JCdU9pVG9Sak5hSGdXQ2llT2FyUWpoVm5JUkdzQ3pyaUU1YU1vVGFsS1Y4clNscnIwcFRDTnFVeG5TdE9hMnZTbU9NMnAKK1RuZkswNTc2OUtkQURhcFFoMHJVb2hyMXFFaE5xbEtYaXBBUlNPS3BVSTJxVktkSzFhcGE5YXBZemFwV29jb2xneHdpR0dBTnExakgKK1N0YXltdldzYUUycld0Y2Exb1RFNEJSd2phdGM1MHJYdXRyMXJuak5xMTczQ3RjWUpFUVlTd2lzWUFkTDJNSWE5ckNJVGF4aUY4dlkKK3dBb2pJVnVOckdRblM5bXRBZ01oMEdDclpqZkwyYzZ5OVJBT1lVUW5Sa3ZhMHByMnRLaE5yV3BYeTlyV3VuYTA5SGorNkFMSVFkdmEKKzJ2YTJ1TTJ0Ym5mTDI5NzY5cmUwYlVGQ25zQ0U0aHIzdU1oTnJuS1h5OXptT3ZlNTBDM3VFeEtTaTFoWTk3cll6YTUydDh2ZDducjMKK3UrQU5yM1Z6a1JCSXZQYTg2RTJ2ZWwxN2ljZXNBcmp3amE5ODUvdmJCWVIydmZqTnIzNVpHMXVFekphK0FBNndnSGtyWElRUU43b0kKK1RyQ0NGL3pjNlNLa3V1S05zSVFuVEdId2toY2g1dDJ2aGplTTMvWWVSQjd2SGJDSVJ3eGcrelpFdEJ4T3NZcjVLMXNTdS9qRnZpM3cKK1FRN000QnJiK01iTWRmQkJJRnpoSHZ2NHg5Mjk4RUV5dk9JaUc3a1RIallJaUdITTVDYlgxc1FNUWZHUnA4emgvaDdrdjA3T01vbGwKK2JCQWE0L2pMWUY2d2pnM0NZeUNiK2N3VUZyTCtRWWhNNVRibk44bEZDYkdXNXl4Z0tDL0VEbFBJczU3M3pPYysrL25QZ0E2MG9BZE4KK2FEM3pBU0YrY0lPaUY4M29SanY2MFpDT3RLUW5UZWxLSzlvTENmRkdOemJONlU1Nyt0T2dEcldvUjAzcVVwdDYwOTVJU0JTYXdlcFcKK3UvclZzSTYxckdkTjYxcmIrdGFzamtKQ3pGRG9YdnY2MThBbTlCNFF3Z2RMRy92WXlFNjJwZjF3WHpjN2U3MVdOZ2lXNlV4dCtYSzUKK0lGNE9zN2EzdmR3eEY2VE1hQTYzdUxtcjVvS3crZG5vYmkyY1B5VG5hcnU3dnMxT3Q3eFhHKzJDVFB2ZCtOYnR0UW1TYlc3N205dmUKK0pnaTR4MDN3Y1plYklPZWV0OEpKdTI3ZnREdmZFTGV0blJVaTVZVmJ2QlAxSnNpOUl4N3hmUStrMy84TytaZitBejZRZ1JmODVHWSsKKytFQVNmbkY1TjV4b0QrYzR4Q2Vla0lxM2ZONFpIOGpHWlk1dmp3c0U1Q0lQT29OSkxoQ1RvL3pvRlZhNVFGaCs4MmUvZkRneDUvbTcKK2FZNFFIZ3pnNmxqUHV0YTN6dld1ZS8zcllBKzcySy91REFZZ3BCNWVTTHZhMTg3MnRydjk3WENQdTl6blR2ZTBKeUloNXVpQzN2Zk8KKzk3NzcvZStBRDd6Z0IwLzR3dXZkSEFsUkJSQVd6L2pHTy83eGtJKzg1Q2RQK2NwYmZ2R3FTRWdyeHM3NXpudis4MkxIQUVJWU1JRzYKK20vNzBxRTg5M2VzUjc2YkxPK2NDMmJuVXErMXpXQUJkNkxpUEx0RmhZWFNrKzE2OFNvY0YwMTNmNXFjdmVmWXpiejN4bncxN1dNZ2UKKytYT3UvZTF6VC8wY1UvZjMyRTl6ZVpmKzczTDNRai9mVkQrSXpibmY1dVkvLy90T2xuNzExNi83NjJmLy9lRU4vdkRKWDJUalJ4MzkKK1dRNi9RY3BCai83Ny8vOEFHSUFDT0lBRVdJQUdlSUFJMkgrbElBQUlZUUpwOElBUUdJRVNPSUVVV0lFV2VJRVltSUVhK0lDVWtCRFoKKzhBVWdHSUlpT0lJa1dJSW1lSUlvbUlJcXVJSWdtQTBKb1FadEVJTXlPSU0wV0lNMmVJTTRtSU02dUlNOEdJTnFrQkI5a0lCQ09JUkUKK1dJUUltQXdJSVFEdnNJRk0ySVJPK0lRYWFBSU9VUWxTVUlWV2VJVlltSVZhdUlWYzJJVmUrSVZnV0lYVXdJQUhBUXFyY0lab21JWnEKK3VJWnMySVp1K0lad0dJZHllSVpHa0JEWFVBVjRtSWQ2dUlkODJJZCsrSWVBR0lpQ09JaDRlQTBKRVFIK29aQ0lpcmlJak5pSWp2aUkKK2tCaUpramlKbEppSUVaQVFOaENHbXJpSm5OaUpZSmdKU1dnQmN6aUtwRmlLcGlpSG9LQjg5RGRsNW9kLzdxWis3QmVMMXZkZzhGZUwKKzNpVi9xK2hzOXVlSzFhWi9CVEYrdVZoa3JjaUxkQWFMc25pTXg3Vjd2V2VMOEllTHdVaGx1MGlNYythTEJBR016NWhpd3lpTldXYU0KK3lJaU15c2lNNEloZHpuaU5SaGFOMnVoazFEZ1FhQkFKN05pTzd2aU84QmlQOGppUDlGaVA5bmlQN0RnTVpuY1F0K0FKL3ZpUEFCbVEKK0FqbVFCRm1RQm5tUUNKbVEvbGdNQ1JFTzRQQ1FFQm1SRWptUkZGbVJGbm1SR0ptUkd2bVE0WkFRWVBBS0lCbVNJam1TSkZtU0pubVMKK0tKbVNLcm1TSUFrR0NXRUYrQmora3pJNWt6UjVqOE4yRUF5UUFBcTVrenpaa3o2WmtMZWdpdVJZWlMxMmp1azNYTjJZbE44WWp1RTQKK2prT3BZdVpvbERDV2pnSmhqVStwWDlrb2xTL0dqVWtaaTB2SmxNem9sRmU1WVZHcGxTUkdsYkJnbFdNSmJVVnBsaTdHbFYyNWZsOEoKK2xyVW9sbXVwWDJYcGxnT0dsbXA1bCtpVmxYbzVZSEFabDlRM2wzVDVmbmJwbCt1Vmw0RlpZZzZSQ1RVWm1aSTVtZlo0YUFjeEF6K1oKK21acTVtUWVaQUFueERXRVFtcUk1bXFSWm1xWjVtcWlabXFxNW1xd1ptdCtRRUNJQUNMSTVtN1JabTdaNW03aVptN3E1bTd6Wm03SXAKK0FnbHhBWlE1bk1RcG1UZHBFSHpBbWNxNW5KczVBMEtwbU9rRm1JMEpZSU5KbUxobm1JZUpmWW4rQ1ozb3haalRLVjk4eVoxWTJaYmYKK1NaMUlhWjNzaDUzWjZYdmJLWjdzNVgzbEdXRGg2WjVzNlYveEdXRFZpWjRpcDU3cmVYVHRTWityNVozMzZWdnpDYUIvU1o0RENsLzUKK3FaLy94cC85ZVhML2FhQ29KYUFKdWx0b2VRNlFrS0VhdXFFYzJxRWUrcUVnR3FJaU9xSWttcUY5c0k4R3dRdmlzS0lzMnFJdStxSXcKK0dxTXlPcU0wV3FNMnVxS2ZrQkRwTUFZODJxTSsrcU5BR3FSQ09xUkVXcVJHZXFROG1nNEpvUUtUMEtSTytxUlFHcVZTT3FWVVdxVlcKK2VxVlkycVFxa0JCUVVLSmUrcVZnR3FZazJncWp0d0kzZXFab21xWnFhcU84OEp3U21sclNXYUc5dGFBTUNuRHU5NkMvRjZGdldsb1UKK0txZTRWYUI3eW1MMjZhZit3RVduZGFwdERvcW5CcmQ5Z2FwdThFbW9CT3FtalVwYWNRcXB1R1dvaHdwbWlhcW80YWFuamRxbmxrb08KK0Z5cW1wRnFxcGlxaUo0b1FLcnFtck5xcXJqcWpPWW9RY0NBSHRGcXJ0bnFydUpxcnVycXJ2TnFydnZxcnRBb0hDZkVIdjFDc3hucXMKK3lKcXN5cnFzek5xc3p2cXMwRnFzZjhDbHAxcXQxbHFxWklxVFp2cXEzTnF0ck5xbUp6YXBnbnBsb1RxbjU1bXBRYmVwbkhwbW5ocW8KK29HcXBnQ3F1cDFXcDVScGM1NHF1SWFldTZ3cGs3YnFuN3dxcDhTcXZwVVd2OVlxcCtHcGorcnF2UHRhdmIvcXZoQnF3QWd0YkNGcXYKK3RtV3dCenQwZDZxd0JNZXdFdXF3Zm9xV0hYQUpJanV5SkZ1eUpudXlLSnV5S3J1eUxOditzaU9MUWdSaER3c3dzelJic3paN3N6aWIKK3N6cTdzenpic3o0N3N6Q1FFTFR3QkVSYnRFWjd0RWlidEVxN3RFemJ0RTc3dEVSTEN3bWhETGxRdFZaN3RWaWJ0VnE3dFZ6YnRWNzcKK3RXQmJ0Y3FRRUhyZ3NtWjd0bWlidGkxTEFRZ2hCai83dG5BYnQzTDdzL2JBVkhaN3QzaWJ0M3E3dDN6YnQzNzd0NEFidUlJN3VJUmIKK3VJWjd1SWlidUlxN3VJemJ1STc3dUpBYnVaSTd1WlJidVpiN1VoQ1VQZjUwSHdKeVNJWVJNRlRDTTZBTFNESlNGWVBrTTJzekc0U3kKK0ZhOTBJVFpSVXBjYnU3S0xFU1JRUVJSRkVFdEN1bEJCUXJCN051bVRTNzhidkpwN3VoK1dISHVrR2FQREpVMGhHdTAwdTg3N3ZQdDAKK0dyQ0FKWU9VQjlmK29yc0gxQlZJNEFUVlpEakI2eGg0WVJSWnBCQkdBVVFGOFJ6QXV5elF1NzdzcXhCV1k3MVlrU04yQVJtc1FSemcKK3l6L0hFYjdHaXozaGNoL0ZRaEJtNFJWcWdSM3RXOEFHbkNUUUlUOWR3MG56NjduY0FoajVpNzlLMWppeEkwSFlTMERjZ3k0SHZNSFAKK0c4REdNazNXMGNBSUlVQW5FekQ3SXp1Vmc3MFYzTDhYZkRRMzBRdnh4TUV5YkxsT0lBRVEwaytzZE1JRzBVSzkwRlZERWNIcGEwNTQKK2hCWDhXN3pSOGI5bGNSb2dOTU5NTExtUFFGRllsRGQ0TVVZTWNiOUJyTU5EWEJyTFFiN0pZYjZlQVIxTDNNUmkzTGdYZ3cwd3UwVUQKK2dzUUtZY1ZhcE1LSThSUEVPOEhCMURuSSt3YksrMUJqbk1lTUt6aEcvRFUya1NqK1dYTXlRT3k2TitISE5SRzZOekUxRm53ZjRqUTAKK2JhekhrQnpKa2p6SmxGekpsbnpKTkVVQ3ZiREpuSXdrSW5GTG5iekpBWVhKcEZ6S3BuektxSnpLcXJ6S3JOektydnpLc0J6THNqekwKK3RGekx0bnpMR2hIS3Vyekx2TnpMdnZ6THdCek13dXpMbzh4U0NqTE15SnpNeXJ6TXkzekdLblhNekJ6TjBqek55WHhUREVMTjJKek4KKzJ1d2hMa1VUM0t2TjRCek95QXdnZVB4UjNpek82SnpPdk54R05zWE5MdVhPTEVVVDVheFI4Z3hUOWZ4U3VWdFQ4TXhTKzZ4Uzk5ek4KK1laeFIvOXhTK1V4VC9heFNCNDFTQXgzUEFZMVJDNzFTQlQxVDNDd01qRkRSRm4zUkdKM1JHcjNSSE4zUkh2M1JJRzNSWFpYUTVxd1cKK09MQUxLSjMrMGlxOTBpemQwaTc5MGpBZDB6STkweWlOQXpJeXp3S3RGaUc5MHp6ZDB6NGQwaDJ3Rmc3Y1V0emNsNU1hYlNSTnoyb3gKK2ZSZDdZenIyMFA2c0Z2TW5ya2tXMFRKVjFCR0xXa2hkVDFIZEcwemQxRFgyMUEzTlVQODgxWk5hMVVQTno2bGkxSTI2MWZhODFHRHQKK2IyS04wdzR0MVZsOVdtaHR6V3Q5MTZibDFpLzF6MThkMXdvMjEyL2RHMmI5cVVLdDErcFluSXpkMlBhb2o2akIxU24xejJ6UW1wWjkKKzJaaWQyYXpKQmpkZDJBTUJrNDRkMnFMTmpzZHAxVEdGMVh4TnFiMlIxRG50MVlLOWJZVDkxM2FkMnFPVjErMjgxN1NOY2FzdDJRb04KKzE2OGRackVOMElhZDIwaVcyTGM5RUd3ZHFINHQzQi8zMjhEZDJiSTkzTG4rYmR2Nm5DcFU2SW5ZbmQzYTNZVmpHTm1lTFJBZnlJTGkKK1BkN2tYZDRxNklMN1E5ZGtyUmFadU4zdS9kN1lEWXFsa2RZcnhjMzhaNFQ0bmQvNlhZQUw2TjNSUFJCYVFJZ0NQdUFFWHVDRHFBWFEKK3pkd0NFWVQ3M2VBT2p0OUlPTitLWFpYRXZkd3RCZGpPcmFrSmZ1R3pUZHZVYmRDNFRkc1d6dEN1bmVFNEZ0d2NMdDBlYnR6Vmpkd1YKK3Z0dmZiWHNtZnVJYlR1SXJSOXdmTHRHcGdxSFgydU0ranFvb3l0cDEzUnV6Q3F4R2Z1UkludVMrS3F6cEhlTmQrdU5RSHVVWm1xMUoKK1F0OElIZUtwUGVJcmhlRXpqckExdnVVZG50bzVmdFZZenRkYTN0WE4zZVZoL2VWb3ZuUTR6dUlnN3VLNWZlYVQ3ZHRxTG1ac1h1Y3EKK0x1YitjSzdqY2k3aU1QN2ZQM2ZuR052a2dpNThieTdoeHkwUWVCWnNqdjdva0M1b2xza1l2RjNTdmFGcHA1YnBtcjdwbkY1cXFXYm8KK0NnNEx2QmJwcEY3cWpsN2FWcDVTcUEzby9oM3FnVTNveUlYaU51N20wOTNuWlA3bldSN29yZzdyZzUzbnZiM25mRDNtcDEzbWQwM24KK3Y1N212TjUrb0o3aU4xN3JpdDdpRkQ3bnVzN3NnNTdzeXI0cTZrMVFaWjNvVlQ3aHNNQURaQkR1NGo3dTVGN3U1bjd1Nko3dTZyN3UKKzdCN3VaaERrbGE3VXZaRjNobGZ2OW43ditFNTRpTGZzc3c0TGk5RHVBQi93QWovdzdDNTZ6eDduMGM3cTJSVGpyMjd0c2c3bXdIN1gKK3dnNVRxNTdyclU3dE1tN3QwUFh3Ylk3b3p0N3RpNTZXTDM3eC9kNys4TW5POFhyZTdDdCs4SDR1RU5jTjN6QWY4OXhOaHBRZTQrRnQKKzNqaWY4enAvZ3VpTjdUSGUzaklmOUVJdkJmSU44dEFPQy9mOTRFcS85UHhOODBLKzNyMXhod1krOVZSZjlZQm9pUHdPOFFQQjRFemYKKzlWNVBEeEZ1OUFndjh0Sk84bHBmN1JydlhDaC83TFMrOG1MZjhtU3Y4RFYvNkNiUDYydHY2U3JQNXl4LzZ3bHY4UXRQOTJuZllMNk8KKzkyMnY5Mi9QOTk4T2VvcS8rSXdQZG1WbjloMXZEdDh3K1pSZitaWi8rWmlmK1pxLytaemYrWjQvK2Z2dTg0ZStlWTFmK3FhditBWi8KKytNT082MlkrN1NVZitHby8rUEtlOThGdTY2dmY5NjBQK1NtUDlyQ3ZYSGMvKzRWZiszdC8rM0h2OTNPLzY3M2ZiYkxmMnJRdjhiYisKK1QvSEVudFhHVHZnWm4veko5ZnZNSC96T1AvelFQeENTOE5QZ0gvN2kvOUZhOHZUYXJoWS9RTlBxdi83czMvNHovUVBMUCtRRFFRSGoKK1gvLzJMLzdQLzFMbVQxRDdMMUJRdmZzQUFVdmdRSUlGRFI1RW1GRGhRb1lORWNvRElNL2hSSW9WTFY0VVNBSUFSbzRkUFhZRVFPTGoKK1NKSWxRNVpFbWJJaVJJa3FYYjQ4eUJMbXpKa3lhZDVNcVJIblRwZ25lZjRFS1JMbzBKVVJpUjUxYUJQcDBvZEdtVDR0cUJQcVZJUUEKK2VwSEFtbFhyVnE1ZHZYNEZHMWJzMkxBK3FUNkZPSXJzV3JadDNiN0ZPc3JwV2FacDRkN0ZtM2R0cjQxMC9RSUFIRmp3WU1LRkRSOUcKK25GanhZc1pDL1NLRnlGanlaTXFWTFE5dStmaG81TXVkUFgvK3BxeFo5R2pTcFUyZlJwMWE5V3JXclYyL2hoMWI5bXphdFczZnhwMWIKKzkyN2V2WDMvQmg1YytIRGl4WTBmUjU1YytYTG16WjAvaHg1ZCtuVHExYTFmeDU1ZCszYnVGTjlJSUNqaERVRWtRaUZ5Sk53TDFubFkKKzZkZjNKY2daQUxZOENnYzd5UXh0MUp2NUpKQzhKK3lHd29TU3dBbkFuQUJQb1BrS2tpdXo3aDZFTUVLS1NMaUJvQnRHSVVncTlnZ1MKK1EwQUFidml2S2djRlltK3VnVFk4RVQ3eDZoTlJJQ1QyK3crYU4wYUJCaFl4bkhDaUlCTVZkSEFVSjFqTXd3a00yd05BRElMNEcxRkMKK0paZFVVZ3dBUWtRQ0FCWmh5WU0vRXVFYkNKdFJrRURDQ2ZWYUxLakVKRkc4TWtOc0Vwb3JTb2w2cVhBZ0pMQnhyTDBrNTVMK0FKc1EKK1hmeXVQU2NjQzNKSEp2OEVWRHRzRXF4eUlHZ0c3WXRNV0hvSlVkR0IvQlRUSUVWUmhBYUFHZzlLOHcwdWl5em9rUndmblRNekp4NHgKK2lJUWNBWGprVElGR2VjVFBRRitGRlRvS1YzV3NsMGZZYzNRZ0VsVEZkTXkrSU1XeVRJSmNsZFBGVWVxYkZFcy81d0pXVG15TWhPV04KK1NwT010VnByajNQeXZ6ZWduUlhYWU4wazRRMXFGUnhNV01KRVNsYkhjZDFMRjFTRG1QVlZUcXlvUEhYY2ErL0Z0emNFODFCVkhrM2YKK0U3YlROM3E1Rk16NGZvMDNUQ3dyTFZqZGdWb1ZJMHBvSC82VXgzZEZKYlhUZXNVNGs5Vmk4d1U1NU4wZXVWQW9qVEJUZEZkNzNWWFkKKzRwWmZ6b2pYaTRkZHMwMFg0YVI1Wm9IRXV4TVdKUEwrTk9wWmFUOFd1V2lqWTZ2MFdVa1REVmJpaHBvbE9zV2xCMW9SemN3ZUdROFcKK0dXbTBFVWVIdjE3MVI0R0NITklvVXo4bDltaTExeDdOQ1ptbEJqQ3dYdVFEek9xcGlTeVhidlhrbzg4K3daeVlXRC8rNE93NWFwZXAKK05oQ0FVZDExTXVPMDJZWThjc2tucDd4eXl5L0hQUE5ZU2VpbGM4OTdtUmdtQ1Q3M1BFSE5UMGM5ZGRWWFo3MTExMStIUFhiWlo2ZTkKK2R0dHZ4ejEzM1hlSFhCN2Zmd2MrZU9HSEo3NTQ0NDlIUG5ubEMwOE9DZVdmaHo1NjZhY1hubm5rb0tFK2UrMjNuNzQ2MEw0SFAvekEKK1ZpYU9idkhQUjM4eDhvYzdPWDMzM3kvTSsxRzRwNy8rK2x0ZFh6aUliclcvZi8raHg1OXpOUEkvQWhhd2VITHhYcHorbEtPVTVUQncKK2dZOGpqbFNhSTBIcG1LV0JFQnlPQTVPalFlUlFjRGtlaEk0Rkg1aS80SER3T0NZMERnaVRvMExubUVVUUM0QmhER1U0UXhyVzBJWTMKK3hHRU9kYmhER05ZZ1JTUUVqbEpRa1FzaUZ0R0lSMFJpRXBXNFJDWTIwWWxQSkNJcWZpaEErTWdEQmp6RVloYTF1TVVkQ2tKWDMzcU8KK1dSWkFEaktXMFl4blJHTWExYmhHTnJiUmpXOGtZd3VtMkJ5bDVDSVdkOFJqSHZXNFJ6NzIwWTkvQkdRZ0JYbkhYTXlST1JLVXh5cmcKK3VFaEdOdEtSYjF6QUZ4TTRrREUrMHBLWHhDUWI1WGdsSVA2bWpvTUVaU2hGT1VwQkZwS1RWRHlSSWpPNVNsWmFNcElaQVdNTEhWUEoKK1Z0YlNscG8wNUFVelkwZFM5dEtYdi95aktkLyswMG5mSUZLVnQwUm1Nc254U2xpd3NEbG1NVUVhcERsTmFsYlRtdGZFWmphMXVVMXUKK2RsT2FsTWpsQ0FlaWhqYVUwNXpuUkdjNjFibE9kcmJUbmUrRVp6blZFTTRWd2tjQTcvQm1Qdlc1VDM1MjB3U1NwSTVaUUxFS2doYlUKK29BZEZhRUlWdWxDR050U2hEeVdvRWVpSkhLVkVJQlFYeFdoR05icFJqbmJVb3g4RmFVaEZldEVJVFBRNEVoU0FCU0M2VXBhMjFLVVAKK0JRVkFweU5HWmRiVWxwc2Nwbk0rQ1V5ZTlyU1h3a1JoY1l4cFU2S3VrcG5PWkE1Tmk3clVSK0kwcU9XYkN5OTlPbFdxQnRPa0themkKK01abTZWVWpLdElLejVHcFkzZWhVRE9vdnFsVkZhMXJ4Q05TeUJtZW9Zb1ZyR284YXkyYzY1aGFld0d0ZTlicitWNzcyMWE5L0JXeGcKK0JUdFl2QmJqcXNWUkNoaGVzVmpHTnRheGo0VnNaQ1U3V2NwVzFyS0xCY05oSXdnZkJpU0FzSjhGYldoRk85aGJlRFU2U28xcmF1T28KKzJReWVWYTJ2blNwYmlkbWJ0Nm8ydFhPZHBFQm9hVnU0a25XMnZOa3BiSVg3UzltaWtrUmE1VzFZY1J0UXNDYTN0NncxNnk2SE85MmYKK1F0ZXRXWFV1WEpjNzArWm1sNnUrMWFscnFUdmVRUlozZ3RqMUxsZTMrOVdCekdDMDc0VnZmQU9iQU9zR2NTNGlBRVIrOWJ0Zi92YlgKK3YvOEZjSUFGUEdBQzUxY0U5ZjJOQlBrZ1h3WTNPTDR6TUcwSXU1dmVwWUtYanVJbGI0YjlhTjVEb3BmQ1MxM3ZhU2Y4WVp0YW1EbkIKKzFYQ0s5Y2poRDNxWXhEWU5zWVFwK2VMK29wcFlsd09ScW9wMUhBc1dLNmUyTkZabWpNTTRZaURmMHNiaUZFaU9kNXppSHRjemxVV3UKK3FaQmxPUkJlaU1QS1Y4Wnlsclc4WlM1MzJjdGZCbk9ZcmZ3SkJQdEdLU3FZUkpyVnZHWTJ0OW5OYjRaem5PVThaenFuV1FWbHBpMW4KK1Z5Qm1QdmZaejM4T015OGlQT1FaUXptWlI5NGdocGVzNFNaMzBNV0dycVdVNjFwb1NOOFV6OEJWOUtMSjIraVRQcnJTUmgzMGxIWDcKK2FVdWY4c0xTMVRTVEw3MmJINU02azVKT3FtT3FER2hhMTlyV1hpYXpxVTg4bHovOHd0ZS9CbmF3aFQxc1loZmIyTWRHZHJKOS9ZZFYKKzYwYUNETmp6cmFVOWJWb0xHcGE1aGNWdVhZMUpSRk0wMDZtZUxxZXgrdVJ0Zy9yYXpLVjB1Uy9aN1JQK2ZodmN3aFczVUQydDdrYkMKK2VqbW9wWGRUbTUwYkZMODczUHZHVGF2enpVaDdLd2ZmQTJja3U0M1RiMy9ERytDM0VUakN1M3B1N3JiWHdSZkh1R0RwcStzYkN5UWUKK2x3VjV5RVUrY3N2RzQrRzJVWERHVmI1eXZVS1k0dXdkdGNRYnFYREV1cnZoYVkzM1pza3Q4MFVXUERrSDUza2JhUTVWVk45OHVEbG4KKzM3eURya2FmSXdmb1MxZmowRnRiZEtQREZ1bkNpVGpVMGRqMDR6eGQ2MmVVZW5SeFhQV2puN3cyV2Y5NkdibHVITE5zd2hadmgzdmMKKzVUNTN1dGZkN25mSGU5NzEvbmJEY2h6SnNGQUZFQVEvZU1JWDN2Q0hSM3ppRmI5NHhqZGU4S293TzIyZWpZZTlWOTd5bDhlODNqY1IKKzZrbkhQTzFSai94c0dFNzJxbDcrL2JvNy8veldPUi9yZEtmZWpHRXZvYzFKMzFQVEF3ZnRuMTk3Y2J5ZWV0amJsK3F6TDMzb1pYUDcKK3RPZWVPR0o4YWZLVnYveUdTdFR2aWM2TU5FWTZmZXBYMy9vaWxZYndZNE5JbFRMZis5OVB2dkdIWXhZeEdORDg5dE0rYkpSeWZ2WnoKK0wvMnZrYUR6Mmo5LzZVME1xZmRXSVBURCs5dmRQRFhwejdrL2c4cy9iK00vM2ZBL3NUc3ZBS1FyMWp1MS9YUEFCRFN1bVlLZkNaekEKK0F1UTNDc1JBOTdIQWdNdkFEaFNmNnRDTEVCVEJFY3lLaGxFT2FDREJGRlJCdHpEQkRWckJGNFRCcitDZEdhVEJHclRCRzhUQkhOVEIKK0hlVEJIdlRCSHdUQ0lCVENJU1RDSWpUQ0kwVENKRlRDSmVTT1BLR2FySEVSODFqQWhXQ1hYeG4rakwzNUZyNlprb1J3RXB1Skd2TUoKK0NmTkJsL3RnRWFzNEdBdmhGSEs1UXJ5Ukd5WjBROU9ZbFlHNGtBeGhHb1BvRU1BQUVidDVHYWc1dzUxNWd5MDhpSk81RTJLWkMwZEIKK2tYRDVEOERJR0lCeEVjRElQeE5wcXplVXhLZklsa2Fja2lxcHc0TFFFaTd4RWozc1F6NkVtNWhaaU85d1FzTmhHVWFFR1l1eGluOUIKK3hWUkpGWjA1bkVtVVJjMFlsTEdCd2tPUmdFd2tDRVlKR0ZpRUcxRHNSWVpKaUR4NGtsR3dHVUxNREVNTUZrdVJFeWRva3czWmswb0oKK25haUp4Rm0weHArSVE3VVlDRnZ4Rm9YWUZVLzh4WVRwdzFNMENHT2traWVKeFp6cHhWQnNKc2VSQnlkQmxyNlFSbGpZRTdBeHhXdkUKK1I2U294RzNKaUFycHhvUCtLQTl4UVpOeVljUnpRVVYydkVlQitFT0ZkRWVETVIrSm9Cc25OQnROWVE5UEVRaXNzVWVEek1lTkhJcDkKKzZaZC8rVWVCSVJqN1NCaGdQRWhoUEFoaS9KdDBQRVZsSkloUlVCV25FQkwyU0p6QTJFSkkzRUNPMUVtT0lCbHRiQ2JDOEoxdlVSbUcKK2dCcVRQTVMzZWNraE9jY2FRVWFFN01WSXNaR1EyQWlVcEVlbHBNYWMzTW1zcElpa21VWkdKQk9uSWNxU0ZNZFFyQnFBWE1pQmVBTlMKK2FjcDFmRXFFK2FLTk1CV0N3RWh5ckVhdHRFdU9jSnVZWUJyQm1CdkNBRWR6OFV1OWladjVBTVR3Z01Ld1ljTzZhY2txSkloS3FROFQKK01SQll3SVpGMUJvcG9VdS92TXZNMU16TjVNek85RXdlNUJ6U0FaMmJHQjNSTkozUFJNMysxRlROMVdUTjFuVE4xNFROMkpUTjJhVE4KKzJqd2QwY1ROM05UTjNlVE4zdlROMy96Tk5aZ0c0Q1RPNGpUTzR5Uk9KVmdESlVETzVuVE81d1JPNVdSTzZLVE82cVJPNmJUTzdOVE8KKzRweUdOZGpPN3dSUDNod1diQWpQOGpSUEFHQUg4MVRQN2F3R0FLaUc5WVRQNm16UDk0elArbXpPK2JUUC9EUk9kckFLL2ZUUDM4UUcKK1pSbEFwek1HNTNBRUFIQUVBMFZRQlUzUTVqQ0dLZFM1UnhuUXJpdlE1ampRQm1XT0MyVlE1M2hRQlJ5V0NXVzdDczNRQmJWUUVoMVIKK0RGMk9EbzNBOW5DTUVaQ0VGNFhSR0pYUkdhWFJHclhSRzhYUkhOVlJHQzBZQUJEUlF3aUdJQlhTSVNYU0lqWFNJMFhTSkZYU0pXVlMKK0lSMElEUldJR0RqK2hTbWwwaXExMGl2RjBpelYwaTNsMGk3MTBpbU5nU2MxVVdGWWdqSTEwek5GMHpSVjB6VmwweloxMHplRjB6SVYKK0JqSEYwQjIxMHp2RjB6emRVV0FZQ0JYVm1pWUYxRUFWMUVGdDBrUHdLck5naEU1UTFFVmwxRVoxMUVlRjFFaVYxRW1sMUVwVlZIckkKK0RCOXRQZGRiTFlHQVVsaDRBaVlRMVZFbDFWSTExVk5GMVZSVjFWVmwxVllWMVNlZzA3RURQcHlMVllHQUJFdkYxVnpWMVYydDFFdm8KK1U2Vkx2ZlZDVkY0bDFtSTExa25GMUVjUlVXM2pWSExBcVU4TlZWZVYxbW1sMW1wbFZWajFWQk5Wc2xuMUtXSDYxRnM5MW5BVlYyTDEKK1ZZSHcwMFJxMWpNU1ZzZEkxSEYxMTNkRjFreGQxblI5dlZvRlZXdkYxM3pWMTFYK3hWWlkrTlJ0NVZhZThsWVRCVmQ0TmRpRDdZUnkKK2hZVnpSYTVtWGRlQmFGZUVsZGh4VFZZRm1WZDY3VlIvTmRGbzNkZU85VmhyN2RkL0Rkamd5MVlNTGRpSlJkbGlWVmlHeFZneWVsaUIKK3NJTXBrTm1acGRtYXRkbWJ4ZG1jMWRtZDVkbWVuVmsrVU5hQjhBTTNJTnFpTmRxalJkcWtWZHFsWmRxbWRkcW5KVm92c0ZkdjZJYXEKK3RkcXJ4ZHFzMWRxdDVkcXU5ZHF2QmR1cTlRWjdqWUptTU51elJkdTBWZHUxWmR1MmRkdTNoZHU0TmRzb3NGY3o4Tm03eGR1ODFkdWUKKzNZTmZIUWcrZ05yQUZkekJKVnlvOVlORFpkZVVWVnhpcmRqMnVGaU1mZGFOL2RqSnBkeHJ0VmVBSFZsZkdsaVRYZHpPemRXVkJWYmMKK1ExeUk5ZHorMHFYVXh0VlV6NlBYeU1WUWpxM2MxNFhka05YV3pJMHRlejFaMDhWZFJnVmQxRXZYbDRXRmlNM2Q0TzBFMUgzYzFiVlgKKzE0WGQ1UDFZMmNWUXpLWGRVZHJjZ2JoZDRUWGQzVDJ1bGwybTBSVUk0S1ZlMHlYZVRlVlUxaDBJNUZYZThzMVg1cFhWNXdXbTZMWFYKKzdnMWU2MTJQaHVWVTMrV0JBYkRmKzhYZi9OWGYvZVhmL3ZYZi93WGdBTFpmWjJDQW9CV0lldkNDQkZiZ0JXYmdCbmJnQjRiZ0NKYmcKK0NhYmdCRTRFZXpXSEx0RGdEZWJnRHZiZ0R3YmhFQmJoRVNiaEV0WmdjN0RYd0hPOEZXYmhGblpoeG9POGtoMklWaERnR3JiaEc4YmgKK0FNWUF2eFVJQnBpQUNnYmlJQmJpSWFiZ2V0RGUzM1hmM1AxZTFVMVg4UlgrQ1BJMTN5aWVWdlJOTXZVVldOdE5ZdHlGWDNSdFdkL2wKKzNpeFczQ1hPTnV4MTRudVY0ak9tVmlxR0JlZTE0dkxDWWpEMjNDMldYOWZ6WWpqMlhERm0xdkE5WGpUbVkxZFZZelp1NDBCaVgxaVkKK1hqdVdXRG5HWHQ4dEIzcGc1RVoyNUVlRzVFaVc1RW1tNUVxMjVFdG01RklRQUFPR2hXanFwMDhHNVZEV0puQ1NZWUhJaGk5QTVWUlcKKzVWVm01VloyNVZlRzVWaVc1VmxHNVd5d1YzS0twMXpXNVYzbTVYZWFwMUtHaFQ3QTVHRW01bUkyNWt0T0JoNkdoWHNTNVdaMlpsRCsKK3A1Y3ppMHFRZ21xMjVtdkc1bXpXNW0zbTVtNzI1bThHNTJxbWhrMjIySUVZS1BCRDUzUnVQbnU5aGlwdzUzZUc1M2lXNTNtbTUzcTIKKzUzdit4dWQ4ZHVkcnNGZUx1cjUvQnVpQS9xaVNBbVliQ09lRFJ1aUVWbWh3emdSbFRpbDFodWlJTHFpWWt1YkVOZVF3bGxmd2RiMHkKK2h1SSs5dWhSL2VOQTF0dzN2bWlVUmVRdVB1SXZMbW1EeFdNeTN1T1BodWxTRFdtUkpxVkJMdVNWZnRlVHh0ZzZ4bW1KYmVtVzVlaVkKK0Z1cFh2Vnlhcm1tUzdtbUQxV2w2cFY4eWNPcW5odXFvbHVxcHB1cXF0dXFyeHVxc2Rtb3pLT0J5RmdpM3k3eXdGdXV4dnJ1KzAxZ00KK05ZZHZVT3UxWnV1MmR1dTNodXU0bHV1NXB1dTZWbXNVQnVaMUNJQzk1dXUrOXV1L0J1ekFGdXpCSnV6Q051eTlYZ2Q3WFFTdFp1ekcKK2R1ekh6dW9kTmxmT29qeXl0dXpMRHV2TnEyalNUZXFEL1duSWZlbitvWWJwbVRicVVMTHB6ajdZcGU3ZGxFWnRsczVvSm03V29CYnQKKzBTN3Ewalp0cEc1dGNWVnRoMlh0M0hiWHp6WmVZTzdvMlk1aTByYnRVc0p0M3piVzNaN2YzbGJ1Y0FYdUpnNXQ0dVpqNHo1dVFEcnQKKzV3NVg1cWJqSTg2RVNBRHY4QmJ2OFNidjhqYnY4MGJ2OUZidjlRNXZvUFZxV0hBdmxwUHZpOXU0c3g2SWJ3aUQvTmJ2L2Vidi92YnYKKy93YndBQmZ3QVNmdy9QNEdlOFd2QWxQd0JXZndCaCt3QXdQbUMyRHZDYWZ3Q3JmdzllN2J5ZjdiK2Vid0JuTzVuL3hRenRadVk0M3UKKzJKNXU2ajVqNjc3dURVdnVFZGRWN2c1VzUzWnhYaTF4UFJadUZPOWpGVjl4UHNydUdlZFZHQmZkemQ1ZUgyZmMxeDVqb0Q1eEhEZisKK1h4M2Y4UlZyY1NLblZDQXZQaG1IY2t1dDhZMU9jaVZYWGladjhyVjY4aXFQVkNuL090ODlCMGd3OHpOSDh6Ulg4elZuOHpaMzh6ZUgKKzh6ZzM4ejdvYXNlbE1tckQ4endIczF5emI0RkloekVBOUVBWDlFRW45RUkzOUVOSDlFUlg5RVVIOUhTd1Z6U3JzMGlYOUVtbjlEbTcKK00yQ0dBam5YOUUzbjlFNlA4MVpRWm1qVDgxRW45U3V6TmhDWFVCRUg4MHE5Y3Q3TGNpMlAzZHJ1OGo3cThWV1BjbVhtNHAybWNsdVAKKzFGYi9QTm1HOVNXWDlWbmZvMXJuOVRESDlUbU9jU0ZING1PUFYwN09ZeXkvOFdBWGRtQUc1Q1kzZG1kM1ZESFhPa1UrNW04SDkzQ3YKK1pFM21aQUxRZ1hOSDkzUlg5M1ZuOTNaMzkzZUg5M2lYOTNQK053QjcxUUl1d1BkODEvZDk1L2QrOS9kL0IvaUFGL2lCeDNjdHNGY2gKK29JS0VWL2lGWi9pR2QvaUhoL2lJbC9pSnAvaUVGd0o3RldaeDEvaU4vL1prMW5DQkVBQWFtUGVSSi9tU04zbDVKNEFqcHVhRlp2bVcKK2QvbHVIbWRPUG1lSnBubndjNzQraDRWMjF1ZWQ1L21lOTNsODVtZGc5bWVCSnZxaXZ6NkN4bm1EZnZtbFozcVdiK2lQWCtidXEvbXAKK1h6NktSblVGc1dodGgxUmZUenRncC9iazVmSlp6M2F0WDFSdWh6cWVKbnRINWZxdjgvcXZmOTJ3Ny9LeFQzdXpYenEwVDN0R1hYdXQKK2EzdTNwMXk0eC9ZdjEzcTZEenJmN1lCTE1QekRSL3pFVi96RlovekdkL3pIaC96SVAveUpTVjFZc0FjdXd2ek0xL3djZ2dIK2U2V0YKK0p3RDkwQmY5MFNmOTBqZjkwMGY5MUZmOTFRZDlXckJYWllDaTJKZjkyYWY5SjFJR2U5VUR5ZGY5M2VmOTNvOThDbEJtTWRqODRTZCsKK3piZUhJMDRxRVYyT1QxMStFMjErRkZVT1ArMndFRzhoNVZjTzVyOSs1ODkrNkU4TzZXOHg2bjhtNjA4TzdCOS83UzkvN2tjTzcvY3gKK1pibUtHSFQvRit5UDk1Zi9FZXdCQU9pQitjZC92YWovKzgvLy9uK0wvUWNJRWdJSEVpeG84Q0RDaEFvWE1teW9FQnNBaHhJblVxeG8KK2NXQXZBTEEyd2dMZzhTUElrQ0pIa2l4cDhpVEtsQ3BYc216cDhpWE1tREpuMHF4cDh5Yk9uRHAzOHV6cFV5ZkhvRUtIRWkxcTlDalMKK3BFcVhNbTNxOUNuVXFGS25VcTFxOVNyV3JGcTNjdTMrNnZVcjJMQml4NUl0YS9ZczJyUnExN0p0Ni9ZdDNMaHk1OUt0YS9jdTNyeDYKKzkvTHQ2L2N2NE1DQ0J4TXViUGd3NHNTS0Z6TnU3UGd4NU1pU0oxT3ViUGt5NXN5YU4zUHU3UGt6Nk5DaVI1TXViZm8wNnRTcVY3TnUKKzdmbzE3Tml5eXlLUkFLc1hVdHhHZS9VaTRVUk1iakc2Z3c2L1BmczQ4dVNiU2VER0RjMUpyOTlDaXc5dHJwUTZ4K0xZbFhQdjd0M3YKK0k5dDVTTUFhYjExQ0hsalFxUGZtRGMzNGJXallTTXlINWx1NlFOdXc2TnVISmNHSkU3YmhsZ2QwMkd5MDNYY0pLcmlnV3REY0FNc28KKzBDQmhYWEhqVFNjUExQS01BaCtGc0lqeDRITzNBWmVkY1U0Z0FRczJFOEppSWhKdk1QZ2lqREdXWmQwTjcxbm40UTMrNUUxSG9tNGQKK1N0QWJDUnF4Rjk5ODlNbHpJNEl5S3Jra2swMDlNb3FBdkwzeFk0YWpuRmdkaGhxdTZHR0hZcEJYRzN3OHd2ZElpVWkwMkNTYWFhcFoKK0ZEUUFYSG1nY2FOQTE1dFFBdkYyb3B3Q0dhZmJmZW4xQ0NkdS96bEIzb0RRUFJqbW1va3F1aWlqalRyNmFGbjJFZlFlcEpWYWVpbW0KK21XcTZLYWVkZXZvcHFLR0tPaXFwcFpwNktxcXBxc3BXSGh0dTVBUkgraVU1MUJ1ODNWZ3JiOEFWaDJzdmIyYlhDNjdBM2FlanJRRkMKKzVRU2xFcEFKQzVpelRtZXJnTGZaU2loeHZBMUtGSzdTN1FjZ2VjSUJ5eHR6dUlvSG5STit1Z3FoczBPUm9KK0RzY0o1M2JUdzhTcGMKK3RkSHBHSlMzdUc0MDdJSFdqdGdVRWdadU5NcitpT2toaXRTOFBjYTdxNjIrY2xUcnRmdHk2NStVUUg3YmkyMzgzbmJ1S09uV3llNmgKKy9yMmJsSzBZNzFreW9zWGV5MUcrdkpWSHJzSEYvc3RVcXh6QnVsSE1UUEVxTDdTSTh1cndSaERyU0dCMDZmMzRMWE1YQ3p2eHhoeDEKK1RKWEFZcmdxajBhSTNxZmZqaVFlck4xR1doSTEzTG9iU1VEdHExQTlzbXlOKzk2NDBYUFJ6VHd5b0ZtUERHVjFHNmtZdG4vM2N0MzEKK0RTY2ljY09SQXFQb01iNkhodGQxMWNYZEFDRFdXbXU5OTl5TkU4Y1IzbVBEMSs1VE40eDRzeGlKQnlVUHVXK25EUGZvVlg1ZDluNzYKK1dRNDMyS29US2pnMmhMTnN1SDdNd2IyNHNYTEhQYm5qZEorZVlkL01BbjU1eUUxRjdXcm5jSVB1ZHQyUDY2NyttOWRad3lwUDhIOWoKK3lEcmxydDhHdSt4RmpaSmUySC8vNlRUcXo1TU9PWUxEY1QzY3pVNkZHRERPdGhlSG5ucllEVG1rNDVqempnVFpJME1lSVVlZzBiSHYKK2xlZHBUa25SaXQ0anZwRjVhU09DYzl5N0lCY20vY2x0Zld3ckhsTXNWek4wd1kwRXdLRWc5cmJHdTRORk1JU2xHMTB2Q05pcTdqbncKK1JNanlrTzNDMUVBVU5VOU1JNXdnQnJVR1FMWnRTRGNnWEFvQjhXYkE0bmhRUFRuY0cvNzg5enZjN0ZBOTUwTGY1RktZbmhWU3BXWW0KKzJnKzlTS2dpV3ZFbVdyRFkyUW5UQjhIbVdFdHlURUdXaFZTMHRxQlk2Rmt1TzFrWFQwaENYTDBCUTFCMEhIdDZJVFVJSGVrcDYwTEMKK3pUdzR2cUQ4c0dTNkNwcXQ1Q2hHN05uK0NodWlVd3I4U0pDZVIrUmhrR3hjR1NMcHBMQTQzbEVvRU1PR2pVYll5VDN0Y1JSOWRNb2YKK2I5WTNTMTZ3T29tRW95WnZ1TWo3OGNhUlVMSGlpU2pKeXZoeDBXUzZtVmNZc1JVZFVDWnhsTTBwNVNtbkFzb0h5WU5zeGVFZkNZQlcKK3VpU0dhWkVvck1yWkNBYUx0SzBSUjVnOG53anpkMFM3d2NxWVRxT1VFM0VEcTNJKzVVUEt5cEF6ZzRLRVVWaXBoaVVjWXdCenFFUWIKK1RrVnpzUG9iaDRTaW9XOU8wM3lrZTllSGdvbkhLRzZKblU1eEo1bElZRWU0emJPZXV0dVRRWTFZRk4wMFVZQWtmTW95aFJmUXo0MkMKK29Fak02SFowODZHT1BsR1VERjNuUjUxQ1Q5c2NyVmFJMHR4dWVFZE42SjFMYnBYcm4xUWNkRE5iVGFuK09CcVNwZ2gzNmpRenFpOTEKK1l0UGJDS25uTjhEaGhnUWxqU2xTbkpDMm1xNXRRdWk4cUNYL1o4YVIvUlNyR2FRbmw3NlZ4YWZtMUhteTdGcFB0UWJRc3Bxd3JGVzkKK0tndGZsYmFrdmFGL1h0M29qcFE2c0xIQ1I2ckNteWhWWnByV1dxMDFiMjI5Sno1TjF6enJWVzk0ZGRYZVhZRWFsYzc1YXBPOWVBUVkKK0RRck1uZjBNc0pSaldsNkprcVBBVGt0TzRMSW5MQWtGTFpVSk00N2JpcGdKWDFZMDQ3UXBsRTk1UlB2ZXhTdjZ2UEtHUE10VnlaSm0KK3I4ZmVsbGhXZVlQQklqaXQyTDNXb01uOW9xM0VVTnBlNmxGaXVKV2p4cHdEQU44NkJiaFo0NVVFcUdzLzFpWXl1YlExclc3TGRkQjIKK3VrbW4wRkx2Ti9lR1h1eTZiTHYrbnN4dWZLTUxYdFNxWjd4bVhSV0NFNXltc1EyRXNFNXBKa0hzSXFtQmZEVXFFeFpJaFFuRDRQeFkKK1pjTjRvOHVGU1pEaHA0UjR4SUlweVBXb2dtSzdRSGdnVm1teG5oUXM0eG5UdU1ZMnZqR09jNnpqSGZPNHh6NytNWkNETE9RaEU3bkkKK1JqNHlwNllVRkFtNGlDUDhRNXhVUklJYnFtMUV5aG1xMnVkQWdnMEJENFhLVkdzY0FPUkJOWkdReDhwai9vaDhPNUppVHpiWnlhTjQKK0F3RDZlcVdSVkJra2FmdmRSbTdRMHpiTjdGNWhqc3FaUDNMbE9vZWt5bXUrOGtlMmZCUXFkOFNvR2hrSmJ1amNFUzBiak5GRHVRRUEKKzNuWWtqK0FVMFNESkVxV05FaVNSaURuVVNNWUxDWXFuNTZBRUNjcEMrUkNua2FybUxsZnR6d0wreFRKSExNMWtMbWY1eW05NGs2ME4KK0haUmc1eHJYSlBqMXJJZVNCNDlFRjVCcEU0TldoVDBVVzg4VDJhOWVXUjdhREl0SFBMRFYwbll6bkxWRkZFc1grOXZEUHJTdW9Xc1UKK1JudGtXWVBtQ0xHSkRlOFVIL3RFNUhheVIxYldPVEx4RDluM2RyVi8xTDFvWEZzNlNMSSt0VnM0YXpjQVJEZmJWZnMzTnF3RXlDVEoKKys5MFYvemU1NmJOdWpWQ05UdWFPOTZIZlBlOWtDMFhQcTk3WEF6djNub3FUL0RiZmZNU2hCYjZpZThrRHppTVBpcHplODJha1lyelcKK0lXKzV5UGZ6d0Z0WEdWaFhJamZJaVpMMGYyOGJHOXdtenNxTXhmU01ENTNXdmI0NXd1dUNEZjFrTzRCYmZ6aXVEM1Qwc0ovYjZrQVAKK09zQUxiR0l2WnpyVEgxLys4OFhEYnVDS0k0SGhUTGFadTd0MklwWVRPNzJ3aFpDcjZqNmlnRDBDeS9LV0tOYUpybmkrb3h2WHZTMEsKK3UwRjNLS1REL2VmeEJnN1RCOFhuaGM5TURPK1p1dU1OdlBHclY5bkVXWGRMcWdlbU41aUQvU2dhTDByY3paMzIyYk44MEZTT1lkSVQKK24zWVNMS3ZpZDYrN3dXclBlTkx6VU5sTi9nL2xKR3I0bnlOdTdXU1B2TkliTDVUYVI3NXo2YUY4MmFkTjc2bVJmZk1SWXpyYWFjLzgKK3RCZWNvS2QvaThMZk1LTFVNeHI4L1I2L1NGeE41dkRmbS9vYzEwakFiSk43UW4rRVBJR09zMzVVM0dwdDA2RUlYMGpvQnJIZEd5VmgKK1MzcmN3TEtBanNqVkhwUGwzYTE5bXNVZG9PelZIL05CWDcxaEg3eGg0S1NCaEk3OG0zbitiVnVUZ2QvL3RWNzJRUjdCaVlTRG5SOWIKK0JFZ2VDRXpOMlpzS0NnVm85WUxwblIzMEtSN3hQZDY0M1YvWC9Ocis4U0N1allMQXlGdmRoWVFMVWFBRVlNand4Y3JRNmROK1dJbUIKK3RRaW82VjZHWUFNMmpCLzkrVnowK2FEYXNhQzBPWUVwNFZvUllwMEVHTmkvT1VGSXBNZm01WnB0Z0I0aGlSNFpscHZkdkJrTTBzVWoKKzZKbU9qTnFuL1p1UkpFWHNHYUhab2R6b1dWcU9GR0VoeXQraCtkM0NaY3dEQWQvWnRaekgyUTBWYWhmeWVWci9BVjNOVVdBUW1sMFUKKzRpRWkzcUd0ZFk2M3ZWMFlqdHk5QWVHS3VNb2xicFAva1YzUXZkN29rV0w0N1dGYnRJa3RLZDY5Q1o1U0ZHSWprdUt1SlNLV3RRZ2oKK2hoeTU5V0Iyck16K0RUeUlzNzNIYzl4TUZGYWJyMGlBZzNFaEtGcWF2RGtCS0liaTRsbWU5SW1OeklraXZYbkVDbGJpMG9XZGJ3UUYKK2FDSE9JK1RTRzN3ZUxhWWJyNG1ocGMwVEZlcmlXamhCMWIzYi8vVkNDaHFGTU1aZlFIS2lvaG1qT3pLaVFZWmVlb2dFQTdoZHJOUlgKK3RjV1pSWTBFRk5wWmhRVlBVUVJKaG5Gam9aSGFIVjRkUm9hZ29BVmFRcHJpbXJsaE9wWWtzYzBISjBhRTA5VmhwYmtoQUhSYUNzNWkKK290MGpQb1lFUi9JalVBYWxVQTRsVVJZbFlDaVhJWVhGMFpTTXlYVEhVcGJNQzE2RnR6Q2wrU0hHVS9hTVVXYWxWbTRsVjNhbFYzNGwKK1dJYWxXSTRsV1phbFdaNGxXcWFsY3Z3RVcvcUVGMkpHQ3JhbFhOTEVXMTRHSU03K0pWN09SR29BQUpCY2hGLytKV0EyeENqVW5tWlEKK1RVa0ZKbUltSm1JT1psMWFScEFvSm1SR1prVmt4RjVXWldaUVRXTldCbWFLeG1hR1JpcUN4bWVXUmtSd0ptRmVabW5DNVduYUpTMXkKK1JtaVN4bWlHUm1lQ1JteCt4bXg2Um10MnhtMkt4bXZDUWdjd2dtLytKbkFHcDNBT0ozRVdwM0VlSjNJbXAyOVNRTEZsSm1YRTVnL3MKK2duUk9KM1ZXcDNWZUozWm1wM1p1SjNkMnAzVCtRSE9LUmlxS2dYS1dwM21lSjNvcVp3ZFF6bXFHeG01ZVFpZkVwM3pPSjMzV3AzM2UKK0ozN21wMzd1SjMvR0p5U0VKMndHMnhNd0FZRVdxSUVlS0lJbXFJSXVLSU0ycUlNK0tJRStBWUNDSnBiSkF6MzBKNFptcUladUtIOWUKK0FudFdKa2Yrd0NlSGppaUpsbWgrL2lmaU9PZGt4T2FBUXFpTHZpaU14cWlEU21pS2ltZUZYcWlKNXFpT2pxaUg3a3Q3Z3NaNzdxaVEKK0R1bCtvdWlWcWFoa3NLaU1MaW1UTm1tRDB1aVIybWl1NFNpUlZxbVZka0tQN3NlUGZrYVFYcW1YQ3FtUjFtWm5LS21UbHFtWkxpbVUKK2lpbHIzdWlYdG1tT1ptbHV1dWU5V01NZzFLbWQzaW1lNXFtZTdpbWY5cW1mL2ltZzFxa0NUQ2h0QnBzUHZBQ2lKcXFpTGlxak5xcWoKK1BpcWtScXFrVGlxaStnQ2gyaWFXTVlBQ0JDcW5kcXFuZmlxZ1dzT0hvc1p1TGdBNW5DcXFwcXFxcmlxcnRxcXJ2aXFzeHFxc25tb0wKK1hPcVlCbHN1eElLdTdpcXY5cXF2L2lxd0JxdXdEaXV4RnF1dTVvS3RybW4rcnEzQ3JEYXJzejRydE1ycUFvenFhWlJxdEY0cnRtWXIKK3JOWnFqUVpvaXVXcXNZYXJ1STRydVJJcnNuWXJoUzZydHE0cnUyTHJ0UG9vaUc2RXFiWXJ2ZGJydGliclpzUW11Sllydi9hcnZ3YnIKK3VVYXBaMVlvczlxcndSN3NxYjZybHNZckxQakNLandzeEVhc3hFNHN4VmFzeFY0c3htYXN4ajZzRWVCcllRWWJLWVNDeUk0c3laYXMKK3laNHN5cWFzeXE0c3k3YXN5SktDeDJaR0tncUFCV3lzemQ0c3p1YXN4dm9DdFpyR2JpS0NGQVN0MEE0dDBSYXQwUjR0MGlhdDBpNHQKKzB3YXREY1FzYXFaWU5ud0IxVmF0MVY0dDFtYXQxbTR0MTNhdDEzNHQxV1lEMUtvbVJ3Z0FOVFF0MnFhdDJxNHQweUpDejRybXZZaW8KK204Nys3WWFHYVdwYUJwbWVxZDd1TFlPbTZkMVdSaXBhS04wT2JvYkM2Wlo2UnBjU3J1S2U2TmppcllEeUxlUkdib0g2TFpKR1J1QlMKKzZlSm1MbjBhTHNQS3JlWitiaWZZYmVWQ1J0NUtydW1hS2VWS2FkZGdMdWhtTHVlUzZyM0lBZ0xNTHUzV3J1M2VMdTdtcnU3dUx1LzIKK3J1L083Z1Ewcm1ZR1d4MEVnZkVlTC9JbXIvSXVML00yci9NK0wvUkdyL0hXZ2ZCU1Jpb3l3Tzltci9adUwvZityaXk4cld2ZXk3d2kKK0xQbTJLN2NLckd6aTZyK3VML3YyYThDcTZYSVFiUG5PNzdvcWJKd0NxZmpTci81ZTYvbkM3OGQrYS9zR3NBQ2JhL1ZPUnVBVzdQNG0KKzhLemE3K0YyaHJVcU1BVGZLN29XS2dBUHNBVmY4TEVXc0dRY2NBVCtkM0NyTWpERGpxOEhqekE1OU8vZlBxZjZZckFLQi9EN25yQUIKK3l5OEprekFJd3k1SHlHNzMzakFPNS9EdUJ1OEVlMFpzRnEvMEJyRVFEekVSUXkvMTlqQnVacW9PTHpFVDUvRDN3aXNOYjRUbnR1N2kKK2lpNXBwbGlMbnE0V04ybnFEdXlVVXZIbnZtNjF4aTBZYTY0VmV5dEhaUEVXcnpHTWRuRzZybTRadXk3NGprYml4dkhnbm5INllqRWIKKzcvR0x1dkZuWEs0ZEs2NFkrK3k5QUMzYkhqSWlKM0xTUGkwU2MwWnNUaTNZUnJJa1R6SWxlNjNZTm5MOGx1M1pLakluZC9JaHV5MFUKK2p6RkhPS3pPbHJJcG4vTEZkaXdtL3k5SGhLekx2aklzeDdJc3N5ek1yckxNWWhuTm9ySXU3N0lwODJ3b0V6SkhpSEFNUjdBSmorNysKK1kranJDaWZ6K3Jhd01Uc0dCdyt6Qjgrd0tNc3JOSHR3TVY4eFIreXJNbS96dURLejZtWUlBbGV6QWtzek1GT3pPRVB3TmFQeFJtZ3oKK043Y3pBZHN5Wmp6ek9TY3dPY010UjBRREorU3pQdTh6UC9lelAvOHpRQWUwUUE4MFFlZHpJbWh3Wk1UbW9WSXFRemUwUXorMHBGb3EKK1BKUHRSakFBTHhRMFJtZTBSbTgwUVVmREhPc21HUWZ5SFNNMDZUNHVINS8wazVMMFl3Q3lTTlB0SU51ekZMYzAzZUl4QmFjeFN0KzAKK2d2b3hwbjZ4VEx2cFM0ZHZpUGEwbTlLMEQ1czBUaDkxaEtxME03T3BVSC9wVDlOeFNEZjFsUkwxcmVveFVpTzFUaWN4VDB1MWxUNDEKK1NIT0VPbUNCV0k4MVdaZTFXWjgxV3FlMVdxODFXN2UxV08vK2dGSTN4Zy9QQWwzWHRWM2ZOVjdudFY3dk5WLzN0Vi8vTlYwZk1mcisKK01aYnhnVnNmTm1JbnRtSzd0VHA4dEp3Rzh6d3JjRHJuY1RhN3MyVy84MkR2ZE5lRWMyVFBiejBEdFRsM052MU9kazJ2ODJXZk5yQjYKK3N4ZHZ0bWpyNzJkRE5XUzM5dnlTZGxGWE1HcmZkZ1pQdEdQQ3NHeVQ3MnQvZFdqMzlzSFNkbFZYTm03anRtcS9NVGdMdDI4N052NXkKK2hEWGtnSFJQTjNWWHQzVmZOM1pudDNadk4zZDN0M1JqUWx3elJtenFRZ09VdDNtZk4zcW50M3F2TjN1M3QzdS9OM3lYdHk2RTkySmMKK3IzZmZOMzdudDM1N3Q2aitNa3pEd2hSek5aalN0MktVN2xXamRGWXJLeHdMZUpWNjlXUEhOSU1US1ZVN3NsRWZPSUlUZUdMK3NIU0UKK0M2bURQemVFYi9pT1RuaStWcmlGODNHQ1ovS0NnN2lPZGppWEZySW52emlNTHkwalozWnhid1FrVnpLTzU3aU9iKzBsMDdpQ3c0TFoKK3hyaVFEN25RZ3ZMQ1JqRXNnQUl2THptVFo2d3ErL2lJcDFnRXpES1ZWN21WcjJ3RVlEaGl6R3pOTnJtWGYvbkRnb0p6dDNoc003ZkIKK0VqZUYyL1p4bjNaeUU3YTZtcm5CL3ZhRHc0SXd3em03b25tVUcvZWFzN21XSDRZODIzbTd5cm1IMHptZzF5dWVzN0pwN3ptZjZ6YmcKKzhuYWgxKytZSSs2OTRETkhWN3FsWDNwQUh6U2pvM0NLTFRSRWZ6cW9oL3FqU2pTVWE4YjFYalNtcDdxcVY3cEgremRvQTdpS2gzaWYKK0c0YUJsemdibjdpcE0zV3NteWlMUzNwUTc3cUppamorb3NPQ0d0djZyYzk2WVdnNHNQTm9wRHR3VkM4N2h3cTdhVnExc2U4eHJ0L3kKK1ZrUDdodmE2cy8rNnR0Y3RzaE5HclZmNzZWNTdQT3Y2dHhkdXMzUEdicUpEQ0x3N3ZNZTd2TTg3dmRlN3ZkODd2dWU3dnI4N000VDcKK1lNU21PeXlEd0E4OHdSZTh3Ujg4d2llOHdpODh3emU4d0x1RHY1OVlZZTg3eFZlOHhWLzh2cVBEdW0vR0F6LzZ1aDc2dE91NW9ydHoKK20ydjJjbnM4cExzNmJBYzN5dk52eEFjR01vKzhaWmU4VnJOMnkyZXJvSk01eTkvOHM0SjgxSXE4ekc4enpmKzRQSEEyenp0cnp2djYKK3poLzlyUHI4WmNSODBIUHowS1A0eVRQOXN5Wjl0Mi9FSUh3QTEzZTkxMzg5MkllOTJJODkyWmU5Mlo4OTE0UDNwcS8rYUxESmdOdS8KK1Bkekh2ZHpQUGQzWHZkM2ZQZDduUGR5Ly9GRm1LdHIvUGVBSHZ1Q2ovU0JzdkdiVWNicjNwN1QvL0VZVU83bVhPOS8vaGJJbmZvY2EKK2ZtWWdQdVhyNStJL1BZay92dW1hTzBWbkNPdG1mbjV5TzdzL08ra3o3dG9uYWVkN2Z1U0MvbTVuZStyanArbHovTDJjQVF2a3Z1N3YKK1B1LzN2dS8vUHZBSHYvQVBQL0huUGdwRXZsOEFQRElzUC9NM3YvTS9QL1JIdi9SUFAvVlh2L1V2UDhTdnZ1WGlzallVdi9kL1AvaUgKK1AvR2ZnZVZqeG00cU9aaW4vNUkvdWYrRy9FWk0rWlhIdi94VGVaWnJQMlJ3dWZybnZ5Nkx1Y29ETjZGYlBVQ1FFemlRWUVHQkxXQWwKK2xBZEFYa0tIRHlGR2xEaVJZa1dMRnpGYVhOaitNR0d1V0I5QmhoUTVrbVJKa3lkUnBsVDVNWmZEalJsaHhwUTVrMlpDRWdCY3JqSzQKK2syZFBueitCQmhVNmNJSERteldSSmxXYUZBQUpod3VHUnBVNmxTcFBoQW9aTHRXNmRldkxqaXZCaGhVN1ZtVkxyQnk1cGxVTDg2aEMKK25WWGh4cFZyc0toTm5Hdng1czNZOU9sY3YzK25Yb1hsVlcvaHZJUTlrbFc4bVBGSnM0T3pHcGFzdHUzZ3Q0QXhaOTVaRjFibHlaL1gKKzhrMklMa1JwMDZkUnAxYTltblZyMTY5aGwyYm1NakpvMnpVSnUxdTJtM2R2MzcrQkJ4YytuSGh4NDd2ZDBVWjdtem5idTdENHhKWSsKK25YcjEyT2lNUG0rK2ZhWm9XSmM2aFJjL25ueDU4K2ZScDFlL25uMTRTTXE1eDY5SStBa1QrL2Z4NTllL24zLytmLy8vQVF6UXZpZmcKK2s4OUFpQ3FUaDU3MkdHelF3UWZadXlTN0F5bWt5RHZ3SU14UXd3M1RlKytzQ2lta1Q4QVJTU3pSeEFBSi9CQkVBeE5ja01NWFljeFEKK1FydFdyQkdXQzJQTVVjZjFQSVJzT1J1WkUvSEVJWWtzMHI4VWZRU1N1eFozYk5KSjhXYnNURHNsNWNQeHlTdHo3SkV3S20wVDBzZ3YKK3dUd1J5UzI1L0l4SkxOSGtNRXJQeXR6T08zV3NpMVBPT1YxTHBNQTJQeU5NbCtQNDdOUFBQNDNUNVU0OEphdU1BV2JvVEZSUk9kV1oKK2tGQTNuVW9JS3Mwb3BWUXdNaDg5ckxiRUd1dlVVN0lld3pUVHRSSzhyTkpUL2VLTXpWRW44MjVTVkdHTjY5TGFXTVVMc1U5eHpUV2wKK1VHbXRsYkxuNURFMTFtR2pVblZLWHd2K2M1WFlaYU9hOVVka3U5cFUxMm1wQlluWFo2RmRxbFJtdVFYSzJHd2xjM1dWY2NrdDE5eHoKKzBVMVgzWFhaYmRmZGNZMFlGTnlsQ0pNbWxIdnh6VmZmZmZudDE5OS9BUTVZNEh1bGtYZmVwQkswNE4yRkdXN1lZWGUvUFRndjc4U1EKK3grS0xNYzVZNDQwNTd0ampqMEVPK1dLREphYUpNSkZSVGxubGxWRW11V1NaS2tPQzVabHByaGxrTVJ4OU9TM3ZkRGE1MTU1akVoVm8KK2pJUWUycUpWamNZSTZhUmw0cG5waTRwK09xS29wWDZJNnFwcHhQcWlwYld1eU9tdUlib2FhN0dySmx0cXJzR1dNbTJZQUdqYjdiZmgKK2psdnV1ZW11Mis2NzhjNGIyN1VYeXR2dnZ3RVBYSEM0OTA3N3BzRVJUMXp4d05mT2lJVEhJWTljOHNuK0thL2M4c3N4ejF6enphRnAKK1BDSm9OZzlkOU5GSkwzM3l6ajIzMnZUVldXKzk5TlJoajEzMjJXbXYzZmJiY2M5ZDk5MTU3OTMzMzRFUFh2amhpUy9lK09PUlQxNzUKKzVabHYzdm5ub1k5ZSt1bXByOTc2NjdIdlhRd0FVRTlvbEJzZXlnUDFoWkNLMjZtcytuN2JLZkloZ3Z1RzdpVkNId0FKSG1Mb2NNTFQKK2Q3dWgvQUhvQmVjYnNiVTk4RDBFQ2FONEF3Q3dFYWtid2EwWENYRWYvTUwyUVA2MVRZRkdnZURVamtVUjhyRXZXckI0WC9aQW1EUW4KK1BPSWhiNkJmUXJiSEVRNDZKQTlPYU5zb2tHQ2haOGxQSWl0MElFY0srSVlZVGtSK09uUkliVlpvUTZ3NEJBazNhQ0FBSlhLNEhjSUMKK0NVNFlSZWZrOFFZU0lqRWlrY24rNFJJajZCQm9PT0dJTjV6SUZpOENPcGlRVDR4YzJXQVhRNWpHa2ozQ0NTd0V3Qko3RVJrYlFrT0sKK3NOZ2lHdHMzdy8xbFVJaTA2a1VGOHdpWlAvNFFMVUhrbzNiWTl6TlltTkNFUmtHakJMRGh4U291WjVBMTFFNGV0S1BJemdDU1hobnMKK1pFS3c4VDgxamhKYzBPQ2VUUWJZbVVmSWNVcGk2S0lRQ1RsSnlGaFNsZzZCcEF3aHM3My9BUkdSaDdSYUpLa1l2amQrenlFakpDQkgKK0ZFbXJXOUtTaFdqVUpEWWFJb2JIVVpBRUIxemZYYXFKd1A5bEV4djAyK0JkSG9FTkJPYWhnZjRUWnpjVGtvZHo1Z0dGY2NUR0tPNHkKK0NrNlNrcDZqTWlZc3NNRk9XSWdoa3F5c0NBbUFHVDg5emhLRHRSd2lEL2ZZbVNQeTBtcStURWorQVpINUxHSmljb2VhVE9aeVlFbFEKK081SUFpNHBFd2lrWE1ncFlZUElHU01Da3hYQ1NRbGc4b29IeXdFYm5qdkxObGI1MHBXMjdVUzg2WjhEQnZHR1BuWE5DU2JjSVRqelcKK2s2aUVZdU0rMzFETWh2aFRJamtVWlJYZnR0QTlFazZqc2FRTkxzbUhCSFF5bERad3c4cmJRaW5KRXVxempzRnNIOXdpUmF1TVR2Q0UKK1ltM29RYW5JRVBKdDd4RlluSkJNMFprUUY5N29oT1NUcDBOdVFJTHRvVTRDZDhsb1VSRUxwSStDVHFTZEdTQlRFZlNHSjNwdG9MRHMKKzQzS1dLVkNDUnZHamhld2xNNWw0ZzhiMkNwTnZheU1zN21sQnMxbzFJWm5ONGtOMXl0cTNhalF5Y3IwTE9RSGdCSGFLNFFadjZFVWMKK1owbSsyc0NUaXVTTG8vcitPTWkrd3lhV3VTQzZRVGoxZWR5M1ZUVWhOM0RDVXhFcVM4c2V5NC96OUNJSEE4dFZ1TTdXSmxLRnlDZ2EKK085SlRBbFNZTWJ6b1F5cFowS3ZLZHI0Y3JDMUtJWUpKTWJ3aFVqSWxYMTVoQVZ4Ly92VWhwaVNzWVQzWlhBVWZDSkpKcmFVTjgrREQKK2kveU1odkt0SHc0TmFOY0xheFFKQi9Rc2VVRk1Bdk1TOFEzNlRFZ2R0ZnBCZVRnaHJkaXlZb1lud3NFQ3BuSzFQOFNaZlNOS3ZuQkMKK2tYdDFoRVljWllZVDhnRzBjNnZFaVQranVEK2VCaGlvZTEzcFVCY2NaZmw4TkwwYmhvejY3dWMyWEFaeWdpMUY2d0xkOWtHc2FtZVYKK0grNnErcW9heGM3RlRRSU9kc2dvVHB0REJDcFFiZzU4bTVndGVlZU83azIzdE0weFRncisyRFowUW5MT2IrQ3BrTEVwVGhZZldZVjMKK0lYUmVrUkJIRXg1eEZGT1U4cVV4YmJSSGVKY3JZdWhlbTVmeWhndG1tdFNsUmxZVERVTmtPN0pZS1JLb3NxbGhqYWZmem5yV2t4RXgKK3JYK0wzWmZodXRaSmVjU291WUtFYlBKWHd6QXJkcXlSbld4bEw1dlp6WGIyczZFZGJXbFBtOXJWdHZhMXNaMXRiZk9hMjkzMjlyZkIKK0hXNXhqNXZjYllXZEs4bWRibld2bTkzczFuWGowTjF1ZWMrYjN1cldIUUxyblc5OTcvdHJqVnNJRi9jZGNJR24yNFdGQTl1L0I1NXcKK2hYZGJuUGZtZE5yNnpUZE5wczFzVDZzNDA5QUd1NGl2YmVNSG43akhEZDYxaXljdDQ2bnJPTmhPcnJXUkcyM2xRMnM1MEVydU9lK00KK1FCSTF0L25OY1o3K2M1M3ZuT2M5OS9uUGdXN3o3cVY4YkxXSndTbVFublNsTDUzcFRYZjYwNkVlZGFsUEhla3hjQm5GYXhOMHJXK2QKKzYxMFBPakJ5ZGp2dk1DSk5aYzhRUGRCQzlMTFZwajVoY3Z2Yi96T21qNHU4TnBBdys5MGJ0S1lFeDI3c2VQZjdldEQrdzRmVEhTMXQKK2gvdmhFYzhFdVlkYzVYWC8rK1BQbzNlSE80VHNrTGU4ZUFMdndNRTN2dkNKOS96YkZ6ODd3dGo5OHBlWGZPNzZYbnJMWi81R215OTYKKzV6OGZleU9GWG5halY3M2xUNDg3NzRqQ0JiMzMvZStCSDN6aEQ1LzR4VGYrOFpIdmV6NElYdlMxb1FNSG9COTk2VStmK3RXMy92V3gKK24zM3RieC82ZExnNnlCMENodVNQbi96bE56L3lUUkYyMjNrbkJkVnlmNjVDa1hiKzE2OGRMYS9xMXYwTHdwbVg5NHd3azNqLy96dmwKK01XS3VjZGdQQUExUU1lS1ArV3F2TnV3UC94eFEvK2FPOHh6Qy93NndBc0ZDQVBkTzR4U28vU3l3QTFFaUFUV3YrZXJQQVVsUUlDQ1EKKzhWNXZBajF3QlVzQ0F5Y3ZJVGlRQldYd0kwQ3c5VVN3TDByd0FiK1A4RlJ3Qm1mUUJWRlBnVVNoRm9pd0NJM3dDSkV3Q1pWd0NabXcKK0NaM3dDWXVRQVJRd2RnaWpBalRoQ3JFd0M3VndDN213Qzczd0M4RXdETVh3Q2l0Z0J5VXdJYklBQ3RWd0RkbXdEWit3QU5TdmRsTHYKKzl2Nk85ZFJPYXJ4RTl2U3dSR2lQQ2gyUER2OHU5OFJPZ1NvUEVQSE9EdWNQRDlsdUR4bVJSUG9RZG16UEVQRk9FTmVQRUNYeEVPWHYKK0JoUEM4QnIrc1JQNzR4RlRKeEl2c2V3b1VRNFZxQktrSUJWVmNSVlpzUlZkOFJWaE1SWmxjUlpwTVJXcFFRQ21FQkpySXh1K29CZDkKKzhSZUJNUmlGY1JpSnNSaU44UmlSc1JlendReFRNQ0Zzb0JhaE1ScWxjUnBwTVJQaWtIYThReGtHWmh1NXNSdTlVV0JBQUJkRGNBSFIKK3doQWU1aHpSTVIzWnhSQ1lrZjRjWWdPK01SN2xjUjRCSmdLdWNYWUswQWRsc0FidjBPSVlNQWQxVUVYOEVDMG9VQjlYRUFoMWJ3TU4KK2tnWDVNUkg5Y1FRQjh2NU9VQk5ob1NBWDBnSVJjaEFkSWdZdnNnSWJraUliTUNLSlpTTEpzUWM3c2dJenNoSWRBaFdHb0NWZDhpVmgKK01pWmxjaVpwc2ladDhpWnhzaVZmUVFySGNTQWRvZ3hTSVNpRmNpaUpzaWoramZJb2tUSXBsWElwbVRJb3k2QWRGUkV0amlFbnFiSXEKK3JmSXFjWElkN2xGMjVuQVUwUVFSS1pJVFBYRXM4UU1VUFVjVXZSSkxTaEViTFRFdHZ6SVRTM0lUeVhJdXl4SXFIOUloU004dHIyUXQKKzhiRXQ5ZkpKd0RJdVlVRXM2ZElUemRMZi92QXZuWVF2dWRJdkZYTkhBdE1uNWJJdzUvSXdKUTR0OHZJeGRZUXgrVTRJeCtFelFUTTAKK1JYTTBTYk0wVGZNMFVUTTFWUk0wbDY4bmRSRXQ2S0FHWkhNMmFiTTJiZk0yY1RNM2RYTTNlYk0zWmRQN0JQSTF3MjgxaWJNNGpmTTQKK1ZUUDlzaVloTi9Ja0xmQWpCVE1rUlRKV1NGSXlLOUk1VVhJck83TTVzZE1Bb2RNNnBYTTZVYVU2aFRNaExMSTczUzhsVFpFNzBmUDkKK3ZyUCtQR0VoUE1XelVzZ3pGR3ZqUE50eld0U1RMZGt6UDZubFBlMFRJdWR6V09yekxPL1RQOU5UT3pYUUlZNmdCQnowUVNFMFFpVjAKK1FpbTBRaTMwUWpFMFF4K1VKMjFRTUJYaEFVQTBSRVYwUkVtMFJFMzBSRkUwUlZWMFJVRlVFZXlTYVFpakNEUjBSbW0wUm0wMFErRncKK09UVXlJUXBSTTNNa011R1RNQ21URVMwVDZ6RFRSM2VFTXhlVVI1RlVSNEEwUUIxQ1NJZFVENHNVL0JJaU01dFVUUlRVNUJ3elN6ZmsKK1NRMFU5cWEwRTZ1VUI2L1VTMkZFU2JuVUlSckJFdHowVGVFMFR1VjBUdW0wVHUzMFR2RTBUOTMwQk1TeFE2MHpEbGdoVUFWMVVBbTEKK1VBMzFVQkUxVVJWMVVSazFVT1BnUlpPR01FNUFUeW0xVWkzMVV2UCtsQWkyVk9ZVVNCdnA4Vk5CTlI3RE1SZWhOQ0hNVVIxUk5WWFAKK2tSMkRzMVJoQVI1RE5WWmx0UjQzbFFBVkVrSC9FeTdCYzBCSEVsSlo3a0J4VlQ5cmxlTnVOVmpoVDFmaFV6NTVGVE1LRkRFSjBsaDEKK1pULzdzaitodFZNQU5FeHhjRm5IMDFkZERsaXIxVk9rdFRGWGtodkl0VnpOOVZ6Uk5WM1ZkVjNadFYzZDlWM0pkUnc0dEI5aHREYksKK0lBUHdOVi8xZFYvNXRWLzk5VjhCTm1BRmRtRHg5U2xiRlZzVDRoamdkV0VadG1FZDlsMy9ZRmdocmt2UkZFTEExRm1qZEV3TmsxdUIKK0JpMHJGa0xVbEZNcDcyTy9GRmxkVlVvMTF2UEs5QXhoQVV0Sk51OGtGdVVvOW1YYjQySXZNMk5UbGtnNWx2OFNrMlpoVmtkVmtrbisKK2ZkWkJiTlpJY1RabnFYUm5kY1pqaDNZOVF0Wld4L1ZocFhacXFaWmQ1WlZVRVJZVzdwVmd1YlpydmZackJkWmdrMFF3RmJacXpmWnMKK3BUWmlnWFk5WWZCYlArVmFNVlpTdEJWV212Vm16ZE50d1RWbXV5WWY4Wll4NE5adTQzTnV0L1ZnNC9ZNis1WXh3blU3Mi9ad0YrTnYKK2pWWnVCWmMrbGZabCtvOXhGeU54bHhRV1BIVldPYmR6UTJGVVhkTlZUMVZWU2JkMDE0VlZ4OVk2WWRWeldUZFU3WEZ0K1RNaDJoUlQKK2FiZDJiZGRPK1JSckN4ZFFHN1YzZmZkM2dYZFJINVZ3QVhkU2IvZDRrWmQyTlJWMnAxVm9tN1ptVFRaclVSWnA0VzVsbTdGbG41ZEIKK25wWllSelo3MmFOb3JYUXdxVGRwaWZkeHNkZDduVlp2dGFiK0s5SDNQTURYVE1WM2ZHUFBldDN4VE5zM1BiWjNZaDFpQ04yd2YvMzMKK2Y1dHdYaDJ5WHRIQ0NzZndnQkU0Z1JVNERNdXdmTU0zRFFFNGdpVzRmM05VYllLUVdpMFhMQnczZkpVMWN1T2liczBYUHpPNExOUVgKK2EvaDJoRFU0ZWd1M2d6MjRLa0E0ZkVVWWhSMmpoS3ZtaEdVNEpUWVlmbG00aGFmaWhlRTNobStZSkRCM1RSYzNpSEZZaFFGM2gzbTQKK1dDYTNaQ3JYaUhlRmhxVm05NUN6aXEzNGlsT3pOZjBVUG1QVE43MzRpOEU0akhrVE9GTVhQc0VBaTlFNGphMVlPUzJZT1ozM2ZzM2oKK2ZWbDJldVVYVE9nM0t2RVNqdEVqZjJXMmUvVzRQT1Q0ZXVtNGptZXZpU1dHYWYrNEUvaDRiMmYyandPNWZ1T1hrQkh2anUvKzBuNFQKK2VUd1dlWDBiV1k4ZkdZOG5VNUlQajVJSk9JOHZHWk9sK0dtOGd5V3hjcFZadVpWcmNpZDFGM0NCc2lscHVaWnQrWmFYVW16M2IybHIKK1l5cGQrWmVCZVpXMWtubkZ0WWloMkNSeW1HV1ZlSW1Gd29kWkZvaVBtU1ZPbVdsc09KcEZJcG12ZDVtWjJWc00rV0NlMkpxRmVKcVQKK3BwckJtUWFSMkh5MWVadDl3cG12RjVxamVZaEZOaUUydDNYcFdSNUJkNHRGMTNUMWVaL0pCWFYzbVhKclkzWHJlYUM3OFhYYmVFZGgKK0FSV3BjYUVadXFGajhSWmoyWHg1TVJrcHVxSXQrcUtQY1JrZEdINmYwYUU5K3FNWDJocUpXWEZob1VkTHVaTXJPWkpCR2ZTNmVWNFEKKytZOHoyWVEzR1k1UmVwUS9lYVhkVHBRanRXZExPYWIrYTNpbTc3ZW1kMXBNY1RwTWRQcFhqN1NVb1VTY2pXYjNKdmlwb2ZvSkJaZ2kKK0RYaUJyZnFxc2RvTEc3aU1YUldDby9xcndib1dLbmdBdWRlWXl4a2tzQm1TMDFtZGVZS2RJZG1kanhtZW9kYXN6em9XMHRxVEE1ZXQKKzVjS3Q4UnF1b1ZpdXl4b1dPTEt1N2ZxY09WaXY5N3Fsd2VXYkNUc1dBRnQvNmZxczd6cWwxeHF4Q1lLdlU5cXZqZml4K3pnaGxpQUYKK1FEdTBSWHUwU2J1MFRmdTBVVHUxVlh1MVExdVU2SFdvSGNJZVpIdTJhYnUyYmZ1MmNUdTNkWHUzZWJ1M2FWdXhzNFV3bElHMWlidTQKK2pmdTRWOXNWbUhwb1hudWNCeGkyQlJNK1lZZXNJYnVZclZPNlhYVzZNNUNJclJ1N3M5YTdHNGU2VWU2UFhLZTh6ZHYrdkp1N1crWHAKK3ZObTd2VVVIbmxCdzdkYmJ2ZW03dmljSHVGQnZjZlI3di9tYmdwcXZ2d0U4d0FFbnZoVlJ3QTM4d09kRzJ4Ujh3Um04d1IzOHdTRTgKK3dpVjh3aW04d2kzOHdqRTh3elY4d3ptOHd6Mzh3MEU4eEVWOHhFbTh4RTM4eEZFOHhWVjh4Vm04eFYzOHhXRThzUnJKbHR5TWlmcHIKK3V5MkVnUWdxYnJ3TWc5d21ueXBDMkE1SXNpb3FiclRJZ09iczJNQXNxdmdIejJMOHlabURCR2hNdEI2aUxZU0l0OXFtcExac3RuNUcKK2lEaW96VXdzSXVDc2M2REJpTnhLaXlTcmM4VEFDVTZMc3VacjFhQU15dVc4TUxabmh6N0t4Q0lNd1NMaW5aQ2dpZUs4eGhMcFdieGMKK085Z3J1eExDbEhCR2tYcUJ4clRLMGd5OXFqRCthYzRsL1RQeUtzSzBxSnYwSENKNllZY09xOHZ2d3RNdHpJNU9TU0tJM0NYYzYxaysKK0NydU95czNIaTV3bS9kVUxROHE5UjRGNjRSR1VhKzhLWGJOZUM5UmZpNzVvUExjRXk5Y0gzU0xFQzNTVUhOYVJIU25xZkpHMkNYeHUKK2ZTS0V2SENNZk1lL2JOaXRMTVpJd0lWR1M4ZXRmY3ZaS3RuQm5TdWNRQUxVU1NGODZOa2o0aEY4QzlqT2ZNY0YvVmhXeU1Bd1FyOXEKK0xOVWhJcHlJM2N5WUtMYkN2ZCtSNGhGRUsxS3lyRzN3QzBHZ2FjTGV2ZDI3dlRNQ3FvcjJyTWFZekNGNndhVUdUN3lveTk4eFBpTk0KK0theGV5NGJzSGVIbGk5ZkpDOHdwNHJjNnA0Qk9TNUhvYUxKV1NjSzgvVGxtTE9ObFBpYWNvT0hyaTRFbWFNdis1NnZPK01mTGZqek0KK0kwTE8wdHpPcU1xT2tMeC9BT3pSbS96WVo3N3BkVWNNSE4zcHBYN3FxUjdDYnczWDNrMHRKSURiekUwcHVxM3F3VDdzeFg3c3liN3MKK3pmN3MwVDd0MVg3dDJmN0I3ZnZ0NFI1eTJCMXNRQ2Z1N1o2KzUxN2s3bjd2MmZ2ZUVQenYvNTdBL1JId0NWL0FCUi9qQ2oveCsvc0YKK3J6dTdIZDl6eEJ2eEdSKzhBWmZ5RFFmSHNTYnlOWmtpTFQ5OHRadDJORittSGFKaWJLYjBUWjltZ0J0YVR1YjBXYi8xUXliMWtTVm0KK1hILzJhUjlqUkNuMGY5b2hMb0VlZUwvM2ZmLzNnVC80aFgvNGliLzRqZi80ZWI4UFlOOVhDT01acXVENW9ULzZwWC82cWIvNnJmLzYKK3NULzd0Zi81bjJINWF5VkJTZ0g1eFgvKy9NbS8vSS9mcDZkWWdUQkVxVHRCU3lKUWtJdWFwVGRhYTg2RS9kRWZsZFdmL2QzRCsxa2wKK0QrTy9rQUVDRml4NUFPUUpQSWd3b2NLRkRCczZmQWd4NGtNU0FBN0tvOWNwbzhhTkhEdDYvQWd5cE1pUkpETmVPa2hSb3NxVkxGdTYKK2JBaUF4TUZMSld2YXZJbVRKQ1NMQlYvNi9BbFVKVUdEQXA4d09ZbzBxZEtsVEpzNmZRbzFxdFNqVDNnU0RZbzFhOUNVQWkvbS9BbzIKK3JNaVRBcmxxUFl2Mlo4eURCenk0ZlFzM3J0eTVkT3ZhdllzM3I5dEZWdFA2L2N0dzZNRnc0QW9iUG93NHNlTEZqQnM3Zmd5NWNMaSsKK2dDc0ROc3RnbU43Tm5EdDd6bnNBWlVYTHBFbXZGVWhUck9yVlgzZDI3Vms2TmxiQlJhZmF2bzA3dDlUK3FxK3Z5djd0MHF4WDFzU0wKK2p4VU5QRG5XMDdCU0czOE92WlByZ2JDVlc0ZElHNVpSM2R5N2UzL0ttN3J2NitRVkNzY1lQVDF4c3JETWxuL3ZrTGx6OWZUQlRzOE8KK0gzNzI3ZC83KzljZEhuNzVsWGRlZlFaK3haNTdBeTRJaTN3SFBtalRmZFV4ZU4xKy8xMklZVlFCVGtpaGNnVkNDT0p4WlkzVzRZRE0KK0JmSlppaXF1ZU5jd2xKV29YSGJmaEVGampUYmVpR09PT3U3SVk0OCsva2pqTnkvQ0NKeFpmTENJWkpJckJvSWNrZkE1R0dLVUhrazQKK25wT2xXWmhobGxwU05hU1ZwWDBvWlpnbU5lbmxkVkNLR1NhVlpjcUc1Wlp1L3JkaGxXditCU2FhVVNaSTRwekFuV2xuaUdycWFWbWIKK2J3N2FYWnlBV2xabm54RGllZWorbmpJSk5BODlrazVLYWFXV1hvcHBwcHB1eW1tbmt2YlJaYU5uWlpmTkY2YWVpbXFxcXE3S2FxdXUKK3ZncHJyS1ptRTZxb1daa2xRQ21lN3NwcnI3NTJPZytadGxyRzNEeDNISXRzc3NvdXkyeXp6ajRMYmJUU0hrdE1yY01DbFowV1ZXekwKK2JiZmVmZ3R1dU9LT1MyNjU1bTZyaGJYWCtvUXJJZE8rQzIrODhrb2I3SWpyRXZ0b2M0cEcrZWU5czFYSEg2RUM0MmFvdjFnbHVxK0IKK2pCcnNGNThKRzlndnd6NEpPbkRGR3FvcnNVUUlQNnpld2hscjVUREg2a1g4TVVzVVc0d3lVd1dYM05MR0lrUG5NY3RBTVhkQU96YmYKK2pIUE9PdS9NYzg4Ky93eDAwRGJQZ2JITWdWVUhoeHhLTDgxMDAwNC9EWFhVVWs5TmRkVkt3MUgrdE5IbWtjZ0FGRUovRFhiWVlnY2QKK21yMWFxNVh2ZkMrblIvTFpEcDJjY3R4Yzl1YTJ4aVFPdDNiSHd0YTlVc2g1RzljMjN3ckJMWGZLS3d2T2tNdC9zeFl6NGhINXZUaHIKK2dUdE9kMjJGWDg3RTRaUWpwSGprWWpXK09VeHBldzdkNUpRVGp2bkFtb2ZlM3Qzb2tWNGM2S3dyZEtLU3R0K09sNHVWejc0N1laSDkKK0Ruend3ajgyMmU2OEc0bDc4c3JEeGFUWnZETUVPZXoyWmMwMzZxa1R1bnJvblV1UGsrelBDeFE5OXppWjdyajExNytaL2ViYmkxK1QKKzk5K0h6MzVONUNOdS92bGJway81K3ZHUDVQN3o4Tzgva3ZrSnJuNzJ5eEwrSEtjL0FJS2tmN3hqemprR0FNRUlTbkNDRkt5Z0JTK0kKK3dReHFjSU1RYkFYMTZwYitIWE4wWVlRa0xLRUpUNGpDRktwd2hTeHNvUXRIYUk0UHVnMHp6dUNnRFcrSXd4eHU4Qng3Kzk1Qi9xZEEKK2tBaXdlZ0FySU1vT2lMZ0VCckVqREp3ZEVKZllrU0dDc0loR3JCZ1NCYWRFS0dxa2lheDdvaFkxSWtXM0ViQ0tjSkxoMmJMNFJTNkcKK3JsaS9hcU1iMzdncFVCbHZkcVNTbFIzdmlNYzh4b3BXYzJRZHJuUUZ4MEFLc28zMWFwMFBGOEljUkVoaGtZeHNwQ01mQ2NsSVNuS1MKK2xLeWtKUmRwQXpOcUxUdlhPSmNuUHduS1VKcnJHcG8wR3E2b2NjbFVxbktWckxRa0lucDRTQzkrVVRxbGxOa1l5ZGlmSy9JTmpWcFUKKzQrWmsrY1V3bnUyV3VQU09MdXZHU3lqNmtuTEExS0l3TjBuRllxS3ZsaXhMNWhLWDZUaitCMnBnbTl6c3BqZS9DYzV3aW5PYzVDeW4KK09iZnB3VDZHTGp1NmFJQTczd25QZU1wem52U3NwejN2aWM5OHVsTVgxQ3daRGM4SjBJQUtkS0RtNUtIekR2bkRmQzJBSEF4dHFFTWYKK0N0R0lTblNpRksyb1JTL0swQmIwODJQWnlVVXNQZ3JTa0lwMHBDUXRxVWxQaXRLVXF2U2p1ZGhveG9TekNvektkS1kwcmVsRkZ3QkwKK0h6Sm5vVGJ0cVU5L1NsR05xbk56SFYycFVZK0sxS1NxdEtWRHpkL2RZZ3JVcUVxMXB6ZzlLRUlicE5DcGFuV3JGaFdxZUh4WVZLV0sKK2RheGtQU2xUdi9vOW1ISjFyV3h0YUZVTmVkV0VIb1NuYmEzclZMMHFJTmFGdGF4ODdhdFN6NXBYN1QzVnJvU042bHNWaEZEbStNRU4KK2pHMnNZeDhMMmNqK1NuYXlsSzJzWlMvTFdDKzRWR0xaaVVJelBndmEwSXAydEtRdHJXbFBpOXJVcXZhelVkZ3N3NHlFMmRqS2RyYTAKK3hhd2ZjdnErckJaMnR6YkZLNGYwV2gyUCtuVzR4RVVwWUg4cldJdEFsYmZNeGVoaDgzVFZuVFozdWwxMXJjSDJXdHpzYXZlNGNsTGYKK1lLa0wzb2crTjY1eUZRaGR3NHRlY3ZpMnU2Y0xybmJmbTEzdStsQ3Q2VTN2ZU1tTDFibldONzNyQmF0NzRRdmd2c28zcmQvZEwzanYKK1MxN204RUljREc2d2d4OE00UWhMZU1JVXJyQ0ZMOHpnVDFqWFg5bFJ3U1ErRE9JUWkzakVKQzZ4aVUrTTRoU3IrTU1xMlBDOU1MTUMKK0RNdDR4alN1OFlWNWdWdi82ZGJBMU8zdjk3QWI0Q0FuZGNEUG95K1BwNHZndUVyKzk4alQ5Zkh6Z0N6a0tDL1Z4ZXN5TXBONW0rVG8KKzd2akt1M1V5NzZBczVUQ1hsTWpIS3pDWEM1dmx4T2FMQURwb3M1dmZET2M0eTNuT2RLNnpuZStNNXpZYmdNclh5bzRRcUFEb1FBdDYKKzBJUXV0S0VQamVoRUszclJnQllDbjRlRkt4cmtlZEtVcnJTbDhVeUFIRGN3WDZCWWhhYy9EZXBRaTNyVXBDNjFxVStONmxSNzJnaVAKK3RsVjJJaENLV010NjFyU3V0YTF2amV0YzYzclh2STUxQkZvdEtseFpRTlhFTHJheGo1MXFVR2phaVZzK3MxMjlUTWYvaW5uYVl3WjIKK282enM3THFtT1piTnpqWmJvUTNjcXdpWDJ1UU9LWmxuaDIxdnIzWGJPdTIydXJjSzduVkt1OXpsUHJjZnpmeHVyckk3dHdlNWhTZisKK0RmQ0FDM3orNEFRdnVNRVBqdkNFSy96ZnhiRDJvYklEaGxkSWZPSVVyN2pGTDQ3eGpHdDg0eHp2dU1UQjRIQkFZU1lCQ3krNXlVK08KK2NvWGZZdGxkZEhlK3BScHZvczZiM3RTMmQzSzdzdHlYYjNYZk90YXZ6cmthOC9hS20rYjB0cmwzbGZ0emZiTjhqUzVQZWsrRFhyNloKK0V6M01SbmNxMHAwK1ZaNXYydWRZanlyVTZTZjFxVWU1NmdqRWQ5ZXB1dlJmNXN2ZktXKzcyOTkrOElZM05lcFhjUUFnN283M3ZPdDkKKzczenZ1OS8vRHZqQUMvN3VEZ2k1bmtZTzk4UXIzdTBydDZxYXVYNTJuMzU5Z0dFWGU1REpua1N6UjU2bVdtYzI1RGRmMDhrVGNlaVcKK0Z6UG1zYWg1MERzMzdjeHN1dW9yS3ZvcGtyNzBVajc5TGxQLytvcDJ2dVgrQitrMHNuOFAvT0NibXRWekIvdFYxTkNHNUN0LytjeHYKK3Z2T2ZELzNvUzMvNjFFKytHZ3cvSjJFTGYvdmNCNzZ5SGMvdGc3RDUwdVF2di9ucnZPZmlVLzRxUXVpMSs5OFAvL2p6MnRIcXYvMUIKK0JDRHA4K3QvLytUUE5QamIvWG01ZDFHeEowYVZSM3Z2Wlh2SWhIc0NLRkc3eDNRQnlJQkJoWDFyQW1ZSGlJQVRXQ2JwRm9FVDVZQnEKK0I0RWJHRkVFT0V3R2FJSEZsWUF6dElBZzZGYXNsMDM1VWc5ZUFJTXhLSU16U0lNMWFJTTNpSU01cUlNN0NJT0pnSUZla2gzckVBQkQKK1NJUkZhSVJIaUlSSnFJUkx5SVJONklSRHVBNC9hQ1dZTVFFOGFJVlhpSVZadUlQMXdJS0lzMlFxS0lIMUozc0hNVzRsQ0dBbmVFWXAKK0NJYitIZGg2SHdpR0RTV0MwRFI3WmdoZmFLZzFHdmlHSy9oLy9HWmVlVGhSY1dnMEZVaUh3MldIcHFTR0tzaUdMZWlHZVFpSXRrU0MKK2c4aFhoU2d6ZU9pSGllaUYrYklGOXFDSm04aUpuZWlKbndpS29TaUtvMGlLcGFpSmdpQ0ZUcElkcnBBQ3JlaUtyd2lMc1NpTHMwaUwKK3RXaUx0NGlMcmVnS3FVZ2taaUVHcGdpTXdTaU13MmlLVzlDRmdzTWNYNFpjTXNkZWREZGYwSVZ1MEJoK1A3YU1RdWRmelpoNWg0UlkKKzAvaGsxZWlNMUlpTnFLZU4wcWhUdlVBQzU0aU82YWlPNjhpTzdlaU83d2lQOFNpUDd6Z0szZ2gyb3pDUCthaVArOGlQL1hpTzlSaU8KK3QrZVBBMG1RQmFtUHZVQ083d01BQzhtUURlbVFEd21SRVNtUkUwa29rUlZwa1JZWmtGTjBrUnZKa1IzcGtSL3BrQm1KZ2lCSmtpVnAKK2toNkpYeW1wa2l2SmttNFRFQUE3CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvbnYxMm10LmdpZi5iNjQgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvbnYxMm10LmdpZi5iNjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgzYTdjODUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvbnYxMm10LmdpZi5iNjQKQEAgLTAsMCArMSwzNyBAQAorUjBsR09EbGhGZ0ZuQU1abkFBQUFBQVlDQWdBQVNBd0ZCUUFBZEVnQUFDUU9Ea2dBU0NvUUVFZ0FkSFFBQURBVEVqVVZGSFFBU0RzWAorRjNRQWRFMGVIVk1oSUFCSVNBQkluRWhJQUlNME1vazJOSTg0Tms5UFQ1bzlPNXhJQUhSSW5GbFpXYXhFUWJoSlJnQjB2NzVMU0xoUQorVGJSVFVjQlJUckJYVmF0Y1dzSldWS2RmWFc5dmI2VmhYMGgwdjhSY1daaHBhSkp1YnBCd2I4WmlYOFppWUk1emM0dDFkWWQ0ZU1obgorWmI5MEFJTjhmSDkvZjhwcmFjcHRhOHR0YXN4emNNNTFkTTUyZE01M2RjOTRka2ljMzlGK2ZOT0VncG1abWRXSmg5ZVBqZGlUa3QrYworU051YW1kMmdudDZsbzNTLy81eS9uT0NxcWVLd3IrUzF0T2E3dXYrL2RPakJ3T3JHeHV6S3llM0t5dXpNeTV6Zi83L2ZuTy9TMGZIWAorMS8vZm5QUGQzZlRlM3ZYajR2Zm82UG51N3IvLy8vdjA5Ti8vLy8zNStmLy92Ly8vMy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL3lIKworRkU1V01USk5WQ0J0WlcxdmNua2diR0Y1YjNWMEFDd0FBQUFBRmdGbkFBQUgvb0JuZ29PRWhZYUhpSW1LaTR5TmpvK1FrWktUbEpXVworbDVpWm1wdWNuWjZmb0tHaW82U2xwcWVvcWFxcnJLMnVyN0N4c3JPMHRiYTN1TG02dTd5OXZyL0F3Y0xEeE1YR21rTTN5c3ZNemM3UAorME5IUzBDalQxdGZZMTlYWjNOM1kyOTdoNHN4RGxRRGo2T0xuNmV6WjYrM3cwdS94OU0wQTVyLzN2dnE5L0x6K2tRRHFFcGlMSUM2RAordHhBeVVsaUxJUzJIc3lES2tuaUlJaXlMcnpDNjB0aUtveUNQcTBDcUVwbUtKQ3FRSmsrbE5MV3lWRXRTS1BQSjNEZHowc3RSTjBYbAorRExVVFZFeWFRUHZWbE5UelUxRlBSenNsNWZSVGFOQi9Rd05HSFRpMUlMNm51NVp1MHFxcEtWU3NWTUUrNHBxSkxDYXpsOUJhOG9xcAorakFJQS9nVENJT1hrVnNBVm81Mk9BQUJnVjZrbU14cjJDZ2JpbDlMTEdoL09JSjZyNlFnQkxBZnVNbTQ4WVl6UFQxc2lGN2E1cVV5RAordTFIaWJ0YVVXZkxvUzU1TlQrYTArRFNrbHFYUHhLNUVKa3VobTdOZFY4cE1ZVzlpM1lKc1Q4cTk5V3FtMk1Rbi9jaWhaUkJ1emFzdgorUmVucmRnbndNOHVGUXpwU09mcnJUY2loVzVLeW9naVlNODlWRjljVVdxN2kzK3NSVFZsQjVMeWo2bmdOZC81OHBuMG1NVW1ZNEVSNgorK1IybkdXQ0VNYlVJR1FFMlFVWWozRm5tM1ZpYklQZ2VKMTc4a0VGejRJbW40RjhhRUpiY1dZMThFY1FMVml6aVZvSVRPdkxTRmdYQQorNVI0aVZ2eGc0NDA0NW9pakJ5QVUwUU1JUUFZcHBKQXdQSGhJRklMeC9xVWVpZURGQ0lCMWlnakJnNDVVNG5oQmxWU2FBRUlRWWlUaQorMkl6WExiVEtGMW1VYWVhWmFKcjVSQWM1YUtlSUZTdHcwUkVyVmVoQVJacDRtcmxBbm1sQ3NjSUxVOHlwM3k1aUlMRUNCSTdBS2FlZworcTNEeFE1Y3VNZ0xnQ2c1dVpCd3VUcGlBaEJnUUtacVJLNDVDS3FZaWZ0WjMwYVcxV0VGREVGNTh4SWlubjRMNmFDTUlhYkhERGh5ZQorT3FndFlnU1Jvbk9Md0JxcnJLSW1nbEFRVWp5RWFsZzB4amxSTEtFdW90YXlGSW9saUxDNndoS3RzVlZGYWkyMjJXbzdLeUxUN2twVQorVmVDR0syNnhoSlRMbWJsWkdaS3V1dXRXMUMydFVjMUxiNzIzM1R1cVU5YzZtOUF0MndKckxiNjhKRUVHUC9yRzR1NGlCYVBucjdTOAorL29oaGdzUm5OT3h3TGdVL0xKVmg5WVI4UXdzbDNIQ09DeUhJSURJOTg2eU1qZ3drektCTXl5NjNnMUxOOEp6QWdza29xNHd6T3pULworM0UwTUlJaVFnZ00yQ0cwenRiVzg4TVVaREFnYzd5NWFGbEhCQ0RzazRlYkE4TnJ5eFFzWmQ3RG9WN29JUWNRS0JweWhSUk0vak9DRQorVlYzWDhrUVJjS1l0Q0Juc05zUUxGSFNMUFFqZWNMK2JpOWx4QXBDRkVqdU0wQVN6dVh3TnRkU01mNXlMbGtRRUFjSU9TbXpOOVM1TworQTZEeHMzSFBvZ1VJT1NCaFJRQVR5MUxFRS9kOHZxKzN0NUJoaEgwWUE2ekxGRUxvNDdxbG9jTkNoaEMvdW5vd0xSWXpETG5ldmJ2eQorZS9EQzI2NUxFcWdQc250SVRDc1B2Q0VlZjRmVjlDVlZ6OHJ5L3ZZT2p6d2gzS3ZrdlNyZ2grOTg1QUdQRGJyZ3ZsOVBidW9STmV2KworNndqSHp6ejI5TDh2Ny9HOGcxOHIwc2N0OFNrckVlWFR5ZmtpZ2FTOXNJZ1JCQ3dnZS9iU2x6Qk5BakFWL0JBQ0FYZ0lHQW1tT3hvOAorbHliSzhBQzVUR2RKaDRpZ0JBdWhPVWFVWVFPV3FRRUlNVkdiMmpWR0FoNmlSQTBOOWlZT0ZtSkU4UkZoSi9DeklQbjlxeERab1lSLworTkxFY0JOQ2xBVXpJSVNXV3c2Rk8rWEFRUU96S0FvY2p4VUtvVUJFSW1ZK3BJQUVZK0doQ0NoMHdUMk9Ba0VWSmtNYzhFdEdZQi9jQworcFJCS2pqVm1US0VSODVmQ0JobHBFUTJjNFNZR0VLQzNYV0lMQ1FoREd5VUJJQk5FNEJHN08wSUd0Wmc4U2tSSUVWK2syQ0pNL29TaQorUjBnU2hXczVRNGFZWTRrYWlLaUxsdkRDQlVqWkNOY1JNWWgzek1TWEZ1RURIR0FKUzFlNjVZMjB4S1ZHdlBKTnVyVFNqVWJRb3g4TgorNlpoQW9zRWYzWklrQUR4UVhzSFUwUVdJNlNOa0lyTklLbEpBSFNrcHdFdklVRUtLNkFLZnhybW5jWmJKVDRCU3hCWlVJSWdUbHNpYworWnlybkUxYlFKa3dzOGd4a2dpZWFJRURQRmthaUJsQ2FwUjIxZHh3bjdVV1FURXJFcENxbENNQlFFSlJyS2RRS25rQWFWRktpVUIyZworYUVFUENrNVlFcFJzaHlnVjdWd1JBVTNsYlJhWlFzSUErcWMra0JMQ1ZyaUtoYW9zMENwY3FJcFZOcHhhTndOWENHVEpvbGRXeUo1QworZmNWRGwzNVVwMGJsS1ZKanlUNmxOdlVnVy9UZlVwKzZqemtoSmhXcUJxeGZKUSs0UHFkNkZYWlhyZXBVdjhySHNXSzFxMmUxcWxuRgorU2xWYnNLV3Q0d3VyVzZPNnNheEtGYTVnWkNuKzVtclhpaWpOWm44RldtRFRFYlRCdXFNU0hERHNPRENnV0hFd3RySGVlQ3hrdWNHQgorWTFqMnNwak5yR1kzeTluT2V2YXpvQTJ0YUVkTDJ0S2E5clNvVGExcVY4dmExcnIydGJDTnJXeG5TOXZhMnZhMnVNM3RMUUlCQURzPQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL252MTJtdF9leGFtcGxlLmdpZi5iNjQgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvbnYxMm10X2V4YW1wbGUuZ2lmLmI2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTEyMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL252MTJtdF9leGFtcGxlLmdpZi5iNjQKQEAgLTAsMCArMSwxMjEgQEAKK1IwbEdPRGxob0FIa0FPZTFBQUFBQUFBQVNBQUFkRWdBQUVnQVNFZ0FkQmdZR0hRQUFCb2FHblFBU0hRQWRDMGVIaWdvS0VJbEpFWW0KK0pTNHVMbHNzS3pZMk5nQklTRkl5TVFCSW5FQkFRRWhCUVVoSUFGQkJRVmhDUWtoSVNGNURRMk5EUW1kRFEzTkVRMDVPVG9OR1JIaEoKK1NKeElBSXRIUlk5SFJYUkluSmRJUmxwYVdwcExTYUpKUnFwSlI3QklSYTVLUjJOZlg3SktSMkJnWUd4ZFhXbGVYbVpmWDMxWldYSmMKK1hIcGFXUUIwdjI5ZFhMWktTSGhiV29sWFZwVlVVNUpWVTU1U1VKaFVVcWRRVHJwTFNLOU9US1JSVDZGU1VMUk5TN2hNU3JWTlNyNUwKK1NMOU1TcjFPUzd4UVRzQlJUcnRUVUw1V1U3bFlWc0pXVkVoMHY3ZGVXNHBxYWI1ZFc4UmNXYmRnWHJaalljWmdYbmQzZDhaaVg4WmkKK1lMOWxZN1JvWnNoblpiOTBBTEp1YkxGd2I4cHJhYkJ6Y2NwdGE3OXdic3R0YXF4NmVjeHpjS3Q4ZTRhR2hyOTNkYzEwY3M1MWRNNTIKK2RJbUppYjk3ZWM1M2RjOTRkcWlFaEtlSGhraWMzOUYrZktlS2lhV1BqOU9FZ3FTU2tiNlBqdFdKaDVxYW1xR2FtcUNjbk5lUGpaK2YKK245aVRrcjZhbXRpVWt0bVZrOStjU0w2ZW5kdWFtYitqbzkyZ25yK3BxZDZsbzdPenM3K3dzSFMvLzdXMXRaeS9uT0NxcWJtNXViKzQKK3VPS3dyK1MxdEwrL3Y5Ky9kT2E3dXYrL2RPakJ3T3JHeHV6S3llM0t5dXpNeTV6Zi83L2ZuTy9TMGQvZm5QSFgxK0RnNFAvZm5QUGQKKzNmVGUzdlhqNHZmbzZMLy92Ky92Ny9udTdyLy8vOS8vdi92MDlOLy8zOS8vLy8zNStmLy92Ly8vMy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8veUgrRVVOeVpXRjBaV1FnZDJsMGFDQkgKK1NVMVFBQ3dBQUFBQW9BSGtBQUFJL2dCckNSeElzS0RCZ3dnVEtseklzS0hEaHhBalNweElzYUxGaXhnemF0eklzYVBIanlCRGloeEoKK3NxVEpreWhUcWx6SnNxWExsekJqeXB4SnM2Yk5temh6NnR6SnM2ZlBuMENEQ2gxS3RLalJvMGlUS2wzS3RLblRwMUNqU3AxS3RhcFYKK2g2UWtXZHJLdGF2WHIyRERpaDBybHBGV3NtalRxa1ZyZHEzYnQyN2J3cDFMMTZ2Y3Vuam4zczNMTnkyalZSVS9NS2hBdUxEaHc0Z1QKK0sxN01lREdDd1kwalM1NGMrVEhseTVndlc4N011ZlBoelo1RGN3WXR1clJrQkdrcXZnQUVkUFZQMTY5Wis0UTlXM1pQMmhKeDg5U3QKK2szZHYyN3VCQjQrdFd2aE8zemlSSnplZVUvbE41eldoSzVST2s3cE02OWVaTDIrdC9YbDNodGhqL29aL09aNzg5K2puMFJPbldONWwKK2U1YnY0YWVmR1g5bC9aVHg3K09mbjUzNyt0ci81Y1pmZndBR2VOeUE0aUZvWG5IK0ZlamdjQWIreG1DRXpTbTQ0SU1RM21iaFFQcWgKKzFLRkpINEs0b1h3TmFqZ2hoaEpTdUoySzNwMW9Jb29wdmdqamloT0ZXSktOSStHWTQ0ajI4ZGdqaStENXFKS09JUkZacEpBZUlwa2sKK2tBdlpPTXNCQUFqUXlrZE9IaERBSjFRcVNWQWhBQUJ3cFVjZjBpSkNsMlRTMFpHTm1aRHBTSlljcGVrbGxtZnlhS01YTnRSQ1owYXYKK2pFSlFpSVVJQUFvQmNNYkpVU0VVeEhKa1FhK3dnbEVwZ0dLVUo0ZGExdkxrbW4xT2laRXNvVUM2VVNrRHJKbUpsSUt5Ritrc0NXRDUKK3FhVVd5ZEpGSGFnSWhDT2ovb0Z5RkNLcHNZSXAzQ1pQUkNLTFJYZGV1bXFyczVaYXk2a2F4VEdHbmlFU1MydW9OVVlLYXkzUFpoUUoKK0ZZbkk4bXFqdG01S3dBVmQxcGx0UWFuZ2tZVW5GRVVyTGJVdFJHcW5BS29jc09aR21sRHhSd3lSWnZMbHBNd0txQzJXNW1MRXloNVUKK3pLQXV0TmptZTVHOVdPSnI4RUNlckpxS1JJUWF1dEcvUnNqUmtSY0FGTnJSSzRrVVlRWkhHSHQ1d2JzYjVlZHNvLzFtRkVvUVZyUzYKK0w1c2FFV3VudDdKK04yMjFEeW5jVVE1T3NKclJrMlo2QVdwSE4xUnhiRWM2YTJUeVJzdktqSkFuY1VRdDlkUlVULzNERVVnY29mWFcKK1hIYzlDRU1wSzMweWxtS2FhUkFlYkZTdDl0by9WTEcyMUYwY1FZVW1Ea1hNRU5SdnMxM0YvaEZMWE5IMTMxd3ZncEN5N3Q2ZHQ5cHQKK0wzSEVIMjBBRHJnV3V5cmt0Tmd1WGxUMnpBdWxFc3JtbkhmdWVlYzZLTkVGdVF0NVFvVXBZQmRjODBhWGgxMUxKMlZ3OHZuc3MrZGcKK0IrMmNIM0lFSGc4ekJIUkRtdU5PZXc1bVBERTZSZ2dUWE90QndRdnZlUTVvVURGR3BuZWZ2dENUTkpjc3A3cWNSb21xUnE4UTRuRkQKK3BxTXVPWmx2TG14Ujl3Q1FiSkFwY2J6U2JFS29HRXQ5UTVWKzlJb1BTbEN5RVpkZGNoLzRkc0NFU2ppa2ZBbDVVcmRnTmorZVVPSUoKK2g1QkJlaEI0b1pUQVQzNFI4YzByRHZFRUE4YmtnVHZvZzA5QUtFTHlXYThsUzlOSnczd0dIUXBXMElMeHk2QnhIbmdJREw1a2hhZ3cKK0VrZHdTQjBYa2toVS9qcEJ4UmhJVnd2bitOQTlBNFBJQlNHaUcwejRMQ1pDSkowT3dWY0hLVTd3aEVpczNJRVNjc1FzdG1TSkRwbWkKKytpcFVPaXg2c1lFejZ1SVpXUUxHSURGSlBWdzA0eHBsV0NLQ3FIR09LMm5qZEpKNEtCYmQ4VWRBak5BZlVjaEhpZWdSSVdKY25Zb0cKK09hVHQxYkVXalB3aFRBNXBrRVJxNzVFQ2llUit0QmdqU01xUlBvV2NDQ1gzRk1wdm9VaVRtd3lrZzFBSlNKbU0wbFdsSENPTk12bkoKK0JISHlKdFdDRFN0YjZjb1lIc1NTbFBzSkQveGd4MXJhVXBVNmVjVVRpc2lhWGZLeWx6WWs1UnRuOG9vaTJNYVpTMEptVGphQkIyWmkKK3M1RTNNY1VhZWlmTkdkMWtFME9RelRkUEVwOFRZS0V2OEJ5TEd2UmdDUTFJb1FtSy9vaW5QcitpZ1hmdUU1NklPTUlVM2lDSVNXeWwKK24vOU02RUg5cWRCOXFpRUU3elFFUGhzS1R3M3dvU0lhZ0l4cE5xb1lGbUNnQWc1WVFRWTRTdExFR0VDakpUVU5EbzVBQWhNQUlRVWcKK2FBQktVMXJTazlMMHBpeFlBQU00NElLUjNwU2pCa2lOTm0rU2lpeEEwZ2gzbUNaTDhBQXcxSTBpRWo5SWd2OWt0Sk9pdm1BT3hvUWoKK0duTlNpVCtZamdheWtVVTBXNFFUVEhqMWhDL3d3MWpKMkpPdTFvQUo1cXVGV05tNlZad3c5WFF2c01NaXpyQ0VTR3dSSjBYMUpPcUEKK21SSENYb1NwU0sxRktQYmFWN3JxYXlkUE9NSWU2bkNFS0N6aWZwMjBTUlllVmo3RFhzU3pGWWxzRDZ4d2hETmM5cTkxdGNrb2pqQ0cKK1EzZ2lYVXBsL3NrZlBQalZXQ3B5SjZzZHd3N21FTGtNUFJZbnNnaUVvbUFaMjVWd2syR0pOZWRNZ3FzbzBONnlJYzUxaUN6d1FFUm0KK0ZsY2x5aVRJVytPS1d1QlNsN2pLYlpKdEtUTGQ2bG8zdkREQm1hdXd5bDNIMnFTOG1rSnZRcUs3RVBnV2hMNi8xZEE2czNrVCs0S1gKK3FuU3NpWC9MQ2VBdDdsZEUzalV2ZmdPYzJwY01tTUMraGRDQlNiSmdoRHo0dkFWK1NJVUpjdUg0WnBpdUV4YkpoZ3ZTNFJGRDE1RXkKKzZiQ0hJOXpkRUlQRXhBSlJNWXpGKzl5VXFIakYzWTJ3aTAwWmt4dlBlSTgxUHNtTmNaelpIQXZXSmlZZThvL25pK0tZbGVraFF5YXkKK1FCSWxFVGQ5Q1h6SUdwaVlya3lSUjFXU09jNWtYOFlrZGttTVBJbkxDaHhhL24yL0MyU0VZUFo2VmdyVW1aY1g1RGIvVEFGVFNoNUQKK29pemxXdUJLVnprcmdhRzhvTEdNcUtvT054aFlJU1NnT29rYzJtVjkzcVhyZ21tUlB2MHBVSGZxbFVMNHJCejdNY1RTMkFJMW5ZZXEKK1lUNG16Y0pzUG5GQ3dqV3VLcXRaV2tZUVEyL05uQUJJTkhvaU4rdXRjbGc1NmNKcUtWcE5lN1ZCK0l6aGcyeUNDbnNZcmtMNjFldjgKK01wZ2p6WlpycWxXdGtCV1NreUZpeXA1R1lzQUZLbXhDSTRXZ1E3UWQ4aTl2Ly9jZ3FCU3pBSDJ0a1dnOXE5ZkVMdlpCWkpHSVhNM2EKK0lNeStkWjJaL0JGTm85cThibVJJcmhmaXBrTFhMQlMvdWtncEN0Q0tjVDhFNGF4cVlWWVJVZ2d1VTFyaDJIcTN2cVVOY0g0ekpCVjEKK2FEVkMvdkk5NmdhSE1ZbDJVd2djd25BNHhMbXQ1WEdJMjl6d1ovR253VnhxYllzYTFod0hPTUVaeEF0bW1qVGViajQxdmhHQjUzL3oKK3VVTk9qWkVQdVJ0bEcxODUwZU9RODV0SHRnNXJWUjVCSEg3eWZVTWtmd3M1aGZPR2Q3dXhoMEozdkdzSTB3M1NQTFBiTGhRUFBCNUYKK0ZJZytzNEhMN0orTGV3MU1YYmpiWWh4T3dmNGVRY1NPOTgyOTNleVlvRUlXdm4wUWtwZlo1QlFoTkpsNWpKRDZUVzhocFlDQ1FQUmMKK3NqNFE0Z2xUelFqWEdSSSswTXViVis4QysrUC9McERMK2Z1ejZlRVlGUUE5Y3RXTlB1Q1FsNGlZeHl6TFdteXdndzBSVTVkcW5wSFEKKzFSRGFHNDhJRFRFWUl2WVpmUFVVY2RQdytUVUE3MEhmSUlsUGRrS2svdjhtN2hNLzl6Um0wZkpoMGpBaDVBRW5PSVN3a1lzOGtGR2MKKzRReDZPaWI0dFZvUUowTGFKVkZjY2hTL2ZOMFhGcVFPZEFOS1hrY2dIelpMNitkZTdOZDEvVWRJbUlTQUNVaFc4MWNkNDNWeExPYUEKK0ZnaUJ6bmFBR0ZpQkJxaUJTTlprQmZpQkRkaUJEeWlDcEhhQkppaGZCQmlDOVBkc0hMaUJIdGlDTVNpQkF5aC9Md2lES0ppQ054aCsKK0ttaURPMGlEQ3loSkdWaUNNa2lFUU5pRE1KRkNTT2gvTXlpQVFmaE1URFNCRkdpRVIvaURWZGlFQ09GT0ZQVlBDTFdGOGRTRlhsaFIKK0RCV0dlUUdHWkZpR1kzaUdkR0ZSR0RWVFA3VlJOdldHSkJXSGNnaFVibGlIbmtHSGVGZ2FlcmlIZVNoVUVlaUVMRmlFSkppRFZ4aUYKKy9pT0lnNFlvaUlQSWlDNkloVDRJaVVrb2hleTJoT29uaVV4SWhTdG9oWnVJaUU4SVRwK1lTcGJJZ0NkWWlJcG9panJJaVpGWWFvbVkKK2lwaUlSNXE0aWdvNGlrS29pcFBZaW9SSWJiUUloYkY0aTZISVgwTzRpSjNZaTVrb2pMS29pNDA0ak1ib2k3c0lpb0dvaktjWWpia28KK2pZZklpci9JVHBUWWRObG9FVXZtY2NuNFM5dklqZUZZaXRUb2lLOUlpczk0aks1SWpMQzRqTVdJakxiNGp1VUlqZk9vamp4b0VYTTIKK0VOSm5kOXI0TTNHbWo5TTNoUk9SajV1bkp0YzNrUDlZa09sVGlRZnpaSklDSmNJbWpobXhqd0pCa0F3WmpGL25KOWd5QzNnMkxOK1gKK2poU25rWUFuYUhieWZEVVlrcGRXa1lXamVyQ0hFYUltRUp6aS9pa1JDWklId1pGNTlpV1pwbTBTZVJFMjZaR2Y4SklDT1l1c1Z4QnIKK1I1TzF0enlUYzVJSkFXekNrcFJLZVpTYkJ5ckwwbzlNNHk2QkY1UnoxM2UzZDQrUFdDNjN0cFhlT0pRRGtXMVlHUkhtSWpUdHNtNVAKKzJYallranhGMlpVVkFTc2FWM0p3NlpWd0FwWmhXWmRtZVd1dkJ4RmVkbTdyVXpBRk4zazd1U2lxZ3pFbVdaaFRwbXdRY1piRE56SmQKK0ZuK254eXQxTXBjVmdTbDlGbmswZzVlSUJJS0JXU3NwTnhHUEJwaHhlV3NWUjVmV2FKaUFkd0JCTTVOMTlXZjNsanJMODViMWxYQjgKK29qR1dXUkhHa21YL1kzQ2NDWTVyaVcrcXc1SVVrV3RPZDJ1MG1acERTVGhxbVZxczFuRkxlV3RPQ1JFM0Exc1pBWFpYYVJIeC9qSXYKK1dzS1N2OGwvNU5pWUJTTjVHbEZ1QXROdUdhZDVQbm1SbjdsNVgvS2RsNWhKRHVNUUtZTTkvcklIRlpNUjVObDZJaEEwT2prUkhETSsKK0dMR2ZBd0dmOFNtVTBZYytWN0o3aVNrUks5TXlEVWttVnlKOEMwbVZGdUY5V0FKQTdYT1FBekZ3MjZlZ24wQjMvMGtSUFBORTVWSjkKK1pGSW8zZU9hRTFFMFJ4T1hLTm9sRkhBSklNcWVucWdTUXpkMVY1TTFTTWMxWDRPT0pvRTJVMGMxVmZjMk1oZUFHNUdqTjljMmZPTTMKK1BibzFTb2NSU3RweWliTTRqZk9rUndBNXZJaWdKOUYyaFJjNmNsZHRFMGRoMlFnN3NsTjRuWE40dUlOMjE1WVJYdXAyeFJPbUtQR20KK3pnTTkwdk5tVHpPbWZXU1VLeEUrQWxwRzdlV01KL0ZLL2x4SkVKYUhwMzNLUDZHM0U2OUFRQjVVUFlHS2pjR0pFalFrUVpES2pDaEIKK3FIazVaUnowcUM5QlFpUDBCQ0YwUUhvcVlwNXBFK2tuY1pFcXFKbnFTOG9wRU9OSGZyL1NqWFkwcS9PeFk4RkpxN1d3ZjZSWlRLdksKK3FxMmFkWGxwZnpMQnE3cnFlMVhVcXdXQnE3azZqcVhJckMzNVJhNktlL0VvajBlR3FYcTVqdGRLanlXaHFRZGFqK29JcmMzYWdPSWEKK3JTN2hyY29LcnRqcXErYjRxa1pXcnVaNnJ0UGFtZGNvcWVoV3F2YktwN1VJci9FcXI4S2FtZHBLZ3Z3YW5uWkdWUU9ybUMraHFjZjYKK3JUQjRzUHE2c0FUbXNKUHFFWVFLc2VtNmdSS0xrZFNxRTdta1R2aGFpNU0wcndBN2pUWXhUT3lxcmd4TFRjdmtHaGs3L3JFZk1Vb1cKK081azRVVTNYOUxIQStoQmFxSVowSVFoa1VFOVlJRkg1cExOd1lZWkNLeGFLc0FXTndFOXBXTFJyUWJSTXF4YUNnQUwrQkxSUG14WnMKK1NCRVo1WWVoUVFJZVVBRUdNQUU5cGJWNWVJZGlxeGdiY0FRcU1BSWRZQUdFMFlkbGV4bHUrN2FUUVFJUU1CZzg1Vk55S3hsQjViSWwKK3NWbTFzRjNOT0JLUjlRZDRzQVJua0FnNTRLd2FXeE5aQUFPQTBMTGpXbFZHNVFuSjlZMHFjVmRPQlZWU0ZiaGRtZ1ZYWmJOQW1xMHgKKzBWVzFGV1AveXEwdVlWWVVsRmFuVzQwMzRWWndOUkJ6aFlxRmFoT1ltMWVNNVZmczJMbEhGck1XaTFoSnRWaDhwYnNvTzdJeEVWbVQKK1ZWbW5WYTBvNGJlZHBiaWlLeE9pUlZxbWhhaXUvZ3VQcXNWYXJtV2RscXNTczBWTFlGV3ZJNUZidXhXYnRGdXc3eVZjeHR1dU0zRmMKK21WUzV6R3RqNnV1N3A3cGMwMGEveWJSTUF3RzQzYXNTOW9XL0JNc1NEd2JBT2FGZVJjUmUvWXNTL2tYQWl5dkEwM2F4SklzZWtCdkEKK0RseGREQnk5TnZiQUVIeTlMVExCRFZ6Qjl3VzlOL3JCQ3F6Qkc4eStLK0xCSTJ5L0FIZkJLK3hnSm56Q3FIdUVLc3lsTUZGaUl1eXUKK09nekNtK3FPTDFUREczdkRNZXpDTyt5L01ieStNK3lJUUl5K01BeWRNbHU4TWp3U25KYkROb3lBUzB5dktYYkVUeHl3UVl5UUZyZGwKK3FFbHN5RUZsUzVlUVl0YWdEL0VvSFdLUnRRQkFINWtRZnhtZnJKU1BGT3FRL1pxZ1hXSTJGTGxuV3Z6RTFuc1EvbnRzWmFoWnhGMGMKK0VVQXBFSXVXZkJ4WHhiRDVhU0lKazRvTUVZZVdhQzc1eUlpTXhudVdjQWVxU1lkY29KRmN4UkRSa3dnanltOGNZMzM4eEo1MlBSMDUKK3lpUkpvQWo3d25ZNUVLUmlheVVYYjAvOG5BM3hkSU5NbmJGbXZycTNrY0ppRVI3NnhPbkdseU5Ld21Yc1ByUXB4dDl4Yk5xbmRuMFgKK2xZSkh3Y0FwZWdVVGJwTm15MXNNU2ZPNWJCa1hvODBwRWR4bWJrUEpLTndDQU1mTUVPWEdlRVpVcWlsam9GR2N5N2FYZlBFR0hmUm0KK2I3STVsaUtRenJBTXludDVsd3puT3RxOHpRSXh6TUs1UEtmcGF4QjNmNzhNSjI0WnpST3gwS3FhejF1Q3lSanNFSy9YbDdKN3l1c0wKK2NpS1hFTDB5bUdWWnV4TVJMVUNuZFFZaC9uVkRXcVNIYzZSUVNaUVFiVWM2K25JN2g2VkhFS1dRN05CRG8ybFRlbk5HWjlNM2pYbXEKK2s1ejlQQkdoMmNhWXJOSkwrbkl3ZDNYQ2V0UnRYTXFFVE5JTi9aRG9Bd0Q4S0JDRWg2YWhvS2JPdzZZdlRSQkZTYWU0ODNaeDU4UVUKKy9TeVhJeEJrN1R4NjkydkRhZEVYdlJBc1Nad0ZzZFY0NTlYQ2szaUxGNUxUVE5UWU85VVA4YzZmTE5pSDZzMXc0Z1dweDZKTTVIbW0KKzE1NjEwRHFGalJDbDV6L0hLV2VzNlhjVjRjcXViS01HSVh1MDkzTytxWjZjOThxQ3pSQVk2c203N00rLzU2a0dnYUhPUjVnVllYeXQKK1MzQTF5ajdoekJDeHFoK3BiZGVtYlpZeG1qR2lFTnh5N2MrMWtIMk1XUkFNQ2d0alVxRjNmTm9vSEtzdS9sRis1M2NUNllmRTlwaUwKKzdnZC9TVnpOTTBLc01KRi9WRndRdkpxeUhCeXdBSGplVEx5N0lNdmVXM3ErS0Z6SThOM2QyUjNmWEJ6QlBlekRvWHVPN2EzZi9SM1kKKy92M2VVQ3pnOTYzZStUM2Y5VzNmQnE3Z0RJN0ZuSnV2Q2Z6ZkEzNnp4bzNmOUwydUFVN2dDKzdkRWE3aEc0N2hHUzZLeUp6Z0pGN2kKKzFtcmhKbTdlSDM3aUs5Nk9DQTdpQVA3aUxON2dLZTdpQlg3Z0V5N2k4ZXZoTkE3ajhwM2p3TGpqRkM3ak5yNFFPVnUxYnVHMFNENFcKK1NyN2tZdEhrVHE2MFVhNFdVRDdsWEhHMUU1RzFlWnNaY2J2bGpOSGxYcjRZWUI3bWlESG1aSDRZWm43bWJRdUlJKzdqS0Y3akVuN2oKK0Y2N2lQVDdqYzc3ZjdqM2tQeTduL25BZTV5MWU1SDhlejI0ZTZINWU1M1krNkRqTzU0aHU2SGdlNGtGZTFFQU80VUt1NC96TjR4dysKKzZZK2U1NVN1NlpsZTRZU3U1NHArNkl2ZTV6RkwwSXplNkpFdTZlNWQ2a1RzNktyTzZhL3U2YWR1NlgwTzZtOHU2blIrNTRVKzY3YisKKzZac3U2N3BPNjZNKzdNUU82SWwrNjhiTzY3OU81S2krNThqZTdLR2U3TUhlNnc1K0UzRjhyRjYyWkhHTTNkZ2xtYWIrRXRrKzNzNSsKKzdBMnh4NUV0QWxLOWFacmNJUlI1eHJJTlpiWTZrWGJzeHFzdHU1ck03UitheDNXY3g2SzU3a29TeUFhWkt2R09QQTRweUNPOTNoRkIKK3luQ1N5UFdPRU1hSkpBb1B6d1ZOQlNiTGs2djhKVkFkRWNPc0h3cS9kWk45RUE5dlpoY2ZvaXZKL3RnT01TMFZqNDhqSDVQRFl2TEEKK0RwNGFnUyt6L1BFSllaN3FNaWtTTHhDczBBTk13SGorNkFoVGFSSHJMT2h3NWo0YURSRTJ6eEdUa3AwWHNmTTlYNVdPb0N6Qi9Od3YKK244L1lUUE1LOGFBTS9abnFwalIyY085Y3Z5MExaQkVTelQwRkE4OWEvekpvR2RQYytQVW0rcGtQbmR2UWZla1hjU2NMMTNENjF0TlUKK1d0TllpdE0vcDIwSmJSQjYvelk1MTZSQTdmY0NjU2R4enpCREtqVS9iZE9JLy9jVkxkdURuemRYMHplSHJ4Q2FocGp2bmtrcjdUYUcKK0Qva0kwU3NoRXdDUWFhRnRyaEIyYzlLdTA5YkNBNlpvL1JCUXZYYXVYenQyY05ZWFlUY3lvMm0xVHp0djNadGtSdnRjdlRtd2Y1MGEKKzh6dENNODFzemRXMmcvdVYvbWFTZ0QzdTFWNXBVZ2tsZGVjbzR2TXgxeG1SMGI4UU12QUZqMDM5bHFMVy9Wa1JsZjN0anZ3OUdRK2cKKzJROXVROE9jR3ZIOTRWOFJkajJkcVkvdm81K1lCbHFwU2tLZ2lvM0lBQ0dnVlMyQ0JRMGVSRmlRVWhFd3J4SStoT2lGUXF5Q3RFVFEKK3FWV0t3Q2VJSFd0UmVuTElZYTBYZ0R5ZUpDaVJZc0ZaQnpDaTlBanlrQXlUTUR1cUxKZ3BBRWVOSEcxQ1hOanc1ME9jQjF2YUdBcXgKK1pOS0NTNWthTERVQXdGUUFFd24yZkVyUVU1YzZxRWpXekpwUktsVUtvc1phRGJ1MXpnMndXYU5TclJyckxRQkhUTlY2YmRyMjZkeXAKK0V3c0pERnZyN3RmQVl1SDZwVm8zc0ZxMmhmbFdkWFZnS3RMQ0JKMHl2VnhaczBGVVl6emwvdDBjbXJObndxSXJkLzU4TUxQcHdLaEIKK3N3N3RlalZzemJOdDJxWmRHSGZ1ckx0NVAvWDllMmh3NFQrSkYwZDUvS0Z5NUI2Wk4xK3VGM3JTNTlOVlM3ZCtHM3YyazlVTmV1ZGUKK09yejI4Y08zbDA4SW5ydDY2K3padHorUC9ycDhtTytoMjc4Zm43NWwvUjN4Ti8rdnVBQUY3SSsrQVlVN2tEZjNDalNRUWZRU1ZOREIKKzhpRE1qVUxZRnR5dk93bkhzL0RDRGNQcmtMVVFSY013US84K1hBL0ZGRTFVU3NYc1JneXRSQmJUYzNFNkdHT3NNYjhabzlzUklSbDcKK2ZBMUkvb1Q4TGtjQWpUeVN5Q0dCUXhLNUcydHJra0FseFNQeXljcCtGTkpLM2FKRWtNc0lwNlFTU0N6RjlMTENNczJjVXNzdDAzUlIKK3pjRGM3TzFNMnVCa3NSSk1PakZ6OFFRc0xPR3pUei8vQkRSUVFRY2xkRkFOOWl3MFVVVVhUZlJRUmgrRjlGRkhJNlcwMGo4bnRUUlQKK1NqSFZ0Rk5GTmVBakt6Y2lxS0JVVTA5Rk5WVlZWMlcxVlZZZklOVlZXV2VsVlZaWWE4VTFWMXh2MWJWWFgxSGw5VmRoZXcxMldHTm4KK2ZlQVJNSmRsdGxsbm40VTJXbW1ucGJaYWE2L0ZObHR0dCtXMlcyKy9CVGRjY2NjbHQxeHp6MFUzWFhYWFpiZGRkOStGTjE1NTU2VzMKK1hudnZ4VGRmZmZmbHQxOS8vKzAzSUFBNwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3BpcGVsaW5lLnBuZy5iNjQgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvcGlwZWxpbmUucG5nLmI2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2Q5YWMwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3BpcGVsaW5lLnBuZy5iNjQKQEAgLTAsMCArMSwyMTMgQEAKK2lWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFsZ0FBQUVjQ0FNQUFBQXNtVG9KQUFBQUFYTlNSMElBcnM0YzZRQUFBd0JRVEZSRkFBRUEKK0VBRUJBd1VCQ2dNQkNBVUtBZ2tNSFFJREN3WVhGUVlEQmdrVkR3Z0ZDQXNIQ2hBU0p3a0RGQTRORWc0VERoQU5IZ3dIRGc4YUV4QUcKK0RCRWpCQlVaRVJNUUNCTlJEeFUwRXhjWkZSZ1ZGUmNnQ1JrekhCY1VEUmRDTlJFTEl4WVRBeDRtTEJVTUVCd2NFaHNpRHh3aEV4c3UKK0RoOFhKUmtRQnlBdERDTVVIeDRiQUNrMERTc2lHU2NzRkNSY0pTVWlHU1pDRGl3cUdDZzFMeVFiSXljcFZoc1BEeTB3TnlRVkVDeEEKK1BTSWZDUzg0QURKQ0VTdFdSaUlVTFN3cEFEZEhDRGtnRXkxL0Jqb3JFamhBRERoWEN6WnZJVE5QVXlzUUR6czhNakl2Q2owNEJUMU8KK1BERW9RakVoTURVM0x6WTlLVGRGVFRNWU56azJHRDZQQUVwZkVVVmpCRXhGQ0VwUEIxQXJLMEZqS0VWWllUc2NkRFlYRzBkNVNrQTUKK0ZFaUpRVU5BT1VSUEFGaENBMVJwUDBaSlZFTXZZVUF5QkZ0UldrWW5EbFIrUUVsZUFGMWprVG9qSGxWMUFHQjRQbE41WVU4N2NVd3MKK1NWUlhBR2FCV1ZKS1VsUlJSVlpsQUcxUFdGTlNCR3Q1QW1xVkFHK05BSE5wSzE3QldsOWlmRnM5S1dtblNHWjBZR0ZmcDFJdUNuV2oKK0FIdUtiV0JYb1ZOQWRHQlBEbmlXQUh1alRXbUxrMTRyQUgrY2gxOVhYMmFSWDJ0OEFJZUxpV2d2QUllZUFJYXFhMjFyT25laGRXMW0KK0FJbXNwV0pZajJ0TFczQzBBSXl2V1hhTkFvNnhiM1o1ZFhaemVudDRXSUtpUW9qQWVuK0NrWDFwY29TV2NZRE9vSDlmcDRFK1k0dXIKK2hvV0NYSXZHYjRtdXQzeHBxWU5ZbllkVU81ckR5WHhkalk2TFlKcWswSVJHYjVhelhabk1qSkdVZ0pXcXBKQjhsNWFVeUpONGtLSzEKK3JaNklZcXpnZTZYaG82R2RuYVdwZ3F5NnlaOXp2YVIwaHF6TWs2ck41Snh4dzZtRjI2bGJxN0MycExUR3dyQ2JzN093dmIrOHpjR2MKKzhycDQyTDJ4c01iWTNMK2p0TWZzejhXMm5NL3l4OGpIME1mQTdNV1U3OGgvM2NySXlOVG80TkxENmRLMXo5YmMxZGJUM05YT3Y5dnIKKy9PS1N3dXI4KytHdzR1VGgwZWY3OHVQVStPUEwzT2p6KytiR3lmSDM2ZXZvLyszYjZ2VDg4dlB3L2ZldTEvdisvL2JiLy9uSy9QblcKKzVmLysvL3JvK2Z2NDkvNy8vLzM3Ly83MS8vMy8vdi84c1plVG5RQUFBQUZpUzBkRUFJZ0ZIVWdBQUFBSmNFaFpjd0FBRlk0QUFCV08KK0FVVFVCRHNBQUFBSGRFbE5SUWZhQ1JRUEFpSkJFRk1MQUFBZ0FFbEVRVlI0MnUyZEQzd1U1YlgzMDBuV3dzNTBzaEE0bHlUR2lrUkUKK1F5MGFVQ2hLdkpacVRRR0JGTnVyVm8wRldxMlZxaEFxMGhjMHQxckF4dExMcHU2MWNVbDZnV3ROZTN2YjdaOUlLbStYcW4ydGtGaWgKK0dtd0ZBOVh3cHcxcy9VT3lDYzk3enZQTTdML3NiamFiWFRMWlBML1BoekE3TzdNN3M4OTN6am5QbWVjNWs4V2twTktnTFBrVFNFbXcKK3BDUllWbFNqcDVuLzMrM3hHR3NPTkh0MnZ4MXQwNFBOVGJ0UDhhVXVqeEF1SHZONlhqSGU3MjFwYm1xTHNwL0gwMjErY3JQNXdjZTgKK1RhOEV2aSt3S01IS0hLa3dqZi92QStELzc3U3JBS0RlZVRSaU8zL3ZjbnpEb1R6WGd5LytDRUtNYlZkdzVkaDl0TUd1YkFmdXVNamYKK0U3SG5mZ0FmL1g5eUpuNkF1cHF2MjA2Zk5mWWRYSHIvQWxvYzk0NEVLN1BCV2c5UXVyVnhsUTNzNzBWcytGbUFkUTBMQVA2QnkxY0EKK0tDVDJBc0JxWEttZTdtRWZhakJyMjVNYVRJamtTalBBMG1Ic1Zuei9HOGpnenlCbmE0TUdIL1V6ZGdIWXQ5WnJNTm92d2Nwa3NONEUKK2VKcGVIYkxCNVBEdGVsVDRML3dQNEZyKzk1TmlyUWEzNGQ4NWNCMWpYM2VBc0dWaGlQUnVSNjQ0V1BqT2FmeGdIWHc5dUQ4YXhML2sKKzMrZ2ozUDR2TGdKMFNyQXlHYXh6b0ZDc2ZwT2JKaDhhSlZNdHpVU01BM0paVHcvQWI4UktZY0QrUnZ1MmVoc0pKSUJ1OWxsRndkVzMKKzBsOE4xQjBDckRsZ3B6MUs0T2ZJa1JxZ1Q0Y09qTmtrV0JrTEZpTTRlalQ0blhqVnJjSC93YjlHNEJVVXdPY1oreENndGtoNzRDaTkKKzlJdTFKaWcvQmpoRGhtekNHVVR6Y2NhS054OWxBcXdTVUFWWTE3S3Z3N1U3UzJ3TG42ZlhSWEN6bjkwUDJkSVZaaHhZSWx4U2lDRTAKK1crOEYxbCtHWURVMGhHOTlQOS9nVnhpRUt4aUd2WVBNb0NNalQyYThmeHlSUWtRdzlIcEpnM0VCR0Ftc3I0UER6OEVheHo0RitVQmYKKytEanRNWjBXSi85WkJ1OFpEbFp3Zlg3ZmpURzB4OWliUFRGOTNENTJVRWRFTGdEOUxYWXcxOXp0ZUE3b25Nd0xBSHVJNzRTQjlRR0cKK2IzNzJES0F2TFFGNHhOLzdGUGxSLzE3Z2pEM0gvQktzekhXRllSYnI2c2lFQTdzTDRKYmdhNHpHMllkMnNDdXFhb0MxSDYzWVMzd0oKK25TVzNSeUZnc1EwY29RTHNObjRLZEQvM2d0Y2F1RzBIT0NJdFZnWUg3OEVZcTRmSFdPRmFETEE2dE1OSGUzU3QwbTBMMytJeGxuKy8KK0JxUDNpYjB4R3VlMkxSUXN0bXUrdlhqejEzbU1aWVJidWJob0Z3N3lYeVJZbWR3ckhNTjdoUi9mZ1ZHU2Ryb3ZWenZFVXB1WFlQaG4KK3dHOSt3SmNPYVREWjNHY09wVS9maUFDTG1iM0NQNW8wbmNlbUNjYW1RWTRFSytQeldEM3pZYXlOWXZjd1lVajBVaUNsZFRmKzl5WFEKKzJSTmxLbCs2QXcyWUxSQ3RVL0QrdUJaZ3hRRHI5aUlrcmF1SWVvMDY3T091OENmczM4RnhnaTkrWG9LVnlXQ3grd0JLRzV0MXREZlUKKzlNRTgxaGx5YnRraTNVNTl3OVhOdU9WTC9yK0lKYnUvNTh5WHdPZ0dkUGQwYVhBdXdYVTM4NGVBZFQ3WXR6WHFQUE8rSHV5YlBSZEEKKzloblc1WURSMnp6NDFudG5KRmlaREJiYmJuZlF2VUk3T0JhRjViRitaZHdlaEFMQ2orNG4ybjlxTERrSy84enhNZFNOamxBLzNVUDQKK3ZSRnFzZjQreGhHNFY4aDNHMHNCKy80cHRKanpCNWx1eUREVjFvdFVWWGQ5dmJHbXBYRnIwOXRkOTZtWGhhNWtUOVliNHBzZmJLeHYKK0VnTWREalp1RTJNVHpQZnJ1LzllWC84SHNhYldlTWNZM2VCdGFIckwrTGlEalZ0M0I3NXYyMjQvazJDTkZMMytEL2tiU0xDa0pGaFMKK0Vpd3BLUW1XbEFSTFNvSWxKU1hCa3BKZ1NVbXdwS1FrV0ZJU0xDa0pscFNVQkV0S2dpVWx3WktTa21CSlNiQ2tKRmhTVWhJc0tRbVcKK2xlUlAyOGY1MC9INUVpekxTbEhFREM5akN1R3hKNmNydG9VN1RrVmp4SnhrdUd1K1hWdk5wOXQwYlM5U0Z1NFJhMSsvUFR0L2MrUisKK3VGTGJmTUpZdE52TWJSazducTM0SkZpWnJQQjVoWWRzb0txcUE5U2pmYm02MVpoa09BZHdHMUQzSVZkMldoSkZHcDRDQis2WHc4SXEKK2tENmowUWJaUjNEM0YvaGU4Q1BqSFQxczNyMEVLOFBCNnJIQkxBUm1ieTdrUm01MzhpNFFZUDJKYWc0ZG13a09La1U2OWdqYnFjRWIKK3JPZGRnRDFzTDhERG9mdThEL0M0LzlnQ3lQSFRyTlZacDNvWGl4cFpqQ0NWWUkwZ3NIeThUaWhqZjFSdCtMZTdwU1d3MlU0YmpCWmcKK2ZhVUVrUkoxUUVUWnRlOFNoZWZEVDNDeHR1a1YxdFhTUW02eUJYZitkN05jMFQ5bzIvZDRTVWpDeWY4aVRKWmdqVEN3bmcyK0ZWS0cKK2phbnFNbjlvM1VnRExPS215MWc4M05yS1E2enp3YzQ5MysvWUZGRktwb0FxSXVrMDMvNWRtb0NQMWcvMDB4S3NqQWVycElXTFl6TUsKK29EVHc5QUNmcWdZMnc3QThyQ0RwSEVFVHpaYitrUGdDZUlwcUF6N0hPRDBQSTJ5WE1mWXBVY1MyZ0dvc0x3ZjdicThHMXpOdXduN0QKK0pGZ1pEMVpBRkJXZFR4VkJjalpIZXpKRktGaFBBZnlRd0xxRHUwTE9HQ3lzbWk4cUhTMEcrRGc2d1I0cUpIS0NWeTRhald0bjBsZWMKK1N6dmZEemN6Q1ZibWcxVlF4V1ZnczJFNm9hWS9IZ2NzUDNGVkt2QjZwR1VEQ0xDdTUzYU1CK2VFMEU5RTN5OW50eGV0NEdoNmEvUUQKK3EzUWk2MlVZeXlSWUl5emR3UHQvTzIvWGcrWDQrb0pGMWJOaEVWL2sxWWdXQ1ZkSVh2R2ZJdXBDUzZYejkvOCt4UUdRT3dkZG9YaDgKK0FCcXYvOEpOZjkvYTJnb1EwaldRWUdVMldIN1cwY2JKNmRMNmxMWU5zVmkzQW56TldIZnd5WFY3V0RDT1p5STRwN3B0UnZXL1hkVmIKK1Q4L0I0UDFUWnRuUmNjRkNXcW9FYTZSWXJDdlVmSFB0NUpoZ2ZUZVE1dXhvYnoxRFZkN0hFbEgwcklxL2NiNXdBeDN5Q0xURGJmNHoKK0l0MWd4UEVsTUFFN21DUXFGUy9CR2lsZ0lSaVhkZUR5VGtvV3NPN1cxaWhndllraGVDdUpQejduQkR1bVVUYnJWNUQzTnZPZFQyVkkKK2oyTzhoUnVkeHovOFlUOTdFWEw5Zm5TRnovblpxNEZucGJBK3o3eVFZR1Z5akxYY0FYYitNSUZGRVhtc0lGaTVnVTZrdjB0RnM2T0sKK2VHc0JmMWlGOWc5eWhMbk16MHZoK3UvbnBkM1ZOL2o3L0VFQnBXY0NZTW5nUGFPbHFDV2hTYXRkODR0VXRlREdIWkY1TEFLTHYreFIKK1RlR0xRL04xZGNabThmYUdFalYvNFZGMGhDb0hhYWFxbk9JcnRZWGl2dVAyTWxCbkJPdkVxNm9FU3lxK1FvYkM5RVI3dnlkeXE1RXEKK0NaYVVCRXRLZ2lVbHdaSktueXFtbFhSTHNLUlNyaEpsQkk1S2xtQ2xYK1VTTEtsMHFGS0NKWlVPMVVxd3BOS2haa1Z0bDJCSnBWenQKK3F0SXN3WkpLdlJTbFVvSWxsUTZ3RkFtV1ZPcWxLa3EzQkVzcTVhcFd5em9rV0ZJcFY0ZWlWRWl3cE5JU1pIVkxzS1JTcmxwRmFaQmcKK1NhVmVvQ2lkRWl5cGxLdGhaR1ljSkZocFY0RlNQZ0lIWlVtdzBxOEt0RmtkRWl5cFZLc2J3VklhZkJJc3FWU3JoTkNxN1pCZ1NhVTgKK2dpZTJ5dHE2SlZoU3FWV1ZTbFpMYmVpVVlFbWxWcDRDaGV4V2Vic0VTeXExNnF6Z1ptdGFod1JMS2cxbVN5bHZsR0JKcFZvdFFMR1cKK1Q0SWxsWEtycFl5QWpLa0VheWdFbVUrV0JHdElORTNKOUFtSEVxd2hJd3NrV0ZLcFY0bWkxRXV3cEZJdkpiTUhBRXF3aGtyTm1lME0KKys0RGw2K3c0KytyczdFblQrUTNSNlNSeXN4bTdodTNENUhRR0MxWjN4N0tjOFJOblgyWElkczFWYWRYVThlYlM3SWsyVytwSGxmamEKK1orUk1uQmc0Q1Z0NnorWXFXK0NIbXpyUk5yNngzOVBwVUpRQlBRakYxMGFuWTM3SE5laytuWWtYbTQyRHA2TjVPNU1IeTllUXM4THQKK0NxcHVmT2lyTkdqdE5hR3YzUE95V2xPSlZXZVZiVzNZQ1V5c1MrL3BUSFdHbmM1Vk9ZZjdPY0tDZ1NTek9tOGNYeE42QXU3eDZUMGIKKzE1SVZvU3k0THRZT0p3bFdzODBaL3NsbkdTeGFZVXVaMWVxdTdYUDBaeGNzMU5KK1RxZE5VYW9TUFoycXlLTS91MkR4Q3ovZmx3UlkKKzNma3JJei81N0lQbHFydW1LalZjZFVSZUpVTUJscXR1YW0zY28weTRzRU5uMzlNNTYyRFJWM29IREZaN1RsK0loZ0FzbDZzbVB4V0QKK0xGdWlRWFQyd1hLNU50cmluVTVWR2JRbGNqcmVpWDAvZVFqQVFodGNOVUN3V2krT3d0Q1FnT1Z5MmdiUGxXZGV0SzhiQ3JCYzduaDMKK2Jyb1ZwVHlCMDltNnhHVVJzRnhyeXdjRTFvR292L25RZ09WeU9nYWRJVnJpc2d4WVNGYjNJSDFoNDFLWFpjQnliYXdjQUZpKzBWRUoKK0dpS3dYTTZpd1hIVk5zOWxJYkNRck5pSFdwRkE5cjA5K3E4MFJHQzVWdFltRGxaQmRJQ0dDaXpYMm5XRFNqUEUrc1dIQ0N5WHN6cm0KK3NiWXFpcWUvODlGY2xnTExOYThsVWJEcVY3cXNCWlpyOW1BQ2VKdmJZbUM1NW5iRXVXRlkwcy9wRk5WWURDeTNMVUd3ZkJlN3JBYVcKK3N5UjVyZzZzZEZrTkxGZHNaK2lvNktlc1EzdU01aDA2c0Z3MXRZbUI5YURUY21DNVZpUTlSYW83eDJVOXNOWWVpSFc0MC9vYjc2ZTcKK0xBZVc2MkpmUW1ERk1saERDWlp6V3JKZ0hWNXBRYkJpbTZ6R2Z1N3FkQysxSUZnMWlVd3l5dktzdENCWXJxdVNCU3ZmWlVXd2xzUzYKK3h0djdpZDV2ckxFZ1dIVVRFd0dyM0cxRnNOWTJKVG1nWWJ3bHdhcXJqVG9FcHJNZHU0VUZGUVd4eDg5b0xndUM1WnAzSUFHd3BycXMKK0NGWk5lWEpnZGF5d0pGaXVyT2lEa3dPS1pkR1dXQktzdFo0RXdGcGlTYkJjU1NaSm05M1dCQ3ZhTGNQMkVMQmk1Ym5XV2hJczk0UEQKK0Y2ejg1TUNxcXJNbVdCZEdNMG1PQUZleHBsVTBiTFFtV0FuNGs2eWwxZ1JyWW5KZ0xiTW9XSE45MGJ1RWhtTDFER3N0Q3RhbEl3NnMKK2l1RUVGdXMzeEZwblViQXVsR0JaR3F3eWc2dVk0emtrV0JLc1pNRHFOTUR5U0xBa1dLa0VpeGNIaVRkeFZZSWx3VW9LckdZQlZyY0UKK1M0S1ZVckJFK0I3N3hxZ0VTNEtWSEZqMDBBckZLOEdTWUtVWUxGL2NFRXVDSmNGS0Vpd2V2bmRMc0NSWXFRYkxxeWh4NXIxSXNDUlkKK1NZS0Y0WHVyQkV1Q2xYcXdLdU9OVFpaZ1NiQ1NCWXZGZS95cUJFdUNsVFJZdFJJc0NWWTZ3R0lTTEFtV0JFdUNKY0dTWUVtd01oR3MKK0pSSXNsRk0zcGh6ck9zUTU0a2VIQ1ZpejlWRmlJMTFmR2U5MDFraUxsVzZ3d09CSmgvellXMTBFd3dVczBBMndJQTVZbjRBVkVpeEwKK2dBVVpCUmErS2NFNjYyQTVVZVo3eHJJVE4zSTZoeWRZRWFmRC95ZXduQktzc3dxVzh4T0EwamZSbXMvUkl0eE05b28wSE1GNmxCOTUKK3FWTzRjK1BNNXZLVkt5UllhUWVMV3lZT1ZvMHVJSUs3WGE1dkdvc1BEVGV3Nkd3RVdGOFZwNk1qVHVLSzRXUkpzTTRTV0tZUXJFa0EKK1pLd3VJWXdFU3hjdTJUUzhZcXlBVnJyY0FKTngzUmFBQ1VaYzlmMVM4b0V5eGpyYllOVUEzR0VFNjU4bnlBcVhPb2RkOEI0QzFoZjAKK3ZHL1R5cS9pLzI1eWlTdGw4RDQwTVZiSWkwSzYwRW16aG0rdmNLN3hvbzVlM0NBODRiMFNyS0VCeTJtOEdJZC92eGdJcm9ZM1dGdDQKK3dQWG81ZnhzN3BWZ25YMndURmRZUTY2UWErTWx3eGdzZElXYlRGY28zbDVUQUxsMTFnSnI0OXhKK1pmZW0rbnBoZ0lSdkY5RVhVV0EKK3EzSHhXd1pZem1FSVZtandqbDFCS3JsMU9ZeXpGbGlYR0IzWGgxSU9WczBOVUxwcG9HRDU0b0sxWmxMK1RjbUJaWWJ5K3NPOGE4ZzEKK3ppVXlXWW1DTlFscUJncFdkMXl3SHIwOC94cG5VbmtzSTkxQU9RWjNnVmlpMVJUSTV6MlVJRmczd05JMGd2VUZnTTlzcXJrSEQ2d3UKK3hXQlI1a2luZGh3UVdOT1VLbDlNc1A3VnlCMGtsWGtYNlo2UUJPa3NjMjJDWUgwWkJnNFdLTlhkTWNINmFqQmxPL0FFS2NkcEZoM2YKK2xvdDBJOFJ5OFVCK1pXSmczYU9uRTZ5NlBPQ1BxWGxVaDl0U0ROWkZVT3o4TkJTNkJ3b1dLb3l0SUZpSTZ0MTRvTmNsQmxZcUZBb1cKK0laZ0VXS2d3dG9KZ29YbjVURTBCZkRJeHNGS2hVTEMrZ0RTbUV5eGRYTGltcTlFTnIxaW42N3hUWGh4WUM2VjFCdWVvbS9pdU9sNXkKK3Q4VUM2OUZSOEREeXFuODdDYkRDMkFxQzlXOTBPUDhHazRZRUxQU2N5WUlWeGxZUXJHOVNCUDVsWFhjT0FWaG85d3JUQ2haNkY3MTQKK1pSaFhTTmJkQkp6UVZkeWFCVnpIcDQzVnBTNnhTYVFERFlLMWxuNnhMYUgyWlVCZ0Jka0tnblVSWEVneGQyN2RrSUIxdDJzUVlBWFoKK0NvSjFBem0zNyt1d2FVakErb3c3cmE2UW1wNzRtT2NNbXE4dlFLNGJGOUg1MTEwQ1k5MnVGYURqWGwrZGgzMlBGV2k5aGRtNmpiYlcKK0g2cUo2UXJYOHIxQ0RlTEVoZ1FVMGhJR1cwR3dkQUtySmhUbXN6dUNOQnlzMmZVSm5JNGFkanJFVmhDc0t3a3MvQlUzRG9rcmRLVVoKK0xJeGtkZE1lclJGbStmdWo0QTQ4MzZ1SUlLSURhZEp1NFpjVmdqYTVUdGk1YzRtOTBqZ3hsZ25XN0NBRlNqS3E2Z01XV0FPc1M1TTYKK25lb2dXSmNTV083TUJRdmJpaWVpNXhGQmhtNUNhdWE2WElheEt1QzkyZUpOTG1NdElpaU0ydXdFd0pvMU9MQ210VnZWWWlVRlZtWG4KK3lMRll3aU5laEU1dkJlVUh1T2FHZ2VXNmgvZHQ5VzhQRUt3K01WWjN2d3FOc1lncTY4UllmY0NhNjB2Z2RDQ2NLdGJIRlE1UmpKVjIKK3NKYUNrV25DQmZlYVlBOGxIQ3llN2RSaFhvZ3JuRndYb0N4R3IxQWZWSy9Rb0NwYXI3RFlaUkd3QmhTOFYzYjI3UlhxUTlZcjdCK3MKK2pzR0I5WDI2Mnk5dURseFdoL1psRnJiVW82VkxuU0ZnMVdGSEcvZmFNZ3JqOWpWODNHVWdlSThIbGlzditUeFdrS3J3UEJiRXltUHAKK0lTT3YrdE9XZ240M0FTTVptVEt3S2p0aTVySDA4L3JKWTlXSnpPN0ZzZTh1elUwMHV6MFFzTXBhQjUxNU44WWlmdHRNVWdIa2hvSVYKK1NFS1FDN29FOUpCMFExeXdSSmJpTnRmQXdaclczaDA5OC83cFdKbDMzWFRpL1lQbGpIL2JtU3MvcFdCVmRzVEl2Rk9PMHJpYkhCdXMKK3VvdjR1WVdsNlBzbTVWTVBWcjNTT0xnWXk4Q21lRlB3UmJFejNCV0t0WVdiQWdsUy9TWlgvMkFsZDY5d1dqaFZDZDRyMUVPenBta0QKK1M5Y0hESmFqc2lQdXZVSzRxcjk3aFY4UVJJVmI2dFNBcGNjRHE3VnYrYmlCQnUvT2tQa2V3UWtmNW45aGE4T1duVkhtdHd4NmRFTjMKK1VxTWJRc0NxeVo5MHp5VFJGZjNpcFB6Wm5HeTBjbHZtVGlwOWlDK2l6U083OXVpVkJjYVlqbnh3M1RQcHdsdE1kQzljRWd1c0NBZDAKK2RrWTNtUGNJTDlkenVTT25reEszbWRkY1daQS85YUVnV0Z2bUZseTR4RURtMFVtem5QM2RoQTcvN2d2N2xvOVRITjBqZlR4V0tGaW0KK3V6U2NmREYvVzd5NDJvekd6RnZTZk15TUdaL1IzZ1ZtWkdBWnNHN2c4ejhDU1VkeGVEUm1Sb3p1ZzNOTnNJenpYY3ZCbWdSNW13WUoKK1Zqa0ZoKzBTckZDdzlFL3k0VmFGYXlsRFY4eHBLdHhJTVIrYTJSbytrL0RMR0RnNzE1aURTT0dtR2d6ZnJ1VzRYYzlYV3dlc09xTGwKK1FtTzgzRmQxS04xWTh6bGk3VnU2ZnE5ejR5UWFKY1BCd3JkbWJkcDRFUjlJUXhIWmVYV0RCS3VXZHp1YVJ6cFlnVTRoZ2tQakJXcU0KKzd1NzNhYVNNRHZTODNHOXlqSndHVE5meFpicmhMcGI1OEN5QTh3U2IxZ0hMbUVFSUdoNnA4eEorZk00cjUyMXkxWHp4WHBjeE5wbkEKK2NuNkNqMTdFVVA5ZUF1dTgvbU9zL3NCcU5lNThqSFN3ekU1aGpSaHo1VFNHWHJub1J4WWpzcmFFZ2VVVS9ieFAwcDlOWm9yQjJNbFMKK1lHRXdkWkhSd1haSERyWmFjemtZWUxtTitZUno0Ync2Qk92ZXdZTmxQaUd2UkxwQzB4V0dkZjRJS21NdWRCaFloZ3BOeUF5d25CWUUKK2l4ejRGM1hJKzNaWTNRYTZIVUpwQ0FPc1FDcHZWRjNNQWNvREE4dDhRbDdnYVFnU3JPZ1dLeHdzcHlGelBvVlZMZGFhdVd2TlZQWmEKK2Q4ZzA1ODhCeGxoaVhyUnBzY3d6U2hGWXRZRzdCaTBTckFCWUdHTk5Eb214K29KMVhVamVNd1NzcXkwR2xyc0F4dktGYnlGWUdHTk4KK0VJSFVCTU1yZmlzUVkxMGlEdDFJZmFZQ3JOYmdYYzVhQ1pZSkZ2WDdKbStpWG1HaEt4S3N1eCtsMGZQWE83ZDhFZkt2RGdQclg4M08KK29xWFNEWVVyK1FDVVVTN1I5YXVod0FyQnl1V25od3dGZTRXdWU0S1Q3Z2NORmd1NWYxNHV3VExCTWdlN0ZyckN3ZUtCdmxHaHhaeW8KK0U3UlNZdlZ0Vm9xeFBnR0JDVG1CUE5iMTV0TGtBb3pUUlI3TGVDdDNVOHJBS2d1QzFUNVN3UXJlSkt3eEswVGlWVDVKNTVscGZKdlcKK0diVWp0MXl1eithWmQ5Qm1HKzhHdDNHdG1hU1hibkxwVmdyZXQrQjU1TTkrU0J6S2xoc2dWOXhPb0NOZDYvcUVQb0dxU05hSnQvUkwKK0h4S1o5NVNBVlJ2dUNlVk02TlJwWkJlM05ZTXNuNXhpTDhGS0pWZ3MxQTlLc0NSWUtRTUxnNnhwWGtXcGwyQkpzRklLVmkwOUgwOVIKK0NpUllFcXlVZ3RWQncyWXFGYVZqMklKVktjRnlXZlhKRk0ySzRobXVZSFdvRWl6TGd1VXowcVBERWF3eVJZSmxXYkJvR2tMMzhBU3IKK1ExSGFKRmlXQmF2QnZBczk3TUFxRC9ab0pWaldBNnROVWFxSEpWZ2ROT05MZ21YZHg4b3Bpam9zd2FKUit5REJzaTVZWnNKaG1JSFYKK3dXOGJTTENzQzViSG1GTXh6TUNxQ0J2K0tzR3lIbGp0eHBTSzRRV1dNRmhoMDR3a1dOWUN5d3l5aGhkWUZVYlpEQW1XZGNFeWdxeGgKK0JWWm5uMGxHRWl6TGdZVkJsbmU0Z1dVWUxFV1ZZRmtYckhhUnlScE9ZSFVHUmxWTHNLd0xGZ1paWlJZR2EzeDA3MjJvTmRaSkxiTW8KK1dMTXpDNndaL1ZRdEk3Q1dXQk9zL0hnR3l4eXczMWNQdXEwSjF2amt3R3EwS0ZqbDhRNjZtbzlQenBwblRiQ214ek5Zc1cvcXRGblUKK1l1VWtOMjZ4YzYwMXdhcVBkOUJlbmcvS21sMW5SYkJxbHZXdHN1YXBDbFRZajNsVHAzT3BOY0dha1J4WTdCcExnclhDeS9xTjNyTmkKK080K2hCR3RsaktFeHRYalFWWTdZMFh1M3pacGd0U1FKbG01SnNLN3FaUEdqOXdvRXk3dlVpbUNOajhHTjZCRjJ4NDVZS3R4V0JHdWkKK0wwbXdxalphRUN4M2Z2eURCc29IWmJIeGRkWURhMk5GOUVOdURZeDhqVGtPY0s0Rndhb3JZTWxxcWdYQld0RWMvNWdyNmVyUFlvMHIKK3JBZlcxSmhHVnVudjJ0ZmMxZ05yYm1mU1lFMnJzUnhZYmxzL3gxeEwzY0lzeG1MeE0zUmdiVndXMDJDVjlOdVJ1dEp5WUxuTFdmS2EKK2FEbXdsbnI3T2VSbXVxbURZTFhNc3hwWVd1d0lxLzlydjk1cE5iQnMzWU1BcTNhanhjQnlsL1YzeUhqOU54QllySHFsdGNDNnFqMkcKKzd5NVhLaEpvQ3NWdExiRG10clBCU0sreEZGanUvaThUbm0vSTRqT3FhcXdFMW9wdDBZKzNKZTZnNUpDNWJUbHVLNEcxb3BFTlRqWkwKK2dUVzF0ZDhEN3FaOEF3ZUw1VHV0QTliS1pUR3ZnM2dUdjBKN2hxUGQxZ0ZyUmZVZ3VXTCs4UllDNjVyZGlmZ01ESVVGV0t4a28xWEEKK1dyb3VObGVKdGxGblZHODRKR0ROYTJDRGxzOW1GYkRjRjcrU3lBRlRJaXZMek1RdHNRUllkZU85TVFOQ3BYSUFUYkhXRW1DNXg3ZXkKK0ZNaW5iYlFFV0hWS1l1Rml1YUlFd0dJdE9SWUFhNjB0UnBxcWFrQmNvWnI2SHZ6WkIydEZUZ2RMaldvbnVvY2NMUGU4R3hQczNsWXEKK1NuZFc4TEpZTjk0NXBHRFZyYzJLWWE3YW9DRE9VSmtZN3ZER3FlNGhCY3U5SXF1TnBVeWRreUpHQzV4dHNOeExzaEx1M2FJWjZNd0sKK1BmZ20yOVNON3FERy85eWRWbTI4SnVURml2SGoyNkpmRUIwbDJCMVVCdTVUT21welp0ZUVmTVBFOUo2TmU2b3I1TVhTOGVNUHM1U3EKK1k1bnRHdWRaUEowbEs0TExkVXRzbHc0Z2FWS3RLQjFaRVVkL2VPdkNTMDFwbDZaWitlYkMzR1ZON1RGU245NENHaWRUbHR4ZDNJN0QKKzYyNjg4bXlkVHNqbkwvTzJkN0xVcStQQUE1ZWV0ZGFaZEtHNWRPTURMZTBEeXZIU1BaMHNabVY1eThJcnBrb05DOVZiR3F6MmFuU0IKK05MU3ZvRTAyMWZCU2c2SzBXUk9zMXVvQ1k2eG9XVU9IYkNnSlZpclVWbFVnTEJXRzdNMlNxdUVvQzhaWUxXWEd1UFlTcFQ0dDhhL1UKK1dWQ1VYdUhRcWtwVitGT3JvYkhkSjV0bldJUFZhU0d3cXZqc2VhVmFRalhjaFMzcHN3eFliZHdIMXN1Z0tnTlVFWHF2Y0lqbEFhcDcKK0pXMVZScWpFT21CNU1Gd3ZsMWhsaUdpcXVqWEFva0V4SHRrZ21RTldwVFhBNmxRS2xHYlpIcG1panNDWWR3c0VlOVd5UFRKR0xZclMKK2FBbXdPaEtjSlNFMVBOUklqejJ4QWxoVjVZcFhOa2ZtcUlySzIxb0FMRi9jaDVoSURUdUJxTjFnaFM2aGpMQXlTRDVSeG1qb0Q2UTIKKzhMaFhxVXlRbDJKM0s0QlZFTy9oT0ZMRFR0VjhZdkhRZzlXdHFPV3lOVEpJb2pqZTBJUFYyVzh4TmFuaHBMWXkvcFNtb1FmTGZGeVUKK1ZNWjR3aGFyZ0ZVcm15UFRQS0VGd0dxak1sMVNHZFFuckxZR1dMN1dWcGx0eUJ5Vkc3TkFzK1JQSVpWYS95TnVvMGl3cEZLcFNoRzYKK0p3Q1dQNEZQQzI3VE05QUQ2WW0rbTE4MlVVcDB0bjlITkZoR1RmdElzRHlxa1FaWFZQRWtudTN6ZFZXYnNibnZJUis3dlVqVkZ1NGoKK0pqN01Va20wNTRZaU5YL1pVYkZubWE2V3JPNjc0MEdiK0lwRCtNa3pkb2lWRzByVS9EdFBpYldBbjNCNnhDTlJGbXdJVWJuaU5meTkKK0hUT1duWXFHejFQbXhvOU5kemhtUEUxTE84dDByV1ExZ2VYZkgvSkRCL3B1cWlHeUx4dW02OFplMkJCMmJlR0pucVNQMmpSWWZjRUMKKzgzeUErbXBkMDRGbU9RQVVIbzNZOEtBT3FtSUQvUTkwemhxUVZOWTdFeHk0dFVZYjM2L2huaHBjSC9uZHZWT0FQeUgxVlR0azQvdGYKK28xWFQrV2NWY3Vwd1VhUEZrUjRFbXczaEFBN1dCZ2YrTVBqTDVMN1VsNnREWUd5OGdGb0w0QnZNLzR3RGYxM2d2LzUrdnVqNFFkZysKK0toaENEaGFiZXpGMks3YWZUYlJmTW1wV3Bwa0RWZm9CYXc3a1BPOWpQWHR6WUhMRWh0K0ZjU2VZYnc1Y2hzdTd3TmJXaW1JdlF1NFIKKzVsdE01M1BjQnQvenM3MmE0M2ZoKysyZkFoeXNyby9Bb202MjEwYnYveGhtZExMOU52V0hqSDBKaW5GUmd4OUtzTUxBZWdiZ0VldzgKK0h6NGY3SDNzeVU0d3dQcC9HanpQMkZPUWQ1UmRBRGY3MmMrMHZMY1ltd24zK3RrTDJxaTNRdmRwNVZvT0UvenNUUTJldzcyMHZEL2oKK1ZubDdtRzhCM0paa0J6K2tNRkI4c0Y3VGRIR0JZRlAvbEVLenFzRFE5TnVuUDBCWkM4amhrRjBtVmw0QnRQTHZOdnQ3N0VDRmZob04KK2NSYXNZNjlXVmYyWnNXTVBWRzFsYkw0S1l6bFlmOVgwZHhneHRZeDE1ZWh2MExtKzNjbFlOaXpqWDc1TWdoVUcxdmxHWTZPOXZ4ci8KK3E2OEtGczZjRG81Y3NmSDIrZGwrUCt0Vm9ZM1JQOGIvL3ROR2RDRmV2MlFmUEZCRnJiaWhxbExFWG0vcW80NzBzR2ErRjI3N0Nyc0wKK3JzUFZ2OVd5MzBzMjFSQVlBQlVmclArQTg1aUp6RTE4WlVTUy9IOWhIUDQ5Qng3WStXQVRJeXlxeGI3L2JZVGs3K2ZBOTFqdlI4amUKK2ZSWkdZM3lnYU0rM2NiQmFoVU5zaFFsbzNFYXpYZFZiVDlEckwwRXBXak9idEZqaFlQMEpIQ2VFMi9zT2pNS2xTZ2lPQ0ZGSzl3VmYKKzRtLytUdzNlUm91RnJ1OU5zbGkvRUpnc2gyc1ord3JrdmVWL2hsc294bUY3T3JpWERmYWdnL29sbzBVMFhrbW9VVkVjTERaWWp1b3EKK1ZMV0R3UG80UEJJZ2FBS2RROFNRdkpPajRCYkdQckJ4YjEzNEZ2c1l0MWhkV2ZDNHNjSFB3UDRHdDNkUHZ5aHNYcHZmUU9xdm9OUDUKK3ZncGowWGdWTG5BQU9PZ3NqK2ZBd3FycFVDeGpMSEJVOFlZQUF1czdrRzEwOERnMnZDNnhxYmZET1VONnNrK3hGMno2c2dkNTNQU0UKKzJIVVZOV0RYR0RqM1E1M2JQR0daVG9YdTlRNGJBMVRHdlplTTE4RFZHbFlocnk5WUFUV1FCZHBxckJjK0wwSVkydHVQb01PMFFmSHUKK1hXU1cvZ1BHWW4vdVpRME0vbDZ3d1NMR1k4SjhIUzQxRDRDRGhUSFlOL2hGbzdFREFMazdXcGFEZzhoN2lyNDZTb1E2OHNBS0NGdXIKK0lraU9nOENLekI2RmdMVWU0RWNpamdjWWkrQThLTjZyb2diMHY0RFJQMlFiVWRvY3ZxSFFVeHBaTDdzZ0tpbXdPc0xuaHZZRlMyMXQKK1FiVXFrV0NON3ZOUko2ZUEvaXpGYkllcDh1d2hqTk5QNWtCaDFlMDZZR0JGOXZVWkpJNWZFeWZScHVXK0V3WVdHak8wVFdYQXdkSi8KK1luckIrMEhiMFhLZnB2OVVnbVUwQkpidDdoVUFBQXZQU1VSQlZBZnI5Z1RCNm1IM1lWZlFUeGZzMk4wdE15SG5SQmhZZ3JkZmkyM2YKK3RJMDZZdTYxM2dHei9BVFc3bVRCb3NBOWRKUksvQmpyaW9Bci9IRWcyZ3JvMkJTdy96b2tqWkFGbTltaE1RNXd6TG9DQXlzOFdyd0sKK2lrK1pmVWhodWtMQUl1d2dlN00yRGwyaDZ1ZGVNWmNkcyttL1lSVGJUWlpnaGNaWVFWZjROOTdUaXdGV0Q0WlNjSXVmK29mMm94eWoKK080S3VrRGZnbnpRMFdHS24rK0JmVEs3dUVuc1pyckNMd3EyQmNsVVdNYXl1ditEOVhBcUg5akdNbmg2SjVLb0ljdmFGNWR5QTBxZ0gKK1d0cllLUDEzd3JwZWIvd2F4NUFobnZFS0JZc2RhMjA5Y1FCbW9WZmtZQjFBc0E2STl3NkFKc0VLQmV0dkdGbWgvM3FlbmVFUlZFeUwKK3RSeDBIbyt2TXMyVXpRemU3NExQaTNoZEpLeTRKL3lsc1R0eTlYaklxbi9tRERoNDcxU1ZhZUdQa293UDFuNGJ1ZUhQMm0vWnpvUHcKK3NQaHFDb3cxMEo5VGNnc1BtdlRmZFhxZjlOTlNEdjdGYVAwYjVoVXhFd3AxeVBmN1E4SHlObnE0S2ZzYTY4MkIzM0NqZUM2RjlQUTkKK2Y4U1FYb0lWbW02WVFobWRYNmpGZTNYNEFZc0oxbnJJRXgyK0p3Uit5OUZNWWRlS1ROd0Y4SHNSd1k0Rm5kdUREd0o5UDF6NVU5T0kKK2tWbjdIeTE3Z0xlQzJxZ0dZL2NBd01JajFWZWY2TDBQSXo1K1U2ZXEyaHNTSXk2c1JsVlJqMUhmd1k0dFFQZDF5SWJvNDlMWDBCemwKK1FDNjlYKzJoY0VyL0RmWU1idzZ6V04rRi9DTnNseTMzSFQrK243K0g0VS8yRGRhVlE1MUxYRndvd1FvRDYwME5GdTVoTDRNT1k2blIKK0c2cXJvb0NGRzQzbHYzbjd1N253dFZOc3UwN3gxQUlvUFlITlJSN3dYUjF1Um90QWVSL3lsaUxxZlRQWDJLc053eTdIRG5ad1NxQlQKK24zRENYVkdtUlZTQzd3Y3NkcDhHcXVwQSs1bS8yUitheDNyZlpuUlpjUE5ldEsrcUNxT1BVT3hOUzZWK3NqK0dxc2dSTHFMcnduQ0cKK0Fpdy9rcWVyRHBWSGFZdHBFUXI5M0ViUzkya25KRmpodDNSZXR1TVB3Mi9FM0hra0lyOFFlTG5BL00zYktJQ2xyU2tXT2E3VEl2K2gKK01aby9SVmMvWGVML0NkbW5UVWNZdUx1em5wb2J4cDBhMEtGV1JudlFVVmJmSkpjQmxpSnVRci8rV0pHaVBkQXlCZkxlQ00xamVSVlQKKzlHcFhtWksvbVRxeFBUdW5Lek9hNkpvNngzeS9xbXVNTXByV3pGRnM3eG41RGhGaTNXZTMzV2tFb3J1bUs4VTd1UDA5OW1RUkxwNGEKKzZWeXhhY0dHRU1taFk5dkxzbTBMbjcvTFFiNndQSHpLWElWNCtSSHpOOGRlK3NGVmV2YU01M2xPOWRnRzNYWW51Yi8xaWtKNW5LY1UKK0JkM2lnK1pIQlBZaWI3UjNmbmIrNXU2QjNJUnVkU2pSeGdBblBHeG01NTJKZjVjL3VhM2tXSmxFOVBwTVMxMTF2SEpzbEVjOHlJRisKK1VvTlFnd0xvQnFPVllwUmdTU1d0UmlwSURDMVIzNU5nU1NXbjdscFI1enBHNVZnSmxsUXlhcTBVUGJPWVR3K1JZRWtOV0czMTRzRTAKKzFYSG03VW13cEFZa1gzTWxVa1VwQmsvYzh1a1NMS21FMWQ1WWFUN3VyN3EvaDBoS3NLVDZWMmVycDdxaUlKQVRyMjd0LzBtK0VpeXAKK2FHcnhOamQ3R211cnF5ckxTeHppT1g5Q2xjMkpQVWRaZ2lVVlRhQkVDRmVVMTdZay9uQnVDWlpVTkJXRU1GVlFVZTFwYVJ2Z1kwa2wKK1dGSlJYU0VmRnQzVzNwSHNZMjRsV0ZKcGtRUkxTb0lsSmNHU2ttQkpTVW13cENSWVVoSXNLYWswZzlWYWIwendxcTNuUTA1N3ZRMWIKK205Nk91dXZMOVh5U29aKzFORzdiN1JjVE83ejFUZWJFcmRjYnQvV3RBSEF3dVBKZzQ5YW00TFFBMzlaNjJSZ1JxcThYMlVtUDBTWUgKK0d1dTNSUytxOE81V3NRVzJSUU51d3R1Q1dpVjJVOVRXRzJvM1dsRHM1ZS8xMWplZVNBZFlFZk1LdDl0cFRxRmFHdVc3anVYd1NZYisKK1k5TlZBSWUyQjQ5cmZ4NXViZU56dkh1WDIyaS84RnFpWW1YaFcrWWkyQUtWTVJlYjgrNmxBbktBR0VnblNzM3NuMEt6Q3RYUmY0aXkKKzVRTFJhdjY5T3BXREtqN1J3OTZmU2EweW1zOTV2cy9HVjRidEVWSXEwciszaU85MUJGdndOV3BCNWZHMGcvV3lCb3VhbWgrenc4VjkKK2RqdzVFemhZdlJkQS9qYlBkQmo5SGsxTUxXM2FZSE04MjBPZ0ZEWTlhYVBxV1NGYUQ3bGJQVE1oMzArVG94MnJteGVJQ2ZXTVYwS1UKK1lNVUY2MzBkeG0xdGJpd0MrOXRuSWpkY3I0bFd3MjB1Ym1vRUdPZEgxT3liUFVVMFB4Vi9kZnRXWER3M2JIYWR1QXVvUWQ0K0twcUYKK2V4WEJ1Tk8waUMyb09YNmZickN1QUY3MStHVXRMNktTS051WkJ3S3MxMnhVMWVHa0RiN0h2c3RyeFB5V2l2eTlwdUhKc2YrZHNTaDAKK24rTTJlQlpKL0JoODd3ejdHRTJPN3JJWjVSME8yU1JZL1lEMUhiQVRHYjFUcURKZm1GNmJhZFlnL1k1cVAySFU4UnRGayt2ZjFhaGcKKzVCaDRpVE8zTDVxbFErUDBQemFhYS8rdUxXOFBld0pvYXZFR1htUXZyV0JsR3pWbW1wcmJPT1dCUXBGZXNEK2ljckE2VzcxaTgycUUKK1pSMWRObFJSOU1lOHRCOTNmM09VMGFmUnJpbWovWDhGbFZ6amk4VFVPWHlETEY0MG1maytrdnVzQkNzK1dCVkdJU052TTlYa0RKMEoKK3JVRHBqYUxWMmx1YWhadHJZenEwTWxHTjlDL2FxS04rY2lFL1lGMTVDdHF0OS9sZjBsTlUyNVlkTnZlaUdxUVBNZGJ6Rjl1b2Q5SU0KKzFxMlF1L2xFeUJrRUF1emRxOThLSzBpS0p1Y25pT0U2c2RrUDBkVDk4TEVpMjhJOTZQZVBVNm1BbjRIK1VtalpVVnhSZklUdDBrUU4KK204WHcrQUVKVmhTd09vTmcvUXJnem1BRUhscTdZZUh6NGFVY1hnQzBXQXZnc2xPaUVzaC9DaUtwR2hZVjlIdVdpa0tLTnYxd2xCNjAKK1lpOVExZVNQOHpKR0grYmsvU0VOWUJsRHZIaXB5SVBaNktKbXJETk95TlBjR3VhbWcyRDF6aVMvZmdVUHFkQXJia2J6UzFYZXdmNGMKK3Z5NzA1M2dkaXRjMEhsTDlHSEx4c3RnQWRrWFRuaE1CVmlscmsyQkZBY3RzQ3NKbU9qYUZ0c3pvU0h1YlBhRmJob0oxdklqczBNa0YKK29Db3dEc0Y1RExKcDlTcGVrbkVCWkcvWHpLSkY2ME9LNloyY1FudnB5VmYwR3hoWTdPQUM2cnc1dE9laTdCb0VxeGVqOEY5VEtPYlkKK3dVNHVCL1NLMmFBL3ozejNVVWpQdXM3Qmp5aEdKOWg3RHN3NHdmYm1JRVBZbDhUdlVlRk92eCt0WGY1cENWYS9ZUFZ1NEQwNVpYV1UKK0VoY2hZQ0ZYbzQ1UVR3OTNkdUFsN2crVWlxU20vcnVPSDJFNHd0NHh3Y0o5eU5Xb2ZVUlVpd0JyZDdyVERlaUJQYmRuTzBCOUxnNVkKK3ZwbWdQbTNVS2NTektjTFRHV1VhTHlxcnZWOER4MHVVSlRtRVRDbFU4SWhnVzNTS3ZmNFIzT3prbUZ3OHBYWUpWbnhYU0wrejk3RTgKK296UlJUTEFPNlpDTnNmb0hPbXoyVTUyeGw5QmlLVUdMUlVYVzdFZEV6dkczV3JhWkRUcFdKS3ArcHRWaWhZUEZqMkh2K2RINkNTWlkKK3ZpbkM1VkZmY2JveVk4OFY4Ti9vRlkyQzd4UjF2YW9CL0pwLzBMRlZEdTJCVjdRSjlQaUFmL0E0Zmh6YUtzZ200d1ZLaFdRcFRoNUwKKzZQQml5RHNSR3l6a2l0ZnZOQUtyNVJoWWhjUllJcStqRzJEZEJYZVlOT1pCRGpkZUlzYjZJTWs2NzRtRGRXRFZGTkU5MkFXMm1HQ2gKK0ZkVkNlN0pkT1hhelY5aWJSVlZ1dThhZytSMGQ3R2U4Q25NcGpxZXpmUjAwQXN0UXBXUXBObGlQbGYxY09MQjRWWk9QNi9RZ0doYW8KK3diMEtjdGlmZ3IxQ3d4VWFkZFhHbUhZSnZlZTRJMGFhbW5xRmY3TFowOXdyeEw3ZW5jWVh4clpZaXlIWGVLYlBYOHZ6M3FGSWF6TEYKKzZXT1BVb1Z1OVExZWJuS0hxUGYrbFJMNk93YzdrR2l4cU1iNHJUQ1pkWGhJOWVCbzlrcVdZb00xblVwck0rcE94N0ZZUmZCUjRTZC8KK29lbEhlTUQvZVFMbzE0RThsZ2plZVdiOWJ3RzdORjJVbjJRc2tNYzZMOTE1clBzQkNtc2JuNXdPS3NWSUVVOEY1MkNkMmFzWjRYNDEKK0ZSRE4zL2FZM2Y0U3o3eHJXNThjQmJQUVFGRVc5QmxlMWY1RjBGYzN6T2VQblZoTWk3ZHJqaDhaYVdRWnZQY0Qxc3NPeUZtM3JXRzUKK2c5ZDVqS2pvSjhBNlF3OWZFQlg5ZXFmZzFnMFhZQngvaGpMdjZ4cEU1djFuMUNQOGlxaHVhMVJUWm1lZU1mZnlrbk9ac1cyVkkvMloKKzk5NE4yZnhlb2ZaOFJCNHJhTEcrWkRveURLcjJaOVA5UHg1djlTN0hxRW1kZFlyNkhzWGNObzArS2xiYVo1R0I2NkViV0pEOXRQbGgKK0VxeitZcXhkT3ZVS0hhSlhHTDBHNmN4Z0RkSmovRjVoRG0rMzlYUmZneXJ1b3lPOG1TZnZQM29xOENnVThpREIyNFlINmJhaDhqUkwKK1BWaHRua2F4ME9qaFNhdmVsbVpQYzF2WUtsT05uaGIrMXhDOTZQVjZkcHNqRmw1dmJxTDlYdmQ0NkthenI4bERIWTREWWlYcElHNGIKK05Pcm9FQ1ZKa1JlNVIvUUt2VWFiSFBCNm1sNDVGYmJLa1BIU2JBcFBCLytwUGE4WUh1NWdjeE1mdk9EMWVHajMxendlRE5OYWdpMXQKK2lNOUdiZkUwcDJWMGc1UVVrMkJKU2JDa0pGaFNVb1BXL3dmcjV0ajh3Z0UrSHdBQUFBQkpSVTVFcmtKZ2dnPT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvLmdpdGlnbm9yZSBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvLmdpdGlnbm9yZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC8uZ2l0aWdub3JlCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsLy5naXRpZ25vcmUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvYmlibGlvLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvYmlibGlvLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9iaWJsaW8ueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2JpYmxpby54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvY2FwdHVyZS5jLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY2FwdHVyZS5jLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9jYXB0dXJlLmMueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2NhcHR1cmUuYy54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvY29tbW9uLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY29tbW9uLnhtbApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2NvbW1vbi54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY29tbW9uLnhtbAppbmRleCA5MDI4NzIxLi5hODZmN2EwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2NvbW1vbi54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9jb21tb24ueG1sCkBAIC0yMzYsNyArMjM2LDE1IEBACiAgICAgPHBhcmE+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+XQpAQCAtMjE1Myw2ICsyMTYxLDggQEAKIAkJCVtIVyxNT1VTRV0gQ29udHJvbHMgTG9naXRlY2ggc21hcnRzY3JvbGwgYXV0b3JlcGVhdC4KIAkJCTAgPSBkaXNhYmxlZCwgMSA9IGVuYWJsZWQgKGRlZmF1bHQpLgogCisJcHN0b3JlLmJhY2tlbmQ9CVNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHBzdG9yZSBiYWNrZW5kIHRvIHVzZQorCiAJcHQuCQlbUEFSSURFXQogCQkJU2VlIERvY3VtZW50YXRpb24vYmxvY2tkZXYvcGFyaWRlLnR4dC4KIApAQCAtMjIzOCw2ICsyMjQ4LDcgQEAKIAlybwkJW0tOTF0gTW91bnQgcm9vdCBkZXZpY2UgcmVhZC1vbmx5IG9uIGJvb3QKIAogCXJvb3Q9CQlbS05MXSBSb290IGZpbGVzeXN0ZW0KKwkJCVNlZSBuYW1lX3RvX2Rldl90IGNvbW1lbnQgaW4gaW5pdC9kb19tb3VudHMuYy4KIAogCXJvb3RkZWxheT0JW0tOTF0gRGVsYXkgKGluIHNlY29uZHMpIHRvIHBhdXNlIGJlZm9yZSBhdHRlbXB0aW5nIHRvCiAJCQltb3VudCB0aGUgcm9vdCBmaWxlc3lzdGVtCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL202OGsva2VybmVsLW9wdGlvbnMudHh0IGIvRG9jdW1lbnRhdGlvbi9tNjhrL2tlcm5lbC1vcHRpb25zLnR4dAppbmRleCBjOTNiZWQ2Li45N2Q0NWYyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL202OGsva2VybmVsLW9wdGlvbnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbTY4ay9rZXJuZWwtb3B0aW9ucy50eHQKQEAgLTEyOSw2ICsxMjksMjAgQEAKIHRoZSBmaXJzdCBvZiB0aGVzZS4gWW91IGNhbiBmaW5kIG91dCBhbGwgdmFsaWQgbWFqb3IgbnVtYmVycyBieQogbG9va2luZyBpbnRvIGluY2x1ZGUvbGludXgvbWFqb3IuaC4KIAorSW4gYWRkaXRpb24gdG8gbWFqb3IgYW5kIG1pbm9yIG51bWJlcnMsIGlmIHRoZSBkZXZpY2UgY29udGFpbmluZyB5b3VyCityb290IHBhcnRpdGlvbiB1c2VzIGEgcGFydGl0aW9uIHRhYmxlIGZvcm1hdCB3aXRoIHVuaXF1ZSBwYXJ0aXRpb24KK2lkZW50aWZpZXJzLCB0aGVuIHlvdSBtYXkgdXNlIHRoZW0uICBGb3IgaW5zdGFuY2UsCisicm9vdD1QQVJUVVVJRD0wMDExMjIzMy00NDU1LTY2NzctODg5OS1BQUJCQ0NEREVFRkYiLiAgSXQgaXMgYWxzbworcG9zc2libGUgdG8gcmVmZXJlbmNlIGFub3RoZXIgcGFydGl0aW9uIG9uIHRoZSBzYW1lIGRldmljZSB1c2luZyBhCitrbm93biBwYXJ0aXRpb24gVVVJRCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQuICBGb3IgZXhhbXBsZSwKK2lmIHBhcnRpdGlvbiA1IG9mIHRoZSBkZXZpY2UgaGFzIHRoZSBVVUlEIG9mCiswMDExMjIzMy00NDU1LTY2NzctODg5OS1BQUJCQ0NEREVFRkYgdGhlbiBwYXJ0aXRpb24gMyBtYXkgYmUgZm91bmQgYXMKK2ZvbGxvd3M6CisgIFBBUlRVVUlEPTAwMTEyMjMzLTQ0NTUtNjY3Ny04ODk5LUFBQkJDQ0RERUVGRi9QQVJUTlJPRkY9LTIKKworQXV0aG9yaXRhdGl2ZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4KKyJEb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCIuCisKIAogMi4yKSBybywgcncKIC0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21lZGlhLWZyYW1ld29yay50eHQgYi9Eb2N1bWVudGF0aW9uL21lZGlhLWZyYW1ld29yay50eHQKaW5kZXggNzZhMjA4Ny4uNjY5YjVmYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tZWRpYS1mcmFtZXdvcmsudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbWVkaWEtZnJhbWV3b3JrLnR4dApAQCAtMzEwLDcgKzMxMCw3IEBACiB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiB0byBiZSBhcHBsaWVkIGxhdGVyLgogCiBMaW5rIGNvbmZpZ3VyYXRpb24gbXVzdCBub3QgaGF2ZSBhbnkgc2lkZSBlZmZlY3Qgb24gb3RoZXIgbGlua3MuIElmIGFuIGVuYWJsZWQKLWxpbmsgYXQgYSBzaW5rIHBhZCBwcmV2ZW50cyBhbm90aGVyIGxpbmsgYXQgdGhlIHNhbWUgcGFkIGZyb20gYmVpbmcgZGlzYWJsZWQsCitsaW5rIGF0IGEgc2luayBwYWQgcHJldmVudHMgYW5vdGhlciBsaW5rIGF0IHRoZSBzYW1lIHBhZCBmcm9tIGJlaW5nIGVuYWJsZWQsCiB0aGUgbGlua19zZXR1cCBvcGVyYXRpb24gbXVzdCByZXR1cm4gLUVCVVNZIGFuZCBjYW4ndCBpbXBsaWNpdGx5IGRpc2FibGUgdGhlCiBmaXJzdCBlbmFibGVkIGxpbmsuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubWVnYXJhaWRfc2FzIGIvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5tZWdhcmFpZF9zYXMKaW5kZXggOWVkMWQ5ZC4uMWI2ZTI3ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5tZWdhcmFpZF9zYXMKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5tZWdhcmFpZF9zYXMKQEAgLTEsMyArMSwxMSBAQAorUmVsZWFzZSBEYXRlICAgIDogVHVlLiBKdWwgMjYsIDIwMTEgMTc6MDA6MDAgUFNUIDIwMTAgLQorCQkJKGVtYWlsZC1pZDptZWdhcmFpZGxpbnV4QGxzaS5jb20pCisJCQlBZGFtIFJhZGZvcmQKK0N1cnJlbnQgVmVyc2lvbiA6IDAwLjAwLjA1LjQwLXJjMQorT2xkIFZlcnNpb24gICAgIDogMDAuMDAuMDUuMzgtcmMxCisgICAgMS4gRml4IEZhc3RQYXRoIEkvTyB0byB3b3JrIHdpdGggZGVncmFkZWQgUkFJRCAxLgorICAgIDIuIEFkZCAuY2hhbmdlX3F1ZXVlX2RlcHRoIHN1cHBvcnQuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBSZWxlYXNlIERhdGUgICAgOiBXZWQuIE1heSAxMSwgMjAxMSAxNzowMDowMCBQU1QgMjAxMCAtCiAJCQkoZW1haWxkLWlkOm1lZ2FyYWlkbGludXhAbHNpLmNvbSkKIAkJCUFkYW0gUmFkZm9yZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9BUEkuaHRtbCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQVBJLmh0bWwKaW5kZXggZDcyZmQyYS4uMjU2ZjhlZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9BUEkuaHRtbAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0FQSS5odG1sCkBAIC05LDcgKzksNyBAQAogICA8dGFibGUgYm9yZGVyPSIwIj4KICAgIDx0cj4KICAgICA8dGQ+Ci0gICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cubGludXh0di5vcmcvZG93bmxvYWRzL3ZpZGVvNGxpbnV4L0FQSS9WNEwxX0FQSS5odG1sIj5WNEwgb3JpZ2luYWwgQVBJPC9hPgorICAgICA8YSBocmVmPSJodHRwOi8vbGludXh0di5vcmcvZG93bmxvYWRzL2xlZ2FjeS92aWRlbzRsaW51eC9BUEkvVjRMMV9BUEkuaHRtbCI+VjRMIG9yaWdpbmFsIEFQSTwvYT4KICAgICA8L3RkPgogICAgIDx0ZD4KICAgICAgT2Jzb2xldGVkIGJ5IFY0TDIgQVBJCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4MjM4ODUgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4MjM4ODUKaW5kZXggODdjNDYzNC4uODkxMDQ0OSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDIzODg1CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3gyMzg4NQpAQCAtMjcsMyArMjcsNSBAQAogIDI2IC0+IEhhdXBwYXVnZSBXaW5UVi1IVlIxMjkwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMDA3MDo4NTUxXQogIDI3IC0+IE15Z2ljYSBYODU1OCBQUk8gRE1CLVRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTRmMTo4NTc4XQogIDI4IC0+IExFQURURUsgV2luRmFzdCBQeFRWMTIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTA3ZDo2ZjIyXQorIDI5IC0+IEdvVFZpZXcgWDUgM0QgSHlicmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbNTY1NDoyMzkwXQorIDMwIC0+IE5ldFVQIER1YWwgRFZCLVQvQy1DSSBSRiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMWI1NTplMmU0XQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4CmluZGV4IDQyNTE3ZDkuLmQ5YzBmMTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3g4OAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4ODgKQEAgLTg0LDMgKzg0LDQgQEAKICA4MyAtPiBQcm9mIDczMDEgRFZCLVMvUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2IwMzQ6MzAzNF0KICA4NCAtPiBTYW1zdW5nIFNNVCA3MDIwIERWQi1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzE4YWM6ZGMwMCwxOGFjOmRjY2RdCiAgODUgLT4gVHdpbmhhbiBWUC0xMDI3IERWQi1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxODIyOjAwMjNdCisgODYgLT4gVGVWaWkgUzQ2NCBEVkItUy9TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkNDY0OjkwMjJdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmVtMjh4eCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuZW0yOHh4CmluZGV4IDlhYWU0NDkuLjRhN2IzZGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuZW0yOHh4CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuZW0yOHh4CkBAIC03NCwzICs3NCw1IEBACiAgNzQgLT4gQWN0aW9ubWFzdGVyL0xpblhjZWwvRGlnaXR1cyBWQzIxMUEgICAgICAoZW0yODAwKQogIDc1IC0+IERpa29tIERLMzAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVtMjg4MikKICA3NiAtPiBLV29ybGQgUGx1c1RWIDM0MFUgb3IgVUI0MzUtUSAoQVRTQykgICAgIChlbTI4NzApICAgICAgICBbMWI4MDphMzQwXQorIDc3IC0+IEVNMjg3NCBMZWFkZXJzaGlwIElTREJUICAgICAgICAgICAgICAgICAgKGVtMjg3NCkKKyA3OCAtPiBQQ1RWIG5hbm9TdGljayBUMiAyOTBlICAgICAgICAgICAgICAgICAgIChlbTI4MTc0KQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0CmluZGV4IDZiNGM3MmQuLjdlZmFlOWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQKQEAgLTE4MiwzICsxODIsNyBAQAogMTgxIC0+IFRlY2hvVHJlbmQgVFQtYnVkZ2V0IFQtMzAwMCAgICAgICAgICAgICAgWzEzYzI6MjgwNF0KIDE4MiAtPiBLd29ybGQgUENJIFNCVFZEL0lTREItVCBGdWxsLVNlZyBIeWJyaWQgIFsxN2RlOmIxMzZdCiAxODMgLT4gQ29tcHJvIFZpZGVvTWF0ZSBWaXN0YSBNMUYgICAgICAgICAgICAgICBbMTg1YjpjOTAwXQorMTg0IC0+IEVuY29yZSBFTkxUVi1GTSAzICAgICAgICAgICAgICAgICAgICAgICAgWzFhN2Y6MjEwOF0KKzE4NSAtPiBNYWdpY1BybyBQcm9IRFRWIFBybzIgRE1CLVRIL0h5YnJpZCAgICAgIFsxN2RlOmQxMzZdCisxODYgLT4gQmVob2xkZXIgQmVob2xkVFYgNTAxICAgICAgICAgICAgICAgICAgICBbNWFjZTo1MDEwXQorMTg3IC0+IEJlaG9sZGVyIEJlaG9sZFRWIDUwMyBGTSAgICAgICAgICAgICAgICAgWzVhY2U6NTAzMF0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudHVuZXIgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnR1bmVyCmluZGV4IGU2N2MxZGIuLjYzMjNiN2EgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudHVuZXIKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC50dW5lcgpAQCAtNzgsOCArNzgsMTAgQEAKIHR1bmVyPTc4IC0gUGhpbGlwcyBGTUQxMjE2TUVYIE1LMyBIeWJyaWQgVHVuZXIKIHR1bmVyPTc5IC0gUGhpbGlwcyBQQUwvU0VDQU0gbXVsdGkgKEZNMTIxNiBNSzUpCiB0dW5lcj04MCAtIFBoaWxpcHMgRlExMjE2TE1FIE1LMyBQQUwvU0VDQU0gdy9hY3RpdmUgbG9vcHRocm91Z2gKK3R1bmVyPTgxIC0gWGNlaXZlIDQwMDAgdHVuZXIKIHR1bmVyPTgxIC0gUGFydHNuaWMgKERhZXdvbykgUFRJLTVORjA1CiB0dW5lcj04MiAtIFBoaWxpcHMgQ1UxMjE2TAogdHVuZXI9ODMgLSBOWFAgVERBMTgyNzEKIHR1bmVyPTg0IC0gU29ueSBCVEYtUHhuMDFaCiB0dW5lcj04NSAtIFBoaWxpcHMgRlExMjM2IE1LNQordHVuZXI9ODYgLSBUZW5hIFRORjUzMzcgTUZECmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnVzYnZpc2lvbiBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudXNidmlzaW9uCmluZGV4IDBiNzJkM2YuLjZmZDFhZjMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudXNidmlzaW9uCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudXNidmlzaW9uCkBAIC02MywzICs2Myw1IEBACiAgNjIgLT4gUGlubmFjbGUgUENUViBCdW5nZWUgVVNCIChQQUwpIEZNICAgICAgICAgICAgICAgICAgICAgICAgWzIzMDQ6MDQxOV0KICA2MyAtPiBIYXVwcGF1Z2UgV2luVHYtVVNCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMjQwMDo0MjAwXQogIDY0IC0+IFBpbm5hY2xlIFN0dWRpbyBQQ1RWIFVTQiAoTlRTQykgRk0gVjMgICAgICAgICAgICAgICAgICAgIFsyMzA0OjAxMTNdCisgNjUgLT4gTm9nYXRlY2ggVVNCIE1pY3JvQ2FtIE5UU0MgKE5WMzAwME4pICAgICAgICAgICAgICAgICAgICAgWzA1NzM6MzAwMF0KKyA2NiAtPiBOb2dhdGVjaCBVU0IgTWljcm9DYW0gUEFMIChOVjMwMDFQKSAgICAgICAgICAgICAgICAgICAgICBbMDU3MzozMDAxXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9SRUFETUUuZGF2aW5jaS12cGJlIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9SRUFETUUuZGF2aW5jaS12cGJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNDYwYjAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L1JFQURNRS5kYXZpbmNpLXZwYmUKQEAgLTAsMCArMSw5MyBAQAorCisgICAgICAgICAgICAgICAgVlBCRSBWNEwyIGRyaXZlciBkZXNpZ24KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyBGaWxlIHBhcnRpdGlvbmluZworIC0tLS0tLS0tLS0tLS0tLS0tCisgVjRMMiBkaXNwbGF5IGRldmljZSBkcml2ZXIKKyAgICAgICAgIGRyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX2Rpc3BsYXkuYworICAgICAgICAgZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfZGlzcGxheS5oCisKKyBWUEJFIGRpc3BsYXkgY29udHJvbGxlcgorICAgICAgICAgZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmUuYworICAgICAgICAgZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmUuaAorCisgVlBCRSB2ZW5jIHN1YiBkZXZpY2UgZHJpdmVyCisgICAgICAgICBkcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV92ZW5jLmMKKyAgICAgICAgIGRyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX3ZlbmMuaAorICAgICAgICAgZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfdmVuY19yZWdzLmgKKworIFZQQkUgb3NkIGRyaXZlcgorICAgICAgICAgZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfb3NkLmMKKyAgICAgICAgIGRyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX29zZC5oCisgICAgICAgICBkcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV9vc2RfcmVncy5oCisKKyBGdW5jdGlvbmFsIHBhcnRpdGlvbmluZworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyBDb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIChpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgbGlzdCB1bmRlciBmaWxlCisgcGFydGl0aW9uaW5nKTotCisKKyAxLiBWNEwyIGRpc3BsYXkgZHJpdmVyCisgICAgSW1wbGVtZW50cyBjcmVhdGlvbiBvZiB2aWRlbzIgYW5kIHZpZGVvMyBkZXZpY2Ugbm9kZXMgYW5kCisgICAgcHJvdmlkZXMgdjRsMiBkZXZpY2UgaW50ZXJmYWNlIHRvIG1hbmFnZSBWSUQwIGFuZCBWSUQxIGxheWVycy4KKworIDIuIERpc3BsYXkgY29udHJvbGxlcgorICAgIExvYWRzIHVwIFZFTkMsIE9TRCBhbmQgZXh0ZXJuYWwgZW5jb2RlcnMgc3VjaCBhcyB0aHM4MjAwLiBJdCBwcm92aWRlcworICAgIGEgc2V0IG9mIEFQSSBjYWxscyB0byBWNEwyIGRyaXZlcnMgdG8gc2V0IHRoZSBvdXRwdXQvc3RhbmRhcmRzCisgICAgaW4gdGhlIFZFTkMgb3IgZXh0ZXJuYWwgc3ViIGRldmljZXMuIEl0IGFsc28gcHJvdmlkZXMKKyAgICBhIGRldmljZSBvYmplY3QgdG8gYWNjZXNzIHRoZSBzZXJ2aWNlcyBmcm9tIE9TRCBzdWJkZXZpY2UKKyAgICB1c2luZyBzdWIgZGV2aWNlIG9wcy4gVGhlIGNvbm5lY3Rpb24gb2YgZXh0ZXJuYWwgZW5jb2RlcnMgdG8gVkVOQyBMQ0QKKyAgICBjb250cm9sbGVyIHBvcnQgaXMgZG9uZSBhdCBpbml0IHRpbWUgYmFzZWQgb24gZGVmYXVsdCBvdXRwdXQgYW5kIHN0YW5kYXJkCisgICAgc2VsZWN0aW9uIG9yIGF0IHJ1biB0aW1lIHdoZW4gYXBwbGljYXRpb24gY2hhbmdlIHRoZSBvdXRwdXQgdGhyb3VnaAorICAgIFY0TDIgSU9DVExzLgorCisgICAgV2hlbiBjb25uZWN0ZWQgdG8gYW4gZXh0ZXJuYWwgZW5jb2RlciwgdnBiZSBjb250cm9sbGVyIGlzIGFsc28gcmVzcG9uc2libGUKKyAgICBmb3Igc2V0dGluZyB1cCB0aGUgaW50ZXJmYWNlIGJldHdlZW4gVkVOQyBhbmQgZXh0ZXJuYWwgZW5jb2RlcnMgYmFzZWQgb24KKyAgICBib2FyZCBzcGVjaWZpYyBzZXR0aW5ncyAoc3BlY2lmaWVkIGluIGJvYXJkLXh4eC1ldm0uYykuIFRoaXMgYWxsb3dzCisgICAgaW50ZXJmYWNpbmcgZXh0ZXJuYWwgZW5jb2RlcnMgc3VjaCBhcyB0aHM4MjAwLiBUaGUgc2V0dXBfaWZfY29uZmlnKCkKKyAgICBpcyBpbXBsZW1lbnRlZCBmb3IgdGhpcyBhcyB3ZWxsIGFzIGNvbmZpZ3VyZV92ZW5jKCkgKHBhcnQgb2YgdGhlIG5leHQgcGF0Y2gpCisgICAgQVBJIHRvIHNldCB0aW1pbmdzIGluIFZFTkMgZm9yIGEgc3BlY2lmaWMgZGlzcGxheSByZXNvbHV0aW9uLiBBcyBvZiB0aGlzCisgICAgcGF0Y2ggc2VyaWVzLCB0aGUgaW50ZXJjb25uZWN0aW9uIGFuZCBlbmFibGluZyBhbmQgc2V0dGluZyBvZiB0aGUgZXh0ZXJuYWwKKyAgICBlbmNvZGVycyBpcyBub3QgcHJlc2VudCwgYW5kIHdvdWxkIGJlIGEgcGFydCBvZiB0aGUgbmV4dCBwYXRjaCBzZXJpZXMuCisKKyAzLiBWRU5DIHN1YmRldmljZSBtb2R1bGUKKyAgICBSZXNwb25zaWJsZSBmb3Igc2V0dGluZyBvdXRwdXRzIHByb3ZpZGVkIHRocm91Z2ggaW50ZXJuYWwgREFDcyBhbmQgYWxzbworICAgIHNldHRpbmcgdGltaW5ncyBhdCBMQ0QgY29udHJvbGxlciBwb3J0IHdoZW4gZXh0ZXJuYWwgZW5jb2RlcnMgYXJlIGNvbm5lY3RlZAorICAgIGF0IHRoZSBwb3J0IG9yIExDRCBwYW5lbCB0aW1pbmdzIHJlcXVpcmVkLiBXaGVuIGV4dGVybmFsIGVuY29kZXIvTENEIHBhbmVsCisgICAgaXMgY29ubmVjdGVkLCB0aGUgdGltaW5ncyBmb3IgYSBzcGVjaWZpYyBzdGFuZGFyZC9wcmVzZXQgaXMgcmV0cmlldmVkIGZyb20KKyAgICB0aGUgYm9hcmQgc3BlY2lmaWMgdGFibGUgYW5kIHRoZSB2YWx1ZXMgYXJlIHVzZWQgdG8gc2V0IHRoZSB0aW1pbmdzIGluCisgICAgdmVuYyB1c2luZyBub24tc3RhbmRhcmQgdGltaW5nIG1vZGUuCisKKyAgICBTdXBwb3J0IExDRCBQYW5lbCBkaXNwbGF5cyB1c2luZyB0aGUgVkVOQy4gRm9yIGV4YW1wbGUgdG8gc3VwcG9ydCBhIExvZ2ljCisgICAgUEQgZGlzcGxheSwgaXQgcmVxdWlyZXMgc2V0dGluZyB1cCB0aGUgTENEIGNvbnRyb2xsZXIgcG9ydCB3aXRoIGEgc2V0IG9mCisgICAgdGltaW5ncyBmb3IgdGhlIHJlc29sdXRpb24gc3VwcG9ydGVkIGFuZCBzZXR0aW5nIHRoZSBkb3QgY2xvY2suIFNvIHdlIGNvdWxkCisgICAgYWRkIHRoZSBhdmFpbGFibGUgb3V0cHV0cyBhcyBhIGJvYXJkIHNwZWNpZmljIGVudHJ5IChpLmUgYWRkIHRoZSAiTG9naWNQRCIKKyAgICBvdXRwdXQgbmFtZSB0byBib2FyZC14eHgtZXZtLmMpLiBBIHRhYmxlIG9mIHRpbWluZ3MgZm9yIHZhcmlvdXMgTENEcworICAgIHN1cHBvcnRlZCBjYW4gYmUgbWFpbnRhaW5lZCBpbiB0aGUgYm9hcmQgc3BlY2lmaWMgc2V0dXAgZmlsZSB0byBzdXBwb3J0CisgICAgdmFyaW91cyBMQ0QgZGlzcGxheXMuQXMgb2YgdGhpcyBwYXRjaCBhIGJhc2ljIGRyaXZlciBpcyBwcmVzZW50LCBhbmQgdGhpcworICAgIHN1cHBvcnQgZm9yIGV4dGVybmFsIGVuY29kZXJzIGFuZCBkaXNwbGF5cyBmb3JtcyBhIHBhcnQgb2YgdGhlIG5leHQKKyAgICBwYXRjaCBzZXJpZXMuCisKKyA0LiBPU0QgbW9kdWxlCisgICAgT1NEIG1vZHVsZSBpbXBsZW1lbnRzIGFsbCBPU0QgbGF5ZXIgbWFuYWdlbWVudCBhbmQgaGFyZHdhcmUgc3BlY2lmaWMKKyAgICBmZWF0dXJlcy4gVGhlIFZQQkUgbW9kdWxlIGludGVyYWN0cyB3aXRoIHRoZSBPU0QgZm9yIGVuYWJsaW5nIGFuZAorICAgIGRpc2FibGluZyBhcHByb3ByaWF0ZSBmZWF0dXJlcyBvZiB0aGUgT1NELgorCisgQ3VycmVudCBzdGF0dXM6LQorCisgQSBmdWxseSBmdW5jdGlvbmFsIHdvcmtpbmcgdmVyc2lvbiBvZiB0aGUgVjRMMiBkcml2ZXIgaXMgYXZhaWxhYmxlLiBUaGlzCisgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCB3aXRoIE5UU0MgYW5kIFBBTCBzdGFuZGFyZHMgYW5kIGJ1ZmZlciBzdHJlYW1pbmcuCisKKyBGb2xsb3dpbmcgYXJlIFRCRHMuCisKKyB2cGJlIGRpc3BsYXkgY29udHJvbGxlcgorICAgIC0gQWRkIHN1cHBvcnQgZm9yIGV4dGVybmFsIGVuY29kZXJzLgorICAgIC0gYWRkIHN1cHBvcnQgZm9yIHNlbGVjdGluZyBleHRlcm5hbCBlbmNvZGVyIGFzIGRlZmF1bHQgYXQgcHJvYmUgdGltZS4KKworIHZwYmUgdmVuYyBzdWIgZGV2aWNlCisgICAgLSBhZGQgdGltaW5ncyBmb3Igc3VwcG9ydGluZyB0aHM4MjAwCisgICAgLSBhZGQgc3VwcG9ydCBmb3IgTG9naWNQRCBMQ0QuCisKKyBGQiBkcml2ZXJzCisgICAgLSBBZGQgc3VwcG9ydCBmb3IgZmJkZXYgZHJpdmVycy4tIFJlYWR5IGFuZCBwYXJ0IG9mIHN1YnNlcXVlbnQgcGF0Y2hlcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvdjRsMi1jb250cm9scy50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3Y0bDItY29udHJvbHMudHh0CmluZGV4IDg4MWU3ZjQuLjkzNDZmYzggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvdjRsMi1jb250cm9scy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC92NGwyLWNvbnRyb2xzLnR4dApAQCAtMjc3LDE2ICsyNzcsMTMgQEAKIAl7CiAJCXN3aXRjaCAoY3RybC0+aWQpIHsKIAkJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgotCQkJY3RybC0+Y3VyLnZhbCA9IHJlYWRfcmVnKDB4MTIzKTsKKwkJCWN0cmwtPnZhbCA9IHJlYWRfcmVnKDB4MTIzKTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi1UaGUgJ25ldyB2YWx1ZScgdW5pb24gaXMgbm90IHVzZWQgaW4gZ192b2xhdGlsZV9jdHJsLiBJbiBnZW5lcmFsIGNvbnRyb2xzCi10aGF0IG5lZWQgdG8gaW1wbGVtZW50IGdfdm9sYXRpbGVfY3RybCBhcmUgcmVhZC1vbmx5IGNvbnRyb2xzLgotCi1Ob3RlIHRoYXQgaWYgb25lIG9yIG1vcmUgY29udHJvbHMgaW4gYSBjb250cm9sIGNsdXN0ZXIgYXJlIG1hcmtlZCBhcyB2b2xhdGlsZSwKLXRoZW4gYWxsIHRoZSBjb250cm9scyBpbiB0aGUgY2x1c3RlciBhcmUgc2VlbiBhcyB2b2xhdGlsZS4KK05vdGUgdGhhdCB5b3UgdXNlIHRoZSAnbmV3IHZhbHVlJyB1bmlvbiBhcyB3ZWxsIGluIGdfdm9sYXRpbGVfY3RybC4gSW4gZ2VuZXJhbAorY29udHJvbHMgdGhhdCBuZWVkIHRvIGltcGxlbWVudCBnX3ZvbGF0aWxlX2N0cmwgYXJlIHJlYWQtb25seSBjb250cm9scy4KIAogVG8gbWFyayBhIGNvbnRyb2wgYXMgdm9sYXRpbGUgeW91IGhhdmUgdG8gc2V0IHRoZSBpc192b2xhdGlsZSBmbGFnOgogCkBAIC00NTMsNiArNDUwLDI1IEBACiAJY3RybCA9PSBjdHJsLT5jbHVzdGVyW0FVRElPX0NMX1ZPTFVNRV0gPT0gc3RhdGUtPmF1ZGlvX2NsdXN0ZXJbQVVESU9fQ0xfVk9MVU1FXQogCWN0cmwtPmNsdXN0ZXJbQVVESU9fQ0xfTVVURV0gPT0gc3RhdGUtPmF1ZGlvX2NsdXN0ZXJbQVVESU9fQ0xfTVVURV0KIAorSW4gcHJhY3RpY2UgdXNpbmcgY2x1c3RlciBhcnJheXMgbGlrZSB0aGlzIGJlY29tZXMgdmVyeSB0aXJlc29tZS4gU28gaW5zdGVhZAordGhlIGZvbGxvd2luZyBlcXVpdmFsZW50IG1ldGhvZCBpcyB1c2VkOgorCisJc3RydWN0IHsKKwkJLyogYXVkaW8gY2x1c3RlciAqLworCQlzdHJ1Y3QgdjRsMl9jdHJsICp2b2x1bWU7CisJCXN0cnVjdCB2NGwyX2N0cmwgKm11dGU7CisJfTsKKworVGhlIGFub255bW91cyBzdHJ1Y3QgaXMgdXNlZCB0byBjbGVhcmx5ICdjbHVzdGVyJyB0aGVzZSB0d28gY29udHJvbCBwb2ludGVycywKK2J1dCBpdCBzZXJ2ZXMgbm8gb3RoZXIgcHVycG9zZS4gVGhlIGVmZmVjdCBpcyB0aGUgc2FtZSBhcyBjcmVhdGluZyBhbgorYXJyYXkgd2l0aCB0d28gY29udHJvbCBwb2ludGVycy4gU28geW91IGNhbiBqdXN0IGRvOgorCisJc3RhdGUtPnZvbHVtZSA9IHY0bDJfY3RybF9uZXdfc3RkKCZzdGF0ZS0+Y3RybF9oYW5kbGVyLCAuLi4pOworCXN0YXRlLT5tdXRlID0gdjRsMl9jdHJsX25ld19zdGQoJnN0YXRlLT5jdHJsX2hhbmRsZXIsIC4uLik7CisJdjRsMl9jdHJsX2NsdXN0ZXIoMiwgJnN0YXRlLT52b2x1bWUpOworCitBbmQgaW4gZm9vX3NfY3RybCB5b3UgY2FuIHVzZSB0aGVzZSBwb2ludGVycyBkaXJlY3RseTogc3RhdGUtPm11dGUtPnZhbC4KKwogTm90ZSB0aGF0IGNvbnRyb2xzIGluIGEgY2x1c3RlciBtYXkgYmUgTlVMTC4gRm9yIGV4YW1wbGUsIGlmIGZvciBzb21lCiByZWFzb24gbXV0ZSB3YXMgbmV2ZXIgYWRkZWQgKGJlY2F1c2UgdGhlIGhhcmR3YXJlIGRvZXNuJ3Qgc3VwcG9ydCB0aGF0CiBwYXJ0aWN1bGFyIGZlYXR1cmUpLCB0aGVuIG11dGUgd2lsbCBiZSBOVUxMLiBTbyBpbiB0aGF0IGNhc2Ugd2UgaGF2ZSBhCkBAIC00NzUsNiArNDkxLDQzIEBACiBUaGUgJ2lzX25ldycgZmxhZyBpcyBhbHdheXMgMSB3aGVuIGNhbGxlZCBmcm9tIHY0bDJfY3RybF9oYW5kbGVyX3NldHVwKCkuCiAKIAorSGFuZGxpbmcgYXV0b2dhaW4vZ2Fpbi10eXBlIENvbnRyb2xzIHdpdGggQXV0byBDbHVzdGVycworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitBIGNvbW1vbiB0eXBlIG9mIGNvbnRyb2wgY2x1c3RlciBpcyBvbmUgdGhhdCBoYW5kbGVzICdhdXRvLWZvby9mb28nLXR5cGUKK2NvbnRyb2xzLiBUeXBpY2FsIGV4YW1wbGVzIGFyZSBhdXRvZ2Fpbi9nYWluLCBhdXRvZXhwb3N1cmUvZXhwb3N1cmUsCithdXRvd2hpdGViYWxhbmNlL3JlZCBiYWxhbmNlL2JsdWUgYmFsYW5jZS4gSW4gYWxsIGNhc2VzIHlvdSBoYXZlIG9uZSBjb250cm9scwordGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgYW5vdGhlciBjb250cm9sIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseSBieSB0aGUgaGFyZHdhcmUsCitvciB3aGV0aGVyIGl0IGlzIHVuZGVyIG1hbnVhbCBjb250cm9sIGZyb20gdGhlIHVzZXIuCisKK0lmIHRoZSBjbHVzdGVyIGlzIGluIGF1dG9tYXRpYyBtb2RlLCB0aGVuIHRoZSBtYW51YWwgY29udHJvbHMgc2hvdWxkIGJlCittYXJrZWQgaW5hY3RpdmUuIFdoZW4gdGhlIHZvbGF0aWxlIGNvbnRyb2xzIGFyZSByZWFkIHRoZSBnX3ZvbGF0aWxlX2N0cmwKK29wZXJhdGlvbiBzaG91bGQgcmV0dXJuIHRoZSB2YWx1ZSB0aGF0IHRoZSBoYXJkd2FyZSdzIGF1dG9tYXRpYyBtb2RlIHNldCB1cAorYXV0b21hdGljYWxseS4KKworSWYgdGhlIGNsdXN0ZXIgaXMgcHV0IGluIG1hbnVhbCBtb2RlLCB0aGVuIHRoZSBtYW51YWwgY29udHJvbHMgc2hvdWxkIGJlY29tZQorYWN0aXZlIGFnYWluIGFuZCB0aGUgaXNfdm9sYXRpbGUgZmxhZyBzaG91bGQgYmUgaWdub3JlZCAoc28gZ192b2xhdGlsZV9jdHJsIGlzCitubyBsb25nZXIgY2FsbGVkIHdoaWxlIGluIG1hbnVhbCBtb2RlKS4KKworRmluYWxseSB0aGUgVjRMMl9DVFJMX0ZMQUdfVVBEQVRFIHNob3VsZCBiZSBzZXQgZm9yIHRoZSBhdXRvIGNvbnRyb2wgc2luY2UKK2NoYW5naW5nIHRoYXQgY29udHJvbCBhZmZlY3RzIHRoZSBjb250cm9sIGZsYWdzIG9mIHRoZSBtYW51YWwgY29udHJvbHMuCisKK0luIG9yZGVyIHRvIHNpbXBsaWZ5IHRoaXMgYSBzcGVjaWFsIHZhcmlhdGlvbiBvZiB2NGwyX2N0cmxfY2x1c3RlciB3YXMKK2ludHJvZHVjZWQ6CisKK3ZvaWQgdjRsMl9jdHJsX2F1dG9fY2x1c3Rlcih1bnNpZ25lZCBuY29udHJvbHMsIHN0cnVjdCB2NGwyX2N0cmwgKipjb250cm9scywKKwkJCXU4IG1hbnVhbF92YWwsIGJvb2wgc2V0X3ZvbGF0aWxlKTsKKworVGhlIGZpcnN0IHR3byBhcmd1bWVudHMgYXJlIGlkZW50aWNhbCB0byB2NGwyX2N0cmxfY2x1c3Rlci4gVGhlIHRoaXJkIGFyZ3VtZW50Cit0ZWxscyB0aGUgZnJhbWV3b3JrIHdoaWNoIHZhbHVlIHN3aXRjaGVzIHRoZSBjbHVzdGVyIGludG8gbWFudWFsIG1vZGUuIFRoZQorbGFzdCBhcmd1bWVudCB3aWxsIG9wdGlvbmFsbHkgc2V0IHRoZSBpc192b2xhdGlsZSBmbGFnIGZvciB0aGUgbm9uLWF1dG8gY29udHJvbHMuCisKK1RoZSBmaXJzdCBjb250cm9sIG9mIHRoZSBjbHVzdGVyIGlzIGFzc3VtZWQgdG8gYmUgdGhlICdhdXRvJyBjb250cm9sLgorCitVc2luZyB0aGlzIGZ1bmN0aW9uIHdpbGwgZW5zdXJlIHRoYXQgeW91IGRvbid0IG5lZWQgdG8gaGFuZGxlIGFsbCB0aGUgY29tcGxleAorZmxhZyBhbmQgdm9sYXRpbGUgaGFuZGxpbmcuCisKKwogVklESU9DX0xPR19TVEFUVVMgU3VwcG9ydAogPT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC02MzYsOSArNjg5LDcgQEAKIC1FSU5WQUwgYXMgdGhlIHNwZWMgc2F5cy4KIAogNSkgVGhlIHNwZWMgZG9lcyBub3QgbWVudGlvbiB3aGF0IHNob3VsZCBoYXBwZW4gd2hlbiB5b3UgdHJ5IHRvIHNldC9nZXQgYQotY29udHJvbCBjbGFzcyBjb250cm9scy4gaXZ0diBjdXJyZW50bHkgcmV0dXJucyAtRUlOVkFMIChpbmRpY2F0aW5nIHRoYXQgdGhlCi1jb250cm9sIElEIGRvZXMgbm90IGV4aXN0KSB3aGlsZSB0aGUgZnJhbWV3b3JrIHdpbGwgcmV0dXJuIC1FQUNDRVMsIHdoaWNoCi1tYWtlcyBtb3JlIHNlbnNlLgorY29udHJvbCBjbGFzcyBjb250cm9scy4gVGhlIGZyYW1ld29yayB3aWxsIHJldHVybiAtRUFDQ0VTLgogCiAKIFByb3Bvc2FscyBmb3IgRXh0ZW5zaW9ucwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC92NGwyLWZyYW1ld29yay50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3Y0bDItZnJhbWV3b3JrLnR4dAppbmRleCBjZjIxZjdhLi5mOGRjYWJmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3Y0bDItZnJhbWV3b3JrLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3Y0bDItZnJhbWV3b3JrLnR4dApAQCAtODE3LDExICs4MTcsNyBAQAogCiAJLi4uCiAKLQlyZXQgPSB2NGwyX2ZoX2luaXQoJm15X2ZoLT5maCwgdmZkKTsKLQlpZiAocmV0KSB7Ci0JCWtmcmVlKG15X2ZoKTsKLQkJcmV0dXJuIHJldDsKLQl9CisJdjRsMl9maF9pbml0KCZteV9maC0+ZmgsIHZmZCk7CiAKIAkuLi4KIApAQCAtODQ0LDcgKzg0MCw3IEBACiAKIEJlbG93IGlzIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIHY0bDJfZmggZnVuY3Rpb25zIHVzZWQ6CiAKLWludCB2NGwyX2ZoX2luaXQoc3RydWN0IHY0bDJfZmggKmZoLCBzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KQordm9pZCB2NGwyX2ZoX2luaXQoc3RydWN0IHY0bDJfZmggKmZoLCBzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KQogCiAgIEluaXRpYWxpc2UgdGhlIGZpbGUgaGFuZGxlLiBUaGlzICpNVVNUKiBiZSBwZXJmb3JtZWQgaW4gdGhlIGRyaXZlcidzCiAgIHY0bDJfZmlsZV9vcGVyYXRpb25zLT5vcGVuKCkgaGFuZGxlci4KQEAgLTkwMSwxNSArODk3LDM5IEBACiBUaGUgVjRMMiBldmVudHMgcHJvdmlkZSBhIGdlbmVyaWMgd2F5IHRvIHBhc3MgZXZlbnRzIHRvIHVzZXIgc3BhY2UuCiBUaGUgZHJpdmVyIG11c3QgdXNlIHY0bDJfZmggdG8gYmUgYWJsZSB0byBzdXBwb3J0IFY0TDIgZXZlbnRzLgogCitFdmVudHMgYXJlIGRlZmluZWQgYnkgYSB0eXBlIGFuZCBhbiBvcHRpb25hbCBJRC4gVGhlIElEIG1heSByZWZlciB0byBhIFY0TDIKK29iamVjdCBzdWNoIGFzIGEgY29udHJvbCBJRC4gSWYgdW51c2VkLCB0aGVuIHRoZSBJRCBpcyAwLgorCitXaGVuIHRoZSB1c2VyIHN1YnNjcmliZXMgdG8gYW4gZXZlbnQgdGhlIGRyaXZlciB3aWxsIGFsbG9jYXRlIGEgbnVtYmVyIG9mCitrZXZlbnQgc3RydWN0cyBmb3IgdGhhdCBldmVudC4gU28gZXZlcnkgKHR5cGUsIElEKSBldmVudCB0dXBsZSB3aWxsIGhhdmUKK2l0cyBvd24gc2V0IG9mIGtldmVudCBzdHJ1Y3RzLiBUaGlzIGd1YXJhbnRlZXMgdGhhdCBpZiBhIGRyaXZlciBpcyBnZW5lcmF0aW5nCitsb3RzIG9mIGV2ZW50cyBvZiBvbmUgdHlwZSBpbiBhIHNob3J0IHRpbWUsIHRoZW4gdGhhdCB3aWxsIG5vdCBvdmVyd3JpdGUKK2V2ZW50cyBvZiBhbm90aGVyIHR5cGUuCisKK0J1dCBpZiB5b3UgZ2V0IG1vcmUgZXZlbnRzIG9mIG9uZSB0eXBlIHRoYW4gdGhlIG51bWJlciBvZiBrZXZlbnRzIHRoYXQgd2VyZQorcmVzZXJ2ZWQsIHRoZW4gdGhlIG9sZGVzdCBldmVudCB3aWxsIGJlIGRyb3BwZWQgYW5kIHRoZSBuZXcgb25lIGFkZGVkLgorCitGdXJ0aGVybW9yZSwgdGhlIGludGVybmFsIHN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQgaGFzIG1lcmdlKCkgYW5kCityZXBsYWNlKCkgY2FsbGJhY2tzIHdoaWNoIGRyaXZlcnMgY2FuIHNldC4gVGhlc2UgY2FsbGJhY2tzIGFyZSBjYWxsZWQgd2hlbgorYSBuZXcgZXZlbnQgaXMgcmFpc2VkIGFuZCB0aGVyZSBpcyBubyBtb3JlIHJvb20uIFRoZSByZXBsYWNlKCkgY2FsbGJhY2sKK2FsbG93cyB5b3UgdG8gcmVwbGFjZSB0aGUgcGF5bG9hZCBvZiB0aGUgb2xkIGV2ZW50IHdpdGggdGhhdCBvZiB0aGUgbmV3IGV2ZW50LAorbWVyZ2luZyBhbnkgcmVsZXZhbnQgZGF0YSBmcm9tIHRoZSBvbGQgcGF5bG9hZCBpbnRvIHRoZSBuZXcgcGF5bG9hZCB0aGF0CityZXBsYWNlcyBpdC4gSXQgaXMgY2FsbGVkIHdoZW4gdGhpcyBldmVudCB0eXBlIGhhcyBvbmx5IG9uZSBrZXZlbnQgc3RydWN0CithbGxvY2F0ZWQuIFRoZSBtZXJnZSgpIGNhbGxiYWNrIGFsbG93cyB5b3UgdG8gbWVyZ2UgdGhlIG9sZGVzdCBldmVudCBwYXlsb2FkCitpbnRvIHRoYXQgb2YgdGhlIHNlY29uZC1vbGRlc3QgZXZlbnQgcGF5bG9hZC4gSXQgaXMgY2FsbGVkIHdoZW4gdGhlcmUgYXJlIHR3bworb3IgbW9yZSBrZXZlbnQgc3RydWN0cyBhbGxvY2F0ZWQuCisKK1RoaXMgd2F5IG5vIHN0YXR1cyBpbmZvcm1hdGlvbiBpcyBsb3N0LCBqdXN0IHRoZSBpbnRlcm1lZGlhdGUgc3RlcHMgbGVhZGluZwordXAgdG8gdGhhdCBzdGF0ZS4KKworQSBnb29kIGV4YW1wbGUgb2YgdGhlc2UgcmVwbGFjZS9tZXJnZSBjYWxsYmFja3MgaXMgaW4gdjRsMi1ldmVudC5jOgorY3RybHNfcmVwbGFjZSgpIGFuZCBjdHJsc19tZXJnZSgpIGNhbGxiYWNrcyBmb3IgdGhlIGNvbnRyb2wgZXZlbnQuCisKK05vdGU6IHRoZXNlIGNhbGxiYWNrcyBjYW4gYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQsIHNvIHRoZXkgbXVzdCBiZQorZmFzdC4KKwogVXNlZnVsIGZ1bmN0aW9uczoKIAotLSB2NGwyX2V2ZW50X2FsbG9jKCkKLQotICBUbyB1c2UgZXZlbnRzLCB0aGUgZHJpdmVyIG11c3QgYWxsb2NhdGUgZXZlbnRzIGZvciB0aGUgZmlsZSBoYW5kbGUuIEJ5Ci0gIGNhbGxpbmcgdGhlIGZ1bmN0aW9uIG1vcmUgdGhhbiBvbmNlLCB0aGUgZHJpdmVyIG1heSBhc3N1cmUgdGhhdCBhdCBsZWFzdCBuCi0gIGV2ZW50cyBpbiB0b3RhbCBoYXZlIGJlZW4gYWxsb2NhdGVkLiBUaGUgZnVuY3Rpb24gbWF5IG5vdCBiZSBjYWxsZWQgaW4KLSAgYXRvbWljIGNvbnRleHQuCi0KIC0gdjRsMl9ldmVudF9xdWV1ZSgpCiAKICAgUXVldWUgZXZlbnRzIHRvIHZpZGVvIGRldmljZS4gVGhlIGRyaXZlcidzIG9ubHkgcmVzcG9uc2liaWxpdHkgaXMgdG8gZmlsbApAQCAtOTIwLDcgKzk0MCw5IEBACiAKICAgVGhlIHZpZGVvX2RldmljZS0+aW9jdGxfb3BzLT52aWRpb2Nfc3Vic2NyaWJlX2V2ZW50IG11c3QgY2hlY2sgdGhlIGRyaXZlcgogICBpcyBhYmxlIHRvIHByb2R1Y2UgZXZlbnRzIHdpdGggc3BlY2lmaWVkIGV2ZW50IGlkLiBUaGVuIGl0IGNhbGxzCi0gIHY0bDJfZXZlbnRfc3Vic2NyaWJlKCkgdG8gc3Vic2NyaWJlIHRoZSBldmVudC4KKyAgdjRsMl9ldmVudF9zdWJzY3JpYmUoKSB0byBzdWJzY3JpYmUgdGhlIGV2ZW50LiBUaGUgbGFzdCBhcmd1bWVudCBpcyB0aGUKKyAgc2l6ZSBvZiB0aGUgZXZlbnQgcXVldWUgZm9yIHRoaXMgZXZlbnQuIElmIGl0IGlzIDAsIHRoZW4gdGhlIGZyYW1ld29yaworICB3aWxsIGZpbGwgaW4gYSBkZWZhdWx0IHZhbHVlICh0aGlzIGRlcGVuZHMgb24gdGhlIGV2ZW50IHR5cGUpLgogCiAtIHY0bDJfZXZlbnRfdW5zdWJzY3JpYmUoKQogCkBAIC05MzUsMTQgKzk1Nyw4IEBACiAKICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgZXZlbnRzLiBVc2VmdWwgd2hlbiBpbXBsZW1lbnRpbmcgcG9sbC4KIAotRHJpdmVycyBkbyBub3QgaW5pdGlhbGlzZSBldmVudHMgZGlyZWN0bHkuIFRoZSBldmVudHMgYXJlIGluaXRpYWxpc2VkCi10aHJvdWdoIHY0bDJfZmhfaW5pdCgpIGlmIHZpZGVvX2RldmljZS0+aW9jdGxfb3BzLT52aWRpb2Nfc3Vic2NyaWJlX2V2ZW50IGlzCi1ub24tTlVMTC4gVGhpcyAqTVVTVCogYmUgcGVyZm9ybWVkIGluIHRoZSBkcml2ZXIncwotdjRsMl9maWxlX29wZXJhdGlvbnMtPm9wZW4oKSBoYW5kbGVyLgotCiBFdmVudHMgYXJlIGRlbGl2ZXJlZCB0byB1c2VyIHNwYWNlIHRocm91Z2ggdGhlIHBvbGwgc3lzdGVtIGNhbGwuIFRoZSBkcml2ZXIKLWNhbiB1c2UgdjRsMl9maC0+ZXZlbnRzLT53YWl0IHdhaXRfcXVldWVfaGVhZF90IGFzIHRoZSBhcmd1bWVudCBmb3IKLXBvbGxfd2FpdCgpLgorY2FuIHVzZSB2NGwyX2ZoLT53YWl0IChhIHdhaXRfcXVldWVfaGVhZF90KSBhcyB0aGUgYXJndW1lbnQgZm9yIHBvbGxfd2FpdCgpLgogCiBUaGVyZSBhcmUgc3RhbmRhcmQgYW5kIHByaXZhdGUgZXZlbnRzLiBOZXcgc3RhbmRhcmQgZXZlbnRzIG11c3QgdXNlIHRoZQogc21hbGxlc3QgYXZhaWxhYmxlIGV2ZW50IHR5cGUuIFRoZSBkcml2ZXJzIG11c3QgYWxsb2NhdGUgdGhlaXIgZXZlbnRzIGZyb20KQEAgLTk1Miw1ICs5NjgsNCBAQAogYXZhaWxhYmxlIGV2ZW50IHR5cGUgaXMgJ2NsYXNzIGJhc2UgKyAxJy4KIAogQW4gZXhhbXBsZSBvbiBob3cgdGhlIFY0TDIgZXZlbnRzIG1heSBiZSB1c2VkIGNhbiBiZSBmb3VuZCBpbiB0aGUgT01BUAotMyBJU1AgZHJpdmVyIGF2YWlsYWJsZSBhdCA8VVJMOmh0dHA6Ly9naXRvcmlvdXMub3JnL29tYXAzY2FtZXJhPiBhcyBvZgotd3JpdGluZyB0aGlzLgorMyBJU1AgZHJpdmVyIChkcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwKS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vd2F0Y2hkb2cvMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nLzAwLUlOREVYCmluZGV4IGVlOTk0NTEuLmZjNTExMjggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vd2F0Y2hkb2cvMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy8wMC1JTkRFWApAQCAtOCw2ICs4LDggQEAKIAktIGRpcmVjdG9yeSBob2xkaW5nIHdhdGNoZG9nIHJlbGF0ZWQgZXhhbXBsZSBwcm9ncmFtcy4KIHdhdGNoZG9nLWFwaS50eHQKIAktIGRlc2NyaXB0aW9uIG9mIHRoZSBMaW51eCBXYXRjaGRvZyBkcml2ZXIgQVBJLgord2F0Y2hkb2cta2VybmVsLWFwaS50eHQKKwktIGRlc2NyaXB0aW9uIG9mIHRoZSBMaW51eCBXYXRjaERvZyBUaW1lciBEcml2ZXIgQ29yZSBrZXJuZWwgQVBJLgogd2F0Y2hkb2ctcGFyYW1ldGVycy50eHQKIAktIGluZm9ybWF0aW9uIG9uIGRyaXZlciBwYXJhbWV0ZXJzIChmb3IgZHJpdmVycyBvdGhlciB0aGFuCiAJICB0aGUgb25lcyB0aGF0IGhhdmUgZHJpdmVyLXNwZWNpZmljIGZpbGVzIGhlcmUpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL3dhdGNoZG9nLWtlcm5lbC1hcGkudHh0IGIvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy93YXRjaGRvZy1rZXJuZWwtYXBpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjdjODk0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy93YXRjaGRvZy1rZXJuZWwtYXBpLnR4dApAQCAtMCwwICsxLDE2MiBAQAorVGhlIExpbnV4IFdhdGNoRG9nIFRpbWVyIERyaXZlciBDb3JlIGtlcm5lbCBBUEkuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTGFzdCByZXZpZXdlZDogMjItSnVsLTIwMTEKKworV2ltIFZhbiBTZWJyb2VjayA8d2ltQGlndWFuYS5iZT4KKworSW50cm9kdWN0aW9uCistLS0tLS0tLS0tLS0KK1RoaXMgZG9jdW1lbnQgZG9lcyBub3QgZGVzY3JpYmUgd2hhdCBhIFdhdGNoRG9nIFRpbWVyIChXRFQpIERyaXZlciBvciBEZXZpY2UgaXMuCitJdCBhbHNvIGRvZXMgbm90IGRlc2NyaWJlIHRoZSBBUEkgd2hpY2ggY2FuIGJlIHVzZWQgYnkgdXNlciBzcGFjZSB0byBjb21tdW5pY2F0ZQord2l0aCBhIFdhdGNoRG9nIFRpbWVyLiBJZiB5b3Ugd2FudCB0byBrbm93IHRoaXMgdGhlbiBwbGVhc2UgcmVhZCB0aGUgZm9sbG93aW5nCitmaWxlOiBEb2N1bWVudGF0aW9uL3dhdGNoZG9nL3dhdGNoZG9nLWFwaS50eHQgLgorCitTbyB3aGF0IGRvZXMgdGhpcyBkb2N1bWVudCBkZXNjcmliZT8gSXQgZGVzY3JpYmVzIHRoZSBBUEkgdGhhdCBjYW4gYmUgdXNlZCBieQorV2F0Y2hEb2cgVGltZXIgRHJpdmVycyB0aGF0IHdhbnQgdG8gdXNlIHRoZSBXYXRjaERvZyBUaW1lciBEcml2ZXIgQ29yZQorRnJhbWV3b3JrLiBUaGlzIGZyYW1ld29yayBwcm92aWRlcyBhbGwgaW50ZXJmYWNpbmcgdG93YXJkcyB1c2VyIHNwYWNlIHNvIHRoYXQKK3RoZSBzYW1lIGNvZGUgZG9lcyBub3QgaGF2ZSB0byBiZSByZXByb2R1Y2VkIGVhY2ggdGltZS4gVGhpcyBhbHNvIG1lYW5zIHRoYXQKK2Egd2F0Y2hkb2cgdGltZXIgZHJpdmVyIHRoZW4gb25seSBuZWVkcyB0byBwcm92aWRlIHRoZSBkaWZmZXJlbnQgcm91dGluZXMKKyhvcGVyYXRpb25zKSB0aGF0IGNvbnRyb2wgdGhlIHdhdGNoZG9nIHRpbWVyIChXRFQpLgorCitUaGUgQVBJCistLS0tLS0tCitFYWNoIHdhdGNoZG9nIHRpbWVyIGRyaXZlciB0aGF0IHdhbnRzIHRvIHVzZSB0aGUgV2F0Y2hEb2cgVGltZXIgRHJpdmVyIENvcmUKK211c3QgI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+ICh5b3Ugd291bGQgaGF2ZSB0byBkbyB0aGlzIGFueXdheSB3aGVuCit3cml0aW5nIGEgd2F0Y2hkb2cgZGV2aWNlIGRyaXZlcikuIFRoaXMgaW5jbHVkZSBmaWxlIGNvbnRhaW5zIGZvbGxvd2luZworcmVnaXN0ZXIvdW5yZWdpc3RlciByb3V0aW5lczoKKworZXh0ZXJuIGludCB3YXRjaGRvZ19yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIHdhdGNoZG9nX3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKik7CisKK1RoZSB3YXRjaGRvZ19yZWdpc3Rlcl9kZXZpY2Ugcm91dGluZSByZWdpc3RlcnMgYSB3YXRjaGRvZyB0aW1lciBkZXZpY2UuCitUaGUgcGFyYW1ldGVyIG9mIHRoaXMgcm91dGluZSBpcyBhIHBvaW50ZXIgdG8gYSB3YXRjaGRvZ19kZXZpY2Ugc3RydWN0dXJlLgorVGhpcyByb3V0aW5lIHJldHVybnMgemVybyBvbiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm5vIGNvZGUgZm9yIGZhaWx1cmUuCisKK1RoZSB3YXRjaGRvZ191bnJlZ2lzdGVyX2RldmljZSByb3V0aW5lIGRlcmVnaXN0ZXJzIGEgcmVnaXN0ZXJlZCB3YXRjaGRvZyB0aW1lcgorZGV2aWNlLiBUaGUgcGFyYW1ldGVyIG9mIHRoaXMgcm91dGluZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgcmVnaXN0ZXJlZAord2F0Y2hkb2dfZGV2aWNlIHN0cnVjdHVyZS4KKworVGhlIHdhdGNoZG9nIGRldmljZSBzdHJ1Y3R1cmUgbG9va3MgbGlrZSB0aGlzOgorCitzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlIHsKKwljb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyAqaW5mbzsKKwljb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfb3BzICpvcHM7CisJdW5zaWduZWQgaW50IGJvb3RzdGF0dXM7CisJdW5zaWduZWQgaW50IHRpbWVvdXQ7CisJdW5zaWduZWQgaW50IG1pbl90aW1lb3V0OworCXVuc2lnbmVkIGludCBtYXhfdGltZW91dDsKKwl2b2lkICpkcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKK307CisKK0l0IGNvbnRhaW5zIGZvbGxvd2luZyBmaWVsZHM6CisqIGluZm86IGEgcG9pbnRlciB0byBhIHdhdGNoZG9nX2luZm8gc3RydWN0dXJlLiBUaGlzIHN0cnVjdHVyZSBnaXZlcyBzb21lCisgIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHdhdGNoZG9nIHRpbWVyIGl0c2VsZi4gKExpa2UgaXQncyB1bmlxdWUgbmFtZSkKKyogb3BzOiBhIHBvaW50ZXIgdG8gdGhlIGxpc3Qgb2Ygd2F0Y2hkb2cgb3BlcmF0aW9ucyB0aGF0IHRoZSB3YXRjaGRvZyBzdXBwb3J0cy4KKyogdGltZW91dDogdGhlIHdhdGNoZG9nIHRpbWVyJ3MgdGltZW91dCB2YWx1ZSAoaW4gc2Vjb25kcykuCisqIG1pbl90aW1lb3V0OiB0aGUgd2F0Y2hkb2cgdGltZXIncyBtaW5pbXVtIHRpbWVvdXQgdmFsdWUgKGluIHNlY29uZHMpLgorKiBtYXhfdGltZW91dDogdGhlIHdhdGNoZG9nIHRpbWVyJ3MgbWF4aW11bSB0aW1lb3V0IHZhbHVlIChpbiBzZWNvbmRzKS4KKyogYm9vdHN0YXR1czogc3RhdHVzIG9mIHRoZSBkZXZpY2UgYWZ0ZXIgYm9vdGluZyAocmVwb3J0ZWQgd2l0aCB3YXRjaGRvZworICBXRElPRl8qIHN0YXR1cyBiaXRzKS4KKyogZHJpdmVyX2RhdGE6IGEgcG9pbnRlciB0byB0aGUgZHJpdmVycyBwcml2YXRlIGRhdGEgb2YgYSB3YXRjaGRvZyBkZXZpY2UuCisgIFRoaXMgZGF0YSBzaG91bGQgb25seSBiZSBhY2Nlc3NlZCB2aWEgdGhlIHdhdGNoZG9nX3NldF9kcnZhZGF0YSBhbmQKKyAgd2F0Y2hkb2dfZ2V0X2RydmRhdGEgcm91dGluZXMuCisqIHN0YXR1czogdGhpcyBmaWVsZCBjb250YWlucyBhIG51bWJlciBvZiBzdGF0dXMgYml0cyB0aGF0IGdpdmUgZXh0cmEKKyAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGUgZGV2aWNlIChMaWtlOiBpcyB0aGUgd2F0Y2hkb2cgdGltZXIKKyAgcnVubmluZy9hY3RpdmUsIGlzIHRoZSBub3dheW91dCBiaXQgc2V0LCBpcyB0aGUgZGV2aWNlIG9wZW5lZCB2aWEKKyAgdGhlIC9kZXYvd2F0Y2hkb2cgaW50ZXJmYWNlIG9yIG5vdCwgLi4uKS4KKworVGhlIGxpc3Qgb2Ygd2F0Y2hkb2cgb3BlcmF0aW9ucyBpcyBkZWZpbmVkIGFzOgorCitzdHJ1Y3Qgd2F0Y2hkb2dfb3BzIHsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKwkvKiBtYW5kYXRvcnkgb3BlcmF0aW9ucyAqLworCWludCAoKnN0YXJ0KShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICopOworCWludCAoKnN0b3ApKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKik7CisJLyogb3B0aW9uYWwgb3BlcmF0aW9ucyAqLworCWludCAoKnBpbmcpKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKik7CisJdW5zaWduZWQgaW50ICgqc3RhdHVzKShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICopOworCWludCAoKnNldF90aW1lb3V0KShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICosIHVuc2lnbmVkIGludCk7CisJbG9uZyAoKmlvY3RsKShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7Cit9OworCitJdCBpcyBpbXBvcnRhbnQgdGhhdCB5b3UgZmlyc3QgZGVmaW5lIHRoZSBtb2R1bGUgb3duZXIgb2YgdGhlIHdhdGNoZG9nIHRpbWVyCitkcml2ZXIncyBvcGVyYXRpb25zLiBUaGlzIG1vZHVsZSBvd25lciB3aWxsIGJlIHVzZWQgdG8gbG9jayB0aGUgbW9kdWxlIHdoZW4KK3RoZSB3YXRjaGRvZyBpcyBhY3RpdmUuIChUaGlzIHRvIGF2b2lkIGEgc3lzdGVtIGNyYXNoIHdoZW4geW91IHVubG9hZCB0aGUKK21vZHVsZSBhbmQgL2Rldi93YXRjaGRvZyBpcyBzdGlsbCBvcGVuKS4KK1NvbWUgb3BlcmF0aW9ucyBhcmUgbWFuZGF0b3J5IGFuZCBzb21lIGFyZSBvcHRpb25hbC4gVGhlIG1hbmRhdG9yeSBvcGVyYXRpb25zCithcmU6CisqIHN0YXJ0OiB0aGlzIGlzIGEgcG9pbnRlciB0byB0aGUgcm91dGluZSB0aGF0IHN0YXJ0cyB0aGUgd2F0Y2hkb2cgdGltZXIKKyAgZGV2aWNlLgorICBUaGUgcm91dGluZSBuZWVkcyBhIHBvaW50ZXIgdG8gdGhlIHdhdGNoZG9nIHRpbWVyIGRldmljZSBzdHJ1Y3R1cmUgYXMgYQorICBwYXJhbWV0ZXIuIEl0IHJldHVybnMgemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJybm8gY29kZSBmb3IgZmFpbHVyZS4KKyogc3RvcDogd2l0aCB0aGlzIHJvdXRpbmUgdGhlIHdhdGNoZG9nIHRpbWVyIGRldmljZSBpcyBiZWluZyBzdG9wcGVkLgorICBUaGUgcm91dGluZSBuZWVkcyBhIHBvaW50ZXIgdG8gdGhlIHdhdGNoZG9nIHRpbWVyIGRldmljZSBzdHJ1Y3R1cmUgYXMgYQorICBwYXJhbWV0ZXIuIEl0IHJldHVybnMgemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJybm8gY29kZSBmb3IgZmFpbHVyZS4KKyAgU29tZSB3YXRjaGRvZyB0aW1lciBoYXJkd2FyZSBjYW4gb25seSBiZSBzdGFydGVkIGFuZCBub3QgYmUgc3RvcHBlZC4gVGhlCisgIGRyaXZlciBzdXBwb3J0aW5nIHRoaXMgaGFyZHdhcmUgbmVlZHMgdG8gbWFrZSBzdXJlIHRoYXQgYSBzdGFydCBhbmQgc3RvcAorICByb3V0aW5lIGlzIGJlaW5nIHByb3ZpZGVkLiBUaGlzIGNhbiBiZSBkb25lIGJ5IHVzaW5nIGEgdGltZXIgaW4gdGhlIGRyaXZlcgorICB0aGF0IHJlZ3VsYXJseSBzZW5kcyBhIGtlZXBhbGl2ZSBwaW5nIHRvIHRoZSB3YXRjaGRvZyB0aW1lciBoYXJkd2FyZS4KKworTm90IGFsbCB3YXRjaGRvZyB0aW1lciBoYXJkd2FyZSBzdXBwb3J0cyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5LiBUaGF0J3Mgd2h5CithbGwgb3RoZXIgcm91dGluZXMvb3BlcmF0aW9ucyBhcmUgb3B0aW9uYWwuIFRoZXkgb25seSBuZWVkIHRvIGJlIHByb3ZpZGVkIGlmCit0aGV5IGFyZSBzdXBwb3J0ZWQuIFRoZXNlIG9wdGlvbmFsIHJvdXRpbmVzL29wZXJhdGlvbnMgYXJlOgorKiBwaW5nOiB0aGlzIGlzIHRoZSByb3V0aW5lIHRoYXQgc2VuZHMgYSBrZWVwYWxpdmUgcGluZyB0byB0aGUgd2F0Y2hkb2cgdGltZXIKKyAgaGFyZHdhcmUuCisgIFRoZSByb3V0aW5lIG5lZWRzIGEgcG9pbnRlciB0byB0aGUgd2F0Y2hkb2cgdGltZXIgZGV2aWNlIHN0cnVjdHVyZSBhcyBhCisgIHBhcmFtZXRlci4gSXQgcmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJubyBjb2RlIGZvciBmYWlsdXJlLgorICBNb3N0IGhhcmR3YXJlIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGFzIGEgc2VwYXJhdGUgZnVuY3Rpb24gdXNlcyB0aGUKKyAgc3RhcnQgZnVuY3Rpb24gdG8gcmVzdGFydCB0aGUgd2F0Y2hkb2cgdGltZXIgaGFyZHdhcmUuIEFuZCB0aGF0J3MgYWxzbyB3aGF0CisgIHRoZSB3YXRjaGRvZyB0aW1lciBkcml2ZXIgY29yZSBkb2VzOiB0byBzZW5kIGEga2VlcGFsaXZlIHBpbmcgdG8gdGhlIHdhdGNoZG9nCisgIHRpbWVyIGhhcmR3YXJlIGl0IHdpbGwgZWl0aGVyIHVzZSB0aGUgcGluZyBvcGVyYXRpb24gKHdoZW4gYXZhaWxhYmxlKSBvciB0aGUKKyAgc3RhcnQgb3BlcmF0aW9uICh3aGVuIHRoZSBwaW5nIG9wZXJhdGlvbiBpcyBub3QgYXZhaWxhYmxlKS4KKyAgKE5vdGU6IHRoZSBXRElPQ19LRUVQQUxJVkUgaW9jdGwgY2FsbCB3aWxsIG9ubHkgYmUgYWN0aXZlIHdoZW4gdGhlCisgIFdESU9GX0tFRVBBTElWRVBJTkcgYml0IGhhcyBiZWVuIHNldCBpbiB0aGUgb3B0aW9uIGZpZWxkIG9uIHRoZSB3YXRjaGRvZydzCisgIGluZm8gc3RydWN0dXJlKS4KKyogc3RhdHVzOiB0aGlzIHJvdXRpbmUgY2hlY2tzIHRoZSBzdGF0dXMgb2YgdGhlIHdhdGNoZG9nIHRpbWVyIGRldmljZS4gVGhlCisgIHN0YXR1cyBvZiB0aGUgZGV2aWNlIGlzIHJlcG9ydGVkIHdpdGggd2F0Y2hkb2cgV0RJT0ZfKiBzdGF0dXMgZmxhZ3MvYml0cy4KKyogc2V0X3RpbWVvdXQ6IHRoaXMgcm91dGluZSBjaGVja3MgYW5kIGNoYW5nZXMgdGhlIHRpbWVvdXQgb2YgdGhlIHdhdGNoZG9nCisgIHRpbWVyIGRldmljZS4gSXQgcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgZm9yICJwYXJhbWV0ZXIgb3V0IG9mIHJhbmdlIgorICBhbmQgLUVJTyBmb3IgImNvdWxkIG5vdCB3cml0ZSB2YWx1ZSB0byB0aGUgd2F0Y2hkb2ciLiBPbiBzdWNjZXNzIHRoZSB0aW1lb3V0CisgIHZhbHVlIG9mIHRoZSB3YXRjaGRvZ19kZXZpY2Ugd2lsbCBiZSBjaGFuZ2VkIHRvIHRoZSB2YWx1ZSB0aGF0IHdhcyBqdXN0IHVzZWQKKyAgdG8gcmUtcHJvZ3JhbSB0aGUgd2F0Y2hkb2cgdGltZXIgZGV2aWNlLgorICAoTm90ZTogdGhlIFdESU9GX1NFVFRJTUVPVVQgbmVlZHMgdG8gYmUgc2V0IGluIHRoZSBvcHRpb25zIGZpZWxkIG9mIHRoZQorICB3YXRjaGRvZydzIGluZm8gc3RydWN0dXJlKS4KKyogaW9jdGw6IGlmIHRoaXMgcm91dGluZSBpcyBwcmVzZW50IHRoZW4gaXQgd2lsbCBiZSBjYWxsZWQgZmlyc3QgYmVmb3JlIHdlIGRvCisgIG91ciBvd24gaW50ZXJuYWwgaW9jdGwgY2FsbCBoYW5kbGluZy4gVGhpcyByb3V0aW5lIHNob3VsZCByZXR1cm4gLUVOT0lPQ1RMQ01ECisgIGlmIGEgY29tbWFuZCBpcyBub3Qgc3VwcG9ydGVkLiBUaGUgcGFyYW1ldGVycyB0aGF0IGFyZSBwYXNzZWQgdG8gdGhlIGlvY3RsCisgIGNhbGwgYXJlOiB3YXRjaGRvZ19kZXZpY2UsIGNtZCBhbmQgYXJnLgorCitUaGUgc3RhdHVzIGJpdHMgc2hvdWxkIChwcmVmZXJhYmx5KSBiZSBzZXQgd2l0aCB0aGUgc2V0X2JpdCBhbmQgY2xlYXJfYml0IGFsaWtlCitiaXQtb3BlcmF0aW9ucy4gVGhlIHN0YXR1cyBiaXRzIHRoYXQgYXJlIGRlZmluZWQgYXJlOgorKiBXRE9HX0FDVElWRTogdGhpcyBzdGF0dXMgYml0IGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBhIHdhdGNoZG9nIHRpbWVyIGRldmljZQorICBpcyBhY3RpdmUgb3Igbm90LiBXaGVuIHRoZSB3YXRjaGRvZyBpcyBhY3RpdmUgYWZ0ZXIgYm9vdGluZywgdGhlbiB5b3Ugc2hvdWxkCisgIHNldCB0aGlzIHN0YXR1cyBiaXQgKE5vdGU6IHdoZW4geW91IHJlZ2lzdGVyIHRoZSB3YXRjaGRvZyB0aW1lciBkZXZpY2Ugd2l0aAorICB0aGlzIGJpdCBzZXQsIHRoZW4gb3BlbmluZyAvZGV2L3dhdGNoZG9nIHdpbGwgc2tpcCB0aGUgc3RhcnQgb3BlcmF0aW9uKQorKiBXRE9HX0RFVl9PUEVOOiB0aGlzIHN0YXR1cyBiaXQgc2hvd3Mgd2hldGhlciBvciBub3QgdGhlIHdhdGNoZG9nIGRldmljZQorICB3YXMgb3BlbmVkIHZpYSAvZGV2L3dhdGNoZG9nLgorICAoVGhpcyBiaXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSB0aGUgV2F0Y2hEb2cgVGltZXIgRHJpdmVyIENvcmUpLgorKiBXRE9HX0FMTE9XX1JFTEVBU0U6IHRoaXMgYml0IHN0b3JlcyB3aGV0aGVyIG9yIG5vdCB0aGUgbWFnaWMgY2xvc2UgY2hhcmFjdGVyCisgIGhhcyBiZWVuIHNlbnQgKHNvIHRoYXQgd2UgY2FuIHN1cHBvcnQgdGhlIG1hZ2ljIGNsb3NlIGZlYXR1cmUpLgorICAoVGhpcyBiaXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSB0aGUgV2F0Y2hEb2cgVGltZXIgRHJpdmVyIENvcmUpLgorKiBXRE9HX05PX1dBWV9PVVQ6IHRoaXMgYml0IHN0b3JlcyB0aGUgbm93YXlvdXQgc2V0dGluZyBmb3IgdGhlIHdhdGNoZG9nLgorICBJZiB0aGlzIGJpdCBpcyBzZXQgdGhlbiB0aGUgd2F0Y2hkb2cgdGltZXIgd2lsbCBub3QgYmUgYWJsZSB0byBzdG9wLgorCitOb3RlOiBUaGUgV2F0Y2hEb2cgVGltZXIgRHJpdmVyIENvcmUgc3VwcG9ydHMgdGhlIG1hZ2ljIGNsb3NlIGZlYXR1cmUgYW5kCit0aGUgbm93YXlvdXQgZmVhdHVyZS4gVG8gdXNlIHRoZSBtYWdpYyBjbG9zZSBmZWF0dXJlIHlvdSBtdXN0IHNldCB0aGUKK1dESU9GX01BR0lDQ0xPU0UgYml0IGluIHRoZSBvcHRpb25zIGZpZWxkIG9mIHRoZSB3YXRjaGRvZydzIGluZm8gc3RydWN0dXJlLgorVGhlIG5vd2F5b3V0IGZlYXR1cmUgd2lsbCBvdmVycnVsZSB0aGUgbWFnaWMgY2xvc2UgZmVhdHVyZS4KKworVG8gZ2V0IG9yIHNldCBkcml2ZXIgc3BlY2lmaWMgZGF0YSB0aGUgZm9sbG93aW5nIHR3byBoZWxwZXIgZnVuY3Rpb25zIHNob3VsZCBiZQordXNlZDoKKworc3RhdGljIGlubGluZSB2b2lkIHdhdGNoZG9nX3NldF9kcnZkYXRhKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbmxpbmUgdm9pZCAqd2F0Y2hkb2dfZ2V0X2RydmRhdGEoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkKQorCitUaGUgd2F0Y2hkb2dfc2V0X2RydmRhdGEgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBhZGQgZHJpdmVyIHNwZWNpZmljIGRhdGEuIFRoZQorYXJndW1lbnRzIG9mIHRoaXMgZnVuY3Rpb24gYXJlIHRoZSB3YXRjaGRvZyBkZXZpY2Ugd2hlcmUgeW91IHdhbnQgdG8gYWRkIHRoZQorZHJpdmVyIHNwZWNpZmljIGRhdGEgdG8gYW5kIGEgcG9pbnRlciB0byB0aGUgZGF0YSBpdHNlbGYuCisKK1RoZSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHJldHJpZXZlIGRyaXZlciBzcGVjaWZpYyBkYXRhLgorVGhlIGFyZ3VtZW50IG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhlIHdhdGNoZG9nIGRldmljZSB3aGVyZSB5b3Ugd2FudCB0byByZXRyaWV2ZQorZGF0YSBmcm9tLiBUaGUgZnVuY3Rpb24gcmV0cnVucyB0aGUgcG9pbnRlciB0byB0aGUgZHJpdmVyIHNwZWNpZmljIGRhdGEuCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IGNhODdmNDcuLjUxZDQyZmIgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC0xOTI1LDYgKzE5MjUsMTIgQEAKIEY6CWFyY2gveDg2L2tlcm5lbC9jcHVpZC5jCiBGOglhcmNoL3g4Ni9rZXJuZWwvbXNyLmMKIAorQ1BVIFBPV0VSIE1PTklUT1JJTkcgU1VCU1lTVEVNCitNOglEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAZG9taW5pa2Jyb2Rvd3NraS5uZXQ+CitNOglUaG9tYXMgUmVubmluZ2VyIDx0cmVubkBzdXNlLmRlPgorUzoJTWFpbnRhaW5lZAorRjoJdG9vbHMvcG93ZXIvY3B1cG93ZXIKKwogQ1BVU0VUUwogTToJUGF1bCBNZW5hZ2UgPG1lbmFnZUBnb29nbGUuY29tPgogVzoJaHR0cDovL3d3dy5idWxsb3BlbnNvdXJjZS5vcmcvY3B1c2V0LwpAQCAtMzM2MCw2ICszMzY2LDEyIEBACiBGOglkcml2ZXJzL25ldC9peGdiZS8KIEY6CWRyaXZlcnMvbmV0L2l4Z2JldmYvCiAKK0lOVEVMIE1SU1QgUE1VIERSSVZFUgorTToJTGVuIEJyb3duIDxsZW4uYnJvd25AaW50ZWwuY29tPgorTDoJbGludXgtcG1AbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcKK1M6CVN1cHBvcnRlZAorRjoJYXJjaC94ODYvcGxhdGZvcm0vbXJzdC9wbXUuKgorCiBJTlRFTCBQUk8vV0lSRUxFU1MgMjEwMCBORVRXT1JLIENPTk5FQ1RJT04gU1VQUE9SVAogTDoJbGludXgtd2lyZWxlc3NAdmdlci5rZXJuZWwub3JnCiBTOglPcnBoYW4KQEAgLTQxNDksNiArNDE2MSwxMyBAQAogRjoJZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfKgogRjoJaW5jbHVkZS9saW51eC9tYXRyb3hmYi5oCiAKK01BWDE2NjggVEVNUEVSQVRVUkUgU0VOU09SIERSSVZFUgorTToJIkRhdmlkIEdlb3JnZSIgPGRhdmlkLmdlb3JnZUBza2EuYWMuemE+CitMOglsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCitTOglNYWludGFpbmVkCitGOglEb2N1bWVudGF0aW9uL2h3bW9uL21heDE2NjgKK0Y6CWRyaXZlcnMvaHdtb24vbWF4MTY2OC5jCisKIE1BWDY2NTAgSEFSRFdBUkUgTU9OSVRPUiBBTkQgRkFOIENPTlRST0xMRVIgRFJJVkVSCiBNOgkiSGFucyBKLiBLb2NoIiA8aGprQGhhbnNqa29jaC5kZT4KIEw6CWxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKQEAgLTQ3MDcsNiArNDcyNiw3IEBACiBGOglkcml2ZXJzL29mCiBGOglpbmNsdWRlL2xpbnV4L29mKi5oCiBLOglvZl9nZXRfcHJvcGVydHkKK0s6CW9mX21hdGNoX3RhYmxlCiAKIE9QRU5SSVNDIEFSQ0hJVEVDVFVSRQogTToJSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgpAQCAtNDk5Nyw2ICs1MDE3LDE3IEBACiBGOglkcml2ZXJzL3ZpZGVvL2ZiLXB1djMuYwogRjoJZHJpdmVycy9ydGMvcnRjLXB1djMuYwogCitQTUJVUyBIQVJEV0FSRSBNT05JVE9SSU5HIERSSVZFUlMKK006CUd1ZW50ZXIgUm9lY2sgPGd1ZW50ZXIucm9lY2tAZXJpY3Nzb24uY29tPgorTDoJbG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9yZworVzoJaHR0cDovL3d3dy5sbS1zZW5zb3JzLm9yZy8KK1c6CWh0dHA6Ly93d3cucm9lY2stdXMubmV0L2xpbnV4L2RyaXZlcnMvCitUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2dyb2Vjay9saW51eC1zdGFnaW5nLmdpdAorUzoJTWFpbnRhaW5lZAorRjoJRG9jdW1lbnRhdGlvbi9od21vbi9wbWJ1cworRjoJZHJpdmVycy9od21vbi9wbWJ1cy8KK0Y6CWluY2x1ZGUvbGludXgvaTJjL3BtYnVzLmgKKwogUE1DIFNJRVJSQSBNYXhSQUlEIERSSVZFUgogTToJQW5pbCBSYXZpbmRyYW5hdGggPGFuaWxfcmF2aW5kcmFuYXRoQHBtYy1zaWVycmEuY29tPgogTDoJbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKQEAgLTYyOTIsNiArNjMyMyw3IEBACiBUQVJHRVQgU1VCU1lTVEVNCiBNOglOaWNob2xhcyBBLiBCZWxsaW5nZXIgPG5hYkBsaW51eC1pc2NzaS5vcmc+CiBMOglsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZworTDoJdGFyZ2V0LWRldmVsQHZnZXIua2VybmVsLm9yZwogTDoJaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2xpbnV4LWlzY3NpLXRhcmdldC1kZXYKIFc6CWh0dHA6Ly93d3cubGludXgtaXNjc2kub3JnCiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L25hYi9saW8tY29yZS0yLjYuZ2l0IG1hc3RlcgpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCBkMDE4OTU2Li5mNjc2ZDE1IDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMzYwLDcgKzM2MCw3IEBACiBMSU5VWElOQ0xVREUgICAgOj0gLUkkKHNyY3RyZWUpL2FyY2gvJChoZHItYXJjaCkvaW5jbHVkZSBcCiAgICAgICAgICAgICAgICAgICAgLUlhcmNoLyQoaGRyLWFyY2gpL2luY2x1ZGUvZ2VuZXJhdGVkIC1JaW5jbHVkZSBcCiAgICAgICAgICAgICAgICAgICAgJChpZiAkKEtCVUlMRF9TUkMpLCAtSSQoc3JjdHJlZSkvaW5jbHVkZSkgXAotICAgICAgICAgICAgICAgICAgIC1pbmNsdWRlIGluY2x1ZGUvZ2VuZXJhdGVkL2F1dG9jb25mLmgKKyAgICAgICAgICAgICAgICAgICAtaW5jbHVkZSAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgva2NvbmZpZy5oCiAKIEtCVUlMRF9DUFBGTEFHUyA6PSAtRF9fS0VSTkVMX18KIApkaWZmIC0tZ2l0IGEvYXJjaC9LY29uZmlnIGIvYXJjaC9LY29uZmlnCmluZGV4IDI2YjBlMjMuLjRiMDY2OWMgMTAwNjQ0Ci0tLSBhL2FyY2gvS2NvbmZpZworKysgYi9hcmNoL0tjb25maWcKQEAgLTE3OCw0ICsxNzgsNyBAQAogY29uZmlnIEhBVkVfUkNVX1RBQkxFX0ZSRUUKIAlib29sCiAKK2NvbmZpZyBBUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRworCWJvb2wKKwogc291cmNlICJrZXJuZWwvZ2Nvdi9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9LY29uZmlnIGIvYXJjaC9hbHBoYS9LY29uZmlnCmluZGV4IGNhMmRhOGQuLjYwY2RlNTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvS2NvbmZpZworKysgYi9hcmNoL2FscGhhL0tjb25maWcKQEAgLTE0LDYgKzE0LDcgQEAKIAlzZWxlY3QgQVVUT19JUlFfQUZGSU5JVFkgaWYgU01QCiAJc2VsZWN0IEdFTkVSSUNfSVJRX1NIT1cKIAlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKKwlzZWxlY3QgQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKIAloZWxwCiAJICBUaGUgQWxwaGEgaXMgYSA2NC1iaXQgZ2VuZXJhbC1wdXJwb3NlIHByb2Nlc3NvciBkZXNpZ25lZCBhbmQKIAkgIG1hcmtldGVkIGJ5IHRoZSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiBvZiBibGVzc2VkIG1lbW9yeSwKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19hbGNvci5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2FsY29yLmMKaW5kZXggMGUxNDM5OS4uODYwNmQ3NyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2FsY29yLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2FsY29yLmMKQEAgLTE4Myw3ICsxODMsNyBAQAogICovCiAKIHN0YXRpYyBpbnQgX19pbml0Ci1hbGNvcl9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2FsY29yX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBjaGFyIGlycV90YWJbN11bNV0gX19pbml0ZGF0YSA9IHsKIAkJLypJTlQgICAgSU5UQSAgIElOVEIgICBJTlRDICAgSU5URCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2NhYnJpb2xldC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2NhYnJpb2xldC5jCmluZGV4IGM4YzExMmQuLjEwMjk2MTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19jYWJyaW9sZXQuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfY2FicmlvbGV0LmMKQEAgLTE3NSw3ICsxNzUsNyBAQAogICovCiAKIHN0YXRpYyBpbmxpbmUgaW50IF9faW5pdAotZWI2NnBfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitlYjY2cF9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzVdWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICBJTlRBICBJTlRCICBJTlRDICAgSU5URCAqLwpAQCAtMjA1LDcgKzIwNSw3IEBACiAgKi8KIAogc3RhdGljIGlubGluZSBpbnQgX19pbml0Ci1jYWJyaW9sZXRfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitjYWJyaW9sZXRfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGNoYXIgaXJxX3RhYls1XVs1XSBfX2luaXRkYXRhID0gewogCQkvKklOVCAgIElOVEEgIElOVEIgIElOVEMgICBJTlREICovCkBAIC0yODksNyArMjg5LDcgQEAKICAqLwogCiBzdGF0aWMgaW5saW5lIGludCBfX2luaXQKLWFscGhhcGMxNjRfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCithbHBoYXBjMTY0X21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBjaGFyIGlycV90YWJbN11bNV0gX19pbml0ZGF0YSA9IHsKIAkJLypJTlQgICBJTlRBICBJTlRCICAgSU5UQyAgIElOVEQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19kcDI2NC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2RwMjY0LmMKaW5kZXggZjg4NTY4Mi4uYmI3ZjBjNyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2RwMjY0LmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2RwMjY0LmMKQEAgLTM4Miw3ICszODIsNyBAQAogfQogCiBzdGF0aWMgaW50IF9faW5pdAotZHAyNjRfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitkcDI2NF9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzZdWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICAgIElOVEEgICBJTlRCICAgSU5UQyAgIElOVEQgKi8KQEAgLTQwNCw3ICs0MDQsNyBAQAogfQogCiBzdGF0aWMgaW50IF9faW5pdAotbW9uZXRfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCittb25ldF9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzEzXVs1XSBfX2luaXRkYXRhID0gewogCQkvKklOVCAgICBJTlRBICAgSU5UQiAgIElOVEMgICBJTlREICovCkBAIC00NjYsNyArNDY2LDcgQEAKIH0KIAogc3RhdGljIGludCBfX2luaXQKLXdlYmJyaWNrX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQord2ViYnJpY2tfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGNoYXIgaXJxX3RhYlsxM11bNV0gX19pbml0ZGF0YSA9IHsKIAkJLypJTlQgICAgSU5UQSAgIElOVEIgICBJTlRDICAgSU5URCAqLwpAQCAtNDg4LDcgKzQ4OCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgX19pbml0Ci1jbGlwcGVyX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorY2xpcHBlcl9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzddWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICAgIElOVEEgICBJTlRCICAgSU5UQyAgIElOVEQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19lYjY0cC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2ViNjRwLmMKaW5kZXggYTdhMjNiNC4uM2M2YzEzYyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2ViNjRwLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2ViNjRwLmMKQEAgLTE2OSw3ICsxNjksNyBAQAogICovCiAKIHN0YXRpYyBpbnQgX19pbml0Ci1lYjY0cF9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2ViNjRwX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBjaGFyIGlycV90YWJbNV1bNV0gX19pbml0ZGF0YSA9IHsKIAkJLypJTlQgIElOVEEgIElOVEIgIElOVEMgICBJTlREICovCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfZWlnZXIuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19laWdlci5jCmluZGV4IGE2MGNkNWIuLjM1ZjQ4MGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19laWdlci5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19laWdlci5jCkBAIC0xNDQsNyArMTQ0LDcgQEAKIH0KIAogc3RhdGljIGludCBfX2luaXQKLWVpZ2VyX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorZWlnZXJfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJdTggaXJxX29yaWc7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19tYXJ2ZWwuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19tYXJ2ZWwuYwppbmRleCAzODhiOTlkLi45NWNmYzgzIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWFydmVsLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21hcnZlbC5jCkBAIC0zMTgsNyArMzE4LDcgQEAKIH0KIAogc3RhdGljIGludCAKLW1hcnZlbF9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK21hcnZlbF9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBkZXYtPnN5c2RhdGE7CiAJc3RydWN0IGlvN19wb3J0ICppbzdfcG9ydCA9IGhvc2UtPnN5c2RhdGE7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWlhdGEuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19taWF0YS5jCmluZGV4IDYxY2NkOTUuLjI1OGRhNjggMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19taWF0YS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19taWF0YS5jCkBAIC0xNTEsNyArMTUxLDcgQEAKICAqLwogCiBzdGF0aWMgaW50IF9faW5pdAotbWlhdGFfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCittaWF0YV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKICAgICAgICAgc3RhdGljIGNoYXIgaXJxX3RhYlsxOF1bNV0gX19pbml0ZGF0YSA9IHsKIAkJLypJTlQgICAgSU5UQSAgIElOVEIgICBJTlRDICAgSU5URCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21pa2FzYS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21pa2FzYS5jCmluZGV4IDBlNmU0NjkuLmMwZmQ3MjggMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19taWthc2EuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWlrYXNhLmMKQEAgLTE0Niw3ICsxNDYsNyBAQAogICovCiAKIHN0YXRpYyBpbnQgX19pbml0Ci1taWthc2FfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCittaWthc2FfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGNoYXIgaXJxX3RhYls4XVs1XSBfX2luaXRkYXRhID0gewogCQkvKklOVCAgICBJTlRBICAgSU5UQiAgIElOVEMgICBJTlREICovCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbmF1dGlsdXMuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19uYXV0aWx1cy5jCmluZGV4IDk5YzBmNDYuLjQxMTIyMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19uYXV0aWx1cy5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19uYXV0aWx1cy5jCkBAIC02NSw3ICs2NSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgX19pbml0Ci1uYXV0aWx1c19tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK25hdXRpbHVzX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCS8qIFByZXNlcnZlIHRoZSBJUlEgc2V0IHVwIGJ5IHRoZSBjb25zb2xlLiAgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX25vcml0YWtlLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbm9yaXRha2UuYwppbmRleCBhMDBhYzcwLi4yMTcyNTI4IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbm9yaXRha2UuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbm9yaXRha2UuYwpAQCAtMTk0LDcgKzE5NCw3IEBACiAgKi8KIAogc3RhdGljIGludCBfX2luaXQKLW5vcml0YWtlX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorbm9yaXRha2VfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGNoYXIgaXJxX3RhYlsxNV1bNV0gX19pbml0ZGF0YSA9IHsKIAkJLypJTlQgICAgSU5UQSAgIElOVEIgICBJTlRDICAgSU5URCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3Jhd2hpZGUuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19yYXdoaWRlLmMKaW5kZXggN2Y1MjE2MS4uYTEyNWQ2YiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3Jhd2hpZGUuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfcmF3aGlkZS5jCkBAIC0yMjMsNyArMjIzLDcgQEAKICAqLwogCiBzdGF0aWMgaW50IF9faW5pdAotcmF3aGlkZV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3Jhd2hpZGVfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGNoYXIgaXJxX3RhYls1XVs1XSBfX2luaXRkYXRhID0gewogCQkvKklOVCAgICBJTlRBICAgSU5UQiAgIElOVEMgICBJTlREICovCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfcnVmZmlhbi5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3J1ZmZpYW4uYwppbmRleCBmMzM2NDhlLi4yNTgxY2JlIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfcnVmZmlhbi5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19ydWZmaWFuLmMKQEAgLTExOSw3ICsxMTksNyBAQAogICovCiAKIHN0YXRpYyBpbnQgX19pbml0Ci1ydWZmaWFuX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorcnVmZmlhbl9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKICAgICAgICAgc3RhdGljIGNoYXIgaXJxX3RhYlsxMV1bNV0gX19pbml0ZGF0YSA9IHsKIAkgICAgICAvKklOVCAgSU5UQSBJTlRCIElOVEMgSU5URCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3J4MTY0LmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfcngxNjQuYwppbmRleCAyMTZkOTRkLi5iMTcyYjI3IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfcngxNjQuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfcngxNjQuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAgKi8KIAogc3RhdGljIGludCBfX2luaXQKLXJ4MTY0X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorcngxNjRfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAjaWYgMAogCXN0YXRpYyBjaGFyIGlycV90YWJfcGFzczFbNl1bNV0gX19pbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19zYWJsZS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3NhYmxlLmMKaW5kZXggZGE3MTRlNC4uOThkMWRiZiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3NhYmxlLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3NhYmxlLmMKQEAgLTE5NCw3ICsxOTQsNyBAQAogICovCiAKIHN0YXRpYyBpbnQgX19pbml0Ci1zYWJsZV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3NhYmxlX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBjaGFyIGlycV90YWJbOV1bNV0gX19pbml0ZGF0YSA9IHsKIAkJLypJTlQgICAgSU5UQSAgIElOVEIgICBJTlRDICAgSU5URCAqLwpAQCAtMzc2LDcgKzM3Niw3IEBACiAgKi8KIAogc3RhdGljIGludCBfX2luaXQKLWx5bnhfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitseW54X21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBjaGFyIGlycV90YWJbMTldWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICAgIElOVEEgICBJTlRCICAgSU5UQyAgIElOVEQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19zaW8uYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19zaW8uYwppbmRleCA4NWI0YWVhLi40N2JlYzFlIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfc2lvLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3Npby5jCkBAIC0xNDYsNyArMTQ2LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQgX19pbml0Ci1ub25hbWVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitub25hbWVfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJLyoKIAkgKiBUaGUgTm9uYW1lIGJvYXJkIGhhcyA1IFBDSSBzbG90cyB3aXRoIGVhY2ggb2YgdGhlIDQKQEAgLTE4NSw3ICsxODUsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBfX2luaXQKLXAya19tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3Aya19tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiW11bNV0gX19pbml0ZGF0YSA9IHsKIAkJLypJTlQgQSAgIEIgICBDICAgRCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3N4MTY0LmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfc3gxNjQuYwppbmRleCA0MWQ0YWQ0Li43M2UxYzMxIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfc3gxNjQuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfc3gxNjQuYwpAQCAtOTUsNyArOTUsNyBAQAogICovCiAKIHN0YXRpYyBpbnQgX19pbml0Ci1zeDE2NF9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N4MTY0X21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBjaGFyIGlycV90YWJbNV1bNV0gX19pbml0ZGF0YSA9IHsKIAkJLypJTlQgICAgSU5UQSAgIElOVEIgICBJTlRDICAgSU5URCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3Rha2FyYS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3Rha2FyYS5jCmluZGV4IGEzMWY4Y2QuLjJhZTk5YWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c190YWthcmEuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfdGFrYXJhLmMKQEAgLTE1Nyw3ICsxNTcsNyBAQAogICovCiAKIHN0YXRpYyBpbnQgX19pbml0Ci10YWthcmFfbWFwX2lycV9zcm0oc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQordGFrYXJhX21hcF9pcnFfc3JtKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzE1XVs1XSBfX2luaXRkYXRhID0gewogCQl7IDE2KzMsIDE2KzMsIDE2KzMsIDE2KzMsIDE2KzN9LCAgIC8qIHNsb3QgIDYgPT0gZGV2aWNlIDMgKi8KQEAgLTE4OCw3ICsxODgsNyBAQAogfQogCiBzdGF0aWMgaW50IF9faW5pdAotdGFrYXJhX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQordGFrYXJhX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBjaGFyIGlycV90YWJbMTVdWzVdIF9faW5pdGRhdGEgPSB7CiAJCXsgMTYrMywgMTYrMywgMTYrMywgMTYrMywgMTYrM30sICAgLyogc2xvdCAgNiA9PSBkZXZpY2UgMyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3RpdGFuLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfdGl0YW4uYwppbmRleCA2OTk0NDA3Li5mNDdiMzBhIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfdGl0YW4uYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfdGl0YW4uYwpAQCAtMzA1LDcgKzMwNSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0Ci10aXRhbl9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3RpdGFuX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXU4IGludGxpbmU7CiAJaW50IGlycTsKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c193aWxkZmlyZS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3dpbGRmaXJlLmMKaW5kZXggZDkyY2RjNy4uMTdjODVhNiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3dpbGRmaXJlLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3dpbGRmaXJlLmMKQEAgLTI5MCw3ICsyOTAsNyBAQAogICovCiAKIHN0YXRpYyBpbnQgX19pbml0Ci13aWxkZmlyZV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3dpbGRmaXJlX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBjaGFyIGlycV90YWJbOF1bNV0gX19pbml0ZGF0YSA9IHsKIAkJLypJTlQgICAgSU5UQSAgIElOVEIgICBJTlRDICAgSU5URCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vS2NvbmZpZyBiL2FyY2gvYXJtL0tjb25maWcKaW5kZXggMDllYmYwYi4uMmM3MWE4ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vS2NvbmZpZworKysgYi9hcmNoL2FybS9LY29uZmlnCkBAIC0xNzE2LDYgKzE3MTYsNyBAQAogCWJvb2wgIkZsYXR0ZW5lZCBEZXZpY2UgVHJlZSBzdXBwb3J0IgogCXNlbGVjdCBPRgogCXNlbGVjdCBPRl9FQVJMWV9GTEFUVFJFRQorCXNlbGVjdCBJUlFfRE9NQUlOCiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciBmbGF0dGVuZWQgZGV2aWNlIHRyZWUgbWFjaGluZSBkZXNjcmlwdGlvbnMuCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL01ha2VmaWxlIGIvYXJjaC9hcm0vTWFrZWZpbGUKaW5kZXggM2E0YTA0Yi4uNzBjNDI0ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vTWFrZWZpbGUKQEAgLTI4Miw2ICsyODIsMTIgQEAKIHppbnN0YWxsIHVpbnN0YWxsIGluc3RhbGw6IHZtbGludXgKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpIE1BQ0hJTkU9JChNQUNISU5FKSAkQAogCislLmR0YjoKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpIE1BQ0hJTkU9JChNQUNISU5FKSAkKGJvb3QpLyRACisKK2R0YnM6CisJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSBNQUNISU5FPSQoTUFDSElORSkgJChib290KS8kQAorCiAjIFdlIHVzZSBNUlBST1BFUl9GSUxFUyBhbmQgQ0xFQU5fRklMRVMgbm93CiBhcmNoY2xlYW46CiAJJChRKSQoTUFLRSkgJChjbGVhbik9JChib290KQpAQCAtMjk4LDYgKzMwNCw3IEBACiAgIGVjaG8gICcgIHVJbWFnZSAgICAgICAgLSBVLUJvb3Qgd3JhcHBlZCB6SW1hZ2UnCiAgIGVjaG8gICcgIGJvb3RwSW1hZ2UgICAgLSBDb21iaW5lZCB6SW1hZ2UgYW5kIGluaXRpYWwgUkFNIGRpc2snIAogICBlY2hvICAnICAgICAgICAgICAgICAgICAgKHN1cHBseSBpbml0cmQgaW1hZ2UgdmlhIG1ha2UgdmFyaWFibGUgSU5JVFJEPTxwYXRoPiknCisgIGVjaG8gICcgIGR0YnMgICAgICAgICAgLSBCdWlsZCBkZXZpY2UgdHJlZSBibG9icyBmb3IgZW5hYmxlZCBib2FyZHMnCiAgIGVjaG8gICcgIGluc3RhbGwgICAgICAgLSBJbnN0YWxsIHVuY29tcHJlc3NlZCBrZXJuZWwnCiAgIGVjaG8gICcgIHppbnN0YWxsICAgICAgLSBJbnN0YWxsIGNvbXByZXNzZWQga2VybmVsJwogICBlY2hvICAnICB1aW5zdGFsbCAgICAgIC0gSW5zdGFsbCBVLUJvb3Qgd3JhcHBlZCBjb21wcmVzc2VkIGtlcm5lbCcKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL2FybS9ib290L01ha2VmaWxlCmluZGV4IDkxMjhmZGQuLmExZWRmZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vYm9vdC9NYWtlZmlsZQpAQCAtNTksNiArNTksMTIgQEAKIAogZW5kaWYKIAorIyBSdWxlIHRvIGJ1aWxkIGRldmljZSB0cmVlIGJsb2JzCiskKG9iaikvJS5kdGI6ICQoc3JjKS9kdHMvJS5kdHMKKwkkKGNhbGwgY21kLGR0YykKKworJChvYmopL2R0YnM6ICQoYWRkcHJlZml4ICQob2JqKS8sICQoZHRiLXkpKQorCiBxdWlldF9jbWRfdWltYWdlID0gVUlNQUdFICAkQAogICAgICAgY21kX3VpbWFnZSA9ICQoQ09ORklHX1NIRUxMKSAkKE1LSU1BR0UpIC1BIGFybSAtTyBsaW51eCAtVCBrZXJuZWwgXAogCQkgICAtQyBub25lIC1hICQoTE9BREFERFIpIC1lICQoU1RBUlRBRERSKSBcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9za2VsZXRvbi5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvc2tlbGV0b24uZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDFkMjQxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvc2tlbGV0b24uZHRzaQpAQCAtMCwwICsxLDEzIEBACisvKgorICogU2tlbGV0b24gZGV2aWNlIHRyZWU7IHRoZSBiYXJlIG1pbmltdW0gbmVlZGVkIHRvIGJvb3Q7IGp1c3QgaW5jbHVkZSBhbmQKKyAqIGFkZCBhIGNvbXBhdGlibGUgdmFsdWUuICBUaGUgYm9vdGxvYWRlciB3aWxsIHR5cGljYWxseSBwb3B1bGF0ZSB0aGUgbWVtb3J5CisgKiBub2RlLgorICovCisKKy8geworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWNob3NlbiB7IH07CisJYWxpYXNlcyB7IH07CisJbWVtb3J5IHsgZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsgcmVnID0gPDAgMD47IH07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEtaGFybW9ueS5kdHMgYi9hcmNoL2FybS9ib290L2R0cy90ZWdyYS1oYXJtb255LmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzA1MzM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEtaGFybW9ueS5kdHMKQEAgLTAsMCArMSw3MCBAQAorL2R0cy12MS87CisKKy9tZW1yZXNlcnZlLyAweDFjMDAwMDAwIDB4MDQwMDAwMDA7CisvaW5jbHVkZS8gInRlZ3JhMjAuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiTlZJRElBIFRlZ3JhMiBIYXJtb255IGV2YWx1YXRpb24gYm9hcmQiOworCWNvbXBhdGlibGUgPSAibnZpZGlhLGhhcm1vbnkiLCAibnZpZGlhLHRlZ3JhMjAiOworCisJY2hvc2VuIHsKKwkJYm9vdGFyZ3MgPSAidm1hbGxvYz0xOTJNIHZpZGVvPXRlZ3JhZmIgY29uc29sZT10dHlTMCwxMTUyMDBuOCByb290PS9kZXYvbW1jYmxrMHAyIHJ3IHJvb3R3YWl0IjsKKwl9OworCisJbWVtb3J5QDAgeworCQlyZWcgPSA8IDB4MDAwMDAwMDAgMHg0MDAwMDAwMCA+OworCX07CisKKwlpMmNANzAwMGMwMDAgeworCQljbG9jay1mcmVxdWVuY3kgPSA8NDAwMDAwPjsKKworCQljb2RlYzogd204OTAzQDFhIHsKKwkJCWNvbXBhdGlibGUgPSAid2xmLHdtODkwMyI7CisJCQlyZWcgPSA8MHgxYT47CisJCQlpbnRlcnJ1cHRzID0gPCAzNDcgPjsKKworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisKKwkJCS8qIDB4ODAwMCA9IE5vdCBjb25maWd1cmVkICovCisJCQlncGlvLWNmZyA9IDwgMHg4MDAwIDB4ODAwMCAwIDB4ODAwMCAweDgwMDAgPjsKKwkJfTsKKwl9OworCisJaTJjQDcwMDBjNDAwIHsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDQwMDAwMD47CisJfTsKKworCWkyY0A3MDAwYzUwMCB7CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDw0MDAwMDA+OworCX07CisKKwlpMmNANzAwMGQwMDAgeworCQljbG9jay1mcmVxdWVuY3kgPSA8NDAwMDAwPjsKKwl9OworCisJc291bmQgeworCQljb21wYXRpYmxlID0gIm52aWRpYSxoYXJtb255LXNvdW5kIiwgIm52aWRpYSx0ZWdyYS13bTg5MDMiOworCisJCXNwa3ItZW4tZ3Bpb3MgPSA8JmNvZGVjIDIgMD47CisJCWhwLWRldC1ncGlvcyA9IDwmZ3BpbyAxNzggMD47CisJCWludC1taWMtZW4tZ3Bpb3MgPSA8JmdwaW8gMTg0IDA+OworCQlleHQtbWljLWVuLWdwaW9zID0gPCZncGlvIDE4NSAwPjsKKwl9OworCisJc2VyaWFsQDcwMDA2MzAwIHsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPCAyMTYwMDAwMDAgPjsKKwl9OworCisJc2RoY2lAYzgwMDAyMDAgeworCQlncGlvcyA9IDwmZ3BpbyA2OSAwPiwgLyogY2QsIGdwaW8gUEk1ICovCisJCQk8JmdwaW8gNTcgMD4sIC8qIHdwLCBncGlvIFBIMSAqLworCQkJPCZncGlvIDE1NSAwPjsgLyogcG93ZXIsIGdwaW8gUFQzICovCisJfTsKKworCXNkaGNpQGM4MDAwNjAwIHsKKwkJZ3Bpb3MgPSA8JmdwaW8gNTggMD4sIC8qIGNkLCBncGlvIFBIMiAqLworCQkJPCZncGlvIDU5IDA+LCAvKiB3cCwgZ3BpbyBQSDMgKi8KKwkJCTwmZ3BpbyA3MCAwPjsgLyogcG93ZXIsIGdwaW8gUEk2ICovCisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy90ZWdyYS1zZWFib2FyZC5kdHMgYi9hcmNoL2FybS9ib290L2R0cy90ZWdyYS1zZWFib2FyZC5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk0MGNhZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhLXNlYWJvYXJkLmR0cwpAQCAtMCwwICsxLDI4IEBACisvZHRzLXYxLzsKKworL21lbXJlc2VydmUvIDB4MWMwMDAwMDAgMHgwNDAwMDAwMDsKKy9pbmNsdWRlLyAidGVncmEyMC5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJOVklESUEgU2VhYm9hcmQiOworCWNvbXBhdGlibGUgPSAibnZpZGlhLHNlYWJvYXJkIiwgIm52aWRpYSx0ZWdyYTIwIjsKKworCWNob3NlbiB7CisJCWJvb3RhcmdzID0gInZtYWxsb2M9MTkyTSB2aWRlbz10ZWdyYWZiIGNvbnNvbGU9dHR5UzAsMTE1MjAwbjggcm9vdD0vZGV2L21tY2JsazFwMyBydyByb290d2FpdCI7CisJfTsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJCXJlZyA9IDwgMHgwMDAwMDAwMCAweDQwMDAwMDAwID47CisJfTsKKworCXNlcmlhbEA3MDAwNjMwMCB7CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwgMjE2MDAwMDAwID47CisJfTsKKworCXNkaGNpQGM4MDAwNDAwIHsKKwkJZ3Bpb3MgPSA8JmdwaW8gNjkgMD4sIC8qIGNkLCBncGlvIFBJNSAqLworCQkJPCZncGlvIDU3IDA+LCAvKiB3cCwgZ3BpbyBQSDEgKi8KKwkJCTwmZ3BpbyA3MCAwPjsgLyogcG93ZXIsIGdwaW8gUEk2ICovCisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy90ZWdyYTIwLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy90ZWdyYTIwLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcyNzU5NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhMjAuZHRzaQpAQCAtMCwwICsxLDEzOSBAQAorL2luY2x1ZGUvICJza2VsZXRvbi5kdHNpIgorCisvIHsKKwljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwIjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpbnRjPjsKKworCWludGM6IGludGVycnVwdC1jb250cm9sbGVyQDUwMDQxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1naWMiOworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJcmVnID0gPCAweDUwMDQxMDAwIDB4MTAwMCA+LAorCQkgICAgICA8IDB4NTAwNDAxMDAgMHgwMTAwID47CisJfTsKKworCWkyY0A3MDAwYzAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1pMmMiOworCQlyZWcgPSA8MHg3MDAwQzAwMCAweDEwMD47CisJCWludGVycnVwdHMgPSA8IDcwID47CisJfTsKKworCWkyY0A3MDAwYzQwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1pMmMiOworCQlyZWcgPSA8MHg3MDAwQzQwMCAweDEwMD47CisJCWludGVycnVwdHMgPSA8IDExNiA+OworCX07CisKKwlpMmNANzAwMGM1MDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtaTJjIjsKKwkJcmVnID0gPDB4NzAwMEM1MDAgMHgxMDA+OworCQlpbnRlcnJ1cHRzID0gPCAxMjQgPjsKKwl9OworCisJaTJjQDcwMDBkMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLWkyYyI7CisJCXJlZyA9IDwweDcwMDBEMDAwIDB4MjAwPjsKKwkJaW50ZXJydXB0cyA9IDwgODUgPjsKKwl9OworCisJaTJzQDcwMDAyODAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLWkycyI7CisJCXJlZyA9IDwweDcwMDAyODAwIDB4MjAwPjsKKwkJaW50ZXJydXB0cyA9IDwgNDUgPjsKKwkJZG1hLWNoYW5uZWwgPSA8IDIgPjsKKwl9OworCisJaTJzQDcwMDAyYTAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLWkycyI7CisJCXJlZyA9IDwweDcwMDAyYTAwIDB4MjAwPjsKKwkJaW50ZXJydXB0cyA9IDwgMzUgPjsKKwkJZG1hLWNoYW5uZWwgPSA8IDEgPjsKKwl9OworCisJZGFzQDcwMDAwYzAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLWRhcyI7CisJCXJlZyA9IDwweDcwMDAwYzAwIDB4ODA+OworCX07CisKKwlncGlvOiBncGlvQDYwMDBkMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1ncGlvIjsKKwkJcmVnID0gPCAweDYwMDBkMDAwIDB4MTAwMCA+OworCQlpbnRlcnJ1cHRzID0gPCA2NCA2NSA2NiA2NyA4NyAxMTkgMTIxID47CisJCSNncGlvLWNlbGxzID0gPDI+OworCQlncGlvLWNvbnRyb2xsZXI7CisJfTsKKworCXNlcmlhbEA3MDAwNjAwMCB7CisJCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtdWFydCI7CisJCXJlZyA9IDwweDcwMDA2MDAwIDB4NDA+OworCQlyZWctc2hpZnQgPSA8Mj47CisJCWludGVycnVwdHMgPSA8IDY4ID47CisJfTsKKworCXNlcmlhbEA3MDAwNjA0MCB7CisJCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtdWFydCI7CisJCXJlZyA9IDwweDcwMDA2MDQwIDB4NDA+OworCQlyZWctc2hpZnQgPSA8Mj47CisJCWludGVycnVwdHMgPSA8IDY5ID47CisJfTsKKworCXNlcmlhbEA3MDAwNjIwMCB7CisJCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtdWFydCI7CisJCXJlZyA9IDwweDcwMDA2MjAwIDB4MTAwPjsKKwkJcmVnLXNoaWZ0ID0gPDI+OworCQlpbnRlcnJ1cHRzID0gPCA3OCA+OworCX07CisKKwlzZXJpYWxANzAwMDYzMDAgeworCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLXVhcnQiOworCQlyZWcgPSA8MHg3MDAwNjMwMCAweDEwMD47CisJCXJlZy1zaGlmdCA9IDwyPjsKKwkJaW50ZXJydXB0cyA9IDwgMTIyID47CisJfTsKKworCXNlcmlhbEA3MDAwNjQwMCB7CisJCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtdWFydCI7CisJCXJlZyA9IDwweDcwMDA2NDAwIDB4MTAwPjsKKwkJcmVnLXNoaWZ0ID0gPDI+OworCQlpbnRlcnJ1cHRzID0gPCAxMjMgPjsKKwl9OworCisJc2RoY2lAYzgwMDAwMDAgeworCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLXNkaGNpIjsKKwkJcmVnID0gPDB4YzgwMDAwMDAgMHgyMDA+OworCQlpbnRlcnJ1cHRzID0gPCA0NiA+OworCX07CisKKwlzZGhjaUBjODAwMDIwMCB7CisJCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtc2RoY2kiOworCQlyZWcgPSA8MHhjODAwMDIwMCAweDIwMD47CisJCWludGVycnVwdHMgPSA8IDQ3ID47CisJfTsKKworCXNkaGNpQGM4MDAwNDAwIHsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1zZGhjaSI7CisJCXJlZyA9IDwweGM4MDAwNDAwIDB4MjAwPjsKKwkJaW50ZXJydXB0cyA9IDwgNTEgPjsKKwl9OworCisJc2RoY2lAYzgwMDA2MDAgeworCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLXNkaGNpIjsKKwkJcmVnID0gPDB4YzgwMDA2MDAgMHgyMDA+OworCQlpbnRlcnJ1cHRzID0gPCA2MyA+OworCX07Cit9OworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy92ZXJzYXRpbGUtYWIuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvdmVyc2F0aWxlLWFiLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjMyOTI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvdmVyc2F0aWxlLWFiLmR0cwpAQCAtMCwwICsxLDE5MiBAQAorL2R0cy12MS87CisvaW5jbHVkZS8gInNrZWxldG9uLmR0c2kiCisKKy8geworCW1vZGVsID0gIkFSTSBWZXJzYXRpbGUgQUIiOworCWNvbXBhdGlibGUgPSAiYXJtLHZlcnNhdGlsZS1hYiI7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmdmljPjsKKworCWFsaWFzZXMgeworCQlzZXJpYWwwID0gJnVhcnQwOworCQlzZXJpYWwxID0gJnVhcnQxOworCQlzZXJpYWwyID0gJnVhcnQyOworCQlpMmMwID0gJmkyYzA7CisJfTsKKworCW1lbW9yeSB7CisJCXJlZyA9IDwweDAgMHgwODAwMDAwMD47CisJfTsKKworCWZsYXNoQDM0MDAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0sdmVyc2F0aWxlLWZsYXNoIjsKKwkJcmVnID0gPDB4MzQwMDAwMDAgMHg0MDAwMDAwPjsKKwkJYmFuay13aWR0aCA9IDw0PjsKKwl9OworCisJaTJjMDogaTJjQDEwMDAyMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQljb21wYXRpYmxlID0gImFybSx2ZXJzYXRpbGUtaTJjIjsKKwkJcmVnID0gPDB4MTAwMDIwMDAgMHgxMDAwPjsKKworCQlydGNANjggeworCQkJY29tcGF0aWJsZSA9ICJkYWxsYXMsZHMxMzM4IjsKKwkJCXJlZyA9IDwweDY4PjsKKwkJfTsKKwl9OworCisJbmV0QDEwMDEwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJzbXNjLGxhbjkxYzExMSI7CisJCXJlZyA9IDwweDEwMDEwMDAwIDB4MTAwMDA+OworCQlpbnRlcnJ1cHRzID0gPDI1PjsKKwl9OworCisJbGNkQDEwMDA4MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0sdmVyc2F0aWxlLWxjZCI7CisJCXJlZyA9IDwweDEwMDA4MDAwIDB4MTAwMD47CisJfTsKKworCWFtYmEgeworCQljb21wYXRpYmxlID0gImFybSxhbWJhLWJ1cyI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJcmFuZ2VzOworCisJCXZpYzogaW50Y0AxMDE0MDAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSx2ZXJzYXRpbGUtdmljIjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDEwMTQwMDAwIDB4MTAwMD47CisJCX07CisKKwkJc2ljOiBpbnRjQDEwMDAzMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHZlcnNhdGlsZS1zaWMiOworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJcmVnID0gPDB4MTAwMDMwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JnZpYz47CisJCQlpbnRlcnJ1cHRzID0gPDMxPjsgLyogQ2FzY2FkZWQgdG8gdmljICovCisJCX07CisKKwkJZG1hQDEwMTMwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDgxIiwgImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxMzAwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTc+OworCQl9OworCisJCXVhcnQwOiB1YXJ0QDEwMWYxMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDExIiwgImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxZjEwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTI+OworCQl9OworCisJCXVhcnQxOiB1YXJ0QDEwMWYyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDExIiwgImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxZjIwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTM+OworCQl9OworCisJCXVhcnQyOiB1YXJ0QDEwMWYzMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDExIiwgImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxZjMwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTQ+OworCQl9OworCisJCXNtY0AxMDEwMDAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxMDAwMDAgMHgxMDAwPjsKKwkJfTsKKworCQltcG1jQDEwMTEwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCQlyZWcgPSA8MHgxMDExMDAwMCAweDEwMDA+OworCQl9OworCisJCWRpc3BsYXlAMTAxMjAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scGwxMTAiLCAiYXJtLHByaW1lY2VsbCI7CisJCQlyZWcgPSA8MHgxMDEyMDAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwxNj47CisJCX07CisKKwkJc2N0bEAxMDFlMDAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxZTAwMDAgMHgxMDAwPjsKKwkJfTsKKworCQl3YXRjaGRvZ0AxMDFlMTAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxZTEwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MD47CisJCX07CisKKwkJZ3BpbzA6IGdwaW9AMTAxZTQwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scGwwNjEiLCAiYXJtLHByaW1lY2VsbCI7CisJCQlyZWcgPSA8MHgxMDFlNDAwMCAweDEwMDA+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJaW50ZXJydXB0cyA9IDw2PjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQl9OworCisJCWdwaW8xOiBncGlvQDEwMWU1MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDYxIiwgImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxZTUwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8Nz47CisJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJfTsKKworCQlydGNAMTAxZTgwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scGwwMzAiLCAiYXJtLHByaW1lY2VsbCI7CisJCQlyZWcgPSA8MHgxMDFlODAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwxMD47CisJCX07CisKKwkJc2NpQDEwMWYwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCQlyZWcgPSA8MHgxMDFmMDAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDwxNT47CisJCX07CisKKwkJc3NwQDEwMWY0MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDIyIiwgImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxZjQwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTE+OworCQl9OworCisJCWZwZ2EgeworCQkJY29tcGF0aWJsZSA9ICJhcm0sdmVyc2F0aWxlLWZwZ2EiLCAic2ltcGxlLWJ1cyI7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJcmFuZ2VzID0gPDAgMHgxMDAwMDAwMCAweDEwMDAwPjsKKworCQkJYWFjaUA0MDAwIHsKKwkJCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQkJCXJlZyA9IDwweDQwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDI0PjsKKwkJCX07CisJCQltbWNANTAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJCQlyZWcgPSA8IDB4NTAwMCAweDEwMDA+OworCQkJCWludGVycnVwdHMgPSA8MjI+OworCQkJfTsKKwkJCWttaUA2MDAwIHsKKwkJCQljb21wYXRpYmxlID0gImFybSxwbDA1MCIsICJhcm0scHJpbWVjZWxsIjsKKwkJCQlyZWcgPSA8MHg2MDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmc2ljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDM+OworCQkJfTsKKwkJCWttaUA3MDAwIHsKKwkJCQljb21wYXRpYmxlID0gImFybSxwbDA1MCIsICJhcm0scHJpbWVjZWxsIjsKKwkJCQlyZWcgPSA8MHg3MDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmc2ljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDQ+OworCQkJfTsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3ZlcnNhdGlsZS1wYi5kdHMgYi9hcmNoL2FybS9ib290L2R0cy92ZXJzYXRpbGUtcGIuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNjE0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy92ZXJzYXRpbGUtcGIuZHRzCkBAIC0wLDAgKzEsNDggQEAKKy9pbmNsdWRlLyAidmVyc2F0aWxlLWFiLmR0cyIKKworLyB7CisJbW9kZWwgPSAiQVJNIFZlcnNhdGlsZSBQQiI7CisJY29tcGF0aWJsZSA9ICJhcm0sdmVyc2F0aWxlLXBiIjsKKworCWFtYmEgeworCQlncGlvMjogZ3Bpb0AxMDFlNjAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDA2MSIsICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweDEwMWU2MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDg+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCX07CisKKwkJZ3BpbzM6IGdwaW9AMTAxZTcwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scGwwNjEiLCAiYXJtLHByaW1lY2VsbCI7CisJCQlyZWcgPSA8MHgxMDFlNzAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDw5PjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQl9OworCisJCWZwZ2EgeworCQkJdWFydEA5MDAwIHsKKwkJCQljb21wYXRpYmxlID0gImFybSxwbDAxMSIsICJhcm0scHJpbWVjZWxsIjsKKwkJCQlyZWcgPSA8MHg5MDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmc2ljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDY+OworCQkJfTsKKwkJCXNjaUBhMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQkJCXJlZyA9IDwweGEwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZzaWM+OworCQkJCWludGVycnVwdHMgPSA8NT47CisJCQl9OworCQkJbW1jQGIwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCQkJcmVnID0gPDB4YjAwMCAweDEwMDA+OworCQkJCWludGVycnVwdHMgPSA8MjM+OworCQkJfTsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9pdDgxNTIuYyBiL2FyY2gvYXJtL2NvbW1vbi9pdDgxNTIuYwppbmRleCAxNGFkNjJlLi5hNzkzNGJhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vaXQ4MTUyLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL2l0ODE1Mi5jCkBAIC0xNDQsNyArMTQ0LDcgQEAKIH0KIAogLyogbWFwcGluZyBmb3Igb24tY2hpcCBkZXZpY2VzICovCi1pbnQgX19pbml0IGl0ODE1Ml9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpbnQgX19pbml0IGl0ODE1Ml9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaWYgKChkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0lURSkgJiYKIAkgICAgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSVRFXzgxNTIpKSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9pdDgxNTIuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2l0ODE1Mi5oCmluZGV4IGIyZjk1YzcuLmIzZmVhMzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2l0ODE1Mi5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2l0ODE1Mi5oCkBAIC0xMDUsNyArMTA1LDcgQEAKIAogZXh0ZXJuIHZvaWQgaXQ4MTUyX2lycV9kZW11eCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOwogZXh0ZXJuIHZvaWQgaXQ4MTUyX2luaXRfaXJxKHZvaWQpOwotZXh0ZXJuIGludCBpdDgxNTJfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKTsKK2V4dGVybiBpbnQgaXQ4MTUyX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbik7CiBleHRlcm4gaW50IGl0ODE1Ml9wY2lfc2V0dXAoaW50IG5yLCBzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpOwogZXh0ZXJuIHN0cnVjdCBwY2lfYnVzICppdDgxNTJfcGNpX3NjYW5fYnVzKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9hcmNoLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL2FyY2guaAppbmRleCAzMjgxZmI0Li4yMTdhYTE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL2FyY2guaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL2FyY2guaApAQCAtNzQsNCArNzQsMTEgQEAKICNkZWZpbmUgTUFDSElORV9FTkQJCQkJXAogfTsKIAorI2RlZmluZSBEVF9NQUNISU5FX1NUQVJUKF9uYW1lLCBfbmFtZXN0cikJCVwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWFjaGluZV9kZXNjIF9fbWFjaF9kZXNjXyMjX25hbWUJXAorIF9fdXNlZAkJCQkJCQlcCisgX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5hcmNoLmluZm8uaW5pdCIpKSkgPSB7CVwKKwkubnIJCT0gfjAsCQkJCVwKKwkubmFtZQkJPSBfbmFtZXN0ciwKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL3BjaS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9wY2kuaAppbmRleCAxNjMzMGJkLi4xODZlZmQ0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL3BjaS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvcGNpLmgKQEAgLTI1LDcgKzI1LDcgQEAKIAl2b2lkCQkoKnByZWluaXQpKHZvaWQpOwogCXZvaWQJCSgqcG9zdGluaXQpKHZvaWQpOwogCXU4CQkoKnN3aXp6bGUpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4ICpwaW4pOwotCWludAkJKCptYXBfaXJxKShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pOworCWludAkJKCptYXBfaXJxKShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pOwogfTsKIAogLyoKQEAgLTQ0LDcgKzQ0LDcgQEAKIAkJCQkJLyogQnJpZGdlIHN3aXp6bGluZwkJCSovCiAJdTgJCSgqc3dpenpsZSkoc3RydWN0IHBjaV9kZXYgKiwgdTggKik7CiAJCQkJCS8qIElSUSBtYXBwaW5nCQkJCSovCi0JaW50CQkoKm1hcF9pcnEpKHN0cnVjdCBwY2lfZGV2ICosIHU4LCB1OCk7CisJaW50CQkoKm1hcF9pcnEpKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICosIHU4LCB1OCk7CiAJc3RydWN0IGh3X3BjaQkqaHc7CiAJdm9pZAkJKnByaXZhdGVfZGF0YTsJLyogcGxhdGZvcm0gY29udHJvbGxlciBwcml2YXRlIGRhdGEJKi8KIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wcm9tLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wcm9tLmgKaW5kZXggMTFiODcwOC4uNmY2NWNhOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcHJvbS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3Byb20uaApAQCAtMTYsMTEgKzE2LDYgQEAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpcnFfZGlzcG9zZV9tYXBwaW5nKHVuc2lnbmVkIGludCB2aXJxKQotewotCXJldHVybjsKLX0KLQogZXh0ZXJuIHN0cnVjdCBtYWNoaW5lX2Rlc2MgKnNldHVwX21hY2hpbmVfZmR0KHVuc2lnbmVkIGludCBkdF9waHlzKTsKIGV4dGVybiB2b2lkIGFybV9kdF9tZW1ibG9ja19yZXNlcnZlKHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMgYi9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMKaW5kZXggZTRlZTA1MC4uZDZkZjM1OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYwpAQCAtNDc2LDcgKzQ3Niw3IEBACiAvKgogICogTWFwIGEgc2xvdC9waW4gdG8gYW4gSVJRLgogICovCi1zdGF0aWMgaW50IHBjaWJpb3NfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IHBjaWJpb3NfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzID0gZGV2LT5zeXNkYXRhOwogCWludCBpcnEgPSAtMTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9kZXZ0cmVlLmMgYi9hcmNoL2FybS9rZXJuZWwvZGV2dHJlZS5jCmluZGV4IDBjZGQ3YjQuLjFhMzNlOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9kZXZ0cmVlLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2RldnRyZWUuYwpAQCAtMTMyLDE3ICsxMzIsMyBAQAogCiAJcmV0dXJuIG1kZXNjX2Jlc3Q7CiB9Ci0KLS8qKgotICogaXJxX2NyZWF0ZV9vZl9tYXBwaW5nIC0gSG9vayB0byByZXNvbHZlIE9GIGlycSBzcGVjaWZpZXIgaW50byBhIExpbnV4IGlycSMKLSAqCi0gKiBDdXJyZW50bHkgdGhlIG1hcHBpbmcgbWVjaGFuaXNtIGlzIHRyaXZpYWw7IHNpbXBsZSBmbGF0IGh3aXJxIG51bWJlcnMgYXJlCi0gKiBtYXBwZWQgMToxIG9udG8gTGludXggaXJxIG51bWJlcnMuICBDYXNjYWRlZCBpcnEgY29udHJvbGxlcnMgYXJlIG5vdAotICogc3VwcG9ydGVkLgotICovCi11bnNpZ25lZCBpbnQgaXJxX2NyZWF0ZV9vZl9tYXBwaW5nKHN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbGxlciwKLQkJCQkgICBjb25zdCB1MzIgKmludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplKQotewotCXJldHVybiBpbnRzcGVjWzBdOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoaXJxX2NyZWF0ZV9vZl9tYXBwaW5nKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDVlMWU1NDEuLjFhMzQ3ZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9od19icmVha3BvaW50Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vbGVkcy5oPgpAQCAtMTk2LDcgKzE5Nyw4IEBACiAJCQkJY3B1X3JlbGF4KCk7CiAJCQl9IGVsc2UgewogCQkJCXN0b3BfY3JpdGljYWxfdGltaW5ncygpOwotCQkJCXBtX2lkbGUoKTsKKwkJCQlpZiAoY3B1aWRsZV9pZGxlX2NhbGwoKSkKKwkJCQkJcG1faWRsZSgpOwogCQkJCXN0YXJ0X2NyaXRpY2FsX3RpbWluZ3MoKTsKIAkJCQkvKgogCQkJCSAqIFRoaXMgd2lsbCBldmVudHVhbGx5IGJlIHJlbW92ZWQgLSBwbV9pZGxlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWF0OTEvTWFrZWZpbGUKaW5kZXggOTY5NjYyMy4uYmY1N2U4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9NYWtlZmlsZQpAQCAtMiw3ICsyLDcgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCiAjCiAKLW9iai15CQk6PSBpcnEubyBncGlvLm8KK29iai15CQk6PSBpcnEubyBncGlvLm8gc2V0dXAubwogb2JqLW0JCTo9CiBvYmotbgkJOj0KIG9iai0JCTo9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MWNhcDkuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOS5jCmluZGV4IGYxMDEzZDAuLmJmYzY4NDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOS5jCkBAIC0yNSwyMyArMjUsMTAgQEAKICNpbmNsdWRlIDxtYWNoL2F0OTFfcnN0Yy5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9zaGR3Yy5oPgogCisjaW5jbHVkZSAic29jLmgiCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImNsb2NrLmgiCiAKLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYXQ5MWNhcDlfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkudmlydHVhbAk9IEFUOTFfVkFfQkFTRV9TWVMsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxX0JBU0VfU1lTKSwKLQkJLmxlbmd0aAkJPSBTWl8xNkssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gQVQ5MV9JT19WSVJUX0JBU0UgLSBBVDkxQ0FQOV9TUkFNX1NJWkUsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxQ0FQOV9TUkFNX0JBU0UpLAotCQkubGVuZ3RoCQk9IEFUOTFDQVA5X1NSQU1fU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sCi19OwotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogIENsb2NrcwogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTMzOSwyNCArMzI2LDE3IEBACiAgKiAgQVQ5MUNBUDkgcHJvY2Vzc29yIGluaXRpYWxpemF0aW9uCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi12b2lkIF9faW5pdCBhdDkxY2FwOV9tYXBfaW8odm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBhdDkxY2FwOV9tYXBfaW8odm9pZCkKIHsKLQkvKiBNYXAgcGVyaXBoZXJhbHMgKi8KLQlpb3RhYmxlX2luaXQoYXQ5MWNhcDlfaW9fZGVzYywgQVJSQVlfU0laRShhdDkxY2FwOV9pb19kZXNjKSk7CisJYXQ5MV9pbml0X3NyYW0oMCwgQVQ5MUNBUDlfU1JBTV9CQVNFLCBBVDkxQ0FQOV9TUkFNX1NJWkUpOwogfQogCi12b2lkIF9faW5pdCBhdDkxY2FwOV9pbml0aWFsaXplKHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jaykKK3N0YXRpYyB2b2lkIF9faW5pdCBhdDkxY2FwOV9pbml0aWFsaXplKHZvaWQpCiB7CiAJYXQ5MV9hcmNoX3Jlc2V0ID0gYXQ5MWNhcDlfcmVzZXQ7CiAJcG1fcG93ZXJfb2ZmID0gYXQ5MWNhcDlfcG93ZXJvZmY7CiAJYXQ5MV9leHRlcm5faXJxID0gKDEgPDwgQVQ5MUNBUDlfSURfSVJRMCkgfCAoMSA8PCBBVDkxQ0FQOV9JRF9JUlExKTsKIAotCS8qIEluaXQgY2xvY2sgc3Vic3lzdGVtICovCi0JYXQ5MV9jbG9ja19pbml0KG1haW5fY2xvY2spOwotCi0JLyogUmVnaXN0ZXIgdGhlIHByb2Nlc3Nvci1zcGVjaWZpYyBjbG9ja3MgKi8KLQlhdDkxY2FwOV9yZWdpc3Rlcl9jbG9ja3MoKTsKLQogCS8qIFJlZ2lzdGVyIEdQSU8gc3Vic3lzdGVtICovCiAJYXQ5MV9ncGlvX2luaXQoYXQ5MWNhcDlfZ3BpbywgNCk7CiAKQEAgLTQwOSwxNCArMzg5LDkgQEAKIAkwLAkvKiBBZHZhbmNlZCBJbnRlcnJ1cHQgQ29udHJvbGxlciAoSVJRMSkgKi8KIH07CiAKLXZvaWQgX19pbml0IGF0OTFjYXA5X2luaXRfaW50ZXJydXB0cyh1bnNpZ25lZCBpbnQgcHJpb3JpdHlbTlJfQUlDX0lSUVNdKQotewotCWlmICghcHJpb3JpdHkpCi0JCXByaW9yaXR5ID0gYXQ5MWNhcDlfZGVmYXVsdF9pcnFfcHJpb3JpdHk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBBSUMgaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KLQlhdDkxX2FpY19pbml0KHByaW9yaXR5KTsKLQotCS8qIEVuYWJsZSBHUElPIGludGVycnVwdHMgKi8KLQlhdDkxX2dwaW9faXJxX3NldHVwKCk7Ci19CitzdHJ1Y3QgYXQ5MV9pbml0X3NvYyBfX2luaXRkYXRhIGF0OTFjYXA5X3NvYyA9IHsKKwkubWFwX2lvID0gYXQ5MWNhcDlfbWFwX2lvLAorCS5kZWZhdWx0X2lycV9wcmlvcml0eSA9IGF0OTFjYXA5X2RlZmF1bHRfaXJxX3ByaW9yaXR5LAorCS5yZWdpc3Rlcl9jbG9ja3MgPSBhdDkxY2FwOV9yZWdpc3Rlcl9jbG9ja3MsCisJLmluaXQgPSBhdDkxY2FwOV9pbml0aWFsaXplLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMC5jCmluZGV4IDgzYTFhM2YuLmY3MzMwMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDAuYwpAQCAtMjAsMjUgKzIwLDE2IEBACiAjaW5jbHVkZSA8bWFjaC9hdDkxX3N0Lmg+CiAjaW5jbHVkZSA8bWFjaC9jcHUuaD4KIAorI2luY2x1ZGUgInNvYy5oIgogI2luY2x1ZGUgImdlbmVyaWMuaCIKICNpbmNsdWRlICJjbG9jay5oIgogCiBzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGF0OTFybTkyMDBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CiAJewotCQkudmlydHVhbAk9IEFUOTFfVkFfQkFTRV9TWVMsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxX0JBU0VfU1lTKSwKLQkJLmxlbmd0aAkJPSBTWl80SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKIAkJLnZpcnR1YWwJPSBBVDkxX1ZBX0JBU0VfRU1BQywKIAkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFSTTkyMDBfQkFTRV9FTUFDKSwKIAkJLmxlbmd0aAkJPSBTWl8xNkssCiAJCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gQVQ5MV9JT19WSVJUX0JBU0UgLSBBVDkxUk05MjAwX1NSQU1fU0laRSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFSTTkyMDBfU1JBTV9CQVNFKSwKLQkJLmxlbmd0aAkJPSBBVDkxUk05MjAwX1NSQU1fU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAogCX0sCiB9OwogCkBAIC0zMDQsMjQgKzI5NSwxNyBAQAogCWF0OTFfc3lzX3dyaXRlKEFUOTFfU1RfQ1IsIEFUOTFfU1RfV0RSU1QpOwogfQogCi1pbnQgcm05MjAwX3R5cGU7Ci1FWFBPUlRfU1lNQk9MKHJtOTIwMF90eXBlKTsKLQotdm9pZCBfX2luaXQgYXQ5MXJtOTIwMF9zZXRfdHlwZShpbnQgdHlwZSkKLXsKLQlybTkyMDBfdHlwZSA9IHR5cGU7Ci19Ci0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiAgQVQ5MVJNOTIwMCBwcm9jZXNzb3IgaW5pdGlhbGl6YXRpb24KICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi12b2lkIF9faW5pdCBhdDkxcm05MjAwX21hcF9pbyh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGF0OTFybTkyMDBfbWFwX2lvKHZvaWQpCiB7CiAJLyogTWFwIHBlcmlwaGVyYWxzICovCisJYXQ5MV9pbml0X3NyYW0oMCwgQVQ5MVJNOTIwMF9TUkFNX0JBU0UsIEFUOTFSTTkyMDBfU1JBTV9TSVpFKTsKIAlpb3RhYmxlX2luaXQoYXQ5MXJtOTIwMF9pb19kZXNjLCBBUlJBWV9TSVpFKGF0OTFybTkyMDBfaW9fZGVzYykpOwogfQogCi12b2lkIF9faW5pdCBhdDkxcm05MjAwX2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKQorc3RhdGljIHZvaWQgX19pbml0IGF0OTFybTkyMDBfaW5pdGlhbGl6ZSh2b2lkKQogewogCWF0OTFfYXJjaF9yZXNldCA9IGF0OTFybTkyMDBfcmVzZXQ7CiAJYXQ5MV9leHRlcm5faXJxID0gKDEgPDwgQVQ5MVJNOTIwMF9JRF9JUlEwKSB8ICgxIDw8IEFUOTFSTTkyMDBfSURfSVJRMSkKQEAgLTMyOSwxMiArMzEzLDYgQEAKIAkJCXwgKDEgPDwgQVQ5MVJNOTIwMF9JRF9JUlE0KSB8ICgxIDw8IEFUOTFSTTkyMDBfSURfSVJRNSkKIAkJCXwgKDEgPDwgQVQ5MVJNOTIwMF9JRF9JUlE2KTsKIAotCS8qIEluaXQgY2xvY2sgc3Vic3lzdGVtICovCi0JYXQ5MV9jbG9ja19pbml0KG1haW5fY2xvY2spOwotCi0JLyogUmVnaXN0ZXIgdGhlIHByb2Nlc3Nvci1zcGVjaWZpYyBjbG9ja3MgKi8KLQlhdDkxcm05MjAwX3JlZ2lzdGVyX2Nsb2NrcygpOwotCiAJLyogSW5pdGlhbGl6ZSBHUElPIHN1YnN5c3RlbSAqLwogCWF0OTFfZ3Bpb19pbml0KGF0OTFybTkyMDBfZ3BpbywKIAkJY3B1X2lzX2F0OTFybTkyMDBfYmdhKCkgPyBBVDkxUk05MjAwX0JHQSA6IEFUOTFSTTkyMDBfUFFGUCk7CkBAIC0zODMsMTQgKzM2MSw5IEBACiAJMAkvKiBBZHZhbmNlZCBJbnRlcnJ1cHQgQ29udHJvbGxlciAoSVJRNikgKi8KIH07CiAKLXZvaWQgX19pbml0IGF0OTFybTkyMDBfaW5pdF9pbnRlcnJ1cHRzKHVuc2lnbmVkIGludCBwcmlvcml0eVtOUl9BSUNfSVJRU10pCi17Ci0JaWYgKCFwcmlvcml0eSkKLQkJcHJpb3JpdHkgPSBhdDkxcm05MjAwX2RlZmF1bHRfaXJxX3ByaW9yaXR5OwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgQUlDIGludGVycnVwdCBjb250cm9sbGVyICovCi0JYXQ5MV9haWNfaW5pdChwcmlvcml0eSk7Ci0KLQkvKiBFbmFibGUgR1BJTyBpbnRlcnJ1cHRzICovCi0JYXQ5MV9ncGlvX2lycV9zZXR1cCgpOwotfQorc3RydWN0IGF0OTFfaW5pdF9zb2MgX19pbml0ZGF0YSBhdDkxcm05MjAwX3NvYyA9IHsKKwkubWFwX2lvID0gYXQ5MXJtOTIwMF9tYXBfaW8sCisJLmRlZmF1bHRfaXJxX3ByaW9yaXR5ID0gYXQ5MXJtOTIwMF9kZWZhdWx0X2lycV9wcmlvcml0eSwKKwkucmVnaXN0ZXJfY2xvY2tzID0gYXQ5MXJtOTIwMF9yZWdpc3Rlcl9jbG9ja3MsCisJLmluaXQgPSBhdDkxcm05MjAwX2luaXRpYWxpemUsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjAuYwppbmRleCA3ZDYwNmIwLi5jYjM5N2JlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjAuYwpAQCAtMTcsNTggKzE3LDE2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgogI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CisjaW5jbHVkZSA8bWFjaC9hdDkxX2RiZ3UuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFzYW05MjYwLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX3BtYy5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9yc3RjLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX3NoZHdjLmg+CiAKKyNpbmNsdWRlICJzb2MuaCIKICNpbmNsdWRlICJnZW5lcmljLmgiCiAjaW5jbHVkZSAiY2xvY2suaCIKIAotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdDkxc2FtOTI2MF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS52aXJ0dWFsCT0gQVQ5MV9WQV9CQVNFX1NZUywKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFfQkFTRV9TWVMpLAotCQkubGVuZ3RoCQk9IFNaXzE2SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYXQ5MXNhbTkyNjBfc3JhbV9kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS52aXJ0dWFsCT0gQVQ5MV9JT19WSVJUX0JBU0UgLSBBVDkxU0FNOTI2MF9TUkFNMF9TSVpFLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MVNBTTkyNjBfU1JBTTBfQkFTRSksCi0JCS5sZW5ndGgJCT0gQVQ5MVNBTTkyNjBfU1JBTTBfU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSBBVDkxX0lPX1ZJUlRfQkFTRSAtIEFUOTFTQU05MjYwX1NSQU0wX1NJWkUgLSBBVDkxU0FNOTI2MF9TUkFNMV9TSVpFLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MVNBTTkyNjBfU1JBTTFfQkFTRSksCi0JCS5sZW5ndGgJCT0gQVQ5MVNBTTkyNjBfU1JBTTFfU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYXQ5MXNhbTlnMjBfc3JhbV9kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS52aXJ0dWFsCT0gQVQ5MV9JT19WSVJUX0JBU0UgLSBBVDkxU0FNOUcyMF9TUkFNMF9TSVpFLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MVNBTTlHMjBfU1JBTTBfQkFTRSksCi0JCS5sZW5ndGgJCT0gQVQ5MVNBTTlHMjBfU1JBTTBfU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSBBVDkxX0lPX1ZJUlRfQkFTRSAtIEFUOTFTQU05RzIwX1NSQU0wX1NJWkUgLSBBVDkxU0FNOUcyMF9TUkFNMV9TSVpFLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MVNBTTlHMjBfU1JBTTFfQkFTRSksCi0JCS5sZW5ndGgJCT0gQVQ5MVNBTTlHMjBfU1JBTTFfU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYXQ5MXNhbTl4ZV9zcmFtX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFTQU05WEVfU1JBTV9CQVNFKSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0KLX07Ci0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiAgQ2xvY2tzCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzMwLDExICsyODgsOSBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MXNhbTl4ZV9tYXBfaW8odm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGNpZHIsIHNyYW1fc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHNyYW1fc2l6ZTsKIAotCWNpZHIgPSBhdDkxX3N5c19yZWFkKEFUOTFfREJHVV9DSURSKTsKLQotCXN3aXRjaCAoY2lkciAmIEFUOTFfQ0lEUl9TUkFNU0laKSB7CisJc3dpdGNoIChhdDkxX3NvY19pbml0ZGF0YS5jaWRyICYgQVQ5MV9DSURSX1NSQU1TSVopIHsKIAkJY2FzZSBBVDkxX0NJRFJfU1JBTVNJWl8zMks6CiAJCQlzcmFtX3NpemUgPSAyICogU1pfMTZLOwogCQkJYnJlYWs7CkBAIC0zNDMsMzggKzI5OSwyOSBAQAogCQkJc3JhbV9zaXplID0gU1pfMTZLOwogCX0KIAotCWF0OTFzYW05eGVfc3JhbV9kZXNjLT52aXJ0dWFsID0gQVQ5MV9JT19WSVJUX0JBU0UgLSBzcmFtX3NpemU7Ci0JYXQ5MXNhbTl4ZV9zcmFtX2Rlc2MtPmxlbmd0aCA9IHNyYW1fc2l6ZTsKLQotCWlvdGFibGVfaW5pdChhdDkxc2FtOXhlX3NyYW1fZGVzYywgQVJSQVlfU0laRShhdDkxc2FtOXhlX3NyYW1fZGVzYykpOworCWF0OTFfaW5pdF9zcmFtKDAsIEFUOTFTQU05WEVfU1JBTV9CQVNFLCBzcmFtX3NpemUpOwogfQogCi12b2lkIF9faW5pdCBhdDkxc2FtOTI2MF9tYXBfaW8odm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOTI2MF9tYXBfaW8odm9pZCkKIHsKLQkvKiBNYXAgcGVyaXBoZXJhbHMgKi8KLQlpb3RhYmxlX2luaXQoYXQ5MXNhbTkyNjBfaW9fZGVzYywgQVJSQVlfU0laRShhdDkxc2FtOTI2MF9pb19kZXNjKSk7Ci0KLQlpZiAoY3B1X2lzX2F0OTFzYW05eGUoKSkKKwlpZiAoY3B1X2lzX2F0OTFzYW05eGUoKSkgewogCQlhdDkxc2FtOXhlX21hcF9pbygpOwotCWVsc2UgaWYgKGNwdV9pc19hdDkxc2FtOWcyMCgpKQotCQlpb3RhYmxlX2luaXQoYXQ5MXNhbTlnMjBfc3JhbV9kZXNjLCBBUlJBWV9TSVpFKGF0OTFzYW05ZzIwX3NyYW1fZGVzYykpOwotCWVsc2UKLQkJaW90YWJsZV9pbml0KGF0OTFzYW05MjYwX3NyYW1fZGVzYywgQVJSQVlfU0laRShhdDkxc2FtOTI2MF9zcmFtX2Rlc2MpKTsKKwl9IGVsc2UgaWYgKGNwdV9pc19hdDkxc2FtOWcyMCgpKSB7CisJCWF0OTFfaW5pdF9zcmFtKDAsIEFUOTFTQU05RzIwX1NSQU0wX0JBU0UsIEFUOTFTQU05RzIwX1NSQU0wX1NJWkUpOworCQlhdDkxX2luaXRfc3JhbSgxLCBBVDkxU0FNOUcyMF9TUkFNMV9CQVNFLCBBVDkxU0FNOUcyMF9TUkFNMV9TSVpFKTsKKwl9IGVsc2UgeworCQlhdDkxX2luaXRfc3JhbSgwLCBBVDkxU0FNOTI2MF9TUkFNMF9CQVNFLCBBVDkxU0FNOTI2MF9TUkFNMF9TSVpFKTsKKwkJYXQ5MV9pbml0X3NyYW0oMSwgQVQ5MVNBTTkyNjBfU1JBTTFfQkFTRSwgQVQ5MVNBTTkyNjBfU1JBTTFfU0laRSk7CisJfQogfQogCi12b2lkIF9faW5pdCBhdDkxc2FtOTI2MF9pbml0aWFsaXplKHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jaykKK3N0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOTI2MF9pbml0aWFsaXplKHZvaWQpCiB7CiAJYXQ5MV9hcmNoX3Jlc2V0ID0gYXQ5MXNhbTlfYWx0X3Jlc2V0OwogCXBtX3Bvd2VyX29mZiA9IGF0OTFzYW05MjYwX3Bvd2Vyb2ZmOwogCWF0OTFfZXh0ZXJuX2lycSA9ICgxIDw8IEFUOTFTQU05MjYwX0lEX0lSUTApIHwgKDEgPDwgQVQ5MVNBTTkyNjBfSURfSVJRMSkKIAkJCXwgKDEgPDwgQVQ5MVNBTTkyNjBfSURfSVJRMik7CiAKLQkvKiBJbml0IGNsb2NrIHN1YnN5c3RlbSAqLwotCWF0OTFfY2xvY2tfaW5pdChtYWluX2Nsb2NrKTsKLQotCS8qIFJlZ2lzdGVyIHRoZSBwcm9jZXNzb3Itc3BlY2lmaWMgY2xvY2tzICovCi0JYXQ5MXNhbTkyNjBfcmVnaXN0ZXJfY2xvY2tzKCk7Ci0KIAkvKiBSZWdpc3RlciBHUElPIHN1YnN5c3RlbSAqLwogCWF0OTFfZ3Bpb19pbml0KGF0OTFzYW05MjYwX2dwaW8sIDMpOwogfQpAQCAtNDIxLDE0ICszNjgsOSBAQAogCTAsCS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyICovCiB9OwogCi12b2lkIF9faW5pdCBhdDkxc2FtOTI2MF9pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W05SX0FJQ19JUlFTXSkKLXsKLQlpZiAoIXByaW9yaXR5KQotCQlwcmlvcml0eSA9IGF0OTFzYW05MjYwX2RlZmF1bHRfaXJxX3ByaW9yaXR5OwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgQUlDIGludGVycnVwdCBjb250cm9sbGVyICovCi0JYXQ5MV9haWNfaW5pdChwcmlvcml0eSk7Ci0KLQkvKiBFbmFibGUgR1BJTyBpbnRlcnJ1cHRzICovCi0JYXQ5MV9ncGlvX2lycV9zZXR1cCgpOwotfQorc3RydWN0IGF0OTFfaW5pdF9zb2MgX19pbml0ZGF0YSBhdDkxc2FtOTI2MF9zb2MgPSB7CisJLm1hcF9pbyA9IGF0OTFzYW05MjYwX21hcF9pbywKKwkuZGVmYXVsdF9pcnFfcHJpb3JpdHkgPSBhdDkxc2FtOTI2MF9kZWZhdWx0X2lycV9wcmlvcml0eSwKKwkucmVnaXN0ZXJfY2xvY2tzID0gYXQ5MXNhbTkyNjBfcmVnaXN0ZXJfY2xvY2tzLAorCS5pbml0ID0gYXQ5MXNhbTkyNjBfaW5pdGlhbGl6ZSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjEuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MS5jCmluZGV4IGMxNDgzMTYuLmQ1MjJiNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MS5jCkBAIC0yMiwzNiArMjIsMTAgQEAKICNpbmNsdWRlIDxtYWNoL2F0OTFfcnN0Yy5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9zaGR3Yy5oPgogCisjaW5jbHVkZSAic29jLmgiCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImNsb2NrLmgiCiAKLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYXQ5MXNhbTkyNjFfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkudmlydHVhbAk9IEFUOTFfVkFfQkFTRV9TWVMsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxX0JBU0VfU1lTKSwKLQkJLmxlbmd0aAkJPSBTWl8xNkssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdDkxc2FtOTI2MV9zcmFtX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnZpcnR1YWwJPSBBVDkxX0lPX1ZJUlRfQkFTRSAtIEFUOTFTQU05MjYxX1NSQU1fU0laRSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFTQU05MjYxX1NSQU1fQkFTRSksCi0JCS5sZW5ndGgJCT0gQVQ5MVNBTTkyNjFfU1JBTV9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYXQ5MXNhbTlnMTBfc3JhbV9kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS52aXJ0dWFsCT0gQVQ5MV9JT19WSVJUX0JBU0UgLSBBVDkxU0FNOUcxMF9TUkFNX1NJWkUsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxU0FNOUcxMF9TUkFNX0JBU0UpLAotCQkubGVuZ3RoCQk9IEFUOTFTQU05RzEwX1NSQU1fU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sCi19OwotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogIENsb2NrcwogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTMwMiwzMCArMjc2LDIxIEBACiAgKiAgQVQ5MVNBTTkyNjEgcHJvY2Vzc29yIGluaXRpYWxpemF0aW9uCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi12b2lkIF9faW5pdCBhdDkxc2FtOTI2MV9tYXBfaW8odm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOTI2MV9tYXBfaW8odm9pZCkKIHsKLQkvKiBNYXAgcGVyaXBoZXJhbHMgKi8KLQlpb3RhYmxlX2luaXQoYXQ5MXNhbTkyNjFfaW9fZGVzYywgQVJSQVlfU0laRShhdDkxc2FtOTI2MV9pb19kZXNjKSk7Ci0KIAlpZiAoY3B1X2lzX2F0OTFzYW05ZzEwKCkpCi0JCWlvdGFibGVfaW5pdChhdDkxc2FtOWcxMF9zcmFtX2Rlc2MsIEFSUkFZX1NJWkUoYXQ5MXNhbTlnMTBfc3JhbV9kZXNjKSk7CisJCWF0OTFfaW5pdF9zcmFtKDAsIEFUOTFTQU05RzEwX1NSQU1fQkFTRSwgQVQ5MVNBTTlHMTBfU1JBTV9TSVpFKTsKIAllbHNlCi0JCWlvdGFibGVfaW5pdChhdDkxc2FtOTI2MV9zcmFtX2Rlc2MsIEFSUkFZX1NJWkUoYXQ5MXNhbTkyNjFfc3JhbV9kZXNjKSk7CisJCWF0OTFfaW5pdF9zcmFtKDAsIEFUOTFTQU05MjYxX1NSQU1fQkFTRSwgQVQ5MVNBTTkyNjFfU1JBTV9TSVpFKTsKIH0KIAotdm9pZCBfX2luaXQgYXQ5MXNhbTkyNjFfaW5pdGlhbGl6ZSh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spCitzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MXNhbTkyNjFfaW5pdGlhbGl6ZSh2b2lkKQogewogCWF0OTFfYXJjaF9yZXNldCA9IGF0OTFzYW05X2FsdF9yZXNldDsKIAlwbV9wb3dlcl9vZmYgPSBhdDkxc2FtOTI2MV9wb3dlcm9mZjsKIAlhdDkxX2V4dGVybl9pcnEgPSAoMSA8PCBBVDkxU0FNOTI2MV9JRF9JUlEwKSB8ICgxIDw8IEFUOTFTQU05MjYxX0lEX0lSUTEpCiAJCQl8ICgxIDw8IEFUOTFTQU05MjYxX0lEX0lSUTIpOwogCi0JLyogSW5pdCBjbG9jayBzdWJzeXN0ZW0gKi8KLQlhdDkxX2Nsb2NrX2luaXQobWFpbl9jbG9jayk7Ci0KLQkvKiBSZWdpc3RlciB0aGUgcHJvY2Vzc29yLXNwZWNpZmljIGNsb2NrcyAqLwotCWF0OTFzYW05MjYxX3JlZ2lzdGVyX2Nsb2NrcygpOwotCiAJLyogUmVnaXN0ZXIgR1BJTyBzdWJzeXN0ZW0gKi8KIAlhdDkxX2dwaW9faW5pdChhdDkxc2FtOTI2MV9ncGlvLCAzKTsKIH0KQEAgLTM3MiwxNCArMzM3LDkgQEAKIAkwLAkvKiBBZHZhbmNlZCBJbnRlcnJ1cHQgQ29udHJvbGxlciAqLwogfTsKIAotdm9pZCBfX2luaXQgYXQ5MXNhbTkyNjFfaW5pdF9pbnRlcnJ1cHRzKHVuc2lnbmVkIGludCBwcmlvcml0eVtOUl9BSUNfSVJRU10pCi17Ci0JaWYgKCFwcmlvcml0eSkKLQkJcHJpb3JpdHkgPSBhdDkxc2FtOTI2MV9kZWZhdWx0X2lycV9wcmlvcml0eTsKLQotCS8qIEluaXRpYWxpemUgdGhlIEFJQyBpbnRlcnJ1cHQgY29udHJvbGxlciAqLwotCWF0OTFfYWljX2luaXQocHJpb3JpdHkpOwotCi0JLyogRW5hYmxlIEdQSU8gaW50ZXJydXB0cyAqLwotCWF0OTFfZ3Bpb19pcnFfc2V0dXAoKTsKLX0KK3N0cnVjdCBhdDkxX2luaXRfc29jIF9faW5pdGRhdGEgYXQ5MXNhbTkyNjFfc29jID0geworCS5tYXBfaW8gPSBhdDkxc2FtOTI2MV9tYXBfaW8sCisJLmRlZmF1bHRfaXJxX3ByaW9yaXR5ID0gYXQ5MXNhbTkyNjFfZGVmYXVsdF9pcnFfcHJpb3JpdHksCisJLnJlZ2lzdGVyX2Nsb2NrcyA9IGF0OTFzYW05MjYxX3JlZ2lzdGVyX2Nsb2NrcywKKwkuaW5pdCA9IGF0OTFzYW05MjYxX2luaXRpYWxpemUsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjMuYwppbmRleCBkYzI4NDc3Li4wNDRmM2M5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjMuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjMuYwpAQCAtMjEsMjggKzIxLDEwIEBACiAjaW5jbHVkZSA8bWFjaC9hdDkxX3JzdGMuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFfc2hkd2MuaD4KIAorI2luY2x1ZGUgInNvYy5oIgogI2luY2x1ZGUgImdlbmVyaWMuaCIKICNpbmNsdWRlICJjbG9jay5oIgogCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIGF0OTFzYW05MjYzX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnZpcnR1YWwJPSBBVDkxX1ZBX0JBU0VfU1lTLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MV9CQVNFX1NZUyksCi0JCS5sZW5ndGgJCT0gU1pfMTZLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9IEFUOTFfSU9fVklSVF9CQVNFIC0gQVQ5MVNBTTkyNjNfU1JBTTBfU0laRSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFTQU05MjYzX1NSQU0wX0JBU0UpLAotCQkubGVuZ3RoCQk9IEFUOTFTQU05MjYzX1NSQU0wX1NJWkUsCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gQVQ5MV9JT19WSVJUX0JBU0UgLSBBVDkxU0FNOTI2M19TUkFNMF9TSVpFIC0gQVQ5MVNBTTkyNjNfU1JBTTFfU0laRSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFTQU05MjYzX1NSQU0xX0JBU0UpLAotCQkubGVuZ3RoCQk9IEFUOTFTQU05MjYzX1NSQU0xX1NJWkUsCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LAotfTsKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqICBDbG9ja3MKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zMTMsMjQgKzI5NSwxOCBAQAogICogIEFUOTFTQU05MjYzIHByb2Nlc3NvciBpbml0aWFsaXphdGlvbgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotdm9pZCBfX2luaXQgYXQ5MXNhbTkyNjNfbWFwX2lvKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MXNhbTkyNjNfbWFwX2lvKHZvaWQpCiB7Ci0JLyogTWFwIHBlcmlwaGVyYWxzICovCi0JaW90YWJsZV9pbml0KGF0OTFzYW05MjYzX2lvX2Rlc2MsIEFSUkFZX1NJWkUoYXQ5MXNhbTkyNjNfaW9fZGVzYykpOworCWF0OTFfaW5pdF9zcmFtKDAsIEFUOTFTQU05MjYzX1NSQU0wX0JBU0UsIEFUOTFTQU05MjYzX1NSQU0wX1NJWkUpOworCWF0OTFfaW5pdF9zcmFtKDEsIEFUOTFTQU05MjYzX1NSQU0xX0JBU0UsIEFUOTFTQU05MjYzX1NSQU0xX1NJWkUpOwogfQogCi12b2lkIF9faW5pdCBhdDkxc2FtOTI2M19pbml0aWFsaXplKHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jaykKK3N0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOTI2M19pbml0aWFsaXplKHZvaWQpCiB7CiAJYXQ5MV9hcmNoX3Jlc2V0ID0gYXQ5MXNhbTlfYWx0X3Jlc2V0OwogCXBtX3Bvd2VyX29mZiA9IGF0OTFzYW05MjYzX3Bvd2Vyb2ZmOwogCWF0OTFfZXh0ZXJuX2lycSA9ICgxIDw8IEFUOTFTQU05MjYzX0lEX0lSUTApIHwgKDEgPDwgQVQ5MVNBTTkyNjNfSURfSVJRMSk7CiAKLQkvKiBJbml0IGNsb2NrIHN1YnN5c3RlbSAqLwotCWF0OTFfY2xvY2tfaW5pdChtYWluX2Nsb2NrKTsKLQotCS8qIFJlZ2lzdGVyIHRoZSBwcm9jZXNzb3Itc3BlY2lmaWMgY2xvY2tzICovCi0JYXQ5MXNhbTkyNjNfcmVnaXN0ZXJfY2xvY2tzKCk7Ci0KIAkvKiBSZWdpc3RlciBHUElPIHN1YnN5c3RlbSAqLwogCWF0OTFfZ3Bpb19pbml0KGF0OTFzYW05MjYzX2dwaW8sIDUpOwogfQpAQCAtMzc3LDE0ICszNTMsOSBAQAogCTAsCS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyIChJUlExKSAqLwogfTsKIAotdm9pZCBfX2luaXQgYXQ5MXNhbTkyNjNfaW5pdF9pbnRlcnJ1cHRzKHVuc2lnbmVkIGludCBwcmlvcml0eVtOUl9BSUNfSVJRU10pCi17Ci0JaWYgKCFwcmlvcml0eSkKLQkJcHJpb3JpdHkgPSBhdDkxc2FtOTI2M19kZWZhdWx0X2lycV9wcmlvcml0eTsKLQotCS8qIEluaXRpYWxpemUgdGhlIEFJQyBpbnRlcnJ1cHQgY29udHJvbGxlciAqLwotCWF0OTFfYWljX2luaXQocHJpb3JpdHkpOwotCi0JLyogRW5hYmxlIEdQSU8gaW50ZXJydXB0cyAqLwotCWF0OTFfZ3Bpb19pcnFfc2V0dXAoKTsKLX0KK3N0cnVjdCBhdDkxX2luaXRfc29jIF9faW5pdGRhdGEgYXQ5MXNhbTkyNjNfc29jID0geworCS5tYXBfaW8gPSBhdDkxc2FtOTI2M19tYXBfaW8sCisJLmRlZmF1bHRfaXJxX3ByaW9yaXR5ID0gYXQ5MXNhbTkyNjNfZGVmYXVsdF9pcnFfcHJpb3JpdHksCisJLnJlZ2lzdGVyX2Nsb2NrcyA9IGF0OTFzYW05MjYzX3JlZ2lzdGVyX2Nsb2NrcywKKwkuaW5pdCA9IGF0OTFzYW05MjYzX2luaXRpYWxpemUsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05ZzQ1LmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlnNDUuYwppbmRleCAxMWUyMTQxLi5lMDRjNWZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlnNDUuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlnNDUuYwpAQCAtMjIsMjMgKzIyLDEwIEBACiAjaW5jbHVkZSA8bWFjaC9hdDkxX3NoZHdjLmg+CiAjaW5jbHVkZSA8bWFjaC9jcHUuaD4KIAorI2luY2x1ZGUgInNvYy5oIgogI2luY2x1ZGUgImdlbmVyaWMuaCIKICNpbmNsdWRlICJjbG9jay5oIgogCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIGF0OTFzYW05ZzQ1X2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnZpcnR1YWwJPSBBVDkxX1ZBX0JBU0VfU1lTLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MV9CQVNFX1NZUyksCi0JCS5sZW5ndGgJCT0gU1pfMTZLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9IEFUOTFfSU9fVklSVF9CQVNFIC0gQVQ5MVNBTTlHNDVfU1JBTV9TSVpFLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MVNBTTlHNDVfU1JBTV9CQVNFKSwKLQkJLmxlbmd0aAkJPSBBVDkxU0FNOUc0NV9TUkFNX1NJWkUsCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9Ci19OwotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogIENsb2NrcwogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTMyOSwyNCArMzE2LDE3IEBACiAgKiAgQVQ5MVNBTTlHNDUgcHJvY2Vzc29yIGluaXRpYWxpemF0aW9uCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi12b2lkIF9faW5pdCBhdDkxc2FtOWc0NV9tYXBfaW8odm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOWc0NV9tYXBfaW8odm9pZCkKIHsKLQkvKiBNYXAgcGVyaXBoZXJhbHMgKi8KLQlpb3RhYmxlX2luaXQoYXQ5MXNhbTlnNDVfaW9fZGVzYywgQVJSQVlfU0laRShhdDkxc2FtOWc0NV9pb19kZXNjKSk7CisJYXQ5MV9pbml0X3NyYW0oMCwgQVQ5MVNBTTlHNDVfU1JBTV9CQVNFLCBBVDkxU0FNOUc0NV9TUkFNX1NJWkUpOwogfQogCi12b2lkIF9faW5pdCBhdDkxc2FtOWc0NV9pbml0aWFsaXplKHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jaykKK3N0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOWc0NV9pbml0aWFsaXplKHZvaWQpCiB7CiAJYXQ5MV9hcmNoX3Jlc2V0ID0gYXQ5MXNhbTlnNDVfcmVzZXQ7CiAJcG1fcG93ZXJfb2ZmID0gYXQ5MXNhbTlnNDVfcG93ZXJvZmY7CiAJYXQ5MV9leHRlcm5faXJxID0gKDEgPDwgQVQ5MVNBTTlHNDVfSURfSVJRMCk7CiAKLQkvKiBJbml0IGNsb2NrIHN1YnN5c3RlbSAqLwotCWF0OTFfY2xvY2tfaW5pdChtYWluX2Nsb2NrKTsKLQotCS8qIFJlZ2lzdGVyIHRoZSBwcm9jZXNzb3Itc3BlY2lmaWMgY2xvY2tzICovCi0JYXQ5MXNhbTlnNDVfcmVnaXN0ZXJfY2xvY2tzKCk7Ci0KIAkvKiBSZWdpc3RlciBHUElPIHN1YnN5c3RlbSAqLwogCWF0OTFfZ3Bpb19pbml0KGF0OTFzYW05ZzQ1X2dwaW8sIDUpOwogfQpAQCAtMzkzLDE0ICszNzMsOSBAQAogCTAsCS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyIChJUlEwKSAqLwogfTsKIAotdm9pZCBfX2luaXQgYXQ5MXNhbTlnNDVfaW5pdF9pbnRlcnJ1cHRzKHVuc2lnbmVkIGludCBwcmlvcml0eVtOUl9BSUNfSVJRU10pCi17Ci0JaWYgKCFwcmlvcml0eSkKLQkJcHJpb3JpdHkgPSBhdDkxc2FtOWc0NV9kZWZhdWx0X2lycV9wcmlvcml0eTsKLQotCS8qIEluaXRpYWxpemUgdGhlIEFJQyBpbnRlcnJ1cHQgY29udHJvbGxlciAqLwotCWF0OTFfYWljX2luaXQocHJpb3JpdHkpOwotCi0JLyogRW5hYmxlIEdQSU8gaW50ZXJydXB0cyAqLwotCWF0OTFfZ3Bpb19pcnFfc2V0dXAoKTsKLX0KK3N0cnVjdCBhdDkxX2luaXRfc29jIF9faW5pdGRhdGEgYXQ5MXNhbTlnNDVfc29jID0geworCS5tYXBfaW8gPSBhdDkxc2FtOWc0NV9tYXBfaW8sCisJLmRlZmF1bHRfaXJxX3ByaW9yaXR5ID0gYXQ5MXNhbTlnNDVfZGVmYXVsdF9pcnFfcHJpb3JpdHksCisJLnJlZ2lzdGVyX2Nsb2NrcyA9IGF0OTFzYW05ZzQ1X3JlZ2lzdGVyX2Nsb2NrcywKKwkuaW5pdCA9IGF0OTFzYW05ZzQ1X2luaXRpYWxpemUsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmwuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsLmMKaW5kZXggMjlkZmYxOC4uYTIzODEwNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmwuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybC5jCkBAIC0xNiwzMCArMTYsMTYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9jcHUuaD4KKyNpbmNsdWRlIDxtYWNoL2F0OTFfZGJndS5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTlybC5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9wbWMuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFfcnN0Yy5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9zaGR3Yy5oPgogCisjaW5jbHVkZSAic29jLmgiCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImNsb2NrLmgiCiAKLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYXQ5MXNhbTlybF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS52aXJ0dWFsCT0gQVQ5MV9WQV9CQVNFX1NZUywKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFfQkFTRV9TWVMpLAotCQkubGVuZ3RoCQk9IFNaXzE2SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIGF0OTFzYW05cmxfc3JhbV9kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxU0FNOVJMX1NSQU1fQkFTRSksCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9Ci19OwotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogIENsb2NrcwogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTI4NywxNiArMjczLDExIEBACiAgKiAgQVQ5MVNBTTlSTCBwcm9jZXNzb3IgaW5pdGlhbGl6YXRpb24KICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXZvaWQgX19pbml0IGF0OTFzYW05cmxfbWFwX2lvKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MXNhbTlybF9tYXBfaW8odm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGNpZHIsIHNyYW1fc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHNyYW1fc2l6ZTsKIAotCS8qIE1hcCBwZXJpcGhlcmFscyAqLwotCWlvdGFibGVfaW5pdChhdDkxc2FtOXJsX2lvX2Rlc2MsIEFSUkFZX1NJWkUoYXQ5MXNhbTlybF9pb19kZXNjKSk7Ci0KLQljaWRyID0gYXQ5MV9zeXNfcmVhZChBVDkxX0RCR1VfQ0lEUik7Ci0KLQlzd2l0Y2ggKGNpZHIgJiBBVDkxX0NJRFJfU1JBTVNJWikgeworCXN3aXRjaCAoYXQ5MV9zb2NfaW5pdGRhdGEuY2lkciAmIEFUOTFfQ0lEUl9TUkFNU0laKSB7CiAJCWNhc2UgQVQ5MV9DSURSX1NSQU1TSVpfMzJLOgogCQkJc3JhbV9zaXplID0gMiAqIFNaXzE2SzsKIAkJCWJyZWFrOwpAQCAtMzA1LDI1ICsyODYsMTYgQEAKIAkJCXNyYW1fc2l6ZSA9IFNaXzE2SzsKIAl9CiAKLQlhdDkxc2FtOXJsX3NyYW1fZGVzYy0+dmlydHVhbCA9IEFUOTFfSU9fVklSVF9CQVNFIC0gc3JhbV9zaXplOwotCWF0OTFzYW05cmxfc3JhbV9kZXNjLT5sZW5ndGggPSBzcmFtX3NpemU7Ci0KIAkvKiBNYXAgU1JBTSAqLwotCWlvdGFibGVfaW5pdChhdDkxc2FtOXJsX3NyYW1fZGVzYywgQVJSQVlfU0laRShhdDkxc2FtOXJsX3NyYW1fZGVzYykpOworCWF0OTFfaW5pdF9zcmFtKDAsIEFUOTFTQU05UkxfU1JBTV9CQVNFLCBzcmFtX3NpemUpOwogfQogCi12b2lkIF9faW5pdCBhdDkxc2FtOXJsX2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKQorc3RhdGljIHZvaWQgX19pbml0IGF0OTFzYW05cmxfaW5pdGlhbGl6ZSh2b2lkKQogewogCWF0OTFfYXJjaF9yZXNldCA9IGF0OTFzYW05X2FsdF9yZXNldDsKIAlwbV9wb3dlcl9vZmYgPSBhdDkxc2FtOXJsX3Bvd2Vyb2ZmOwogCWF0OTFfZXh0ZXJuX2lycSA9ICgxIDw8IEFUOTFTQU05UkxfSURfSVJRMCk7CiAKLQkvKiBJbml0IGNsb2NrIHN1YnN5c3RlbSAqLwotCWF0OTFfY2xvY2tfaW5pdChtYWluX2Nsb2NrKTsKLQotCS8qIFJlZ2lzdGVyIHRoZSBwcm9jZXNzb3Itc3BlY2lmaWMgY2xvY2tzICovCi0JYXQ5MXNhbTlybF9yZWdpc3Rlcl9jbG9ja3MoKTsKLQogCS8qIFJlZ2lzdGVyIEdQSU8gc3Vic3lzdGVtICovCiAJYXQ5MV9ncGlvX2luaXQoYXQ5MXNhbTlybF9ncGlvLCA0KTsKIH0KQEAgLTM3MCwxNCArMzQyLDkgQEAKIAkwLAkvKiBBZHZhbmNlZCBJbnRlcnJ1cHQgQ29udHJvbGxlciAqLwogfTsKIAotdm9pZCBfX2luaXQgYXQ5MXNhbTlybF9pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W05SX0FJQ19JUlFTXSkKLXsKLQlpZiAoIXByaW9yaXR5KQotCQlwcmlvcml0eSA9IGF0OTFzYW05cmxfZGVmYXVsdF9pcnFfcHJpb3JpdHk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBBSUMgaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KLQlhdDkxX2FpY19pbml0KHByaW9yaXR5KTsKLQotCS8qIEVuYWJsZSBHUElPIGludGVycnVwdHMgKi8KLQlhdDkxX2dwaW9faXJxX3NldHVwKCk7Ci19CitzdHJ1Y3QgYXQ5MV9pbml0X3NvYyBfX2luaXRkYXRhIGF0OTFzYW05cmxfc29jID0geworCS5tYXBfaW8gPSBhdDkxc2FtOXJsX21hcF9pbywKKwkuZGVmYXVsdF9pcnFfcHJpb3JpdHkgPSBhdDkxc2FtOXJsX2RlZmF1bHRfaXJxX3ByaW9yaXR5LAorCS5yZWdpc3Rlcl9jbG9ja3MgPSBhdDkxc2FtOXJsX3JlZ2lzdGVyX2Nsb2NrcywKKwkuaW5pdCA9IGF0OTFzYW05cmxfaW5pdGlhbGl6ZSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtMWFybS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLTFhcm0uYwppbmRleCBhYjFkNDYzLi41YWE1ODg1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtMWFybS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC0xYXJtLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAlhdDkxcm05MjAwX3NldF90eXBlKEFSQ0hfUkVWSVNPTl85MjAwX1BRRlApOwogCiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLwotCWF0OTFybTkyMDBfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKIAogCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtNjMsMTEgKzYzLDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG9uZWFybV9pbml0X2lycSh2b2lkKQotewotCWF0OTFybTkyMDBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCiBzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBvbmVhcm1fZXRoX2RhdGEgPSB7CiAJLnBoeV9pcnFfcGluCT0gQVQ5MV9QSU5fUEM0LAogCS5pc19ybWlpCT0gMSwKQEAgLTk3LDggKzkyLDggQEAKIE1BQ0hJTkVfU1RBUlQoT05FQVJNLCAiQWplY28gMUFSTSBzaW5nbGUgYm9hcmQgY29tcHV0ZXIiKQogCS8qIE1haW50YWluZXI6IExlbm5lcnQgQnV5dGVuaGVrIDxidXl0ZW5oQHdhbnRzdG9mbHkub3JnPiAqLwogCS50aW1lcgkJPSAmYXQ5MXJtOTIwMF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFybTkyMDBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBvbmVhcm1faW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBvbmVhcm1faW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBvbmVhcm1fYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtYWZlYi05MjYwdjEuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1hZmViLTkyNjB2MS5jCmluZGV4IGE0OTI0ZGUuLmIwYzc5NmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1hZmViLTkyNjB2MS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1hZmViLTkyNjB2MS5jCkBAIC01MSw3ICs1MSw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgYWZlYjkyNjBfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxOC40MzIgTUh6IGNyeXN0YWwgKi8KLQlhdDkxc2FtOTI2MF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC03MCwxMiArNzAsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgYWZlYjkyNjBfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOTI2MF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KLQogLyoKICAqIFVTQiBIb3N0IHBvcnQKICAqLwpAQCAtMjE5LDkgKzIxMyw5IEBACiBNQUNISU5FX1NUQVJUKEFGRUI5MjYwLCAiQ3VzdG9tIGFmZWI5MjYwIGJvYXJkIikKIAkvKiBNYWludGFpbmVyOiBTZXJnZXkgTGFwaW4gPHNsYXBpbkBvc3NmYW5zLm9yZz4gKi8KIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTkyNjBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBhZmViOTI2MF9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGFmZWI5MjYwX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gYWZlYjkyNjBfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYW02MC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhbTYwLmMKaW5kZXggMTQ4ZmNjYi4uZDFhYmQ1OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhbTYwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhbTYwLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBjYW02MF9pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDEwIE1IeiBjcnlzdGFsICovCi0JYXQ5MXNhbTkyNjBfaW5pdGlhbGl6ZSgxMDAwMDAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDEwMDAwMDAwKTsKIAogCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtNTcsMTIgKzU3LDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGNhbTYwX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXNhbTkyNjBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCi0KIC8qCiAgKiBVU0IgSG9zdAogICovCkBAIC0xOTksOCArMTkzLDggQEAKIE1BQ0hJTkVfU1RBUlQoQ0FNNjAsICJLd2lrQnl0ZSBDQU02MCIpCiAJLyogTWFpbnRhaW5lcjogS3dpa0J5dGUgKi8KIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTkyNjBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBjYW02MF9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGNhbTYwX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gY2FtNjBfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FwOWFkay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcDlhZGsuYwppbmRleCBjZGI2NWQ0Li42NzliMGI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FwOWFkay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXA5YWRrLmMKQEAgLTUzLDcgKzUzLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBjYXA5YWRrX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTIgTUh6IGNyeXN0YWwgKi8KLQlhdDkxY2FwOV9pbml0aWFsaXplKDEyMDAwMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTIwMDAwMDApOwogCiAJLyogU2V0dXAgdGhlIExFRHM6IFVTRVIxIGFuZCBVU0VSMiBMRUQgZm9yIGNwdS90aW1lci4uLiAqLwogCWF0OTFfaW5pdF9sZWRzKEFUOTFfUElOX1BBMTAsIEFUOTFfUElOX1BBMTEpOwpAQCAtNjUsMTIgKzY1LDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGNhcDlhZGtfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxY2FwOV9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KLQogLyoKICAqIFVTQiBIb3N0IHBvcnQKICAqLwpAQCAtMzk3LDggKzM5MSw4IEBACiBNQUNISU5FX1NUQVJUKEFUOTFDQVA5QURLLCAiQXRtZWwgQVQ5MUNBUDlBLURLIikKIAkvKiBNYWludGFpbmVyOiBTdGVsaWFuIFBvcCA8c3RlbGlhbi5wb3BAbGVhZHRlY2hkZXNpZ24uY29tPiAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxY2FwOV9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGNhcDlhZGtfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBjYXA5YWRrX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gY2FwOWFka19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXJtZXZhLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FybWV2YS5jCmluZGV4IGYzNmIxODYuLmM1NzhjNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXJtZXZhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcm1ldmEuYwpAQCAtNDMsNyArNDMsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGNhcm1ldmFfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAyMC4wMDAgTUh6IGNyeXN0YWwgKi8KLQlhdDkxcm05MjAwX2luaXRpYWxpemUoMjAwMDAwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgyMDAwMDAwMCk7CiAKIAkvKiBEQkdVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTU3LDExICs1Nyw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBjYXJtZXZhX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXJtOTIwMF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSBfX2luaXRkYXRhIGNhcm1ldmFfZXRoX2RhdGEgPSB7CiAJLnBoeV9pcnFfcGluCT0gQVQ5MV9QSU5fUEM0LAogCS5pc19ybWlpCT0gMSwKQEAgLTE2Myw4ICsxNTgsOCBAQAogTUFDSElORV9TVEFSVChDQVJNRVZBLCAiQ2FybWV2YSIpCiAJLyogTWFpbnRhaW5lcjogQ29uaXRlYyBEYXRhc3lzdGVtcyAqLwogCS50aW1lcgkJPSAmYXQ5MXJtOTIwMF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFybTkyMDBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBjYXJtZXZhX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gY2FybWV2YV9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGNhcm1ldmFfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3B1OWtyZWEuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jcHU5a3JlYS5jCmluZGV4IDk4MDUxMTAuLmY0ZGE4YTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jcHU5a3JlYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jcHU5a3JlYS5jCkBAIC01MCw3ICs1MCw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgY3B1OWtyZWFfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxOC40MzIgTUh6IGNyeXN0YWwgKi8KLQlhdDkxc2FtOTI2MF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogREdCVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC04MSwxMSArODEsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgY3B1OWtyZWFfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOTI2MF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KIC8qCiAgKiBVU0IgSG9zdCBwb3J0CiAgKi8KQEAgLTM3Niw4ICszNzEsOCBAQAogI2VuZGlmCiAJLyogTWFpbnRhaW5lcjogRXJpYyBCZW5hcmQgLSBFVUtSRUEgRWxlY3Ryb21hdGlxdWUgKi8KIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTkyNjBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBjcHU5a3JlYV9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGNwdTlrcmVhX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gY3B1OWtyZWFfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3B1YXQ5MS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNwdWF0OTEuYwppbmRleCA2ZGFhYmUzLi4yZDkxOWY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3B1YXQ5MS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jcHVhdDkxLmMKQEAgLTU3LDcgKzU3LDcgQEAKIAlhdDkxcm05MjAwX3NldF90eXBlKEFSQ0hfUkVWSVNPTl85MjAwX1BRRlApOwogCiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLwotCWF0OTFybTkyMDBfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKIAogCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtODIsMTEgKzgyLDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGNwdWF0OTFfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxcm05MjAwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQogc3RhdGljIHN0cnVjdCBhdDkxX2V0aF9kYXRhIF9faW5pdGRhdGEgY3B1YXQ5MV9ldGhfZGF0YSA9IHsKIAkuaXNfcm1paQk9IDEsCiB9OwpAQCAtMTgwLDggKzE3NSw4IEBACiBNQUNISU5FX1NUQVJUKENQVUFUOTEsICJFdWtyZWEiKQogCS8qIE1haW50YWluZXI6IEVyaWMgQmVuYXJkIC0gRVVLUkVBIEVsZWN0cm9tYXRpcXVlICovCiAJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXJtOTIwMF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGNwdWF0OTFfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBjcHVhdDkxX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gY3B1YXQ5MV9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2IzMzcuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2IzMzcuYwppbmRleCBkOThiY2VjLi4xNzY1NGQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3NiMzM3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjMzNy5jCkBAIC00Niw3ICs0Niw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgY3NiMzM3X2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMy42ODY0IE1IeiBjcnlzdGFsICovCi0JYXQ5MXJtOTIwMF9pbml0aWFsaXplKDM2ODY0MDApOworCWF0OTFfaW5pdGlhbGl6ZSgzNjg2NDAwKTsKIAogCS8qIFNldHVwIHRoZSBMRURzICovCiAJYXQ5MV9pbml0X2xlZHMoQVQ5MV9QSU5fUEIwLCBBVDkxX1BJTl9QQjEpOwpAQCAtNTgsMTEgKzU4LDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGNzYjMzN19pbml0X2lycSh2b2lkKQotewotCWF0OTFybTkyMDBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCiBzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBjc2IzMzdfZXRoX2RhdGEgPSB7CiAJLnBoeV9pcnFfcGluCT0gQVQ5MV9QSU5fUEMyLAogCS5pc19ybWlpCT0gMCwKQEAgLTI1OCw4ICsyNTMsOCBAQAogTUFDSElORV9TVEFSVChDU0IzMzcsICJDb2dlbnQgQ1NCMzM3IikKIAkvKiBNYWludGFpbmVyOiBCaWxsIEdhdGxpZmYgKi8KIAkudGltZXIJCT0gJmF0OTFybTkyMDBfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxcm05MjAwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gY3NiMzM3X2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gY3NiMzM3X2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gY3NiMzM3X2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjYzNy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjYzNy5jCmluZGV4IDAxOWFhYjQuLjcyYjU1NjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2I2MzcuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3NiNjM3LmMKQEAgLTQzLDcgKzQzLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBjc2I2MzdfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAzLjY4NjQgTUh6IGNyeXN0YWwgKi8KLQlhdDkxcm05MjAwX2luaXRpYWxpemUoMzY4NjQwMCk7CisJYXQ5MV9pbml0aWFsaXplKDM2ODY0MDApOwogCiAJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC01MiwxMSArNTIsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgY3NiNjM3X2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXJtOTIwMF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSBfX2luaXRkYXRhIGNzYjYzN19ldGhfZGF0YSA9IHsKIAkucGh5X2lycV9waW4JPSBBVDkxX1BJTl9QQzAsCiAJLmlzX3JtaWkJPSAwLApAQCAtMTM5LDggKzEzNCw4IEBACiBNQUNISU5FX1NUQVJUKENTQjYzNywgIkNvZ2VudCBDU0I2MzciKQogCS8qIE1haW50YWluZXI6IEJpbGwgR2F0bGlmZiAqLwogCS50aW1lcgkJPSAmYXQ5MXJtOTIwMF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFybTkyMDBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBjc2I2MzdfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBjc2I2MzdfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBjc2I2MzdfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWI5MjAwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWI5MjAwLmMKaW5kZXggZTk0ODQ1My4uMDExNzBhMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWViOTIwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lYjkyMDAuYwpAQCAtNDMsNyArNDMsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGViOTIwMF9pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLwotCWF0OTFybTkyMDBfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKIAogCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtNjAsMTEgKzYwLDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGViOTIwMF9pbml0X2lycSh2b2lkKQotewotCWF0OTFybTkyMDBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCiBzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBlYjkyMDBfZXRoX2RhdGEgPSB7CiAJLnBoeV9pcnFfcGluCT0gQVQ5MV9QSU5fUEM0LAogCS5pc19ybWlpCT0gMSwKQEAgLTEyMSw4ICsxMTYsOCBAQAogCiBNQUNISU5FX1NUQVJUKEFURUI5MjAwLCAiRW1iZXN0IEFURUI5MjAwIikKIAkudGltZXIJCT0gJmF0OTFybTkyMDBfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxcm05MjAwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gZWI5MjAwX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gZWI5MjAwX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gZWI5MjAwX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWVjYmF0OTEuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lY2JhdDkxLmMKaW5kZXggYTZmNTdmYS4uN2MwMzEzYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWVjYmF0OTEuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWNiYXQ5MS5jCkBAIC00OSw3ICs0OSw3IEBACiAJYXQ5MXJtOTIwMF9zZXRfdHlwZShBUkNIX1JFVklTT05fOTIwMF9QUUZQKTsKIAogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxOC40MzIgTUh6IGNyeXN0YWwgKi8KLQlhdDkxcm05MjAwX2luaXRpYWxpemUoMTg0MzIwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CiAKIAkvKiBTZXR1cCB0aGUgTEVEcyAqLwogCWF0OTFfaW5pdF9sZWRzKEFUOTFfUElOX1BDNywgQVQ5MV9QSU5fUEM3KTsKQEAgLTY0LDExICs2NCw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBlY2JfYXQ5MWluaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXJtOTIwMF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSBfX2luaXRkYXRhIGVjYl9hdDkxZXRoX2RhdGEgPSB7CiAJLnBoeV9pcnFfcGluCT0gQVQ5MV9QSU5fUEM0LAogCS5pc19ybWlpCT0gMCwKQEAgLTE3Myw4ICsxNjgsOCBAQAogTUFDSElORV9TVEFSVChFQ0JBVDkxLCAiZW1RYml0J3MgRUNCX0FUOTEiKQogCS8qIE1haW50YWluZXI6IGVtUWJpdC5jb20gKi8KIAkudGltZXIJCT0gJmF0OTFybTkyMDBfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxcm05MjAwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gZWNiX2F0OTFpbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGVjYl9hdDkxaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBlY2JfYXQ5MWJvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWVjbzkyMC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWVjbzkyMC5jCmluZGV4IGJmYzAwNjIuLjgyNTJjNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lY285MjAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWNvOTIwLmMKQEAgLTM1LDcgKzM1LDcgQEAKIAkvKiBTZXQgY3B1IHR5cGU6IFBRRlAgKi8KIAlhdDkxcm05MjAwX3NldF90eXBlKEFSQ0hfUkVWSVNPTl85MjAwX1BRRlApOwogCi0JYXQ5MXJtOTIwMF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogU2V0dXAgdGhlIExFRHMgKi8KIAlhdDkxX2luaXRfbGVkcyhBVDkxX1BJTl9QQjAsIEFUOTFfUElOX1BCMSk7CkBAIC00NywxMSArNDcsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZWNvOTIwX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXJtOTIwMF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSBfX2luaXRkYXRhIGVjbzkyMF9ldGhfZGF0YSA9IHsKIAkucGh5X2lycV9waW4JPSBBVDkxX1BJTl9QQzIsCiAJLmlzX3JtaWkJPSAxLApAQCAtMTM1LDggKzEzMCw4IEBACiBNQUNISU5FX1NUQVJUKEVDTzkyMCwgImVjbzkyMCIpCiAJLyogTWFpbnRhaW5lcjogU2FzY2hhIEhhdWVyICovCiAJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXJtOTIwMF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGVjbzkyMF9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGVjbzkyMF9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGVjbzkyMF9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1mbGV4aWJpdHkuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1mbGV4aWJpdHkuYwppbmRleCA0NjZjMDYzLi40YzNmNjVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZmxleGliaXR5LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWZsZXhpYml0eS5jCkBAIC00MCw3ICs0MCw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgZmxleGliaXR5X2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTguNDMyIE1IeiBjcnlzdGFsICovCi0JYXQ5MXNhbTkyNjBfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKIAogCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtNDksMTEgKzQ5LDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGZsZXhpYml0eV9pbml0X2lycSh2b2lkKQotewotCWF0OTFzYW05MjYwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQogLyogVVNCIEhvc3QgcG9ydCAqLwogc3RhdGljIHN0cnVjdCBhdDkxX3VzYmhfZGF0YSBfX2luaXRkYXRhIGZsZXhpYml0eV91c2JoX2RhdGEgPSB7CiAJLnBvcnRzCQk9IDIsCkBAIC0xNTUsOCArMTUwLDggQEAKIE1BQ0hJTkVfU1RBUlQoRkxFWElCSVRZLCAiRmxleGliaXR5IENvbm5lY3QiKQogCS8qIE1haW50YWluZXI6IE1heGltIE9zaXBvdiAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2MF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGZsZXhpYml0eV9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGZsZXhpYml0eV9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGZsZXhpYml0eV9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1mb3hnMjAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1mb3hnMjAuYwppbmRleCBlMmQxZGM5Li5mMjdkMWE3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZm94ZzIwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWZveGcyMC5jCkBAIC02MCw3ICs2MCw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgZm94ZzIwX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTguNDMyIE1IeiBjcnlzdGFsICovCi0JYXQ5MXNhbTkyNjBfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKIAogCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtMTAxLDEyICsxMDEsNiBAQAogCiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBmb3hnMjBfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOTI2MF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KLQogLyoKICAqIFVTQiBIb3N0IHBvcnQKICAqLwpAQCAtMjY3LDggKzI2MSw4IEBACiBNQUNISU5FX1NUQVJUKEFDTUVORVRVU0ZPWEcyMCwgIkFjbWUgU3lzdGVtcyBzcmwgRk9YIEJvYXJkIEcyMCIpCiAJLyogTWFpbnRhaW5lcjogU2VyZ2lvIFRhbnppbGxpICovCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFzYW05MjYwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gZm94ZzIwX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gZm94ZzIwX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gZm94ZzIwX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWdzaWExOHMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1nc2lhMThzLmMKaW5kZXggMWQ0ZjM2Yi4uMmU5NTk0OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWdzaWExOHMuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZ3NpYTE4cy5jCkBAIC03NSwxMSArNzUsNiBAQAogCWF0OTFfcmVnaXN0ZXJfdWFydChBVDkxU0FNOTI2MF9JRF9VUzQsIDUsIDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOTI2MF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KIC8qCiAgKiBUd28gVVNCIEhvc3QgcG9ydHMKICAqLwpAQCAtNTc3LDggKzU3Miw4IEBACiAKIE1BQ0hJTkVfU1RBUlQoR1NJQTE4UywgIkdTX0lBMThfUyIpCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFzYW05MjYwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gZ3NpYTE4c19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGluaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gZ3NpYTE4c19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1rYWZhLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQta2FmYS5jCmluZGV4IDliMDAzZmYuLjRhMTcwODkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1rYWZhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWthZmEuYwpAQCAtNDYsNyArNDYsNyBAQAogCWF0OTFybTkyMDBfc2V0X3R5cGUoQVJDSF9SRVZJU09OXzkyMDBfUFFGUCk7CiAKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTguNDMyIE1IeiBjcnlzdGFsICovCi0JYXQ5MXJtOTIwMF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogU2V0IHVwIHRoZSBMRURzICovCiAJYXQ5MV9pbml0X2xlZHMoQVQ5MV9QSU5fUEI0LCBBVDkxX1BJTl9QQjQpOwpAQCAtNjEsMTEgKzYxLDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGthZmFfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxcm05MjAwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQogc3RhdGljIHN0cnVjdCBhdDkxX2V0aF9kYXRhIF9faW5pdGRhdGEga2FmYV9ldGhfZGF0YSA9IHsKIAkucGh5X2lycV9waW4JPSBBVDkxX1BJTl9QQzQsCiAJLmlzX3JtaWkJPSAwLApAQCAtOTksOCArOTQsOCBAQAogTUFDSElORV9TVEFSVChLQUZBLCAiU3BlcnJ5LVN1biBLQUZBIikKIAkvKiBNYWludGFpbmVyOiBTZXJnZWkgU2hhcm9ub3YgKi8KIAkudGltZXIJCT0gJmF0OTFybTkyMDBfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxcm05MjAwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0ga2FmYV9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGthZmFfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBrYWZhX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWtiOTIwMi5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWtiOTIwMi5jCmluZGV4IGE4MTNhNzQuLjlkYzhkNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1rYjkyMDIuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQta2I5MjAyLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIAlhdDkxcm05MjAwX3NldF90eXBlKEFSQ0hfUkVWSVNPTl85MjAwX1BRRlApOwogCiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDEwIE1IeiBjcnlzdGFsICovCi0JYXQ5MXJtOTIwMF9pbml0aWFsaXplKDEwMDAwMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTAwMDAwMDApOwogCiAJLyogU2V0IHVwIHRoZSBMRURzICovCiAJYXQ5MV9pbml0X2xlZHMoQVQ5MV9QSU5fUEMxOSwgQVQ5MV9QSU5fUEMxOCk7CkBAIC02OSwxMSArNjksNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQga2I5MjAyX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXJtOTIwMF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSBfX2luaXRkYXRhIGtiOTIwMl9ldGhfZGF0YSA9IHsKIAkucGh5X2lycV9waW4JPSBBVDkxX1BJTl9QQjI5LAogCS5pc19ybWlpCT0gMCwKQEAgLTE0MCw4ICsxMzUsOCBAQAogTUFDSElORV9TVEFSVChLQjkyMDAsICJLQjkyMHgiKQogCS8qIE1haW50YWluZXI6IEt3aWtCeXRlLCBJbmMuICovCiAJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXJtOTIwMF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGtiOTIwMl9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGtiOTIwMl9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGtiOTIwMl9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1uZW9jb3JlOTI2LmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtbmVvY29yZTkyNi5jCmluZGV4IDk2MWU4MDUuLjliYzZhYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1uZW9jb3JlOTI2LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLW5lb2NvcmU5MjYuYwpAQCAtNTQsNyArNTQsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IG5lb2NvcmU5MjZfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAyMCBNSHogY3J5c3RhbCAqLwotCWF0OTFzYW05MjYzX2luaXRpYWxpemUoMjAwMDAwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgyMDAwMDAwMCk7CiAKIAkvKiBEQkdVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTY2LDEyICs2Niw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBuZW9jb3JlOTI2X2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXNhbTkyNjNfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCi0KIC8qCiAgKiBVU0IgSG9zdCBwb3J0CiAgKi8KQEAgLTM4OCw4ICszODIsOCBAQAogTUFDSElORV9TVEFSVChORU9DT1JFOTI2LCAiQURFTkVPIE5FT0NPUkUgOTI2IikKIAkvKiBNYWludGFpbmVyOiBBREVORU8gKi8KIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTkyNjNfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBuZW9jb3JlOTI2X2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gbmVvY29yZTkyNl9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IG5lb2NvcmU5MjZfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcGNvbnRyb2wtZzIwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcGNvbnRyb2wtZzIwLmMKaW5kZXggMjFhMjFhZi4uNDllM2Y2OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXBjb250cm9sLWcyMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1wY29udHJvbC1nMjAuYwpAQCAtNTMsMTMgKzUzLDYgQEAKIAlhdDkxX3JlZ2lzdGVyX3VhcnQoQVQ5MVNBTTkyNjBfSURfVVM0LCAzLCAwKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOTI2MF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KLQogc3RhdGljIHN0cnVjdCBzYW05X3NtY19jb25maWcgX19pbml0ZGF0YSBwY29udHJvbF9zbWNfY29uZmlnWzJdID0geyB7CiAJLm5jc19yZWFkX3NldHVwCQk9IDE2LAogCS5ucmRfc2V0dXAJCT0gMTgsCkBAIC0yMjMsOCArMjE2LDggQEAKIE1BQ0hJTkVfU1RBUlQoUENPTlRST0xfRzIwLCAiUENvbnRyb2wgRzIwIikKIAkvKiBNYWludGFpbmVyOiBwZ3NlbGxtYW5uQHBvcnRuZXItZWxla3Ryb25pay5hdCAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2MF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IHBjb250cm9sX2cyMF9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGluaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gcGNvbnRyb2xfZzIwX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXBpY290dXgyMDAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1waWNvdHV4MjAwLmMKaW5kZXggNzU2Y2MyYS4uYjdiODM5MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXBpY290dXgyMDAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcGljb3R1eDIwMC5jCkBAIC00Niw3ICs0Niw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgcGljb3R1eDIwMF9pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLwotCWF0OTFybTkyMDBfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKIAogCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtNjAsMTEgKzYwLDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHBpY290dXgyMDBfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxcm05MjAwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQogc3RhdGljIHN0cnVjdCBhdDkxX2V0aF9kYXRhIF9faW5pdGRhdGEgcGljb3R1eDIwMF9ldGhfZGF0YSA9IHsKIAkucGh5X2lycV9waW4JPSBBVDkxX1BJTl9QQzQsCiAJLmlzX3JtaWkJPSAxLApAQCAtMTI0LDggKzExOSw4IEBACiBNQUNISU5FX1NUQVJUKFBJQ09UVVgyWFgsICJwaWNvdHV4IDIwMCIpCiAJLyogTWFpbnRhaW5lcjogS2xlaW5oZW56IEVsZWt0cm9uaWsgR21iSCAqLwogCS50aW1lcgkJPSAmYXQ5MXJtOTIwMF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFybTkyMDBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBwaWNvdHV4MjAwX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gcGljb3R1eDIwMF9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IHBpY290dXgyMDBfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcWlsLWE5MjYwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcWlsLWE5MjYwLmMKaW5kZXggZDFhNjAwMS4uODFmOTExMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXFpbC1hOTI2MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1xaWwtYTkyNjAuYwpAQCAtNTEsNyArNTEsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTIuMDAwIE1IeiBjcnlzdGFsICovCi0JYXQ5MXNhbTkyNjBfaW5pdGlhbGl6ZSgxMjAwMDAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDEyMDAwMDAwKTsKIAogCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtNzIsMTIgKzcyLDYgQEAKIAogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOTI2MF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KLQogLyoKICAqIFVTQiBIb3N0IHBvcnQKICAqLwpAQCAtMjY5LDggKzI2Myw4IEBACiBNQUNISU5FX1NUQVJUKFFJTF9BOTI2MCwgIkNBTEFPIFFJTF9BOTI2MCIpCiAJLyogTWFpbnRhaW5lcjogY2FsYW8tc3lzdGVtcyAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2MF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGVrX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gZWtfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBla19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1ybTkyMDBkay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXJtOTIwMGRrLmMKaW5kZXggYWVmOTYyNy4uNmYwOGZhYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXJtOTIwMGRrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXJtOTIwMGRrLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBka19pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLwotCWF0OTFybTkyMDBfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKIAogCS8qIFNldHVwIHRoZSBMRURzICovCiAJYXQ5MV9pbml0X2xlZHMoQVQ5MV9QSU5fUEIyLCBBVDkxX1BJTl9QQjIpOwpAQCAtNjUsMTEgKzY1LDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGRrX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXJtOTIwMF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSBfX2luaXRkYXRhIGRrX2V0aF9kYXRhID0gewogCS5waHlfaXJxX3Bpbgk9IEFUOTFfUElOX1BDNCwKIAkuaXNfcm1paQk9IDEsCkBAIC0yMjgsOCArMjIzLDggQEAKIE1BQ0hJTkVfU1RBUlQoQVQ5MVJNOTIwMERLLCAiQXRtZWwgQVQ5MVJNOTIwMC1ESyIpCiAJLyogTWFpbnRhaW5lcjogU0FOIFBlb3BsZS9BdG1lbCAqLwogCS50aW1lcgkJPSAmYXQ5MXJtOTIwMF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFybTkyMDBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBka19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGRrX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gZGtfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcm05MjAwZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1ybTkyMDBlay5jCmluZGV4IDAxNWEwMjEuLjg1YmNjY2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1ybTkyMDBlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1ybTkyMDBlay5jCkBAIC00OCw3ICs0OCw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxOC40MzIgTUh6IGNyeXN0YWwgKi8KLQlhdDkxcm05MjAwX2luaXRpYWxpemUoMTg0MzIwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CiAKIAkvKiBTZXR1cCB0aGUgTEVEcyAqLwogCWF0OTFfaW5pdF9sZWRzKEFUOTFfUElOX1BCMSwgQVQ5MV9QSU5fUEIyKTsKQEAgLTY1LDExICs2NSw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2lycSh2b2lkKQotewotCWF0OTFybTkyMDBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCiBzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBla19ldGhfZGF0YSA9IHsKIAkucGh5X2lycV9waW4JPSBBVDkxX1BJTl9QQzQsCiAJLmlzX3JtaWkJPSAxLApAQCAtMTk0LDggKzE4OSw4IEBACiBNQUNISU5FX1NUQVJUKEFUOTFSTTkyMDBFSywgIkF0bWVsIEFUOTFSTTkyMDAtRUsiKQogCS8qIE1haW50YWluZXI6IFNBTiBQZW9wbGUvQXRtZWwgKi8KIAkudGltZXIJCT0gJmF0OTFybTkyMDBfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxcm05MjAwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gZWtfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBla19pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGVrX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTktbDkyNjAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05LWw5MjYwLmMKaW5kZXggYWFmMWJmMC4uNGQzYTAyZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTktbDkyNjAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOS1sOTI2MC5jCkBAIC00Nyw3ICs0Nyw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxOC40MzIgTUh6IGNyeXN0YWwgKi8KLQlhdDkxc2FtOTI2MF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogU2V0dXAgdGhlIExFRHMgKi8KIAlhdDkxX2luaXRfbGVkcyhBVDkxX1BJTl9QQTksIEFUOTFfUElOX1BBNik7CkBAIC02NywxMiArNjcsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOTI2MF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KLQogLyoKICAqIFVTQiBIb3N0IHBvcnQKICAqLwpAQCAtMjEzLDggKzIwNyw4IEBACiBNQUNISU5FX1NUQVJUKFNBTTlfTDkyNjAsICJPbGltZXggU0FNOS1MOTI2MCIpCiAJLyogTWFpbnRhaW5lcjogT2xpbWV4ICovCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFzYW05MjYwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gZWtfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBla19pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGVrX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjBlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjBlay5jCmluZGV4IDVjMjQwNzQuLjhhNTBjM2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYwZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MGVrLmMKQEAgLTUzLDcgKzUzLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLwotCWF0OTFzYW05MjYwX2luaXRpYWxpemUoMTg0MzIwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CiAKIAkvKiBEQkdVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTcwLDEyICs3MCw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2lycSh2b2lkKQotewotCWF0OTFzYW05MjYwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQotCiAvKgogICogVVNCIEhvc3QgcG9ydAogICovCkBAIC0zNTQsOCArMzQ4LDggQEAKIE1BQ0hJTkVfU1RBUlQoQVQ5MVNBTTkyNjBFSywgIkF0bWVsIEFUOTFTQU05MjYwLUVLIikKIAkvKiBNYWludGFpbmVyOiBBdG1lbCAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2MF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGVrX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gZWtfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBla19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYxZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYxZWsuYwppbmRleCBiNjBjMjJiLi41MDk2YTBlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MWVrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjFlay5jCkBAIC01Nyw3ICs1Nyw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxOC40MzIgTUh6IGNyeXN0YWwgKi8KLQlhdDkxc2FtOTI2MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogU2V0dXAgdGhlIExFRHMgKi8KIAlhdDkxX2luaXRfbGVkcyhBVDkxX1BJTl9QQTEzLCBBVDkxX1BJTl9QQTE0KTsKQEAgLTY5LDEyICs2OSw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2lycSh2b2lkKQotewotCWF0OTFzYW05MjYxX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQotCiAvKgogICogRE05MDAwIGV0aGVybmV0IGRldmljZQogICovCkBAIC02MjEsOCArNjE1LDggQEAKICNlbmRpZgogCS8qIE1haW50YWluZXI6IEF0bWVsICovCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFzYW05MjYxX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gZWtfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBla19pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGVrX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjNlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjNlay5jCmluZGV4IDliYmRjOTIuLmVhOGYxODUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYzZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2M2VrLmMKQEAgLTU2LDcgKzU2LDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE2LjM2NyBNSHogY3J5c3RhbCAqLwotCWF0OTFzYW05MjYzX2luaXRpYWxpemUoMTYzNjc2NjApOworCWF0OTFfaW5pdGlhbGl6ZSgxNjM2NzY2MCk7CiAKIAkvKiBEQkdVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTY4LDEyICs2OCw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2lycSh2b2lkKQotewotCWF0OTFzYW05MjYzX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQotCiAvKgogICogVVNCIEhvc3QgcG9ydAogICovCkBAIC00NTIsOCArNDQ2LDggQEAKIE1BQ0hJTkVfU1RBUlQoQVQ5MVNBTTkyNjNFSywgIkF0bWVsIEFUOTFTQU05MjYzLUVLIikKIAkvKiBNYWludGFpbmVyOiBBdG1lbCAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2M19tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGVrX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gZWtfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBla19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05ZzIwZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05ZzIwZWsuYwppbmRleCAxMzI1YTUwLi44MTdmNTlkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOWcyMGVrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlnMjBlay5jCkBAIC02NCw3ICs2NCw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxOC40MzIgTUh6IGNyeXN0YWwgKi8KLQlhdDkxc2FtOTI2MF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC04MSwxMiArODEsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOTI2MF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KLQogLyoKICAqIFVTQiBIb3N0IHBvcnQKICAqLwpAQCAtNDA0LDE3ICszOTgsMTcgQEAKIE1BQ0hJTkVfU1RBUlQoQVQ5MVNBTTlHMjBFSywgIkF0bWVsIEFUOTFTQU05RzIwLUVLIikKIAkvKiBNYWludGFpbmVyOiBBdG1lbCAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2MF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGVrX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gZWtfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBla19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChBVDkxU0FNOUcyMEVLXzJNTUMsICJBdG1lbCBBVDkxU0FNOUcyMC1FSyAyIE1NQyBTbG90IE1vZCIpCiAJLyogTWFpbnRhaW5lcjogQXRtZWwgKi8KIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTkyNjBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBla19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGVrX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gZWtfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOW0xMGc0NWVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOW0xMGc0NWVrLmMKaW5kZXggMzNlYWExMy4uYWQyMzRjYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTltMTBnNDVlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05bTEwZzQ1ZWsuYwpAQCAtNTAsNyArNTAsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTIuMDAwIE1IeiBjcnlzdGFsICovCi0JYXQ5MXNhbTlnNDVfaW5pdGlhbGl6ZSgxMjAwMDAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDEyMDAwMDAwKTsKIAogCS8qIERHQlUgb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtNjMsMTIgKzYzLDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXNhbTlnNDVfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCi0KIC8qCiAgKiBVU0IgSFMgSG9zdCBwb3J0IChjb21tb24gdG8gT0hDSSAmIEVIQ0kpCiAgKi8KQEAgLTQyMiw4ICs0MTYsOCBAQAogTUFDSElORV9TVEFSVChBVDkxU0FNOU0xMEc0NUVLLCAiQXRtZWwgQVQ5MVNBTTlNMTBHNDUtRUsiKQogCS8qIE1haW50YWluZXI6IEF0bWVsICovCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFzYW05ZzQ1X21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gZWtfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBla19pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGVrX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlybGVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOXJsZWsuYwppbmRleCBlZmZiMzk5Li40ZjE0YjU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOXJsZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOXJsZWsuYwpAQCAtNDEsNyArNDEsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTIuMDAwIE1IeiBjcnlzdGFsICovCi0JYXQ5MXNhbTlybF9pbml0aWFsaXplKDEyMDAwMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTIwMDAwMDApOwogCiAJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC01MywxMiArNTMsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOXJsX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQotCiAvKgogICogVVNCIEhTIERldmljZSBwb3J0CiAgKi8KQEAgLTMzMCw4ICszMjQsOCBAQAogTUFDSElORV9TVEFSVChBVDkxU0FNOVJMRUssICJBdG1lbCBBVDkxU0FNOVJMLUVLIikKIAkvKiBNYWludGFpbmVyOiBBdG1lbCAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOXJsX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gZWtfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBla19pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGVrX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNuYXBwZXI5MjYwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc25hcHBlcjkyNjAuYwppbmRleCA2MDEwY2UxLi5jNzNkMjVlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc25hcHBlcjkyNjAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc25hcHBlcjkyNjAuYwpAQCAtNDIsNyArNDIsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgc25hcHBlcjkyNjBfaW5pdF9lYXJseSh2b2lkKQogewotCWF0OTFzYW05MjYwX2luaXRpYWxpemUoMTg0MzIwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CiAKIAkvKiBEZWJ1ZyBvbiB0dHlTMCAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTU1LDExICs1NSw2IEBACiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KEFUOTFTQU05MjYwX0lEX1VTMiwgMywgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzbmFwcGVyOTI2MF9pbml0X2lycSh2b2lkKQotewotCWF0OTFzYW05MjYwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQogc3RhdGljIHN0cnVjdCBhdDkxX3VzYmhfZGF0YSBfX2luaXRkYXRhIHNuYXBwZXI5MjYwX3VzYmhfZGF0YSA9IHsKIAkucG9ydHMJCT0gMiwKIH07CkBAIC0xNzksOSArMTc0LDkgQEAKIAogTUFDSElORV9TVEFSVChTTkFQUEVSXzkyNjAsICJCbHVld2F0ZXIgU3lzdGVtcyBTbmFwcGVyIDkyNjAvOUcyMCBtb2R1bGUiKQogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2MF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IHNuYXBwZXI5MjYwX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gc25hcHBlcjkyNjBfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBzbmFwcGVyOTI2MF9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXN0YW1wOWcyMC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXN0YW1wOWcyMC5jCmluZGV4IDVlNWM4NTYuLjkzNmU1ZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zdGFtcDlnMjAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc3RhbXA5ZzIwLmMKQEAgLTM1LDcgKzM1LDcgQEAKIHZvaWQgX19pbml0IHN0YW1wOWcyMF9pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLwotCWF0OTFzYW05MjYwX2luaXRpYWxpemUoMTg0MzIwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CiAKIAkvKiBER0JVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTc2LDEyICs3Niw2IEBACiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KEFUOTFTQU05MjYwX0lEX1VTNSwgNiwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2lycSh2b2lkKQotewotCWF0OTFzYW05MjYwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQotCiAvKgogICogTkFORCBmbGFzaAogICovCkBAIC0yOTksMTcgKzI5MywxNyBAQAogTUFDSElORV9TVEFSVChQT1JUVVhHMjAsICJ0YXNraXQgUG9ydHV4RzIwIikKIAkvKiBNYWludGFpbmVyOiB0YXNraXQgR21iSCAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2MF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IHBvcnR1eGcyMF9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGluaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gcG9ydHV4ZzIwX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORAogCiBNQUNISU5FX1NUQVJUKFNUQU1QOUcyMCwgInRhc2tpdCBTdGFtcDlHMjAiKQogCS8qIE1haW50YWluZXI6IHRhc2tpdCBHbWJIICovCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFzYW05MjYwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gc3RhbXA5ZzIwZXZiX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBzdGFtcDlnMjBldmJfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYwLmMKaW5kZXggMGU3ODRlNi4uOGM0YzFhMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXVzYi1hOTI2MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC11c2ItYTkyNjAuYwpAQCAtNTEsNyArNTEsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTIuMDAwIE1IeiBjcnlzdGFsICovCi0JYXQ5MXNhbTkyNjBfaW5pdGlhbGl6ZSgxMjAwMDAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDEyMDAwMDAwKTsKIAogCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtNjAsMTIgKzYwLDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXNhbTkyNjBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCi0KIC8qCiAgKiBVU0IgSG9zdCBwb3J0CiAgKi8KQEAgLTIyOSw4ICsyMjMsOCBAQAogTUFDSElORV9TVEFSVChVU0JfQTkyNjAsICJDQUxBTyBVU0JfQTkyNjAiKQogCS8qIE1haW50YWluZXI6IGNhbGFvLXN5c3RlbXMgKi8KIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTkyNjBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBla19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGVrX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gZWtfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYzLmMKaW5kZXggY2Y2MjZkZC4uMjVlNzkzNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXVzYi1hOTI2My5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC11c2ItYTkyNjMuYwpAQCAtNTAsNyArNTAsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTIuMDAgTUh6IGNyeXN0YWwgKi8KLQlhdDkxc2FtOTI2M19pbml0aWFsaXplKDEyMDAwMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTIwMDAwMDApOwogCiAJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC01OSwxMiArNTksNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOTI2M19pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KLQogLyoKICAqIFVTQiBIb3N0IHBvcnQKICAqLwpAQCAtMjQ1LDggKzIzOSw4IEBACiBNQUNISU5FX1NUQVJUKFVTQl9BOTI2MywgIkNBTEFPIFVTQl9BOTI2MyIpCiAJLyogTWFpbnRhaW5lcjogY2FsYW8tc3lzdGVtcyAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2M19tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGVrX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gZWtfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBla19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC15bC05MjAwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQteWwtOTIwMC5jCmluZGV4IGMyMDhjYzMuLjk1ZWRjYmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC15bC05MjAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXlsLTkyMDAuYwpAQCAtNTYsNyArNTYsNyBAQAogCWF0OTFybTkyMDBfc2V0X3R5cGUoQVJDSF9SRVZJU09OXzkyMDBfUFFGUCk7CiAKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTguNDMyIE1IeiBjcnlzdGFsICovCi0JYXQ5MXJtOTIwMF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogU2V0dXAgdGhlIExFRHMgRDI9UEIxNyAodGltZXIpLCBEMz1QQjE2IChjcHUpICovCiAJYXQ5MV9pbml0X2xlZHMoQVQ5MV9QSU5fUEIxNiwgQVQ5MV9QSU5fUEIxNyk7CkBAIC03OSwxMiArNzksNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgeWw5MjAwX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXJtOTIwMF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KLQogLyoKICAqIExFRHMKICAqLwpAQCAtNTk5LDggKzU5Myw4IEBACiBNQUNISU5FX1NUQVJUKFlMOTIwMCwgInVDZHJhZ29uIFlMLTkyMDAiKQogCS8qIE1haW50YWluZXI6IFMuQmlydGxlcyAqLwogCS50aW1lcgkJPSAmYXQ5MXJtOTIwMF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFybTkyMDBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSB5bDkyMDBfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSB5bDkyMDBfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSB5bDkyMDBfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvZ2VuZXJpYy5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2dlbmVyaWMuaAppbmRleCA4ZmYzNDE4Li45MzhiMzRmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvZ2VuZXJpYy5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9nZW5lcmljLmgKQEAgLTExLDM1ICsxMSwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgogCiAgLyogTWFwIGlvICovCi1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MXJtOTIwMF9tYXBfaW8odm9pZCk7Ci1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MXNhbTkyNjBfbWFwX2lvKHZvaWQpOwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFzYW05MjYxX21hcF9pbyh2b2lkKTsKLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxc2FtOTI2M19tYXBfaW8odm9pZCk7Ci1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MXNhbTlybF9tYXBfaW8odm9pZCk7Ci1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MXNhbTlnNDVfbWFwX2lvKHZvaWQpOwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTF4NDBfbWFwX2lvKHZvaWQpOwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFjYXA5X21hcF9pbyh2b2lkKTsKK2V4dGVybiB2b2lkIF9faW5pdCBhdDkxX21hcF9pbyh2b2lkKTsKK2V4dGVybiB2b2lkIF9faW5pdCBhdDkxX2luaXRfc3JhbShpbnQgYmFuaywgdW5zaWduZWQgbG9uZyBiYXNlLAorCQkJCSAgdW5zaWduZWQgaW50IGxlbmd0aCk7CiAKICAvKiBQcm9jZXNzb3JzICovCiBleHRlcm4gdm9pZCBfX2luaXQgYXQ5MXJtOTIwMF9zZXRfdHlwZShpbnQgdHlwZSk7Ci1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MXJtOTIwMF9pbml0aWFsaXplKHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jayk7Ci1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MXNhbTkyNjBfaW5pdGlhbGl6ZSh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spOwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFzYW05MjYxX2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKTsKLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxc2FtOTI2M19pbml0aWFsaXplKHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jayk7Ci1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MXNhbTlybF9pbml0aWFsaXplKHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jayk7Ci1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MXNhbTlnNDVfaW5pdGlhbGl6ZSh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spOworZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFfaW5pdGlhbGl6ZSh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spOwogZXh0ZXJuIHZvaWQgX19pbml0IGF0OTF4NDBfaW5pdGlhbGl6ZSh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spOwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFjYXA5X2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKTsKIAogIC8qIEludGVycnVwdHMgKi8KLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxcm05MjAwX2luaXRfaW50ZXJydXB0cyh1bnNpZ25lZCBpbnQgcHJpb3JpdHlbXSk7Ci1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MXNhbTkyNjBfaW5pdF9pbnRlcnJ1cHRzKHVuc2lnbmVkIGludCBwcmlvcml0eVtdKTsKLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxc2FtOTI2MV9pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W10pOwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFzYW05MjYzX2luaXRfaW50ZXJydXB0cyh1bnNpZ25lZCBpbnQgcHJpb3JpdHlbXSk7Ci1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MXNhbTlybF9pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W10pOwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFzYW05ZzQ1X2luaXRfaW50ZXJydXB0cyh1bnNpZ25lZCBpbnQgcHJpb3JpdHlbXSk7CitleHRlcm4gdm9pZCBfX2luaXQgYXQ5MV9pbml0X2lycV9kZWZhdWx0KHZvaWQpOworZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFfaW5pdF9pbnRlcnJ1cHRzKHVuc2lnbmVkIGludCBwcmlvcml0eVtdKTsKIGV4dGVybiB2b2lkIF9faW5pdCBhdDkxeDQwX2luaXRfaW50ZXJydXB0cyh1bnNpZ25lZCBpbnQgcHJpb3JpdHlbXSk7Ci1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MWNhcDlfaW5pdF9pbnRlcnJ1cHRzKHVuc2lnbmVkIGludCBwcmlvcml0eVtdKTsKIGV4dGVybiB2b2lkIF9faW5pdCBhdDkxX2FpY19pbml0KHVuc2lnbmVkIGludCBwcmlvcml0eVtdKTsKIAogIC8qIFRpbWVyICovCkBAIC00OSw3ICszMyw2IEBACiBleHRlcm4gc3RydWN0IHN5c190aW1lciBhdDkxeDQwX3RpbWVyOwogCiAgLyogQ2xvY2tzICovCi1leHRlcm4gaW50IF9faW5pdCBhdDkxX2Nsb2NrX2luaXQodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKTsKIC8qCiAgKiBmdW5jdGlvbiB0byBzcGVjaWZ5IHRoZSBjbG9jayBvZiB0aGUgZGVmYXVsdCBjb25zb2xlLiBBcyB3ZSBkbyBub3QKICAqIHVzZSB0aGUgZGV2aWNlL2RyaXZlciBidXMsIHRoZSBkZXZfbmFtZSBpcyBub3QgaW50aWFsaXplLiBTbyB3ZSBuZWVkCkBAIC02Miw2ICs0NSwxMSBAQAogZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFzYW05cmxfc2V0X2NvbnNvbGVfY2xvY2soaW50IGlkKTsKIGV4dGVybiB2b2lkIF9faW5pdCBhdDkxc2FtOWc0NV9zZXRfY29uc29sZV9jbG9jayhpbnQgaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFjYXA5X3NldF9jb25zb2xlX2Nsb2NrKGludCBpZCk7CisjaWZkZWYgQ09ORklHX0FUOTFfUE1DX1VOSVQKK2V4dGVybiBpbnQgX19pbml0IGF0OTFfY2xvY2tfaW5pdCh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spOworI2Vsc2UKK3N0YXRpYyBpbnQgaW5saW5lIGF0OTFfY2xvY2tfaW5pdCh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgogc3RydWN0IGRldmljZTsKIAogIC8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MV9kYmd1LmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFfZGJndS5oCmluZGV4IDZkY2FhNzcuLmRiZmU0NTVhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFfZGJndS5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MV9kYmd1LmgKQEAgLTE2LDIyICsxNiwyNSBAQAogI2lmbmRlZiBBVDkxX0RCR1VfSAogI2RlZmluZSBBVDkxX0RCR1VfSAogCisjZGVmaW5lIGRiZ3VfcmVhZGwoZGJndSwgZmllbGQpIFwKKwlfX3Jhd19yZWFkbChBVDkxX1ZBX0JBU0VfU1lTICsgZGJndSArIEFUOTFfREJHVV8gIyMgZmllbGQpCisKICNpZmRlZiBBVDkxX0RCR1UKLSNkZWZpbmUgQVQ5MV9EQkdVX0NSCQkoQVQ5MV9EQkdVICsgMHgwMCkJLyogQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX0RCR1VfTVIJCShBVDkxX0RCR1UgKyAweDA0KQkvKiBNb2RlIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfREJHVV9JRVIJCShBVDkxX0RCR1UgKyAweDA4KQkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfREJHVV9DUgkJKDB4MDApCS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9EQkdVX01SCQkoMHgwNCkJLyogTW9kZSBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0RCR1VfSUVSCQkoMHgwOCkJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLwogI2RlZmluZQkJQVQ5MV9EQkdVX1RYUkRZCQkoMSA8PCAxKQkJLyogVHJhbnNtaXR0ZXIgUmVhZHkgKi8KICNkZWZpbmUJCUFUOTFfREJHVV9UWEVNUFRZCSgxIDw8IDkpCQkvKiBUcmFuc21pdHRlciBFbXB0eSAqLwotI2RlZmluZSBBVDkxX0RCR1VfSURSCQkoQVQ5MV9EQkdVICsgMHgwYykJLyogSW50ZXJydXB0IERpc2FibGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9EQkdVX0lNUgkJKEFUOTFfREJHVSArIDB4MTApCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfREJHVV9TUgkJKEFUOTFfREJHVSArIDB4MTQpCS8qIFN0YXR1cyBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX0RCR1VfUkhSCQkoQVQ5MV9EQkdVICsgMHgxOCkJLyogUmVjZWl2ZXIgSG9sZGluZyBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX0RCR1VfVEhSCQkoQVQ5MV9EQkdVICsgMHgxYykJLyogVHJhbnNtaXR0ZXIgSG9sZGluZyBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX0RCR1VfQlJHUgkJKEFUOTFfREJHVSArIDB4MjApCS8qIEJhdWQgUmF0ZSBHZW5lcmF0b3IgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9EQkdVX0lEUgkJKDB4MGMpCS8qIEludGVycnVwdCBEaXNhYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfREJHVV9JTVIJCSgweDEwKQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0RCR1VfU1IJCSgweDE0KQkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9EQkdVX1JIUgkJKDB4MTgpCS8qIFJlY2VpdmVyIEhvbGRpbmcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9EQkdVX1RIUgkJKDB4MWMpCS8qIFRyYW5zbWl0dGVyIEhvbGRpbmcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9EQkdVX0JSR1IJCSgweDIwKQkvKiBCYXVkIFJhdGUgR2VuZXJhdG9yIFJlZ2lzdGVyICovCiAKLSNkZWZpbmUgQVQ5MV9EQkdVX0NJRFIJCShBVDkxX0RCR1UgKyAweDQwKQkvKiBDaGlwIElEIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfREJHVV9FWElECQkoQVQ5MV9EQkdVICsgMHg0NCkJLyogQ2hpcCBJRCBFeHRlbnNpb24gUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9EQkdVX0ZOUgkJKEFUOTFfREJHVSArIDB4NDgpCS8qIEZvcmNlIE5UUlNUIFJlZ2lzdGVyIFtTQU05IG9ubHldICovCisjZGVmaW5lIEFUOTFfREJHVV9DSURSCQkoMHg0MCkJLyogQ2hpcCBJRCBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0RCR1VfRVhJRAkJKDB4NDQpCS8qIENoaXAgSUQgRXh0ZW5zaW9uIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfREJHVV9GTlIJCSgweDQ4KQkvKiBGb3JjZSBOVFJTVCBSZWdpc3RlciBbU0FNOSBvbmx5XSAqLwogI2RlZmluZQkJQVQ5MV9EQkdVX0ZOVFJTVAkoMSA8PCAwKQkJLyogRm9yY2UgTlRSU1QgKi8KIAogI2VuZGlmIC8qIEFUOTFfREJHVSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxY2FwOS5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxY2FwOS5oCmluZGV4IDY2NTk5MzguLmM1ZGYxZTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MWNhcDkuaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFjYXA5LmgKQEAgLTc1LDcgKzc1LDYgQEAKICNkZWZpbmUgQVQ5MUNBUDlfQkFTRV9FTUFDCQkweGZmZmJjMDAwCiAjZGVmaW5lIEFUOTFDQVA5X0JBU0VfQURDCQkweGZmZmMwMDAwCiAjZGVmaW5lIEFUOTFDQVA5X0JBU0VfSVNJCQkweGZmZmM0MDAwCi0jZGVmaW5lIEFUOTFfQkFTRV9TWVMJCQkweGZmZmZlMjAwCiAKIC8qCiAgKiBTeXN0ZW0gUGVyaXBoZXJhbHMgKG9mZnNldCBmcm9tIEFUOTFfQkFTRV9TWVMpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFybTkyMDAuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXJtOTIwMC5oCmluZGV4IDk5ZTBmOGQuLmU0MDM3YjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXJtOTIwMC5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXJtOTIwMC5oCkBAIC03NCw3ICs3NCw2IEBACiAjZGVmaW5lIEFUOTFSTTkyMDBfQkFTRV9TU0MxCTB4ZmZmZDQwMDAKICNkZWZpbmUgQVQ5MVJNOTIwMF9CQVNFX1NTQzIJMHhmZmZkODAwMAogI2RlZmluZSBBVDkxUk05MjAwX0JBU0VfU1BJCTB4ZmZmZTAwMDAKLSNkZWZpbmUgQVQ5MV9CQVNFX1NZUwkJMHhmZmZmZjAwMAogCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05MjYwLmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05MjYwLmgKaW5kZXggOGI2YmY4My4uOWE3OTExNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOTI2MC5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTkyNjAuaApAQCAtNzYsNyArNzYsNiBAQAogI2RlZmluZSBBVDkxU0FNOTI2MF9CQVNFX1RDNAkJMHhmZmZkYzA0MAogI2RlZmluZSBBVDkxU0FNOTI2MF9CQVNFX1RDNQkJMHhmZmZkYzA4MAogI2RlZmluZSBBVDkxU0FNOTI2MF9CQVNFX0FEQwkJMHhmZmZlMDAwMAotI2RlZmluZSBBVDkxX0JBU0VfU1lTCQkJMHhmZmZmZTgwMAogCiAvKgogICogU3lzdGVtIFBlcmlwaGVyYWxzIChvZmZzZXQgZnJvbSBBVDkxX0JBU0VfU1lTKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOTI2MS5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOTI2MS5oCmluZGV4IGVhZmJkZGEuLmNlNTk2MjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTkyNjEuaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05MjYxLmgKQEAgLTYwLDcgKzYwLDYgQEAKICNkZWZpbmUgQVQ5MVNBTTkyNjFfQkFTRV9TU0MyCQkweGZmZmM0MDAwCiAjZGVmaW5lIEFUOTFTQU05MjYxX0JBU0VfU1BJMAkJMHhmZmZjODAwMAogI2RlZmluZSBBVDkxU0FNOTI2MV9CQVNFX1NQSTEJCTB4ZmZmY2MwMDAKLSNkZWZpbmUgQVQ5MV9CQVNFX1NZUwkJCTB4ZmZmZmVhMDAKIAogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOTI2My5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOTI2My5oCmluZGV4IGUyZDM0ODIuLmYxYjkyOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTkyNjMuaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05MjYzLmgKQEAgLTcwLDcgKzcwLDYgQEAKICNkZWZpbmUgQVQ5MVNBTTkyNjNfQkFTRV9FTUFDCQkweGZmZmJjMDAwCiAjZGVmaW5lIEFUOTFTQU05MjYzX0JBU0VfSVNJCQkweGZmZmM0MDAwCiAjZGVmaW5lIEFUOTFTQU05MjYzX0JBU0VfMkRHRQkJMHhmZmZjODAwMAotI2RlZmluZSBBVDkxX0JBU0VfU1lTCQkJMHhmZmZmZTAwMAogCiAvKgogICogU3lzdGVtIFBlcmlwaGVyYWxzIChvZmZzZXQgZnJvbSBBVDkxX0JBU0VfU1lTKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOWc0NS5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOWc0NS5oCmluZGV4IDY1OTMwNGEuLjJjNjExYjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTlnNDUuaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05ZzQ1LmgKQEAgLTgyLDcgKzgyLDYgQEAKICNkZWZpbmUgQVQ5MVNBTTlHNDVfQkFTRV9UQzMJCTB4ZmZmZDQwMDAKICNkZWZpbmUgQVQ5MVNBTTlHNDVfQkFTRV9UQzQJCTB4ZmZmZDQwNDAKICNkZWZpbmUgQVQ5MVNBTTlHNDVfQkFTRV9UQzUJCTB4ZmZmZDQwODAKLSNkZWZpbmUgQVQ5MV9CQVNFX1NZUwkJCTB4ZmZmZmUyMDAKIAogLyoKICAqIFN5c3RlbSBQZXJpcGhlcmFscyAob2Zmc2V0IGZyb20gQVQ5MV9CQVNFX1NZUykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTlybC5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOXJsLmgKaW5kZXggNDFkYmJlNi4uMWFhYmFjZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOXJsLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOXJsLmgKQEAgLTY0LDcgKzY0LDYgQEAKICNkZWZpbmUgQVQ5MVNBTTlSTF9CQVNFX1RTQwkweGZmZmQwMDAwCiAjZGVmaW5lIEFUOTFTQU05UkxfQkFTRV9VRFBIUwkweGZmZmQ0MDAwCiAjZGVmaW5lIEFUOTFTQU05UkxfQkFTRV9BQzk3QwkweGZmZmQ4MDAwCi0jZGVmaW5lIEFUOTFfQkFTRV9TWVMJCTB4ZmZmZmMwMDAKIAogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9jcHUuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvY3B1LmgKaW5kZXggZGY5NjZjMi4uZjZjZTkzNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9jcHUuaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2NwdS5oCkBAIC0xLDcgKzEsOCBAQAogLyoKICAqIGFyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvY3B1LmgKICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA2IFNBTiBQZW9wbGUKKyAqIENvcHlyaWdodCAoQykgMjAwNiBTQU4gUGVvcGxlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgSmVhbi1DaHJpc3RvcGhlIFBMQUdOSU9MLVZJTExBUkQgPHBsYWduaW9qQGpjcm9zb2Z0LmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTEwLDEyICsxMSw4IEBACiAgKgogICovCiAKLSNpZm5kZWYgX19BU01fQVJDSF9DUFVfSAotI2RlZmluZSBfX0FTTV9BUkNIX0NQVV9ICi0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9hdDkxX2RiZ3UuaD4KLQorI2lmbmRlZiBfX01BQ0hfQ1BVX0hfXworI2RlZmluZSBfX01BQ0hfQ1BVX0hfXwogCiAjZGVmaW5lIEFSQ0hfSURfQVQ5MVJNOTIwMAkweDA5MjkwNzgwCiAjZGVmaW5lIEFSQ0hfSURfQVQ5MVNBTTkyNjAJMHgwMTk4MDNhMApAQCAtMzksMTYgKzM2LDYgQEAKICNkZWZpbmUgQVJDSF9JRF9BVDkxTTQwODA3CTB4MTQwODA3NDUKICNkZWZpbmUgQVJDSF9JRF9BVDkxUjQwMDA4CTB4NDQwMDA4NDAKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGF0OTFfY3B1X2lkZW50aWZ5KHZvaWQpCi17Ci0JcmV0dXJuIChhdDkxX3N5c19yZWFkKEFUOTFfREJHVV9DSURSKSAmIH5BVDkxX0NJRFJfVkVSU0lPTik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhdDkxX2NwdV9mdWxseV9pZGVudGlmeSh2b2lkKQotewotCXJldHVybiBhdDkxX3N5c19yZWFkKEFUOTFfREJHVV9DSURSKTsKLX0KLQogI2RlZmluZSBBUkNIX0VYSURfQVQ5MVNBTTlNMTEJMHgwMDAwMDAwMQogI2RlZmluZSBBUkNIX0VYSURfQVQ5MVNBTTlNMTAJMHgwMDAwMDAwMgogI2RlZmluZSBBUkNIX0VYSURfQVQ5MVNBTTlHNDYJMHgwMDAwMDAwMwpAQCAtNjAsNDAgKzQ3LDgwIEBACiAjZGVmaW5lIEFSQ0hfRVhJRF9BVDkxU0FNOUcyNQkweDAwMDAwMDAzCiAjZGVmaW5lIEFSQ0hfRVhJRF9BVDkxU0FNOVgyNQkweDAwMDAwMDA0CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhdDkxX2V4aWRfaWRlbnRpZnkodm9pZCkKLXsKLQlyZXR1cm4gYXQ5MV9zeXNfcmVhZChBVDkxX0RCR1VfRVhJRCk7Ci19Ci0KLQogI2RlZmluZSBBUkNIX0ZBTUlMWV9BVDkxWDkyCTB4MDkyMDAwMDAKICNkZWZpbmUgQVJDSF9GQU1JTFlfQVQ5MVNBTTkJMHgwMTkwMDAwMAogI2RlZmluZSBBUkNIX0ZBTUlMWV9BVDkxU0FNOVhFCTB4MDI5MDAwMDAKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGF0OTFfYXJjaF9pZGVudGlmeSh2b2lkKQotewotCXJldHVybiAoYXQ5MV9zeXNfcmVhZChBVDkxX0RCR1VfQ0lEUikgJiBBVDkxX0NJRFJfQVJDSCk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfQVJDSF9BVDkxQ0FQOQotI2luY2x1ZGUgPG1hY2gvYXQ5MV9wbWMuaD4KLQorLyogUE1DIHJldmlzaW9uICovCiAjZGVmaW5lIEFSQ0hfUkVWSVNJT05fQ0FQOV9CCTB4Mzk5CiAjZGVmaW5lIEFSQ0hfUkVWSVNJT05fQ0FQOV9DCTB4NjAxCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhdDkxY2FwOV9yZXZfaWRlbnRpZnkodm9pZCkKLXsKLQlyZXR1cm4gKGF0OTFfc3lzX3JlYWQoQVQ5MV9QTUNfVkVSKSk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19BUkNIX0FUOTFSTTkyMDAKLWV4dGVybiBpbnQgcm05MjAwX3R5cGU7CisvKiBSTTkyMDAgdHlwZSAqLwogI2RlZmluZSBBUkNIX1JFVklTT05fOTIwMF9CR0EJKDAgPDwgMCkKICNkZWZpbmUgQVJDSF9SRVZJU09OXzkyMDBfUFFGUAkoMSA8PCAwKQotI2RlZmluZSBjcHVfaXNfYXQ5MXJtOTIwMCgpCShhdDkxX2NwdV9pZGVudGlmeSgpID09IEFSQ0hfSURfQVQ5MVJNOTIwMCkKLSNkZWZpbmUgY3B1X2lzX2F0OTFybTkyMDBfYmdhKCkJKCFjcHVfaXNfYXQ5MXJtOTIwMF9wcWZwKCkpCi0jZGVmaW5lIGNwdV9pc19hdDkxcm05MjAwX3BxZnAoKSAoY3B1X2lzX2F0OTFybTkyMDAoKSAmJiBybTkyMDBfdHlwZSAmIEFSQ0hfUkVWSVNPTl85MjAwX1BRRlApCisKK2VudW0gYXQ5MV9zb2NfdHlwZSB7CisJLyogOTIwVCAqLworCUFUOTFfU09DX1JNOTIwMCwKKworCS8qIENBUCAqLworCUFUOTFfU09DX0NBUDksCisKKwkvKiBTQU05Mnh4ICovCisJQVQ5MV9TT0NfU0FNOTI2MCwgQVQ5MV9TT0NfU0FNOTI2MSwgQVQ5MV9TT0NfU0FNOTI2MywKKworCS8qIFNBTTlHeHggKi8KKwlBVDkxX1NPQ19TQU05RzEwLCBBVDkxX1NPQ19TQU05RzIwLCBBVDkxX1NPQ19TQU05RzQ1LAorCisJLyogU0FNOVJMICovCisJQVQ5MV9TT0NfU0FNOVJMLAorCisJLyogU0FNOVg1ICovCisJQVQ5MV9TT0NfU0FNOVg1LAorCisJLyogVW5rbm93biB0eXBlICovCisJQVQ5MV9TT0NfTk9ORQorfTsKKworZW51bSBhdDkxX3NvY19zdWJ0eXBlIHsKKwkvKiBSTTkyMDAgKi8KKwlBVDkxX1NPQ19STTkyMDBfQkdBLCBBVDkxX1NPQ19STTkyMDBfUFFGUCwKKworCS8qIENBUDkgKi8KKwlBVDkxX1NPQ19DQVA5X1JFVl9CLCBBVDkxX1NPQ19DQVA5X1JFVl9DLAorCisJLyogU0FNOTI2MCAqLworCUFUOTFfU09DX1NBTTlYRSwKKworCS8qIFNBTTlHNDUgKi8KKwlBVDkxX1NPQ19TQU05RzQ1RVMsIEFUOTFfU09DX1NBTTlNMTAsIEFUOTFfU09DX1NBTTlHNDYsIEFUOTFfU09DX1NBTTlNMTEsCisKKwkvKiBTQU05WDUgKi8KKwlBVDkxX1NPQ19TQU05RzE1LCBBVDkxX1NPQ19TQU05RzM1LCBBVDkxX1NPQ19TQU05WDM1LAorCUFUOTFfU09DX1NBTTlHMjUsIEFUOTFfU09DX1NBTTlYMjUsCisKKwkvKiBVbmtub3duIHN1YnR5cGUgKi8KKwlBVDkxX1NPQ19TVUJUWVBFX05PTkUKK307CisKK3N0cnVjdCBhdDkxX3NvY2luZm8geworCXVuc2lnbmVkIGludCB0eXBlLCBzdWJ0eXBlOworCXVuc2lnbmVkIGludCBjaWRyLCBleGlkOworfTsKKworZXh0ZXJuIHN0cnVjdCBhdDkxX3NvY2luZm8gYXQ5MV9zb2NfaW5pdGRhdGE7Citjb25zdCBjaGFyICphdDkxX2dldF9zb2NfdHlwZShzdHJ1Y3QgYXQ5MV9zb2NpbmZvICpjKTsKK2NvbnN0IGNoYXIgKmF0OTFfZ2V0X3NvY19zdWJ0eXBlKHN0cnVjdCBhdDkxX3NvY2luZm8gKmMpOworCitzdGF0aWMgaW5saW5lIGludCBhdDkxX3NvY19pc19kZXRlY3RlZCh2b2lkKQoreworCXJldHVybiBhdDkxX3NvY19pbml0ZGF0YS50eXBlICE9IEFUOTFfU09DX05PTkU7Cit9CisKKyNpZmRlZiBDT05GSUdfQVJDSF9BVDkxUk05MjAwCisjZGVmaW5lIGNwdV9pc19hdDkxcm05MjAwKCkJKGF0OTFfc29jX2luaXRkYXRhLnR5cGUgPT0gQVQ5MV9TT0NfUk05MjAwKQorI2RlZmluZSBjcHVfaXNfYXQ5MXJtOTIwMF9iZ2EoKQkoYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9PSBBVDkxX1NPQ19STTkyMDBfQkdBKQorI2RlZmluZSBjcHVfaXNfYXQ5MXJtOTIwMF9wcWZwKCkgKGF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPT0gQVQ5MV9TT0NfUk05MjAwX1BRRlApCiAjZWxzZQogI2RlZmluZSBjcHVfaXNfYXQ5MXJtOTIwMCgpCSgwKQogI2RlZmluZSBjcHVfaXNfYXQ5MXJtOTIwMF9iZ2EoKQkoMCkKQEAgLTEwMSw1MiArMTI4LDQ5IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BUkNIX0FUOTFTQU05MjYwCi0jZGVmaW5lIGNwdV9pc19hdDkxc2FtOXhlKCkJKGF0OTFfYXJjaF9pZGVudGlmeSgpID09IEFSQ0hfRkFNSUxZX0FUOTFTQU05WEUpCi0jZGVmaW5lIGNwdV9pc19hdDkxc2FtOTI2MCgpCSgoYXQ5MV9jcHVfaWRlbnRpZnkoKSA9PSBBUkNIX0lEX0FUOTFTQU05MjYwKSB8fCBjcHVfaXNfYXQ5MXNhbTl4ZSgpKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTl4ZSgpCShhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID09IEFUOTFfU09DX1NBTTlYRSkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05MjYwKCkJKGF0OTFfc29jX2luaXRkYXRhLnR5cGUgPT0gQVQ5MV9TT0NfU0FNOTI2MCkKICNlbHNlCiAjZGVmaW5lIGNwdV9pc19hdDkxc2FtOXhlKCkJKDApCiAjZGVmaW5lIGNwdV9pc19hdDkxc2FtOTI2MCgpCSgwKQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQVJDSF9BVDkxU0FNOUcyMAotI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnMjAoKQkoYXQ5MV9jcHVfaWRlbnRpZnkoKSA9PSBBUkNIX0lEX0FUOTFTQU05RzIwKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnMjAoKQkoYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9PSBBVDkxX1NPQ19TQU05RzIwKQogI2Vsc2UKICNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzIwKCkJKDApCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BUkNIX0FUOTFTQU05MjYxCi0jZGVmaW5lIGNwdV9pc19hdDkxc2FtOTI2MSgpCShhdDkxX2NwdV9pZGVudGlmeSgpID09IEFSQ0hfSURfQVQ5MVNBTTkyNjEpCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOTI2MSgpCShhdDkxX3NvY19pbml0ZGF0YS50eXBlID09IEFUOTFfU09DX1NBTTkyNjEpCiAjZWxzZQogI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTkyNjEoKQkoMCkKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FSQ0hfQVQ5MVNBTTlHMTAKLSNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzEwKCkJKChhdDkxX2NwdV9pZGVudGlmeSgpICYgfkFUOTFfQ0lEUl9FWFQpCT09IEFSQ0hfSURfQVQ5MVNBTTlHMTApCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWcxMCgpCShhdDkxX3NvY19pbml0ZGF0YS50eXBlID09IEFUOTFfU09DX1NBTTlHMTApCiAjZWxzZQogI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnMTAoKQkoMCkKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FSQ0hfQVQ5MVNBTTkyNjMKLSNkZWZpbmUgY3B1X2lzX2F0OTFzYW05MjYzKCkJKGF0OTFfY3B1X2lkZW50aWZ5KCkgPT0gQVJDSF9JRF9BVDkxU0FNOTI2MykKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05MjYzKCkJKGF0OTFfc29jX2luaXRkYXRhLnR5cGUgPT0gQVQ5MV9TT0NfU0FNOTI2MykKICNlbHNlCiAjZGVmaW5lIGNwdV9pc19hdDkxc2FtOTI2MygpCSgwKQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQVJDSF9BVDkxU0FNOVJMCi0jZGVmaW5lIGNwdV9pc19hdDkxc2FtOXJsKCkJKGF0OTFfY3B1X2lkZW50aWZ5KCkgPT0gQVJDSF9JRF9BVDkxU0FNOVJMNjQpCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOXJsKCkJKGF0OTFfc29jX2luaXRkYXRhLnR5cGUgPT0gQVQ5MV9TT0NfU0FNOVJMKQogI2Vsc2UKICNkZWZpbmUgY3B1X2lzX2F0OTFzYW05cmwoKQkoMCkKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FSQ0hfQVQ5MVNBTTlHNDUKLSNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzQ1KCkJKGF0OTFfY3B1X2lkZW50aWZ5KCkgPT0gQVJDSF9JRF9BVDkxU0FNOUc0NSkKLSNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzQ1ZXMoKQkoYXQ5MV9jcHVfZnVsbHlfaWRlbnRpZnkoKSA9PSBBUkNIX0lEX0FUOTFTQU05RzQ1RVMpCi0jZGVmaW5lIGNwdV9pc19hdDkxc2FtOW0xMCgpICAgIChjcHVfaXNfYXQ5MXNhbTlnNDUoKSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdDkxX2V4aWRfaWRlbnRpZnkoKSA9PSBBUkNIX0VYSURfQVQ5MVNBTTlNMTApKQotI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTltNDYoKSAgICAoY3B1X2lzX2F0OTFzYW05ZzQ1KCkgJiYgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXQ5MV9leGlkX2lkZW50aWZ5KCkgPT0gQVJDSF9FWElEX0FUOTFTQU05RzQ2KSkKLSNkZWZpbmUgY3B1X2lzX2F0OTFzYW05bTExKCkgICAgKGNwdV9pc19hdDkxc2FtOWc0NSgpICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF0OTFfZXhpZF9pZGVudGlmeSgpID09IEFSQ0hfRVhJRF9BVDkxU0FNOU0xMSkpCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWc0NSgpCShhdDkxX3NvY19pbml0ZGF0YS50eXBlID09IEFUOTFfU09DX1NBTTlHNDUpCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWc0NWVzKCkJKGF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPT0gQVQ5MV9TT0NfU0FNOUc0NUVTKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTltMTAoKQkoYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9PSBBVDkxX1NPQ19TQU05TTEwKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnNDYoKQkoYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9PSBBVDkxX1NPQ19TQU05RzQ2KQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTltMTEoKQkoYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9PSBBVDkxX1NPQ19TQU05TTExKQogI2Vsc2UKICNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzQ1KCkJKDApCiAjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWc0NWVzKCkJKDApCkBAIC0xNTYsMTcgKzE4MCwxMiBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQVJDSF9BVDkxU0FNOVg1Ci0jZGVmaW5lIGNwdV9pc19hdDkxc2FtOXg1KCkJKGF0OTFfY3B1X2lkZW50aWZ5KCkgPT0gQVJDSF9JRF9BVDkxU0FNOVg1KQotI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnMTUoKQkoY3B1X2lzX2F0OTFzYW05eDUoKSAmJiBcCi0JCQkJKGF0OTFfZXhpZF9pZGVudGlmeSgpID09IEFSQ0hfRVhJRF9BVDkxU0FNOUcxNSkpCi0jZGVmaW5lIGNwdV9pc19hdDkxc2FtOWczNSgpCShjcHVfaXNfYXQ5MXNhbTl4NSgpICYmIFwKLQkJCQkoYXQ5MV9leGlkX2lkZW50aWZ5KCkgPT0gQVJDSF9FWElEX0FUOTFTQU05RzM1KSkKLSNkZWZpbmUgY3B1X2lzX2F0OTFzYW05eDM1KCkJKGNwdV9pc19hdDkxc2FtOXg1KCkgJiYgXAotCQkJCShhdDkxX2V4aWRfaWRlbnRpZnkoKSA9PSBBUkNIX0VYSURfQVQ5MVNBTTlYMzUpKQotI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnMjUoKQkoY3B1X2lzX2F0OTFzYW05eDUoKSAmJiBcCi0JCQkJKGF0OTFfZXhpZF9pZGVudGlmeSgpID09IEFSQ0hfRVhJRF9BVDkxU0FNOUcyNSkpCi0jZGVmaW5lIGNwdV9pc19hdDkxc2FtOXgyNSgpCShjcHVfaXNfYXQ5MXNhbTl4NSgpICYmIFwKLQkJCQkoYXQ5MV9leGlkX2lkZW50aWZ5KCkgPT0gQVJDSF9FWElEX0FUOTFTQU05WDI1KSkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05eDUoKQkoYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9PSBBVDkxX1NPQ19TQU05WDUpCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWcxNSgpCShhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID09IEFUOTFfU09DX1NBTTlHMTUpCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWczNSgpCShhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID09IEFUOTFfU09DX1NBTTlHMzUpCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOXgzNSgpCShhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID09IEFUOTFfU09DX1NBTTlYMzUpCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWcyNSgpCShhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID09IEFUOTFfU09DX1NBTTlHMjUpCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOXgyNSgpCShhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID09IEFUOTFfU09DX1NBTTlYMjUpCiAjZWxzZQogI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTl4NSgpCSgwKQogI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnMTUoKQkoMCkKQEAgLTE3Nyw5ICsxOTYsOSBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQVJDSF9BVDkxQ0FQOQotI2RlZmluZSBjcHVfaXNfYXQ5MWNhcDkoKQkoYXQ5MV9jcHVfaWRlbnRpZnkoKSA9PSBBUkNIX0lEX0FUOTFDQVA5KQotI2RlZmluZSBjcHVfaXNfYXQ5MWNhcDlfcmV2QigpCShhdDkxY2FwOV9yZXZfaWRlbnRpZnkoKSA9PSBBUkNIX1JFVklTSU9OX0NBUDlfQikKLSNkZWZpbmUgY3B1X2lzX2F0OTFjYXA5X3JldkMoKQkoYXQ5MWNhcDlfcmV2X2lkZW50aWZ5KCkgPT0gQVJDSF9SRVZJU0lPTl9DQVA5X0MpCisjZGVmaW5lIGNwdV9pc19hdDkxY2FwOSgpCShhdDkxX3NvY19pbml0ZGF0YS50eXBlID09IEFUOTFfU09DX0NBUDkpCisjZGVmaW5lIGNwdV9pc19hdDkxY2FwOV9yZXZCKCkJKGF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPT0gQVQ5MV9TT0NfQ0FQOV9SRVZfQikKKyNkZWZpbmUgY3B1X2lzX2F0OTFjYXA5X3JldkMoKQkoYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9PSBBVDkxX1NPQ19DQVA5X1JFVl9DKQogI2Vsc2UKICNkZWZpbmUgY3B1X2lzX2F0OTFjYXA5KCkJKDApCiAjZGVmaW5lIGNwdV9pc19hdDkxY2FwOV9yZXZCKCkJKDApCkBAIC0xOTIsNCArMjExLDQgQEAKICAqLwogI2RlZmluZSBjcHVfaXNfYXQzMmFwNzAwMCgpCSgwKQogCi0jZW5kaWYKKyNlbmRpZiAvKiBfX01BQ0hfQ1BVX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCmluZGV4IDBmOTU5ZmEuLmJjMWUwYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTE1LDIzICsxNSwyMyBAQAogI2luY2x1ZGUgPG1hY2gvYXQ5MV9kYmd1Lmg+CiAKIAkubWFjcm8JYWRkcnVhcnQsIHJwLCBydgotCWxkcglccnAsID0oQVQ5MV9CQVNFX1NZUyArIEFUOTFfREJHVSkJCUAgU3lzdGVtIHBlcmlwaGVyYWxzIChwaHlzIGFkZHJlc3MpCi0JbGRyCVxydiwgPShBVDkxX1ZBX0JBU0VfU1lTCSsgQVQ5MV9EQkdVKQkJQCBTeXN0ZW0gcGVyaXBoZXJhbHMgKHZpcnQgYWRkcmVzcykKKwlsZHIJXHJwLCA9KEFUOTFfQkFTRV9TWVMgKyBBVDkxX0RCR1UpCUAgU3lzdGVtIHBlcmlwaGVyYWxzIChwaHlzIGFkZHJlc3MpCisJbGRyCVxydiwgPShBVDkxX1ZBX0JBU0VfU1lTCSsgQVQ5MV9EQkdVKQlAIFN5c3RlbSBwZXJpcGhlcmFscyAodmlydCBhZGRyZXNzKQogCS5lbmRtCiAKIAkubWFjcm8Jc2VuZHVhcnQscmQscngKLQlzdHJiCVxyZCwgW1xyeCwgIyhBVDkxX0RCR1VfVEhSIC0gQVQ5MV9EQkdVKV0JQCBXcml0ZSB0byBUcmFuc21pdHRlciBIb2xkaW5nIFJlZ2lzdGVyCisJc3RyYglccmQsIFtccngsICMoQVQ5MV9EQkdVX1RIUildCQlAIFdyaXRlIHRvIFRyYW5zbWl0dGVyIEhvbGRpbmcgUmVnaXN0ZXIKIAkuZW5kbQogCiAJLm1hY3JvCXdhaXR1YXJ0LHJkLHJ4Ci0xMDAxOglsZHIJXHJkLCBbXHJ4LCAjKEFUOTFfREJHVV9TUiAtIEFUOTFfREJHVSldCQlAIFJlYWQgU3RhdHVzIFJlZ2lzdGVyCi0JdHN0CVxyZCwgI0FUOTFfREJHVV9UWFJEWQkJCQlAIERCR1VfVFhSRFkgPSAxIHdoZW4gcmVhZHkgdG8gdHJhbnNtaXQKKzEwMDE6CWxkcglccmQsIFtccngsICMoQVQ5MV9EQkdVX1NSKV0JCUAgUmVhZCBTdGF0dXMgUmVnaXN0ZXIKKwl0c3QJXHJkLCAjQVQ5MV9EQkdVX1RYUkRZCQkJQCBEQkdVX1RYUkRZID0gMSB3aGVuIHJlYWR5IHRvIHRyYW5zbWl0CiAJYmVxCTEwMDFiCiAJLmVuZG0KIAogCS5tYWNybwlidXN5dWFydCxyZCxyeAotMTAwMToJbGRyCVxyZCwgW1xyeCwgIyhBVDkxX0RCR1VfU1IgLSBBVDkxX0RCR1UpXQkJQCBSZWFkIFN0YXR1cyBSZWdpc3RlcgotCXRzdAlccmQsICNBVDkxX0RCR1VfVFhFTVBUWQkJCQlAIERCR1VfVFhFTVBUWSA9IDEgd2hlbiB0cmFuc21pc3Npb24gY29tcGxldGUKKzEwMDE6CWxkcglccmQsIFtccngsICMoQVQ5MV9EQkdVX1NSKV0JCUAgUmVhZCBTdGF0dXMgUmVnaXN0ZXIKKwl0c3QJXHJkLCAjQVQ5MV9EQkdVX1RYRU1QVFkJCQlAIERCR1VfVFhFTVBUWSA9IDEgd2hlbiB0cmFuc21pc3Npb24gY29tcGxldGUKIAliZXEJMTAwMWIKIAkuZW5kbQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKaW5kZXggMTAwOGI5Zi4uNDgzNDc4ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaApAQCAtMzYsNiArMzYsMjAgQEAKICNlcnJvciAiVW5zdXBwb3J0ZWQgQVQ5MSBwcm9jZXNzb3IiCiAjZW5kaWYKIAorI2lmICFkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFYNDApCisvKgorICogT24gYWxsIGF0OTEgZXhjZXB0IHJtOTIwMCBhbmQgeDQwIGhhdmUgdGhlIFN5c3RlbSBDb250cm9sbGVyIHN0YXJ0cworICogYXQgYWRkcmVzcyAweGZmZmZjMDAwIGFuZCBoYXMgYSBzaXplIG9mIDE2S2lCLgorICoKKyAqIE9uIHJtOTIwMCBpdCdzIHN0YXJ0IGF0IDB4ZmZmZTQwMDAgb2YgMTExS2lCIHdpdGggbm9uIHJlc2VydmVkIGRhdGEgc3RhcnRpbmcKKyAqIGF0IDB4ZmZmZmYwMDAKKyAqCisgKiBSZW1vdmVzIHRoZSBpbmRpdmlkdWFsIGRlZmluaXRpb25zIG9mIEFUOTFfQkFTRV9TWVMgYW5kCisgKiByZXBsYWNlcyB0aGVtIHdpdGggYSBjb21tb24gdmVyc2lvbiBhdCBiYXNlIDB4ZmZmZmZjMDAwIGFuZCBzaXplIDE2S2lCCisgKiBhbmQgbWFwIHRoZSBzYW1lIG1lbW9yeSBzcGFjZQorICovCisjZGVmaW5lIEFUOTFfQkFTRV9TWVMJMHhmZmZmYzAwMAorI2VuZGlmCiAKIC8qCiAgKiBQZXJpcGhlcmFsIGlkZW50aWZpZXJzL2ludGVycnVwdHMuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2lvLmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2lvLmgKaW5kZXggMGIwY2NjYy4uNDI5OGU3OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9pby5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvaW8uaApAQCAtMjEsMTQgKzIxLDIzIEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfSU9fSAogI2RlZmluZSBfX0FTTV9BUkNIX0lPX0gKIAorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKwogI2RlZmluZSBJT19TUEFDRV9MSU1JVAkJMHhGRkZGRkZGRgogCiAjZGVmaW5lIF9faW8oYSkJCV9fdHlwZXNhZmVfaW8oYSkKICNkZWZpbmUgX19tZW1fcGNpKGEpCShhKQogCi0KICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKKyNpZm5kZWYgQ09ORklHX0FSQ0hfQVQ5MVg0MAorI2RlZmluZSBfX2FyY2hfaW9yZW1hcAlhdDkxX2lvcmVtYXAKKyNkZWZpbmUgX19hcmNoX2lvdW5tYXAJYXQ5MV9pb3VubWFwCisjZW5kaWYKKwordm9pZCBfX2lvbWVtICphdDkxX2lvcmVtYXAodW5zaWduZWQgbG9uZyBwaHlzLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IHR5cGUpOwordm9pZCBhdDkxX2lvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKTsKKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXQ5MV9zeXNfcmVhZCh1bnNpZ25lZCBpbnQgcmVnX29mZnNldCkKIHsKIAl2b2lkIF9faW9tZW0gKmFkZHIgPSAodm9pZCBfX2lvbWVtICopQVQ5MV9WQV9CQVNFX1NZUzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE2NDI5NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9zZXR1cC5jCkBAIC0wLDAgKzEsMjk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEF0bWVsIENvcnBvcmF0aW9uLgorICogQ29weXJpZ2h0IChDKSAyMDExIEplYW4tQ2hyaXN0b3BoZSBQTEFHTklPTC1WSUxMQVJEIDxwbGFnbmlvakBqY3Jvc29mdC5jb20+CisgKgorICogVW5kZXIgR1BMdjIKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9jcHUuaD4KKyNpbmNsdWRlIDxtYWNoL2F0OTFfZGJndS5oPgorI2luY2x1ZGUgPG1hY2gvYXQ5MV9wbWMuaD4KKworI2luY2x1ZGUgInNvYy5oIgorI2luY2x1ZGUgImdlbmVyaWMuaCIKKworc3RydWN0IGF0OTFfaW5pdF9zb2MgX19pbml0ZGF0YSBhdDkxX2Jvb3Rfc29jOworCitzdHJ1Y3QgYXQ5MV9zb2NpbmZvIGF0OTFfc29jX2luaXRkYXRhOworRVhQT1JUX1NZTUJPTChhdDkxX3NvY19pbml0ZGF0YSk7CisKK3ZvaWQgX19pbml0IGF0OTFybTkyMDBfc2V0X3R5cGUoaW50IHR5cGUpCit7CisJaWYgKHR5cGUgPT0gQVJDSF9SRVZJU09OXzkyMDBfUFFGUCkKKwkJYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9IEFUOTFfU09DX1JNOTIwMF9CR0E7CisJZWxzZQorCQlhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID0gQVQ5MV9TT0NfUk05MjAwX1BRRlA7Cit9CisKK3ZvaWQgX19pbml0IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCh2b2lkKQoreworCWF0OTFfaW5pdF9pbnRlcnJ1cHRzKGF0OTFfYm9vdF9zb2MuZGVmYXVsdF9pcnFfcHJpb3JpdHkpOworfQorCit2b2lkIF9faW5pdCBhdDkxX2luaXRfaW50ZXJydXB0cyh1bnNpZ25lZCBpbnQgKnByaW9yaXR5KQoreworCS8qIEluaXRpYWxpemUgdGhlIEFJQyBpbnRlcnJ1cHQgY29udHJvbGxlciAqLworCWF0OTFfYWljX2luaXQocHJpb3JpdHkpOworCisJLyogRW5hYmxlIEdQSU8gaW50ZXJydXB0cyAqLworCWF0OTFfZ3Bpb19pcnFfc2V0dXAoKTsKK30KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBzcmFtX2Rlc2NbMl0gX19pbml0ZGF0YTsKKwordm9pZCBfX2luaXQgYXQ5MV9pbml0X3NyYW0oaW50IGJhbmssIHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgbWFwX2Rlc2MgKmRlc2MgPSAmc3JhbV9kZXNjW2JhbmtdOworCisJZGVzYy0+dmlydHVhbCA9IEFUOTFfSU9fVklSVF9CQVNFIC0gbGVuZ3RoOworCWlmIChiYW5rID4gMCkKKwkJZGVzYy0+dmlydHVhbCAtPSBzcmFtX2Rlc2NbYmFuayAtIDFdLmxlbmd0aDsKKworCWRlc2MtPnBmbiA9IF9fcGh5c190b19wZm4oYmFzZSk7CisJZGVzYy0+bGVuZ3RoID0gbGVuZ3RoOworCWRlc2MtPnR5cGUgPSBNVF9ERVZJQ0U7CisKKwlwcl9pbmZvKCJBVDkxOiBzcmFtIGF0IDB4JWx4IG9mIDB4JXggbWFwcGVkIGF0IDB4JWx4XG4iLAorCQliYXNlLCBsZW5ndGgsIGRlc2MtPnZpcnR1YWwpOworCisJaW90YWJsZV9pbml0KGRlc2MsIDEpOworfQorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIGF0OTFfaW9fZGVzYyBfX2luaXRkYXRhID0geworCS52aXJ0dWFsCT0gQVQ5MV9WQV9CQVNFX1NZUywKKwkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MV9CQVNFX1NZUyksCisJLmxlbmd0aAkJPSBTWl8xNkssCisJLnR5cGUJCT0gTVRfREVWSUNFLAorfTsKKwordm9pZCBfX2lvbWVtICphdDkxX2lvcmVtYXAodW5zaWduZWQgbG9uZyBwLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJaWYgKHAgPj0gQVQ5MV9CQVNFX1NZUyAmJiBwIDw9IChBVDkxX0JBU0VfU1lTICsgU1pfMTZLIC0gMSkpCisJCXJldHVybiAodm9pZCBfX2lvbWVtICopQVQ5MV9JT19QMlYocCk7CisKKwlyZXR1cm4gX19hcm1faW9yZW1hcF9jYWxsZXIocCwgc2l6ZSwgdHlwZSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKK30KK0VYUE9SVF9TWU1CT0woYXQ5MV9pb3JlbWFwKTsKKwordm9pZCBhdDkxX2lvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXVuc2lnbmVkIGxvbmcgdmlydCA9ICh1bnNpZ25lZCBsb25nKWFkZHI7CisKKwlpZiAodmlydCA+PSBWTUFMTE9DX1NUQVJUICYmIHZpcnQgPCBWTUFMTE9DX0VORCkKKwkJX19pb3VubWFwKGFkZHIpOworfQorRVhQT1JUX1NZTUJPTChhdDkxX2lvdW5tYXApOworCisjZGVmaW5lIEFUOTFfREJHVTAJMHhmZmZmZjIwMAorI2RlZmluZSBBVDkxX0RCR1UxCTB4ZmZmZmVlMDAKKworc3RhdGljIHZvaWQgX19pbml0IHNvY19kZXRlY3QodTMyIGRiZ3VfYmFzZSkKK3sKKwl1MzIgY2lkciwgc29jaWQ7CisKKwljaWRyID0gX19yYXdfcmVhZGwoQVQ5MV9JT19QMlYoZGJndV9iYXNlKSArIEFUOTFfREJHVV9DSURSKTsKKwlzb2NpZCA9IGNpZHIgJiB+QVQ5MV9DSURSX1ZFUlNJT047CisKKwlzd2l0Y2ggKHNvY2lkKSB7CisJY2FzZSBBUkNIX0lEX0FUOTFDQVA5OiB7CisjaWZkZWYgQ09ORklHX0FUOTFfUE1DX1VOSVQKKwkJdTMyIHBtY192ZXIgPSBhdDkxX3N5c19yZWFkKEFUOTFfUE1DX1ZFUik7CisKKwkJaWYgKHBtY192ZXIgPT0gQVJDSF9SRVZJU0lPTl9DQVA5X0IpCisJCQlhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID0gQVQ5MV9TT0NfQ0FQOV9SRVZfQjsKKwkJZWxzZSBpZiAocG1jX3ZlciA9PSBBUkNIX1JFVklTSU9OX0NBUDlfQykKKwkJCWF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPSBBVDkxX1NPQ19DQVA5X1JFVl9DOworI2VuZGlmCisJCWF0OTFfc29jX2luaXRkYXRhLnR5cGUgPSBBVDkxX1NPQ19DQVA5OworCQlhdDkxX2Jvb3Rfc29jID0gYXQ5MWNhcDlfc29jOworCQlicmVhazsKKwl9CisKKwljYXNlIEFSQ0hfSURfQVQ5MVJNOTIwMDoKKwkJYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9IEFUOTFfU09DX1JNOTIwMDsKKwkJYXQ5MV9ib290X3NvYyA9IGF0OTFybTkyMDBfc29jOworCQlicmVhazsKKworCWNhc2UgQVJDSF9JRF9BVDkxU0FNOTI2MDoKKwkJYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9IEFUOTFfU09DX1NBTTkyNjA7CisJCWF0OTFfYm9vdF9zb2MgPSBhdDkxc2FtOTI2MF9zb2M7CisJCWJyZWFrOworCisJY2FzZSBBUkNIX0lEX0FUOTFTQU05MjYxOgorCQlhdDkxX3NvY19pbml0ZGF0YS50eXBlID0gQVQ5MV9TT0NfU0FNOTI2MTsKKwkJYXQ5MV9ib290X3NvYyA9IGF0OTFzYW05MjYxX3NvYzsKKwkJYnJlYWs7CisKKwljYXNlIEFSQ0hfSURfQVQ5MVNBTTkyNjM6CisJCWF0OTFfc29jX2luaXRkYXRhLnR5cGUgPSBBVDkxX1NPQ19TQU05MjYzOworCQlhdDkxX2Jvb3Rfc29jID0gYXQ5MXNhbTkyNjNfc29jOworCQlicmVhazsKKworCWNhc2UgQVJDSF9JRF9BVDkxU0FNOUcyMDoKKwkJYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9IEFUOTFfU09DX1NBTTlHMjA7CisJCWF0OTFfYm9vdF9zb2MgPSBhdDkxc2FtOTI2MF9zb2M7CisJCWJyZWFrOworCisJY2FzZSBBUkNIX0lEX0FUOTFTQU05RzQ1OgorCQlhdDkxX3NvY19pbml0ZGF0YS50eXBlID0gQVQ5MV9TT0NfU0FNOUc0NTsKKwkJaWYgKGNpZHIgPT0gQVJDSF9JRF9BVDkxU0FNOUc0NUVTKQorCQkJYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9IEFUOTFfU09DX1NBTTlHNDVFUzsKKwkJYXQ5MV9ib290X3NvYyA9IGF0OTFzYW05ZzQ1X3NvYzsKKwkJYnJlYWs7CisKKwljYXNlIEFSQ0hfSURfQVQ5MVNBTTlSTDY0OgorCQlhdDkxX3NvY19pbml0ZGF0YS50eXBlID0gQVQ5MV9TT0NfU0FNOVJMOworCQlhdDkxX2Jvb3Rfc29jID0gYXQ5MXNhbTlybF9zb2M7CisJCWJyZWFrOworCisJY2FzZSBBUkNIX0lEX0FUOTFTQU05WDU6CisJCWF0OTFfc29jX2luaXRkYXRhLnR5cGUgPSBBVDkxX1NPQ19TQU05WDU7CisJCWF0OTFfYm9vdF9zb2MgPSBhdDkxc2FtOXg1X3NvYzsKKwkJYnJlYWs7CisJfQorCisJLyogYXQ5MXNhbTlnMTAgKi8KKwlpZiAoKGNpZHIgJiB+QVQ5MV9DSURSX0VYVCkgPT0gQVJDSF9JRF9BVDkxU0FNOUcxMCkgeworCQlhdDkxX3NvY19pbml0ZGF0YS50eXBlID0gQVQ5MV9TT0NfU0FNOUcxMDsKKwkJYXQ5MV9ib290X3NvYyA9IGF0OTFzYW05MjYxX3NvYzsKKwl9CisJLyogYXQ5MXNhbTl4ZSAqLworCWVsc2UgaWYgKChjaWRyICYgQVQ5MV9DSURSX0FSQ0gpID09IEFSQ0hfRkFNSUxZX0FUOTFTQU05WEUpIHsKKwkJYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9IEFUOTFfU09DX1NBTTkyNjA7CisJCWF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPSBBVDkxX1NPQ19TQU05WEU7CisJCWF0OTFfYm9vdF9zb2MgPSBhdDkxc2FtOTI2MF9zb2M7CisJfQorCisJaWYgKCFhdDkxX3NvY19pc19kZXRlY3RlZCgpKQorCQlyZXR1cm47CisKKwlhdDkxX3NvY19pbml0ZGF0YS5jaWRyID0gY2lkcjsKKworCS8qIHN1YiB2ZXJzaW9uIG9mIHNvYyAqLworCWF0OTFfc29jX2luaXRkYXRhLmV4aWQgPSBfX3Jhd19yZWFkbChBVDkxX0lPX1AyVihkYmd1X2Jhc2UpICsgQVQ5MV9EQkdVX0VYSUQpOworCisJaWYgKGF0OTFfc29jX2luaXRkYXRhLnR5cGUgPT0gQVQ5MV9TT0NfU0FNOUc0NSkgeworCQlzd2l0Y2ggKGF0OTFfc29jX2luaXRkYXRhLmV4aWQpIHsKKwkJY2FzZSBBUkNIX0VYSURfQVQ5MVNBTTlNMTA6CisJCQlhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID0gQVQ5MV9TT0NfU0FNOU0xMDsKKwkJCWJyZWFrOworCQljYXNlIEFSQ0hfRVhJRF9BVDkxU0FNOUc0NjoKKwkJCWF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPSBBVDkxX1NPQ19TQU05RzQ2OworCQkJYnJlYWs7CisJCWNhc2UgQVJDSF9FWElEX0FUOTFTQU05TTExOgorCQkJYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9IEFUOTFfU09DX1NBTTlNMTE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChhdDkxX3NvY19pbml0ZGF0YS50eXBlID09IEFUOTFfU09DX1NBTTlYNSkgeworCQlzd2l0Y2ggKGF0OTFfc29jX2luaXRkYXRhLmV4aWQpIHsKKwkJY2FzZSBBUkNIX0VYSURfQVQ5MVNBTTlHMTU6CisJCQlhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID0gQVQ5MV9TT0NfU0FNOUcxNTsKKwkJCWJyZWFrOworCQljYXNlIEFSQ0hfRVhJRF9BVDkxU0FNOUczNToKKwkJCWF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPSBBVDkxX1NPQ19TQU05RzM1OworCQkJYnJlYWs7CisJCWNhc2UgQVJDSF9FWElEX0FUOTFTQU05WDM1OgorCQkJYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9IEFUOTFfU09DX1NBTTlYMzU7CisJCQlicmVhazsKKwkJY2FzZSBBUkNIX0VYSURfQVQ5MVNBTTlHMjU6CisJCQlhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID0gQVQ5MV9TT0NfU0FNOUcyNTsKKwkJCWJyZWFrOworCQljYXNlIEFSQ0hfRVhJRF9BVDkxU0FNOVgyNToKKwkJCWF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPSBBVDkxX1NPQ19TQU05WDI1OworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpzb2NfbmFtZVtdID0geworCVtBVDkxX1NPQ19STTkyMDBdCT0gImF0OTFybTkyMDAiLAorCVtBVDkxX1NPQ19DQVA5XQkJPSAiYXQ5MWNhcDkiLAorCVtBVDkxX1NPQ19TQU05MjYwXQk9ICJhdDkxc2FtOTI2MCIsCisJW0FUOTFfU09DX1NBTTkyNjFdCT0gImF0OTFzYW05MjYxIiwKKwlbQVQ5MV9TT0NfU0FNOTI2M10JPSAiYXQ5MXNhbTkyNjMiLAorCVtBVDkxX1NPQ19TQU05RzEwXQk9ICJhdDkxc2FtOWcxMCIsCisJW0FUOTFfU09DX1NBTTlHMjBdCT0gImF0OTFzYW05ZzIwIiwKKwlbQVQ5MV9TT0NfU0FNOUc0NV0JPSAiYXQ5MXNhbTlnNDUiLAorCVtBVDkxX1NPQ19TQU05UkxdCT0gImF0OTFzYW05cmwiLAorCVtBVDkxX1NPQ19TQU05WDVdCT0gImF0OTFzYW05eDUiLAorCVtBVDkxX1NPQ19OT05FXQkJPSAiVW5rbm93biIKK307CisKK2NvbnN0IGNoYXIgKmF0OTFfZ2V0X3NvY190eXBlKHN0cnVjdCBhdDkxX3NvY2luZm8gKmMpCit7CisJcmV0dXJuIHNvY19uYW1lW2MtPnR5cGVdOworfQorRVhQT1JUX1NZTUJPTChhdDkxX2dldF9zb2NfdHlwZSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpzb2Nfc3VidHlwZV9uYW1lW10gPSB7CisJW0FUOTFfU09DX1JNOTIwMF9CR0FdCT0gImF0OTFybTkyMDAgQkdBIiwKKwlbQVQ5MV9TT0NfUk05MjAwX1BRRlBdCT0gImF0OTFybTkyMDAgUFFGUCIsCisJW0FUOTFfU09DX0NBUDlfUkVWX0JdCT0gImF0OTFjYXA5IHJldkIiLAorCVtBVDkxX1NPQ19DQVA5X1JFVl9DXQk9ICJhdDkxY2FwOSByZXZDIiwKKwlbQVQ5MV9TT0NfU0FNOVhFXQk9ICJhdDkxc2FtOXhlIiwKKwlbQVQ5MV9TT0NfU0FNOUc0NUVTXQk9ICJhdDkxc2FtOWc0NWVzIiwKKwlbQVQ5MV9TT0NfU0FNOU0xMF0JPSAiYXQ5MXNhbTltMTAiLAorCVtBVDkxX1NPQ19TQU05RzQ2XQk9ICJhdDkxc2FtOWc0NiIsCisJW0FUOTFfU09DX1NBTTlNMTFdCT0gImF0OTFzYW05bTExIiwKKwlbQVQ5MV9TT0NfU0FNOUcxNV0JPSAiYXQ5MXNhbTlnMTUiLAorCVtBVDkxX1NPQ19TQU05RzM1XQk9ICJhdDkxc2FtOWczNSIsCisJW0FUOTFfU09DX1NBTTlYMzVdCT0gImF0OTFzYW05eDM1IiwKKwlbQVQ5MV9TT0NfU0FNOUcyNV0JPSAiYXQ5MXNhbTlnMjUiLAorCVtBVDkxX1NPQ19TQU05WDI1XQk9ICJhdDkxc2FtOXgyNSIsCisJW0FUOTFfU09DX1NVQlRZUEVfTk9ORV0JPSAiVW5rbm93biIKK307CisKK2NvbnN0IGNoYXIgKmF0OTFfZ2V0X3NvY19zdWJ0eXBlKHN0cnVjdCBhdDkxX3NvY2luZm8gKmMpCit7CisJcmV0dXJuIHNvY19zdWJ0eXBlX25hbWVbYy0+c3VidHlwZV07Cit9CitFWFBPUlRfU1lNQk9MKGF0OTFfZ2V0X3NvY19zdWJ0eXBlKTsKKwordm9pZCBfX2luaXQgYXQ5MV9tYXBfaW8odm9pZCkKK3sKKwkvKiBNYXAgcGVyaXBoZXJhbHMgKi8KKwlpb3RhYmxlX2luaXQoJmF0OTFfaW9fZGVzYywgMSk7CisKKwlhdDkxX3NvY19pbml0ZGF0YS50eXBlID0gQVQ5MV9TT0NfTk9ORTsKKwlhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID0gQVQ5MV9TT0NfU1VCVFlQRV9OT05FOworCisJc29jX2RldGVjdChBVDkxX0RCR1UwKTsKKwlpZiAoIWF0OTFfc29jX2lzX2RldGVjdGVkKCkpCisJCXNvY19kZXRlY3QoQVQ5MV9EQkdVMSk7CisKKwlpZiAoIWF0OTFfc29jX2lzX2RldGVjdGVkKCkpCisJCXBhbmljKCJBVDkxOiBJbXBvc3NpYmxlIHRvIGRldGVjdCB0aGUgU09DIHR5cGUiKTsKKworCXByX2luZm8oIkFUOTE6IERldGVjdGVkIHNvYyB0eXBlOiAlc1xuIiwKKwkJYXQ5MV9nZXRfc29jX3R5cGUoJmF0OTFfc29jX2luaXRkYXRhKSk7CisJcHJfaW5mbygiQVQ5MTogRGV0ZWN0ZWQgc29jIHN1YnR5cGU6ICVzXG4iLAorCQlhdDkxX2dldF9zb2Nfc3VidHlwZSgmYXQ5MV9zb2NfaW5pdGRhdGEpKTsKKworCWlmICghYXQ5MV9zb2NfaXNfZW5hYmxlZCgpKQorCQlwYW5pYygiQVQ5MTogU29jIG5vdCBlbmFibGVkIik7CisKKwlpZiAoYXQ5MV9ib290X3NvYy5tYXBfaW8pCisJCWF0OTFfYm9vdF9zb2MubWFwX2lvKCk7Cit9CisKK3ZvaWQgX19pbml0IGF0OTFfaW5pdGlhbGl6ZSh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spCit7CisJLyogSW5pdCBjbG9jayBzdWJzeXN0ZW0gKi8KKwlhdDkxX2Nsb2NrX2luaXQobWFpbl9jbG9jayk7CisKKwkvKiBSZWdpc3RlciB0aGUgcHJvY2Vzc29yLXNwZWNpZmljIGNsb2NrcyAqLworCWF0OTFfYm9vdF9zb2MucmVnaXN0ZXJfY2xvY2tzKCk7CisKKwlhdDkxX2Jvb3Rfc29jLmluaXQoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9zb2MuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9zb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWVkODgxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL3NvYy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgSmVhbi1DaHJpc3RvcGhlIFBMQUdOSU9MLVZJTExBUkQgPHBsYWduaW9qQGpjcm9zb2Z0LmNvbT4KKyAqCisgKiBVbmRlciBHUEx2MgorICovCisKK3N0cnVjdCBhdDkxX2luaXRfc29jIHsKKwl1bnNpZ25lZCBpbnQgKmRlZmF1bHRfaXJxX3ByaW9yaXR5OworCXZvaWQgKCptYXBfaW8pKHZvaWQpOworCXZvaWQgKCpyZWdpc3Rlcl9jbG9ja3MpKHZvaWQpOworCXZvaWQgKCppbml0KSh2b2lkKTsKK307CisKK2V4dGVybiBzdHJ1Y3QgYXQ5MV9pbml0X3NvYyBhdDkxX2Jvb3Rfc29jOworZXh0ZXJuIHN0cnVjdCBhdDkxX2luaXRfc29jIGF0OTFjYXA5X3NvYzsKK2V4dGVybiBzdHJ1Y3QgYXQ5MV9pbml0X3NvYyBhdDkxcm05MjAwX3NvYzsKK2V4dGVybiBzdHJ1Y3QgYXQ5MV9pbml0X3NvYyBhdDkxc2FtOTI2MF9zb2M7CitleHRlcm4gc3RydWN0IGF0OTFfaW5pdF9zb2MgYXQ5MXNhbTkyNjFfc29jOworZXh0ZXJuIHN0cnVjdCBhdDkxX2luaXRfc29jIGF0OTFzYW05MjYzX3NvYzsKK2V4dGVybiBzdHJ1Y3QgYXQ5MV9pbml0X3NvYyBhdDkxc2FtOWc0NV9zb2M7CitleHRlcm4gc3RydWN0IGF0OTFfaW5pdF9zb2MgYXQ5MXNhbTlybF9zb2M7CitleHRlcm4gc3RydWN0IGF0OTFfaW5pdF9zb2MgYXQ5MXNhbTl4NV9zb2M7CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0OTFfc29jX2lzX2VuYWJsZWQodm9pZCkKK3sKKwlyZXR1cm4gYXQ5MV9ib290X3NvYy5pbml0ICE9IE5VTEw7Cit9CisKKyNpZiAhZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxQ0FQOSkKKyNkZWZpbmUgYXQ5MWNhcDlfc29jCWF0OTFfYm9vdF9zb2MKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMCkKKyNkZWZpbmUgYXQ5MXJtOTIwMF9zb2MJYXQ5MV9ib290X3NvYworI2VuZGlmCisKKyNpZiAhKGRlZmluZWQoQ09ORklHX0FSQ0hfQVQ5MVNBTTkyNjApIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfQVQ5MVNBTTlHMjApKQorI2RlZmluZSBhdDkxc2FtOTI2MF9zb2MJYXQ5MV9ib290X3NvYworI2VuZGlmCisKKyNpZiAhKGRlZmluZWQoQ09ORklHX0FSQ0hfQVQ5MVNBTTkyNjEpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfQVQ5MVNBTTlHMTApKQorI2RlZmluZSBhdDkxc2FtOTI2MV9zb2MJYXQ5MV9ib290X3NvYworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxU0FNOTI2MykKKyNkZWZpbmUgYXQ5MXNhbTkyNjNfc29jCWF0OTFfYm9vdF9zb2MKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ09ORklHX0FSQ0hfQVQ5MVNBTTlHNDUpCisjZGVmaW5lIGF0OTFzYW05ZzQ1X3NvYwlhdDkxX2Jvb3Rfc29jCisjZW5kaWYKKworI2lmICFkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFTQU05UkwpCisjZGVmaW5lIGF0OTFzYW05cmxfc29jCWF0OTFfYm9vdF9zb2MKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ09ORklHX0FSQ0hfQVQ5MVNBTTlYNSkKKyNkZWZpbmUgYXQ5MXNhbTl4NV9zb2MJYXQ5MV9ib290X3NvYworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNuczN4eHgvcGNpZS5jIGIvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L3BjaWUuYwppbmRleCBhNGVjMDgwLi4wNmZkMjVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNuczN4eHgvcGNpZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtY25zM3h4eC9wY2llLmMKQEAgLTE3Miw3ICsxNzIsNyBAQAogCXJldHVybiBwY2lfc2Nhbl9idXMoc3lzLT5idXNuciwgJmNuczN4eHhfcGNpZV9vcHMsIHN5cyk7CiB9CiAKLXN0YXRpYyBpbnQgY25zM3h4eF9wY2llX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBjbnMzeHh4X3BjaWVfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RydWN0IGNuczN4eHhfcGNpZSAqY25zcGNpID0gcGRldl90b19jbnNwY2koZGV2KTsKIAlpbnQgaXJxID0gY25zcGNpLT5pcnFzW3Nsb3RdOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kb3ZlL3BjaWUuYyBiL2FyY2gvYXJtL21hY2gtZG92ZS9wY2llLmMKaW5kZXggYzJmMWM0Ny4uYWEyYjNhMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kb3ZlL3BjaWUuYworKysgYi9hcmNoL2FybS9tYWNoLWRvdmUvcGNpZS5jCkBAIC0xOTMsNyArMTkzLDcgQEAKIAlyZXR1cm4gYnVzOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBkb3ZlX3BjaWVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBkb3ZlX3BjaWVfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RydWN0IHBjaWVfcG9ydCAqcHAgPSBidXNfdG9fcG9ydChkZXYtPmJ1cy0+bnVtYmVyKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NhdHMtcGNpLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY2F0cy1wY2kuYwppbmRleCBhZTNlMWM4Li4zMjMyMWY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY2F0cy1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY2F0cy1wY2kuYwpAQCAtMTYsNyArMTYsNyBAQAogLyogY2F0cyBob3N0LXNwZWNpZmljIHN0dWZmICovCiBzdGF0aWMgaW50IGlycW1hcF9jYXRzW10gX19pbml0ZGF0YSA9IHsgSVJRX1BDSSwgSVJRX0lOMCwgSVJRX0lOMSwgSVJRX0lOMyB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBjYXRzX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgY2F0c19tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpZiAoZGV2LT5pcnEgPj0gMjU1KQogCQlyZXR1cm4gLTE7CS8qIG5vdCBhIHZhbGlkIGludGVycnVwdC4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9lYnNhMjg1LXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2Vic2EyODUtcGNpLmMKaW5kZXggZTVhYjViZC4uNTExYzY3MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2Vic2EyODUtcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2Vic2EyODUtcGNpLmMKQEAgLTE1LDcgKzE1LDcgQEAKIAogc3RhdGljIGludCBpcnFtYXBfZWJzYTI4NVtdIF9faW5pdGRhdGEgPSB7IElSUV9JTjMsIElSUV9JTjEsIElSUV9JTjAsIElSUV9QQ0kgfTsKIAotc3RhdGljIGludCBfX2luaXQgZWJzYTI4NV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IGVic2EyODVfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaWYgKGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfQ09OVEFRICYmCiAJICAgIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQ09OVEFRXzgyQzY5MykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItcGNpLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvbmV0d2luZGVyLXBjaS5jCmluZGV4IGUyNjNkNmQuLjYyMTg3NjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1wY2kuYwpAQCAtMTcsNyArMTcsNyBAQAogICogV2Ugbm93IHVzZSB0aGUgc2xvdCBJRCBpbnN0ZWFkIG9mIHRoZSBkZXZpY2UgaWRlbnRpZmllcnMgdG8gc2VsZWN0CiAgKiB3aGljaCBpbnRlcnJ1cHQgaXMgcm91dGVkIHdoZXJlLgogICovCi1zdGF0aWMgaW50IF9faW5pdCBuZXR3aW5kZXJfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBuZXR3aW5kZXJfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3dpdGNoIChzbG90KSB7CiAJY2FzZSAwOiAgLyogaG9zdCBicmlkZ2UgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9wZXJzb25hbC1wY2kuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9wZXJzb25hbC1wY2kuYwppbmRleCBkNWZjYTk1Li5hZWI2NTFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvcGVyc29uYWwtcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3BlcnNvbmFsLXBjaS5jCkBAIC0xOCw3ICsxOCw4IEBACiAJSVJRX0RPT1JCRUxMSE9TVCwgSVJRX0RNQTEsIElSUV9ETUEyLCBJUlFfUENJCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBwZXJzb25hbF9zZXJ2ZXJfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBwZXJzb25hbF9zZXJ2ZXJfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LAorCXU4IHBpbikKIHsKIAl1bnNpZ25lZCBjaGFyIGxpbmU7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDEuYyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDEuYwppbmRleCBkY2M0MTcyLi40YWFiZWIyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MS5jCkBAIC01ODcsOSArNTg3LDkgQEAKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgIm1tYSIsIG1tYV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXhfdWRjLjAiLCBOVUxMLCB1c2JkX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImdwdCIsIGdwdF9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4wIiwgTlVMTCwgdWFydF9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4xIiwgTlVMTCwgdWFydF9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4yIiwgTlVMTCwgdWFydF9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgxLXVhcnQuMCIsIE5VTEwsIHVhcnRfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MS11YXJ0LjEiLCBOVUxMLCB1YXJ0X2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDEtdWFydC4yIiwgTlVMTCwgdWFydF9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtaTJjLjAiLCBOVUxMLCBpMmNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14MS1jc3BpLjAiLCBOVUxMLCBzcGlfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14MS1jc3BpLjEiLCBOVUxMLCBzcGlfY2xrKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjEuYyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDIxLmMKaW5kZXggYmYzMGE4Yy4uZWUxNWQ4YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjEuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgyMS5jCkBAIC0xMTYyLDEwICsxMTYyLDEwIEBACiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJwZXJjbGszIiwgcGVyX2Nsa1syXSkKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInBlcmNsazQiLCBwZXJfY2xrWzNdKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiY2xrbyIsIGNsa29fY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMCIsIE5VTEwsIHVhcnRfY2xrWzBdKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMSIsIE5VTEwsIHVhcnRfY2xrWzFdKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMiIsIE5VTEwsIHVhcnRfY2xrWzJdKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMyIsIE5VTEwsIHVhcnRfY2xrWzNdKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4wIiwgTlVMTCwgdWFydF9jbGtbMF0pCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjEiLCBOVUxMLCB1YXJ0X2Nsa1sxXSkKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuMiIsIE5VTEwsIHVhcnRfY2xrWzJdKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4zIiwgTlVMTCwgdWFydF9jbGtbM10pCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHQxIiwgZ3B0X2Nsa1swXSkKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImdwdDEiLCBncHRfY2xrWzFdKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3B0MSIsIGdwdF9jbGtbMl0pCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgyNS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjUuYwppbmRleCBhZjFjNTgwLi4wZmM3YmE1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgyNS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDI1LmMKQEAgLTI3MiwxMSArMjcyLDEyIEBACiAJfSwKIAogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjAiLCBOVUxMLCB1YXJ0MV9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4xIiwgTlVMTCwgdWFydDJfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMiIsIE5VTEwsIHVhcnQzX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjMiLCBOVUxMLCB1YXJ0NF9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC40IiwgTlVMTCwgdWFydDVfY2xrKQorCS8qIGkubXgyNSBoYXMgdGhlIGkubXgyMSB0eXBlIHVhcnQgKi8KKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuMCIsIE5VTEwsIHVhcnQxX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuMSIsIE5VTEwsIHVhcnQyX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuMiIsIE5VTEwsIHVhcnQzX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuMyIsIE5VTEwsIHVhcnQ0X2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuNCIsIE5VTEwsIHVhcnQ1X2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soIm14Yy1laGNpLjAiLCAidXNiIiwgdXNib3RnX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soIm14Yy1laGNpLjEiLCAidXNiIiwgdXNib3RnX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soIm14Yy1laGNpLjIiLCAidXNiIiwgdXNib3RnX2NsaykKQEAgLTI5NSwxOSArMjk2LDIwIEBACiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtaTJjLjAiLCBOVUxMLCBpMmNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LWkyYy4xIiwgTlVMTCwgaTJjX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1pMmMuMiIsIE5VTEwsIGkyY19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJmZWMuMCIsIE5VTEwsIGZlY19jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyNS1mZWMuMCIsIE5VTEwsIGZlY19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXhkaV9ydGMuMCIsIE5VTEwsIGRyeWljZV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtZmIuMCIsIE5VTEwsIGxjZGNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14Mi13ZHQuMCIsIE5VTEwsIHdkdF9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtc3NpLjAiLCBOVUxMLCBzc2kxX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1zc2kuMSIsIE5VTEwsIHNzaTJfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14LjAiLCBOVUxMLCBlc2RoYzFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14LjEiLCBOVUxMLCBlc2RoYzJfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14MjUuMCIsIE5VTEwsIGVzZGhjMV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJzZGhjaS1lc2RoYy1pbXgyNS4xIiwgTlVMTCwgZXNkaGMyX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soIm14Mi1jYW1lcmEuMCIsIE5VTEwsIGNzaV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJhdWRtdXgiLCBhdWRtdXhfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiZmxleGNhbi4wIiwgTlVMTCwgY2FuMV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJmbGV4Y2FuLjEiLCBOVUxMLCBjYW4yX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC1zZG1hIiwgTlVMTCwgc2RtYV9jbGspCisJLyogaS5teDI1IGhhcyB0aGUgaS5teDM1IHR5cGUgc2RtYSAqLworCV9SRUdJU1RFUl9DTE9DSygiaW14MzUtc2RtYSIsIE5VTEwsIHNkbWFfY2xrKQogfTsKIAogaW50IF9faW5pdCBteDI1X2Nsb2Nrc19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgyNy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjcuYwppbmRleCA1ODNmMjUxLi42OTEyYjgyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgyNy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDI3LmMKQEAgLTYyNCwxMiArNjI0LDEzIEBACiAJfSwKIAogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjAiLCBOVUxMLCB1YXJ0MV9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4xIiwgTlVMTCwgdWFydDJfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMiIsIE5VTEwsIHVhcnQzX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjMiLCBOVUxMLCB1YXJ0NF9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC40IiwgTlVMTCwgdWFydDVfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuNSIsIE5VTEwsIHVhcnQ2X2NsaykKKwkvKiBpLm14MjcgaGFzIHRoZSBpLm14MjEgdHlwZSB1YXJ0ICovCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjAiLCBOVUxMLCB1YXJ0MV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjEiLCBOVUxMLCB1YXJ0Ml9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjIiLCBOVUxMLCB1YXJ0M19jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjMiLCBOVUxMLCB1YXJ0NF9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjQiLCBOVUxMLCB1YXJ0NV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjUiLCBOVUxMLCB1YXJ0Nl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHQxIiwgZ3B0MV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHQyIiwgZ3B0Ml9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHQzIiwgZ3B0M19jbGspCkBAIC02NjIsNyArNjYzLDcgQEAKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImJyb20iLCBicm9tX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImVtbWEiLCBlbW1hX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInNsY2RjIiwgc2xjZGNfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiZmVjLjAiLCBOVUxMLCBmZWNfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjctZmVjLjAiLCBOVUxMLCBmZWNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZW1pIiwgZW1pX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInNhaGFyYTIiLCBzYWhhcmEyX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImF0YSIsIGF0YV9jbGspCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgzMS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MzEuYwppbmRleCAyNWYzNDNmLi5kOTczNzcwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgzMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDMxLmMKQEAgLTU0NywxMSArNTQ3LDEyIEBACiAJX1JFR0lTVEVSX0NMT0NLKCJmc2wtdXNiMi11ZGMiLCAidXNiIiwgdXNiX2NsazEpCiAJX1JFR0lTVEVSX0NMT0NLKCJmc2wtdXNiMi11ZGMiLCAidXNiX2FoYiIsIHVzYl9jbGsyKQogCV9SRUdJU1RFUl9DTE9DSygibXgzLWNhbWVyYS4wIiwgTlVMTCwgY3NpX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjAiLCBOVUxMLCB1YXJ0MV9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4xIiwgTlVMTCwgdWFydDJfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMiIsIE5VTEwsIHVhcnQzX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjMiLCBOVUxMLCB1YXJ0NF9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC40IiwgTlVMTCwgdWFydDVfY2xrKQorCS8qIGkubXgzMSBoYXMgdGhlIGkubXgyMSB0eXBlIHVhcnQgKi8KKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuMCIsIE5VTEwsIHVhcnQxX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuMSIsIE5VTEwsIHVhcnQyX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuMiIsIE5VTEwsIHVhcnQzX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuMyIsIE5VTEwsIHVhcnQ0X2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuNCIsIE5VTEwsIHVhcnQ1X2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1pMmMuMCIsIE5VTEwsIGkyYzFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LWkyYy4xIiwgTlVMTCwgaTJjMl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtaTJjLjIiLCBOVUxMLCBpMmMzX2NsaykKQEAgLTU2NCw3ICs1NjUsNyBAQAogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiYXRhIiwgYXRhX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInJ0aWMiLCBydGljX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInJuZyIsIHJuZ19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtc2RtYSIsIE5VTEwsIHNkbWFfY2xrMSkKKwlfUkVHSVNURVJfQ0xPQ0soImlteDMxLXNkbWEiLCBOVUxMLCBzZG1hX2NsazEpCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJzZG1hX2lwZyIsIHNkbWFfY2xrMikKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgIm1zdGljayIsIG1zdGljazFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAibXN0aWNrIiwgbXN0aWNrMl9jbGspCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgzNS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MzUuYwppbmRleCA1YTRjYzFlLi44OGI2MmEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgzNS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDM1LmMKQEAgLTQ1OCwxMCArNDU4LDExIEBACiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtZXBpdC4wIiwgTlVMTCwgZXBpdDFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LWVwaXQuMSIsIE5VTEwsIGVwaXQyX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImVzYWkiLCBlc2FpX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteC4wIiwgTlVMTCwgZXNkaGMxX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteC4xIiwgTlVMTCwgZXNkaGMyX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteC4yIiwgTlVMTCwgZXNkaGMzX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImZlYy4wIiwgTlVMTCwgZmVjX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteDM1LjAiLCBOVUxMLCBlc2RoYzFfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14MzUuMSIsIE5VTEwsIGVzZGhjMl9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJzZGhjaS1lc2RoYy1pbXgzNS4yIiwgTlVMTCwgZXNkaGMzX2NsaykKKwkvKiBpLm14MzUgaGFzIHRoZSBpLm14MjcgdHlwZSBmZWMgKi8KKwlfUkVHSVNURVJfQ0xPQ0soImlteDI3LWZlYy4wIiwgTlVMTCwgZmVjX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImdwaW8iLCBncGlvMV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncGlvIiwgZ3BpbzJfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3BpbyIsIGdwaW8zX2NsaykKQEAgLTQ4MSwxNCArNDgyLDE1IEBACiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJydGMiLCBydGNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAicnRpYyIsIHJ0aWNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAic2NjIiwgc2NjX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC1zZG1hIiwgTlVMTCwgc2RtYV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgzNS1zZG1hIiwgTlVMTCwgc2RtYV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJzcGJhIiwgc3BiYV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJzcGRpZiIsIHNwZGlmX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1zc2kuMCIsIE5VTEwsIHNzaTFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LXNzaS4xIiwgTlVMTCwgc3NpMl9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4wIiwgTlVMTCwgdWFydDFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMSIsIE5VTEwsIHVhcnQyX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjIiLCBOVUxMLCB1YXJ0M19jbGspCisJLyogaS5teDM1IGhhcyB0aGUgaS5teDIxIHR5cGUgdWFydCAqLworCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4wIiwgTlVMTCwgdWFydDFfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4xIiwgTlVMTCwgdWFydDJfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4yIiwgTlVMTCwgdWFydDNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygibXhjLWVoY2kuMCIsICJ1c2IiLCB1c2JvdGdfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygibXhjLWVoY2kuMSIsICJ1c2IiLCB1c2JvdGdfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygibXhjLWVoY2kuMiIsICJ1c2IiLCB1c2JvdGdfY2xrKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvZXVrcmVhX21iaW14c2QyNS1iYXNlYm9hcmQuYyBiL2FyY2gvYXJtL21hY2gtaW14L2V1a3JlYV9tYmlteHNkMjUtYmFzZWJvYXJkLmMKaW5kZXggMDFlYmNiMy4uNjZlODcyNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvZXVrcmVhX21iaW14c2QyNS1iYXNlYm9hcmQuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9ldWtyZWFfbWJpbXhzZDI1LWJhc2Vib2FyZC5jCkBAIC0yMjUsNyArMjI1LDggQEAKIAogc3RhdGljIHN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhIHNkMV9wZGF0YSA9IHsKIAkuY2RfZ3BpbyA9IEdQSU9fU0QxQ0QsCi0JLndwX2dwaW8gPSAtRUlOVkFMLAorCS5jZF90eXBlID0gRVNESENfQ0RfR1BJTywKKwkud3BfdHlwZSA9IEVTREhDX1dQX05PTkUsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvZXVrcmVhX21iaW14c2QzNS1iYXNlYm9hcmQuYyBiL2FyY2gvYXJtL21hY2gtaW14L2V1a3JlYV9tYmlteHNkMzUtYmFzZWJvYXJkLmMKaW5kZXggNTU4ZWI1Mi4uMGYwYWYwMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvZXVrcmVhX21iaW14c2QzNS1iYXNlYm9hcmQuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9ldWtyZWFfbWJpbXhzZDM1LWJhc2Vib2FyZC5jCkBAIC0yMzYsNyArMjM2LDggQEAKIAogc3RhdGljIHN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhIHNkMV9wZGF0YSA9IHsKIAkuY2RfZ3BpbyA9IEdQSU9fU0QxQ0QsCi0JLndwX2dwaW8gPSAtRUlOVkFMLAorCS5jZF90eXBlID0gRVNESENfQ0RfR1BJTywKKwkud3BfdHlwZSA9IEVTREhDX1dQX05PTkUsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDI1XzNkcy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDI1XzNkcy5jCmluZGV4IDAxNTM0YmIuLjdmNjZhOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyNV8zZHMuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjVfM2RzLmMKQEAgLTIxNSw2ICsyMTUsOCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhIG14MjVwZGtfZXNkaGNfcGRhdGEgX19pbml0Y29uc3QgPSB7CiAJLndwX2dwaW8gPSBTRDFfR1BJT19XUCwKIAkuY2RfZ3BpbyA9IFNEMV9HUElPX0NELAorCS53cF90eXBlID0gRVNESENfV1BfR1BJTywKKwkuY2RfdHlwZSA9IEVTREhDX0NEX0dQSU8sCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgbXgyNXBka19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTA0My5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY20wNDMuYwppbmRleCAxNjNjYzMxLi42NjBlYzNlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTA0My5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDQzLmMKQEAgLTM0OSw2ICszNDksOCBAQAogc3RhdGljIHN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhIHNkMV9wZGF0YSA9IHsKIAkud3BfZ3BpbyA9IFNEMV9HUElPX1dQLAogCS5jZF9ncGlvID0gU0QxX0dQSU9fQ0QsCisJLndwX3R5cGUgPSBFU0RIQ19XUF9HUElPLAorCS5jZF90eXBlID0gRVNESENfQ0RfR1BJTywKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgyNS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MjUuYwppbmRleCA4YmYwMjkxLi5jYzRkMTUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgyNS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDI1LmMKQEAgLTc5LDcgKzc5LDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2RtYV9wbGF0Zm9ybV9kYXRhIGlteDI1X3NkbWFfcGRhdGEgX19pbml0ZGF0YSA9IHsKLQkuc2RtYV92ZXJzaW9uID0gMiwKIAkuZndfbmFtZSA9ICJzZG1hLWlteDI1LmJpbiIsCiAJLnNjcmlwdF9hZGRycyA9ICZpbXgyNV9zZG1hX3NjcmlwdCwKIH07CkBAIC05Miw1ICs5MSw2IEBACiAJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAyLCBNWDI1X0dQSU8zX0JBU0VfQUREUiwgU1pfMTZLLCBNWDI1X0lOVF9HUElPMywgMCk7CiAJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAzLCBNWDI1X0dQSU80X0JBU0VfQUREUiwgU1pfMTZLLCBNWDI1X0lOVF9HUElPNCwgMCk7CiAKLQlpbXhfYWRkX2lteF9zZG1hKE1YMjVfU0RNQV9CQVNFX0FERFIsIE1YMjVfSU5UX1NETUEsICZpbXgyNV9zZG1hX3BkYXRhKTsKKwkvKiBpLm14MjUgaGFzIHRoZSBpLm14MzUgdHlwZSBzZG1hICovCisJaW14X2FkZF9pbXhfc2RtYSgiaW14MzUtc2RtYSIsIE1YMjVfU0RNQV9CQVNFX0FERFIsIE1YMjVfSU5UX1NETUEsICZpbXgyNV9zZG1hX3BkYXRhKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDMxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgzMS5jCmluZGV4IDYxYmZmMzguLmI3YzU1ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDMxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MzEuYwpAQCAtNjksNyArNjksNiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzZG1hX3BsYXRmb3JtX2RhdGEgaW14MzFfc2RtYV9wZGF0YSBfX2luaXRkYXRhID0gewotCS5zZG1hX3ZlcnNpb24gPSAxLAogCS5md19uYW1lID0gInNkbWEtaW14MzEtdG8yLmJpbiIsCiAJLnNjcmlwdF9hZGRycyA9ICZpbXgzMV90bzJfc2RtYV9zY3JpcHQsCiB9OwpAQCAtODgsNSArODcsNSBAQAogCQlpbXgzMV9zZG1hX3BkYXRhLnNjcmlwdF9hZGRycyA9ICZpbXgzMV90bzFfc2RtYV9zY3JpcHQ7CiAJfQogCi0JaW14X2FkZF9pbXhfc2RtYShNWDMxX1NETUFfQkFTRV9BRERSLCBNWDMxX0lOVF9TRE1BLCAmaW14MzFfc2RtYV9wZGF0YSk7CisJaW14X2FkZF9pbXhfc2RtYSgiaW14MzEtc2RtYSIsIE1YMzFfU0RNQV9CQVNFX0FERFIsIE1YMzFfSU5UX1NETUEsICZpbXgzMV9zZG1hX3BkYXRhKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDM1LmMgYi9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgzNS5jCmluZGV4IDk4NzY5YWUuLmY0OWJhYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDM1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MzUuYwpAQCAtODYsNyArODYsNiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzZG1hX3BsYXRmb3JtX2RhdGEgaW14MzVfc2RtYV9wZGF0YSBfX2luaXRkYXRhID0gewotCS5zZG1hX3ZlcnNpb24gPSAyLAogCS5md19uYW1lID0gInNkbWEtaW14MzUtdG8yLmJpbiIsCiAJLnNjcmlwdF9hZGRycyA9ICZpbXgzNV90bzJfc2RtYV9zY3JpcHQsCiB9OwpAQCAtMTA2LDUgKzEwNSw1IEBACiAJCWlteDM1X3NkbWFfcGRhdGEuc2NyaXB0X2FkZHJzID0gJmlteDM1X3RvMV9zZG1hX3NjcmlwdDsKIAl9CiAKLQlpbXhfYWRkX2lteF9zZG1hKE1YMzVfU0RNQV9CQVNFX0FERFIsIE1YMzVfSU5UX1NETUEsICZpbXgzNV9zZG1hX3BkYXRhKTsKKwlpbXhfYWRkX2lteF9zZG1hKCJpbXgzNS1zZG1hIiwgTVgzNV9TRE1BX0JBU0VfQUREUiwgTVgzNV9JTlRfU0RNQSwgJmlteDM1X3NkbWFfcGRhdGEpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL3BjaS5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL3BjaS5jCmluZGV4IDJmZGI5NTQuLjUyMGI2YmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGNpLmMKQEAgLTk1LDcgKzk1LDcgQEAKICAqIG1hcCB0aGUgc3BlY2lmaWVkIGRldmljZS9zbG90L3BpbiB0byBhbiBJUlEuICBUaGlzIHdvcmtzIG91dCBzdWNoCiAgKiB0aGF0IHNsb3QgOSBwaW4gMSBpcyBJTlQwLCBwaW4gMiBpcyBJTlQxLCBhbmQgc2xvdCAxMCBwaW4gMSBpcyBJTlQxLgogICovCi1zdGF0aWMgaW50IF9faW5pdCBpbnRlZ3JhdG9yX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgaW50ZWdyYXRvcl9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaW50bnIgPSAoKHNsb3QgLSA5KSArIChwaW4gLSAxKSkgJiAzOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaXE4MTM0MG1jLmMgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaXE4MTM0MG1jLmMKaW5kZXggOWI1YTYzZi4uMjNkZmFmZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2lxODEzNDBtYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pcTgxMzQwbWMuYwpAQCAtMzAsNyArMzAsNyBAQAogZXh0ZXJuIGludCBpbml0X2F0dTsgLyogRmxhZyB0byBzZWxlY3Qgd2hpY2ggQVRVKHMpIHRvIGluaXRpYWxpemUgLyBkaXNhYmxlICovCiAKIHN0YXRpYyBpbnQgX19pbml0Ci1pcTgxMzQwbWNfcGNpeF9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IGlkc2VsLCB1OCBwaW4pCitpcTgxMzQwbWNfcGNpeF9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IGlkc2VsLCB1OCBwaW4pCiB7CiAJc3dpdGNoIChpZHNlbCkgewogCWNhc2UgMToKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9wY2kuYyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9wY2kuYwppbmRleCAwNjkwYjFkLi4yNTFjNDA4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L3BjaS5jCkBAIC0zODgsNyArMzg4LDcgQEAKIH0KIAogc3RhdGljIGludAotaW9wMTN4eF9wY2llX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggaWRzZWwsIHU4IHBpbikKK2lvcDEzeHhfcGNpZV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IGlkc2VsLCB1OCBwaW4pCiB7CiAJV0FSTl9PTihpZHNlbCAhPSAwKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvZW03MjEwLmMgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9lbTcyMTAuYwppbmRleCA3NzlmOTI0Li42Y2JmZmJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9lbTcyMTAuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9lbTcyMTAuYwpAQCAtODEsNyArODEsNyBAQAogI2RlZmluZSBJTlRECUlSUV9JT1AzMlhfWElOVDMKIAogc3RhdGljIGludCBfX2luaXQKLWVtNzIxMF9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitlbTcyMTBfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBpbnQgcGNpX2lycV90YWJsZVtdWzRdID0gewogCQkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvZ2xhbnRhbmsuYyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2dsYW50YW5rLmMKaW5kZXggYzZiNmY5Yy4uY2VlZjVkNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvZ2xhbnRhbmsuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9nbGFudGFuay5jCkBAIC03Nyw3ICs3Nyw3IEBACiAjZGVmaW5lIElOVEQJSVJRX0lPUDMyWF9YSU5UMwogCiBzdGF0aWMgaW50IF9faW5pdAotZ2xhbnRhbmtfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorZ2xhbnRhbmtfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBpbnQgcGNpX2lycV90YWJsZVtdWzRdID0gewogCQkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvaXEzMTI0NC5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvaXEzMTI0NC5jCmluZGV4IGZkZTk2MmMuLjNhNjI1MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lxMzEyNDQuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9pcTMxMjQ0LmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogICogRVA4MDIxOS9JUTMxMjQ0IFBDSS4KICAqLwogc3RhdGljIGludCBfX2luaXQKLWVwODAyMTlfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorZXA4MDIxOV9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaW50IGlycTsKIApAQCAtMTM5LDcgKzEzOSw3IEBACiB9OwogCiBzdGF0aWMgaW50IF9faW5pdAotaXEzMTI0NF9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpcTMxMjQ0X3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pcTgwMzIxLmMgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9pcTgwMzIxLmMKaW5kZXggM2E5NTk1MC4uMzViN2U2OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvaXE4MDMyMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lxODAzMjEuYwpAQCAtNzEsNyArNzEsNyBAQAogICogSVE4MDMyMSBQQ0kuCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0Ci1pcTgwMzIxX3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2lxODAzMjFfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBpcnE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9uMjEwMC5jCmluZGV4IDYyNmFhMzcuLjFhMzc0ZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvbjIxMDAuYwpAQCAtNzgsNyArNzgsNyBAQAogICogTjIxMDAgUENJLgogICovCiBzdGF0aWMgaW50IF9faW5pdAotbjIxMDBfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorbjIxMDBfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBpcnE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzN4L2lxODAzMzEuYyBiL2FyY2gvYXJtL21hY2gtaW9wMzN4L2lxODAzMzEuYwppbmRleCBjNTY1ZjhkLi42MzdjMDI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMzeC9pcTgwMzMxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaXE4MDMzMS5jCkBAIC01NCw3ICs1NCw3IEBACiAgKiBJUTgwMzMxIFBDSS4KICAqLwogc3RhdGljIGludCBfX2luaXQKLWlxODAzMzFfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoraXE4MDMzMV9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaW50IGlycTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaXE4MDMzMi5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaXE4MDMzMi5jCmluZGV4IDM2YTllZmIuLjkwYTA0MzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzN4L2lxODAzMzIuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDMzeC9pcTgwMzMyLmMKQEAgLTU0LDcgKzU0LDcgQEAKICAqIElRODAzMzIgUENJLgogICovCiBzdGF0aWMgaW50IF9faW5pdAotaXE4MDMzMl9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpcTgwMzMyX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvZW5wMjYxMS5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2VucDI2MTEuYwppbmRleCA4ODY2M2FiLi42MmM2MGFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvZW5wMjYxMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9lbnAyNjExLmMKQEAgLTE0OCw3ICsxNDgsOCBAQAogCXJldHVybiBwY2lfc2Nhbl9idXMoc3lzLT5idXNuciwgJmVucDI2MTFfcGNpX29wcywgc3lzKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgZW5wMjYxMV9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBlbnAyNjExX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsCisJdTggcGluKQogewogCWludCBpcnE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjQwMC5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMKaW5kZXggZGZmZmMxZS4uNWJhZDFhOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMKQEAgLTc4LDcgKzc4LDggQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgaXhkcDI0MDBfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgaXhkcDI0MDBfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwKKwl1OCBwaW4pCiB7CiAJaWYgKGl4ZHAyeDAwX21hc3Rlcl9ucHUoKSkgewogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI4MDAuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jCmluZGV4IGNkNGM5YmMuLjNkM2NlZjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jCkBAIC0xNjEsNyArMTYxLDggQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgaXhkcDI4MDBfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgaXhkcDI4MDBfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwKKwl1OCBwaW4pCiB7CiAJaWYgKGl4ZHAyeDAwX21hc3Rlcl9ucHUoKSkgewogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDEuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMS5jCmluZGV4IDg0ODM1YjIuLmJlMmEyNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMS5jCkBAIC0yNTIsNyArMjUyLDggQEAKIAogI2RlZmluZSBERVZQSU4oZGV2LCBwaW4pICgocGluKSB8ICgoZGV2KSA8PCAzKSkKIAotc3RhdGljIGludCBfX2luaXQgaXhkcDJ4MDFfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgaXhkcDJ4MDFfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwKKwl1OCBwaW4pCiB7CiAJdTggYnVzID0gZGV2LT5idXMtPm51bWJlcjsKIAl1MzIgZGV2cGluID0gREVWUElOKFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCBwaW4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L2l4ZHAyMzUxLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaXhkcDIzNTEuYwppbmRleCA4ZGNiYTE3Li5lYzAyOGUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaXhkcDIzNTEuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaXhkcDIzNTEuYwpAQCAtMTY4LDcgKzE2OCw3IEBACiAgKi8KICNkZWZpbmUgREVWUElOKGRldiwgcGluKSAoKHBpbikgfCAoKGRldikgPDwgMykpCiAKLXN0YXRpYyBpbnQgX19pbml0IGl4ZHAyMzUxX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgaXhkcDIzNTFfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJdTggYnVzID0gZGV2LT5idXMtPm51bWJlcjsKIAl1MzIgZGV2cGluID0gREVWUElOKFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCBwaW4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L3JvYWRydW5uZXIuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9yb2FkcnVubmVyLmMKaW5kZXggOGZlMGM2Mi4uODQ0NTUxZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L3JvYWRydW5uZXIuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvcm9hZHJ1bm5lci5jCkBAIC01Niw3ICs1Niw4IEBACiAjZGVmaW5lIElOVENfUElOCUlYUDIzWFhfR1BJT19QSU5fMTEKICNkZWZpbmUgSU5URF9QSU4JSVhQMjNYWF9HUElPX1BJTl8xMgogCi1zdGF0aWMgaW50IF9faW5pdCByb2FkcnVubmVyX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggaWRzZWwsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IHJvYWRydW5uZXJfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBpZHNlbCwKKwl1OCBwaW4pCiB7CiAJc3RhdGljIGludCBwY2lfY2FyZF9zbG90X2lycVtdID0ge0lOVEIsIElOVEMsIElOVEQsIElOVEF9OwogCXN0YXRpYyBpbnQgcG1jX2NhcmRfc2xvdF9pcnFbXSA9IHtJTlRBLCBJTlRCLCBJTlRDLCBJTlREfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2F2aWxhLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvYXZpbGEtcGNpLmMKaW5kZXggMTYyMDQzZi4uOGZlYTBhMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvYXZpbGEtcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvYXZpbGEtcGNpLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAlpeHA0eHhfcGNpX3ByZWluaXQoKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgYXZpbGFfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBhdmlsYV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgaW50IHBjaV9pcnFfdGFibGVbSVJRX0xJTkVTXSA9IHsKIAkJSVhQNFhYX0dQSU9fSVJRKElOVEEpLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXBjaS5jCmluZGV4IDM3ZmRhN2QuLjcxZjVjOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtcGNpLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAlpeHA0eHhfcGNpX3ByZWluaXQoKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgY295b3RlX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgY295b3RlX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWlmIChzbG90ID09IFNMT1QwX0RFVklEKQogCQlyZXR1cm4gSVhQNFhYX0dQSU9fSVJRKFNMT1QwX0lOVEEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZHNtZzYwMC1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2RzbWc2MDAtcGNpLmMKaW5kZXggYzc2MTIwMS4uMDUzMjUxMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZHNtZzYwMC1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9kc21nNjAwLXBjaS5jCkBAIC00NCw3ICs0NCw3IEBACiAJaXhwNHh4X3BjaV9wcmVpbml0KCk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGRzbWc2MDBfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBkc21nNjAwX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBpbnQgcGNpX2lycV90YWJsZVtNQVhfREVWXVtJUlFfTElORVNdID0gewogCQl7IElYUDRYWF9HUElPX0lSUShJTlRFKSwgLTEsIC0xIH0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9mc2ctcGNpLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9mc2ctcGNpLmMKaW5kZXggNDRjY2RlOS4uZDJhYzgwMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZnNnLXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2ZzZy1wY2kuYwpAQCAtMzgsNyArMzgsNyBAQAogCWl4cDR4eF9wY2lfcHJlaW5pdCgpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBmc2dfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBmc2dfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGludCBwY2lfaXJxX3RhYmxlW0lSUV9MSU5FU10gPSB7CiAJCUlYUDRYWF9HUElPX0lSUShJTlRDKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2dhdGV3YXk3MDAxLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ2F0ZXdheTcwMDEtcGNpLmMKaW5kZXggZmMxMTI0MS4uNzY1ODFmYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ2F0ZXdheTcwMDEtcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ2F0ZXdheTcwMDEtcGNpLmMKQEAgLTM1LDcgKzM1LDggQEAKIAlpeHA0eHhfcGNpX3ByZWluaXQoKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgZ2F0ZXdheTcwMDFfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBnYXRld2F5NzAwMV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsCisJdTggcGluKQogewogCWlmIChzbG90ID09IDEpCiAJCXJldHVybiBJUlFfSVhQNFhYX0dQSU8xMTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2dvcmFtb19tbHIuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2dvcmFtb19tbHIuYwppbmRleCA1ZjAwYWQyLi43NTQ4ZDlhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9nb3JhbW9fbWxyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ29yYW1vX21sci5jCkBAIC00NjIsNyArNDYyLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGdtbHJfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBnbWxyX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN3aXRjaChzbG90KSB7CiAJY2FzZSBTTE9UX0VUSEE6CXJldHVybiBJWFA0WFhfR1BJT19JUlEoR1BJT19JUlFfRVRIQSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9ndHd4NTcxNS1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXBjaS5jCmluZGV4IDM4Y2MwNzIuLmQ2OGZjMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXBjaS5jCkBAIC00OSw3ICs0OSw3IEBACiB9CiAKIAotc3RhdGljIGludCBfX2luaXQgZ3R3eDU3MTVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBndHd4NTcxNV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgcmMgPSAtMTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtcGNpLmMKaW5kZXggNThmNDAwNC4uZmZmZDhjNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXBjaS5jCkBAIC00Myw3ICs0Myw3IEBACiAJaXhwNHh4X3BjaV9wcmVpbml0KCk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGl4ZHA0MjVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBpeGRwNDI1X21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBpbnQgcGNpX2lycV90YWJsZVtJUlFfTElORVNdID0gewogCQlJWFA0WFhfR1BJT19JUlEoSU5UQSksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwZzQyNS1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHBnNDI1LXBjaS5jCmluZGV4IGU2NGY2ZDAuLjM0ZWZlNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHBnNDI1LXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHBnNDI1LXBjaS5jCkBAIC0zMSw3ICszMSw3IEBACiAJaXhwNHh4X3BjaV9wcmVpbml0KCk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGl4ZHBnNDI1X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgaXhkcGc0MjVfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaWYgKHNsb3QgPT0gMTIgfHwgc2xvdCA9PSAxMykKIAkJcmV0dXJuIElSUV9JWFA0WFhfR1BJTzc7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbmFzMTAwZC1wY2kuYwppbmRleCA0MjhkMTIwLi41NDM0Y2NmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtcGNpLmMKQEAgLTQxLDcgKzQxLDcgQEAKIAlpeHA0eHhfcGNpX3ByZWluaXQoKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgbmFzMTAwZF9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IG5hczEwMGRfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGludCBwY2lfaXJxX3RhYmxlW01BWF9ERVZdW0lSUV9MSU5FU10gPSB7CiAJCXsgSVhQNFhYX0dQSU9fSVJRKElOVEEpLCAtMSwgLTEgfSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItcGNpLmMKaW5kZXggMmU4NWY3Ni4uYjU3MTYwNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItcGNpLmMKQEAgLTM4LDcgKzM4LDcgQEAKIAlpeHA0eHhfcGNpX3ByZWluaXQoKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgbnNsdTJfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBuc2x1Ml9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgaW50IHBjaV9pcnFfdGFibGVbSVJRX0xJTkVTXSA9IHsKIAkJSVhQNFhYX0dQSU9fSVJRKElOVEEpLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvdnVsY2FuLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvdnVsY2FuLXBjaS5jCmluZGV4IDAzYmRlYzUuLjBiYzNmMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L3Z1bGNhbi1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC92dWxjYW4tcGNpLmMKQEAgLTQzLDcgKzQzLDcgQEAKIAlpeHA0eHhfcGNpX3ByZWluaXQoKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgdnVsY2FuX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgdnVsY2FuX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWlmIChzbG90ID09IDEpCiAJCXJldHVybiBJWFA0WFhfR1BJT19JUlEoSU5UQSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC93ZzMwMnYyLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvd2czMDJ2Mi1wY2kuYwppbmRleCAxN2YzY2Y1Li5mMjdkZmNmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC93ZzMwMnYyLXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L3dnMzAydjItcGNpLmMKQEAgLTM1LDcgKzM1LDcgQEAKIAlpeHA0eHhfcGNpX3ByZWluaXQoKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgd2czMDJ2Ml9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IHdnMzAydjJfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaWYgKHNsb3QgPT0gMSkKIAkJcmV0dXJuIElSUV9JWFA0WFhfR1BJTzg7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3BjaWUuYyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcGNpZS5jCmluZGV4IGJmZWI5YzkuLjc0Yjk5MmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcGNpZS5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcGNpZS5jCkBAIC0yNDUsNyArMjQ1LDggQEAKIAlyZXR1cm4gYnVzOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBraXJrd29vZF9wY2llX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQga2lya3dvb2RfcGNpZV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsCisJdTggcGluKQogewogCXN0cnVjdCBwY2llX3BvcnQgKnBwID0gYnVzX3RvX3BvcnQoZGV2LT5idXMpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtzODY5NS9ib2FyZC1kc20zMjAuYyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLWRzbTMyMC5jCmluZGV4IGFkYTkyYjYuLjEzMzhjYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLWRzbTMyMC5jCisrKyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLWRzbTMyMC5jCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCiAjaWZkZWYgQ09ORklHX1BDSQotc3RhdGljIGludCBkc20zMjBfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBkc20zMjBfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN3aXRjaCAoc2xvdCkgewogCWNhc2UgMDoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLW1pY3JlbC5jIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtbWljcmVsLmMKaW5kZXggYzdhZDA5Yi4uZTJlM2NiYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtbWljcmVsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtbWljcmVsLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAKICNpZmRlZiBDT05GSUdfUENJCi1zdGF0aWMgaW50IG1pY3JlbF9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IG1pY3JlbF9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJcmV0dXJuIEtTODY5NV9JUlFfRVhURVJOMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9kZXZpY2VzLmggYi9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvZGV2aWNlcy5oCmluZGV4IDI3NDRmZWMuLjg1YTNjOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9kZXZpY2VzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL2RldmljZXMuaApAQCAtMzAsNyArMzAsNyBAQAogCiBzdHJ1Y3Qga3M4Njk1X3BjaV9jZmcgewogCXNob3J0IG1vZGU7Ci0JaW50ICgqbWFwX2lycSkoc3RydWN0IHBjaV9kZXYgKiwgdTgsIHU4KTsKKwlpbnQgKCptYXBfaXJxKShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqLCB1OCwgdTgpOwogfTsKIGV4dGVybiBfX2luaXQgdm9pZCBrczg2OTVfaW5pdF9wY2koc3RydWN0IGtzODY5NV9wY2lfY2ZnICopOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1tc20vS2NvbmZpZwppbmRleCA4ODhlOTI1Li5lYmRlOTdmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL0tjb25maWcKQEAgLTExLDYgKzExLDcgQEAKIAlzZWxlY3QgTVNNX1NNRAogCXNlbGVjdCBNU01fU01EX1BLRzMKIAlzZWxlY3QgQ1BVX1Y2CisJc2VsZWN0IEdQSU9fTVNNX1YxCiAJc2VsZWN0IE1TTV9QUk9DX0NPTU0KIAlzZWxlY3QgSEFTX01TTV9ERUJVR19VQVJUX1BIWVMKIApAQCAtMjIsNiArMjMsNyBAQAogCXNlbGVjdCBNU01fVklDCiAJc2VsZWN0IENQVV9WNwogCXNlbGVjdCBNU01fR1BJT01VWAorCXNlbGVjdCBHUElPX01TTV9WMQogCXNlbGVjdCBNU01fUFJPQ19DT01NCiAJc2VsZWN0IEhBU19NU01fREVCVUdfVUFSVF9QSFlTCiAKQEAgLTMzLDYgKzM1LDcgQEAKIAlzZWxlY3QgTVNNX1ZJQwogCXNlbGVjdCBDUFVfVjcKIAlzZWxlY3QgTVNNX0dQSU9NVVgKKwlzZWxlY3QgR1BJT19NU01fVjEKIAlzZWxlY3QgTVNNX1BST0NfQ09NTQogCXNlbGVjdCBIQVNfTVNNX0RFQlVHX1VBUlRfUEhZUwogCkBAIC00NCw2ICs0Nyw3IEBACiAJc2VsZWN0IEFSTV9HSUMKIAlzZWxlY3QgQ1BVX1Y3CiAJc2VsZWN0IE1TTV9WMl9UTE1NCisJc2VsZWN0IEdQSU9fTVNNX1YyCiAJc2VsZWN0IE1TTV9HUElPTVVYCiAJc2VsZWN0IE1TTV9TQ00gaWYgU01QCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1tc20vTWFrZWZpbGUKaW5kZXggYjcwNjU4Yy4uNDI4NWRmZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vTWFrZWZpbGUKQEAgLTI5LDExICsyOSwzIEBACiBvYmotJChDT05GSUdfQVJDSF9NU003WDMwKSArPSBncGlvbXV4LXYxLm8gZ3Bpb211eC5vCiBvYmotJChDT05GSUdfQVJDSF9RU0Q4WDUwKSArPSBncGlvbXV4LTh4NTAubyBncGlvbXV4LXYxLm8gZ3Bpb211eC5vCiBvYmotJChDT05GSUdfQVJDSF9NU004WDYwKSArPSBncGlvbXV4LTh4NjAubyBncGlvbXV4LXYyLm8gZ3Bpb211eC5vCi1pZmRlZiBDT05GSUdfTVNNX1YyX1RMTU0KLWlmbmRlZiBDT05GSUdfQVJDSF9NU004OTYwCi0jIFRPRE86IFRMTU0gTWFwcGluZyBpc3N1ZXMgbmVlZCB0byBiZSByZXNvbHZlZAotb2JqLXkJKz0gZ3Bpby12Mi5vCi1lbmRpZgotZWxzZQotb2JqLXkJKz0gZ3Bpby5vCi1lbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vZ3Bpby5jIGIvYXJjaC9hcm0vbWFjaC1tc20vZ3Bpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWEyNzNiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2dwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLW1zbS9ncGlvLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgImdwaW9faHcuaCIKLSNpbmNsdWRlICJncGlvbXV4LmgiCi0KLSNkZWZpbmUgRklSU1RfR1BJT19JUlEgTVNNX0dQSU9fVE9fSU5UKDApCi0KLSNkZWZpbmUgTVNNX0dQSU9fQkFOSyhiYW5rLCBmaXJzdCwgbGFzdCkJCQkJXAotCXsJCQkJCQkJCVwKLQkJLnJlZ3MgPSB7CQkJCQkJXAotCQkJLm91dCA9ICAgICAgICAgTVNNX0dQSU9fT1VUXyMjYmFuaywJCVwKLQkJCS5pbiA9ICAgICAgICAgIE1TTV9HUElPX0lOXyMjYmFuaywJCVwKLQkJCS5pbnRfc3RhdHVzID0gIE1TTV9HUElPX0lOVF9TVEFUVVNfIyNiYW5rLAlcCi0JCQkuaW50X2NsZWFyID0gICBNU01fR1BJT19JTlRfQ0xFQVJfIyNiYW5rLAlcCi0JCQkuaW50X2VuID0gICAgICBNU01fR1BJT19JTlRfRU5fIyNiYW5rLAkJXAotCQkJLmludF9lZGdlID0gICAgTVNNX0dQSU9fSU5UX0VER0VfIyNiYW5rLAlcCi0JCQkuaW50X3BvcyA9ICAgICBNU01fR1BJT19JTlRfUE9TXyMjYmFuaywJCVwKLQkJCS5vZSA9ICAgICAgICAgIE1TTV9HUElPX09FXyMjYmFuaywJCVwKLQkJfSwJCQkJCQkJXAotCQkuY2hpcCA9IHsJCQkJCQlcCi0JCQkuYmFzZSA9IChmaXJzdCksCQkJCVwKLQkJCS5uZ3BpbyA9IChsYXN0KSAtIChmaXJzdCkgKyAxLAkJCVwKLQkJCS5nZXQgPSBtc21fZ3Bpb19nZXQsCQkJCVwKLQkJCS5zZXQgPSBtc21fZ3Bpb19zZXQsCQkJCVwKLQkJCS5kaXJlY3Rpb25faW5wdXQgPSBtc21fZ3Bpb19kaXJlY3Rpb25faW5wdXQsCVwKLQkJCS5kaXJlY3Rpb25fb3V0cHV0ID0gbXNtX2dwaW9fZGlyZWN0aW9uX291dHB1dCwJXAotCQkJLnRvX2lycSA9IG1zbV9ncGlvX3RvX2lycSwJCQlcCi0JCQkucmVxdWVzdCA9IG1zbV9ncGlvX3JlcXVlc3QsCQkJXAotCQkJLmZyZWUgPSBtc21fZ3Bpb19mcmVlLAkJCQlcCi0JCX0JCQkJCQkJXAotCX0KLQotI2RlZmluZSBNU01fR1BJT19CUk9LRU5fSU5UX0NMRUFSIDEKLQotc3RydWN0IG1zbV9ncGlvX3JlZ3MgewotCXZvaWQgX19pb21lbSAqb3V0OwotCXZvaWQgX19pb21lbSAqaW47Ci0Jdm9pZCBfX2lvbWVtICppbnRfc3RhdHVzOwotCXZvaWQgX19pb21lbSAqaW50X2NsZWFyOwotCXZvaWQgX19pb21lbSAqaW50X2VuOwotCXZvaWQgX19pb21lbSAqaW50X2VkZ2U7Ci0Jdm9pZCBfX2lvbWVtICppbnRfcG9zOwotCXZvaWQgX19pb21lbSAqb2U7Ci19OwotCi1zdHJ1Y3QgbXNtX2dwaW9fY2hpcCB7Ci0Jc3BpbmxvY2tfdAkJbG9jazsKLQlzdHJ1Y3QgZ3Bpb19jaGlwCWNoaXA7Ci0Jc3RydWN0IG1zbV9ncGlvX3JlZ3MJcmVnczsKLSNpZiBNU01fR1BJT19CUk9LRU5fSU5UX0NMRUFSCi0JdW5zaWduZWQgICAgICAgICAgICAgICAgaW50X3N0YXR1c19jb3B5OwotI2VuZGlmCi0JdW5zaWduZWQgaW50ICAgICAgICAgICAgYm90aF9lZGdlX2RldGVjdDsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBpbnRfZW5hYmxlWzJdOyAvKiAwOiBhd2FrZSwgMTogc2xlZXAgKi8KLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2dwaW9fd3JpdGUoc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwLAotCQkJICB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIG9uKQotewotCXVuc2lnbmVkIG1hc2sgPSBCSVQob2Zmc2V0KTsKLQl1bnNpZ25lZCB2YWw7Ci0KLQl2YWwgPSByZWFkbChtc21fY2hpcC0+cmVncy5vdXQpOwotCWlmIChvbikKLQkJd3JpdGVsKHZhbCB8IG1hc2ssIG1zbV9jaGlwLT5yZWdzLm91dCk7Ci0JZWxzZQotCQl3cml0ZWwodmFsICYgfm1hc2ssIG1zbV9jaGlwLT5yZWdzLm91dCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9ncGlvX3VwZGF0ZV9ib3RoX2VkZ2VfZGV0ZWN0KHN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCkKLXsKLQlpbnQgbG9vcF9saW1pdCA9IDEwMDsKLQl1bnNpZ25lZCBwb2wsIHZhbCwgdmFsMiwgaW50c3RhdDsKLQlkbyB7Ci0JCXZhbCA9IHJlYWRsKG1zbV9jaGlwLT5yZWdzLmluKTsKLQkJcG9sID0gcmVhZGwobXNtX2NoaXAtPnJlZ3MuaW50X3Bvcyk7Ci0JCXBvbCA9IChwb2wgJiB+bXNtX2NoaXAtPmJvdGhfZWRnZV9kZXRlY3QpIHwKLQkJICAgICAgKH52YWwgJiBtc21fY2hpcC0+Ym90aF9lZGdlX2RldGVjdCk7Ci0JCXdyaXRlbChwb2wsIG1zbV9jaGlwLT5yZWdzLmludF9wb3MpOwotCQlpbnRzdGF0ID0gcmVhZGwobXNtX2NoaXAtPnJlZ3MuaW50X3N0YXR1cyk7Ci0JCXZhbDIgPSByZWFkbChtc21fY2hpcC0+cmVncy5pbik7Ci0JCWlmICgoKHZhbCBeIHZhbDIpICYgbXNtX2NoaXAtPmJvdGhfZWRnZV9kZXRlY3QgJiB+aW50c3RhdCkgPT0gMCkKLQkJCXJldHVybjsKLQl9IHdoaWxlIChsb29wX2xpbWl0LS0gPiAwKTsKLQlwcmludGsoS0VSTl9FUlIgIm1zbV9ncGlvX3VwZGF0ZV9ib3RoX2VkZ2VfZGV0ZWN0LCAiCi0JICAgICAgICJmYWlsZWQgdG8gcmVhY2ggc3RhYmxlIHN0YXRlICV4ICE9ICV4XG4iLCB2YWwsIHZhbDIpOwotfQotCi1zdGF0aWMgaW50IG1zbV9ncGlvX2NsZWFyX2RldGVjdF9zdGF0dXMoc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwLAotCQkJCQl1bnNpZ25lZCBvZmZzZXQpCi17Ci0JdW5zaWduZWQgYml0ID0gQklUKG9mZnNldCk7Ci0KLSNpZiBNU01fR1BJT19CUk9LRU5fSU5UX0NMRUFSCi0JLyogU2F2ZSBpbnRlcnJ1cHRzIHRoYXQgYWxyZWFkeSB0cmlnZ2VyZWQgYmVmb3JlIHdlIGxvb3NlIHRoZW0uICovCi0JLyogQW55IGludGVycnVwdCB0aGF0IHRyaWdnZXJzIGJldHdlZW4gdGhlIHJlYWQgb2YgaW50X3N0YXR1cyAqLwotCS8qIGFuZCB0aGUgd3JpdGUgdG8gaW50X2NsZWFyIHdpbGwgc3RpbGwgYmUgbG9zdCB0aG91Z2guICovCi0JbXNtX2NoaXAtPmludF9zdGF0dXNfY29weSB8PSByZWFkbChtc21fY2hpcC0+cmVncy5pbnRfc3RhdHVzKTsKLQltc21fY2hpcC0+aW50X3N0YXR1c19jb3B5ICY9IH5iaXQ7Ci0jZW5kaWYKLQl3cml0ZWwoYml0LCBtc21fY2hpcC0+cmVncy5pbnRfY2xlYXIpOwotCW1zbV9ncGlvX3VwZGF0ZV9ib3RoX2VkZ2VfZGV0ZWN0KG1zbV9jaGlwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcDsKLQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKLQotCW1zbV9jaGlwID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBtc21fZ3Bpb19jaGlwLCBjaGlwKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Ci0Jd3JpdGVsKHJlYWRsKG1zbV9jaGlwLT5yZWdzLm9lKSAmIH5CSVQob2Zmc2V0KSwgbXNtX2NoaXAtPnJlZ3Mub2UpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1tc21fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcDsKLQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKLQotCW1zbV9jaGlwID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBtc21fZ3Bpb19jaGlwLCBjaGlwKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Ci0JbXNtX2dwaW9fd3JpdGUobXNtX2NoaXAsIG9mZnNldCwgdmFsdWUpOwotCXdyaXRlbChyZWFkbChtc21fY2hpcC0+cmVncy5vZSkgfCBCSVQob2Zmc2V0KSwgbXNtX2NoaXAtPnJlZ3Mub2UpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0Jc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwOwotCi0JbXNtX2NoaXAgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IG1zbV9ncGlvX2NoaXAsIGNoaXApOwotCXJldHVybiAocmVhZGwobXNtX2NoaXAtPnJlZ3MuaW4pICYgKDFVIDw8IG9mZnNldCkpID8gMSA6IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2NoaXA7Ci0JdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7Ci0KLQltc21fY2hpcCA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbXNtX2dwaW9fY2hpcCwgY2hpcCk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOwotCW1zbV9ncGlvX3dyaXRlKG1zbV9jaGlwLCBvZmZzZXQsIHZhbHVlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKLX0KLQotc3RhdGljIGludCBtc21fZ3Bpb190b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXJldHVybiBNU01fR1BJT19UT19JTlQoY2hpcC0+YmFzZSArIG9mZnNldCk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfTVNNX0dQSU9NVVgKLXN0YXRpYyBpbnQgbXNtX2dwaW9fcmVxdWVzdChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0JcmV0dXJuIG1zbV9ncGlvbXV4X2dldChjaGlwLT5iYXNlICsgb2Zmc2V0KTsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2dwaW9fZnJlZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0JbXNtX2dwaW9tdXhfcHV0KGNoaXAtPmJhc2UgKyBvZmZzZXQpOwotfQotI2Vsc2UKLSNkZWZpbmUgbXNtX2dwaW9fcmVxdWVzdCBOVUxMCi0jZGVmaW5lIG1zbV9ncGlvX2ZyZWUgTlVMTAotI2VuZGlmCi0KLXN0cnVjdCBtc21fZ3Bpb19jaGlwIG1zbV9ncGlvX2NoaXBzW10gPSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NU003WDAwQSkKLQlNU01fR1BJT19CQU5LKDAsICAgMCwgIDE1KSwKLQlNU01fR1BJT19CQU5LKDEsICAxNiwgIDQyKSwKLQlNU01fR1BJT19CQU5LKDIsICA0MywgIDY3KSwKLQlNU01fR1BJT19CQU5LKDMsICA2OCwgIDk0KSwKLQlNU01fR1BJT19CQU5LKDQsICA5NSwgMTA2KSwKLQlNU01fR1BJT19CQU5LKDUsIDEwNywgMTIxKSwKLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVNNN1gyNSkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9NU003WDI3KQotCU1TTV9HUElPX0JBTksoMCwgICAwLCAgMTUpLAotCU1TTV9HUElPX0JBTksoMSwgIDE2LCAgNDIpLAotCU1TTV9HUElPX0JBTksoMiwgIDQzLCAgNjcpLAotCU1TTV9HUElPX0JBTksoMywgIDY4LCAgOTQpLAotCU1TTV9HUElPX0JBTksoNCwgIDk1LCAxMDYpLAotCU1TTV9HUElPX0JBTksoNSwgMTA3LCAxMzIpLAotI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NU003WDMwKQotCU1TTV9HUElPX0JBTksoMCwgICAwLCAgMTUpLAotCU1TTV9HUElPX0JBTksoMSwgIDE2LCAgNDMpLAotCU1TTV9HUElPX0JBTksoMiwgIDQ0LCAgNjcpLAotCU1TTV9HUElPX0JBTksoMywgIDY4LCAgOTQpLAotCU1TTV9HUElPX0JBTksoNCwgIDk1LCAxMDYpLAotCU1TTV9HUElPX0JBTksoNSwgMTA3LCAxMzMpLAotCU1TTV9HUElPX0JBTksoNiwgMTM0LCAxNTApLAotCU1TTV9HUElPX0JBTksoNywgMTUxLCAxODEpLAotI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9RU0Q4WDUwKQotCU1TTV9HUElPX0JBTksoMCwgICAwLCAgMTUpLAotCU1TTV9HUElPX0JBTksoMSwgIDE2LCAgNDIpLAotCU1TTV9HUElPX0JBTksoMiwgIDQzLCAgNjcpLAotCU1TTV9HUElPX0JBTksoMywgIDY4LCAgOTQpLAotCU1TTV9HUElPX0JBTksoNCwgIDk1LCAxMDMpLAotCU1TTV9HUElPX0JBTksoNSwgMTA0LCAxMjEpLAotCU1TTV9HUElPX0JBTksoNiwgMTIyLCAxNTIpLAotCU1TTV9HUElPX0JBTksoNywgMTUzLCAxNjQpLAotI2VuZGlmCi19OwotCi1zdGF0aWMgdm9pZCBtc21fZ3Bpb19pcnFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKLQlzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2NoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Ci0JbXNtX2dwaW9fY2xlYXJfZGV0ZWN0X3N0YXR1cyhtc21fY2hpcCwKLQkJCQkgICAgIGQtPmlycSAtIGdwaW9fdG9faXJxKG1zbV9jaGlwLT5jaGlwLmJhc2UpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2dwaW9faXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQotewotCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwotCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwotCXVuc2lnbmVkIG9mZnNldCA9IGQtPmlycSAtIGdwaW9fdG9faXJxKG1zbV9jaGlwLT5jaGlwLmJhc2UpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOwotCS8qIGxldmVsIHRyaWdnZXJlZCBpbnRlcnJ1cHRzIGFyZSBhbHNvIGxhdGNoZWQgKi8KLQlpZiAoIShyZWFkbChtc21fY2hpcC0+cmVncy5pbnRfZWRnZSkgJiBCSVQob2Zmc2V0KSkpCi0JCW1zbV9ncGlvX2NsZWFyX2RldGVjdF9zdGF0dXMobXNtX2NoaXAsIG9mZnNldCk7Ci0JbXNtX2NoaXAtPmludF9lbmFibGVbMF0gJj0gfkJJVChvZmZzZXQpOwotCXdyaXRlbChtc21fY2hpcC0+aW50X2VuYWJsZVswXSwgbXNtX2NoaXAtPnJlZ3MuaW50X2VuKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2dwaW9faXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0JdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7Ci0Jc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0JdW5zaWduZWQgb2Zmc2V0ID0gZC0+aXJxIC0gZ3Bpb190b19pcnEobXNtX2NoaXAtPmNoaXAuYmFzZSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Ci0JLyogbGV2ZWwgdHJpZ2dlcmVkIGludGVycnVwdHMgYXJlIGFsc28gbGF0Y2hlZCAqLwotCWlmICghKHJlYWRsKG1zbV9jaGlwLT5yZWdzLmludF9lZGdlKSAmIEJJVChvZmZzZXQpKSkKLQkJbXNtX2dwaW9fY2xlYXJfZGV0ZWN0X3N0YXR1cyhtc21fY2hpcCwgb2Zmc2V0KTsKLQltc21fY2hpcC0+aW50X2VuYWJsZVswXSB8PSBCSVQob2Zmc2V0KTsKLQl3cml0ZWwobXNtX2NoaXAtPmludF9lbmFibGVbMF0sIG1zbV9jaGlwLT5yZWdzLmludF9lbik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2dwaW9faXJxX3NldF93YWtlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IG9uKQotewotCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwotCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwotCXVuc2lnbmVkIG9mZnNldCA9IGQtPmlycSAtIGdwaW9fdG9faXJxKG1zbV9jaGlwLT5jaGlwLmJhc2UpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOwotCi0JaWYgKG9uKQotCQltc21fY2hpcC0+aW50X2VuYWJsZVsxXSB8PSBCSVQob2Zmc2V0KTsKLQllbHNlCi0JCW1zbV9jaGlwLT5pbnRfZW5hYmxlWzFdICY9IH5CSVQob2Zmc2V0KTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9ncGlvX2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBmbG93X3R5cGUpCi17Ci0JdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7Ci0Jc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0JdW5zaWduZWQgb2Zmc2V0ID0gZC0+aXJxIC0gZ3Bpb190b19pcnEobXNtX2NoaXAtPmNoaXAuYmFzZSk7Ci0JdW5zaWduZWQgdmFsLCBtYXNrID0gQklUKG9mZnNldCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Ci0JdmFsID0gcmVhZGwobXNtX2NoaXAtPnJlZ3MuaW50X2VkZ2UpOwotCWlmIChmbG93X3R5cGUgJiBJUlFfVFlQRV9FREdFX0JPVEgpIHsKLQkJd3JpdGVsKHZhbCB8IG1hc2ssIG1zbV9jaGlwLT5yZWdzLmludF9lZGdlKTsKLQkJX19pcnFfc2V0X2hhbmRsZXJfbG9ja2VkKGQtPmlycSwgaGFuZGxlX2VkZ2VfaXJxKTsKLQl9IGVsc2UgewotCQl3cml0ZWwodmFsICYgfm1hc2ssIG1zbV9jaGlwLT5yZWdzLmludF9lZGdlKTsKLQkJX19pcnFfc2V0X2hhbmRsZXJfbG9ja2VkKGQtPmlycSwgaGFuZGxlX2xldmVsX2lycSk7Ci0JfQotCWlmICgoZmxvd190eXBlICYgSVJRX1RZUEVfRURHRV9CT1RIKSA9PSBJUlFfVFlQRV9FREdFX0JPVEgpIHsKLQkJbXNtX2NoaXAtPmJvdGhfZWRnZV9kZXRlY3QgfD0gbWFzazsKLQkJbXNtX2dwaW9fdXBkYXRlX2JvdGhfZWRnZV9kZXRlY3QobXNtX2NoaXApOwotCX0gZWxzZSB7Ci0JCW1zbV9jaGlwLT5ib3RoX2VkZ2VfZGV0ZWN0ICY9IH5tYXNrOwotCQl2YWwgPSByZWFkbChtc21fY2hpcC0+cmVncy5pbnRfcG9zKTsKLQkJaWYgKGZsb3dfdHlwZSAmIChJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0hJR0gpKQotCQkJd3JpdGVsKHZhbCB8IG1hc2ssIG1zbV9jaGlwLT5yZWdzLmludF9wb3MpOwotCQllbHNlCi0JCQl3cml0ZWwodmFsICYgfm1hc2ssIG1zbV9jaGlwLT5yZWdzLmludF9wb3MpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2dwaW9faXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQotewotCWludCBpLCBqLCBtYXNrOwotCXVuc2lnbmVkIHZhbDsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1zbV9ncGlvX2NoaXBzKTsgaSsrKSB7Ci0JCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCA9ICZtc21fZ3Bpb19jaGlwc1tpXTsKLQkJdmFsID0gcmVhZGwobXNtX2NoaXAtPnJlZ3MuaW50X3N0YXR1cyk7Ci0JCXZhbCAmPSBtc21fY2hpcC0+aW50X2VuYWJsZVswXTsKLQkJd2hpbGUgKHZhbCkgewotCQkJbWFzayA9IHZhbCAmIC12YWw7Ci0JCQlqID0gZmxzKG1hc2spIC0gMTsKLQkJCS8qIHByaW50aygiJXMgJTA4eCAlMDh4IGJpdCAlZCBncGlvICVkIGlycSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgdiwgbSwgaiwgbXNtX2NoaXAtPmNoaXAuc3RhcnQgKyBqLAotCQkJCUZJUlNUX0dQSU9fSVJRICsgbXNtX2NoaXAtPmNoaXAuc3RhcnQgKyBqKTsgKi8KLQkJCXZhbCAmPSB+bWFzazsKLQkJCWdlbmVyaWNfaGFuZGxlX2lycShGSVJTVF9HUElPX0lSUSArCi0JCQkJCSAgIG1zbV9jaGlwLT5jaGlwLmJhc2UgKyBqKTsKLQkJfQotCX0KLQlkZXNjLT5pcnFfZGF0YS5jaGlwLT5pcnFfYWNrKCZkZXNjLT5pcnFfZGF0YSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbXNtX2dwaW9faXJxX2NoaXAgPSB7Ci0JLm5hbWUgICAgICAgICAgPSAibXNtZ3BpbyIsCi0JLmlycV9hY2sgICAgICAgPSBtc21fZ3Bpb19pcnFfYWNrLAotCS5pcnFfbWFzayAgICAgID0gbXNtX2dwaW9faXJxX21hc2ssCi0JLmlycV91bm1hc2sgICAgPSBtc21fZ3Bpb19pcnFfdW5tYXNrLAotCS5pcnFfc2V0X3dha2UgID0gbXNtX2dwaW9faXJxX3NldF93YWtlLAotCS5pcnFfc2V0X3R5cGUgID0gbXNtX2dwaW9faXJxX3NldF90eXBlLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXNtX2luaXRfZ3Bpbyh2b2lkKQotewotCWludCBpLCBqID0gMDsKLQotCWZvciAoaSA9IEZJUlNUX0dQSU9fSVJROyBpIDwgRklSU1RfR1BJT19JUlEgKyBOUl9HUElPX0lSUVM7IGkrKykgewotCQlpZiAoaSAtIEZJUlNUX0dQSU9fSVJRID49Ci0JCQltc21fZ3Bpb19jaGlwc1tqXS5jaGlwLmJhc2UgKwotCQkJbXNtX2dwaW9fY2hpcHNbal0uY2hpcC5uZ3BpbykKLQkJCWorKzsKLQkJaXJxX3NldF9jaGlwX2RhdGEoaSwgJm1zbV9ncGlvX2NoaXBzW2pdKTsKLQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGksICZtc21fZ3Bpb19pcnFfY2hpcCwKLQkJCQkJIGhhbmRsZV9lZGdlX2lycSk7Ci0JCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXNtX2dwaW9fY2hpcHMpOyBpKyspIHsKLQkJc3Bpbl9sb2NrX2luaXQoJm1zbV9ncGlvX2NoaXBzW2ldLmxvY2spOwotCQl3cml0ZWwoMCwgbXNtX2dwaW9fY2hpcHNbaV0ucmVncy5pbnRfZW4pOwotCQlncGlvY2hpcF9hZGQoJm1zbV9ncGlvX2NoaXBzW2ldLmNoaXApOwotCX0KLQotCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElOVF9HUElPX0dST1VQMSwgbXNtX2dwaW9faXJxX2hhbmRsZXIpOwotCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElOVF9HUElPX0dST1VQMiwgbXNtX2dwaW9faXJxX2hhbmRsZXIpOwotCWlycV9zZXRfaXJxX3dha2UoSU5UX0dQSU9fR1JPVVAxLCAxKTsKLQlpcnFfc2V0X2lycV93YWtlKElOVF9HUElPX0dST1VQMiwgMik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXBvc3Rjb3JlX2luaXRjYWxsKG1zbV9pbml0X2dwaW8pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vZ3Bpb19ody5oIGIvYXJjaC9hcm0vbWFjaC1tc20vZ3Bpb19ody5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjUwNjYwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2dwaW9faHcuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9ncGlvX2h3LmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgR29vZ2xlLCBJbmMuCi0gKiBBdXRob3I6IEJyaWFuIFN3ZXRsYW5kIDxzd2V0bGFuZEBnb29nbGUuY29tPgotICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTAsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgX19BUkNIX0FSTV9NQUNIX01TTV9HUElPX0hXX0gKLSNkZWZpbmUgX19BUkNIX0FSTV9NQUNIX01TTV9HUElPX0hXX0gKLQotI2luY2x1ZGUgPG1hY2gvbXNtX2lvbWFwLmg+Ci0KLS8qIHNlZSA4MC1WQTczNi0yIFJldiBDIHBwIDY5NS03NTEKLSoqCi0qKiBUaGVzZSBhcmUgYWN0dWFsbHkgdGhlICpzaGFkb3cqIGdwaW8gcmVnaXN0ZXJzLCBzaW5jZSB0aGUKLSoqIHJlYWwgb25lcyAod2hpY2ggYWxsb3cgZnVsbCBhY2Nlc3MpIGFyZSBvbmx5IGF2YWlsYWJsZSB0byB0aGUKLSoqIEFSTTkgc2lkZSBvZiB0aGUgd29ybGQuCi0qKgotKiogU2luY2UgdGhlIF9CQVNFIG5lZWQgdG8gYmUgcGFnZS1hbGlnbmVkIHdoZW4gd2UncmUgbWFwcGluZyB0aGVtCi0qKiB0byB2aXJ0dWFsIGFkZHJlc3NlcywgYWRqdXN0IGZvciB0aGUgYWRkaXRpb25hbCBvZmZzZXQgaW4gdGhlc2UKLSoqIG1hY3Jvcy4KLSovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX01TTTdYMzApCi0jZGVmaW5lIE1TTV9HUElPMV9SRUcob2ZmKSAoTVNNX0dQSU8xX0JBU0UgKyAob2ZmKSkKLSNkZWZpbmUgTVNNX0dQSU8yX1JFRyhvZmYpIChNU01fR1BJTzJfQkFTRSArIDB4NDAwICsgKG9mZikpCi0jZWxzZQotI2RlZmluZSBNU01fR1BJTzFfUkVHKG9mZikgKE1TTV9HUElPMV9CQVNFICsgMHg4MDAgKyAob2ZmKSkKLSNkZWZpbmUgTVNNX0dQSU8yX1JFRyhvZmYpIChNU01fR1BJTzJfQkFTRSArIDB4QzAwICsgKG9mZikpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVNNN1gwMEEpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfTVNNN1gyNSkgfHxcCi0gICAgZGVmaW5lZChDT05GSUdfQVJDSF9NU003WDI3KQotCi0vKiBvdXRwdXQgdmFsdWUgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MDApICAvKiBncGlvICAxNS0wICAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfMSAgICAgICAgIE1TTV9HUElPMl9SRUcoMHgwMCkgIC8qIGdwaW8gIDQyLTE2ICovCi0jZGVmaW5lIE1TTV9HUElPX09VVF8yICAgICAgICAgTVNNX0dQSU8xX1JFRygweDA0KSAgLyogZ3BpbyAgNjctNDMgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzMgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MDgpICAvKiBncGlvICA5NC02OCAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfNCAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgwQykgIC8qIGdwaW8gMTA2LTk1ICovCi0jZGVmaW5lIE1TTV9HUElPX09VVF81ICAgICAgICAgTVNNX0dQSU8xX1JFRygweDUwKSAgLyogZ3BpbyAxMDctMTIxICovCi0KLS8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgb3V0cHV0IGVuYWJsZSAqLwotI2RlZmluZSBNU01fR1BJT19PRV8wICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgxMCkKLSNkZWZpbmUgTVNNX0dQSU9fT0VfMSAgICAgICAgICBNU01fR1BJTzJfUkVHKDB4MDgpCi0jZGVmaW5lIE1TTV9HUElPX09FXzIgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDE0KQotI2RlZmluZSBNU01fR1BJT19PRV8zICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgxOCkKLSNkZWZpbmUgTVNNX0dQSU9fT0VfNCAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MUMpCi0jZGVmaW5lIE1TTV9HUElPX09FXzUgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDU0KQotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIGlucHV0IHJlYWQgKi8KLSNkZWZpbmUgTVNNX0dQSU9fSU5fMCAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MzQpCi0jZGVmaW5lIE1TTV9HUElPX0lOXzEgICAgICAgICAgTVNNX0dQSU8yX1JFRygweDIwKQotI2RlZmluZSBNU01fR1BJT19JTl8yICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgzOCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5fMyAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4M0MpCi0jZGVmaW5lIE1TTV9HUElPX0lOXzQgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDQwKQotI2RlZmluZSBNU01fR1BJT19JTl81ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHg0NCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCAxPWVkZ2UgMD1sZXZlbCBpbnRlcnJ1cCAqLwotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV8wICAgIE1TTV9HUElPMV9SRUcoMHg2MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfMSAgICBNU01fR1BJTzJfUkVHKDB4NTApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzIgICAgTVNNX0dQSU8xX1JFRygweDY0KQotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV8zICAgIE1TTV9HUElPMV9SRUcoMHg2OCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfNCAgICBNU01fR1BJTzFfUkVHKDB4NkMpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzUgICAgTVNNX0dQSU8xX1JFRygweEMwKQotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIDE9cG9zaXRpdmUgMD1uZWdhdGl2ZSAqLwotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzAgICAgIE1TTV9HUElPMV9SRUcoMHg3MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU18xICAgICBNU01fR1BJTzJfUkVHKDB4NTgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfMiAgICAgTVNNX0dQSU8xX1JFRygweDc0KQotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzMgICAgIE1TTV9HUElPMV9SRUcoMHg3OCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU180ICAgICBNU01fR1BJTzFfUkVHKDB4N0MpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfNSAgICAgTVNNX0dQSU8xX1JFRygweEJDKQotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIGludGVycnVwdCBlbmFibGUgKi8KLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VOXzAgICAgICBNU01fR1BJTzFfUkVHKDB4ODApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl8xICAgICAgTVNNX0dQSU8yX1JFRygweDYwKQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fMiAgICAgIE1TTV9HUElPMV9SRUcoMHg4NCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VOXzMgICAgICBNU01fR1BJTzFfUkVHKDB4ODgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl80ICAgICAgTVNNX0dQSU8xX1JFRygweDhDKQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fNSAgICAgIE1TTV9HUElPMV9SRUcoMHhCOCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCB3cml0ZSAxIHRvIGNsZWFyIGludGVycnVwdCAqLwotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfMCAgIE1TTV9HUElPMV9SRUcoMHg5MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzEgICBNU01fR1BJTzJfUkVHKDB4NjgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl8yICAgTVNNX0dQSU8xX1JFRygweDk0KQotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfMyAgIE1TTV9HUElPMV9SRUcoMHg5OCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzQgICBNU01fR1BJTzFfUkVHKDB4OUMpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl81ICAgTVNNX0dQSU8xX1JFRygweEI0KQotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIDE9aW50ZXJydXB0IHBlbmRpbmcgKi8KLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU18wICBNU01fR1BJTzFfUkVHKDB4QTApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfMSAgTVNNX0dQSU8yX1JFRygweDcwKQotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzIgIE1TTV9HUElPMV9SRUcoMHhBNCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU18zICBNU01fR1BJTzFfUkVHKDB4QTgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfNCAgTVNNX0dQSU8xX1JFRygweEFDKQotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzUgIE1TTV9HUElPMV9SRUcoMHhCMCkKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX1FTRDhYNTApCi0vKiBvdXRwdXQgdmFsdWUgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MDApICAvKiBncGlvICAxNS0wICAgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzEgICAgICAgICBNU01fR1BJTzJfUkVHKDB4MDApICAvKiBncGlvICA0Mi0xNiAgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzIgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MDQpICAvKiBncGlvICA2Ny00MyAgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzMgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MDgpICAvKiBncGlvICA5NC02OCAgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzQgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MEMpICAvKiBncGlvIDEwMy05NSAgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzUgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MTApICAvKiBncGlvIDEyMS0xMDQgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzYgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MTQpICAvKiBncGlvIDE1Mi0xMjIgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzcgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MTgpICAvKiBncGlvIDE2NC0xNTMgKi8KLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBvdXRwdXQgZW5hYmxlICovCi0jZGVmaW5lIE1TTV9HUElPX09FXzAgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDIwKQotI2RlZmluZSBNU01fR1BJT19PRV8xICAgICAgICAgIE1TTV9HUElPMl9SRUcoMHgwOCkKLSNkZWZpbmUgTVNNX0dQSU9fT0VfMiAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MjQpCi0jZGVmaW5lIE1TTV9HUElPX09FXzMgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDI4KQotI2RlZmluZSBNU01fR1BJT19PRV80ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgyQykKLSNkZWZpbmUgTVNNX0dQSU9fT0VfNSAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MzApCi0jZGVmaW5lIE1TTV9HUElPX09FXzYgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDM0KQotI2RlZmluZSBNU01fR1BJT19PRV83ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgzOCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBpbnB1dCByZWFkICovCi0jZGVmaW5lIE1TTV9HUElPX0lOXzAgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDUwKQotI2RlZmluZSBNU01fR1BJT19JTl8xICAgICAgICAgIE1TTV9HUElPMl9SRUcoMHgyMCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5fMiAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4NTQpCi0jZGVmaW5lIE1TTV9HUElPX0lOXzMgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDU4KQotI2RlZmluZSBNU01fR1BJT19JTl80ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHg1QykKLSNkZWZpbmUgTVNNX0dQSU9fSU5fNSAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4NjApCi0jZGVmaW5lIE1TTV9HUElPX0lOXzYgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDY0KQotI2RlZmluZSBNU01fR1BJT19JTl83ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHg2OCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCAxPWVkZ2UgMD1sZXZlbCBpbnRlcnJ1cCAqLwotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV8wICAgIE1TTV9HUElPMV9SRUcoMHg3MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfMSAgICBNU01fR1BJTzJfUkVHKDB4NTApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzIgICAgTVNNX0dQSU8xX1JFRygweDc0KQotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV8zICAgIE1TTV9HUElPMV9SRUcoMHg3OCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfNCAgICBNU01fR1BJTzFfUkVHKDB4N0MpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzUgICAgTVNNX0dQSU8xX1JFRygweDgwKQotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV82ICAgIE1TTV9HUElPMV9SRUcoMHg4NCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfNyAgICBNU01fR1BJTzFfUkVHKDB4ODgpCi0KLS8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgMT1wb3NpdGl2ZSAwPW5lZ2F0aXZlICovCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfMCAgICAgTVNNX0dQSU8xX1JFRygweDkwKQotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzEgICAgIE1TTV9HUElPMl9SRUcoMHg1OCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU18yICAgICBNU01fR1BJTzFfUkVHKDB4OTQpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfMyAgICAgTVNNX0dQSU8xX1JFRygweDk4KQotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzQgICAgIE1TTV9HUElPMV9SRUcoMHg5QykKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU181ICAgICBNU01fR1BJTzFfUkVHKDB4QTApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfNiAgICAgTVNNX0dQSU8xX1JFRygweEE0KQotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzcgICAgIE1TTV9HUElPMV9SRUcoMHhBOCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBpbnRlcnJ1cHQgZW5hYmxlICovCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl8wICAgICAgTVNNX0dQSU8xX1JFRygweEIwKQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fMSAgICAgIE1TTV9HUElPMl9SRUcoMHg2MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VOXzIgICAgICBNU01fR1BJTzFfUkVHKDB4QjQpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl8zICAgICAgTVNNX0dQSU8xX1JFRygweEI4KQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fNCAgICAgIE1TTV9HUElPMV9SRUcoMHhCQykKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VOXzUgICAgICBNU01fR1BJTzFfUkVHKDB4QzApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl82ICAgICAgTVNNX0dQSU8xX1JFRygweEM0KQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fNyAgICAgIE1TTV9HUElPMV9SRUcoMHhDOCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCB3cml0ZSAxIHRvIGNsZWFyIGludGVycnVwdCAqLwotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfMCAgIE1TTV9HUElPMV9SRUcoMHhEMCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzEgICBNU01fR1BJTzJfUkVHKDB4NjgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl8yICAgTVNNX0dQSU8xX1JFRygweEQ0KQotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfMyAgIE1TTV9HUElPMV9SRUcoMHhEOCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzQgICBNU01fR1BJTzFfUkVHKDB4REMpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl81ICAgTVNNX0dQSU8xX1JFRygweEUwKQotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfNiAgIE1TTV9HUElPMV9SRUcoMHhFNCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzcgICBNU01fR1BJTzFfUkVHKDB4RTgpCi0KLS8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgMT1pbnRlcnJ1cHQgcGVuZGluZyAqLwotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzAgIE1TTV9HUElPMV9SRUcoMHhGMCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU18xICBNU01fR1BJTzJfUkVHKDB4NzApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfMiAgTVNNX0dQSU8xX1JFRygweEY0KQotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzMgIE1TTV9HUElPMV9SRUcoMHhGOCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU180ICBNU01fR1BJTzFfUkVHKDB4RkMpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfNSAgTVNNX0dQSU8xX1JFRygweDEwMCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU182ICBNU01fR1BJTzFfUkVHKDB4MTA0KQotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzcgIE1TTV9HUElPMV9SRUcoMHgxMDgpCi0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NU003WDMwKQotCi0vKiBvdXRwdXQgdmFsdWUgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MDApICAgLyogZ3BpbyAgMTUtMCAgICovCi0jZGVmaW5lIE1TTV9HUElPX09VVF8xICAgICAgICAgTVNNX0dQSU8yX1JFRygweDAwKSAgIC8qIGdwaW8gIDQzLTE2ICAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfMiAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgwNCkgICAvKiBncGlvICA2Ny00NCAgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzMgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MDgpICAgLyogZ3BpbyAgOTQtNjggICovCi0jZGVmaW5lIE1TTV9HUElPX09VVF80ICAgICAgICAgTVNNX0dQSU8xX1JFRygweDBDKSAgIC8qIGdwaW8gMTA2LTk1ICAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfNSAgICAgICAgIE1TTV9HUElPMV9SRUcoMHg1MCkgICAvKiBncGlvIDEzMy0xMDcgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzYgICAgICAgICBNU01fR1BJTzFfUkVHKDB4QzQpICAgLyogZ3BpbyAxNTAtMTM0ICovCi0jZGVmaW5lIE1TTV9HUElPX09VVF83ICAgICAgICAgTVNNX0dQSU8xX1JFRygweDIxNCkgIC8qIGdwaW8gMTgxLTE1MSAqLwotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIG91dHB1dCBlbmFibGUgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT0VfMCAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MTApCi0jZGVmaW5lIE1TTV9HUElPX09FXzEgICAgICAgICAgTVNNX0dQSU8yX1JFRygweDA4KQotI2RlZmluZSBNU01fR1BJT19PRV8yICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgxNCkKLSNkZWZpbmUgTVNNX0dQSU9fT0VfMyAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MTgpCi0jZGVmaW5lIE1TTV9HUElPX09FXzQgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDFDKQotI2RlZmluZSBNU01fR1BJT19PRV81ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHg1NCkKLSNkZWZpbmUgTVNNX0dQSU9fT0VfNiAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4QzgpCi0jZGVmaW5lIE1TTV9HUElPX09FXzcgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDIxOCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBpbnB1dCByZWFkICovCi0jZGVmaW5lIE1TTV9HUElPX0lOXzAgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDM0KQotI2RlZmluZSBNU01fR1BJT19JTl8xICAgICAgICAgIE1TTV9HUElPMl9SRUcoMHgyMCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5fMiAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MzgpCi0jZGVmaW5lIE1TTV9HUElPX0lOXzMgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDNDKQotI2RlZmluZSBNU01fR1BJT19JTl80ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHg0MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5fNSAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4NDQpCi0jZGVmaW5lIE1TTV9HUElPX0lOXzYgICAgICAgICAgTVNNX0dQSU8xX1JFRygweENDKQotI2RlZmluZSBNU01fR1BJT19JTl83ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgyMUMpCi0KLS8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgMT1lZGdlIDA9bGV2ZWwgaW50ZXJydXAgKi8KLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfMCAgICBNU01fR1BJTzFfUkVHKDB4NjApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzEgICAgTVNNX0dQSU8yX1JFRygweDUwKQotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV8yICAgIE1TTV9HUElPMV9SRUcoMHg2NCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfMyAgICBNU01fR1BJTzFfUkVHKDB4NjgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzQgICAgTVNNX0dQSU8xX1JFRygweDZDKQotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV81ICAgIE1TTV9HUElPMV9SRUcoMHhDMCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfNiAgICBNU01fR1BJTzFfUkVHKDB4RDApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzcgICAgTVNNX0dQSU8xX1JFRygweDI0MCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCAxPXBvc2l0aXZlIDA9bmVnYXRpdmUgKi8KLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU18wICAgICBNU01fR1BJTzFfUkVHKDB4NzApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfMSAgICAgTVNNX0dQSU8yX1JFRygweDU4KQotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzIgICAgIE1TTV9HUElPMV9SRUcoMHg3NCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU18zICAgICBNU01fR1BJTzFfUkVHKDB4NzgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfNCAgICAgTVNNX0dQSU8xX1JFRygweDdDKQotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzUgICAgIE1TTV9HUElPMV9SRUcoMHhCQykKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU182ICAgICBNU01fR1BJTzFfUkVHKDB4RDQpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfNyAgICAgTVNNX0dQSU8xX1JFRygweDIyOCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBpbnRlcnJ1cHQgZW5hYmxlICovCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl8wICAgICAgTVNNX0dQSU8xX1JFRygweDgwKQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fMSAgICAgIE1TTV9HUElPMl9SRUcoMHg2MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VOXzIgICAgICBNU01fR1BJTzFfUkVHKDB4ODQpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl8zICAgICAgTVNNX0dQSU8xX1JFRygweDg4KQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fNCAgICAgIE1TTV9HUElPMV9SRUcoMHg4QykKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VOXzUgICAgICBNU01fR1BJTzFfUkVHKDB4QjgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl82ICAgICAgTVNNX0dQSU8xX1JFRygweEQ4KQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fNyAgICAgIE1TTV9HUElPMV9SRUcoMHgyMkMpCi0KLS8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgd3JpdGUgMSB0byBjbGVhciBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzAgICBNU01fR1BJTzFfUkVHKDB4OTApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl8xICAgTVNNX0dQSU8yX1JFRygweDY4KQotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfMiAgIE1TTV9HUElPMV9SRUcoMHg5NCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzMgICBNU01fR1BJTzFfUkVHKDB4OTgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl80ICAgTVNNX0dQSU8xX1JFRygweDlDKQotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfNSAgIE1TTV9HUElPMV9SRUcoMHhCNCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzYgICBNU01fR1BJTzFfUkVHKDB4REMpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl83ICAgTVNNX0dQSU8xX1JFRygweDIzMCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCAxPWludGVycnVwdCBwZW5kaW5nICovCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfMCAgTVNNX0dQSU8xX1JFRygweEEwKQotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzEgIE1TTV9HUElPMl9SRUcoMHg3MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU18yICBNU01fR1BJTzFfUkVHKDB4QTQpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfMyAgTVNNX0dQSU8xX1JFRygweEE4KQotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzQgIE1TTV9HUElPMV9SRUcoMHhBQykKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU181ICBNU01fR1BJTzFfUkVHKDB4QjApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfNiAgTVNNX0dQSU8xX1JFRygweEUwKQotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzcgIE1TTV9HUElPMV9SRUcoMHgyMzQpCi0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2dwaW9tdXguaCBiL2FyY2gvYXJtL21hY2gtbXNtL2dwaW9tdXguaAppbmRleCBiMTc4ZDljLi4wMDQ1OWY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9ncGlvbXV4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vZ3Bpb211eC5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPG1hY2gvbXNtX2dwaW9tdXguaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX01TTV9WMl9UTE1NKQogI2luY2x1ZGUgImdwaW9tdXgtdjIuaCIKQEAgLTcxLDEyICs3Miw2IEBACiAgKi8KIGV4dGVybiBzdHJ1Y3QgbXNtX2dwaW9tdXhfY29uZmlnIG1zbV9ncGlvbXV4X2NvbmZpZ3NbR1BJT01VWF9OR1BJT1NdOwogCi0vKiBJbmNyZW1lbnQgYSBncGlvJ3MgcmVmZXJlbmNlIGNvdW50LCBwb3NzaWJseSBhY3RpdmF0aW5nIHRoZSBsaW5lLiAqLwotaW50IF9fbXVzdF9jaGVjayBtc21fZ3Bpb211eF9nZXQodW5zaWduZWQgZ3Bpbyk7Ci0KLS8qIERlY3JlbWVudCBhIGdwaW8ncyByZWZlcmVuY2UgY291bnQsIHBvc3NpYmx5IHN1c3BlbmRpbmcgdGhlIGxpbmUuICovCi1pbnQgbXNtX2dwaW9tdXhfcHV0KHVuc2lnbmVkIGdwaW8pOwotCiAvKiBJbnN0YWxsIGEgbmV3IGNvbmZpZ3VyYXRpb24gdG8gdGhlIGdwaW8gbGluZS4gIFRvIGF2b2lkIG92ZXJ3cml0aW5nCiAgKiBhIGNvbmZpZ3VyYXRpb24sIGxlYXZlIHRoZSBWQUxJRCBiaXQgb3V0LgogICovCkBAIC05NCwxNiArODksNiBAQAogICovCiB2b2lkIF9fbXNtX2dwaW9tdXhfd3JpdGUodW5zaWduZWQgZ3BpbywgZ3Bpb211eF9jb25maWdfdCB2YWwpOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjayBtc21fZ3Bpb211eF9nZXQodW5zaWduZWQgZ3BpbykKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbXNtX2dwaW9tdXhfcHV0KHVuc2lnbmVkIGdwaW8pCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IG1zbV9ncGlvbXV4X3dyaXRlKHVuc2lnbmVkIGdwaW8sCiAJCQkJICAgIGdwaW9tdXhfY29uZmlnX3QgYWN0aXZlLAogCQkJCSAgICBncGlvbXV4X2NvbmZpZ190IHN1c3BlbmRlZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21fZ3Bpb211eC5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9ncGlvbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3ZDM5MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21fZ3Bpb211eC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9NU01fR1BJT01VWF9ICisjZGVmaW5lIF9MSU5VWF9NU01fR1BJT01VWF9ICisKKyNpZmRlZiBDT05GSUdfTVNNX0dQSU9NVVgKKworLyogSW5jcmVtZW50IGEgZ3BpbydzIHJlZmVyZW5jZSBjb3VudCwgcG9zc2libHkgYWN0aXZhdGluZyB0aGUgbGluZS4gKi8KK2ludCBfX211c3RfY2hlY2sgbXNtX2dwaW9tdXhfZ2V0KHVuc2lnbmVkIGdwaW8pOworCisvKiBEZWNyZW1lbnQgYSBncGlvJ3MgcmVmZXJlbmNlIGNvdW50LCBwb3NzaWJseSBzdXNwZW5kaW5nIHRoZSBsaW5lLiAqLworaW50IG1zbV9ncGlvbXV4X3B1dCh1bnNpZ25lZCBncGlvKTsKKworI2Vsc2UKKworc3RhdGljIGlubGluZSBpbnQgX19tdXN0X2NoZWNrIG1zbV9ncGlvbXV4X2dldCh1bnNpZ25lZCBncGlvKQoreworCXJldHVybiAtRU5PU1lTOworfQorCitzdGF0aWMgaW5saW5lIGludCBtc21fZ3Bpb211eF9wdXQodW5zaWduZWQgZ3BpbykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworI2VuZGlmCisKKyNlbmRpZiAvKiBfTElOVVhfTVNNX0dQSU9NVVhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC03eDAwLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLTd4MDAuaAppbmRleCA4Zjk5ZDk3Li45NGZlOWZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLTd4MDAuaAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLTd4MDAuaApAQCAtNTUsMTMgKzU1LDExIEBACiAjZGVmaW5lIE1TTV9ETU9WX1BIWVMgICAgICAgICAweEE5NzAwMDAwCiAjZGVmaW5lIE1TTV9ETU9WX1NJWkUgICAgICAgICBTWl80SwogCi0jZGVmaW5lIE1TTV9HUElPMV9CQVNFICAgICAgICBJT01FTSgweEUwMDAzMDAwKQotI2RlZmluZSBNU01fR1BJTzFfUEhZUyAgICAgICAgMHhBOTIwMDAwMAotI2RlZmluZSBNU01fR1BJTzFfU0laRSAgICAgICAgU1pfNEsKKyNkZWZpbmUgTVNNN1gwMF9HUElPMV9QSFlTICAgICAgICAweEE5MjAwMDAwCisjZGVmaW5lIE1TTTdYMDBfR1BJTzFfU0laRSAgICAgICAgU1pfNEsKIAotI2RlZmluZSBNU01fR1BJTzJfQkFTRSAgICAgICAgSU9NRU0oMHhFMDAwNDAwMCkKLSNkZWZpbmUgTVNNX0dQSU8yX1BIWVMgICAgICAgIDB4QTkzMDAwMDAKLSNkZWZpbmUgTVNNX0dQSU8yX1NJWkUgICAgICAgIFNaXzRLCisjZGVmaW5lIE1TTTdYMDBfR1BJTzJfUEhZUyAgICAgICAgMHhBOTMwMDAwMAorI2RlZmluZSBNU003WDAwX0dQSU8yX1NJWkUgICAgICAgIFNaXzRLCiAKICNkZWZpbmUgTVNNX0NMS19DVExfQkFTRSAgICAgIElPTUVNKDB4RTAwMDUwMDApCiAjZGVmaW5lIE1TTV9DTEtfQ1RMX1BIWVMgICAgICAweEE4NjAwMDAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLTd4MzAuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAtN3gzMC5oCmluZGV4IDRkODRiZTEuLjM3Njk0NDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAtN3gzMC5oCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAtN3gzMC5oCkBAIC00NiwxMyArNDYsMTEgQEAKICNkZWZpbmUgTVNNX0RNT1ZfUEhZUyAgICAgICAgIDB4QUM0MDAwMDAKICNkZWZpbmUgTVNNX0RNT1ZfU0laRSAgICAgICAgIFNaXzRLCiAKLSNkZWZpbmUgTVNNX0dQSU8xX0JBU0UgICAgICAgIElPTUVNKDB4RTAwMDMwMDApCi0jZGVmaW5lIE1TTV9HUElPMV9QSFlTICAgICAgICAweEFDMDAxMDAwCi0jZGVmaW5lIE1TTV9HUElPMV9TSVpFICAgICAgICBTWl80SworI2RlZmluZSBNU003WDMwX0dQSU8xX1BIWVMgICAgICAgIDB4QUMwMDEwMDAKKyNkZWZpbmUgTVNNN1gzMF9HUElPMV9TSVpFICAgICAgICBTWl80SwogCi0jZGVmaW5lIE1TTV9HUElPMl9CQVNFICAgICAgICBJT01FTSgweEUwMDA0MDAwKQotI2RlZmluZSBNU01fR1BJTzJfUEhZUyAgICAgICAgMHhBQzEwMTAwMAotI2RlZmluZSBNU01fR1BJTzJfU0laRSAgICAgICAgU1pfNEsKKyNkZWZpbmUgTVNNN1gzMF9HUElPMl9QSFlTICAgICAgICAweEFDMTAxMDAwCisjZGVmaW5lIE1TTTdYMzBfR1BJTzJfU0laRSAgICAgICAgU1pfNEsKIAogI2RlZmluZSBNU01fQ0xLX0NUTF9CQVNFICAgICAgSU9NRU0oMHhFMDAwNTAwMCkKICNkZWZpbmUgTVNNX0NMS19DVExfUEhZUyAgICAgIDB4QUI4MDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAtOHg1MC5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC04eDUwLmgKaW5kZXggZDQxNDMyMC4uZDY3Y2Q3MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC04eDUwLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC04eDUwLmgKQEAgLTQ2LDEzICs0NiwxMSBAQAogI2RlZmluZSBNU01fRE1PVl9QSFlTICAgICAgICAgMHhBOTcwMDAwMAogI2RlZmluZSBNU01fRE1PVl9TSVpFICAgICAgICAgU1pfNEsKIAotI2RlZmluZSBNU01fR1BJTzFfQkFTRSAgICAgICAgSU9NRU0oMHhFMDAwMzAwMCkKLSNkZWZpbmUgTVNNX0dQSU8xX1BIWVMgICAgICAgIDB4QTkwMDAwMDAKLSNkZWZpbmUgTVNNX0dQSU8xX1NJWkUgICAgICAgIFNaXzRLCisjZGVmaW5lIFFTRDhYNTBfR1BJTzFfUEhZUyAgICAgICAgMHhBOTAwMDAwMAorI2RlZmluZSBRU0Q4WDUwX0dQSU8xX1NJWkUgICAgICAgIFNaXzRLCiAKLSNkZWZpbmUgTVNNX0dQSU8yX0JBU0UgICAgICAgIElPTUVNKDB4RTAwMDQwMDApCi0jZGVmaW5lIE1TTV9HUElPMl9QSFlTICAgICAgICAweEE5MTAwMDAwCi0jZGVmaW5lIE1TTV9HUElPMl9TSVpFICAgICAgICBTWl80SworI2RlZmluZSBRU0Q4WDUwX0dQSU8yX1BIWVMgICAgICAgIDB4QTkxMDAwMDAKKyNkZWZpbmUgUVNEOFg1MF9HUElPMl9TSVpFICAgICAgICBTWl80SwogCiAjZGVmaW5lIE1TTV9DTEtfQ1RMX0JBU0UgICAgICBJT01FTSgweEUwMDA1MDAwKQogI2RlZmluZSBNU01fQ0xLX0NUTF9QSFlTICAgICAgMHhBODYwMDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC5oCmluZGV4IDJmNDk0YjYuLjRkZWQxNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAuaAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLmgKQEAgLTYxLDUgKzYxLDcgQEAKICNkZWZpbmUgTVNNX1FHSUNfQ1BVX0JBU0UJSU9NRU0oMHhGMDAwMTAwMCkKICNkZWZpbmUgTVNNX1RNUl9CQVNFCQlJT01FTSgweEYwMjAwMDAwKQogI2RlZmluZSBNU01fVE1SMF9CQVNFCQlJT01FTSgweEYwMjAxMDAwKQorI2RlZmluZSBNU01fR1BJTzFfQkFTRQkJSU9NRU0oMHhFMDAwMzAwMCkKKyNkZWZpbmUgTVNNX0dQSU8yX0JBU0UJCUlPTUVNKDB4RTAwMDQwMDApCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW8uYyBiL2FyY2gvYXJtL21hY2gtbXNtL2lvLmMKaW5kZXggY2VjNmVkMS4uMTQwZGRiYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW8uYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9pby5jCkBAIC00Myw4ICs0Myw4IEBACiAJTVNNX0RFVklDRShWSUMpLAogCU1TTV9DSElQX0RFVklDRShDU1IsIE1TTTdYMDApLAogCU1TTV9ERVZJQ0UoRE1PViksCi0JTVNNX0RFVklDRShHUElPMSksCi0JTVNNX0RFVklDRShHUElPMiksCisJTVNNX0NISVBfREVWSUNFKEdQSU8xLCBNU003WDAwKSwKKwlNU01fQ0hJUF9ERVZJQ0UoR1BJTzIsIE1TTTdYMDApLAogCU1TTV9ERVZJQ0UoQ0xLX0NUTCksCiAjaWZkZWYgQ09ORklHX01TTV9ERUJVR19VQVJUCiAJTVNNX0RFVklDRShERUJVR19VQVJUKSwKQEAgLTc2LDggKzc2LDggQEAKIAlNU01fREVWSUNFKFZJQyksCiAJTVNNX0NISVBfREVWSUNFKENTUiwgUVNEOFg1MCksCiAJTVNNX0RFVklDRShETU9WKSwKLQlNU01fREVWSUNFKEdQSU8xKSwKLQlNU01fREVWSUNFKEdQSU8yKSwKKwlNU01fQ0hJUF9ERVZJQ0UoR1BJTzEsIFFTRDhYNTApLAorCU1TTV9DSElQX0RFVklDRShHUElPMiwgUVNEOFg1MCksCiAJTVNNX0RFVklDRShDTEtfQ1RMKSwKIAlNU01fREVWSUNFKFNJUkMpLAogCU1TTV9ERVZJQ0UoU0NQTEwpLApAQCAtMTM1LDggKzEzNSw4IEBACiAJTVNNX0RFVklDRShWSUMpLAogCU1TTV9DSElQX0RFVklDRShDU1IsIE1TTTdYMzApLAogCU1TTV9ERVZJQ0UoRE1PViksCi0JTVNNX0RFVklDRShHUElPMSksCi0JTVNNX0RFVklDRShHUElPMiksCisJTVNNX0NISVBfREVWSUNFKEdQSU8xLCBNU003WDMwKSwKKwlNU01fQ0hJUF9ERVZJQ0UoR1BJTzIsIE1TTTdYMzApLAogCU1TTV9ERVZJQ0UoQ0xLX0NUTCksCiAJTVNNX0RFVklDRShDTEtfQ1RMX1NIMiksCiAJTVNNX0RFVklDRShBRDUpLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL3BjaWUuYyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9wY2llLmMKaW5kZXggZDYzMzZhZi4uYzUxYWYxYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL3BjaWUuYworKysgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvcGNpZS5jCkBAIC0yNjAsNyArMjYwLDggQEAKIAlyZXR1cm4gYnVzOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBtdjc4eHgwX3BjaWVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBtdjc4eHgwX3BjaWVfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LAorCXU4IHBpbikKIHsKIAlzdHJ1Y3QgcGNpZV9wb3J0ICpwcCA9IGJ1c190b19wb3J0KGRldi0+YnVzLT5udW1iZXIpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUxX2JhYmJhZ2UuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfYmFiYmFnZS5jCmluZGV4IDE1YzYwMDAuLmU0MDBiMDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfYmFiYmFnZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfYmFiYmFnZS5jCkBAIC00MSw4ICs0MSw2IEBACiAjZGVmaW5lIEJBQkJBR0VfUE9XRVJfS0VZCUlNWF9HUElPX05SKDIsIDIxKQogI2RlZmluZSBCQUJCQUdFX0VDU1BJMV9DUzAJSU1YX0dQSU9fTlIoNCwgMjQpCiAjZGVmaW5lIEJBQkJBR0VfRUNTUEkxX0NTMQlJTVhfR1BJT19OUig0LCAyNSkKLSNkZWZpbmUgQkFCQkFHRV9TRDFfQ0QJCUlNWF9HUElPX05SKDEsIDApCi0jZGVmaW5lIEJBQkJBR0VfU0QxX1dQCQlJTVhfR1BJT19OUigxLCAxKQogI2RlZmluZSBCQUJCQUdFX1NEMl9DRAkJSU1YX0dQSU9fTlIoMSwgNikKICNkZWZpbmUgQkFCQkFHRV9TRDJfV1AJCUlNWF9HUElPX05SKDEsIDUpCiAKQEAgLTE0Niw4ICsxNDQsOSBAQAogCU1YNTFfUEFEX1NEMV9EQVRBMV9fU0QxX0RBVEExLAogCU1YNTFfUEFEX1NEMV9EQVRBMl9fU0QxX0RBVEEyLAogCU1YNTFfUEFEX1NEMV9EQVRBM19fU0QxX0RBVEEzLAotCU1YNTFfUEFEX0dQSU8xXzBfX0dQSU8xXzAsCi0JTVg1MV9QQURfR1BJTzFfMV9fR1BJTzFfMSwKKwkvKiBDRC9XUCBmcm9tIGNvbnRyb2xsZXIgKi8KKwlNWDUxX1BBRF9HUElPMV8wX19TRDFfQ0QsCisJTVg1MV9QQURfR1BJTzFfMV9fU0QxX1dQLAogCiAJLyogU0QgMiAqLwogCU1YNTFfUEFEX1NEMl9DTURfX1NEMl9DTUQsCkBAIC0xNTYsNiArMTU1LDcgQEAKIAlNWDUxX1BBRF9TRDJfREFUQTFfX1NEMl9EQVRBMSwKIAlNWDUxX1BBRF9TRDJfREFUQTJfX1NEMl9EQVRBMiwKIAlNWDUxX1BBRF9TRDJfREFUQTNfX1NEMl9EQVRBMywKKwkvKiBDRC9XUCBncGlvICovCiAJTVg1MV9QQURfR1BJTzFfNl9fR1BJTzFfNiwKIAlNWDUxX1BBRF9HUElPMV81X19HUElPMV81LAogCkBAIC0zNDAsMTMgKzM0MCwxNSBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhIG14NTFfYmFiYmFnZV9zZDFfZGF0YSBfX2luaXRjb25zdCA9IHsKLQkuY2RfZ3BpbyA9IEJBQkJBR0VfU0QxX0NELAotCS53cF9ncGlvID0gQkFCQkFHRV9TRDFfV1AsCisJLmNkX3R5cGUgPSBFU0RIQ19DRF9DT05UUk9MTEVSLAorCS53cF90eXBlID0gRVNESENfV1BfQ09OVFJPTExFUiwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSBteDUxX2JhYmJhZ2Vfc2QyX2RhdGEgX19pbml0Y29uc3QgPSB7CiAJLmNkX2dwaW8gPSBCQUJCQUdFX1NEMl9DRCwKIAkud3BfZ3BpbyA9IEJBQkJBR0VfU0QyX1dQLAorCS5jZF90eXBlID0gRVNESENfQ0RfR1BJTywKKwkud3BfdHlwZSA9IEVTREhDX1dQX0dQSU8sCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19sb2NvLmMgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX2xvY28uYwppbmRleCA1NGJlNTI1Li40ZTFkNTFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX2xvY28uYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX2xvY28uYwpAQCAtMjEwLDExICsyMTAsMTUgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhIG14NTNfbG9jb19zZDFfZGF0YSBfX2luaXRjb25zdCA9IHsKIAkuY2RfZ3BpbyA9IExPQ09fU0QxX0NELAorCS5jZF90eXBlID0gRVNESENfQ0RfR1BJTywKKwkud3BfdHlwZSA9IEVTREhDX1dQX05PTkUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgbXg1M19sb2NvX3NkM19kYXRhIF9faW5pdGNvbnN0ID0gewogCS5jZF9ncGlvID0gTE9DT19TRDNfQ0QsCiAJLndwX2dwaW8gPSBMT0NPX1NEM19XUCwKKwkuY2RfdHlwZSA9IEVTREhDX0NEX0dQSU8sCisJLndwX3R5cGUgPSBFU0RIQ19XUF9HUElPLAogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIG14NTNfbG9jb19mZWNfcmVzZXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2Nsb2NrLW14NTEtbXg1My5jIGIvYXJjaC9hcm0vbWFjaC1teDUvY2xvY2stbXg1MS1teDUzLmMKaW5kZXggMjNjZDgwOS4uN2YyMDMwOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvY2xvY2stbXg1MS1teDUzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvY2xvY2stbXg1MS1teDUzLmMKQEAgLTE0MjIsMTEgKzE0MjIsMTMgQEAKICAgICAgICB9LAogCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbXg1MV9sb29rdXBzW10gPSB7Ci0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4wIiwgTlVMTCwgdWFydDFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMSIsIE5VTEwsIHVhcnQyX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjIiLCBOVUxMLCB1YXJ0M19jbGspCisJLyogaS5teDUxIGhhcyB0aGUgaS5teDIxIHR5cGUgdWFydCAqLworCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4wIiwgTlVMTCwgdWFydDFfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4xIiwgTlVMTCwgdWFydDJfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4yIiwgTlVMTCwgdWFydDNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3B0IiwgZ3B0X2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImZlYy4wIiwgTlVMTCwgZmVjX2NsaykKKwkvKiBpLm14NTEgaGFzIHRoZSBpLm14MjcgdHlwZSBmZWMgKi8KKwlfUkVHSVNURVJfQ0xPQ0soImlteDI3LWZlYy4wIiwgTlVMTCwgZmVjX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soIm14Y19wd20uMCIsICJwd20iLCBwd20xX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soIm14Y19wd20uMSIsICJwd20iLCBwd20yX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1pMmMuMCIsIE5VTEwsIGkyYzFfY2xrKQpAQCAtMTQ0Niw3ICsxNDQ4LDggQEAKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1zc2kuMCIsIE5VTEwsIHNzaTFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LXNzaS4xIiwgTlVMTCwgc3NpMl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtc3NpLjIiLCBOVUxMLCBzc2kzX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC1zZG1hIiwgTlVMTCwgc2RtYV9jbGspCisJLyogaS5teDUxIGhhcyB0aGUgaS5teDM1IHR5cGUgc2RtYSAqLworCV9SRUdJU1RFUl9DTE9DSygiaW14MzUtc2RtYSIsIE5VTEwsIHNkbWFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiY2tpaCIsIGNraWhfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiY2tpaDIiLCBja2loMl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHRfMzJrIiwgZ3B0XzMya19jbGspCkBAIC0xNDU0LDEwICsxNDU3LDEwIEBACiAJX1JFR0lTVEVSX0NMT0NLKCJpbXg1MS1lY3NwaS4xIiwgTlVMTCwgZWNzcGkyX2NsaykKIAkvKiBpLm14NTEgaGFzIHRoZSBpLm14MzUgdHlwZSBjc3BpICovCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgzNS1jc3BpLjAiLCBOVUxMLCBjc3BpX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteC4wIiwgTlVMTCwgZXNkaGMxX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteC4xIiwgTlVMTCwgZXNkaGMyX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteC4yIiwgTlVMTCwgZXNkaGMzX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteC4zIiwgTlVMTCwgZXNkaGM0X2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteDUxLjAiLCBOVUxMLCBlc2RoYzFfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14NTEuMSIsIE5VTEwsIGVzZGhjMl9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJzZGhjaS1lc2RoYy1pbXg1MS4yIiwgTlVMTCwgZXNkaGMzX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteDUxLjMiLCBOVUxMLCBlc2RoYzRfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiY3B1X2NsayIsIGNwdV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJpaW1fY2xrIiwgaWltX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteDItd2R0LjAiLCBOVUxMLCBkdW1teV9jbGspCkBAIC0xNDcwLDI5ICsxNDczLDMyIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbXg1M19sb29rdXBzW10gPSB7Ci0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4wIiwgTlVMTCwgdWFydDFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMSIsIE5VTEwsIHVhcnQyX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjIiLCBOVUxMLCB1YXJ0M19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4zIiwgTlVMTCwgdWFydDRfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuNCIsIE5VTEwsIHVhcnQ1X2NsaykKKwkvKiBpLm14NTMgaGFzIHRoZSBpLm14MjEgdHlwZSB1YXJ0ICovCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjAiLCBOVUxMLCB1YXJ0MV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjEiLCBOVUxMLCB1YXJ0Ml9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjIiLCBOVUxMLCB1YXJ0M19jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjMiLCBOVUxMLCB1YXJ0NF9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjQiLCBOVUxMLCB1YXJ0NV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHQiLCBncHRfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiZmVjLjAiLCBOVUxMLCBmZWNfY2xrKQorCS8qIGkubXg1MyBoYXMgdGhlIGkubXgyNSB0eXBlIGZlYyAqLworCV9SRUdJU1RFUl9DTE9DSygiaW14MjUtZmVjLjAiLCBOVUxMLCBmZWNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiaWltX2NsayIsIGlpbV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtaTJjLjAiLCBOVUxMLCBpMmMxX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1pMmMuMSIsIE5VTEwsIGkyYzJfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LWkyYy4yIiwgTlVMTCwgaTJjM19teDUzX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteC4wIiwgTlVMTCwgZXNkaGMxX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteC4xIiwgTlVMTCwgZXNkaGMyX214NTNfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14LjIiLCBOVUxMLCBlc2RoYzNfbXg1M19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJzZGhjaS1lc2RoYy1pbXguMyIsIE5VTEwsIGVzZGhjNF9teDUzX2NsaykKIAkvKiBpLm14NTMgaGFzIHRoZSBpLm14NTEgdHlwZSBlY3NwaSAqLwogCV9SRUdJU1RFUl9DTE9DSygiaW14NTEtZWNzcGkuMCIsIE5VTEwsIGVjc3BpMV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXg1MS1lY3NwaS4xIiwgTlVMTCwgZWNzcGkyX2NsaykKIAkvKiBpLm14NTMgaGFzIHRoZSBpLm14MjUgdHlwZSBjc3BpICovCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgzNS1jc3BpLjAiLCBOVUxMLCBjc3BpX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteDUzLjAiLCBOVUxMLCBlc2RoYzFfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14NTMuMSIsIE5VTEwsIGVzZGhjMl9teDUzX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteDUzLjIiLCBOVUxMLCBlc2RoYzNfbXg1M19jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJzZGhjaS1lc2RoYy1pbXg1My4zIiwgTlVMTCwgZXNkaGM0X214NTNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14Mi13ZHQuMCIsIE5VTEwsIGR1bW15X2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteDItd2R0LjEiLCBOVUxMLCBkdW1teV9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtc2RtYSIsIE5VTEwsIHNkbWFfY2xrKQorCS8qIGkubXg1MyBoYXMgdGhlIGkubXgzNSB0eXBlIHNkbWEgKi8KKwlfUkVHSVNURVJfQ0xPQ0soImlteDM1LXNkbWEiLCBOVUxMLCBzZG1hX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1zc2kuMCIsIE5VTEwsIHNzaTFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LXNzaS4xIiwgTlVMTCwgc3NpMl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtc3NpLjIiLCBOVUxMLCBzc2kzX2NsaykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L21tLmMgYi9hcmNoL2FybS9tYWNoLW14NS9tbS5jCmluZGV4IGVmOGFlYzkuLmJhZWE2ZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L21tLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvbW0uYwpAQCAtMTE1LDcgKzExNSw2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNkbWFfcGxhdGZvcm1fZGF0YSBpbXg1MV9zZG1hX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLnNkbWFfdmVyc2lvbiA9IDIsCiAJLmZ3X25hbWUgPSAic2RtYS1pbXg1MS5iaW4iLAogCS5zY3JpcHRfYWRkcnMgPSAmaW14NTFfc2RtYV9zY3JpcHQsCiB9OwpAQCAtMTM1LDcgKzEzNCw2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNkbWFfcGxhdGZvcm1fZGF0YSBpbXg1M19zZG1hX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLnNkbWFfdmVyc2lvbiA9IDIsCiAJLmZ3X25hbWUgPSAic2RtYS1pbXg1My5iaW4iLAogCS5zY3JpcHRfYWRkcnMgPSAmaW14NTNfc2RtYV9zY3JpcHQsCiB9OwpAQCAtMTQ4LDcgKzE0Niw4IEBACiAJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAyLCBNWDUxX0dQSU8zX0JBU0VfQUREUiwgU1pfMTZLLCBNWDUxX01YQ19JTlRfR1BJTzNfTE9XLCBNWDUxX01YQ19JTlRfR1BJTzNfSElHSCk7CiAJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAzLCBNWDUxX0dQSU80X0JBU0VfQUREUiwgU1pfMTZLLCBNWDUxX01YQ19JTlRfR1BJTzRfTE9XLCBNWDUxX01YQ19JTlRfR1BJTzRfSElHSCk7CiAKLQlpbXhfYWRkX2lteF9zZG1hKE1YNTFfU0RNQV9CQVNFX0FERFIsIE1YNTFfSU5UX1NETUEsICZpbXg1MV9zZG1hX3BkYXRhKTsKKwkvKiBpLm14NTEgaGFzIHRoZSBpLm14MzUgdHlwZSBzZG1hICovCisJaW14X2FkZF9pbXhfc2RtYSgiaW14MzUtc2RtYSIsIE1YNTFfU0RNQV9CQVNFX0FERFIsIE1YNTFfSU5UX1NETUEsICZpbXg1MV9zZG1hX3BkYXRhKTsKIH0KIAogdm9pZCBfX2luaXQgaW14NTNfc29jX2luaXQodm9pZCkKQEAgLTE2Miw1ICsxNjEsNiBAQAogCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgNSwgTVg1M19HUElPNl9CQVNFX0FERFIsIFNaXzE2SywgTVg1M19JTlRfR1BJTzZfTE9XLCBNWDUzX0lOVF9HUElPNl9ISUdIKTsKIAlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDYsIE1YNTNfR1BJTzdfQkFTRV9BRERSLCBTWl8xNkssIE1YNTNfSU5UX0dQSU83X0xPVywgTVg1M19JTlRfR1BJTzdfSElHSCk7CiAKLQlpbXhfYWRkX2lteF9zZG1hKE1YNTNfU0RNQV9CQVNFX0FERFIsIE1YNTNfSU5UX1NETUEsICZpbXg1M19zZG1hX3BkYXRhKTsKKwkvKiBpLm14NTMgaGFzIHRoZSBpLm14MzUgdHlwZSBzZG1hICovCisJaW14X2FkZF9pbXhfc2RtYSgiaW14MzUtc2RtYSIsIE1YNTNfU0RNQV9CQVNFX0FERFIsIE1YNTNfSU5UX1NETUEsICZpbXg1M19zZG1hX3BkYXRhKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L214NTFfZWZpa2EuYyBiL2FyY2gvYXJtL21hY2gtbXg1L214NTFfZWZpa2EuYwppbmRleCA1NjczOWMyLi40NDM1ZTAzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9teDUxX2VmaWthLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvbXg1MV9lZmlrYS5jCkBAIC0yNjAsOCArMjYwLDggQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB2c2RfY29uc3VtZXJzW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJzZGhjaS1lc2RoYy1pbXguMCIpLAotCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAic2RoY2ktZXNkaGMtaW14LjEiKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgInNkaGNpLWVzZGhjLWlteDUxLjAiKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgInNkaGNpLWVzZGhjLWlteDUxLjEiKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBwd2d0MV9jb25zdW1lcltdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLXBlcmlwaGVyYWxzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYwppbmRleCBjYzUwM2FhLi41YTg4NmNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYwpAQCAtNDE4LDYgKzQxOCwxMCBAQAogCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAib21hcF9oc21tYy4wIiksCiB9OwogCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgcng1MV92YXV4Ml9zdXBwbHlbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX2NzaWIiLCAib21hcDNpc3AiKSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSByeDUxX3ZhdXgzX3N1cHBseVtdID0gewogCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAib21hcF9oc21tYy4xIiksCiB9OwpAQCAtNDc5LDYgKzQ4Myw4IEBACiAJCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKIAkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKIAl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKHJ4NTFfdmF1eDJfc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSByeDUxX3ZhdXgyX3N1cHBseSwKIH07CiAKIC8qIFZBVVgzIC0gYWRkcyBtb3JlIHBvd2VyIHRvIFZJT18xOCByYWlsICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Rpc3BsYXkuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZGlzcGxheS5jCmluZGV4IDU0M2ZjYjguLmE1YjdhMjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvZGlzcGxheS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZGlzcGxheS5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8dmlkZW8vb21hcGRzcy5oPgogI2luY2x1ZGUgPHBsYXQvb21hcF9od21vZC5oPgogI2luY2x1ZGUgPHBsYXQvb21hcF9kZXZpY2UuaD4KKyNpbmNsdWRlIDxwbGF0L29tYXAtcG0uaD4KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcF9kaXNwbGF5X2RldmljZSA9IHsKIAkubmFtZSAgICAgICAgICA9ICJvbWFwZHNzIiwKQEAgLTQyLDIwICs0Myw2IEBACiAJfSwKIH07CiAKLS8qIG9oX2NvcmUgaXMgdXNlZCBmb3IgZ2V0dGluZyBvcHQtY2xvY2tzICovCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2QJKm9oX2NvcmU7Ci0KLXN0YXRpYyBib29sIG9wdF9jbG9ja19hdmFpbGFibGUoY29uc3QgY2hhciAqY2xrX3JvbGUpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgb2hfY29yZS0+b3B0X2Nsa3NfY250OyBpKyspIHsKLQkJaWYgKCFzdHJjbXAob2hfY29yZS0+b3B0X2Nsa3NbaV0ucm9sZSwgY2xrX3JvbGUpKQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQogc3RydWN0IG9tYXBfZHNzX2h3bW9kX2RhdGEgewogCWNvbnN0IGNoYXIgKm9oX25hbWU7CiAJY29uc3QgY2hhciAqZGV2X25hbWU7CkBAIC0xMDksMTYgKzk2LDkgQEAKIAkJb2hfY291bnQgPSBBUlJBWV9TSVpFKG9tYXA0X2Rzc19od21vZF9kYXRhKTsKIAl9CiAKLQkvKiBvcHRfY2xrcyBhcmUgYWx3YXlzIGFzc29jaWF0ZWQgd2l0aCBkc3MgaHdtb2QgKi8KLQlvaF9jb3JlID0gb21hcF9od21vZF9sb29rdXAoImRzc19jb3JlIik7Ci0JaWYgKCFvaF9jb3JlKSB7Ci0JCXByX2VycigiQ291bGQgbm90IGxvb2sgdXAgZHNzX2NvcmUuXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCiAJcGRhdGEuYm9hcmRfZGF0YSA9IGJvYXJkX2RhdGE7Ci0JcGRhdGEuYm9hcmRfZGF0YS0+Z2V0X2xhc3Rfb2ZmX29uX3RyYW5zYWN0aW9uX2lkID0gTlVMTDsKLQlwZGF0YS5vcHRfY2xvY2tfYXZhaWxhYmxlID0gb3B0X2Nsb2NrX2F2YWlsYWJsZTsKKwlwZGF0YS5ib2FyZF9kYXRhLT5nZXRfY29udGV4dF9sb3NzX2NvdW50ID0KKwkJb21hcF9wbV9nZXRfZGV2X2NvbnRleHRfbG9zc19jb3VudDsKIAogCWZvciAoaSA9IDA7IGkgPCBvaF9jb3VudDsgaSsrKSB7CiAJCW9oID0gb21hcF9od21vZF9sb29rdXAoY3Vycl9kc3NfaHdtb2RbaV0ub2hfbmFtZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvY29tbW9uLmggYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvY29tbW9uLmgKaW5kZXggZjJiMmIzNS4uM2U1NDk5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2NvbW1vbi5oCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9jb21tb24uaApAQCAtNTEsNyArNTEsNyBAQAogdm9pZCBvcmlvbjV4X3BjaV9zZXRfY2FyZGJ1c19tb2RlKHZvaWQpOwogaW50IG9yaW9uNXhfcGNpX3N5c19zZXR1cChpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cyk7CiBzdHJ1Y3QgcGNpX2J1cyAqb3Jpb241eF9wY2lfc3lzX3NjYW5fYnVzKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKTsKLWludCBvcmlvbjV4X3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbik7CitpbnQgb3Jpb241eF9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pOwogCiBzdHJ1Y3QgbWFjaGluZV9kZXNjOwogc3RydWN0IG1lbWluZm87CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZGI4OGY1MjgxLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZGI4OGY1MjgxLXNldHVwLmMKaW5kZXggZjk1ZDNjYi4uYTNlM2U5ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2RiODhmNTI4MS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kYjg4ZjUyODEtc2V0dXAuYwpAQCAtMjM3LDcgKzIzNyw4IEBACiAJfQogfQogCi1zdGF0aWMgaW50IF9faW5pdCBkYjg4ZjUyODFfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgZGI4OGY1MjgxX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsCisJdTggcGluKQogewogCWludCBpcnE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kbnMzMjMtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kbnMzMjMtc2V0dXAuYwppbmRleCA4NTVlMGU3Li5hNmVkZGFlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZG5zMzIzLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2RuczMyMy1zZXR1cC5jCkBAIC03MCwxNCArNzAsMTQgQEAKICAqIFBDSSBzZXR1cAogICovCiAKLXN0YXRpYyBpbnQgX19pbml0IGRuczMyM19wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBkbnMzMjNfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBpcnE7CiAKIAkvKgogCSAqIENoZWNrIGZvciBkZXZpY2VzIHdpdGggaGFyZC13aXJlZCBJUlFzLgogCSAqLwotCWlycSA9IG9yaW9uNXhfcGNpX21hcF9pcnEoZGV2LCBzbG90LCBwaW4pOworCWlycSA9IG9yaW9uNXhfcGNpX21hcF9pcnEoY29uc3QgZGV2LCBzbG90LCBwaW4pOwogCWlmIChpcnEgIT0gLTEpCiAJCXJldHVybiBpcnE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9rdXJvYm94X3Byby1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2t1cm9ib3hfcHJvLXNldHVwLmMKaW5kZXggYzBlYjY0Ni4uMDAzODEyNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2t1cm9ib3hfcHJvLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2t1cm9ib3hfcHJvLXNldHVwLmMKQEAgLTExOSw3ICsxMTksOCBAQAogICogUENJCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGludCBfX2luaXQga3Vyb2JveF9wcm9fcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQga3Vyb2JveF9wcm9fcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwKKwl1OCBwaW4pCiB7CiAJaW50IGlycTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L21zczItc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9tc3MyLXNldHVwLmMKaW5kZXggNTkyNjNiNy4uZWYzYmI4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L21zczItc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbXNzMi1zZXR1cC5jCkBAIC03Myw3ICs3Myw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogUENJIHNldHVwCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgX19pbml0IG1zczJfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgbXNzMl9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaW50IGlycTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3BjaS5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3BjaS5jCmluZGV4IGY2NDk2NWQuLjI4Yjg3NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcGNpLmMKQEAgLTU4OSw3ICs1ODksNyBAQAogCXJldHVybiBidXM7CiB9CiAKLWludCBfX2luaXQgb3Jpb241eF9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpbnQgX19pbml0IG9yaW9uNXhfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBidXMgPSBkZXYtPmJ1cy0+bnVtYmVyOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgxbC1meG8tc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODFsLWZ4by1zZXR1cC5jCmluZGV4IDllZWM3YzIuLjI5MWQyMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODFsLWZ4by1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODFsLWZ4by1zZXR1cC5jCkBAIC0xMzEsNyArMTMxLDcgQEAKIH0KIAogc3RhdGljIGludCBfX2luaXQKLXJkODhmNTE4MWxfZnhvX3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3JkODhmNTE4MWxfZnhvX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgxbC1nZS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4MWwtZ2Utc2V0dXAuYwppbmRleCAwY2M5MGJiZi4uM2YwMjM2MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4MWwtZ2Utc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgxbC1nZS1zZXR1cC5jCkBAIC0xNDAsNyArMTQwLDcgQEAKIH0KIAogc3RhdGljIGludCBfX2luaXQKLXJkODhmNTE4MWxfZ2VfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorcmQ4OGY1MTgxbF9nZV9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaW50IGlycTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4Mi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4Mi1zZXR1cC5jCmluZGV4IDQ4ZGEzOWIuLjI3ZmQzOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODItc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgyLXNldHVwLmMKQEAgLTE3Miw3ICsxNzIsOCBAQAogCX0KIH0KIAotc3RhdGljIGludCBfX2luaXQgcmQ4OGY1MTgyX3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IHJkODhmNTE4Ml9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LAorCXU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdGVyYXN0YXRpb25fcHJvMi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RlcmFzdGF0aW9uX3BybzItc2V0dXAuYwppbmRleCAyOWNlODI2Li5hMzRlNGZhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdGVyYXN0YXRpb25fcHJvMi1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC90ZXJhc3RhdGlvbl9wcm8yLXNldHVwLmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCBfX2luaXQgdHNwMl9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCB0c3AyX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdHMyMDktc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czIwOS1zZXR1cC5jCmluZGV4IDQ3MTYyZmQuLmM5ODMxNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czIwOS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czIwOS1zZXR1cC5jCkBAIC0xNDMsNyArMTQzLDggQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHFuYXBfdHMyMDlfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgcW5hcF90czIwOV9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LAorCXU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdHM0MDktc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czQwOS1zZXR1cC5jCmluZGV4IDVhYWNjN2EuLmNjMzNiMjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czQwOS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czQwOS1zZXR1cC5jCkBAIC0xMjEsNyArMTIxLDggQEAKICAqIFBDSQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBpbnQgX19pbml0IHFuYXBfdHM0MDlfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgcW5hcF90czQwOV9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LAorCXU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvd25yODU0dC1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3ducjg1NHQtc2V0dXAuYwppbmRleCA0NDRhMWM3Li4yNjUzNTk1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvd25yODU0dC1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC93bnI4NTR0LXNldHVwLmMKQEAgLTEzMyw3ICsxMzMsOCBAQAogCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmd25yODU0dF9ub3JfZmxhc2gpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCB3bnI4NTR0X3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IHducjg1NHRfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwKKwl1OCBwaW4pCiB7CiAJaW50IGlycTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3dydDM1MG4tdjItc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC93cnQzNTBuLXYyLXNldHVwLmMKaW5kZXggZDE5NTJiZS4uMjUxZWYxNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3dydDM1MG4tdjItc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvd3J0MzUwbi12Mi1zZXR1cC5jCkBAIC0yMjEsNyArMjIxLDggQEAKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJndydDM1MG5fdjJfYnV0dG9uX2RldmljZSk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHdydDM1MG5fdjJfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgd3J0MzUwbl92Ml9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LAorCXU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jbS14Mnh4LXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY20teDJ4eC1wY2kuYwppbmRleCA0ZWI3NjYwLi42YmY0NzlkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jbS14Mnh4LXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyeHgtcGNpLmMKQEAgLTc3LDcgKzc3LDcgQEAKICNlbmRpZgogCiAvKiBQQ0kgSVJRIG1hcHBpbmcqLwotc3RhdGljIGludCBfX2luaXQgY214Mnh4X3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IGNteDJ4eF9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaW50IGlycTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvcGNpLW5hbm9lbmdpbmUuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BjaS1uYW5vZW5naW5lLmMKaW5kZXggNWZjMDc0Zi4uOTY0YzZjMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvcGNpLW5hbm9lbmdpbmUuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9wY2ktbmFub2VuZ2luZS5jCkBAIC0xMjIsNyArMTIyLDggQEAKIAkud3JpdGUJPSBuYW5vZW5naW5lX3dyaXRlX2NvbmZpZywKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHBjaV9uYW5vZW5naW5lX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgcGNpX25hbm9lbmdpbmVfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LAorCXU4IHBpbikKIHsKIAlyZXR1cm4gTkFOT0VOR0lORV9JUlFfR1BJT19QQ0k7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNoYXJrL3BjaS5jIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9wY2kuYwppbmRleCA5MmQ3MjI3Li43Y2I3OWEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNoYXJrL3BjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2hhcmsvcGNpLmMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCi1zdGF0aWMgaW50IF9faW5pdCBzaGFya19tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IHNoYXJrX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWlmIChkZXYtPmJ1cy0+bnVtYmVyID09IDApCiAJCWlmIChkZXYtPmRldmZuID09IDApCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFwNGV2Yi5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hcDRldmIuYwppbmRleCA4MzcxMzhlLi45ZTA4NTZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFwNGV2Yi5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYXA0ZXZiLmMKQEAgLTk1NywxOSArOTU3LDE2IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNzaTJfZGV2aWNlID0gewotCS5uYW1lICAgPSAic2gtbW9iaWxlLWNzaTIiLAotCS5pZCAgICAgPSAwLAorc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfY2V1X2NvbXBhbmlvbiBjc2kyID0geworCS5pZAkJPSAwLAogCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShjc2kyX3Jlc291cmNlcyksCiAJLnJlc291cmNlCT0gY3NpMl9yZXNvdXJjZXMsCi0JLmRldiAgICA9IHsKLQkJLnBsYXRmb3JtX2RhdGEgPSAmY3NpMl9pbmZvLAotCX0sCisJLnBsYXRmb3JtX2RhdGEJPSAmY3NpMl9pbmZvLAogfTsKIAogc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfY2V1X2luZm8gc2hfbW9iaWxlX2NldV9pbmZvID0gewogCS5mbGFncyA9IFNIX0NFVV9GTEFHX1VTRV84QklUX0JVUywKLQkuY3NpMl9kZXYgPSAmY3NpMl9kZXZpY2UuZGV2LAorCS5jc2kyID0gJmNzaTIsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGNldV9yZXNvdXJjZXNbXSA9IHsKQEAgLTEwMTMsNyArMTAxMCw2IEBACiAJJmxjZGMxX2RldmljZSwKIAkmbGNkY19kZXZpY2UsCiAJJmhkbWlfZGV2aWNlLAotCSZjc2kyX2RldmljZSwKIAkmY2V1X2RldmljZSwKIAkmYXA0ZXZiX2NhbWVyYSwKIAkmbWVyYW1fZGV2aWNlLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1tYWNrZXJlbC5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1tYWNrZXJlbC5jCmluZGV4IDViMzZiNmMuLmQ0MWMwMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtbWFja2VyZWwuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLW1hY2tlcmVsLmMKQEAgLTExOTIsOCArMTE5Miw4IEBACiB9OwogCiAKLXN0YXRpYyBpbnQgbWFja2VyZWxfY2FtZXJhX2FkZChzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wsIHN0cnVjdCBkZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBtYWNrZXJlbF9jYW1lcmFfZGVsKHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCk7CitzdGF0aWMgaW50IG1hY2tlcmVsX2NhbWVyYV9hZGQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpOworc3RhdGljIHZvaWQgbWFja2VyZWxfY2FtZXJhX2RlbChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCk7CiAKIHN0YXRpYyBpbnQgY2FtZXJhX3NldF9jYXB0dXJlKHN0cnVjdCBzb2NfY2FtZXJhX3BsYXRmb3JtX2luZm8gKmluZm8sCiAJCQkgICAgICBpbnQgZW5hYmxlKQpAQCAtMTIzMiwxNiArMTIzMiwxNSBAQAogCXNvY19jYW1lcmFfcGxhdGZvcm1fcmVsZWFzZSgmY2FtZXJhX2RldmljZSk7CiB9CiAKLXN0YXRpYyBpbnQgbWFja2VyZWxfY2FtZXJhX2FkZChzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wsCi0JCQkgICAgICAgc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBtYWNrZXJlbF9jYW1lcmFfYWRkKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXJldHVybiBzb2NfY2FtZXJhX3BsYXRmb3JtX2FkZChpY2wsIGRldiwgJmNhbWVyYV9kZXZpY2UsICZjYW1lcmFfbGluaywKKwlyZXR1cm4gc29jX2NhbWVyYV9wbGF0Zm9ybV9hZGQoaWNkLCAmY2FtZXJhX2RldmljZSwgJmNhbWVyYV9saW5rLAogCQkJCSAgICAgICBtYWNrZXJlbF9jYW1lcmFfcmVsZWFzZSwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIG1hY2tlcmVsX2NhbWVyYV9kZWwoc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsKQorc3RhdGljIHZvaWQgbWFja2VyZWxfY2FtZXJhX2RlbChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKLQlzb2NfY2FtZXJhX3BsYXRmb3JtX2RlbChpY2wsIGNhbWVyYV9kZXZpY2UsICZjYW1lcmFfbGluayk7CisJc29jX2NhbWVyYV9wbGF0Zm9ybV9kZWwoaWNkLCBjYW1lcmFfZGV2aWNlLCAmY2FtZXJhX2xpbmspOwogfQogCiBzdGF0aWMgc3RydWN0IHNoX21vYmlsZV9jZXVfaW5mbyBzaF9tb2JpbGVfY2V1X2luZm8gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzM2Ny5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczNjcuYwppbmRleCA2YjE4NmFlLi41MjE4YzM0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzM2Ny5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3MzY3LmMKQEAgLTI1OSw5ICsyNTksNiBAQAogCVtDTU1TVFAwMDNdID0gTVNUUCgmcl9jbGssIENNTVNUUENSMCwgMywgMCksIC8qIEtFWVNDICovCiB9OwogCi0jZGVmaW5lIENMS0RFVl9DT05fSUQoX2lkLCBfY2xrKSB7IC5jb25faWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLSNkZWZpbmUgQ0xLREVWX0RFVl9JRChfaWQsIF9jbGspIHsgLmRldl9pZCA9IF9pZCwgLmNsayA9IF9jbGsgfQotCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbG9va3Vwc1tdID0gewogCS8qIG1haW4gY2xvY2tzICovCiAJQ0xLREVWX0NPTl9JRCgicl9jbGsiLCAmcl9jbGspLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczNzIuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3MzcyLmMKaW5kZXggOTFmNTc3OS4uNmIxNjE5YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczNzIuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzM3Mi5jCkBAIC01NjEsMTAgKzU2MSw2IEBACiAJW01TVFA0MDNdID0gTVNUUCgmcl9jbGssIFNNU1RQQ1I0LCAzLCAwKSwgLyogS0VZU0MgKi8KIH07CiAKLSNkZWZpbmUgQ0xLREVWX0NPTl9JRChfaWQsIF9jbGspIHsgLmNvbl9pZCA9IF9pZCwgLmNsayA9IF9jbGsgfQotI2RlZmluZSBDTEtERVZfREVWX0lEKF9pZCwgX2NsaykgeyAuZGV2X2lkID0gX2lkLCAuY2xrID0gX2NsayB9Ci0jZGVmaW5lIENMS0RFVl9JQ0tfSUQoX2NpZCwgX2RpZCwgX2NsaykgeyAuY29uX2lkID0gX2NpZCwgLmRldl9pZCA9IF9kaWQsIC5jbGsgPSBfY2xrIH0KLQogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKIAkvKiBtYWluIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoImR2X2Nsa2lfZGl2Ml9jbGsiLCAmc2g3MzcyX2R2X2Nsa2lfZGl2Ml9jbGspLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczNzcuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3Mzc3LmMKaW5kZXggOTU5NDI0Ni4uOGNlZTdiMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczNzcuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzM3Ny5jCkBAIC0yNjcsOSArMjY3LDYgQEAKIAlbTVNUUDQwM10gPSBNU1RQKCZyX2NsaywgU01TVFBDUjQsIDMsIDApLCAvKiBLRVlTQyAqLwogfTsKIAotI2RlZmluZSBDTEtERVZfQ09OX0lEKF9pZCwgX2NsaykgeyAuY29uX2lkID0gX2lkLCAuY2xrID0gX2NsayB9Ci0jZGVmaW5lIENMS0RFVl9ERVZfSUQoX2lkLCBfY2xrKSB7IC5kZXZfaWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLQogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKIAkvKiBtYWluIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoInJfY2xrIiwgJnJfY2xrKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3M2EwLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzNhMC5jCmluZGV4IGJjYWNiMWUuLjZkYjJjY2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3M2EwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczYTAuYwpAQCAtMzA2LDEwICszMDYsNiBAQAogCVtNU1RQNDAzXSA9IE1TVFAoJnJfY2xrLCBTTVNUUENSNCwgMywgMCksIC8qIEtFWVNDICovCiB9OwogCi0jZGVmaW5lIENMS0RFVl9DT05fSUQoX2lkLCBfY2xrKSB7IC5jb25faWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLSNkZWZpbmUgQ0xLREVWX0RFVl9JRChfaWQsIF9jbGspIHsgLmRldl9pZCA9IF9pZCwgLmNsayA9IF9jbGsgfQotI2RlZmluZSBDTEtERVZfSUNLX0lEKF9jaWQsIF9kaWQsIF9jbGspIHsgLmNvbl9pZCA9IF9jaWQsIC5kZXZfaWQgPSBfZGlkLCAuY2xrID0gX2NsayB9Ci0KIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7CiAJLyogbWFpbiBjbG9ja3MgKi8KIAlDTEtERVZfQ09OX0lEKCJyX2NsayIsICZyX2NsayksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL0tjb25maWcKaW5kZXggNWVjMTg0Ni4uZDgyZWJhYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvS2NvbmZpZwpAQCAtMjcsMTQgKzI3LDE0IEBACiAKIGNvbmZpZyBNQUNIX0hBUk1PTlkKICAgICAgICBib29sICJIYXJtb255IGJvYXJkIgotICAgICAgIHNlbGVjdCBNQUNIX0hBU19TTkRfU09DX1RFR1JBX1dNODkwMworICAgICAgIHNlbGVjdCBNQUNIX0hBU19TTkRfU09DX1RFR1JBX1dNODkwMyBpZiBTTkRfU09DCiAgICAgICAgaGVscAogICAgICAgICAgU3VwcG9ydCBmb3IgblZpZGlhIEhhcm1vbnkgZGV2ZWxvcG1lbnQgcGxhdGZvcm0KIAogY29uZmlnIE1BQ0hfS0FFTgogICAgICAgIGJvb2wgIkthZW4gYm9hcmQiCiAgICAgICAgc2VsZWN0IE1BQ0hfU0VBQk9BUkQKLSAgICAgICBzZWxlY3QgTUFDSF9IQVNfU05EX1NPQ19URUdSQV9XTTg5MDMKKyAgICAgICBzZWxlY3QgTUFDSF9IQVNfU05EX1NPQ19URUdSQV9XTTg5MDMgaWYgU05EX1NPQwogICAgICAgIGhlbHAKICAgICAgICAgIFN1cHBvcnQgZm9yIHRoZSBLYWVuIHZlcnNpb24gb2YgU2VhYm9hcmQKIApAQCAtNDUsMTIgKzQ1LDE4IEBACiAKIGNvbmZpZyBNQUNIX1NFQUJPQVJECiAgICAgICAgYm9vbCAiU2VhYm9hcmQgYm9hcmQiCi0gICAgICAgc2VsZWN0IE1BQ0hfSEFTX1NORF9TT0NfVEVHUkFfV004OTAzCisgICAgICAgc2VsZWN0IE1BQ0hfSEFTX1NORF9TT0NfVEVHUkFfV004OTAzIGlmIFNORF9TT0MKICAgICAgICBoZWxwCiAgICAgICAgICBTdXBwb3J0IGZvciBuVmlkaWEgU2VhYm9hcmQgZGV2ZWxvcG1lbnQgcGxhdGZvcm0uIEl0IHdpbGwKIAkgYWxzbyBiZSBpbmNsdWRlZCBmb3Igc29tZSBvZiB0aGUgZGVyaXZhdGl2ZSBib2FyZHMgdGhhdAogCSBoYXZlIGxhcmdlIHNpbWlsYXJpdGllcyB3aXRoIHRoZSBzZWFib2FyZCBkZXNpZ24uCiAKK2NvbmZpZyBNQUNIX1RFR1JBX0RUCisJYm9vbCAiR2VuZXJpYyBUZWdyYSBib2FyZCAoRkRUIHN1cHBvcnQpIgorCXNlbGVjdCBVU0VfT0YKKwloZWxwCisJICBTdXBwb3J0IGZvciBnZW5lcmljIG5WaWRpYSBUZWdyYSBib2FyZHMgdXNpbmcgRmxhdHRlbmVkIERldmljZSBUcmVlCisKIGNvbmZpZyBNQUNIX1RSSU1TTElDRQogICAgICAgIGJvb2wgIlRyaW1TbGljZSBib2FyZCIKICAgICAgICBzZWxlY3QgVEVHUkFfUENJCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9NYWtlZmlsZQppbmRleCBlZDU4ZWY5Li5mMTFiOTEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvTWFrZWZpbGUKQEAgLTI5LDUgKzI5LDggQEAKIG9iai0ke0NPTkZJR19NQUNIX1NFQUJPQVJEfSAgICAgICAgICAgICArPSBib2FyZC1zZWFib2FyZC5vCiBvYmotJHtDT05GSUdfTUFDSF9TRUFCT0FSRH0gICAgICAgICAgICAgKz0gYm9hcmQtc2VhYm9hcmQtcGlubXV4Lm8KIAorb2JqLSR7Q09ORklHX01BQ0hfVEVHUkFfRFR9ICAgICAgICAgICAgICs9IGJvYXJkLWR0Lm8KK29iai0ke0NPTkZJR19NQUNIX1RFR1JBX0RUfSAgICAgICAgICAgICArPSBib2FyZC1oYXJtb255LXBpbm11eC5vCisKIG9iai0ke0NPTkZJR19NQUNIX1RSSU1TTElDRX0gICAgICAgICAgICArPSBib2FyZC10cmltc2xpY2Uubwogb2JqLSR7Q09ORklHX01BQ0hfVFJJTVNMSUNFfSAgICAgICAgICAgICs9IGJvYXJkLXRyaW1zbGljZS1waW5tdXgubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9NYWtlZmlsZS5ib290CmluZGV4IGRiNTJkNjEuLjQyOGFkMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvTWFrZWZpbGUuYm9vdAorKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL01ha2VmaWxlLmJvb3QKQEAgLTEsMyArMSw2IEBACiB6cmVsYWRkci0kKENPTkZJR19BUkNIX1RFR1JBXzJ4X1NPQykJOj0gMHgwMDAwODAwMAogcGFyYW1zX3BoeXMtJChDT05GSUdfQVJDSF9URUdSQV8yeF9TT0MpCTo9IDB4MDAwMDAxMDAKIGluaXRyZF9waHlzLSQoQ09ORklHX0FSQ0hfVEVHUkFfMnhfU09DKQk6PSAweDAwODAwMDAwCisKK2R0Yi0kKENPTkZJR19NQUNIX0hBUk1PTlkpICs9IHRlZ3JhLWhhcm1vbnkuZHRiCitkdGItJChDT05GSUdfTUFDSF9TRUFCT0FSRCkgKz0gdGVncmEtc2VhYm9hcmQuZHRiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWR0LmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWR0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY0N2UwNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtZHQuYwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIG5WaWRpYSBUZWdyYSBkZXZpY2UgdHJlZSBib2FyZCBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNlY3JldCBMYWIgVGVjaG5vbG9naWVzLCBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZmR0Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9wZGFfcG93ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy10ZWdyYS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorCisjaW5jbHVkZSA8bWFjaC9pb21hcC5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgorCisjaW5jbHVkZSAiYm9hcmQuaCIKKyNpbmNsdWRlICJib2FyZC1oYXJtb255LmgiCisjaW5jbHVkZSAiY2xvY2suaCIKKyNpbmNsdWRlICJkZXZpY2VzLmgiCisKK3ZvaWQgaGFybW9ueV9waW5tdXhfaW5pdCh2b2lkKTsKK3ZvaWQgc2VhYm9hcmRfcGlubXV4X2luaXQodm9pZCk7CisKKworc3RydWN0IG9mX2Rldl9hdXhkYXRhIHRlZ3JhMjBfYXV4ZGF0YV9sb29rdXBbXSBfX2luaXRkYXRhID0geworCU9GX0RFVl9BVVhEQVRBKCJudmlkaWEsdGVncmEyMC1zZGhjaSIsIFRFR1JBX1NETU1DMV9CQVNFLCAic2RoY2ktdGVncmEuMCIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJudmlkaWEsdGVncmEyMC1zZGhjaSIsIFRFR1JBX1NETU1DMl9CQVNFLCAic2RoY2ktdGVncmEuMSIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJudmlkaWEsdGVncmEyMC1zZGhjaSIsIFRFR1JBX1NETU1DM19CQVNFLCAic2RoY2ktdGVncmEuMiIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJudmlkaWEsdGVncmEyMC1zZGhjaSIsIFRFR1JBX1NETU1DNF9CQVNFLCAic2RoY2ktdGVncmEuMyIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJudmlkaWEsdGVncmEyMC1pMmMiLCBURUdSQV9JMkNfQkFTRSwgInRlZ3JhLWkyYy4wIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoIm52aWRpYSx0ZWdyYTIwLWkyYyIsIFRFR1JBX0kyQzJfQkFTRSwgInRlZ3JhLWkyYy4xIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoIm52aWRpYSx0ZWdyYTIwLWkyYyIsIFRFR1JBX0kyQzNfQkFTRSwgInRlZ3JhLWkyYy4yIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoIm52aWRpYSx0ZWdyYTIwLWkyYyIsIFRFR1JBX0RWQ19CQVNFLCAidGVncmEtaTJjLjMiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgibnZpZGlhLHRlZ3JhMjAtaTJzIiwgVEVHUkFfSTJTMV9CQVNFLCAidGVncmEtaTJzLjAiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgibnZpZGlhLHRlZ3JhMjAtaTJzIiwgVEVHUkFfSTJTMV9CQVNFLCAidGVncmEtaTJzLjEiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgibnZpZGlhLHRlZ3JhMjAtZGFzIiwgVEVHUkFfQVBCX01JU0NfREFTX0JBU0UsICJ0ZWdyYS1kYXMiLCBOVUxMKSwKKwl7fQorfTsKKworc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IHRlZ3JhX2Nsa19pbml0X3RhYmxlIHRlZ3JhX2R0X2Nsa19pbml0X3RhYmxlW10gPSB7CisJLyogbmFtZQkJcGFyZW50CQlyYXRlCQllbmFibGVkICovCisJeyAidWFydGQiLAkicGxsX3AiLAkyMTYwMDAwMDAsCXRydWUgfSwKKwl7IE5VTEwsCQlOVUxMLAkJMCwJCTB9LAorfTsKKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVncmFfZHRfbWF0Y2hfdGFibGVbXSBfX2luaXRkYXRhID0geworCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIsIH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHRlZ3JhX2R0X2dpY19tYXRjaFtdIF9faW5pdGRhdGEgPSB7CisJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1naWMiLCB9LAorCXt9Cit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgdGVncmFfZHRfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKworCW5vZGUgPSBvZl9maW5kX21hdGNoaW5nX25vZGVfYnlfYWRkcmVzcyhOVUxMLCB0ZWdyYV9kdF9naWNfbWF0Y2gsCisJCQkJCQlURUdSQV9BUk1fSU5UX0RJU1RfQkFTRSk7CisJaWYgKG5vZGUpCisJCWlycV9kb21haW5fYWRkX3NpbXBsZShub2RlLCBJTlRfR0lDX0JBU0UpOworCisJdGVncmFfY2xrX2luaXRfZnJvbV90YWJsZSh0ZWdyYV9kdF9jbGtfaW5pdF90YWJsZSk7CisKKwlpZiAob2ZfbWFjaGluZV9pc19jb21wYXRpYmxlKCJudmlkaWEsaGFybW9ueSIpKQorCQloYXJtb255X3Bpbm11eF9pbml0KCk7CisJZWxzZSBpZiAob2ZfbWFjaGluZV9pc19jb21wYXRpYmxlKCJudmlkaWEsc2VhYm9hcmQiKSkKKwkJc2VhYm9hcmRfcGlubXV4X2luaXQoKTsKKworCS8qCisJICogRmluaXNoZWQgd2l0aCB0aGUgc3RhdGljIHJlZ2lzdHJhdGlvbnMgbm93OyBmaWxsIGluIHRoZSBtaXNzaW5nCisJICogZGV2aWNlcworCSAqLworCW9mX3BsYXRmb3JtX3BvcHVsYXRlKE5VTEwsIHRlZ3JhX2R0X21hdGNoX3RhYmxlLCB0ZWdyYTIwX2F1eGRhdGFfbG9va3VwLCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiB0ZWdyYV9kdF9ib2FyZF9jb21wYXRbXSA9IHsKKwkibnZpZGlhLGhhcm1vbnkiLAorCSJudmlkaWEsc2VhYm9hcmQiLAorCU5VTEwKK307CisKK0RUX01BQ0hJTkVfU1RBUlQoVEVHUkFfRFQsICJuVmlkaWEgVGVncmEgKEZsYXR0ZW5lZCBEZXZpY2UgVHJlZSkiKQorCS5tYXBfaW8JCT0gdGVncmFfbWFwX2NvbW1vbl9pbywKKwkuaW5pdF9lYXJseQk9IHRlZ3JhX2luaXRfZWFybHksCisJLmluaXRfaXJxCT0gdGVncmFfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZ0ZWdyYV90aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gdGVncmFfZHRfaW5pdCwKKwkuZHRfY29tcGF0CT0gdGVncmFfZHRfYm9hcmRfY29tcGF0LAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvcGNpZS5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9wY2llLmMKaW5kZXggMDMxY2QwYS4uZjFmNjk5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9wY2llLmMKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9wY2llLmMKQEAgLTQ0OSw3ICs0NDksNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IHRlZ3JhX3BjaWVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IHRlZ3JhX3BjaWVfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJcmV0dXJuIElOVF9QQ0lFX0lOVFI7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvS2NvbmZpZwppbmRleCA5Y2RlYzVhLi5jMWYzOGY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL0tjb25maWcKQEAgLTE3LDQgKzE3LDEyIEBACiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBBUk0oUikgVmVyc2F0aWxlIEFwcGxpY2F0aW9uIEJhc2Vib2FyZAogCSAgZm9yIHRoZSBBUk05MjZFSi1TLgogCitjb25maWcgTUFDSF9WRVJTQVRJTEVfRFQKKwlib29sICJTdXBwb3J0IFZlcnNhdGlsZSBwbGF0Zm9ybSBmcm9tIGRldmljZSB0cmVlIgorCXNlbGVjdCBVU0VfT0YKKwlzZWxlY3QgQ1BVX0FSTTkyNlQKKwloZWxwCisJICBJbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBBUk0oUikgVmVyc2F0aWxlL1BCIHBsYXRmb3JtLAorCSAgdXNpbmcgdGhlIGRldmljZSB0cmVlIGZvciBkaXNjb3ZlcnkKKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9NYWtlZmlsZQppbmRleCA5N2NmNGQ4Li44MWZhM2ZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9NYWtlZmlsZQpAQCAtNSw0ICs1LDUgQEAKIG9iai15CQkJCQk6PSBjb3JlLm8KIG9iai0kKENPTkZJR19BUkNIX1ZFUlNBVElMRV9QQikJCSs9IHZlcnNhdGlsZV9wYi5vCiBvYmotJChDT05GSUdfTUFDSF9WRVJTQVRJTEVfQUIpCQkrPSB2ZXJzYXRpbGVfYWIubworb2JqLSQoQ09ORklHX01BQ0hfVkVSU0FUSUxFX0RUKQkJKz0gdmVyc2F0aWxlX2R0Lm8KIG9iai0kKENPTkZJR19QQ0kpCQkJKz0gcGNpLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYwppbmRleCAwYzk5Y2YwLi5lMzQwYTU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5jCkBAIC0yNCw2ICsyNCw5IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL2NsY2QuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL3BsMDYxLmg+CkBAIC04MywxMyArODYsMjYgQEAKICNkZWZpbmUgUElDX01BU0sJMAogI2VuZGlmCiAKKy8qIExvb2t1cCB0YWJsZSBmb3IgZmluZGluZyBhIERUIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSB2aWMgaW5zdGFuY2UgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHZpY19vZl9tYXRjaFtdIF9faW5pdGNvbnN0ID0geworCXsgLmNvbXBhdGlibGUgPSAiYXJtLHZlcnNhdGlsZS12aWMiLCB9LAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzaWNfb2ZfbWF0Y2hbXSBfX2luaXRjb25zdCA9IHsKKwl7IC5jb21wYXRpYmxlID0gImFybSx2ZXJzYXRpbGUtc2ljIiwgfSwKKwl7fQorfTsKKwogdm9pZCBfX2luaXQgdmVyc2F0aWxlX2luaXRfaXJxKHZvaWQpCiB7CiAJdmljX2luaXQoVkFfVklDX0JBU0UsIElSUV9WSUNfU1RBUlQsIH4wLCAwKTsKKwlpcnFfZG9tYWluX2dlbmVyYXRlX3NpbXBsZSh2aWNfb2ZfbWF0Y2gsIFZFUlNBVElMRV9WSUNfQkFTRSwgSVJRX1ZJQ19TVEFSVCk7CiAKIAl3cml0ZWwofjAsIFZBX1NJQ19CQVNFICsgU0lDX0lSUV9FTkFCTEVfQ0xFQVIpOwogCiAJZnBnYV9pcnFfaW5pdChJUlFfVklDU09VUkNFMzEsIH5QSUNfTUFTSywgJnNpY19pcnEpOworCWlycV9kb21haW5fZ2VuZXJhdGVfc2ltcGxlKHNpY19vZl9tYXRjaCwgVkVSU0FUSUxFX1NJQ19CQVNFLCBJUlFfU0lDX1NUQVJUKTsKIAogCS8qCiAJICogSW50ZXJydXB0cyBvbiBzZWNvbmRhcnkgY29udHJvbGxlciBmcm9tIDAgdG8gOCBhcmUgcm91dGVkIHRvCkBAIC02NDYsNiArNjYyLDUyIEBACiAJJmttaTFfZGV2aWNlLAogfTsKIAorI2lmZGVmIENPTkZJR19PRgorLyoKKyAqIExvb2t1cCB0YWJsZSBmb3IgYXR0YWNoaW5nIGEgc3BlY2lmaWMgbmFtZSBhbmQgcGxhdGZvcm1fZGF0YSBwb2ludGVyIHRvCisgKiBkZXZpY2VzIGFzIHRoZXkgZ2V0IGNyZWF0ZWQgYnkgb2ZfcGxhdGZvcm1fcG9wdWxhdGUoKS4gIElkZWFsbHkgdGhpcyB0YWJsZQorICogd291bGQgbm90IGV4aXN0LCBidXQgdGhlIGN1cnJlbnQgY2xvY2sgaW1wbGVtZW50YXRpb24gZGVwZW5kcyBvbiBzb21lIGRldmljZXMKKyAqIGhhdmluZyBhIHNwZWNpZmljIG5hbWUuCisgKi8KK3N0cnVjdCBvZl9kZXZfYXV4ZGF0YSB2ZXJzYXRpbGVfYXV4ZGF0YV9sb29rdXBbXSBfX2luaXRkYXRhID0geworCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX01NQ0kwX0JBU0UsICJmcGdhOjA1IiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfS01JMF9CQVNFLCAiZnBnYTowNiIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX0tNSTFfQkFTRSwgImZwZ2E6MDciLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9VQVJUM19CQVNFLCAiZnBnYTowOSIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX01NQ0kxX0JBU0UsICJmcGdhOjBiIiwgTlVMTCksCisKKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9DTENEX0JBU0UsICJkZXY6MjAiLCAmY2xjZF9wbGF0X2RhdGEpLAorCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX1VBUlQwX0JBU0UsICJkZXY6ZjEiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9VQVJUMV9CQVNFLCAiZGV2OmYyIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfVUFSVDJfQkFTRSwgImRldjpmMyIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX1NTUF9CQVNFLCAiZGV2OmY0IiwgTlVMTCksCisKKyNpZiAwCisJLyoKKwkgKiBUaGVzZSBlbnRyaWVzIGFyZSB1bm5lY2Vzc2FyeSBiZWNhdXNlIG5vIGNsb2NrcyByZWZlcmVuY2luZworCSAqIHRoZW0uICBJJ3ZlIGxlZnQgdGhlbSBpbiBmb3Igbm93IGFzIHBsYWNlIGhvbGRlcnMgaW4gY2FzZQorCSAqIGFueSBvZiB0aGVtIG5lZWQgdG8gYmUgYWRkZWQgYmFjaywgYnV0IHRoZXkgc2hvdWxkIGJlCisJICogcmVtb3ZlZCBiZWZvcmUgYWN0dWFsbHkgY29tbWl0dGluZyB0aGlzIHBhdGNoLiAgLS1nY2wKKwkgKi8KKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9BQUNJX0JBU0UsICJmcGdhOjA0IiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfU0NJMV9CQVNFLCAiZnBnYTowYSIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX1NNQ19CQVNFLCAiZGV2OjAwIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfTVBNQ19CQVNFLCAiZGV2OjEwIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfRE1BQ19CQVNFLCAiZGV2OjMwIiwgTlVMTCksCisKKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9TQ1RMX0JBU0UsICJkZXY6ZTAiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9XQVRDSERPR19CQVNFLCAiZGV2OmUxIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfR1BJTzBfQkFTRSwgImRldjplNCIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX0dQSU8xX0JBU0UsICJkZXY6ZTUiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9HUElPMl9CQVNFLCAiZGV2OmU2IiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfR1BJTzNfQkFTRSwgImRldjplNyIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX1JUQ19CQVNFLCAiZGV2OmU4IiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfU0NJX0JBU0UsICJkZXY6ZjAiLCBOVUxMKSwKKyNlbmRpZgorCXt9Cit9OworI2VuZGlmCisKICNpZmRlZiBDT05GSUdfTEVEUwogI2RlZmluZSBWQV9MRURTX0JBU0UgKF9faW9fYWRkcmVzcyhWRVJTQVRJTEVfU1lTX0JBU0UpICsgVkVSU0FUSUxFX1NZU19MRURfT0ZGU0VUKQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmggYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmgKaW5kZXggZmQ2NDA0ZS4uZTAxNDIyNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuaApAQCAtMjMsNiArMjMsNyBAQAogI2RlZmluZSBfX0FTTV9BUkNIX1ZFUlNBVElMRV9ICiAKICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAKIGV4dGVybiB2b2lkIF9faW5pdCB2ZXJzYXRpbGVfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIF9faW5pdCB2ZXJzYXRpbGVfaW5pdF9lYXJseSh2b2lkKTsKQEAgLTMwLDYgKzMxLDkgQEAKIGV4dGVybiB2b2lkIF9faW5pdCB2ZXJzYXRpbGVfbWFwX2lvKHZvaWQpOwogZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgdmVyc2F0aWxlX3RpbWVyOwogZXh0ZXJuIHVuc2lnbmVkIGludCBtbWNfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldik7CisjaWZkZWYgQ09ORklHX09GCitleHRlcm4gc3RydWN0IG9mX2Rldl9hdXhkYXRhIHZlcnNhdGlsZV9hdXhkYXRhX2xvb2t1cFtdOworI2VuZGlmCiAKICNkZWZpbmUgQU1CQV9ERVZJQ0UobmFtZSxidXNpZCxiYXNlLHBsYXQpCQkJXAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBuYW1lIyNfZGV2aWNlID0gewkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3BjaS5jIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvcGNpLmMKaW5kZXggNzg0OGExNy4uYzg5OGRlYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvcGNpLmMKQEAgLTMyOCw3ICszMjgsNyBAQAogLyoKICAqIG1hcCB0aGUgc3BlY2lmaWVkIGRldmljZS9zbG90L3BpbiB0byBhbiBJUlEuICAgRGlmZmVyZW50IGJhY2twbGFuZXMgbWF5IG5lZWQgdG8gbW9kaWZ5IHRoaXMuCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IHZlcnNhdGlsZV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IHZlcnNhdGlsZV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxOwogCWludCBkZXZzbG90ID0gUENJX1NMT1QoZGV2LT5kZXZmbik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS92ZXJzYXRpbGVfZHQuYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9kdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZTAzN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS92ZXJzYXRpbGVfZHQuYwpAQCAtMCwwICsxLDUxIEBACisvKgorICogVmVyc2F0aWxlIGJvYXJkIHN1cHBvcnQgdXNpbmcgdGhlIGRldmljZSB0cmVlCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBTZWNyZXQgTGFiIFRlY2hub2xvZ2llcyBMdGQuCisgKiAgQ29weXJpZ2h0IChDKSAyMDA5IEplcmVteSBLZXJyIDxqZXJlbXkua2VyckBjYW5vbmljYWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwNCBBUk0gTGltaXRlZAorICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisKKyNpbmNsdWRlICJjb3JlLmgiCisKK3N0YXRpYyB2b2lkIF9faW5pdCB2ZXJzYXRpbGVfZHRfaW5pdCh2b2lkKQoreworCW9mX3BsYXRmb3JtX3BvcHVsYXRlKE5VTEwsIG9mX2RlZmF1bHRfYnVzX21hdGNoX3RhYmxlLAorCQkJICAgICB2ZXJzYXRpbGVfYXV4ZGF0YV9sb29rdXAsIE5VTEwpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdmVyc2F0aWxlX2R0X21hdGNoW10gX19pbml0Y29uc3QgPSB7CisJImFybSx2ZXJzYXRpbGUtYWIiLAorCSJhcm0sdmVyc2F0aWxlLXBiIiwKKwlOVUxMLAorfTsKKworRFRfTUFDSElORV9TVEFSVChWRVJTQVRJTEVfUEIsICJBUk0tVmVyc2F0aWxlIChEZXZpY2UgVHJlZSBTdXBwb3J0KSIpCisJLm1hcF9pbwkJPSB2ZXJzYXRpbGVfbWFwX2lvLAorCS5pbml0X2Vhcmx5CT0gdmVyc2F0aWxlX2luaXRfZWFybHksCisJLmluaXRfaXJxCT0gdmVyc2F0aWxlX2luaXRfaXJxLAorCS50aW1lcgkJPSAmdmVyc2F0aWxlX3RpbWVyLAorCS5pbml0X21hY2hpbmUJPSB2ZXJzYXRpbGVfZHRfaW5pdCwKKwkuZHRfY29tcGF0CT0gdmVyc2F0aWxlX2R0X21hdGNoLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtenlucS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtenlucS9NYWtlZmlsZQppbmRleCBjNTUwYzY3Li4zOTcyNjhjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXp5bnEvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC16eW5xL01ha2VmaWxlCkBAIC0zLDQgKzMsNCBAQAogIwogCiAjIENvbW1vbiBzdXBwb3J0Ci1vYmoteSAJCQkJOj0gY29tbW9uLm8gdGltZXIubyBib2FyZF9kdC5vCitvYmoteQkJCQk6PSBjb21tb24ubyB0aW1lci5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXp5bnEvYm9hcmRfZHQuYyBiL2FyY2gvYXJtL21hY2gtenlucS9ib2FyZF9kdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtenlucS9ib2FyZF9kdC5jCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tZmVjLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWZlYy5jCmluZGV4IDRmYzZmZmMuLjBiYWU0NGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tZmVjLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1mZWMuYwpAQCAtMTEsNDAgKzExLDQ1IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy1jb21tb24uaD4KIAotI2RlZmluZSBpbXhfZmVjX2RhdGFfZW50cnlfc2luZ2xlKHNvYykJCQkJCVwKKyNkZWZpbmUgaW14X2ZlY19kYXRhX2VudHJ5X3NpbmdsZShzb2MsIF9kZXZpZCkJCQkJXAogCXsJCQkJCQkJCVwKKwkJLmRldmlkID0gX2RldmlkLAkJCQkJXAogCQkuaW9iYXNlID0gc29jICMjIF9GRUNfQkFTRV9BRERSLAkJCVwKIAkJLmlycSA9IHNvYyAjIyBfSU5UX0ZFQywJCQkJCVwKIAl9CiAKICNpZmRlZiBDT05GSUdfU09DX0lNWDI1CiBjb25zdCBzdHJ1Y3QgaW14X2ZlY19kYXRhIGlteDI1X2ZlY19kYXRhIF9faW5pdGNvbnN0ID0KLQlpbXhfZmVjX2RhdGFfZW50cnlfc2luZ2xlKE1YMjUpOworCWlteF9mZWNfZGF0YV9lbnRyeV9zaW5nbGUoTVgyNSwgImlteDI1LWZlYyIpOwogI2VuZGlmIC8qIGlmZGVmIENPTkZJR19TT0NfSU1YMjUgKi8KIAogI2lmZGVmIENPTkZJR19TT0NfSU1YMjcKIGNvbnN0IHN0cnVjdCBpbXhfZmVjX2RhdGEgaW14MjdfZmVjX2RhdGEgX19pbml0Y29uc3QgPQotCWlteF9mZWNfZGF0YV9lbnRyeV9zaW5nbGUoTVgyNyk7CisJaW14X2ZlY19kYXRhX2VudHJ5X3NpbmdsZShNWDI3LCAiaW14MjctZmVjIik7CiAjZW5kaWYgLyogaWZkZWYgQ09ORklHX1NPQ19JTVgyNyAqLwogCiAjaWZkZWYgQ09ORklHX1NPQ19JTVgzNQorLyogaS5teDM1IGhhcyB0aGUgaS5teDI3IHR5cGUgZmVjICovCiBjb25zdCBzdHJ1Y3QgaW14X2ZlY19kYXRhIGlteDM1X2ZlY19kYXRhIF9faW5pdGNvbnN0ID0KLQlpbXhfZmVjX2RhdGFfZW50cnlfc2luZ2xlKE1YMzUpOworCWlteF9mZWNfZGF0YV9lbnRyeV9zaW5nbGUoTVgzNSwgImlteDI3LWZlYyIpOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfU09DX0lNWDUwCisvKiBpLm14NTAgaGFzIHRoZSBpLm14MjUgdHlwZSBmZWMgKi8KIGNvbnN0IHN0cnVjdCBpbXhfZmVjX2RhdGEgaW14NTBfZmVjX2RhdGEgX19pbml0Y29uc3QgPQotCWlteF9mZWNfZGF0YV9lbnRyeV9zaW5nbGUoTVg1MCk7CisJaW14X2ZlY19kYXRhX2VudHJ5X3NpbmdsZShNWDUwLCAiaW14MjUtZmVjIik7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TT0NfSU1YNTEKKy8qIGkubXg1MSBoYXMgdGhlIGkubXgyNyB0eXBlIGZlYyAqLwogY29uc3Qgc3RydWN0IGlteF9mZWNfZGF0YSBpbXg1MV9mZWNfZGF0YSBfX2luaXRjb25zdCA9Ci0JaW14X2ZlY19kYXRhX2VudHJ5X3NpbmdsZShNWDUxKTsKKwlpbXhfZmVjX2RhdGFfZW50cnlfc2luZ2xlKE1YNTEsICJpbXgyNy1mZWMiKTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NPQ19JTVg1MworLyogaS5teDUzIGhhcyB0aGUgaS5teDI1IHR5cGUgZmVjICovCiBjb25zdCBzdHJ1Y3QgaW14X2ZlY19kYXRhIGlteDUzX2ZlY19kYXRhIF9faW5pdGNvbnN0ID0KLQlpbXhfZmVjX2RhdGFfZW50cnlfc2luZ2xlKE1YNTMpOworCWlteF9mZWNfZGF0YV9lbnRyeV9zaW5nbGUoTVg1MywgImlteDI1LWZlYyIpOwogI2VuZGlmCiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBpbXhfYWRkX2ZlYygKQEAgLTYzLDcgKzY4LDcgQEAKIAkJfSwKIAl9OwogCi0JcmV0dXJuIGlteF9hZGRfcGxhdGZvcm1fZGV2aWNlX2RtYW1hc2soImZlYyIsIDAsCisJcmV0dXJuIGlteF9hZGRfcGxhdGZvcm1fZGV2aWNlX2RtYW1hc2soZGF0YS0+ZGV2aWQsIDAsCiAJCQlyZXMsIEFSUkFZX1NJWkUocmVzKSwKIAkJCXBkYXRhLCBzaXplb2YoKnBkYXRhKSwgRE1BX0JJVF9NQVNLKDMyKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWlteC1kbWEuYyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LWRtYS5jCmluZGV4IDJiMGZkYjIuLjdmYTdlOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LWRtYS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LWRtYS5jCkBAIC0xNCw3ICsxNCw3IEBACiAJCQkiaW14LWRtYSIsIC0xLCBOVUxMLCAwLCBOVUxMLCAwKTsKIH0KIAotc3RydWN0IHBsYXRmb3JtX2RldmljZSBfX2luaXQgX19tYXliZV91bnVzZWQgKmlteF9hZGRfaW14X3NkbWEoCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIF9faW5pdCBfX21heWJlX3VudXNlZCAqaW14X2FkZF9pbXhfc2RtYShjaGFyICpuYW1lLAogCXJlc291cmNlX3NpemVfdCBpb2Jhc2UsIGludCBpcnEsIHN0cnVjdCBzZG1hX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQogewogCXN0cnVjdCByZXNvdXJjZSByZXNbXSA9IHsKQEAgLTI5LDYgKzI5LDYgQEAKIAkJfSwKIAl9OwogCi0JcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9yZXNuZGF0YSgmbXhjX2FoYl9idXMsICJpbXgtc2RtYSIsCisJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9yZXNuZGF0YSgmbXhjX2FoYl9idXMsIG5hbWUsCiAJCQktMSwgcmVzLCBBUlJBWV9TSVpFKHJlcyksIHBkYXRhLCBzaXplb2YoKnBkYXRhKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWlteC11YXJ0LmMgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWlteC11YXJ0LmMKaW5kZXggY2ZjZThjOS4uMjAyMGQ4NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtdWFydC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LXVhcnQuYwpAQCAtMTUyLDcgKzE1Miw3IEBACiAJCX0sCiAJfTsKIAotCXJldHVybiBpbXhfYWRkX3BsYXRmb3JtX2RldmljZSgiaW14LXVhcnQiLCBkYXRhLT5pZCwgcmVzLAorCXJldHVybiBpbXhfYWRkX3BsYXRmb3JtX2RldmljZSgiaW14MS11YXJ0IiwgZGF0YS0+aWQsIHJlcywKIAkJCUFSUkFZX1NJWkUocmVzKSwgcGRhdGEsIHNpemVvZigqcGRhdGEpKTsKIH0KIApAQCAtMTcyLDYgKzE3Miw3IEBACiAJCX0sCiAJfTsKIAotCXJldHVybiBpbXhfYWRkX3BsYXRmb3JtX2RldmljZSgiaW14LXVhcnQiLCBkYXRhLT5pZCwgcmVzLCBBUlJBWV9TSVpFKHJlcyksCi0JCQlwZGF0YSwgc2l6ZW9mKCpwZGF0YSkpOworCS8qIGkubXgyMSB0eXBlIHVhcnQgcnVucyBvbiBhbGwgaS5teCBleGNlcHQgaS5teDEgKi8KKwlyZXR1cm4gaW14X2FkZF9wbGF0Zm9ybV9kZXZpY2UoImlteDIxLXVhcnQiLCBkYXRhLT5pZCwKKwkJCXJlcywgQVJSQVlfU0laRShyZXMpLCBwZGF0YSwgc2l6ZW9mKCpwZGF0YSkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1zZGhjaS1lc2RoYy1pbXguYyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tc2RoY2ktZXNkaGMtaW14LmMKaW5kZXggNmIyOTQwYi4uNTk1NWY1ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1zZGhjaS1lc2RoYy1pbXguYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLXNkaGNpLWVzZGhjLWlteC5jCkBAIC0xMCwyMSArMTAsMjIgQEAKICNpbmNsdWRlIDxtYWNoL2RldmljZXMtY29tbW9uLmg+CiAjaW5jbHVkZSA8bWFjaC9lc2RoYy5oPgogCi0jZGVmaW5lIGlteF9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeV9zaW5nbGUoc29jLCBfaWQsIGh3aWQpIFwKKyNkZWZpbmUgaW14X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5X3NpbmdsZShzb2MsIF9kZXZpZCwgX2lkLCBod2lkKSBcCiAJewkJCQkJCQkJXAorCQkuZGV2aWQgPSBfZGV2aWQsCQkJCQlcCiAJCS5pZCA9IF9pZCwJCQkJCQlcCiAJCS5pb2Jhc2UgPSBzb2MgIyMgX0VTREhDICMjIGh3aWQgIyMgX0JBU0VfQUREUiwJXAogCQkuaXJxID0gc29jICMjIF9JTlRfRVNESEMgIyMgaHdpZCwJCQlcCiAJfQogCi0jZGVmaW5lIGlteF9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeShzb2MsIGlkLCBod2lkKQlcCi0JW2lkXSA9IGlteF9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeV9zaW5nbGUoc29jLCBpZCwgaHdpZCkKKyNkZWZpbmUgaW14X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KHNvYywgZGV2aWQsIGlkLCBod2lkKQlcCisJW2lkXSA9IGlteF9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeV9zaW5nbGUoc29jLCBkZXZpZCwgaWQsIGh3aWQpCiAKICNpZmRlZiBDT05GSUdfU09DX0lNWDI1CiBjb25zdCBzdHJ1Y3QgaW14X3NkaGNpX2VzZGhjX2lteF9kYXRhCiBpbXgyNV9zZGhjaV9lc2RoY19pbXhfZGF0YVtdIF9faW5pdGNvbnN0ID0gewogI2RlZmluZSBpbXgyNV9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeShfaWQsIF9od2lkKQkJCVwKLQlpbXhfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoTVgyNSwgX2lkLCBfaHdpZCkKKwlpbXhfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoTVgyNSwgInNkaGNpLWVzZGhjLWlteDI1IiwgX2lkLCBfaHdpZCkKIAlpbXgyNV9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeSgwLCAxKSwKIAlpbXgyNV9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeSgxLCAyKSwKIH07CkBAIC0zNCw3ICszNSw3IEBACiBjb25zdCBzdHJ1Y3QgaW14X3NkaGNpX2VzZGhjX2lteF9kYXRhCiBpbXgzNV9zZGhjaV9lc2RoY19pbXhfZGF0YVtdIF9faW5pdGNvbnN0ID0gewogI2RlZmluZSBpbXgzNV9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeShfaWQsIF9od2lkKQkJCVwKLQlpbXhfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoTVgzNSwgX2lkLCBfaHdpZCkKKwlpbXhfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoTVgzNSwgInNkaGNpLWVzZGhjLWlteDM1IiwgX2lkLCBfaHdpZCkKIAlpbXgzNV9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeSgwLCAxKSwKIAlpbXgzNV9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeSgxLCAyKSwKIAlpbXgzNV9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeSgyLCAzKSwKQEAgLTQ1LDcgKzQ2LDcgQEAKIGNvbnN0IHN0cnVjdCBpbXhfc2RoY2lfZXNkaGNfaW14X2RhdGEKIGlteDUxX3NkaGNpX2VzZGhjX2lteF9kYXRhW10gX19pbml0Y29uc3QgPSB7CiAjZGVmaW5lIGlteDUxX3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KF9pZCwgX2h3aWQpCQkJXAotCWlteF9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeShNWDUxLCBfaWQsIF9od2lkKQorCWlteF9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeShNWDUxLCAic2RoY2ktZXNkaGMtaW14NTEiLCBfaWQsIF9od2lkKQogCWlteDUxX3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KDAsIDEpLAogCWlteDUxX3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KDEsIDIpLAogCWlteDUxX3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KDIsIDMpLApAQCAtNTcsNyArNTgsNyBAQAogY29uc3Qgc3RydWN0IGlteF9zZGhjaV9lc2RoY19pbXhfZGF0YQogaW14NTNfc2RoY2lfZXNkaGNfaW14X2RhdGFbXSBfX2luaXRjb25zdCA9IHsKICNkZWZpbmUgaW14NTNfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoX2lkLCBfaHdpZCkJCQlcCi0JaW14X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KE1YNTMsIF9pZCwgX2h3aWQpCisJaW14X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KE1YNTMsICJzZGhjaS1lc2RoYy1pbXg1MyIsIF9pZCwgX2h3aWQpCiAJaW14NTNfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoMCwgMSksCiAJaW14NTNfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoMSwgMiksCiAJaW14NTNfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoMiwgMyksCkBAIC02NSw2ICs2NiwxMSBAQAogfTsKICNlbmRpZiAvKiBpZmRlZiBDT05GSUdfU09DX0lNWDUzICovCiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSBkZWZhdWx0X2VzZGhjX3BkYXRhIF9faW5pdGNvbnN0ID0geworCS53cF90eXBlID0gRVNESENfV1BfTk9ORSwKKwkuY2RfdHlwZSA9IEVTREhDX0NEX05PTkUsCit9OworCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgaW14X2FkZF9zZGhjaV9lc2RoY19pbXgoCiAJCWNvbnN0IHN0cnVjdCBpbXhfc2RoY2lfZXNkaGNfaW14X2RhdGEgKmRhdGEsCiAJCWNvbnN0IHN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhICpwZGF0YSkKQEAgLTgxLDYgKzg3LDEzIEBACiAJCX0sCiAJfTsKIAotCXJldHVybiBpbXhfYWRkX3BsYXRmb3JtX2RldmljZSgic2RoY2ktZXNkaGMtaW14IiwgZGF0YS0+aWQsIHJlcywKKwkvKgorCSAqIElmIG1hY2hpbmUgZG9lcyBub3QgcHJvdmlkZSBwZGF0YSwgdXNlIHRoZSBkZWZhdWx0IG9uZQorCSAqIHdoaWNoIG1lYW5zIG5vIFdQL0NEIHN1cHBvcnQKKwkgKi8KKwlpZiAoIXBkYXRhKQorCQlwZGF0YSA9ICZkZWZhdWx0X2VzZGhjX3BkYXRhOworCisJcmV0dXJuIGlteF9hZGRfcGxhdGZvcm1fZGV2aWNlKGRhdGEtPmRldmlkLCBkYXRhLT5pZCwgcmVzLAogCQkJQVJSQVlfU0laRShyZXMpLCBwZGF0YSwgc2l6ZW9mKCpwZGF0YSkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RldmljZXMtY29tbW9uLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZGV2aWNlcy1jb21tb24uaAppbmRleCBiZjkzODIwLi41MjQ1MzhhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZGV2aWNlcy1jb21tb24uaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZGV2aWNlcy1jb21tb24uaApAQCAtMzAsNiArMzAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZmVjLmg+CiBzdHJ1Y3QgaW14X2ZlY19kYXRhIHsKKwljb25zdCBjaGFyICpkZXZpZDsKIAlyZXNvdXJjZV9zaXplX3QgaW9iYXNlOwogCXJlc291cmNlX3NpemVfdCBpcnE7CiB9OwpAQCAtMjc2LDYgKzI3Nyw3IEBACiAKICNpbmNsdWRlIDxtYWNoL2VzZGhjLmg+CiBzdHJ1Y3QgaW14X3NkaGNpX2VzZGhjX2lteF9kYXRhIHsKKwljb25zdCBjaGFyICpkZXZpZDsKIAlpbnQgaWQ7CiAJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZTsKIAlyZXNvdXJjZV9zaXplX3QgaXJxOwpAQCAtMjk3LDUgKzI5OSw1IEBACiAJCWNvbnN0IHN0cnVjdCBzcGlfaW14X21hc3RlciAqcGRhdGEpOwogCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppbXhfYWRkX2lteF9kbWEodm9pZCk7Ci1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppbXhfYWRkX2lteF9zZG1hKAorc3RydWN0IHBsYXRmb3JtX2RldmljZSAqaW14X2FkZF9pbXhfc2RtYShjaGFyICpuYW1lLAogCXJlc291cmNlX3NpemVfdCBpb2Jhc2UsIGludCBpcnEsIHN0cnVjdCBzZG1hX3BsYXRmb3JtX2RhdGEgKnBkYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9kbWEuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9kbWEuaAppbmRleCBlZjc3NTE1Li4yMzNkMGE1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZG1hLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RtYS5oCkBAIC02MCw3ICs2MCw4IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGlteF9kbWFfaXNfZ2VuZXJhbF9wdXJwb3NlKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKIHsKLQlyZXR1cm4gIXN0cmNtcChkZXZfbmFtZShjaGFuLT5kZXZpY2UtPmRldiksICJpbXgtc2RtYSIpIHx8CisJcmV0dXJuICFzdHJjbXAoZGV2X25hbWUoY2hhbi0+ZGV2aWNlLT5kZXYpLCAiaW14MzEtc2RtYSIpIHx8CisJCSFzdHJjbXAoZGV2X25hbWUoY2hhbi0+ZGV2aWNlLT5kZXYpLCAiaW14MzUtc2RtYSIpIHx8CiAJCSFzdHJjbXAoZGV2X25hbWUoY2hhbi0+ZGV2aWNlLT5kZXYpLCAiaW14LWRtYSIpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZXNkaGMuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9lc2RoYy5oCmluZGV4IDg2MDAzZjQuLmFhZjk3NDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9lc2RoYy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9lc2RoYy5oCkBAIC0xMCwxNyArMTAsMzQgQEAKICNpZm5kZWYgX19BU01fQVJDSF9JTVhfRVNESENfSAogI2RlZmluZSBfX0FTTV9BUkNIX0lNWF9FU0RIQ19ICiAKK2VudW0gd3BfdHlwZXMgeworCUVTREhDX1dQX05PTkUsCQkvKiBubyBXUCwgbmVpdGhlciBjb250cm9sbGVyIG5vciBncGlvICovCisJRVNESENfV1BfQ09OVFJPTExFUiwJLyogbW1jIGNvbnRyb2xsZXIgaW50ZXJuYWwgV1AgKi8KKwlFU0RIQ19XUF9HUElPLAkJLyogZXh0ZXJuYWwgZ3BpbyBwaW4gZm9yIFdQICovCit9OworCitlbnVtIGNkX3R5cGVzIHsKKwlFU0RIQ19DRF9OT05FLAkJLyogbm8gQ0QsIG5laXRoZXIgY29udHJvbGxlciBub3IgZ3BpbyAqLworCUVTREhDX0NEX0NPTlRST0xMRVIsCS8qIG1tYyBjb250cm9sbGVyIGludGVybmFsIENEICovCisJRVNESENfQ0RfR1BJTywJCS8qIGV4dGVybmFsIGdwaW8gcGluIGZvciBDRCAqLworCUVTREhDX0NEX1BFUk1BTkVOVCwJLyogbm8gQ0QsIGNhcmQgcGVybWFuZW50bHkgd2lyZWQgdG8gaG9zdCAqLworfTsKKwogLyoqCi0gKiBzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSAtIG9wdGlvbmFsIHBsYXRmb3JtIGRhdGEgZm9yIGVzZGhjIG9uIGkuTVgKKyAqIHN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhIC0gcGxhdGZvcm0gZGF0YSBmb3IgZXNkaGMgb24gaS5NWAogICoKLSAqIHN0cm9uZ2x5IHJlY29tbWVuZGVkIGZvciBpLk1YMjUvMzUsIG5vdCBuZWVkZWQgZm9yIG90aGVyIHZhcmlhbnRzCisgKiBFU0RIQ19XUChDRClfQ09OVFJPTExFUiB0eXBlIGlzIG5vdCBhdmFpbGFibGUgb24gaS5NWDI1LzM1LgogICoKLSAqIEB3cF9ncGlvOglncGlvIGZvciB3cml0ZV9wcm90ZWN0ICgtRUlOVkFMIGlmIHVudXNlZCkKLSAqIEBjZF9ncGlvOglncGlvIGZvciBjYXJkX2RldGVjdCBpbnRlcnJ1cHQgKC1FSU5WQUwgaWYgdW51c2VkKQorICogQHdwX2dwaW86CWdwaW8gZm9yIHdyaXRlX3Byb3RlY3QKKyAqIEBjZF9ncGlvOglncGlvIGZvciBjYXJkX2RldGVjdCBpbnRlcnJ1cHQKKyAqIEB3cF90eXBlOgl0eXBlIG9mIHdyaXRlX3Byb3RlY3QgbWV0aG9kIChzZWUgd3BfdHlwZXMgZW51bSBhYm92ZSkKKyAqIEBjZF90eXBlOgl0eXBlIG9mIGNhcmRfZGV0ZWN0IG1ldGhvZCAoc2VlIGNkX3R5cGVzIGVudW0gYWJvdmUpCiAgKi8KIAogc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgewogCXVuc2lnbmVkIGludCB3cF9ncGlvOwogCXVuc2lnbmVkIGludCBjZF9ncGlvOworCWVudW0gd3BfdHlwZXMgd3BfdHlwZTsKKwllbnVtIGNkX3R5cGVzIGNkX3R5cGU7CiB9OwogI2VuZGlmIC8qIF9fQVNNX0FSQ0hfSU1YX0VTREhDX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9zZG1hLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvc2RtYS5oCmluZGV4IGY0OTVjODcuLjNhMzk0MjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9zZG1hLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL3NkbWEuaApAQCAtNDgsMTIgKzQ4LDEwIEBACiAvKioKICAqIHN0cnVjdCBzZG1hX3BsYXRmb3JtX2RhdGEgLSBwbGF0Zm9ybSBzcGVjaWZpYyBkYXRhIGZvciBTRE1BIGVuZ2luZQogICoKLSAqIEBzZG1hX3ZlcnNpb24JVGhlIHZlcnNpb24gb2YgdGhpcyBTRE1BIGVuZ2luZQogICogQGZ3X25hbWUJCVRoZSBmaXJtd2FyZSBuYW1lCiAgKiBAc2NyaXB0X2FkZHJzCVNETUEgc2NyaXB0cyBhZGRyZXNzZXMgaW4gU0RNQSBST00KICAqLwogc3RydWN0IHNkbWFfcGxhdGZvcm1fZGF0YSB7Ci0JaW50IHNkbWFfdmVyc2lvbjsKIAljaGFyICpmd19uYW1lOwogCXN0cnVjdCBzZG1hX3NjcmlwdF9zdGFydF9hZGRycyAqc2NyaXB0X2FkZHJzOwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvS2NvbmZpZyBiL2FyY2gvYXZyMzIvS2NvbmZpZwppbmRleCBlOWQ2ODliLi4xOTdlOTZmIDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL0tjb25maWcKKysrIGIvYXJjaC9hdnIzMi9LY29uZmlnCkBAIC0xMCw2ICsxMCw3IEBACiAJc2VsZWN0IEdFTkVSSUNfSVJRX1BST0JFCiAJc2VsZWN0IEhBUkRJUlFTX1NXX1JFU0VORAogCXNlbGVjdCBHRU5FUklDX0lSUV9TSE9XCisJc2VsZWN0IEFSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHCiAJaGVscAogCSAgQVZSMzIgaXMgYSBoaWdoLXBlcmZvcm1hbmNlIDMyLWJpdCBSSVNDIG1pY3JvcHJvY2Vzc29yIGNvcmUsCiAJICBkZXNpZ25lZCBmb3IgY29zdC1zZW5zaXRpdmUgZW1iZWRkZWQgYXBwbGljYXRpb25zLCB3aXRoIHBhcnRpY3VsYXIKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL3N5bmNfc2VyaWFsLmMgYi9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9zeW5jX3NlcmlhbC5jCmluZGV4IDg1MDI2NTM3Li40NjZhZjQwIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9zeW5jX3NlcmlhbC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL3N5bmNfc2VyaWFsLmMKQEAgLTE1OCw3ICsxNTgsNyBAQAogc3RhdGljIGludCBzeW5jX3NlcmlhbF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3luY19zZXJpYWxfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwgcG9sbF90YWJsZSAqd2FpdCk7CiAKLXN0YXRpYyBpbnQgc3luY19zZXJpYWxfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCitzdGF0aWMgbG9uZyBzeW5jX3NlcmlhbF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKIAl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBzdGF0aWMgc3NpemVfdCBzeW5jX3NlcmlhbF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLAogCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKQEAgLTYyNSwxMSArNjI1LDExIEBACiAJCQkqUl9JUlFfTUFTSzFfU0VUID0gMSA8PCBwb3J0LT5kYXRhX2F2YWlsX2JpdDsKIAkJREVCVUcocHJpbnRrKEtFUk5fREVCVUcgInNzZXIlZCByZWMgc3RhcnRlZFxuIiwgZGV2KSk7CiAJfQotCXJldCA9IDA7CisJZXJyID0gMDsKIAkKIG91dDoKIAltdXRleF91bmxvY2soJnN5bmNfc2VyaWFsX211dGV4KTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgc3luY19zZXJpYWxfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvaXJxLmMgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2lycS5jCmluZGV4IDkwN2NmYjUuLmJhMGU1OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9pcnEuYwpAQCAtMjAsNiArMjAsOSBAQAogI2RlZmluZSBjcmlzdjEwX21hc2tfaXJxKGlycV9ucikgKCpSX1ZFQ1RfTUFTS19DTFIgPSAxIDw8IChpcnFfbnIpKTsKICNkZWZpbmUgY3Jpc3YxMF91bm1hc2tfaXJxKGlycV9ucikgKCpSX1ZFQ1RfTUFTS19TRVQgPSAxIDw8IChpcnFfbnIpKTsKIAorZXh0ZXJuIHZvaWQga2dkYl9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgYnJlYWtwb2ludCh2b2lkKTsKKwogLyogZG9uJ3QgdXNlIHNldF9pbnRfdmVjdG9yLCBpdCBieXBhc3NlcyB0aGUgbGludXggaW50ZXJydXB0IGhhbmRsZXJzLiBpdCBpcwogICogZ2xvYmFsIGp1c3Qgc28gdGhhdCB0aGUga2VybmVsIGdkYiBjYW4gdXNlIGl0LgogICovCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IDI5Yjc0YTEuLjMzMmYxOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0xMSw4ICsxMSw2IEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNkZWZpbmUgX19IQVZFX0FSQ0hfVEhSRUFEX0lORk9fQUxMT0NBVE9SCi0KICNpZm5kZWYgX19BU1NFTUJMWV9fCiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgpAQCAtNjcsOCArNjUsMTAgQEAKIAogI2RlZmluZSBpbml0X3RocmVhZF9pbmZvCShpbml0X3RocmVhZF91bmlvbi50aHJlYWRfaW5mbykKIAorI2RlZmluZSBfX0hBVkVfQVJDSF9USFJFQURfSU5GT19BTExPQ0FUT1IKIC8qIHRocmVhZCBpbmZvcm1hdGlvbiBhbGxvY2F0aW9uICovCi0jZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvKHRzaywgbm9kZSkgKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLDEpKQorI2RlZmluZSBhbGxvY190aHJlYWRfaW5mb19ub2RlKHRzaywgbm9kZSkJXAorCSgoc3RydWN0IHRocmVhZF9pbmZvICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgMSkpCiAjZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8odGkpIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpICh0aSksIDEpCiAKICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9LY29uZmlnIGIvYXJjaC9mcnYvS2NvbmZpZwppbmRleCBjYjg4NGU0Li5iYWQyN2E2IDEwMDY0NAotLS0gYS9hcmNoL2Zydi9LY29uZmlnCisrKyBiL2FyY2gvZnJ2L0tjb25maWcKQEAgLTcsNiArNyw3IEBACiAJc2VsZWN0IEhBVkVfUEVSRl9FVkVOVFMKIAlzZWxlY3QgSEFWRV9HRU5FUklDX0hBUkRJUlFTCiAJc2VsZWN0IEdFTkVSSUNfSVJRX1NIT1cKKwlzZWxlY3QgQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKIAogY29uZmlnIFpPTkVfRE1BCiAJYm9vbApkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvbW0vcGdhbGxvYy5jIGIvYXJjaC9mcnYvbW0vcGdhbGxvYy5jCmluZGV4IGM0MmM4M2QuLjRmYjYzYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L21tL3BnYWxsb2MuYworKysgYi9hcmNoL2Zydi9tbS9wZ2FsbG9jLmMKQEAgLTEzMywxMyArMTMzLDcgQEAKIAogcGdkX3QgKnBnZF9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKLQlwZ2RfdCAqcGdkOwotCi0JcGdkID0gcXVpY2tsaXN0X2FsbG9jKDAsIEdGUF9LRVJORUwsIHBnZF9jdG9yKTsKLQlpZiAoIXBnZCkKLQkJcmV0dXJuIHBnZDsKLQotCXJldHVybiBwZ2Q7CisJcmV0dXJuIHF1aWNrbGlzdF9hbGxvYygwLCBHRlBfS0VSTkVMLCBwZ2RfY3Rvcik7CiB9CiAKIHZvaWQgcGdkX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2QpCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvS2NvbmZpZyBiL2FyY2gvaWE2NC9LY29uZmlnCmluZGV4IDEzN2IyNzcuLjEyNDg1NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9LY29uZmlnCisrKyBiL2FyY2gvaWE2NC9LY29uZmlnCkBAIC0yNyw2ICsyNyw4IEBACiAJc2VsZWN0IEdFTkVSSUNfUEVORElOR19JUlEgaWYgU01QCiAJc2VsZWN0IElSUV9QRVJfQ1BVCiAJc2VsZWN0IEdFTkVSSUNfSVJRX1NIT1cKKwlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKKwlzZWxlY3QgQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBUaGUgSXRhbml1bSBQcm9jZXNzb3IgRmFtaWx5IGlzIEludGVsJ3MgNjQtYml0IHN1Y2Nlc3NvciB0bwpAQCAtODksNiArOTEsOSBAQAogY29uZmlnIEhBVkVfU0VUVVBfUEVSX0NQVV9BUkVBCiAJZGVmX2Jvb2wgeQogCitjb25maWcgR0VORVJJQ19HUElPCisJZGVmX2Jvb2wgeQorCiBjb25maWcgRE1JCiAJYm9vbAogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2dwaW8uaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkwYTIwZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9ncGlvLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIEdlbmVyaWMgR1BJTyBBUEkgaW1wbGVtZW50YXRpb24gZm9yIElBLTY0LgorICoKKyAqIEEgc3RyaWdodCBjb3B5IG9mIHRoYXQgZm9yIFBvd2VyUEMgd2hpY2ggd2FzOgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA4ICBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogQXV0aG9yOiBBbnRvbiBWb3JvbnRzb3YgPGF2b3JvbnRzb3ZAcnUubXZpc3RhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0FTTV9JQTY0X0dQSU9fSAorI2RlZmluZSBfQVNNX0lBNjRfR1BJT19ICisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL2dwaW8uaD4KKworI2lmZGVmIENPTkZJR19HUElPTElCCisKKy8qCisgKiBXZSBkb24ndCAoeWV0KSBpbXBsZW1lbnQgaW5saW5lZC9yYXBpZCB2ZXJzaW9ucyBmb3Igb24tY2hpcCBncGlvcy4KKyAqIEp1c3QgY2FsbCBncGlvbGliLgorICovCitzdGF0aWMgaW5saW5lIGludCBncGlvX2dldF92YWx1ZSh1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlyZXR1cm4gX19ncGlvX2dldF92YWx1ZShncGlvKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdwaW9fc2V0X3ZhbHVlKHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsdWUpCit7CisJX19ncGlvX3NldF92YWx1ZShncGlvLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fY2Fuc2xlZXAodW5zaWduZWQgaW50IGdwaW8pCit7CisJcmV0dXJuIF9fZ3Bpb19jYW5zbGVlcChncGlvKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ3Bpb190b19pcnEodW5zaWduZWQgaW50IGdwaW8pCit7CisJcmV0dXJuIF9fZ3Bpb190b19pcnEoZ3Bpbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlycV90b19ncGlvKHVuc2lnbmVkIGludCBpcnEpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfR1BJT0xJQiAqLworCisjZW5kaWYgLyogX0FTTV9JQTY0X0dQSU9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9lZmkuYyBiL2FyY2gvaWE2NC9rZXJuZWwvZWZpLmMKaW5kZXggNmZjMDNhZi4uYzM4ZDIyZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9lZmkuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2VmaS5jCkBAIC0xNTYsNyArMTU2LDcgQEAKICNkZWZpbmUgU1RVQl9TRVRfVkFSSUFCTEUocHJlZml4LCBhZGp1c3RfYXJnKQkJCQkgICAgICAgXAogc3RhdGljIGVmaV9zdGF0dXNfdAkJCQkJCQkgICAgICAgXAogcHJlZml4IyNfc2V0X3ZhcmlhYmxlIChlZmlfY2hhcjE2X3QgKm5hbWUsIGVmaV9ndWlkX3QgKnZlbmRvciwJCSAgICAgICBcCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIGF0dHIsIHVuc2lnbmVkIGxvbmcgZGF0YV9zaXplLAkgICAgICAgXAorCQkgICAgICAgdTMyIGF0dHIsIHVuc2lnbmVkIGxvbmcgZGF0YV9zaXplLAkJICAgICAgIFwKIAkJICAgICAgIHZvaWQgKmRhdGEpCQkJCQkgICAgICAgXAogewkJCQkJCQkJCSAgICAgICBcCiAJc3RydWN0IGlhNjRfZnByZWcgZnJbNl07CQkJCQkgICAgICAgXApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL0tjb25maWcgYi9hcmNoL202OGsvS2NvbmZpZwppbmRleCAyODRjZDM3Li45ZThlZTlkIDEwMDY0NAotLS0gYS9hcmNoL202OGsvS2NvbmZpZworKysgYi9hcmNoL202OGsvS2NvbmZpZwpAQCAtNiw2ICs2LDcgQEAKIAlzZWxlY3QgR0VORVJJQ19BVE9NSUM2NCBpZiBNTVUKIAlzZWxlY3QgSEFWRV9HRU5FUklDX0hBUkRJUlFTIGlmICFNTVUKIAlzZWxlY3QgR0VORVJJQ19JUlFfU0hPVyBpZiAhTU1VCisJc2VsZWN0IEFSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHIGlmIFJNV19JTlNOUwogCiBjb25maWcgUldTRU1fR0VORVJJQ19TUElOTE9DSwogCWJvb2wKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9LY29uZmlnLm1tdSBiL2FyY2gvbTY4ay9LY29uZmlnLm1tdQppbmRleCAxNjUzOWIxLi4xM2UyMGJiIDEwMDY0NAotLS0gYS9hcmNoL202OGsvS2NvbmZpZy5tbXUKKysrIGIvYXJjaC9tNjhrL0tjb25maWcubW11CkBAIC0zNzIsMTIgKzM3Miw2IEBACiAJICBJbmNsdWRlIHN1cHBvcnQgaW4gdGhlIGtlcm5lbCBmb3IgcGNtY2lhIG9uIEFtaWdhIDEyMDAgYW5kIEFtaWdhCiAJICA2MDAuIElmIHlvdSBpbnRlbmQgdG8gdXNlIHBjbWNpYSBjYXJkcyBzYXkgWTsgb3RoZXJ3aXNlIHNheSBOLgogCi1jb25maWcgU1RSQU1fUFJPQwotCWJvb2wgIlNULVJBTSBzdGF0aXN0aWNzIGluIC9wcm9jIgotCWRlcGVuZHMgb24gQVRBUkkKLQloZWxwCi0JICBTYXkgWSBoZXJlIHRvIHJlcG9ydCBTVC1SQU0gdXNhZ2Ugc3RhdGlzdGljcyBpbiAvcHJvYy9zdHJhbS4KLQogY29uZmlnIEhFQVJUQkVBVAogCWJvb2wgIlVzZSBwb3dlciBMRUQgYXMgYSBoZWFydGJlYXQiIGlmIEFNSUdBIHx8IEFQT0xMTyB8fCBBVEFSSSB8fCBNQUMgfHxRNDAKIAlkZWZhdWx0IHkgaWYgIUFNSUdBICYmICFBUE9MTE8gJiYgIUFUQVJJICYmICFNQUMgJiYgIVE0MCAmJiBIUDMwMApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2FtaWdhL2NoaXByYW0uYyBiL2FyY2gvbTY4ay9hbWlnYS9jaGlwcmFtLmMKaW5kZXggZGQwNDQ3ZC4uOTk0NDlmYiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2FtaWdhL2NoaXByYW0uYworKysgYi9hcmNoL202OGsvYW1pZ2EvY2hpcHJhbS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgogCkBAIC0yMywxMTEgKzI0LDEwMCBAQAogRVhQT1JUX1NZTUJPTChhbWlnYV9jaGlwX3NpemUpOwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGNoaXByYW1fcmVzID0gewotICAgIC5uYW1lID0gIkNoaXAgUkFNIiwgLnN0YXJ0ID0gQ0hJUF9QSFlTQUREUgorCS5uYW1lID0gIkNoaXAgUkFNIiwgLnN0YXJ0ID0gQ0hJUF9QSFlTQUREUgogfTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNoaXBhdmFpbDsKK3N0YXRpYyBhdG9taWNfdCBjaGlwYXZhaWw7CiAKIAogdm9pZCBfX2luaXQgYW1pZ2FfY2hpcF9pbml0KHZvaWQpCiB7Ci0gICAgaWYgKCFBTUlHQUhXX1BSRVNFTlQoQ0hJUF9SQU0pKQotCXJldHVybjsKKwlpZiAoIUFNSUdBSFdfUFJFU0VOVChDSElQX1JBTSkpCisJCXJldHVybjsKIAotICAgIGNoaXByYW1fcmVzLmVuZCA9IGFtaWdhX2NoaXBfc2l6ZS0xOwotICAgIHJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmY2hpcHJhbV9yZXMpOworCWNoaXByYW1fcmVzLmVuZCA9IENISVBfUEhZU0FERFIgKyBhbWlnYV9jaGlwX3NpemUgLSAxOworCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmY2hpcHJhbV9yZXMpOwogCi0gICAgY2hpcGF2YWlsID0gYW1pZ2FfY2hpcF9zaXplOworCWF0b21pY19zZXQoJmNoaXBhdmFpbCwgYW1pZ2FfY2hpcF9zaXplKTsKIH0KIAogCiB2b2lkICphbWlnYV9jaGlwX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgICBzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl2b2lkICpwOwogCi0gICAgLyogcm91bmQgdXAgKi8KLSAgICBzaXplID0gUEFHRV9BTElHTihzaXplKTsKKwlyZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIE5VTEw7CiAKLSNpZmRlZiBERUJVRwotICAgIHByaW50aygiYW1pZ2FfY2hpcF9hbGxvYzogYWxsb2NhdGUgJWxkIGJ5dGVzXG4iLCBzaXplKTsKLSNlbmRpZgotICAgIHJlcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSksIEdGUF9LRVJORUwpOwotICAgIGlmICghcmVzKQotCXJldHVybiBOVUxMOwotICAgIHJlcy0+bmFtZSA9IG5hbWU7CisJcmVzLT5uYW1lID0gbmFtZTsKKwlwID0gYW1pZ2FfY2hpcF9hbGxvY19yZXMoc2l6ZSwgcmVzKTsKKwlpZiAoIXApIHsKKwkJa2ZyZWUocmVzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCi0gICAgaWYgKGFsbG9jYXRlX3Jlc291cmNlKCZjaGlwcmFtX3JlcywgcmVzLCBzaXplLCAwLCBVSU5UX01BWCwgUEFHRV9TSVpFLCBOVUxMLCBOVUxMKSA8IDApIHsKLQlrZnJlZShyZXMpOwotCXJldHVybiBOVUxMOwotICAgIH0KLSAgICBjaGlwYXZhaWwgLT0gc2l6ZTsKLSNpZmRlZiBERUJVRwotICAgIHByaW50aygiYW1pZ2FfY2hpcF9hbGxvYzogcmV0dXJuaW5nICVseFxuIiwgcmVzLT5zdGFydCk7Ci0jZW5kaWYKLSAgICByZXR1cm4gKHZvaWQgKilaVFdPX1ZBRERSKHJlcy0+c3RhcnQpOworCXJldHVybiBwOwogfQogRVhQT1JUX1NZTUJPTChhbWlnYV9jaGlwX2FsbG9jKTsKIAogCi0gICAgLyoKLSAgICAgKiAgV2FybmluZzoKLSAgICAgKiAgYW1pZ2FfY2hpcF9hbGxvY19yZXMgaXMgbWVhbnQgb25seSBmb3IgZHJpdmVycyB0aGF0IG5lZWQgdG8gYWxsb2NhdGUKLSAgICAgKiAgQ2hpcCBSQU0gYmVmb3JlIGttYWxsb2MoKSBpcyBmdW5jdGlvbmFsLiBBcyBhIGNvbnNlcXVlbmNlLCB0aG9zZQotICAgICAqICBkcml2ZXJzIG11c3Qgbm90IGZyZWUgdGhhdCBDaGlwIFJBTSBhZnRlcndhcmRzLgotICAgICAqLworCS8qCisJICogIFdhcm5pbmc6CisJICogIGFtaWdhX2NoaXBfYWxsb2NfcmVzIGlzIG1lYW50IG9ubHkgZm9yIGRyaXZlcnMgdGhhdCBuZWVkIHRvCisJICogIGFsbG9jYXRlIENoaXAgUkFNIGJlZm9yZSBrbWFsbG9jKCkgaXMgZnVuY3Rpb25hbC4gQXMgYSBjb25zZXF1ZW5jZSwKKwkgKiAgdGhvc2UgZHJpdmVycyBtdXN0IG5vdCBmcmVlIHRoYXQgQ2hpcCBSQU0gYWZ0ZXJ3YXJkcy4KKwkgKi8KIAotdm9pZCAqIF9faW5pdCBhbWlnYV9jaGlwX2FsbG9jX3Jlcyh1bnNpZ25lZCBsb25nIHNpemUsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQordm9pZCAqYW1pZ2FfY2hpcF9hbGxvY19yZXModW5zaWduZWQgbG9uZyBzaXplLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKIHsKLSAgICB1bnNpZ25lZCBsb25nIHN0YXJ0OworCWludCBlcnJvcjsKIAotICAgIC8qIHJvdW5kIHVwICovCi0gICAgc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7Ci0gICAgLyogZG1lc2cgaW50byBjaGlwbWVtIHByZWZlcnMgbWVtb3J5IGF0IHRoZSBzYWZlIGVuZCAqLwotICAgIHN0YXJ0ID0gQ0hJUF9QSFlTQUREUiArIGNoaXBhdmFpbCAtIHNpemU7CisJLyogcm91bmQgdXAgKi8KKwlzaXplID0gUEFHRV9BTElHTihzaXplKTsKIAotI2lmZGVmIERFQlVHCi0gICAgcHJpbnRrKCJhbWlnYV9jaGlwX2FsbG9jX3JlczogYWxsb2NhdGUgJWxkIGJ5dGVzXG4iLCBzaXplKTsKLSNlbmRpZgotICAgIGlmIChhbGxvY2F0ZV9yZXNvdXJjZSgmY2hpcHJhbV9yZXMsIHJlcywgc2l6ZSwgc3RhcnQsIFVJTlRfTUFYLCBQQUdFX1NJWkUsIE5VTEwsIE5VTEwpIDwgMCkgewotCXByaW50aygiYW1pZ2FfY2hpcF9hbGxvY19yZXM6IGZpcnN0IGFsbG9jIGZhaWxlZCFcbiIpOwotCWlmIChhbGxvY2F0ZV9yZXNvdXJjZSgmY2hpcHJhbV9yZXMsIHJlcywgc2l6ZSwgMCwgVUlOVF9NQVgsIFBBR0VfU0laRSwgTlVMTCwgTlVMTCkgPCAwKQotCSAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgY2hpcGF2YWlsIC09IHNpemU7Ci0jaWZkZWYgREVCVUcKLSAgICBwcmludGsoImFtaWdhX2NoaXBfYWxsb2NfcmVzOiByZXR1cm5pbmcgJWx4XG4iLCByZXMtPnN0YXJ0KTsKLSNlbmRpZgotICAgIHJldHVybiAodm9pZCAqKVpUV09fVkFERFIocmVzLT5zdGFydCk7CisJcHJfZGVidWcoImFtaWdhX2NoaXBfYWxsb2NfcmVzOiBhbGxvY2F0ZSAlbHUgYnl0ZXNcbiIsIHNpemUpOworCWVycm9yID0gYWxsb2NhdGVfcmVzb3VyY2UoJmNoaXByYW1fcmVzLCByZXMsIHNpemUsIDAsIFVJTlRfTUFYLAorCQkJCSAgUEFHRV9TSVpFLCBOVUxMLCBOVUxMKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCXByX2VycigiYW1pZ2FfY2hpcF9hbGxvY19yZXM6IGFsbG9jYXRlX3Jlc291cmNlKCkgZmFpbGVkICVkIVxuIiwKKwkJICAgICAgIGVycm9yKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYXRvbWljX3N1YihzaXplLCAmY2hpcGF2YWlsKTsKKwlwcl9kZWJ1ZygiYW1pZ2FfY2hpcF9hbGxvY19yZXM6IHJldHVybmluZyAlcFJcbiIsIHJlcyk7CisJcmV0dXJuICh2b2lkICopWlRXT19WQUREUihyZXMtPnN0YXJ0KTsKIH0KIAogdm9pZCBhbWlnYV9jaGlwX2ZyZWUodm9pZCAqcHRyKQogewotICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQgPSBaVFdPX1BBRERSKHB0cik7Ci0gICAgc3RydWN0IHJlc291cmNlICoqcCwgKnJlczsKLSAgICB1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IFpUV09fUEFERFIocHRyKTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl1bnNpZ25lZCBsb25nIHNpemU7CiAKLSAgICBmb3IgKHAgPSAmY2hpcHJhbV9yZXMuY2hpbGQ7IChyZXMgPSAqcCk7IHAgPSAmcmVzLT5zaWJsaW5nKSB7Ci0JaWYgKHJlcy0+c3RhcnQgIT0gc3RhcnQpCi0JICAgIGNvbnRpbnVlOwotCSpwID0gcmVzLT5zaWJsaW5nOwotCXNpemUgPSByZXMtPmVuZC1zdGFydDsKLSNpZmRlZiBERUJVRwotCXByaW50aygiYW1pZ2FfY2hpcF9mcmVlOiBmcmVlICVsZCBieXRlcyBhdCAlcFxuIiwgc2l6ZSwgcHRyKTsKLSNlbmRpZgotCWNoaXBhdmFpbCArPSBzaXplOworCXJlcyA9IGxvb2t1cF9yZXNvdXJjZSgmY2hpcHJhbV9yZXMsIHN0YXJ0KTsKKwlpZiAoIXJlcykgeworCQlwcl9lcnIoImFtaWdhX2NoaXBfZnJlZTogdHJ5aW5nIHRvIGZyZWUgbm9uZXhpc3RlbnQgcmVnaW9uIGF0ICIKKwkJICAgICAgICIlcFxuIiwgcHRyKTsKKwkJcmV0dXJuOworCX0KKworCXNpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CisJcHJfZGVidWcoImFtaWdhX2NoaXBfZnJlZTogZnJlZSAlbHUgYnl0ZXMgYXQgJXBcbiIsIHNpemUsIHB0cik7CisJYXRvbWljX2FkZChzaXplLCAmY2hpcGF2YWlsKTsKKwlyZWxlYXNlX3Jlc291cmNlKHJlcyk7CiAJa2ZyZWUocmVzKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIHByaW50aygiYW1pZ2FfY2hpcF9mcmVlOiB0cnlpbmcgdG8gZnJlZSBub25leGlzdGVudCByZWdpb24gYXQgJXBcbiIsIHB0cik7CiB9CiBFWFBPUlRfU1lNQk9MKGFtaWdhX2NoaXBfZnJlZSk7CiAKIAogdW5zaWduZWQgbG9uZyBhbWlnYV9jaGlwX2F2YWlsKHZvaWQpCiB7Ci0jaWZkZWYgREVCVUcKLQlwcmludGsoImFtaWdhX2NoaXBfYXZhaWwgOiAlbGQgYnl0ZXNcbiIsIGNoaXBhdmFpbCk7Ci0jZW5kaWYKLQlyZXR1cm4gY2hpcGF2YWlsOworCXVuc2lnbmVkIGxvbmcgbiA9IGF0b21pY19yZWFkKCZjaGlwYXZhaWwpOworCisJcHJfZGVidWcoImFtaWdhX2NoaXBfYXZhaWwgOiAlbHUgYnl0ZXNcbiIsIG4pOworCXJldHVybiBuOwogfQogRVhQT1JUX1NZTUJPTChhbWlnYV9jaGlwX2F2YWlsKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2F0YXJpL3N0cmFtLmMgYi9hcmNoL202OGsvYXRhcmkvc3RyYW0uYwppbmRleCA2ZWMzYjdmLi4wODEwYzhkIDEwMDY0NAotLS0gYS9hcmNoL202OGsvYXRhcmkvc3RyYW0uYworKysgYi9hcmNoL202OGsvYXRhcmkvc3RyYW0uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBhcmNoL202OGsvYXRhcmkvc3RyYW0uYzogRnVuY3Rpb25zIGZvciBTVC1SQU0gYWxsb2NhdGlvbnMKKyAqIEZ1bmN0aW9ucyBmb3IgU1QtUkFNIGFsbG9jYXRpb25zCiAgKgogICogQ29weXJpZ2h0IDE5OTQtOTcgUm9tYW4gSG9kZWsgPFJvbWFuLkhvZGVrQGluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPgogICoKQEAgLTMwLDkxICszMCwzNSBAQAogI2luY2x1ZGUgPGFzbS9hdGFyaV9zdHJhbS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jdW5kZWYgREVCVUcKLQotI2lmZGVmIERFQlVHCi0jZGVmaW5lCURQUklOVEsoZm10LGFyZ3MuLi4pIHByaW50ayggZm10LCAjI2FyZ3MgKQotI2Vsc2UKLSNkZWZpbmUgRFBSSU5USyhmbXQsYXJncy4uLikKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykgJiYgZGVmaW5lZChDT05GSUdfU1RSQU1fUFJPQykKLS8qIGFiYnJldiBmb3IgdGhlICYmIGFib3ZlLi4uICovCi0jZGVmaW5lIERPX1BST0MKLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNlbmRpZgogCiAvKgotICogKytyb21hbjoKLSAqCi0gKiBOZXcgdmVyc2lvbiBvZiBTVC1SYW0gYnVmZmVyIGFsbG9jYXRpb24uIEluc3RlYWQgb2YgdXNpbmcgdGhlCi0gKiAxIE1CIC0gNCBLQiB0aGF0IHJlbWFpbiB3aGVuIHRoZSBTVC1SYW0gY2h1bmsgc3RhcnRzIGF0ICQxMDAwCi0gKiAoMSBNQiBncmFudWxhcml0eSEpLCBzdWNoIGJ1ZmZlcnMgYXJlIHJlc2VydmVkIGxpa2UgdGhpczoKLSAqCi0gKiAgLSBJZiB0aGUga2VybmVsIHJlc2lkZXMgaW4gU1QtUmFtIGFueXdheSwgd2UgY2FuIHRha2UgdGhlIGJ1ZmZlcgotICogICAgZnJvbSBiZWhpbmQgdGhlIGN1cnJlbnQga2VybmVsIGRhdGEgc3BhY2UgdGhlIG5vcm1hbCB3YXkKLSAqICAgIChpbmNyZW1lbnRpbmcgc3RhcnRfbWVtKS4KLSAqCi0gKiAgLSBJZiB0aGUga2VybmVsIGlzIGluIFRULVJhbSwgc3RyYW1faW5pdCgpIGluaXRpYWxpemVzIHN0YXJ0IGFuZAotICogICAgZW5kIG9mIHRoZSBhdmFpbGFibGUgcmVnaW9uLiBCdWZmZXJzIGFyZSBhbGxvY2F0ZWQgZnJvbSB0aGVyZQotICogICAgYW5kIG1lbV9pbml0KCkgbGF0ZXIgbWFya3MgdGhlIHN1Y2ggdXNlZCBwYWdlcyBhcyByZXNlcnZlZC4KLSAqICAgIFNpbmNlIGVhY2ggVFQtUmFtIGNodW5rIGlzIGF0IGxlYXN0IDQgTUIgaW4gc2l6ZSwgSSBob3BlIHRoZXJlCi0gKiAgICB3b24ndCBiZSBhbiBvdmVycnVuIG9mIHRoZSBTVC1SYW0gcmVnaW9uIGJ5IG5vcm1hbCBrZXJuZWwgZGF0YQotICogICAgc3BhY2UuCi0gKgotICogRm9yIHRoYXQsIFNULVJhbSBtYXkgb25seSBiZSBhbGxvY2F0ZWQgd2hpbGUga2VybmVsIGluaXRpYWxpemF0aW9uCi0gKiBpcyBnb2luZyBvbiwgb3IgZXhhY3RseTogYmVmb3JlIG1lbV9pbml0KCkgaXMgY2FsbGVkLiBUaGVyZSBpcyBhbHNvCi0gKiBubyBwcm92aXNpb24gbm93IGZvciBmcmVlaW5nIFNULVJhbSBidWZmZXJzLiBJdCBzZWVtcyB0aGF0IGlzbid0Ci0gKiByZWFsbHkgbmVlZGVkLgotICoKKyAqIFRoZSBTVC1SQU0gYWxsb2NhdG9yIGFsbG9jYXRlcyBtZW1vcnkgZnJvbSBhIHBvb2wgb2YgcmVzZXJ2ZWQgU1QtUkFNIG9mCisgKiBjb25maWd1cmFibGUgc2l6ZSwgc2V0IGFzaWRlIG9uIFNULVJBTSBpbml0LgorICogQXMgbG9uZyBhcyB0aGlzIHBvb2wgaXMgbm90IGV4aGF1c3RlZCwgYWxsb2NhdGlvbiBvZiByZWFsIFNULVJBTSBjYW4gYmUKKyAqIGd1YXJhbnRlZWQuCiAgKi8KIAotLyogU3RhcnQgYW5kIGVuZCAodmlydHVhbCkgb2YgU1QtUkFNICovCi1zdGF0aWMgdm9pZCAqc3RyYW1fc3RhcnQsICpzdHJhbV9lbmQ7Ci0KLS8qIHNldCBhZnRlciBtZW1vcnlfaW5pdCgpIGV4ZWN1dGVkIGFuZCBhbGxvY2F0aW9ucyB2aWEgc3RhcnRfbWVtIGFyZW4ndAotICogcG9zc2libGUgYW55bW9yZSAqLwotc3RhdGljIGludCBtZW1faW5pdF9kb25lOwotCiAvKiBzZXQgaWYga2VybmVsIGlzIGluIFNULVJBTSAqLwogc3RhdGljIGludCBrZXJuZWxfaW5fc3RyYW07CiAKLXR5cGVkZWYgc3RydWN0IHN0cmFtX2Jsb2NrIHsKLQlzdHJ1Y3Qgc3RyYW1fYmxvY2sgKm5leHQ7Ci0Jdm9pZCAqc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCXVuc2lnbmVkIGZsYWdzOwotCWNvbnN0IGNoYXIgKm93bmVyOwotfSBCTE9DSzsKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc3RyYW1fcG9vbCA9IHsKKwkubmFtZSA9ICJTVC1SQU0gUG9vbCIKK307CiAKLS8qIHZhbHVlcyBmb3IgZmxhZ3MgZmllbGQgKi8KLSNkZWZpbmUgQkxPQ0tfRlJFRQkweDAxCS8qIGZyZWUgc3RydWN0dXJlIGluIHRoZSBCTE9DS3MgcG9vbCAqLwotI2RlZmluZSBCTE9DS19LTUFMTE9DRUQJMHgwMgkvKiBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5IGttYWxsb2MoKSAqLwotI2RlZmluZSBCTE9DS19HRlAJMHgwOAkvKiBibG9jayBhbGxvY2F0ZWQgd2l0aCBfX2dldF9kbWFfcGFnZXMoKSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgcG9vbF9zaXplID0gMTAyNCoxMDI0OwogCi0vKiBsaXN0IG9mIGFsbG9jYXRlZCBibG9ja3MgKi8KLXN0YXRpYyBCTE9DSyAqYWxsb2NfbGlzdDsKIAotLyogV2UgY2FuJ3QgYWx3YXlzIHVzZSBrbWFsbG9jKCkgdG8gYWxsb2NhdGUgQkxPQ0sgc3RydWN0dXJlcywgc2luY2UKLSAqIHN0cmFtX2FsbG9jKCkgY2FuIGJlIGNhbGxlZCByYXRoZXIgZWFybHkuIFNvIHdlIG5lZWQgc29tZSBwb29sIG9mCi0gKiBzdGF0aWNhbGx5IGFsbG9jYXRlZCBzdHJ1Y3R1cmVzLiAyMCBvZiB0aGVtIGlzIG1vcmUgdGhhbiBlbm91Z2gsIHNvIGluIG1vc3QKLSAqIGNhc2VzIHdlIG5ldmVyIHNob3VsZCBuZWVkIHRvIGNhbGwga21hbGxvYygpLiAqLwotI2RlZmluZSBOX1NUQVRJQ19CTE9DS1MJMjAKLXN0YXRpYyBCTE9DSyBzdGF0aWNfYmxvY2tzW05fU1RBVElDX0JMT0NLU107CitzdGF0aWMgaW50IF9faW5pdCBhdGFyaV9zdHJhbV9zZXR1cChjaGFyICphcmcpCit7CisJaWYgKCFNQUNIX0lTX0FUQVJJKQorCQlyZXR1cm4gMDsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJcG9vbF9zaXplID0gbWVtcGFyc2UoYXJnLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KIAotc3RhdGljIEJMT0NLICphZGRfcmVnaW9uKCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUgKTsKLXN0YXRpYyBCTE9DSyAqZmluZF9yZWdpb24oIHZvaWQgKmFkZHIgKTsKLXN0YXRpYyBpbnQgcmVtb3ZlX3JlZ2lvbiggQkxPQ0sgKmJsb2NrICk7CitlYXJseV9wYXJhbSgic3RyYW1fcG9vbCIsIGF0YXJpX3N0cmFtX3NldHVwKTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKiogRW5kIG9mIFByb3RvdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQwKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoJCQkJCQkJICAgUHVibGljIEludGVyZmFjZQkJCQkJCQkJKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAvKgogICogVGhpcyBpbml0IGZ1bmN0aW9uIGlzIGNhbGxlZCB2ZXJ5IGVhcmx5IGJ5IGF0YXJpL2NvbmZpZy5jCkBAIC0xMjMsMjUgKzY3LDIzIEBACiB2b2lkIF9faW5pdCBhdGFyaV9zdHJhbV9pbml0KHZvaWQpCiB7CiAJaW50IGk7CisJdm9pZCAqc3RyYW1fc3RhcnQ7CiAKLQkvKiBpbml0aWFsaXplIHN0YXRpYyBibG9ja3MgKi8KLQlmb3IoIGkgPSAwOyBpIDwgTl9TVEFUSUNfQkxPQ0tTOyArK2kgKQotCQlzdGF0aWNfYmxvY2tzW2ldLmZsYWdzID0gQkxPQ0tfRlJFRTsKLQotCS8qIGRldGVybWluZSB3aGV0aGVyIGtlcm5lbCBjb2RlIHJlc2lkZXMgaW4gU1QtUkFNICh0aGVuIFNULVJBTSBpcyB0aGUKLQkgKiBmaXJzdCBtZW1vcnkgYmxvY2sgYXQgdmlydHVhbCAweDApICovCisJLyoKKwkgKiBkZXRlcm1pbmUgd2hldGhlciBrZXJuZWwgY29kZSByZXNpZGVzIGluIFNULVJBTQorCSAqICh0aGVuIFNULVJBTSBpcyB0aGUgZmlyc3QgbWVtb3J5IGJsb2NrIGF0IHZpcnR1YWwgMHgwKQorCSAqLwogCXN0cmFtX3N0YXJ0ID0gcGh5c190b192aXJ0KDApOwogCWtlcm5lbF9pbl9zdHJhbSA9IChzdHJhbV9zdGFydCA9PSAwKTsKIAotCWZvciggaSA9IDA7IGkgPCBtNjhrX251bV9tZW1vcnk7ICsraSApIHsKKwlmb3IgKGkgPSAwOyBpIDwgbTY4a19udW1fbWVtb3J5OyArK2kpIHsKIAkJaWYgKG02OGtfbWVtb3J5W2ldLmFkZHIgPT0gMCkgewotCQkJLyogc2tpcCBmaXJzdCAya0Igb3IgcGFnZSAoc3VwZXJ2aXNvci1vbmx5ISkgKi8KLQkJCXN0cmFtX2VuZCA9IHN0cmFtX3N0YXJ0ICsgbTY4a19tZW1vcnlbaV0uc2l6ZTsKIAkJCXJldHVybjsKIAkJfQogCX0KKwogCS8qIFNob3VsZCBuZXZlciBjb21lIGhlcmUhIChUaGVyZSBpcyBhbHdheXMgU1QtUmFtISkgKi8KLQlwYW5pYyggImF0YXJpX3N0cmFtX2luaXQ6IG5vIFNULVJBTSBmb3VuZCEiICk7CisJcGFuaWMoImF0YXJpX3N0cmFtX2luaXQ6IG5vIFNULVJBTSBmb3VuZCEiKTsKIH0KIAogCkBAIC0xNTEsMjI2ICs5Myw2OCBAQAogICovCiB2b2lkIF9faW5pdCBhdGFyaV9zdHJhbV9yZXNlcnZlX3BhZ2VzKHZvaWQgKnN0YXJ0X21lbSkKIHsKLQkvKiBhbHdheXMgcmVzZXJ2ZSBmaXJzdCBwYWdlIG9mIFNULVJBTSwgdGhlIGZpcnN0IDIga0IgYXJlCi0JICogc3VwZXJ2aXNvci1vbmx5ISAqLworCS8qCisJICogYWx3YXlzIHJlc2VydmUgZmlyc3QgcGFnZSBvZiBTVC1SQU0sIHRoZSBmaXJzdCAyIEtpQiBhcmUKKwkgKiBzdXBlcnZpc29yLW9ubHkhCisJICovCiAJaWYgKCFrZXJuZWxfaW5fc3RyYW0pCiAJCXJlc2VydmVfYm9vdG1lbSgwLCBQQUdFX1NJWkUsIEJPT1RNRU1fREVGQVVMVCk7CiAKLX0KKwlzdHJhbV9wb29sLnN0YXJ0ID0gKHJlc291cmNlX3NpemVfdClhbGxvY19ib290bWVtX2xvd19wYWdlcyhwb29sX3NpemUpOworCXN0cmFtX3Bvb2wuZW5kID0gc3RyYW1fcG9vbC5zdGFydCArIHBvb2xfc2l6ZSAtIDE7CisJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZzdHJhbV9wb29sKTsKIAotdm9pZCBhdGFyaV9zdHJhbV9tZW1faW5pdF9ob29rICh2b2lkKQotewotCW1lbV9pbml0X2RvbmUgPSAxOworCXByX2RlYnVnKCJhdGFyaV9zdHJhbSBwb29sOiBzaXplID0gJWx1IGJ5dGVzLCByZXNvdXJjZSA9ICVwUlxuIiwKKwkJIHBvb2xfc2l6ZSwgJnN0cmFtX3Bvb2wpOwogfQogCiAKLS8qCi0gKiBUaGlzIGlzIG1haW4gcHVibGljIGludGVyZmFjZTogc29tZWhvdyBhbGxvY2F0ZSBhIFNULVJBTSBibG9jawotICoKLSAqICAtIElmIHdlJ3JlIGJlZm9yZSBtZW1faW5pdCgpLCB3ZSBoYXZlIHRvIG1ha2UgYSBzdGF0aWMgYWxsb2NhdGlvbi4gVGhlCi0gKiAgICByZWdpb24gaXMgdGFrZW4gaW4gdGhlIGtlcm5lbCBkYXRhIGFyZWEgKGlmIHRoZSBrZXJuZWwgaXMgaW4gU1QtUkFNKSBvcgotICogICAgZnJvbSB0aGUgc3RhcnQgb2YgU1QtUkFNIChpZiB0aGUga2VybmVsIGlzIGluIFRULVJBTSkgYW5kIGFkZGVkIHRvIHRoZQotICogICAgcnN2ZF9zdHJhbV8qIHJlZ2lvbi4gVGhlIFNULVJBTSBpcyBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiBrZXJuZWwKLSAqICAgIGFkZHJlc3Mgc3BhY2UgaW4gdGhlIGxhdHRlciBjYXNlLgotICoKLSAqICAtIElmIG1lbV9pbml0KCkgYWxyZWFkeSBoYXMgYmVlbiBjYWxsZWQsIHRyeSB3aXRoIF9fZ2V0X2RtYV9wYWdlcygpLgotICogICAgVGhpcyBoYXMgdGhlIGRpc2FkdmFudGFnZSB0aGF0IGl0J3MgdmVyeSBoYXJkIHRvIGdldCBtb3JlIHRoYW4gMSBwYWdlLAotICogICAgYW5kIGl0IGlzIGxpa2VseSB0byBmYWlsIDotKAotICoKLSAqLwotdm9pZCAqYXRhcmlfc3RyYW1fYWxsb2MobG9uZyBzaXplLCBjb25zdCBjaGFyICpvd25lcikKK3ZvaWQgKmF0YXJpX3N0cmFtX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSwgY29uc3QgY2hhciAqb3duZXIpCiB7Ci0Jdm9pZCAqYWRkciA9IE5VTEw7Ci0JQkxPQ0sgKmJsb2NrOwotCWludCBmbGFnczsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgZXJyb3I7CiAKLQlEUFJJTlRLKCJhdGFyaV9zdHJhbV9hbGxvYyhzaXplPSUwOGx4LG93bmVyPSVzKVxuIiwgc2l6ZSwgb3duZXIpOworCXByX2RlYnVnKCJhdGFyaV9zdHJhbV9hbGxvYzogYWxsb2NhdGUgJWx1IGJ5dGVzXG4iLCBzaXplKTsKIAotCWlmICghbWVtX2luaXRfZG9uZSkKLQkJcmV0dXJuIGFsbG9jX2Jvb3RtZW1fbG93KHNpemUpOwotCWVsc2UgewotCQkvKiBBZnRlciBtZW1faW5pdCgpOiBjYW4gb25seSByZXNvcnQgdG8gX19nZXRfZG1hX3BhZ2VzKCkgKi8KLQkJYWRkciA9ICh2b2lkICopX19nZXRfZG1hX3BhZ2VzKEdGUF9LRVJORUwsIGdldF9vcmRlcihzaXplKSk7Ci0JCWZsYWdzID0gQkxPQ0tfR0ZQOwotCQlEUFJJTlRLKCAiYXRhcmlfc3RyYW1fYWxsb2M6IGFmdGVyIG1lbV9pbml0LCAiCi0JCQkJICJnZXRfcGFnZXM9JXBcbiIsIGFkZHIgKTsKKwkvKiByb3VuZCB1cCAqLworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCisJcmVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXMpCisJCXJldHVybiBOVUxMOworCisJcmVzLT5uYW1lID0gb3duZXI7CisJZXJyb3IgPSBhbGxvY2F0ZV9yZXNvdXJjZSgmc3RyYW1fcG9vbCwgcmVzLCBzaXplLCAwLCBVSU5UX01BWCwKKwkJCQkgIFBBR0VfU0laRSwgTlVMTCwgTlVMTCk7CisJaWYgKGVycm9yIDwgMCkgeworCQlwcl9lcnIoImF0YXJpX3N0cmFtX2FsbG9jOiBhbGxvY2F0ZV9yZXNvdXJjZSgpIGZhaWxlZCAlZCFcbiIsCisJCSAgICAgICBlcnJvcik7CisJCWtmcmVlKHJlcyk7CisJCXJldHVybiBOVUxMOwogCX0KIAotCWlmIChhZGRyKSB7Ci0JCWlmICghKGJsb2NrID0gYWRkX3JlZ2lvbiggYWRkciwgc2l6ZSApKSkgewotCQkJLyogb3V0IG9mIG1lbW9yeSBmb3IgQkxPQ0sgc3RydWN0dXJlIDotKCAqLwotCQkJRFBSSU5USyggImF0YXJpX3N0cmFtX2FsbG9jOiBvdXQgb2YgbWVtIGZvciBCTE9DSyAtLSAiCi0JCQkJCSAiZnJlZWluZyBhZ2FpblxuIiApOwotCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylhZGRyLCBnZXRfb3JkZXIoc2l6ZSkpOwotCQkJcmV0dXJuKCBOVUxMICk7Ci0JCX0KLQkJYmxvY2stPm93bmVyID0gb3duZXI7Ci0JCWJsb2NrLT5mbGFncyB8PSBmbGFnczsKLQl9Ci0JcmV0dXJuKCBhZGRyICk7CisJcHJfZGVidWcoImF0YXJpX3N0cmFtX2FsbG9jOiByZXR1cm5pbmcgJXBSXG4iLCByZXMpOworCXJldHVybiAodm9pZCAqKXJlcy0+c3RhcnQ7CiB9CiBFWFBPUlRfU1lNQk9MKGF0YXJpX3N0cmFtX2FsbG9jKTsKIAotdm9pZCBhdGFyaV9zdHJhbV9mcmVlKCB2b2lkICphZGRyICkKIAordm9pZCBhdGFyaV9zdHJhbV9mcmVlKHZvaWQgKmFkZHIpCiB7Ci0JQkxPQ0sgKmJsb2NrOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSAodW5zaWduZWQgbG9uZylhZGRyOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIAotCURQUklOVEsoICJhdGFyaV9zdHJhbV9mcmVlKGFkZHI9JXApXG4iLCBhZGRyICk7Ci0KLQlpZiAoIShibG9jayA9IGZpbmRfcmVnaW9uKCBhZGRyICkpKSB7Ci0JCXByaW50ayggS0VSTl9FUlIgIkF0dGVtcHQgdG8gZnJlZSBub24tYWxsb2NhdGVkIFNULVJBTSBibG9jayBhdCAlcCAiCi0JCQkJImZyb20gJXBcbiIsIGFkZHIsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSApOworCXJlcyA9IGxvb2t1cF9yZXNvdXJjZSgmc3RyYW1fcG9vbCwgc3RhcnQpOworCWlmICghcmVzKSB7CisJCXByX2VycigiYXRhcmlfc3RyYW1fZnJlZTogdHJ5aW5nIHRvIGZyZWUgbm9uZXhpc3RlbnQgcmVnaW9uICIKKwkJICAgICAgICJhdCAlcFxuIiwgYWRkcik7CiAJCXJldHVybjsKIAl9Ci0JRFBSSU5USyggImF0YXJpX3N0cmFtX2ZyZWU6IGZvdW5kIGJsb2NrICglcCk6IHNpemU9JTA4bHgsIG93bmVyPSVzLCAiCi0JCQkgImZsYWdzPSUwMnhcbiIsIGJsb2NrLCBibG9jay0+c2l6ZSwgYmxvY2stPm93bmVyLCBibG9jay0+ZmxhZ3MgKTsKIAotCWlmICghKGJsb2NrLT5mbGFncyAmIEJMT0NLX0dGUCkpCi0JCWdvdG8gZmFpbDsKLQotCURQUklOVEsoImF0YXJpX3N0cmFtX2ZyZWU6IGlzIGttYWxsb2NlZCwgb3JkZXJfc2l6ZT0lZFxuIiwKLQkJZ2V0X29yZGVyKGJsb2NrLT5zaXplKSk7Ci0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylhZGRyLCBnZXRfb3JkZXIoYmxvY2stPnNpemUpKTsKLQlyZW1vdmVfcmVnaW9uKCBibG9jayApOwotCXJldHVybjsKLQotICBmYWlsOgotCXByaW50ayggS0VSTl9FUlIgImF0YXJpX3N0cmFtX2ZyZWU6IGNhbm5vdCBmcmVlIGJsb2NrIGF0ICVwICIKLQkJCSIoY2FsbGVkIGZyb20gJXApXG4iLCBhZGRyLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkgKTsKKwlzaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpOworCXByX2RlYnVnKCJhdGFyaV9zdHJhbV9mcmVlOiBmcmVlICVsdSBieXRlcyBhdCAlcFxuIiwgc2l6ZSwgYWRkcik7CisJcmVsZWFzZV9yZXNvdXJjZShyZXMpOworCWtmcmVlKHJlcyk7CiB9CiBFWFBPUlRfU1lNQk9MKGF0YXJpX3N0cmFtX2ZyZWUpOwotCi0MCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCQkJCQkJCSAgUmVnaW9uIE1hbmFnZW1lbnQJCQkJCQkJCSovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotCi0vKiBpbnNlcnQgYSByZWdpb24gaW50byB0aGUgYWxsb2NlZCBsaXN0IChzb3J0ZWQpICovCi1zdGF0aWMgQkxPQ0sgKmFkZF9yZWdpb24oIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSApCi17Ci0JQkxPQ0sgKipwLCAqbiA9IE5VTEw7Ci0JaW50IGk7Ci0KLQlmb3IoIGkgPSAwOyBpIDwgTl9TVEFUSUNfQkxPQ0tTOyArK2kgKSB7Ci0JCWlmIChzdGF0aWNfYmxvY2tzW2ldLmZsYWdzICYgQkxPQ0tfRlJFRSkgewotCQkJbiA9ICZzdGF0aWNfYmxvY2tzW2ldOwotCQkJbi0+ZmxhZ3MgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKCFuICYmIG1lbV9pbml0X2RvbmUpIHsKLQkJLyogaWYgc3RhdGljcyBibG9jayBwb29sIGV4aGF1c3RlZCBhbmQgd2UgY2FuIGNhbGwga21hbGxvYygpIGFscmVhZHkKLQkJICogKGFmdGVyIG1lbV9pbml0KCkpLCB0cnkgdGhhdCAqLwotCQluID0ga21hbGxvYyggc2l6ZW9mKEJMT0NLKSwgR0ZQX0tFUk5FTCApOwotCQlpZiAobikKLQkJCW4tPmZsYWdzID0gQkxPQ0tfS01BTExPQ0VEOwotCX0KLQlpZiAoIW4pIHsKLQkJcHJpbnRrKCBLRVJOX0VSUiAiT3V0IG9mIG1lbW9yeSBmb3IgU1QtUkFNIGRlc2NyaXB0b3IgYmxvY2tzXG4iICk7Ci0JCXJldHVybiggTlVMTCApOwotCX0KLQluLT5zdGFydCA9IGFkZHI7Ci0Jbi0+c2l6ZSAgPSBzaXplOwotCi0JZm9yKCBwID0gJmFsbG9jX2xpc3Q7ICpwOyBwID0gJigoKnApLT5uZXh0KSApCi0JCWlmICgoKnApLT5zdGFydCA+IGFkZHIpIGJyZWFrOwotCW4tPm5leHQgPSAqcDsKLQkqcCA9IG47Ci0KLQlyZXR1cm4oIG4gKTsKLX0KLQotCi0vKiBmaW5kIGEgcmVnaW9uIChieSBzdGFydCBhZGRyKSBpbiB0aGUgYWxsb2NlZCBsaXN0ICovCi1zdGF0aWMgQkxPQ0sgKmZpbmRfcmVnaW9uKCB2b2lkICphZGRyICkKLXsKLQlCTE9DSyAqcDsKLQotCWZvciggcCA9IGFsbG9jX2xpc3Q7IHA7IHAgPSBwLT5uZXh0ICkgewotCQlpZiAocC0+c3RhcnQgPT0gYWRkcikKLQkJCXJldHVybiggcCApOwotCQlpZiAocC0+c3RhcnQgPiBhZGRyKQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiggTlVMTCApOwotfQotCi0KLS8qIHJlbW92ZSBhIGJsb2NrIGZyb20gdGhlIGFsbG9jZWQgbGlzdCAqLwotc3RhdGljIGludCByZW1vdmVfcmVnaW9uKCBCTE9DSyAqYmxvY2sgKQotewotCUJMT0NLICoqcDsKLQotCWZvciggcCA9ICZhbGxvY19saXN0OyAqcDsgcCA9ICYoKCpwKS0+bmV4dCkgKQotCQlpZiAoKnAgPT0gYmxvY2spIGJyZWFrOwotCWlmICghKnApCi0JCXJldHVybiggMCApOwotCi0JKnAgPSBibG9jay0+bmV4dDsKLQlpZiAoYmxvY2stPmZsYWdzICYgQkxPQ0tfS01BTExPQ0VEKQotCQlrZnJlZSggYmxvY2sgKTsKLQllbHNlCi0JCWJsb2NrLT5mbGFncyB8PSBCTE9DS19GUkVFOwotCXJldHVybiggMSApOwotfQotCi0KLQwKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoJCQkJCQkgL3Byb2Mgc3RhdGlzdGljcyBmaWxlIHN0dWZmCQkJCQkJKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0jaWZkZWYgRE9fUFJPQwotCi0jZGVmaW5lCVBSSU5UX1BST0MoZm10LGFyZ3MuLi4pIHNlcV9wcmludGYoIG0sIGZtdCwgIyNhcmdzICkKLQotc3RhdGljIGludCBzdHJhbV9wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQotewotCUJMT0NLICpwOwotCi0JUFJJTlRfUFJPQygiVG90YWwgU1QtUkFNOiAgICAgICU4dSBrQlxuIiwKLQkJCSAgIChzdHJhbV9lbmQgLSBzdHJhbV9zdGFydCkgPj4gMTApOwotCVBSSU5UX1BST0MoICJBbGxvY2F0ZWQgcmVnaW9uczpcbiIgKTsKLQlmb3IoIHAgPSBhbGxvY19saXN0OyBwOyBwID0gcC0+bmV4dCApIHsKLQkJUFJJTlRfUFJPQygiMHglMDhseC0weCUwOGx4OiAlcyAoIiwKLQkJCSAgIHZpcnRfdG9fcGh5cyhwLT5zdGFydCksCi0JCQkgICB2aXJ0X3RvX3BoeXMocC0+c3RhcnQrcC0+c2l6ZS0xKSwKLQkJCSAgIHAtPm93bmVyKTsKLQkJaWYgKHAtPmZsYWdzICYgQkxPQ0tfR0ZQKQotCQkJUFJJTlRfUFJPQyggInBhZ2UtYWxsb2NlZClcbiIgKTsKLQkJZWxzZQotCQkJUFJJTlRfUFJPQyggIj8/KVxuIiApOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHN0cmFtX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc3RyYW1fcHJvY19zaG93LCBOVUxMKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3RyYW1fcHJvY19mb3BzID0gewotCS5vcGVuCQk9IHN0cmFtX3Byb2Nfb3BlbiwKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgcHJvY19zdHJhbV9pbml0KHZvaWQpCi17Ci0JcHJvY19jcmVhdGUoInN0cmFtIiwgMCwgTlVMTCwgJnN0cmFtX3Byb2NfZm9wcyk7Ci0JcmV0dXJuIDA7Ci19Ci1tb2R1bGVfaW5pdChwcm9jX3N0cmFtX2luaXQpOwotI2VuZGlmCi0KLQotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqICBjLWluZGVudC1sZXZlbDogNAotICogIHRhYi13aWR0aDogNAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vYXRhcmlfc3RyYW0uaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9hdGFyaV9zdHJhbS5oCmluZGV4IDc1NDZkMTMuLjYyZTI3NTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9hdGFyaV9zdHJhbS5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9hdGFyaV9zdHJhbS5oCkBAIC02LDEyICs2LDExIEBACiAgKi8KIAogLyogcHVibGljIGludGVyZmFjZSAqLwotdm9pZCAqYXRhcmlfc3RyYW1fYWxsb2MobG9uZyBzaXplLCBjb25zdCBjaGFyICpvd25lcik7Cit2b2lkICphdGFyaV9zdHJhbV9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUsIGNvbnN0IGNoYXIgKm93bmVyKTsKIHZvaWQgYXRhcmlfc3RyYW1fZnJlZSh2b2lkICopOwogCiAvKiBmdW5jdGlvbnMgY2FsbGVkIGludGVybmFsbHkgYnkgb3RoZXIgcGFydHMgb2YgdGhlIGtlcm5lbCAqLwogdm9pZCBhdGFyaV9zdHJhbV9pbml0KHZvaWQpOwogdm9pZCBhdGFyaV9zdHJhbV9yZXNlcnZlX3BhZ2VzKHZvaWQgKnN0YXJ0X21lbSk7Ci12b2lkIGF0YXJpX3N0cmFtX21lbV9pbml0X2hvb2sgKHZvaWQpOwogCiAjZW5kaWYgLypfTTY4S19BVEFSSV9TVFJBTV9IICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vYXRhcmlody5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2F0YXJpaHcuaAppbmRleCBmNTFmNzA5Li4wMzkyYjI4IDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vYXRhcmlody5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9hdGFyaWh3LmgKQEAgLTM5OSw4ICszOTksOCBAQAogI2RlZmluZSBDT0RFQ19PVkVSRkxPV19MRUZUICAgICAyCiAgIHVfY2hhciB1bnVzZWQyLCB1bnVzZWQzLCB1bnVzZWQ0LCB1bnVzZWQ1OwogICB1X2NoYXIgZ3Bpb19kaXJlY3Rpb25zOwotI2RlZmluZSBHUElPX0lOICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEdQSU9fT1VUICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ09ERUNfR1BJT19JTiAgICAgICAgICAgMAorI2RlZmluZSBDT0RFQ19HUElPX09VVCAgICAgICAgICAxCiAgIHVfY2hhciB1bnVzZWQ2OwogICB1X2NoYXIgZ3Bpb19kYXRhOwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXBfbW0uYyBiL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXBfbW0uYwppbmRleCAzMzRkODM2Li5jM2I0NTA2IDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3NldHVwX21tLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cF9tbS5jCkBAIC0yMTYsNyArMjE2LDkgQEAKIAogdm9pZCBfX2luaXQgc2V0dXBfYXJjaChjaGFyICoqY21kbGluZV9wKQogeworI2lmbmRlZiBDT05GSUdfU1VOMwogCWludCBpOworI2VuZGlmCiAKIAkvKiBUaGUgYm9vdGluZm8gaXMgbG9jYXRlZCByaWdodCBhZnRlciB0aGUga2VybmVsIGJzcyAqLwogCW02OGtfcGFyc2VfYm9vdGluZm8oKGNvbnN0IHN0cnVjdCBiaV9yZWNvcmQgKilfZW5kKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tYXRoLWVtdS9mcF9sb2cuYyBiL2FyY2gvbTY4ay9tYXRoLWVtdS9mcF9sb2cuYwppbmRleCAzNjdlY2VlLi4zMzg0YTUyIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbWF0aC1lbXUvZnBfbG9nLmMKKysrIGIvYXJjaC9tNjhrL21hdGgtZW11L2ZwX2xvZy5jCkBAIC0xMDUsOSArMTA1LDYgQEAKIAogCWZwX21vbmFkaWNfY2hlY2soZGVzdCwgc3JjKTsKIAotCWlmIChJU19aRVJPKGRlc3QpKQotCQlyZXR1cm4gZGVzdDsKLQogCXJldHVybiBkZXN0OwogfQogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbWF0aC1lbXUvbXVsdGlfYXJpdGguaCBiL2FyY2gvbTY4ay9tYXRoLWVtdS9tdWx0aV9hcml0aC5oCmluZGV4IDRhZDBjYTkuLjRiNWViM2QgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tYXRoLWVtdS9tdWx0aV9hcml0aC5oCisrKyBiL2FyY2gvbTY4ay9tYXRoLWVtdS9tdWx0aV9hcml0aC5oCkBAIC0xOSwyNDYgKzE5LDYgQEAKICNpZm5kZWYgTVVMVElfQVJJVEhfSAogI2RlZmluZSBNVUxUSV9BUklUSF9ICiAKLSNpZiAwCS8qIG9sZCBjb2RlLi4uICovCi0KLS8qIFVuc2lnbmVkIG9ubHksIGJlY2F1c2Ugd2UgZG9uJ3QgbmVlZCBzaWducyB0byBtdWx0aXBseSBhbmQgZGl2aWRlLiAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgaW50MTI4WzRdOwotCi0vKiBXb3JkIG9yZGVyICovCi1lbnVtIHsKLQlNU1cxMjgsCi0JTk1TVzEyOCwKLQlOTFNXMTI4LAotCUxTVzEyOAotfTsKLQotLyogYmlnLWVuZGlhbiAqLwotI2RlZmluZSBMT19XT1JEKGxsKSAoKCh1bnNpZ25lZCBpbnQgKikgJmxsKVsxXSkKLSNkZWZpbmUgSElfV09SRChsbCkgKCgodW5zaWduZWQgaW50ICopICZsbClbMF0pCi0KLS8qIENvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBzdHVmZiB2YXJpb3VzIGludGVnZXIgdmFsdWVzIGludG8gaW50MTI4cyAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgemVybzEyOChpbnQxMjggYSkKLXsKLQlhW0xTVzEyOF0gPSBhW05MU1cxMjhdID0gYVtOTVNXMTI4XSA9IGFbTVNXMTI4XSA9IDA7Ci19Ci0KLS8qIEh1bWFuLXJlYWRhYmxlIHdvcmQgb3JkZXIgaW4gdGhlIGFyZ3VtZW50cyAqLwotc3RhdGljIGlubGluZSB2b2lkIHNldDEyOCh1bnNpZ25lZCBpbnQgaTMsIHVuc2lnbmVkIGludCBpMiwgdW5zaWduZWQgaW50IGkxLAotCQkJICB1bnNpZ25lZCBpbnQgaTAsIGludDEyOCBhKQotewotCWFbTFNXMTI4XSA9IGkwOwotCWFbTkxTVzEyOF0gPSBpMTsKLQlhW05NU1cxMjhdID0gaTI7Ci0JYVtNU1cxMjhdID0gaTM7Ci19Ci0KLS8qIENvbnZlbmllbmNlIGZ1bmN0aW9ucyAoZm9yIHRlc3RpbmcgYXMgd2VsbCkgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpbnQ2NF90b18xMjgodW5zaWduZWQgbG9uZyBsb25nIHNyYywgaW50MTI4IGRlc3QpCi17Ci0JZGVzdFtMU1cxMjhdID0gKHVuc2lnbmVkIGludCkgc3JjOwotCWRlc3RbTkxTVzEyOF0gPSBzcmMgPj4gMzI7Ci0JZGVzdFtOTVNXMTI4XSA9IGRlc3RbTVNXMTI4XSA9IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpbnQxMjhfdG9fNjQoY29uc3QgaW50MTI4IHNyYywgdW5zaWduZWQgbG9uZyBsb25nICpkZXN0KQotewotCSpkZXN0ID0gc3JjW0xTVzEyOF0gfCAobG9uZyBsb25nKSBzcmNbTkxTVzEyOF0gPDwgMzI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfaTEyOChjb25zdCBpbnQxMjggYSkKLXsKLQlwcmludGsoIiUwOHggJTA4eCAlMDh4ICUwOHhcbiIsIGFbTVNXMTI4XSwgYVtOTVNXMTI4XSwKLQkgICAgICAgYVtOTFNXMTI4XSwgYVtMU1cxMjhdKTsKLX0KLQotLyogSW50ZXJuYWwgc2hpZnRlcnM6Ci0KLSAgIE5vdGUgdGhhdCB0aGVzZSBhcmUgb25seSBnb29kIGZvciAwIDwgY291bnQgPCAzMi4KLSAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgX2xzbDEyOCh1bnNpZ25lZCBpbnQgY291bnQsIGludDEyOCBhKQotewotCWFbTVNXMTI4XSA9IChhW01TVzEyOF0gPDwgY291bnQpIHwgKGFbTk1TVzEyOF0gPj4gKDMyIC0gY291bnQpKTsKLQlhW05NU1cxMjhdID0gKGFbTk1TVzEyOF0gPDwgY291bnQpIHwgKGFbTkxTVzEyOF0gPj4gKDMyIC0gY291bnQpKTsKLQlhW05MU1cxMjhdID0gKGFbTkxTVzEyOF0gPDwgY291bnQpIHwgKGFbTFNXMTI4XSA+PiAoMzIgLSBjb3VudCkpOwotCWFbTFNXMTI4XSA8PD0gY291bnQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfbHNyMTI4KHVuc2lnbmVkIGludCBjb3VudCwgaW50MTI4IGEpCi17Ci0JYVtMU1cxMjhdID0gKGFbTFNXMTI4XSA+PiBjb3VudCkgfCAoYVtOTFNXMTI4XSA8PCAoMzIgLSBjb3VudCkpOwotCWFbTkxTVzEyOF0gPSAoYVtOTFNXMTI4XSA+PiBjb3VudCkgfCAoYVtOTVNXMTI4XSA8PCAoMzIgLSBjb3VudCkpOwotCWFbTk1TVzEyOF0gPSAoYVtOTVNXMTI4XSA+PiBjb3VudCkgfCAoYVtNU1cxMjhdIDw8ICgzMiAtIGNvdW50KSk7Ci0JYVtNU1cxMjhdID4+PSBjb3VudDsKLX0KLQotLyogU2hvdWxkIGJlIGZhc3Rlciwgb25lIHdvdWxkIGhvcGUgKi8KLQotc3RhdGljIGlubGluZSB2b2lkIGxzbG9uZTEyOChpbnQxMjggYSkKLXsKLQlhc20gdm9sYXRpbGUgKCJsc2wubCAjMSwlMFxuIgotCQkgICAgICAicm94bC5sICMxLCUxXG4iCi0JCSAgICAgICJyb3hsLmwgIzEsJTJcbiIKLQkJICAgICAgInJveGwubCAjMSwlM1xuIgotCQkgICAgICA6Ci0JCSAgICAgICI9ZCIgKGFbTFNXMTI4XSksCi0JCSAgICAgICI9ZCIoYVtOTFNXMTI4XSksCi0JCSAgICAgICI9ZCIoYVtOTVNXMTI4XSksCi0JCSAgICAgICI9ZCIoYVtNU1cxMjhdKQotCQkgICAgICA6Ci0JCSAgICAgICIwIihhW0xTVzEyOF0pLAotCQkgICAgICAiMSIoYVtOTFNXMTI4XSksCi0JCSAgICAgICIyIihhW05NU1cxMjhdKSwKLQkJICAgICAgIjMiKGFbTVNXMTI4XSkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbHNyb25lMTI4KGludDEyOCBhKQotewotCWFzbSB2b2xhdGlsZSAoImxzci5sICMxLCUwXG4iCi0JCSAgICAgICJyb3hyLmwgIzEsJTFcbiIKLQkJICAgICAgInJveHIubCAjMSwlMlxuIgotCQkgICAgICAicm94ci5sICMxLCUzXG4iCi0JCSAgICAgIDoKLQkJICAgICAgIj1kIiAoYVtNU1cxMjhdKSwKLQkJICAgICAgIj1kIihhW05NU1cxMjhdKSwKLQkJICAgICAgIj1kIihhW05MU1cxMjhdKSwKLQkJICAgICAgIj1kIihhW0xTVzEyOF0pCi0JCSAgICAgIDoKLQkJICAgICAgIjAiKGFbTVNXMTI4XSksCi0JCSAgICAgICIxIihhW05NU1cxMjhdKSwKLQkJICAgICAgIjIiKGFbTkxTVzEyOF0pLAotCQkgICAgICAiMyIoYVtMU1cxMjhdKSk7Ci19Ci0KLS8qIEdlbmVyYWxpemVkIDEyOC1iaXQgc2hpZnRlcnM6Ci0KLSAgIFRoZXNlIGJpdC1zaGlmdCB0byBhIG11bHRpcGxlIG9mIDMyLCB0aGVuIG1vdmUgd2hvbGUgbG9uZ3dvcmRzLiAgKi8KLQotc3RhdGljIGlubGluZSB2b2lkIGxzbDEyOCh1bnNpZ25lZCBpbnQgY291bnQsIGludDEyOCBhKQotewotCWludCB3b3JkY291bnQsIGk7Ci0KLQlpZiAoY291bnQgJSAzMikKLQkJX2xzbDEyOChjb3VudCAlIDMyLCBhKTsKLQotCWlmICgwID09ICh3b3JkY291bnQgPSBjb3VudCAvIDMyKSkKLQkJcmV0dXJuOwotCi0JLyogYXJnaCwgZ2FrLCBlbmRpYW4tc2Vuc2l0aXZlICovCi0JZm9yIChpID0gMDsgaSA8IDQgLSB3b3JkY291bnQ7IGkrKykgewotCQlhW2ldID0gYVtpICsgd29yZGNvdW50XTsKLQl9Ci0JZm9yIChpID0gMzsgaSA+PSA0IC0gd29yZGNvdW50OyAtLWkpIHsKLQkJYVtpXSA9IDA7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbHNyMTI4KHVuc2lnbmVkIGludCBjb3VudCwgaW50MTI4IGEpCi17Ci0JaW50IHdvcmRjb3VudCwgaTsKLQotCWlmIChjb3VudCAlIDMyKQotCQlfbHNyMTI4KGNvdW50ICUgMzIsIGEpOwotCi0JaWYgKDAgPT0gKHdvcmRjb3VudCA9IGNvdW50IC8gMzIpKQotCQlyZXR1cm47Ci0KLQlmb3IgKGkgPSAzOyBpID49IHdvcmRjb3VudDsgLS1pKSB7Ci0JCWFbaV0gPSBhW2kgLSB3b3JkY291bnRdOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgd29yZGNvdW50OyBpKyspIHsKLQkJYVtpXSA9IDA7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIGludCBvcmwxMjgoaW50IGEsIGludDEyOCBiKQotewotCWJbTFNXMTI4XSB8PSBhOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBidHN0aGkxMjgoY29uc3QgaW50MTI4IGEpCi17Ci0JcmV0dXJuIGFbTVNXMTI4XSAmIDB4ODAwMDAwMDA7Ci19Ci0KLS8qIHRlc3QgYml0cyAobnVtYmVyZWQgZnJvbSAwID0gTFNCKSB1cCB0byBhbmQgaW5jbHVkaW5nICJ0b3AiICovCi1zdGF0aWMgaW5saW5lIGludCBiZnRlc3RsbzEyOChpbnQgdG9wLCBjb25zdCBpbnQxMjggYSkKLXsKLQlpbnQgciA9IDA7Ci0KLQlpZiAodG9wID4gMzEpCi0JCXIgfD0gYVtMU1cxMjhdOwotCWlmICh0b3AgPiA2MykKLQkJciB8PSBhW05MU1cxMjhdOwotCWlmICh0b3AgPiA5NSkKLQkJciB8PSBhW05NU1cxMjhdOwotCi0JciB8PSBhWzMgLSAodG9wIC8gMzIpXSAmICgoMSA8PCAodG9wICUgMzIgKyAxKSkgLSAxKTsKLQotCXJldHVybiAociAhPSAwKTsKLX0KLQotLyogQWFyZ2guICBXZSBuZWVkIHRoZXNlIGJlY2F1c2UgR0NDIGlzIGJyb2tlbiAqLwotLyogRklYTUU6IGRvIHRoZW0gaW4gYXNzZW1ibHksIGZvciBnb29kbmVzcycgc2FrZSEgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBtYXNrNjQoaW50IHBvcywgdW5zaWduZWQgbG9uZyBsb25nICptYXNrKQotewotCSptYXNrID0gMDsKLQotCWlmIChwb3MgPCAzMikgewotCQlMT19XT1JEKCptYXNrKSA9ICgxIDw8IHBvcykgLSAxOwotCQlyZXR1cm47Ci0JfQotCUxPX1dPUkQoKm1hc2spID0gLTE7Ci0JSElfV09SRCgqbWFzaykgPSAoMSA8PCAocG9zIC0gMzIpKSAtIDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBic2V0NjQoaW50IHBvcywgdW5zaWduZWQgbG9uZyBsb25nICpkZXN0KQotewotCS8qIFRoaXMgY29uZGl0aW9uYWwgd2lsbCBiZSBvcHRpbWl6ZWQgYXdheS4gIFRoYW5rcywgR0NDISAqLwotCWlmIChwb3MgPCAzMikKLQkJYXNtIHZvbGF0aWxlICgiYnNldCAlMSwlMCI6Ij1tIgotCQkJICAgICAgKExPX1dPUkQoKmRlc3QpKToiaWQiKHBvcykpOwotCWVsc2UKLQkJYXNtIHZvbGF0aWxlICgiYnNldCAlMSwlMCI6Ij1tIgotCQkJICAgICAgKEhJX1dPUkQoKmRlc3QpKToiaWQiKHBvcyAtIDMyKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJ0c3Q2NChpbnQgcG9zLCB1bnNpZ25lZCBsb25nIGxvbmcgZGVzdCkKLXsKLQlpZiAocG9zIDwgMzIpCi0JCXJldHVybiAoMCAhPSAoTE9fV09SRChkZXN0KSAmICgxIDw8IHBvcykpKTsKLQllbHNlCi0JCXJldHVybiAoMCAhPSAoSElfV09SRChkZXN0KSAmICgxIDw8IChwb3MgLSAzMikpKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBsc2w2NChpbnQgY291bnQsIHVuc2lnbmVkIGxvbmcgbG9uZyAqZGVzdCkKLXsKLQlpZiAoY291bnQgPCAzMikgewotCQlISV9XT1JEKCpkZXN0KSA9IChISV9XT1JEKCpkZXN0KSA8PCBjb3VudCkKLQkJICAgIHwgKExPX1dPUkQoKmRlc3QpID4+IGNvdW50KTsKLQkJTE9fV09SRCgqZGVzdCkgPDw9IGNvdW50OwotCQlyZXR1cm47Ci0JfQotCWNvdW50IC09IDMyOwotCUhJX1dPUkQoKmRlc3QpID0gTE9fV09SRCgqZGVzdCkgPDwgY291bnQ7Ci0JTE9fV09SRCgqZGVzdCkgPSAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbHNyNjQoaW50IGNvdW50LCB1bnNpZ25lZCBsb25nIGxvbmcgKmRlc3QpCi17Ci0JaWYgKGNvdW50IDwgMzIpIHsKLQkJTE9fV09SRCgqZGVzdCkgPSAoTE9fV09SRCgqZGVzdCkgPj4gY291bnQpCi0JCSAgICB8IChISV9XT1JEKCpkZXN0KSA8PCAoMzIgLSBjb3VudCkpOwotCQlISV9XT1JEKCpkZXN0KSA+Pj0gY291bnQ7Ci0JCXJldHVybjsKLQl9Ci0JY291bnQgLT0gMzI7Ci0JTE9fV09SRCgqZGVzdCkgPSBISV9XT1JEKCpkZXN0KSA+PiBjb3VudDsKLQlISV9XT1JEKCpkZXN0KSA9IDA7Ci19Ci0jZW5kaWYKLQogc3RhdGljIGlubGluZSB2b2lkIGZwX2Rlbm9ybWFsaXplKHN0cnVjdCBmcF9leHQgKnJlZywgdW5zaWduZWQgaW50IGNudCkKIHsKIAlyZWctPmV4cCArPSBjbnQ7CkBAIC00ODEsMTE3ICsyNDEsNiBAQAogCX0KIH0KIAotI2lmIDAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZwX2ZsczEyOCh1bmlvbiBmcF9tYW50MTI4ICpzcmMpCi17Ci0JdW5zaWduZWQgbG9uZyBkYXRhOwotCXVuc2lnbmVkIGludCByZXMsIG9mZjsKLQotCWlmICgoZGF0YSA9IHNyYy0+bTMyWzBdKSkKLQkJb2ZmID0gMDsKLQllbHNlIGlmICgoZGF0YSA9IHNyYy0+bTMyWzFdKSkKLQkJb2ZmID0gMzI7Ci0JZWxzZSBpZiAoKGRhdGEgPSBzcmMtPm0zMlsyXSkpCi0JCW9mZiA9IDY0OwotCWVsc2UgaWYgKChkYXRhID0gc3JjLT5tMzJbM10pKQotCQlvZmYgPSA5NjsKLQllbHNlCi0JCXJldHVybiAxMjg7Ci0KLQlhc20gKCJiZmZmbyAlMXsjMCwjMzJ9LCUwIiA6ICI9ZCIgKHJlcykgOiAiZG0iIChkYXRhKSk7Ci0JcmV0dXJuIHJlcyArIG9mZjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGZwX3NoaWZ0bWFudDEyOCh1bmlvbiBmcF9tYW50MTI4ICpzcmMsIGludCBzaGlmdCkKLXsKLQl1bnNpZ25lZCBsb25nIHN0aWNreTsKLQotCXN3aXRjaCAoc2hpZnQpIHsKLQljYXNlIDA6Ci0JCXJldHVybjsKLQljYXNlIDE6Ci0JCWFzbSB2b2xhdGlsZSAoImxzbC5sICMxLCUwIgotCQkJOiAiPWQiIChzcmMtPm0zMlszXSkgOiAiMCIgKHNyYy0+bTMyWzNdKSk7Ci0JCWFzbSB2b2xhdGlsZSAoInJveGwubCAjMSwlMCIKLQkJCTogIj1kIiAoc3JjLT5tMzJbMl0pIDogIjAiIChzcmMtPm0zMlsyXSkpOwotCQlhc20gdm9sYXRpbGUgKCJyb3hsLmwgIzEsJTAiCi0JCQk6ICI9ZCIgKHNyYy0+bTMyWzFdKSA6ICIwIiAoc3JjLT5tMzJbMV0pKTsKLQkJYXNtIHZvbGF0aWxlICgicm94bC5sICMxLCUwIgotCQkJOiAiPWQiIChzcmMtPm0zMlswXSkgOiAiMCIgKHNyYy0+bTMyWzBdKSk7Ci0JCXJldHVybjsKLQljYXNlIDIgLi4uIDMxOgotCQlzcmMtPm0zMlswXSA9IChzcmMtPm0zMlswXSA8PCBzaGlmdCkgfCAoc3JjLT5tMzJbMV0gPj4gKDMyIC0gc2hpZnQpKTsKLQkJc3JjLT5tMzJbMV0gPSAoc3JjLT5tMzJbMV0gPDwgc2hpZnQpIHwgKHNyYy0+bTMyWzJdID4+ICgzMiAtIHNoaWZ0KSk7Ci0JCXNyYy0+bTMyWzJdID0gKHNyYy0+bTMyWzJdIDw8IHNoaWZ0KSB8IChzcmMtPm0zMlszXSA+PiAoMzIgLSBzaGlmdCkpOwotCQlzcmMtPm0zMlszXSA9IChzcmMtPm0zMlszXSA8PCBzaGlmdCk7Ci0JCXJldHVybjsKLQljYXNlIDMyIC4uLiA2MzoKLQkJc2hpZnQgLT0gMzI7Ci0JCXNyYy0+bTMyWzBdID0gKHNyYy0+bTMyWzFdIDw8IHNoaWZ0KSB8IChzcmMtPm0zMlsyXSA+PiAoMzIgLSBzaGlmdCkpOwotCQlzcmMtPm0zMlsxXSA9IChzcmMtPm0zMlsyXSA8PCBzaGlmdCkgfCAoc3JjLT5tMzJbM10gPj4gKDMyIC0gc2hpZnQpKTsKLQkJc3JjLT5tMzJbMl0gPSAoc3JjLT5tMzJbM10gPDwgc2hpZnQpOwotCQlzcmMtPm0zMlszXSA9IDA7Ci0JCXJldHVybjsKLQljYXNlIDY0IC4uLiA5NToKLQkJc2hpZnQgLT0gNjQ7Ci0JCXNyYy0+bTMyWzBdID0gKHNyYy0+bTMyWzJdIDw8IHNoaWZ0KSB8IChzcmMtPm0zMlszXSA+PiAoMzIgLSBzaGlmdCkpOwotCQlzcmMtPm0zMlsxXSA9IChzcmMtPm0zMlszXSA8PCBzaGlmdCk7Ci0JCXNyYy0+bTMyWzJdID0gc3JjLT5tMzJbM10gPSAwOwotCQlyZXR1cm47Ci0JY2FzZSA5NiAuLi4gMTI3OgotCQlzaGlmdCAtPSA5NjsKLQkJc3JjLT5tMzJbMF0gPSAoc3JjLT5tMzJbM10gPDwgc2hpZnQpOwotCQlzcmMtPm0zMlsxXSA9IHNyYy0+bTMyWzJdID0gc3JjLT5tMzJbM10gPSAwOwotCQlyZXR1cm47Ci0JY2FzZSAtMzEgLi4uIC0xOgotCQlzaGlmdCA9IC1zaGlmdDsKLQkJc3RpY2t5ID0gMDsKLQkJaWYgKHNyYy0+bTMyWzNdIDw8ICgzMiAtIHNoaWZ0KSkKLQkJCXN0aWNreSA9IDE7Ci0JCXNyYy0+bTMyWzNdID0gKHNyYy0+bTMyWzNdID4+IHNoaWZ0KSB8IChzcmMtPm0zMlsyXSA8PCAoMzIgLSBzaGlmdCkpIHwgc3RpY2t5OwotCQlzcmMtPm0zMlsyXSA9IChzcmMtPm0zMlsyXSA+PiBzaGlmdCkgfCAoc3JjLT5tMzJbMV0gPDwgKDMyIC0gc2hpZnQpKTsKLQkJc3JjLT5tMzJbMV0gPSAoc3JjLT5tMzJbMV0gPj4gc2hpZnQpIHwgKHNyYy0+bTMyWzBdIDw8ICgzMiAtIHNoaWZ0KSk7Ci0JCXNyYy0+bTMyWzBdID0gKHNyYy0+bTMyWzBdID4+IHNoaWZ0KTsKLQkJcmV0dXJuOwotCWNhc2UgLTYzIC4uLiAtMzI6Ci0JCXNoaWZ0ID0gLXNoaWZ0IC0gMzI7Ci0JCXN0aWNreSA9IDA7Ci0JCWlmICgoc3JjLT5tMzJbMl0gPDwgKDMyIC0gc2hpZnQpKSB8fCBzcmMtPm0zMlszXSkKLQkJCXN0aWNreSA9IDE7Ci0JCXNyYy0+bTMyWzNdID0gKHNyYy0+bTMyWzJdID4+IHNoaWZ0KSB8IChzcmMtPm0zMlsxXSA8PCAoMzIgLSBzaGlmdCkpIHwgc3RpY2t5OwotCQlzcmMtPm0zMlsyXSA9IChzcmMtPm0zMlsxXSA+PiBzaGlmdCkgfCAoc3JjLT5tMzJbMF0gPDwgKDMyIC0gc2hpZnQpKTsKLQkJc3JjLT5tMzJbMV0gPSAoc3JjLT5tMzJbMF0gPj4gc2hpZnQpOwotCQlzcmMtPm0zMlswXSA9IDA7Ci0JCXJldHVybjsKLQljYXNlIC05NSAuLi4gLTY0OgotCQlzaGlmdCA9IC1zaGlmdCAtIDY0OwotCQlzdGlja3kgPSAwOwotCQlpZiAoKHNyYy0+bTMyWzFdIDw8ICgzMiAtIHNoaWZ0KSkgfHwgc3JjLT5tMzJbMl0gfHwgc3JjLT5tMzJbM10pCi0JCQlzdGlja3kgPSAxOwotCQlzcmMtPm0zMlszXSA9IChzcmMtPm0zMlsxXSA+PiBzaGlmdCkgfCAoc3JjLT5tMzJbMF0gPDwgKDMyIC0gc2hpZnQpKSB8IHN0aWNreTsKLQkJc3JjLT5tMzJbMl0gPSAoc3JjLT5tMzJbMF0gPj4gc2hpZnQpOwotCQlzcmMtPm0zMlsxXSA9IHNyYy0+bTMyWzBdID0gMDsKLQkJcmV0dXJuOwotCWNhc2UgLTEyNyAuLi4gLTk2OgotCQlzaGlmdCA9IC1zaGlmdCAtIDk2OwotCQlzdGlja3kgPSAwOwotCQlpZiAoKHNyYy0+bTMyWzBdIDw8ICgzMiAtIHNoaWZ0KSkgfHwgc3JjLT5tMzJbMV0gfHwgc3JjLT5tMzJbMl0gfHwgc3JjLT5tMzJbM10pCi0JCQlzdGlja3kgPSAxOwotCQlzcmMtPm0zMlszXSA9IChzcmMtPm0zMlswXSA+PiBzaGlmdCkgfCBzdGlja3k7Ci0JCXNyYy0+bTMyWzJdID0gc3JjLT5tMzJbMV0gPSBzcmMtPm0zMlswXSA9IDA7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoc2hpZnQgPCAwICYmIChzcmMtPm0zMlswXSB8fCBzcmMtPm0zMlsxXSB8fCBzcmMtPm0zMlsyXSB8fCBzcmMtPm0zMlszXSkpCi0JCXNyYy0+bTMyWzNdID0gMTsKLQllbHNlCi0JCXNyYy0+bTMyWzNdID0gMDsKLQlzcmMtPm0zMlsyXSA9IDA7Ci0Jc3JjLT5tMzJbMV0gPSAwOwotCXNyYy0+bTMyWzBdID0gMDsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW5saW5lIHZvaWQgZnBfcHV0bWFudDEyOChzdHJ1Y3QgZnBfZXh0ICpkZXN0LCB1bmlvbiBmcF9tYW50MTI4ICpzcmMsCiAJCQkJIGludCBzaGlmdCkKIHsKQEAgLTYzNywxODMgKzI4Niw0IEBACiAJfQogfQogCi0jaWYgMCAvKiBvbGQgY29kZS4uLiAqLwotc3RhdGljIGlubGluZSBpbnQgZmxzKHVuc2lnbmVkIGludCBhKQotewotCWludCByOwotCi0JYXNtIHZvbGF0aWxlICgiYmZmZm8gJTF7IzAsIzMyfSwlMCIKLQkJICAgICAgOiAiPWQiIChyKSA6ICJtZCIgKGEpKTsKLQlyZXR1cm4gcjsKLX0KLQotLyogZmxzID0gImZpbmQgbGFzdCBzZXQiIChjZi4gZmZzKDMpKSAqLwotc3RhdGljIGlubGluZSBpbnQgZmxzMTI4KGNvbnN0IGludDEyOCBhKQotewotCWlmIChhW01TVzEyOF0pCi0JCXJldHVybiBmbHMoYVtNU1cxMjhdKTsKLQlpZiAoYVtOTVNXMTI4XSkKLQkJcmV0dXJuIGZscyhhW05NU1cxMjhdKSArIDMyOwotCS8qIFhYWDogaXQgcHJvYmFibHkgbmV2ZXIgZ2V0cyBiZXlvbmQgdGhpcyBwb2ludCBpbiBhY3R1YWwKLQkgICB1c2UsIGJ1dCB0aGF0J3MgaW5kaWNhdGl2ZSBvZiBhIG1vcmUgZ2VuZXJhbCBwcm9ibGVtIGluIHRoZQotCSAgIGFsZ29yaXRobSAoaS5lLiBhcyBwZXIgdGhlIGFjdHVhbCA2ODg4MSBpbXBsZW1lbnRhdGlvbiwgd2UKLQkgICByZWFsbHkgb25seSBuZWVkIGF0IG1vc3QgNjcgYml0cyBvZiBwcmVjaXNpb24gW3BsdXMKLQkgICBvdmVyZmxvd10pIHNvIEknbSBub3QgZ29pbmcgdG8gZml4IGl0LiAqLwotCWlmIChhW05MU1cxMjhdKQotCQlyZXR1cm4gZmxzKGFbTkxTVzEyOF0pICsgNjQ7Ci0JaWYgKGFbTFNXMTI4XSkKLQkJcmV0dXJuIGZscyhhW0xTVzEyOF0pICsgOTY7Ci0JZWxzZQotCQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHplcm9wMTI4KGNvbnN0IGludDEyOCBhKQotewotCXJldHVybiAhKGFbTFNXMTI4XSB8IGFbTkxTVzEyOF0gfCBhW05NU1cxMjhdIHwgYVtNU1cxMjhdKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbm9uemVyb3AxMjgoY29uc3QgaW50MTI4IGEpCi17Ci0JcmV0dXJuIChhW0xTVzEyOF0gfCBhW05MU1cxMjhdIHwgYVtOTVNXMTI4XSB8IGFbTVNXMTI4XSk7Ci19Ci0KLS8qIEFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiAqLwotLyogRG8gdGhlc2UgaW4gInB1cmUiIGFzc2VtYmx5LCBiZWNhdXNlICJleHRlbmRlZCIgYXNtIGlzIHVubWFuYWdlYWJsZQotICAgaGVyZSAqLwotc3RhdGljIGlubGluZSB2b2lkIGFkZDEyOChjb25zdCBpbnQxMjggYSwgaW50MTI4IGIpCi17Ci0JLyogcm90YXRpbmcgY2FycnkgZmxhZ3MgKi8KLQl1bnNpZ25lZCBpbnQgY2FycnlbMl07Ci0KLQljYXJyeVswXSA9IGFbTFNXMTI4XSA+ICgweGZmZmZmZmZmIC0gYltMU1cxMjhdKTsKLQliW0xTVzEyOF0gKz0gYVtMU1cxMjhdOwotCi0JY2FycnlbMV0gPSBhW05MU1cxMjhdID4gKDB4ZmZmZmZmZmYgLSBiW05MU1cxMjhdIC0gY2FycnlbMF0pOwotCWJbTkxTVzEyOF0gPSBhW05MU1cxMjhdICsgYltOTFNXMTI4XSArIGNhcnJ5WzBdOwotCi0JY2FycnlbMF0gPSBhW05NU1cxMjhdID4gKDB4ZmZmZmZmZmYgLSBiW05NU1cxMjhdIC0gY2FycnlbMV0pOwotCWJbTk1TVzEyOF0gPSBhW05NU1cxMjhdICsgYltOTVNXMTI4XSArIGNhcnJ5WzFdOwotCi0JYltNU1cxMjhdID0gYVtNU1cxMjhdICsgYltNU1cxMjhdICsgY2FycnlbMF07Ci19Ci0KLS8qIE5vdGU6IGFzc2VtYmxlciBzZW1hbnRpY3M6ICJiIC09IGEiICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc3ViMTI4KGNvbnN0IGludDEyOCBhLCBpbnQxMjggYikKLXsKLQkvKiByb3RhdGluZyBib3Jyb3cgZmxhZ3MgKi8KLQl1bnNpZ25lZCBpbnQgYm9ycm93WzJdOwotCi0JYm9ycm93WzBdID0gYltMU1cxMjhdIDwgYVtMU1cxMjhdOwotCWJbTFNXMTI4XSAtPSBhW0xTVzEyOF07Ci0KLQlib3Jyb3dbMV0gPSBiW05MU1cxMjhdIDwgYVtOTFNXMTI4XSArIGJvcnJvd1swXTsKLQliW05MU1cxMjhdID0gYltOTFNXMTI4XSAtIGFbTkxTVzEyOF0gLSBib3Jyb3dbMF07Ci0KLQlib3Jyb3dbMF0gPSBiW05NU1cxMjhdIDwgYVtOTVNXMTI4XSArIGJvcnJvd1sxXTsKLQliW05NU1cxMjhdID0gYltOTVNXMTI4XSAtIGFbTk1TVzEyOF0gLSBib3Jyb3dbMV07Ci0KLQliW01TVzEyOF0gPSBiW01TVzEyOF0gLSBhW01TVzEyOF0gLSBib3Jyb3dbMF07Ci19Ci0KLS8qIFBvb3IgbWFuJ3MgNjQtYml0IGV4cGFuZGluZyBtdWx0aXBseSAqLwotc3RhdGljIGlubGluZSB2b2lkIG11bDY0KHVuc2lnbmVkIGxvbmcgbG9uZyBhLCB1bnNpZ25lZCBsb25nIGxvbmcgYiwgaW50MTI4IGMpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIGFjYzsKLQlpbnQxMjggYWNjMTI4OwotCi0JemVybzEyOChhY2MxMjgpOwotCXplcm8xMjgoYyk7Ci0KLQkvKiBmaXJzdCB0aGUgbG93IHdvcmRzICovCi0JaWYgKExPX1dPUkQoYSkgJiYgTE9fV09SRChiKSkgewotCQlhY2MgPSAobG9uZyBsb25nKSBMT19XT1JEKGEpICogTE9fV09SRChiKTsKLQkJY1tOTFNXMTI4XSA9IEhJX1dPUkQoYWNjKTsKLQkJY1tMU1cxMjhdID0gTE9fV09SRChhY2MpOwotCX0KLQkvKiBOZXh0IHRoZSBoaWdoIHdvcmRzICovCi0JaWYgKEhJX1dPUkQoYSkgJiYgSElfV09SRChiKSkgewotCQlhY2MgPSAobG9uZyBsb25nKSBISV9XT1JEKGEpICogSElfV09SRChiKTsKLQkJY1tNU1cxMjhdID0gSElfV09SRChhY2MpOwotCQljW05NU1cxMjhdID0gTE9fV09SRChhY2MpOwotCX0KLQkvKiBUaGUgbWlkZGxlIHdvcmRzICovCi0JaWYgKExPX1dPUkQoYSkgJiYgSElfV09SRChiKSkgewotCQlhY2MgPSAobG9uZyBsb25nKSBMT19XT1JEKGEpICogSElfV09SRChiKTsKLQkJYWNjMTI4W05NU1cxMjhdID0gSElfV09SRChhY2MpOwotCQlhY2MxMjhbTkxTVzEyOF0gPSBMT19XT1JEKGFjYyk7Ci0JCWFkZDEyOChhY2MxMjgsIGMpOwotCX0KLQkvKiBUaGUgZmlyc3QgYW5kIGxhc3Qgd29yZHMgKi8KLQlpZiAoSElfV09SRChhKSAmJiBMT19XT1JEKGIpKSB7Ci0JCWFjYyA9IChsb25nIGxvbmcpIEhJX1dPUkQoYSkgKiBMT19XT1JEKGIpOwotCQlhY2MxMjhbTk1TVzEyOF0gPSBISV9XT1JEKGFjYyk7Ci0JCWFjYzEyOFtOTFNXMTI4XSA9IExPX1dPUkQoYWNjKTsKLQkJYWRkMTI4KGFjYzEyOCwgYyk7Ci0JfQotfQotCi0vKiBOb3RlOiB1bnNpZ25lZCAqLwotc3RhdGljIGlubGluZSBpbnQgY21wMTI4KGludDEyOCBhLCBpbnQxMjggYikKLXsKLQlpZiAoYVtNU1cxMjhdIDwgYltNU1cxMjhdKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGFbTVNXMTI4XSA+IGJbTVNXMTI4XSkKLQkJcmV0dXJuIDE7Ci0JaWYgKGFbTk1TVzEyOF0gPCBiW05NU1cxMjhdKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGFbTk1TVzEyOF0gPiBiW05NU1cxMjhdKQotCQlyZXR1cm4gMTsKLQlpZiAoYVtOTFNXMTI4XSA8IGJbTkxTVzEyOF0pCi0JCXJldHVybiAtMTsKLQlpZiAoYVtOTFNXMTI4XSA+IGJbTkxTVzEyOF0pCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIChzaWduZWQpIGFbTFNXMTI4XSAtIGJbTFNXMTI4XTsKLX0KLQotaW5saW5lIHZvaWQgZGl2MTI4KGludDEyOCBhLCBpbnQxMjggYiwgaW50MTI4IGMpCi17Ci0JaW50MTI4IG1hc2s7Ci0KLQkvKiBBbGdvcml0aG06Ci0KLQkgICBTaGlmdCB0aGUgZGl2aXNvciB1bnRpbCBpdCdzIGF0IGxlYXN0IGFzIGJpZyBhcyB0aGUKLQkgICBkaXZpZGVuZCwga2VlcGluZyB0cmFjayBvZiB0aGUgcG9zaXRpb24gdG8gd2hpY2ggd2UndmUKLQkgICBzaGlmdGVkIGl0LCBpLmUuIHRoZSBwb3dlciBvZiAyIHdoaWNoIHdlJ3ZlIG11bHRpcGxpZWQgaXQKLQkgICBieS4KLQotCSAgIFRoZW4sIGZvciB0aGlzIHBvd2VyIG9mIDIgKHRoZSBtYXNrKSwgYW5kIGV2ZXJ5IG9uZSBzbWFsbGVyCi0JICAgdGhhbiBpdCwgc3VidHJhY3QgdGhlIG1hc2sgZnJvbSB0aGUgZGl2aWRlbmQgYW5kIGFkZCBpdCB0bwotCSAgIHRoZSBxdW90aWVudCB1bnRpbCB0aGUgZGl2aWRlbmQgaXMgc21hbGxlciB0aGFuIHRoZSByYWlzZWQKLQkgICBkaXZpc29yLiAgQXQgdGhpcyBwb2ludCwgZGl2aWRlIHRoZSBkaXZpZGVuZCBhbmQgdGhlIG1hc2sKLQkgICBieSAyIChpLmUuIHNoaWZ0IG9uZSBwbGFjZSB0byB0aGUgcmlnaHQpLiAgTGF0aGVyLCByaW5zZSwKLQkgICBhbmQgcmVwZWF0LCB1bnRpbCB0aGVyZSBhcmUgbm8gbW9yZSBwb3dlcnMgb2YgMiBsZWZ0LiAqLwotCi0JLyogRklYTUU6IG5lZWRsZXNzIHRvIHNheSwgdGhlcmUncyByb29tIGZvciBpbXByb3ZlbWVudCBoZXJlIHRvby4gKi8KLQotCS8qIFNoaWZ0IHVwICovCi0JLyogWFhYOiBzaW5jZSBpdCBqdXN0IGhhcyB0byBiZSAiYXQgbGVhc3QgYXMgYmlnIiwgd2UgY2FuCi0JICAgcHJvYmFibHkgZWxpbWluYXRlIHRoaXMgaG9ycmlibHkgd2FzdGVmdWwgbG9vcC4gIEkgd2lsbAotCSAgIGhhdmUgdG8gcHJvdmUgdGhpcyBmaXJzdCwgdGhvdWdoICovCi0Jc2V0MTI4KDAsIDAsIDAsIDEsIG1hc2spOwotCXdoaWxlIChjbXAxMjgoYiwgYSkgPCAwICYmICFidHN0aGkxMjgoYikpIHsKLQkJbHNsb25lMTI4KGIpOwotCQlsc2xvbmUxMjgobWFzayk7Ci0JfQotCi0JLyogU2hpZnQgZG93biAqLwotCXplcm8xMjgoYyk7Ci0JZG8gewotCQlpZiAoY21wMTI4KGEsIGIpID49IDApIHsKLQkJCXN1YjEyOChiLCBhKTsKLQkJCWFkZDEyOChtYXNrLCBjKTsKLQkJfQotCQlsc3JvbmUxMjgobWFzayk7Ci0JCWxzcm9uZTEyOChiKTsKLQl9IHdoaWxlIChub256ZXJvcDEyOChtYXNrKSk7Ci0KLQkvKiBUaGUgcmVtYWluZGVyIGlzIGluIGEuLi4gKi8KLX0KLSNlbmRpZgotCiAjZW5kaWYJLyogTVVMVElfQVJJVEhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21tL2luaXRfbW0uYyBiL2FyY2gvbTY4ay9tbS9pbml0X21tLmMKaW5kZXggOTExM2MyZi4uYmJlNTI1NCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21tL2luaXRfbW0uYworKysgYi9hcmNoL202OGsvbW0vaW5pdF9tbS5jCkBAIC04MywxMSArODMsNiBAQAogCWludCBpbml0cGFnZXMgPSAwOwogCWludCBpOwogCi0jaWZkZWYgQ09ORklHX0FUQVJJCi0JaWYgKE1BQ0hfSVNfQVRBUkkpCi0JCWF0YXJpX3N0cmFtX21lbV9pbml0X2hvb2soKTsKLSNlbmRpZgotCiAJLyogdGhpcyB3aWxsIHB1dCBhbGwgbWVtb3J5IG9udG8gdGhlIGZyZWVsaXN0cyAqLwogCXRvdGFscmFtX3BhZ2VzID0gbnVtX3BoeXNwYWdlcyA9IDA7CiAJZm9yX2VhY2hfb25saW5lX3BnZGF0KHBnZGF0KSB7CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9LY29uZmlnIGIvYXJjaC9wYXJpc2MvS2NvbmZpZwppbmRleCA2NWFkYzg2Li5lMDc3YjBiIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9LY29uZmlnCisrKyBiL2FyY2gvcGFyaXNjL0tjb25maWcKQEAgLTE1LDYgKzE1LDcgQEAKIAlzZWxlY3QgSEFWRV9HRU5FUklDX0hBUkRJUlFTCiAJc2VsZWN0IEdFTkVSSUNfSVJRX1BST0JFCiAJc2VsZWN0IElSUV9QRVJfQ1BVCisJc2VsZWN0IEFSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHCiAKIAloZWxwCiAJICBUaGUgUEEtUklTQyBtaWNyb3Byb2Nlc3NvciBpcyBkZXNpZ25lZCBieSBIZXdsZXR0LVBhY2thcmQgYW5kIHVzZWQKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggYjFkYzcxZi4uNDA1NGIzMSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTI1OCwxMCArMjU4LDEwIEBACiAKICNkZWZpbmUgQVRPTUlDNjRfSU5JVChpKSAoKGF0b21pYzY0X3QpIHsgKGkpIH0pCiAKLXN0YXRpYyBfX2lubGluZV9fIGludAorc3RhdGljIF9faW5saW5lX18gczY0CiBfX2F0b21pYzY0X2FkZF9yZXR1cm4oczY0IGksIGF0b21pYzY0X3QgKnYpCiB7Ci0JaW50IHJldDsKKwlzNjQgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJX2F0b21pY19zcGluX2xvY2tfaXJxc2F2ZSh2LCBmbGFncyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2Z1dGV4LmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9mdXRleC5oCmluZGV4IDY3YTMzY2MuLjIzODhiZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2Z1dGV4LmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vZnV0ZXguaApAQCAtNSwxMSArNSwxNCBAQAogCiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogCiBzdGF0aWMgaW5saW5lIGludAogZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIHUzMiBfX3VzZXIgKnVhZGRyKQogeworCXVuc2lnbmVkIGxvbmcgaW50IGZsYWdzOworCXUzMiB2YWw7CiAJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKIAlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CiAJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CkBAIC0xOCwyMSArMjEsNTggQEAKIAlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCiAJCW9wYXJnID0gMSA8PCBvcGFyZzsKIAotCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKHUzMikpKQorCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZigqdWFkZHIpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlwYWdlZmF1bHRfZGlzYWJsZSgpOwogCisJX2F0b21pY19zcGluX2xvY2tfaXJxc2F2ZSh1YWRkciwgZmxhZ3MpOworCiAJc3dpdGNoIChvcCkgewogCWNhc2UgRlVURVhfT1BfU0VUOgorCQkvKiAqKGludCAqKVVBRERSMiA9IE9QQVJHOyAqLworCQlyZXQgPSBnZXRfdXNlcihvbGR2YWwsIHVhZGRyKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBwdXRfdXNlcihvcGFyZywgdWFkZHIpOworCQlicmVhazsKIAljYXNlIEZVVEVYX09QX0FERDoKKwkJLyogKihpbnQgKilVQUREUjIgKz0gT1BBUkc7ICovCisJCXJldCA9IGdldF91c2VyKG9sZHZhbCwgdWFkZHIpOworCQlpZiAoIXJldCkgeworCQkJdmFsID0gb2xkdmFsICsgb3Bhcmc7CisJCQlyZXQgPSBwdXRfdXNlcih2YWwsIHVhZGRyKTsKKwkJfQorCQlicmVhazsKIAljYXNlIEZVVEVYX09QX09SOgorCQkvKiAqKGludCAqKVVBRERSMiB8PSBPUEFSRzsgKi8KKwkJcmV0ID0gZ2V0X3VzZXIob2xkdmFsLCB1YWRkcik7CisJCWlmICghcmV0KSB7CisJCQl2YWwgPSBvbGR2YWwgfCBvcGFyZzsKKwkJCXJldCA9IHB1dF91c2VyKHZhbCwgdWFkZHIpOworCQl9CisJCWJyZWFrOwogCWNhc2UgRlVURVhfT1BfQU5ETjoKKwkJLyogKihpbnQgKilVQUREUjIgJj0gfk9QQVJHOyAqLworCQlyZXQgPSBnZXRfdXNlcihvbGR2YWwsIHVhZGRyKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXZhbCA9IG9sZHZhbCAmIH5vcGFyZzsKKwkJCXJldCA9IHB1dF91c2VyKHZhbCwgdWFkZHIpOworCQl9CisJCWJyZWFrOwogCWNhc2UgRlVURVhfT1BfWE9SOgorCQkvKiAqKGludCAqKVVBRERSMiBePSBPUEFSRzsgKi8KKwkJcmV0ID0gZ2V0X3VzZXIob2xkdmFsLCB1YWRkcik7CisJCWlmICghcmV0KSB7CisJCQl2YWwgPSBvbGR2YWwgXiBvcGFyZzsKKwkJCXJldCA9IHB1dF91c2VyKHZhbCwgdWFkZHIpOworCQl9CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldCA9IC1FTk9TWVM7CiAJfQogCisJX2F0b21pY19zcGluX3VubG9ja19pcnFyZXN0b3JlKHVhZGRyLCBmbGFncyk7CisKIAlwYWdlZmF1bHRfZW5hYmxlKCk7CiAKIAlpZiAoIXJldCkgewpAQCAtNTQsNyArOTQsOSBAQAogZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWModTMyICp1dmFsLCB1MzIgX191c2VyICp1YWRkciwKIAkJCSAgICAgIHUzMiBvbGR2YWwsIHUzMiBuZXd2YWwpCiB7CisJaW50IHJldDsKIAl1MzIgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBmdXRleC5jIHdhbnRzIHRvIGRvIGEgY21weGNoZ19pbmF0b21pYyBvbiBrZXJuZWwgTlVMTCwgd2hpY2ggaXMKIAkgKiBvdXIgZ2F0ZXdheSBwYWdlLCBhbmQgY2F1c2VzIG5vIGVuZCBvZiB0cm91YmxlLi4uCkBAIC02NSwxMiArMTA3LDI0IEBACiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKHUzMikpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmIChnZXRfdXNlcih2YWwsIHVhZGRyKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKHZhbCA9PSBvbGR2YWwgJiYgcHV0X3VzZXIobmV3dmFsLCB1YWRkcikpCi0JCXJldHVybiAtRUZBVUxUOworCS8qIEhQUEEgaGFzIG5vIGNtcHhjaGcgaW4gaGFyZHdhcmUgYW5kIHRoZXJlZm9yZSB0aGUKKwkgKiBiZXN0IHdlIGNhbiBkbyBoZXJlIGlzIHVzZSBhbiBhcnJheSBvZiBsb2Nrcy4gVGhlCisJICogbG9jayBzZWxlY3RlZCBpcyBiYXNlZCBvbiBhIGhhc2ggb2YgdGhlIHVzZXJzcGFjZQorCSAqIGFkZHJlc3MuIFRoaXMgc2hvdWxkIHNjYWxlIHRvIGEgY291cGxlIG9mIENQVXMuCisJICovCisKKwlfYXRvbWljX3NwaW5fbG9ja19pcnFzYXZlKHVhZGRyLCBmbGFncyk7CisKKwlyZXQgPSBnZXRfdXNlcih2YWwsIHVhZGRyKTsKKworCWlmICghcmV0ICYmIHZhbCA9PSBvbGR2YWwpCisJCXJldCA9IHB1dF91c2VyKG5ld3ZhbCwgdWFkZHIpOworCiAJKnV2YWwgPSB2YWw7Ci0JcmV0dXJuIDA7CisKKwlfYXRvbWljX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUodWFkZHIsIGZsYWdzKTsKKworCXJldHVybiByZXQ7CiB9CiAKICNlbmRpZiAvKl9fS0VSTkVMX18qLwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vdW5pc3RkLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS91bmlzdGQuaAppbmRleCAzMzkyZGUzLi5kNjFkZTY0IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS91bmlzdGQuaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS91bmlzdGQuaApAQCAtODIxLDggKzgyMSw5IEBACiAjZGVmaW5lIF9fTlJfb3Blbl9ieV9oYW5kbGVfYXQJKF9fTlJfTGludXggKyAzMjYpCiAjZGVmaW5lIF9fTlJfc3luY2ZzCQkoX19OUl9MaW51eCArIDMyNykKICNkZWZpbmUgX19OUl9zZXRucwkJKF9fTlJfTGludXggKyAzMjgpCisjZGVmaW5lIF9fTlJfc2VuZG1tc2cJCShfX05SX0xpbnV4ICsgMzI5KQogCi0jZGVmaW5lIF9fTlJfTGludXhfc3lzY2FsbHMJKF9fTlJfc2V0bnMgKyAxKQorI2RlZmluZSBfX05SX0xpbnV4X3N5c2NhbGxzCShfX05SX3NlbmRtbXNnICsgMSkKIAogCiAjZGVmaW5lIF9fSUdOT1JFX3NlbGVjdAkJLyogbmV3c2VsZWN0ICovCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzY2FsbF90YWJsZS5TIGIvYXJjaC9wYXJpc2Mva2VybmVsL3N5c2NhbGxfdGFibGUuUwppbmRleCAzNGE0ZjVhLi5lNjYzNjZmIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKQEAgLTQyNyw2ICs0MjcsNyBAQAogCUVOVFJZX0NPTVAob3Blbl9ieV9oYW5kbGVfYXQpCiAJRU5UUllfU0FNRShzeW5jZnMpCiAJRU5UUllfU0FNRShzZXRucykKKwlFTlRSWV9DT01QKHNlbmRtbXNnKQogCiAJLyogTm90aGluZyB5ZXQgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwppbmRleCAzNzRjNDc1Li42OTI2YjYxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwpAQCAtMTM2LDYgKzEzNiw3IEBACiAJc2VsZWN0IEhBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUwogCXNlbGVjdCBIQVZFX0JQRl9KSVQgaWYgKFBQQzY0ICYmIE5FVCkKIAlzZWxlY3QgSEFWRV9BUkNIX0pVTVBfTEFCRUwKKwlzZWxlY3QgQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKIAogY29uZmlnIEVBUkxZX1BSSU5USwogCWJvb2wKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9LY29uZmlnIGIvYXJjaC9zMzkwL0tjb25maWcKaW5kZXggYzAzZmVmNy4uZWQ1Y2I1YSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL0tjb25maWcKKysrIGIvYXJjaC9zMzkwL0tjb25maWcKQEAgLTgxLDYgKzgxLDcgQEAKIAlzZWxlY3QgSU5JVF9BTExfUE9TU0lCTEUKIAlzZWxlY3QgSEFWRV9JUlFfV09SSwogCXNlbGVjdCBIQVZFX1BFUkZfRVZFTlRTCisJc2VsZWN0IEFSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHCiAJc2VsZWN0IEhBVkVfS0VSTkVMX0daSVAKIAlzZWxlY3QgSEFWRV9LRVJORUxfQlpJUDIKIAlzZWxlY3QgSEFWRV9LRVJORUxfTFpNQQpAQCAtMjczLDExICsyNzQsMTEgQEAKIAkgIG9uIG9sZGVyIG1hY2hpbmVzLgogCiBjb25maWcgTUFSQ0hfWjE5NgotCWJvb2wgIklCTSB6RW50ZXJwcmlzZSAxOTYiCisJYm9vbCAiSUJNIHpFbnRlcnByaXNlIDExNCBhbmQgMTk2IgogCWhlbHAKLQkgIFNlbGVjdCB0aGlzIHRvIGVuYWJsZSBvcHRpbWl6YXRpb25zIGZvciBJQk0gekVudGVycHJpc2UgMTk2Ci0JICAoMjgxNyBzZXJpZXMpLiBUaGUga2VybmVsIHdpbGwgYmUgc2xpZ2h0bHkgZmFzdGVyIGJ1dCB3aWxsIG5vdCB3b3JrCi0JICBvbiBvbGRlciBtYWNoaW5lcy4KKwkgIFNlbGVjdCB0aGlzIHRvIGVuYWJsZSBvcHRpbWl6YXRpb25zIGZvciBJQk0gekVudGVycHJpc2UgMTE0IGFuZCAxOTYKKwkgICgyODE4IGFuZCAyODE3IHNlcmllcykuIFRoZSBrZXJuZWwgd2lsbCBiZSBzbGlnaHRseSBmYXN0ZXIgYnV0IHdpbGwKKwkgIG5vdCB3b3JrIG9uIG9sZGVyIG1hY2hpbmVzLgogCiBlbmRjaG9pY2UKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2lwbC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2lwbC5oCmluZGV4IDVlOTVkOTUuLjk3Y2M0NDAgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9pcGwuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vaXBsLmgKQEAgLTE2Nyw1ICsxNjcsNiBAQAogfTsKIAogZXh0ZXJuIGludCBkaWFnMzA4KHVuc2lnbmVkIGxvbmcgc3ViY29kZSwgdm9pZCAqYWRkcik7CitleHRlcm4gdm9pZCBkaWFnMzA4X3Jlc2V0KHZvaWQpOwogCiAjZW5kaWYgLyogX0FTTV9TMzkwX0lQTF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbG93Y29yZS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2xvd2NvcmUuaAppbmRleCBmMjYyODBkLi5lODVjOTExIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbG93Y29yZS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9sb3djb3JlLmgKQEAgLTE4LDYgKzE4LDcgQEAKIHZvaWQgcGdtX2NoZWNrX2hhbmRsZXIodm9pZCk7CiB2b2lkIG1jY2tfaW50X2hhbmRsZXIodm9pZCk7CiB2b2lkIGlvX2ludF9oYW5kbGVyKHZvaWQpOwordm9pZCBwc3dfcmVzdGFydF9pbnRfaGFuZGxlcih2b2lkKTsKIAogI2lmZGVmIENPTkZJR18zMkJJVAogCkBAIC0xNTAsNyArMTUxLDEwIEBACiAJICovCiAJX191MzIJaXBpYjsJCQkJLyogMHgwZTAwICovCiAJX191MzIJaXBpYl9jaGVja3N1bTsJCQkvKiAweDBlMDQgKi8KLQlfX3U4CXBhZF8weDBlMDhbMHgwZjAwLTB4MGUwOF07CS8qIDB4MGUwOCAqLworCisJLyogNjQgYml0IHNhdmUgYXJlYSAqLworCV9fdTY0CXNhdmVfYXJlYV82NDsJCQkvKiAweDBlMDggKi8KKwlfX3U4CXBhZF8weDBlMTBbMHgwZjAwLTB4MGUxMF07CS8qIDB4MGUxMCAqLwogCiAJLyogRXh0ZW5kZWQgZmFjaWxpdHkgbGlzdCAqLwogCV9fdTY0CXN0ZmxlX2ZhY19saXN0WzMyXTsJCS8qIDB4MGYwMCAqLwpAQCAtMjg2LDcgKzI5MCwxMCBAQAogCSAqLwogCV9fdTY0CWlwaWI7CQkJCS8qIDB4MGUwMCAqLwogCV9fdTMyCWlwaWJfY2hlY2tzdW07CQkJLyogMHgwZTA4ICovCi0JX191OAlwYWRfMHgwZTBjWzB4MGYwMC0weDBlMGNdOwkvKiAweDBlMGMgKi8KKworCS8qIDY0IGJpdCBzYXZlIGFyZWEgKi8KKwlfX3U2NAlzYXZlX2FyZWFfNjQ7CQkJLyogMHgwZTBjICovCisJX191OAlwYWRfMHgwZTE0WzB4MGYwMC0weDBlMTRdOwkvKiAweDBlMTQgKi8KIAogCS8qIEV4dGVuZGVkIGZhY2lsaXR5IGxpc3QgKi8KIAlfX3U2NAlzdGZsZV9mYWNfbGlzdFszMl07CQkvKiAweDBmMDAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCA1NWRmY2M4Li5hNGI2MjI5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC0xMTksMTQgKzExOSwxMiBAQAogICogRG8gbmVjZXNzYXJ5IHNldHVwIHRvIHN0YXJ0IHVwIGEgbmV3IHRocmVhZC4KICAqLwogI2RlZmluZSBzdGFydF90aHJlYWQocmVncywgbmV3X3BzdywgbmV3X3N0YWNrcCkgZG8gewkJXAotCXNldF9mcyhVU0VSX0RTKTsJCQkJCVwKIAlyZWdzLT5wc3cubWFzawk9IHBzd191c2VyX2JpdHM7CQkJXAogCXJlZ3MtPnBzdy5hZGRyCT0gbmV3X3BzdyB8IFBTV19BRERSX0FNT0RFOwkJXAogCXJlZ3MtPmdwcnNbMTVdCT0gbmV3X3N0YWNrcDsJCQkJXAogfSB3aGlsZSAoMCkKIAogI2RlZmluZSBzdGFydF90aHJlYWQzMShyZWdzLCBuZXdfcHN3LCBuZXdfc3RhY2twKSBkbyB7CQlcCi0Jc2V0X2ZzKFVTRVJfRFMpOwkJCQkJXAogCXJlZ3MtPnBzdy5tYXNrCT0gcHN3X3VzZXIzMl9iaXRzOwkJCVwKIAlyZWdzLT5wc3cuYWRkcgk9IG5ld19wc3cgfCBQU1dfQUREUl9BTU9ERTsJCVwKIAlyZWdzLT5ncHJzWzE1XQk9IG5ld19zdGFja3A7CQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zeXN0ZW0uaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zeXN0ZW0uaAppbmRleCBkMzgyNjI5Li42NTgyZjY5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3lzdGVtLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N5c3RlbS5oCkBAIC0xMTMsNiArMTEzLDcgQEAKIAogZXh0ZXJuIHZvaWQgY21tYV9pbml0KHZvaWQpOwogZXh0ZXJuIGludCBtZW1jcHlfcmVhbCh2b2lkICosIHZvaWQgKiwgc2l6ZV90KTsKK2V4dGVybiB2b2lkIGNvcHlfdG9fYWJzb2x1dGVfemVybyh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHNpemVfdCBjb3VudCk7CiAKICNkZWZpbmUgZmluaXNoX2FyY2hfc3dpdGNoKHByZXYpIGRvIHsJCQkJCSAgICAgXAogCXNldF9mcyhjdXJyZW50LT50aHJlYWQubW1fc2VnbWVudCk7CQkJCSAgICAgXApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9zMzkwL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDA1ZDhmMzguLjUzMmZkNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTI3LDEyICsyNyw5IEBACiAJQkxBTksoKTsKIAlERUZJTkUoX19UQVNLX3BpZCwgb2Zmc2V0b2Yoc3RydWN0IHRhc2tfc3RydWN0LCBwaWQpKTsKIAlCTEFOSygpOwotCURFRklORShfX1RIUkVBRF9wZXJfY2F1c2UsCi0JICAgICAgIG9mZnNldG9mKHN0cnVjdCB0YXNrX3N0cnVjdCwgdGhyZWFkLnBlcl9ldmVudC5jYXVzZSkpOwotCURFRklORShfX1RIUkVBRF9wZXJfYWRkcmVzcywKLQkgICAgICAgb2Zmc2V0b2Yoc3RydWN0IHRhc2tfc3RydWN0LCB0aHJlYWQucGVyX2V2ZW50LmFkZHJlc3MpKTsKLQlERUZJTkUoX19USFJFQURfcGVyX3BhaWQsCi0JICAgICAgIG9mZnNldG9mKHN0cnVjdCB0YXNrX3N0cnVjdCwgdGhyZWFkLnBlcl9ldmVudC5wYWlkKSk7CisJREVGSU5FKF9fVEhSRUFEX3Blcl9jYXVzZSwgb2Zmc2V0b2Yoc3RydWN0IHRhc2tfc3RydWN0LCB0aHJlYWQucGVyX2V2ZW50LmNhdXNlKSk7CisJREVGSU5FKF9fVEhSRUFEX3Blcl9hZGRyZXNzLCBvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRocmVhZC5wZXJfZXZlbnQuYWRkcmVzcykpOworCURFRklORShfX1RIUkVBRF9wZXJfcGFpZCwgb2Zmc2V0b2Yoc3RydWN0IHRhc2tfc3RydWN0LCB0aHJlYWQucGVyX2V2ZW50LnBhaWQpKTsKIAlCTEFOSygpOwogCURFRklORShfX1RJX3Rhc2ssIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgdGFzaykpOwogCURFRklORShfX1RJX2RvbWFpbiwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBleGVjX2RvbWFpbikpOwpAQCAtMTQyLDYgKzEzOSw3IEBACiAJREVGSU5FKF9fTENfRlBSRUdTX1NBVkVfQVJFQSwgb2Zmc2V0b2Yoc3RydWN0IF9sb3djb3JlLCBmbG9hdGluZ19wdF9zYXZlX2FyZWEpKTsKIAlERUZJTkUoX19MQ19HUFJFR1NfU0FWRV9BUkVBLCBvZmZzZXRvZihzdHJ1Y3QgX2xvd2NvcmUsIGdwcmVnc19zYXZlX2FyZWEpKTsKIAlERUZJTkUoX19MQ19DUkVHU19TQVZFX0FSRUEsIG9mZnNldG9mKHN0cnVjdCBfbG93Y29yZSwgY3JlZ3Nfc2F2ZV9hcmVhKSk7CisJREVGSU5FKF9fTENfU0FWRV9BUkVBXzY0LCBvZmZzZXRvZihzdHJ1Y3QgX2xvd2NvcmUsIHNhdmVfYXJlYV82NCkpOwogI2lmZGVmIENPTkZJR18zMkJJVAogCURFRklORShTQVZFX0FSRUFfQkFTRSwgb2Zmc2V0b2Yoc3RydWN0IF9sb3djb3JlLCBleHRlbmRlZF9zYXZlX2FyZWFfYWRkcikpOwogI2Vsc2UgLyogQ09ORklHXzMyQklUICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2Jhc2UuUyBiL2FyY2gvczM5MC9rZXJuZWwvYmFzZS5TCmluZGV4IDIwOTkzOGMuLjI1NTQzNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvYmFzZS5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvYmFzZS5TCkBAIC03Niw2ICs3Niw0MiBAQAogCS5xdWFkCTAKIAkucHJldmlvdXMKIAorIworIyBDYWxscyBkaWFnIDMwOCBzdWJjb2RlIDEgYW5kIGNvbnRpbnVlcyBleGVjdXRpb24KKyMKKyMgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIG11c3QgYmUgZW5zdXJlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uOgorIyAqIFByZWZpeCByZWdpc3RlciA9IDAKKyMgKiBMb3djb3JlIHByb3RlY3Rpb24gaXMgZGlzYWJsZWQKKyMKK0VOVFJZKGRpYWczMDhfcmVzZXQpCisJbGFybAklcjQsLkxjdGxyZWdzCQkjIFNhdmUgY29udHJvbCByZWdpc3RlcnMKKwlzdGN0ZwklYzAsJWMxNSwwKCVyNCkKKwlsYXJsCSVyNCwuTHJlc3RhcnRfcHN3CSMgU2V0dXAgcmVzdGFydCBQU1cgYXQgYWJzb2x1dGUgMAorCWxnaGkJJXIzLDAKKwlsZwklcjQsMCglcjQpCQkjIFNhdmUgUFNXCisJc3R1cmcJJXI0LCVyMwkJCSMgVXNlIHN0dXJnLCBiZWNhdXNlIG9mIGxhcmdlIHBhZ2VzCisJbGdoaQklcjEsMQorCWRpYWcJJXIxLCVyMSwweDMwOAorLkxyZXN0YXJ0X3BhcnQyOgorCWxoaQklcjAsMAkJCSMgTG9hZCByMCB3aXRoIHplcm8KKwlsaGkJJXIxLDIJCQkjIFVzZSBtb2RlIDIgPSBFU0FNRSAoZHVtcCkKKwlzaWdwCSVyMSwlcjAsMHgxMgkJIyBTd2l0Y2ggdG8gRVNBTUUgbW9kZQorCXNhbTY0CQkJCSMgU3dpdGNoIHRvIDY0IGJpdCBhZGRyZXNzaW5nIG1vZGUKKwlsYXJsCSVyNCwuTGN0bHJlZ3MJCSMgUmVzdG9yZSBjb250cm9sIHJlZ2lzdGVycworCWxjdGxnCSVjMCwlYzE1LDAoJXI0KQorCWJyCSVyMTQKKy5hbGlnbiAxNgorLkxyZXN0YXJ0X3BzdzoKKwkubG9uZwkweDAwMDgwMDAwLDB4ODAwMDAwMDAgKyAuTHJlc3RhcnRfcGFydDIKKworCS5zZWN0aW9uIC5ic3MKKy5hbGlnbiA4CisuTGN0bHJlZ3M6CisJLnJlcHQJMTYKKwkucXVhZAkwCisJLmVuZHIKKwkucHJldmlvdXMKKwogI2Vsc2UgLyogQ09ORklHXzY0QklUICovCiAKIEVOVFJZKHMzOTBfYmFzZV9tY2NrX2hhbmRsZXIpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3NpZ25hbC5jCmluZGV4IGVlZTk5OTguLmE5YTI4NWIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3NpZ25hbC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3NpZ25hbC5jCkBAIC0zODAsMjAgKzM4MCwxMyBAQAogCQlnb3RvIGJhZGZyYW1lOwogCWlmIChfX2NvcHlfZnJvbV91c2VyKCZzZXQuc2lnLCAmZnJhbWUtPnNjLm9sZG1hc2ssIF9TSUdNQVNLX0NPUFlfU0laRTMyKSkKIAkJZ290byBiYWRmcmFtZTsKLQogCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOwotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBzZXQ7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCisJc2V0X2N1cnJlbnRfYmxvY2tlZCgmc2V0KTsKIAlpZiAocmVzdG9yZV9zaWdyZWdzMzIocmVncywgJmZyYW1lLT5zcmVncykpCiAJCWdvdG8gYmFkZnJhbWU7CiAJaWYgKHJlc3RvcmVfc2lncmVnc19ncHJzX2hpZ2gocmVncywgZnJhbWUtPmdwcnNfaGlnaCkpCiAJCWdvdG8gYmFkZnJhbWU7Ci0KIAlyZXR1cm4gcmVncy0+Z3Byc1syXTsKLQogYmFkZnJhbWU6CiAJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwogCXJldHVybiAwOwpAQCAtNDEzLDMxICs0MDYsMjIgQEAKIAkJZ290byBiYWRmcmFtZTsKIAlpZiAoX19jb3B5X2Zyb21fdXNlcigmc2V0LCAmZnJhbWUtPnVjLnVjX3NpZ21hc2ssIHNpemVvZihzZXQpKSkKIAkJZ290byBiYWRmcmFtZTsKLQogCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOwotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBzZXQ7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCisJc2V0X2N1cnJlbnRfYmxvY2tlZCgmc2V0KTsKIAlpZiAocmVzdG9yZV9zaWdyZWdzMzIocmVncywgJmZyYW1lLT51Yy51Y19tY29udGV4dCkpCiAJCWdvdG8gYmFkZnJhbWU7CiAJaWYgKHJlc3RvcmVfc2lncmVnc19ncHJzX2hpZ2gocmVncywgZnJhbWUtPmdwcnNfaGlnaCkpCiAJCWdvdG8gYmFkZnJhbWU7Ci0KIAllcnIgPSBfX2dldF91c2VyKHNzX3NwLCAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX3NwKTsKIAlzdC5zc19zcCA9IGNvbXBhdF9wdHIoc3Nfc3ApOwogCWVyciB8PSBfX2dldF91c2VyKHN0LnNzX3NpemUsICZmcmFtZS0+dWMudWNfc3RhY2suc3Nfc2l6ZSk7CiAJZXJyIHw9IF9fZ2V0X3VzZXIoc3Quc3NfZmxhZ3MsICZmcmFtZS0+dWMudWNfc3RhY2suc3NfZmxhZ3MpOwogCWlmIChlcnIpCiAJCWdvdG8gYmFkZnJhbWU7IAotCiAJc2V0X2ZzIChLRVJORUxfRFMpOwogCWRvX3NpZ2FsdHN0YWNrKChzdGFja190IF9fZm9yY2UgX191c2VyICopJnN0LCBOVUxMLCByZWdzLT5ncHJzWzE1XSk7CiAJc2V0X2ZzIChvbGRfZnMpOwotCiAJcmV0dXJuIHJlZ3MtPmdwcnNbMl07Ci0KIGJhZGZyYW1lOgogCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKIAlyZXR1cm4gMDsKQEAgLTYwNSwxMCArNTg5LDEwIEBACiAgKiBPSywgd2UncmUgaW52b2tpbmcgYSBoYW5kbGVyCiAgKi8JCiAKLWludAotaGFuZGxlX3NpZ25hbDMyKHVuc2lnbmVkIGxvbmcgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAotCQlzaWdpbmZvX3QgKmluZm8sIHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK2ludCBoYW5kbGVfc2lnbmFsMzIodW5zaWduZWQgbG9uZyBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCisJCSAgICBzaWdpbmZvX3QgKmluZm8sIHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogeworCXNpZ3NldF90IGJsb2NrZWQ7CiAJaW50IHJldDsKIAogCS8qIFNldCB1cCB0aGUgc3RhY2sgZnJhbWUgKi8KQEAgLTYxNiwxNSArNjAwLDEyIEBACiAJCXJldCA9IHNldHVwX3J0X2ZyYW1lMzIoc2lnLCBrYSwgaW5mbywgb2xkc2V0LCByZWdzKTsKIAllbHNlCiAJCXJldCA9IHNldHVwX2ZyYW1lMzIoc2lnLCBrYSwgb2xkc2V0LCByZWdzKTsKLQotCWlmIChyZXQgPT0gMCkgewotCQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQkJc2lnb3JzZXRzKCZjdXJyZW50LT5ibG9ja2VkLCZjdXJyZW50LT5ibG9ja2VkLCZrYS0+c2Euc2FfbWFzayk7Ci0JCWlmICghKGthLT5zYS5zYV9mbGFncyAmIFNBX05PREVGRVIpKQotCQkJc2lnYWRkc2V0KCZjdXJyZW50LT5ibG9ja2VkLHNpZyk7Ci0JCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JfQotCXJldHVybiByZXQ7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlzaWdvcnNldHMoJmJsb2NrZWQsICZjdXJyZW50LT5ibG9ja2VkLCAma2EtPnNhLnNhX21hc2spOworCWlmICghKGthLT5zYS5zYV9mbGFncyAmIFNBX05PREVGRVIpKQorCQlzaWdhZGRzZXQoJmJsb2NrZWQsIHNpZyk7CisJc2V0X2N1cnJlbnRfYmxvY2tlZCgmYmxvY2tlZCk7CisJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUwppbmRleCAzZWFiN2NmLi4wMmVjOGZlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TCkBAIC04NDksNiArODQ5LDM0IEBACiByZXN0YXJ0X2dvOgogI2VuZGlmCiAKKyMKKyMgUFNXIHJlc3RhcnQgaW50ZXJydXB0IGhhbmRsZXIKKyMKK0VOVFJZKHBzd19yZXN0YXJ0X2ludF9oYW5kbGVyKQorCXN0CSVyMTUsX19MQ19TQVZFX0FSRUFfNjQoJXIwKQkjIHNhdmUgcjE1CisJYmFzcgklcjE1LDAKKzA6CWwJJXIxNSwuTHJlc3RhcnRfc3RhY2stMGIoJXIxNSkJIyBsb2FkIHJlc3RhcnQgc3RhY2sKKwlsCSVyMTUsMCglcjE1KQorCWFoaQklcjE1LC1TUF9TSVpFCQkJIyBtYWtlIHJvb20gZm9yIHB0X3JlZ3MKKwlzdG0JJXIwLCVyMTQsU1BfUjAoJXIxNSkJCSMgc3RvcmUgZ3BycyAlcjAtJXIxNCB0byBzdGFjaworCW12YwlTUF9SMTUoNCwlcjE1KSxfX0xDX1NBVkVfQVJFQV82NCglcjApIyBzdG9yZSBzYXZlZCAlcjE1IHRvIHN0YWNrCisJbXZjCVNQX1BTVyg4LCVyMTUpLF9fTENfUlNUX09MRF9QU1coJXIwKSAjIHN0b3JlIHJlc3RhcnQgb2xkIHBzdworCXhjCV9fU0ZfQkFDS0NIQUlOKDQsJXIxNSksX19TRl9CQUNLQ0hBSU4oJXIxNSkgIyBzZXQgYmFja2NoYWluIHRvIDAKKwliYXNyCSVyMTQsMAorMToJbAklcjE0LC5MZG9fcmVzdGFydC0xYiglcjE0KQorCWJhc3IJJXIxNCwlcjE0CisKKwliYXNyCSVyMTQsMAkJCQkjIGxvYWQgZGlzYWJsZWQgd2FpdCBQU1cgaWYKKzI6CWxwc3cJcmVzdGFydF9wc3dfY3Jhc2gtMmIoJXIxNCkJIyBkb19yZXN0YXJ0IHJldHVybnMKKwkuYWxpZ24gNAorLkxkb19yZXN0YXJ0OgorCS5sb25nCWRvX3Jlc3RhcnQKKy5McmVzdGFydF9zdGFjazoKKwkubG9uZwlyZXN0YXJ0X3N0YWNrCisJLmFsaWduIDgKK3Jlc3RhcnRfcHN3X2NyYXNoOgorCS5sb25nCTB4MDAwYTAwMDAsMHgwMDAwMDAwMCArIHJlc3RhcnRfcHN3X2NyYXNoCisKIAkuc2VjdGlvbiAua3Byb2Jlcy50ZXh0LCAiYXgiCiAKICNpZmRlZiBDT05GSUdfQ0hFQ0tfU1RBQ0sKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMKaW5kZXggN2EwZmQ0Mi4uNWY3MjlkNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMKQEAgLTg2NSw2ICs4NjUsMjYgQEAKIHJlc3RhcnRfZ286CiAjZW5kaWYKIAorIworIyBQU1cgcmVzdGFydCBpbnRlcnJ1cHQgaGFuZGxlcgorIworRU5UUlkocHN3X3Jlc3RhcnRfaW50X2hhbmRsZXIpCisJc3RnCSVyMTUsX19MQ19TQVZFX0FSRUFfNjQoJXIwKQkjIHNhdmUgcjE1CisJbGFybAklcjE1LHJlc3RhcnRfc3RhY2sJCSMgbG9hZCByZXN0YXJ0IHN0YWNrCisJbGcJJXIxNSwwKCVyMTUpCisJYWdoaQklcjE1LC1TUF9TSVpFCQkJIyBtYWtlIHJvb20gZm9yIHB0X3JlZ3MKKwlzdG1nCSVyMCwlcjE0LFNQX1IwKCVyMTUpCQkjIHN0b3JlIGdwcnMgJXIwLSVyMTQgdG8gc3RhY2sKKwltdmMJU1BfUjE1KDgsJXIxNSksX19MQ19TQVZFX0FSRUFfNjQoJXIwKSMgc3RvcmUgc2F2ZWQgJXIxNSB0byBzdGFjaworCW12YwlTUF9QU1coMTYsJXIxNSksX19MQ19SU1RfT0xEX1BTVyglcjApIyBzdG9yZSByZXN0YXJ0IG9sZCBwc3cKKwl4YwlfX1NGX0JBQ0tDSEFJTig4LCVyMTUpLF9fU0ZfQkFDS0NIQUlOKCVyMTUpICMgc2V0IGJhY2tjaGFpbiB0byAwCisJYnJhc2wJJXIxNCxkb19yZXN0YXJ0CisKKwlsYXJsCSVyMTQscmVzdGFydF9wc3dfY3Jhc2gJCSMgbG9hZCBkaXNhYmxlZCB3YWl0IFBTVyBpZgorCWxwc3dlCTAoJXIxNCkJCQkJIyBkb19yZXN0YXJ0IHJldHVybnMKKwkuYWxpZ24gOAorcmVzdGFydF9wc3dfY3Jhc2g6CisJLnF1YWQJMHgwMDAyMDAwMDgwMDAwMDAwLDB4MDAwMDAwMDAwMDAwMDAwMCArIHJlc3RhcnRfcHN3X2NyYXNoCisKIAkuc2VjdGlvbiAua3Byb2Jlcy50ZXh0LCAiYXgiCiAKICNpZmRlZiBDT05GSUdfQ0hFQ0tfU1RBQ0sKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvaXBsLmMgYi9hcmNoL3MzOTAva2VybmVsL2lwbC5jCmluZGV4IGE2ODkwNzAuLjA0MzYxZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvaXBsLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9pcGwuYwpAQCAtNDUsMTEgKzQ1LDEzIEBACiAgKiAtIGhhbHQKICAqIC0gcG93ZXIgb2ZmCiAgKiAtIHJlaXBsCisgKiAtIHJlc3RhcnQKICAqLwogI2RlZmluZSBPTl9QQU5JQ19TVFIJCSJvbl9wYW5pYyIKICNkZWZpbmUgT05fSEFMVF9TVFIJCSJvbl9oYWx0IgogI2RlZmluZSBPTl9QT0ZGX1NUUgkJIm9uX3BvZmYiCiAjZGVmaW5lIE9OX1JFSVBMX1NUUgkJIm9uX3JlYm9vdCIKKyNkZWZpbmUgT05fUkVTVEFSVF9TVFIJCSJvbl9yZXN0YXJ0IgogCiBzdHJ1Y3Qgc2h1dGRvd25fYWN0aW9uOwogc3RydWN0IHNodXRkb3duX3RyaWdnZXIgewpAQCAtMTU0NCwxNyArMTU0NiwyMCBAQAogc3RhdGljIGNoYXIgdm1jbWRfb25fcGFuaWNbMTI4XTsKIHN0YXRpYyBjaGFyIHZtY21kX29uX2hhbHRbMTI4XTsKIHN0YXRpYyBjaGFyIHZtY21kX29uX3BvZmZbMTI4XTsKK3N0YXRpYyBjaGFyIHZtY21kX29uX3Jlc3RhcnRbMTI4XTsKIAogREVGSU5FX0lQTF9BVFRSX1NUUl9SVyh2bWNtZCwgb25fcmVib290LCAiJXNcbiIsICIlc1xuIiwgdm1jbWRfb25fcmVib290KTsKIERFRklORV9JUExfQVRUUl9TVFJfUlcodm1jbWQsIG9uX3BhbmljLCAiJXNcbiIsICIlc1xuIiwgdm1jbWRfb25fcGFuaWMpOwogREVGSU5FX0lQTF9BVFRSX1NUUl9SVyh2bWNtZCwgb25faGFsdCwgIiVzXG4iLCAiJXNcbiIsIHZtY21kX29uX2hhbHQpOwogREVGSU5FX0lQTF9BVFRSX1NUUl9SVyh2bWNtZCwgb25fcG9mZiwgIiVzXG4iLCAiJXNcbiIsIHZtY21kX29uX3BvZmYpOworREVGSU5FX0lQTF9BVFRSX1NUUl9SVyh2bWNtZCwgb25fcmVzdGFydCwgIiVzXG4iLCAiJXNcbiIsIHZtY21kX29uX3Jlc3RhcnQpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdm1jbWRfYXR0cnNbXSA9IHsKIAkmc3lzX3ZtY21kX29uX3JlYm9vdF9hdHRyLmF0dHIsCiAJJnN5c192bWNtZF9vbl9wYW5pY19hdHRyLmF0dHIsCiAJJnN5c192bWNtZF9vbl9oYWx0X2F0dHIuYXR0ciwKIAkmc3lzX3ZtY21kX29uX3BvZmZfYXR0ci5hdHRyLAorCSZzeXNfdm1jbWRfb25fcmVzdGFydF9hdHRyLmF0dHIsCiAJTlVMTCwKIH07CiAKQEAgLTE1NzYsNiArMTU4MSw4IEBACiAJCWNtZCA9IHZtY21kX29uX2hhbHQ7CiAJZWxzZSBpZiAoc3RyY21wKHRyaWdnZXItPm5hbWUsIE9OX1BPRkZfU1RSKSA9PSAwKQogCQljbWQgPSB2bWNtZF9vbl9wb2ZmOworCWVsc2UgaWYgKHN0cmNtcCh0cmlnZ2VyLT5uYW1lLCBPTl9SRVNUQVJUX1NUUikgPT0gMCkKKwkJY21kID0gdm1jbWRfb25fcmVzdGFydDsKIAllbHNlCiAJCXJldHVybjsKIApAQCAtMTcwNyw2ICsxNzE0LDM0IEBACiAJc3RvcF9ydW4oJm9uX3BhbmljX3RyaWdnZXIpOwogfQogCisvKiBvbiByZXN0YXJ0ICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2h1dGRvd25fdHJpZ2dlciBvbl9yZXN0YXJ0X3RyaWdnZXIgPSB7T05fUkVTVEFSVF9TVFIsCisJJnJlaXBsX2FjdGlvbn07CisKK3N0YXRpYyBzc2l6ZV90IG9uX3Jlc3RhcnRfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgICAgICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKnBhZ2UpCit7CisJcmV0dXJuIHNwcmludGYocGFnZSwgIiVzXG4iLCBvbl9yZXN0YXJ0X3RyaWdnZXIuYWN0aW9uLT5uYW1lKTsKK30KKworc3RhdGljIHNzaXplX3Qgb25fcmVzdGFydF9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXJldHVybiBzZXRfdHJpZ2dlcihidWYsICZvbl9yZXN0YXJ0X3RyaWdnZXIsIGxlbik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgb25fcmVzdGFydF9hdHRyID0KKwlfX0FUVFIob25fcmVzdGFydCwgMDY0NCwgb25fcmVzdGFydF9zaG93LCBvbl9yZXN0YXJ0X3N0b3JlKTsKKwordm9pZCBkb19yZXN0YXJ0KHZvaWQpCit7CisJc21wX3NlbmRfc3RvcCgpOworCW9uX3Jlc3RhcnRfdHJpZ2dlci5hY3Rpb24tPmZuKCZvbl9yZXN0YXJ0X3RyaWdnZXIpOworCXN0b3BfcnVuKCZvbl9yZXN0YXJ0X3RyaWdnZXIpOworfQorCiAvKiBvbiBoYWx0ICovCiAKIHN0YXRpYyBzdHJ1Y3Qgc2h1dGRvd25fdHJpZ2dlciBvbl9oYWx0X3RyaWdnZXIgPSB7T05fSEFMVF9TVFIsICZzdG9wX2FjdGlvbn07CkBAIC0xNzgzLDcgKzE4MTgsOSBAQAogCWlmIChzeXNmc19jcmVhdGVfZmlsZSgmc2h1dGRvd25fYWN0aW9uc19rc2V0LT5rb2JqLAogCQkJICAgICAgJm9uX3BvZmZfYXR0ci5hdHRyKSkKIAkJZ290byBmYWlsOwotCisJaWYgKHN5c2ZzX2NyZWF0ZV9maWxlKCZzaHV0ZG93bl9hY3Rpb25zX2tzZXQtPmtvYmosCisJCQkgICAgICAmb25fcmVzdGFydF9hdHRyLmF0dHIpKQorCQlnb3RvIGZhaWw7CiAJcmV0dXJuOwogZmFpbDoKIAlwYW5pYygic2h1dGRvd25fdHJpZ2dlcnNfaW5pdCBmYWlsZWRcbiIpOwpAQCAtMTk1OSw2ICsxOTk2LDEyIEBACiB7CiAJc3RydWN0IHJlc2V0X2NhbGwgKnJlc2V0OwogCisjaWZkZWYgQ09ORklHXzY0QklUCisJaWYgKGRpYWczMDhfc2V0X3dvcmtzKSB7CisJCWRpYWczMDhfcmVzZXQoKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgogCWxpc3RfZm9yX2VhY2hfZW50cnkocmVzZXQsICZyY2FsbCwgbGlzdCkKIAkJcmVzZXQtPmZuKCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3JlaXBsNjQuUyBiL2FyY2gvczM5MC9rZXJuZWwvcmVpcGw2NC5TCmluZGV4IDc4ZWI3Y2YuLmU2OTA5NzUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvcmVpcGw2NC5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcmVpcGw2NC5TCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICAgIENvcHlyaWdodCBJQk0gQ29ycCAyMDAwLDIwMDkKKyAqICAgIENvcHlyaWdodCBJQk0gQ29ycCAyMDAwLDIwMTEKICAqICAgIEF1dGhvcihzKTogSG9sZ2VyIFNtb2xpbnNraSA8SG9sZ2VyLlNtb2xpbnNraUBkZS5pYm0uY29tPiwKICAqCQkgRGVuaXMgSm9zZXBoIEJhcnJvdywKICAqLwpAQCAtOCw2ICs4LDY0IEBACiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKICMKKyMgc3RvcmVfc3RhdHVzCisjCisjIFByZXJlcXVpc2l0ZXMgdG8gcnVuIHRoaXMgZnVuY3Rpb246CisjIC0gUHJlZml4IHJlZ2lzdGVyIGlzIHNldCB0byB6ZXJvCisjIC0gT3JpZ2luYWwgcHJlZml4IHJlZ2lzdGVyIGlzIHN0b3JlZCBpbiAiZHVtcF9wcmVmaXhfcGFnZSIKKyMgLSBMb3djb3JlIHByb3RlY3Rpb24gaXMgb2ZmCisjCitFTlRSWShzdG9yZV9zdGF0dXMpCisJLyogU2F2ZSByZWdpc3RlciBvbmUgYW5kIGxvYWQgc2F2ZSBhcmVhIGJhc2UgKi8KKwlzdGcJJXIxLF9fTENfU0FWRV9BUkVBXzY0KCVyMCkKKwlsZ2hpCSVyMSxTQVZFX0FSRUFfQkFTRQorCS8qIEdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgKi8KKwlzdG1nCSVyMCwlcjE1LF9fTENfR1BSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJbGcJJXIyLF9fTENfU0FWRV9BUkVBXzY0KCVyMCkKKwlzdGcJJXIyLF9fTENfR1BSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSs4KCVyMSkKKwkvKiBDb250cm9sIHJlZ2lzdGVycyAqLworCXN0Y3RnCSVjMCwlYzE1LF9fTENfQ1JFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwkvKiBBY2Nlc3MgcmVnaXN0ZXJzICovCisJc3RhbQklYTAsJWExNSxfX0xDX0FSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJLyogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzICovCisJc3RkCSVmMCwgMHgwMCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmMSwgMHgwOCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmMiwgMHgxMCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmMywgMHgxOCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmNCwgMHgyMCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmNSwgMHgyOCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmNiwgMHgzMCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmNywgMHgzOCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmOCwgMHg0MCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmOSwgMHg0OCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmMTAsMHg1MCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmMTEsMHg1OCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmMTIsMHg2MCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmMTMsMHg2OCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmMTQsMHg3MCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmMTUsMHg3OCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJLyogRmxvYXRpbmcgcG9pbnQgY29udHJvbCByZWdpc3RlciAqLworCXN0ZnBjCV9fTENfRlBfQ1JFR19TQVZFX0FSRUEtU0FWRV9BUkVBX0JBU0UoJXIxKQorCS8qIENQVSB0aW1lciAqLworCXN0cHQJX19MQ19DUFVfVElNRVJfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwkvKiBTYXZlZCBwcmVmaXggcmVnaXN0ZXIgKi8KKwlsYXJsCSVyMixkdW1wX3ByZWZpeF9wYWdlCisJbXZjCV9fTENfUFJFRklYX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSg0LCVyMSksMCglcjIpCisJLyogQ2xvY2sgY29tcGFyYXRvciAtIHNldmVuIGJ5dGVzICovCisJbGFybAklcjIsLkxjbGtjbXAKKwlzdGNrYwkwKCVyMikKKwltdmMJX19MQ19DTE9DS19DT01QX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSArIDEoNywlcjEpLDEoJXIyKQorCS8qIFByb2dyYW0gc3RhdHVzIHdvcmQgKi8KKwllcHN3CSVyMiwlcjMKKwlzdAklcjIsX19MQ19QU1dfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFICsgMCglcjEpCisJc3QJJXIzLF9fTENfUFNXX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSArIDQoJXIxKQorCWxhcmwJJXIyLHN0b3JlX3N0YXR1cworCXN0ZwklcjIsX19MQ19QU1dfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFICsgOCglcjEpCisJYnIJJXIxNAorLmFsaWduCTgKKy5MY2xrY21wOgkucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAKKworIwogIyBkb19yZWlwbF9hc20KICMgUGFyYW1ldGVyOiByMiA9IHNjaGlkIG9mIHJlaXBsIGRldmljZQogIwpAQCAtMTUsMjIgKzczLDcgQEAKIEVOVFJZKGRvX3JlaXBsX2FzbSkKIAkJYmFzcgklcjEzLDAKIC5McGcwOgkJbHBzd2UJLkxuZXdwc3ctLkxwZzAoJXIxMykKLS5McGcxOgkJIyBkbyBzdG9yZSBzdGF0dXMgb2YgYWxsIHJlZ2lzdGVycwotCi0JCXN0ZwklcjEsLkxyZWdzYXZlLS5McGcwKCVyMTMpCi0JCWxnaGkJJXIxLDB4MTAwMAotCQlzdG1nCSVyMCwlcjE1LF9fTENfR1BSRUdTX1NBVkVfQVJFQS0weDEwMDAoJXIxKQotCQlsZwklcjAsLkxyZWdzYXZlLS5McGcwKCVyMTMpCi0JCXN0ZwklcjAsX19MQ19HUFJFR1NfU0FWRV9BUkVBLTB4MTAwMCs4KCVyMSkKLQkJc3RjdGcJJWMwLCVjMTUsX19MQ19DUkVHU19TQVZFX0FSRUEtMHgxMDAwKCVyMSkKLQkJc3RhbQklYTAsJWExNSxfX0xDX0FSRUdTX1NBVkVfQVJFQS0weDEwMDAoJXIxKQotCQlsZwklcjEwLC5MZHVtcF9wZngtLkxwZzAoJXIxMykKLQkJbXZjCV9fTENfUFJFRklYX1NBVkVfQVJFQS0weDEwMDAoNCwlcjEpLDAoJXIxMCkKLQkJc3RmcGMJX19MQ19GUF9DUkVHX1NBVkVfQVJFQS0weDEwMDAoJXIxKQotCQlzdGNrYwkuTGNsa2NtcC0uTHBnMCglcjEzKQotCQltdmMJX19MQ19DTE9DS19DT01QX1NBVkVfQVJFQS0weDEwMDAoNywlcjEpLC5MY2xrY21wLS5McGcwKCVyMTMpCi0JCXN0cHQJX19MQ19DUFVfVElNRVJfU0FWRV9BUkVBLTB4MTAwMCglcjEpCi0JCXN0ZwklcjEzLCBfX0xDX1BTV19TQVZFX0FSRUEtMHgxMDAwKzgoJXIxKQorLkxwZzE6CQlicmFzbAklcjE0LHN0b3JlX3N0YXR1cwogCiAJCWxjdGxnCSVjNiwlYzYsLkxhbGwtLkxwZzAoJXIxMykKIAkJbGdyCSVyMSwlcjIKQEAgLTY3LDEwICsxMTAsNyBAQAogCQlzdAklcjE0LC5MZGlzcHN3KzEyLS5McGcwKCVyMTMpCiAJCWxwc3dlCS5MZGlzcHN3LS5McGcwKCVyMTMpCiAJCS5hbGlnbgk4Ci0uTGNsa2NtcDoJLnF1YWQJMHgwMDAwMDAwMDAwMDAwMDAwCiAuTGFsbDoJCS5xdWFkCTB4MDAwMDAwMDBmZjAwMDAwMAotLkxkdW1wX3BmeDoJLnF1YWQJZHVtcF9wcmVmaXhfcGFnZQotLkxyZWdzYXZlOgkucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAKIAkJLmFsaWduCTE2CiAvKgogICogVGhlc2UgYWRkcmVzc2VzIGhhdmUgdG8gYmUgMzEgYml0IG90aGVyd2lzZQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCmluZGV4IDBjMzVkZWUuLjdiMzcxYzMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKQEAgLTM0Niw3ICszNDYsNyBAQAogCWxjID0gX19hbGxvY19ib290bWVtX2xvdyhMQ19QQUdFUyAqIFBBR0VfU0laRSwgTENfUEFHRVMgKiBQQUdFX1NJWkUsIDApOwogCWxjLT5yZXN0YXJ0X3Bzdy5tYXNrID0gUFNXX0JBU0VfQklUUyB8IFBTV19ERUZBVUxUX0tFWTsKIAlsYy0+cmVzdGFydF9wc3cuYWRkciA9Ci0JCVBTV19BRERSX0FNT0RFIHwgKHVuc2lnbmVkIGxvbmcpIHJlc3RhcnRfaW50X2hhbmRsZXI7CisJCVBTV19BRERSX0FNT0RFIHwgKHVuc2lnbmVkIGxvbmcpIHBzd19yZXN0YXJ0X2ludF9oYW5kbGVyOwogCWlmICh1c2VyX21vZGUgIT0gSE9NRV9TUEFDRV9NT0RFKQogCQlsYy0+cmVzdGFydF9wc3cubWFzayB8PSBQU1dfQVNDX0hPTUU7CiAJbGMtPmV4dGVybmFsX25ld19wc3cubWFzayA9IHBzd19rZXJuZWxfYml0czsKQEAgLTUyOSw2ICs1MjksMjcgQEAKIAkJbWVtb3J5X2VuZCA9IG1lbW9yeV9zaXplOwogfQogCit2b2lkICpyZXN0YXJ0X3N0YWNrIF9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YSIpKSk7CisKKy8qCisgKiBTZXR1cCBuZXcgUFNXIGFuZCBhbGxvY2F0ZSBzdGFjayBmb3IgUFNXIHJlc3RhcnQgaW50ZXJydXB0CisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9yZXN0YXJ0X3Bzdyh2b2lkKQoreworCXBzd190IHBzdzsKKworCXJlc3RhcnRfc3RhY2sgPSBfX2FsbG9jX2Jvb3RtZW0oQVNZTkNfU0laRSwgQVNZTkNfU0laRSwgMCk7CisJcmVzdGFydF9zdGFjayArPSBBU1lOQ19TSVpFOworCisJLyoKKwkgKiBTZXR1cCByZXN0YXJ0IFBTVyBmb3IgYWJzb2x1dGUgemVybyBsb3djb3JlLiBUaGlzIGlzIG5lY2VzYXJ5CisJICogaWYgUFNXIHJlc3RhcnQgaXMgZG9uZSBvbiBhbiBvZmZsaW5lIENQVSB0aGF0IGhhcyBsb3djb3JlIHplcm8KKwkgKi8KKwlwc3cubWFzayA9IFBTV19CQVNFX0JJVFMgfCBQU1dfREVGQVVMVF9LRVk7CisJcHN3LmFkZHIgPSBQU1dfQUREUl9BTU9ERSB8ICh1bnNpZ25lZCBsb25nKSBwc3dfcmVzdGFydF9pbnRfaGFuZGxlcjsKKwljb3B5X3RvX2Fic29sdXRlX3plcm8oJlMzOTBfbG93Y29yZS5yZXN0YXJ0X3BzdywgJnBzdywgc2l6ZW9mKHBzdykpOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQKIHNldHVwX21lbW9yeSh2b2lkKQogewpAQCAtNzMxLDYgKzc1Miw3IEBACiAJCXN0cmNweShlbGZfcGxhdGZvcm0sICJ6MTAiKTsKIAkJYnJlYWs7CiAJY2FzZSAweDI4MTc6CisJY2FzZSAweDI4MTg6CiAJCXN0cmNweShlbGZfcGxhdGZvcm0sICJ6MTk2Iik7CiAJCWJyZWFrOwogCX0KQEAgLTc5Miw2ICs4MTQsNyBAQAogCXNldHVwX2FkZHJlc3NpbmdfbW9kZSgpOwogCXNldHVwX21lbW9yeSgpOwogCXNldHVwX3Jlc291cmNlcygpOworCXNldHVwX3Jlc3RhcnRfcHN3KCk7CiAJc2V0dXBfbG93Y29yZSgpOwogCiAgICAgICAgIGNwdV9pbml0KCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zaWduYWwuYwppbmRleCBhYmJiM2MzLi45YTQwZTFjIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc2lnbmFsLmMKQEAgLTU3LDE3ICs1NywxNSBAQAogICovCiBTWVNDQUxMX0RFRklORTMoc2lnc3VzcGVuZCwgaW50LCBoaXN0b3J5MCwgaW50LCBoaXN0b3J5MSwgb2xkX3NpZ3NldF90LCBtYXNrKQogewotCW1hc2sgJj0gX0JMT0NLQUJMRTsKLQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQljdXJyZW50LT5zYXZlZF9zaWdtYXNrID0gY3VycmVudC0+YmxvY2tlZDsKLQlzaWdpbml0c2V0KCZjdXJyZW50LT5ibG9ja2VkLCBtYXNrKTsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJc2lnc2V0X3QgYmxvY2tlZDsKIAorCWN1cnJlbnQtPnNhdmVkX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOworCW1hc2sgJj0gX0JMT0NLQUJMRTsKKwlzaWdpbml0c2V0KCZibG9ja2VkLCBtYXNrKTsKKwlzZXRfY3VycmVudF9ibG9ja2VkKCZibG9ja2VkKTsKIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCXNjaGVkdWxlKCk7Ci0Jc2V0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOwotCisJc2V0X3Jlc3RvcmVfc2lnbWFzaygpOwogCXJldHVybiAtRVJFU1RBUlROT0hBTkQ7CiB9CiAKQEAgLTE3MiwxOCArMTcwLDExIEBACiAJCWdvdG8gYmFkZnJhbWU7CiAJaWYgKF9fY29weV9mcm9tX3VzZXIoJnNldC5zaWcsICZmcmFtZS0+c2Mub2xkbWFzaywgX1NJR01BU0tfQ09QWV9TSVpFKSkKIAkJZ290byBiYWRmcmFtZTsKLQogCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOwotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBzZXQ7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCisJc2V0X2N1cnJlbnRfYmxvY2tlZCgmc2V0KTsKIAlpZiAocmVzdG9yZV9zaWdyZWdzKHJlZ3MsICZmcmFtZS0+c3JlZ3MpKQogCQlnb3RvIGJhZGZyYW1lOwotCiAJcmV0dXJuIHJlZ3MtPmdwcnNbMl07Ci0KIGJhZGZyYW1lOgogCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKIAlyZXR1cm4gMDsKQEAgLTE5OSwyMSArMTkwLDE0IEBACiAJCWdvdG8gYmFkZnJhbWU7CiAJaWYgKF9fY29weV9mcm9tX3VzZXIoJnNldC5zaWcsICZmcmFtZS0+dWMudWNfc2lnbWFzaywgc2l6ZW9mKHNldCkpKQogCQlnb3RvIGJhZGZyYW1lOwotCiAJc2lnZGVsc2V0bWFzaygmc2V0LCB+X0JMT0NLQUJMRSk7Ci0Jc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JY3VycmVudC0+YmxvY2tlZCA9IHNldDsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0KKwlzZXRfY3VycmVudF9ibG9ja2VkKCZzZXQpOwogCWlmIChyZXN0b3JlX3NpZ3JlZ3MocmVncywgJmZyYW1lLT51Yy51Y19tY29udGV4dCkpCiAJCWdvdG8gYmFkZnJhbWU7Ci0KIAlpZiAoZG9fc2lnYWx0c3RhY2soJmZyYW1lLT51Yy51Y19zdGFjaywgTlVMTCwKIAkJCSAgIHJlZ3MtPmdwcnNbMTVdKSA9PSAtRUZBVUxUKQogCQlnb3RvIGJhZGZyYW1lOwogCXJldHVybiByZWdzLT5ncHJzWzJdOwotCiBiYWRmcmFtZToKIAlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CiAJcmV0dXJuIDA7CkBAIC0zODUsMTQgKzM2OSwxMSBAQAogCXJldHVybiAtRUZBVUxUOwogfQogCi0vKgotICogT0ssIHdlJ3JlIGludm9raW5nIGEgaGFuZGxlcgotICovCQotCi1zdGF0aWMgaW50Ci1oYW5kbGVfc2lnbmFsKHVuc2lnbmVkIGxvbmcgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAotCSAgICAgIHNpZ2luZm9fdCAqaW5mbywgc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQorc3RhdGljIGludCBoYW5kbGVfc2lnbmFsKHVuc2lnbmVkIGxvbmcgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAorCQkJIHNpZ2luZm9fdCAqaW5mbywgc2lnc2V0X3QgKm9sZHNldCwKKwkJCSBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKKwlzaWdzZXRfdCBibG9ja2VkOwogCWludCByZXQ7CiAKIAkvKiBTZXQgdXAgdGhlIHN0YWNrIGZyYW1lICovCkBAIC00MDAsMTcgKzM4MSwxMyBAQAogCQlyZXQgPSBzZXR1cF9ydF9mcmFtZShzaWcsIGthLCBpbmZvLCBvbGRzZXQsIHJlZ3MpOwogCWVsc2UKIAkJcmV0ID0gc2V0dXBfZnJhbWUoc2lnLCBrYSwgb2xkc2V0LCByZWdzKTsKLQotCWlmIChyZXQgPT0gMCkgewotCQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQkJc2lnb3JzZXRzKCZjdXJyZW50LT5ibG9ja2VkLCZjdXJyZW50LT5ibG9ja2VkLCZrYS0+c2Euc2FfbWFzayk7Ci0JCWlmICghKGthLT5zYS5zYV9mbGFncyAmIFNBX05PREVGRVIpKQotCQkJc2lnYWRkc2V0KCZjdXJyZW50LT5ibG9ja2VkLHNpZyk7Ci0JCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JfQotCi0JcmV0dXJuIHJldDsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXNpZ29yc2V0cygmYmxvY2tlZCwgJmN1cnJlbnQtPmJsb2NrZWQsICZrYS0+c2Euc2FfbWFzayk7CisJaWYgKCEoa2EtPnNhLnNhX2ZsYWdzICYgU0FfTk9ERUZFUikpCisJCXNpZ2FkZHNldCgmYmxvY2tlZCwgc2lnKTsKKwlzZXRfY3VycmVudF9ibG9ja2VkKCZibG9ja2VkKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc21wLmMgYi9hcmNoL3MzOTAva2VybmVsL3NtcC5jCmluZGV4IGE2ZDg1YzAuLjZhYjE2YWMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYwpAQCAtNDUyLDIzICs0NTIsMjcgQEAKICAqLwogaW50IF9fY3B1aW5pdCBzdGFydF9zZWNvbmRhcnkodm9pZCAqY3B1dm9pZCkKIHsKLQkvKiBTZXR1cCB0aGUgY3B1ICovCiAJY3B1X2luaXQoKTsKIAlwcmVlbXB0X2Rpc2FibGUoKTsKLQkvKiBFbmFibGUgVE9EIGNsb2NrIGludGVycnVwdHMgb24gdGhlIHNlY29uZGFyeSBjcHUuICovCiAJaW5pdF9jcHVfdGltZXIoKTsKLQkvKiBFbmFibGUgY3B1IHRpbWVyIGludGVycnVwdHMgb24gdGhlIHNlY29uZGFyeSBjcHUuICovCiAJaW5pdF9jcHVfdnRpbWVyKCk7Ci0JLyogRW5hYmxlIHBmYXVsdCBwc2V1ZG8gcGFnZSBmYXVsdHMgb24gdGhpcyBjcHUuICovCiAJcGZhdWx0X2luaXQoKTsKIAotCS8qIGNhbGwgY3B1IG5vdGlmaWVycyAqLwogCW5vdGlmeV9jcHVfc3RhcnRpbmcoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQkvKiBNYXJrIHRoaXMgY3B1IGFzIG9ubGluZSAqLwogCWlwaV9jYWxsX2xvY2soKTsKIAlzZXRfY3B1X29ubGluZShzbXBfcHJvY2Vzc29yX2lkKCksIHRydWUpOwogCWlwaV9jYWxsX3VubG9jaygpOwotCS8qIFN3aXRjaCBvbiBpbnRlcnJ1cHRzICovCisJX19jdGxfY2xlYXJfYml0KDAsIDI4KTsgLyogRGlzYWJsZSBsb3djb3JlIHByb3RlY3Rpb24gKi8KKwlTMzkwX2xvd2NvcmUucmVzdGFydF9wc3cubWFzayA9IFBTV19CQVNFX0JJVFMgfCBQU1dfREVGQVVMVF9LRVk7CisJUzM5MF9sb3djb3JlLnJlc3RhcnRfcHN3LmFkZHIgPQorCQlQU1dfQUREUl9BTU9ERSB8ICh1bnNpZ25lZCBsb25nKSBwc3dfcmVzdGFydF9pbnRfaGFuZGxlcjsKKwlfX2N0bF9zZXRfYml0KDAsIDI4KTsgLyogRW5hYmxlIGxvd2NvcmUgcHJvdGVjdGlvbiAqLworCS8qCisJICogV2FpdCB1bnRpbCB0aGUgY3B1IHdoaWNoIGJyb3VnaHQgdGhpcyBvbmUgdXAgbWFya2VkIGl0CisJICogYWN0aXZlIGJlZm9yZSBlbmFibGluZyBpbnRlcnJ1cHRzLgorCSAqLworCXdoaWxlICghY3B1bWFza190ZXN0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9hY3RpdmVfbWFzaykpCisJCWNwdV9yZWxheCgpOwogCWxvY2FsX2lycV9lbmFibGUoKTsKIAkvKiBjcHVfaWRsZSB3aWxsIGNhbGwgc2NoZWR1bGUgZm9yIHVzICovCiAJY3B1X2lkbGUoKTsKQEAgLTUwNyw3ICs1MTEsMTEgQEAKIAltZW1zZXQoKGNoYXIgKilsb3djb3JlICsgNTEyLCAwLCBzaXplb2YoKmxvd2NvcmUpIC0gNTEyKTsKIAlsb3djb3JlLT5hc3luY19zdGFjayA9IGFzeW5jX3N0YWNrICsgQVNZTkNfU0laRTsKIAlsb3djb3JlLT5wYW5pY19zdGFjayA9IHBhbmljX3N0YWNrICsgUEFHRV9TSVpFOwotCisJbG93Y29yZS0+cmVzdGFydF9wc3cubWFzayA9IFBTV19CQVNFX0JJVFMgfCBQU1dfREVGQVVMVF9LRVk7CisJbG93Y29yZS0+cmVzdGFydF9wc3cuYWRkciA9CisJCVBTV19BRERSX0FNT0RFIHwgKHVuc2lnbmVkIGxvbmcpIHJlc3RhcnRfaW50X2hhbmRsZXI7CisJaWYgKHVzZXJfbW9kZSAhPSBIT01FX1NQQUNFX01PREUpCisJCWxvd2NvcmUtPnJlc3RhcnRfcHN3Lm1hc2sgfD0gUFNXX0FTQ19IT01FOwogI2lmbmRlZiBDT05GSUdfNjRCSVQKIAlpZiAoTUFDSElORV9IQVNfSUVFRSkgewogCQl1bnNpZ25lZCBsb25nIHNhdmVfYXJlYTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9tYWNjZXNzLmMgYi9hcmNoL3MzOTAvbW0vbWFjY2Vzcy5jCmluZGV4IDUxZTVjZDkuLjVkYmJhYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9tYWNjZXNzLmMKKysrIGIvYXJjaC9zMzkwL21tL21hY2Nlc3MuYwpAQCAtODUsMyArODUsMTkgQEAKIAlhcmNoX2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlyZXR1cm4gcmM7CiB9CisKKy8qCisgKiBDb3B5IG1lbW9yeSB0byBhYnNvbHV0ZSB6ZXJvCisgKi8KK3ZvaWQgY29weV90b19hYnNvbHV0ZV96ZXJvKHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgY3IwOworCisJQlVHX09OKCh1bnNpZ25lZCBsb25nKSBkZXN0ICsgY291bnQgPj0gc2l6ZW9mKHN0cnVjdCBfbG93Y29yZSkpOworCXByZWVtcHRfZGlzYWJsZSgpOworCV9fY3RsX3N0b3JlKGNyMCwgMCwgMCk7CisJX19jdGxfY2xlYXJfYml0KDAsIDI4KTsgLyogZGlzYWJsZSBsb3djb3JlIHByb3RlY3Rpb24gKi8KKwltZW1jcHlfcmVhbChkZXN0ICsgc3RvcmVfcHJlZml4KCksIHNyYywgY291bnQpOworCV9fY3RsX2xvYWQoY3IwLCAwLCAwKTsKKwlwcmVlbXB0X2VuYWJsZSgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL3BndGFibGUuYyBiL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMKaW5kZXggMmFkYjIzOS4uNGQxZjJiYyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL3BndGFibGUuYworKysgYi9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jCkBAIC01MjgsNiArNTI4LDcgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyAqcGFnZV90YWJsZV9hbGxvY19wZ3N0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkJCSAgICB1bnNpZ25lZCBsb25nIHZtYWRkcikKIHsKKwlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHBhZ2VfdGFibGVfZnJlZV9wZ3N0ZSh1bnNpZ25lZCBsb25nICp0YWJsZSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZyBiL2FyY2gvc2gvS2NvbmZpZwppbmRleCA3NDhmZjE5Li5mZjkxNzdjIDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcKKysrIGIvYXJjaC9zaC9LY29uZmlnCkBAIC0xMSw2ICsxMSw3IEBACiAJc2VsZWN0IEhBVkVfRE1BX0FUVFJTCiAJc2VsZWN0IEhBVkVfSVJRX1dPUksKIAlzZWxlY3QgSEFWRV9QRVJGX0VWRU5UUworCXNlbGVjdCBBUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRyBpZiAoR1VTQV9SQiB8fCBDUFVfU0g0QSkKIAlzZWxlY3QgUEVSRl9VU0VfVk1BTExPQwogCXNlbGVjdCBIQVZFX0tFUk5FTF9HWklQCiAJc2VsZWN0IEhBVkVfS0VSTkVMX0JaSVAyCmRpZmYgLS1naXQgYS9hcmNoL3NoL01ha2VmaWxlIGIvYXJjaC9zaC9NYWtlZmlsZQppbmRleCBlM2Q4MTcwLi45OTM4NWQwIDEwMDY0NAotLS0gYS9hcmNoL3NoL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvTWFrZWZpbGUKQEAgLTE3Myw2ICsxNzMsNyBAQAogY3B1aW5jZGlyLSQoQ09ORklHX0NQVV9TSDJBKQkrPSBjcHUtc2gyYQogY3B1aW5jZGlyLSQoQ09ORklHX0NQVV9TSDIpCSs9IGNwdS1zaDIKIGNwdWluY2Rpci0kKENPTkZJR19DUFVfU0gzKQkrPSBjcHUtc2gzCitjcHVpbmNkaXItJChDT05GSUdfQ1BVX1NINEEpCSs9IGNwdS1zaDRhCiBjcHVpbmNkaXItJChDT05GSUdfQ1BVX1NINCkJKz0gY3B1LXNoNAogY3B1aW5jZGlyLSQoQ09ORklHX0NQVV9TSDUpCSs9IGNwdS1zaDUKIGNwdWluY2Rpci15CQkJKz0gY3B1LWNvbW1vbgkjIE11c3QgYmUgbGFzdApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYm9hcmQtYXBzaDRhM2EuYyBiL2FyY2gvc2gvYm9hcmRzL2JvYXJkLWFwc2g0YTNhLmMKaW5kZXggOGUyYTI3MC4uMjgyMzYxOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvYm9hcmQtYXBzaDRhM2EuYworKysgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC1hcHNoNGEzYS5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIAlpbnQgcmV0OwogCiAJY2xrID0gY2xrX2dldChOVUxMLCAiZXh0YWwiKTsKLQlpZiAoIWNsayB8fCBJU19FUlIoY2xrKSkKKwlpZiAoSVNfRVJSKGNsaykpCiAJCXJldHVybiBQVFJfRVJSKGNsayk7CiAJcmV0ID0gY2xrX3NldF9yYXRlKGNsaywgMzMzMzMwMDApOwogCWNsa19wdXQoY2xrKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2JvYXJkLWFwc2g0YWQwYS5jIGIvYXJjaC9zaC9ib2FyZHMvYm9hcmQtYXBzaDRhZDBhLmMKaW5kZXggZTJiZDIxOC4uYjRkNjI5MiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvYm9hcmQtYXBzaDRhZDBhLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvYm9hcmQtYXBzaDRhZDBhLmMKQEAgLTk0LDcgKzk0LDcgQEAKIAlpbnQgcmV0OwogCiAJY2xrID0gY2xrX2dldChOVUxMLCAiZXh0YWwiKTsKLQlpZiAoIWNsayB8fCBJU19FUlIoY2xrKSkKKwlpZiAoSVNfRVJSKGNsaykpCiAJCXJldHVybiBQVFJfRVJSKGNsayk7CiAJcmV0ID0gY2xrX3NldF9yYXRlKGNsaywgMzMzMzMwMDApOwogCWNsa19wdXQoY2xrKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2JvYXJkLXNoNzc4NWxjci5jIGIvYXJjaC9zaC9ib2FyZHMvYm9hcmQtc2g3Nzg1bGNyLmMKaW5kZXggZWU2NWZmMC4uZDg3OTg0OCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvYm9hcmQtc2g3Nzg1bGNyLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvYm9hcmQtc2g3Nzg1bGNyLmMKQEAgLTI5OSw3ICsyOTksNyBAQAogCWludCByZXQ7CiAKIAljbGsgPSBjbGtfZ2V0KE5VTEwsICJleHRhbCIpOwotCWlmICghY2xrIHx8IElTX0VSUihjbGspKQorCWlmIChJU19FUlIoY2xrKSkKIAkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKIAlyZXQgPSBjbGtfc2V0X3JhdGUoY2xrLCAzMzMzMzMzMyk7CiAJY2xrX3B1dChjbGspOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYm9hcmQtdXJxdWVsbC5jIGIvYXJjaC9zaC9ib2FyZHMvYm9hcmQtdXJxdWVsbC5jCmluZGV4IGQ4MWM2MDkuLjI0ZTMzMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2JvYXJkLXVycXVlbGwuYworKysgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC11cnF1ZWxsLmMKQEAgLTE5MCw3ICsxOTAsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWNsayA9IGNsa19nZXQoTlVMTCwgImV4dGFsIik7Ci0JaWYgKCFjbGsgfHwgSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihjbGspKQogCQlyZXR1cm4gUFRSX0VSUihjbGspOwogCXJldCA9IGNsa19zZXRfcmF0ZShjbGssIDMzMzMzMzMzKTsKIAljbGtfcHV0KGNsayk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWFwMzI1cnhhL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWFwMzI1cnhhL3NldHVwLmMKaW5kZXggMWRjOTI0Yi4uZDM2MjY1NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1hcDMyNXJ4YS9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtYXAzMjVyeGEvc2V0dXAuYwpAQCAtMzMyLDggKzMzMiw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhcDMyNXJ4YV9jYW1lcmFfYWRkKHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCwgc3RydWN0IGRldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIGFwMzI1cnhhX2NhbWVyYV9kZWwoc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsKTsKK3N0YXRpYyBpbnQgYXAzMjVyeGFfY2FtZXJhX2FkZChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCk7CitzdGF0aWMgdm9pZCBhcDMyNXJ4YV9jYW1lcmFfZGVsKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKTsKIAogc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX3BsYXRmb3JtX2luZm8gY2FtZXJhX2luZm8gPSB7CiAJLmZvcm1hdF9uYW1lID0gIlVZVlkiLApAQCAtMzY2LDI0ICszNjYsMjMgQEAKIAlzb2NfY2FtZXJhX3BsYXRmb3JtX3JlbGVhc2UoJmNhbWVyYV9kZXZpY2UpOwogfQogCi1zdGF0aWMgaW50IGFwMzI1cnhhX2NhbWVyYV9hZGQoc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsLAotCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgYXAzMjVyeGFfY2FtZXJhX2FkZChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKLQlpbnQgcmV0ID0gc29jX2NhbWVyYV9wbGF0Zm9ybV9hZGQoaWNsLCBkZXYsICZjYW1lcmFfZGV2aWNlLCAmY2FtZXJhX2xpbmssCisJaW50IHJldCA9IHNvY19jYW1lcmFfcGxhdGZvcm1fYWRkKGljZCwgJmNhbWVyYV9kZXZpY2UsICZjYW1lcmFfbGluaywKIAkJCQkJICBhcDMyNXJ4YV9jYW1lcmFfcmVsZWFzZSwgMCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKIAlyZXQgPSBjYW1lcmFfcHJvYmUoKTsKIAlpZiAocmV0IDwgMCkKLQkJc29jX2NhbWVyYV9wbGF0Zm9ybV9kZWwoaWNsLCBjYW1lcmFfZGV2aWNlLCAmY2FtZXJhX2xpbmspOworCQlzb2NfY2FtZXJhX3BsYXRmb3JtX2RlbChpY2QsIGNhbWVyYV9kZXZpY2UsICZjYW1lcmFfbGluayk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBhcDMyNXJ4YV9jYW1lcmFfZGVsKHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCkKK3N0YXRpYyB2b2lkIGFwMzI1cnhhX2NhbWVyYV9kZWwoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc29jX2NhbWVyYV9wbGF0Zm9ybV9kZWwoaWNsLCBjYW1lcmFfZGV2aWNlLCAmY2FtZXJhX2xpbmspOworCXNvY19jYW1lcmFfcGxhdGZvcm1fZGVsKGljZCwgY2FtZXJhX2RldmljZSwgJmNhbWVyYV9saW5rKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfSTJDICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtaGlnaGxhbmRlci9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1oaWdobGFuZGVyL3NldHVwLmMKaW5kZXggODc2MThjOS4uNzRiOGRiMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1oaWdobGFuZGVyL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1oaWdobGFuZGVyL3NldHVwLmMKQEAgLTMzNSw4ICszMzUsNiBAQAogCSZpdmRyX2NsaywKIH07CiAKLSNkZWZpbmUgQ0xLREVWX0NPTl9JRChfaWQsIF9jbGspIHsgLmNvbl9pZCA9IF9pZCwgLmNsayA9IF9jbGsgfQotCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbG9va3Vwc1tdID0gewogCS8qIG1haW4gY2xvY2tzICovCiAJQ0xLREVWX0NPTl9JRCgiaXZkcl9jbGsiLCAmaXZkcl9jbGspLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZGs3Nzg2L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLXNkazc3ODYvc2V0dXAuYwppbmRleCAxNTIxYWE3Li40ODZkMWFjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNkazc3ODYvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLXNkazc3ODYvc2V0dXAuYwpAQCAtMTk0LDcgKzE5NCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJY2xrID0gY2xrX2dldChOVUxMLCAiZXh0YWwiKTsKLQlpZiAoIWNsayB8fCBJU19FUlIoY2xrKSkKKwlpZiAoSVNfRVJSKGNsaykpCiAJCXJldHVybiBQVFJfRVJSKGNsayk7CiAJcmV0ID0gY2xrX3NldF9yYXRlKGNsaywgMzMzMzMzMzMpOwogCWNsa19wdXQoY2xrKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLWNheW1hbi5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtY2F5bWFuLmMKaW5kZXggYjY4YjYxZC4uZWRjMmZiNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtY2F5bWFuLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtY2F5bWFuLmMKQEAgLTUsNyArNSw3IEBACiAjaW5jbHVkZSA8Y3B1L2lycS5oPgogI2luY2x1ZGUgInBjaS1zaDUuaCIKIAotaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoraW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCByZXN1bHQgPSAtMTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtZHJlYW1jYXN0LmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1kcmVhbWNhc3QuYwppbmRleCA5NDJlZjRmLi5lZGVlYTg5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1kcmVhbWNhc3QuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1kcmVhbWNhc3QuYwpAQCAtNjQsNyArNjQsNyBAQAogfQogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGdhcHNwY2lfZml4dXBfcmVzb3VyY2VzKTsKIAotaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoraW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCS8qCiAJICogVGhlIGludGVycnVwdCByb3V0aW5nIHNlbWFudGljcyBoZXJlIGFyZSBxdWl0ZSB0cml2aWFsLgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtbGFuZGlzay5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtbGFuZGlzay5jCmluZGV4IDk1YzZlMmQuLmVjYjFkMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLWxhbmRpc2suYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1sYW5kaXNrLmMKQEAgLTE5LDcgKzE5LDcgQEAKICNkZWZpbmUgUENJTUNSX01SU0VUX09GRgkweEJGRkZGRkZGCiAjZGVmaW5lIFBDSU1DUl9SRlNIX09GRgkJMHhGRkZGRkZGQgogCi1pbnQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpbnQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJLyoKIAkgKiBzbG90MDogcGluMS00ID0gaXJxNSw2LDcsOApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtcjc3ODBycC5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtcjc3ODBycC5jCmluZGV4IDA4YjJkODYuLmY5MzcwZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXI3NzgwcnAuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1yNzc4MHJwLmMKQEAgLTE4LDcgKzE4LDcgQEAKIAk2NSwgNjYsIDY3LCA2OCwKIH07CiAKLWludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggc2xvdCwgdTggcGluKQogewogCXJldHVybiBpcnFfdGFiW3Nsb3RdOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtcnRzNzc1MXIyZC5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtcnRzNzc1MXIyZC5jCmluZGV4IGUyNDg1MTYuLmVhZGRiNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXJ0czc3NTFyMmQuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1ydHM3NzUxcjJkLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAlJUlFfRVRIMCwgSVJRX0VUSDEsIElSUV9JTlRBLCBJUlFfSU5URCwKIH07CiAKLWludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggc2xvdCwgdTggcGluKQogewogCWlmIChtYWNoX2lzX2xib3hyZTIoKSkKIAkJcmV0dXJuIGxib3hyZTJfaXJxX3RhYltzbG90XTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNkazc3ODAuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNkazc3ODAuYwppbmRleCAwOTMwZjk4Li4wYjg0NzI1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1zZGs3NzgwLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc2RrNzc4MC5jCkBAIC0yNyw3ICsyNyw3IEBACiAJeyA2OCwgNjcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAogfTsKIAotaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2ludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAgICAgICAgcmV0dXJuIHNkazc3ODBfaXJxX3RhYltwaW4tMV1bc2xvdF07CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1zZTc3NTEuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNlNzc1MS5jCmluZGV4IGZkM2U2YjAuLjJlYzE0NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNlNzc1MS5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNlNzc1MS5jCkBAIC02LDcgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSAicGNpLXNoNC5oIgogCi1pbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzdHJ1Y3QgcGNpX2RldiAqLCB1OCBzbG90LCB1OCBwaW4pCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqLCB1OCBzbG90LCB1OCBwaW4pCiB7CiAgICAgICAgIHN3aXRjaCAoc2xvdCkgewogICAgICAgICBjYXNlIDA6IHJldHVybiAxMzsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNoMDMuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNoMDMuYwppbmRleCAyZThhMThiLi4xNjE1ZTU5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1zaDAzLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc2gwMy5jCkBAIC0zLDcgKzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKLWludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2ludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1zbmFwZ2Vhci5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc25hcGdlYXIuYwppbmRleCA1YTM5ZWNjLi40YTA5M2M2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1zbmFwZ2Vhci5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNuYXBnZWFyLmMKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlICJwY2ktc2g0LmgiCiAKLWludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBpcnEgPSAtMTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtdGl0YW4uYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXRpdGFuLmMKaW5kZXggM2E3OWZhOC4uYmQxYWRkYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtdGl0YW4uYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy10aXRhbi5jCkBAIC0yNyw3ICsyNyw3IEBACiAJVElUQU5fSVJRX1VTQiwKIH07CiAKLWludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBpcnEgPSB0aXRhbl9pcnFfdGFiW3Nsb3RdOwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaWUtc2g3Nzg2LmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaWUtc2g3Nzg2LmMKaW5kZXggNDQxOGY5MC4uNGRmMjdjNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpZS1zaDc3ODYuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaWUtc2g3Nzg2LmMKQEAgLTQ2Niw3ICs0NjYsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggc2xvdCwgdTggcGluKQoraW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKICAgICAgICAgcmV0dXJuIDcxOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9wY2kuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vcGNpLmgKaW5kZXggZjBlZmU5Ny4uY2IyMWUyMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9wY2kuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3BjaS5oCkBAIC0xMTIsNyArMTEyLDcgQEAKICNlbmRpZgogCiAvKiBCb2FyZC1zcGVjaWZpYyBmaXh1cCByb3V0aW5lcy4gKi8KLWludCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKTsKK2ludCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKTsKIAogZXh0ZXJuIHZvaWQgcGNpYmlvc19yZXNvdXJjZV90b19idXMoc3RydWN0IHBjaV9kZXYgKmRldiwKIAlzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbiwgc3RydWN0IHJlc291cmNlICpyZXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDMvY3B1L3NlcmlhbC5oIGIvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDMvY3B1L3NlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NjYzMjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoMy9jcHUvc2VyaWFsLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfX0NQVV9TSDNfU0VSSUFMX0gKKyNkZWZpbmUgX19DUFVfU0gzX1NFUklBTF9ICisKKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfc2NpLmg+CisKK2V4dGVybiBzdHJ1Y3QgcGxhdF9zY2lfcG9ydF9vcHMgc2g3NzB4X3NjaV9wb3J0X29wczsKK2V4dGVybiBzdHJ1Y3QgcGxhdF9zY2lfcG9ydF9vcHMgc2g3NzEwX3NjaV9wb3J0X29wczsKK2V4dGVybiBzdHJ1Y3QgcGxhdF9zY2lfcG9ydF9vcHMgc2g3NzIwX3NjaV9wb3J0X29wczsKKworI2VuZGlmIC8qIF9fQ1BVX1NIM19TRVJJQUxfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDRhL2NwdS9zZXJpYWwuaCBiL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0YS9jcHUvc2VyaWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYxYmMyNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0YS9jcHUvc2VyaWFsLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9fQ1BVX1NINEFfU0VSSUFMX0gKKyNkZWZpbmUgX19DUFVfU0g0QV9TRVJJQUxfSAorCisvKiBhcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXJpYWwtc2g3NzIyLmMgKi8KK2V4dGVybiBzdHJ1Y3QgcGxhdF9zY2lfcG9ydF9vcHMgc2g3NzIyX3NjaV9wb3J0X29wczsKKworI2VuZGlmIC8qIF9fQ1BVX1NINEFfU0VSSUFMX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9jbG9jay1jcGcuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9jbG9jay1jcGcuYwppbmRleCA4ZjYzYTI2Li5mNTliMWYzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvY2xvY2stY3BnLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2Nsb2NrLWNwZy5jCkBAIC0zNSw4ICszNSw2IEBACiAJJmNwdV9jbGssCiB9OwogCi0jZGVmaW5lIENMS0RFVl9DT05fSUQoX2lkLCBfY2xrKSB7IC5jb25faWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLQogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKIAkvKiBtYWluIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoIm1hc3Rlcl9jbGsiLCAmbWFzdGVyX2NsayksCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL01ha2VmaWxlIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9NYWtlZmlsZQppbmRleCBlY2FiMjc0Li42ZjEzZjMzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL01ha2VmaWxlCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvTWFrZWZpbGUKQEAgLTcsMTUgKzcsMTUgQEAKIG9iai0kKENPTkZJR19ISUJFUk5BVElPTikJCSs9IHN3c3VzcC5vCiAKICMgQ1BVIHN1YnR5cGUgc2V0dXAKLW9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUpCSs9IHNldHVwLXNoNzcwNS5vCi1vYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2KQkrPSBzZXR1cC1zaDc3MHgubwotb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNykJKz0gc2V0dXAtc2g3NzB4Lm8KLW9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDgpCSs9IHNldHVwLXNoNzcweC5vCi1vYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5KQkrPSBzZXR1cC1zaDc3MHgubwotb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCkJKz0gc2V0dXAtc2g3NzEwLm8KLW9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIpCSs9IHNldHVwLXNoNzcxMC5vCi1vYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIwKQkrPSBzZXR1cC1zaDc3MjAubwotb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMSkJKz0gc2V0dXAtc2g3NzIwLm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUpCSs9IHNldHVwLXNoNzcwNS5vIHNlcmlhbC1zaDc3MHgubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNikJKz0gc2V0dXAtc2g3NzB4Lm8gc2VyaWFsLXNoNzcweC5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KQkrPSBzZXR1cC1zaDc3MHgubyBzZXJpYWwtc2g3NzB4Lm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDgpCSs9IHNldHVwLXNoNzcweC5vIHNlcmlhbC1zaDc3MHgubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSkJKz0gc2V0dXAtc2g3NzB4Lm8gc2VyaWFsLXNoNzcweC5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwKQkrPSBzZXR1cC1zaDc3MTAubyBzZXJpYWwtc2g3NzEwLm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIpCSs9IHNldHVwLXNoNzcxMC5vIHNlcmlhbC1zaDc3MTAubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMCkJKz0gc2V0dXAtc2g3NzIwLm8gc2VyaWFsLXNoNzcyMC5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIxKQkrPSBzZXR1cC1zaDc3MjAubyBzZXJpYWwtc2g3NzIwLm8KIAogIyBQcmltYXJ5IG9uLWNoaXAgY2xvY2tzIChjb21tb24pCiBjbG9jay0kKENPTkZJR19DUFVfU0gzKQkJCTo9IGNsb2NrLXNoMy5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NlcmlhbC1zaDc3MHguYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2VyaWFsLXNoNzcweC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNzI0MmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NlcmlhbC1zaDc3MHguYwpAQCAtMCwwICsxLDMzIEBACisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3NjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxjcHUvc2VyaWFsLmg+CisKKyNkZWZpbmUgU0NQQ1IgMHhBNDAwMDExNgorI2RlZmluZSBTQ1BEUiAweEE0MDAwMTM2CisKK3N0YXRpYyB2b2lkIHNoNzcweF9zY2lfaW5pdF9waW5zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBjZmxhZykKK3sKKwl1bnNpZ25lZCBzaG9ydCBkYXRhOworCisJLyogV2UgbmVlZCB0byBzZXQgU0NQQ1IgdG8gZW5hYmxlIFJUUy9DVFMgKi8KKwlkYXRhID0gX19yYXdfcmVhZHcoU0NQQ1IpOworCS8qIENsZWFyIG91dCBTQ1A3TUQxLDAsIFNDUDZNRDEsMCwgU0NQNE1EMSwwKi8KKwlfX3Jhd193cml0ZXcoZGF0YSAmIDB4MGZjZiwgU0NQQ1IpOworCisJaWYgKCEoY2ZsYWcgJiBDUlRTQ1RTKSkgeworCQkvKiBXZSBuZWVkIHRvIHNldCBTQ1BDUiB0byBlbmFibGUgUlRTL0NUUyAqLworCQlkYXRhID0gX19yYXdfcmVhZHcoU0NQQ1IpOworCQkvKiBDbGVhciBvdXQgU0NQN01EMSwwLCBTQ1A0TUQxLDAsCisJCSAgIFNldCBTQ1A2TUQxLDAgPSB7MDF9IChvdXRwdXQpICAqLworCQlfX3Jhd193cml0ZXcoKGRhdGEgJiAweDBmY2YpIHwgMHgxMDAwLCBTQ1BDUik7CisKKwkJZGF0YSA9IF9fcmF3X3JlYWRiKFNDUERSKTsKKwkJLyogU2V0IC9SVFMyIChiaXQ2KSA9IDAgKi8KKwkJX19yYXdfd3JpdGViKGRhdGEgJiAweGJmLCBTQ1BEUik7CisJfQorfQorCitzdHJ1Y3QgcGxhdF9zY2lfcG9ydF9vcHMgc2g3NzB4X3NjaV9wb3J0X29wcyA9IHsKKwkuaW5pdF9waW5zCT0gc2g3NzB4X3NjaV9pbml0X3BpbnMsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXJpYWwtc2g3NzEwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NlcmlhbC1zaDc3MTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjE5MGVmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXJpYWwtc2g3NzEwLmMKQEAgLTAsMCArMSwyMCBAQAorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9zY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8Y3B1L3NlcmlhbC5oPgorCisjZGVmaW5lIFBBQ1IgMHhhNDA1MDEwMAorI2RlZmluZSBQQkNSIDB4YTQwNTAxMDIKKworc3RhdGljIHZvaWQgc2g3NzEwX3NjaV9pbml0X3BpbnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGNmbGFnKQoreworCWlmIChwb3J0LT5tYXBiYXNlID09IDB4QTQ0MDAwMDApIHsKKwkJX19yYXdfd3JpdGV3KF9fcmF3X3JlYWR3KFBBQ1IpICYgMHhmZmMwLCBQQUNSKTsKKwkJX19yYXdfd3JpdGV3KF9fcmF3X3JlYWR3KFBCQ1IpICYgMHgwZmZmLCBQQkNSKTsKKwl9IGVsc2UgaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhBNDQxMDAwMCkKKwkJX19yYXdfd3JpdGV3KF9fcmF3X3JlYWR3KFBCQ1IpICYgMHhmMDAzLCBQQkNSKTsKK30KKworc3RydWN0IHBsYXRfc2NpX3BvcnRfb3BzIHNoNzcxMF9zY2lfcG9ydF9vcHMgPSB7CisJLmluaXRfcGlucwk9IHNoNzcxMF9zY2lfaW5pdF9waW5zLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2VyaWFsLXNoNzcyMC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXJpYWwtc2g3NzIwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgzMmM1MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2VyaWFsLXNoNzcyMC5jCkBAIC0wLDAgKzEsMzcgQEAKKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfc2NpLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGNwdS9zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vZ3Bpby5oPgorCitzdGF0aWMgdm9pZCBzaDc3MjBfc2NpX2luaXRfcGlucyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgY2ZsYWcpCit7CisJdW5zaWduZWQgc2hvcnQgZGF0YTsKKworCWlmIChjZmxhZyAmIENSVFNDVFMpIHsKKwkJLyogZW5hYmxlIFJUUy9DVFMgKi8KKwkJaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhhNDQzMDAwMCkgeyAvKiBTQ0lGMCAqLworCQkJLyogQ2xlYXIgUFRDUiBiaXQgOS0yOyBlbmFibGUgYWxsIHNjaWYgcGlucyBidXQgc2NrICovCisJCQlkYXRhID0gX19yYXdfcmVhZHcoUE9SVF9QVENSKTsKKwkJCV9fcmF3X3dyaXRldygoZGF0YSAmIDB4ZmMwMyksIFBPUlRfUFRDUik7CisJCX0gZWxzZSBpZiAocG9ydC0+bWFwYmFzZSA9PSAweGE0NDM4MDAwKSB7IC8qIFNDSUYxICovCisJCQkvKiBDbGVhciBQVkNSIGJpdCA5LTIgKi8KKwkJCWRhdGEgPSBfX3Jhd19yZWFkdyhQT1JUX1BWQ1IpOworCQkJX19yYXdfd3JpdGV3KChkYXRhICYgMHhmYzAzKSwgUE9SVF9QVkNSKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChwb3J0LT5tYXBiYXNlID09IDB4YTQ0MzAwMDApIHsgLyogU0NJRjAgKi8KKwkJCS8qIENsZWFyIFBUQ1IgYml0IDUtMjsgZW5hYmxlIG9ubHkgdHggYW5kIHJ4ICAqLworCQkJZGF0YSA9IF9fcmF3X3JlYWR3KFBPUlRfUFRDUik7CisJCQlfX3Jhd193cml0ZXcoKGRhdGEgJiAweGZmYzMpLCBQT1JUX1BUQ1IpOworCQl9IGVsc2UgaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhhNDQzODAwMCkgeyAvKiBTQ0lGMSAqLworCQkJLyogQ2xlYXIgUFZDUiBiaXQgNS0yICovCisJCQlkYXRhID0gX19yYXdfcmVhZHcoUE9SVF9QVkNSKTsKKwkJCV9fcmF3X3dyaXRldygoZGF0YSAmIDB4ZmZjMyksIFBPUlRfUFZDUik7CisJCX0KKwl9Cit9CisKK3N0cnVjdCBwbGF0X3NjaV9wb3J0X29wcyBzaDc3MjBfc2NpX3BvcnRfb3BzID0geworCS5pbml0X3BpbnMJPSBzaDc3MjBfc2NpX2luaXRfcGlucywKK307CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwNS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDUuYwppbmRleCBjZDJlNzAyLi4yMzA5NjE4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwNS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA1LmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfc2NpLmg+CiAjaW5jbHVkZSA8bGludXgvc2hfdGltZXIuaD4KICNpbmNsdWRlIDxhc20vcnRjLmg+CisjaW5jbHVkZSA8Y3B1L3NlcmlhbC5oPgogCiBlbnVtIHsKIAlVTlVTRUQgPSAwLApAQCAtNzUsNiArNzYsOCBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT180LAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDU2LCA1NiwgNTYgfSwKKwkub3BzCQk9ICZzaDc3MHhfc2NpX3BvcnRfb3BzLAorCS5yZWd0eXBlCT0gU0NJeF9TSDc3MDVfU0NJRl9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjBfZGV2aWNlID0gewpAQCAtOTIsNiArOTUsOCBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT180LAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDUyLCA1MiwgNTIgfSwKKwkub3BzCQk9ICZzaDc3MHhfc2NpX3BvcnRfb3BzLAorCS5yZWd0eXBlCT0gU0NJeF9TSDc3MDVfU0NJRl9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjFfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MHguYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzB4LmMKaW5kZXggNDU1MWFkNi4uM2YzZDVmZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MHguYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcweC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3NjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX3RpbWVyLmg+CisjaW5jbHVkZSA8Y3B1L3NlcmlhbC5oPgogCiBlbnVtIHsKIAlVTlVTRUQgPSAwLApAQCAtMTA4LDExICsxMDksMTQgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYwX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZmZmZTgwLAorCS5wb3J0X3JlZwk9IDB4YTQwMDAxMzYsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9URSB8IFNDU0NSX1JFLAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJLAogCS5pcnFzCQk9IHsgMjMsIDIzLCAyMywgMCB9LAorCS5vcHMJCT0gJnNoNzcweF9zY2lfcG9ydF9vcHMsCisJLnJlZ3NoaWZ0CT0gMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYwX2RldmljZSA9IHsKQEAgLTEzMiw2ICsxMzYsOCBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDU2LCA1NiwgNTYsIDU2IH0sCisJLm9wcwkJPSAmc2g3NzB4X3NjaV9wb3J0X29wcywKKwkucmVndHlwZQk9IFNDSXhfU0gzX1NDSUZfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYxX2RldmljZSA9IHsKQEAgLTE0NiwxMSArMTUyLDE0IEBACiAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5KQogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYyX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGE0MDAwMTQwLAorCS5wb3J0X3JlZwk9IFNDSXhfTk9UX1NVUFBPUlRFRCwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJLnNjc2NyCQk9IFNDU0NSX1RFIHwgU0NTQ1JfUkUsCiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9JUkRBLAogCS5pcnFzCQk9IHsgNTIsIDUyLCA1MiwgNTIgfSwKKwkub3BzCQk9ICZzaDc3MHhfc2NpX3BvcnRfb3BzLAorCS5yZWdzaGlmdAk9IDEsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMl9kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcyMC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MjAuYwppbmRleCAzNjViOTRhLi45NDkyMDM0IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcyMC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzIwLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfc2NpLmg+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+Ci0KICNkZWZpbmUgYnVpbGRfbW1pb19yZWFkKG5hbWUsIHNpemUsIHR5cGUsIHJlZywgYmFycmllcikgXAogc3RhdGljIGlubGluZSB0eXBlIG5hbWUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKSBcCiB7IHR5cGUgcmV0OyBhc20gdm9sYXRpbGUoIm1vdiIgc2l6ZSAiICUxLCUwIjpyZWcgKHJldCkgXApAQCAtMzM0LDYgKzMzMiw3IEBACiBleHRlcm4gYm9vbCBpc19lYXJseV9pb3JlbWFwX3B0ZXAocHRlX3QgKnB0ZXApOwogCiAjaWZkZWYgQ09ORklHX1hFTgorI2luY2x1ZGUgPHhlbi94ZW4uaD4KIHN0cnVjdCBiaW9fdmVjOwogCiBleHRlcm4gYm9vbCB4ZW5fYmlvdmVjX3BoeXNfbWVyZ2VhYmxlKGNvbnN0IHN0cnVjdCBiaW9fdmVjICp2ZWMxLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCAyMTkzNzE1Li4wZDExNzFjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtNzUxLDggKzc1MSw2IEBACiAJCSAgICAgOjogImEiIChlYXgpLCAiYyIgKGVjeCkpOwogfQogCi1leHRlcm4gdm9pZCBtd2FpdF9pZGxlX3dpdGhfaGludHModW5zaWduZWQgbG9uZyBlYXgsIHVuc2lnbmVkIGxvbmcgZWN4KTsKLQogZXh0ZXJuIHZvaWQgc2VsZWN0X2lkbGVfcm91dGluZShjb25zdCBzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwogZXh0ZXJuIHZvaWQgaW5pdF9hbWRfZTQwMF9jMWVfbWFzayh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvY3N0YXRlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9jc3RhdGUuYwppbmRleCA1ODEyNDA0Li5mNTBlN2ZiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9jc3RhdGUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9jc3RhdGUuYwpAQCAtMTQ5LDYgKzE0OSwyOSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoYWNwaV9wcm9jZXNzb3JfZmZoX2NzdGF0ZV9wcm9iZSk7CiAKKy8qCisgKiBUaGlzIHVzZXMgbmV3IE1PTklUT1IvTVdBSVQgaW5zdHJ1Y3Rpb25zIG9uIFA0IHByb2Nlc3NvcnMgd2l0aCBQTkksCisgKiB3aGljaCBjYW4gb2J2aWF0ZSBJUEkgdG8gdHJpZ2dlciBjaGVja2luZyBvZiBuZWVkX3Jlc2NoZWQuCisgKiBXZSBleGVjdXRlIE1PTklUT1IgYWdhaW5zdCBuZWVkX3Jlc2NoZWQgYW5kIGVudGVyIG9wdGltaXplZCB3YWl0IHN0YXRlCisgKiB0aHJvdWdoIE1XQUlULiBXaGVuZXZlciBzb21lb25lIGNoYW5nZXMgbmVlZF9yZXNjaGVkLCB3ZSB3b3VsZCBiZSB3b2tlbgorICogdXAgZnJvbSBNV0FJVCAod2l0aG91dCBhbiBJUEkpLgorICoKKyAqIE5ldyB3aXRoIENvcmUgRHVvIHByb2Nlc3NvcnMsIE1XQUlUIGNhbiB0YWtlIHNvbWUgaGludHMgYmFzZWQgb24gQ1BVCisgKiBjYXBhYmlsaXR5LgorICovCit2b2lkIG13YWl0X2lkbGVfd2l0aF9oaW50cyh1bnNpZ25lZCBsb25nIGF4LCB1bnNpZ25lZCBsb25nIGN4KQoreworCWlmICghbmVlZF9yZXNjaGVkKCkpIHsKKwkJaWYgKHRoaXNfY3B1X2hhcyhYODZfRkVBVFVSRV9DTEZMVVNIX01PTklUT1IpKQorCQkJY2xmbHVzaCgodm9pZCAqKSZjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzKTsKKworCQlfX21vbml0b3IoKHZvaWQgKikmY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncywgMCwgMCk7CisJCXNtcF9tYigpOworCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQorCQkJX19td2FpdChheCwgY3gpOworCX0KK30KKwogdm9pZCBhY3BpX3Byb2Nlc3Nvcl9mZmhfY3N0YXRlX2VudGVyKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3gpCiB7CiAJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGUxYmE4Y2IuLmU3ZTNiMDEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYwpAQCAtNDM4LDI5ICs0MzgsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3B1X2lkbGVfd2FpdCk7CiAKLS8qCi0gKiBUaGlzIHVzZXMgbmV3IE1PTklUT1IvTVdBSVQgaW5zdHJ1Y3Rpb25zIG9uIFA0IHByb2Nlc3NvcnMgd2l0aCBQTkksCi0gKiB3aGljaCBjYW4gb2J2aWF0ZSBJUEkgdG8gdHJpZ2dlciBjaGVja2luZyBvZiBuZWVkX3Jlc2NoZWQuCi0gKiBXZSBleGVjdXRlIE1PTklUT1IgYWdhaW5zdCBuZWVkX3Jlc2NoZWQgYW5kIGVudGVyIG9wdGltaXplZCB3YWl0IHN0YXRlCi0gKiB0aHJvdWdoIE1XQUlULiBXaGVuZXZlciBzb21lb25lIGNoYW5nZXMgbmVlZF9yZXNjaGVkLCB3ZSB3b3VsZCBiZSB3b2tlbgotICogdXAgZnJvbSBNV0FJVCAod2l0aG91dCBhbiBJUEkpLgotICoKLSAqIE5ldyB3aXRoIENvcmUgRHVvIHByb2Nlc3NvcnMsIE1XQUlUIGNhbiB0YWtlIHNvbWUgaGludHMgYmFzZWQgb24gQ1BVCi0gKiBjYXBhYmlsaXR5LgotICovCi12b2lkIG13YWl0X2lkbGVfd2l0aF9oaW50cyh1bnNpZ25lZCBsb25nIGF4LCB1bnNpZ25lZCBsb25nIGN4KQotewotCWlmICghbmVlZF9yZXNjaGVkKCkpIHsKLQkJaWYgKHRoaXNfY3B1X2hhcyhYODZfRkVBVFVSRV9DTEZMVVNIX01PTklUT1IpKQotCQkJY2xmbHVzaCgodm9pZCAqKSZjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzKTsKLQotCQlfX21vbml0b3IoKHZvaWQgKikmY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncywgMCwgMCk7Ci0JCXNtcF9tYigpOwotCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQotCQkJX19td2FpdChheCwgY3gpOwotCX0KLX0KLQogLyogRGVmYXVsdCBNT05JVE9SL01XQUlUIHdpdGggbm8gaGludHMsIHVzZWQgZm9yIGRlZmF1bHQgQzEgc3RhdGUgKi8KIHN0YXRpYyB2b2lkIG13YWl0X2lkbGUodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCmluZGV4IGEzZDBkYzUuLjdhM2I2NTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtMTA5LDcgKzExMCw4IEBACiAJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCQkJLyogRG9uJ3QgdHJhY2UgaXJxcyBvZmYgZm9yIGlkbGUgKi8KIAkJCXN0b3BfY3JpdGljYWxfdGltaW5ncygpOwotCQkJcG1faWRsZSgpOworCQkJaWYgKGNwdWlkbGVfaWRsZV9jYWxsKCkpCisJCQkJcG1faWRsZSgpOwogCQkJc3RhcnRfY3JpdGljYWxfdGltaW5ncygpOwogCQl9CiAJCXRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2soKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCmluZGV4IGNhNmY3YWIuLmY2OTNlNDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtMTM2LDcgKzEzNyw4IEBACiAJCQllbnRlcl9pZGxlKCk7CiAJCQkvKiBEb24ndCB0cmFjZSBpcnFzIG9mZiBmb3IgaWRsZSAqLwogCQkJc3RvcF9jcml0aWNhbF90aW1pbmdzKCk7Ci0JCQlwbV9pZGxlKCk7CisJCQlpZiAoY3B1aWRsZV9pZGxlX2NhbGwoKSkKKwkJCQlwbV9pZGxlKCk7CiAJCQlzdGFydF9jcml0aWNhbF90aW1pbmdzKCk7CiAKIAkJCS8qIEluIG1hbnkgY2FzZXMgdGhlIGludGVycnVwdCB0aGF0IGVuZGVkIGlkbGUKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9hY3BpLmMgYi9hcmNoL3g4Ni9wY2kvYWNwaS5jCmluZGV4IDY4YzNjMTMuLmFlM2NiMjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9hY3BpLmMKKysrIGIvYXJjaC94ODYvcGNpL2FjcGkuYwpAQCAtMjQ2LDEwICsyNDYsOSBAQAogCiAJCWNvbmZsaWN0ID0gaW5zZXJ0X3Jlc291cmNlX2NvbmZsaWN0KHJvb3QsIHJlcyk7CiAJCWlmIChjb25mbGljdCkKLQkJCWRldl9lcnIoJmluZm8tPmJyaWRnZS0+ZGV2LAotCQkJCSJhZGRyZXNzIHNwYWNlIGNvbGxpc2lvbjogaG9zdCBicmlkZ2Ugd2luZG93ICVwUiAiCi0JCQkJImNvbmZsaWN0cyB3aXRoICVzICVwUlxuIiwKLQkJCQlyZXMsIGNvbmZsaWN0LT5uYW1lLCBjb25mbGljdCk7CisJCQlkZXZfaW5mbygmaW5mby0+YnJpZGdlLT5kZXYsCisJCQkJICJpZ25vcmluZyBob3N0IGJyaWRnZSB3aW5kb3cgJXBSIChjb25mbGljdHMgd2l0aCAlcyAlcFIpXG4iLAorCQkJCSByZXMsIGNvbmZsaWN0LT5uYW1lLCBjb25mbGljdCk7CiAJCWVsc2UKIAkJCXBjaV9idXNfYWRkX3Jlc291cmNlKGluZm8tPmJ1cywgcmVzLCAwKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvY2U0MTAwLmMgYi9hcmNoL3g4Ni9wY2kvY2U0MTAwLmMKaW5kZXggNjc4NThiZS4uOTkxNzYwOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2NlNDEwMC5jCisrKyBiL2FyY2gveDg2L3BjaS9jZTQxMDAuYwpAQCAtMjU3LDYgKzI1Nyw3IEBACiB7CiAJaW50IGk7CiAKKwlXQVJOX09OKHNlZyk7CiAJaWYgKGJ1cyA9PSAxKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJ1czFfZml4dXBzKTsgaSsrKSB7CiAJCQlpZiAoYnVzMV9maXh1cHNbaV0uZGV2X2Z1bmMgPT0gZGV2Zm4gJiYKQEAgLTI4Miw2ICsyODMsNyBAQAogewogCWludCBpOwogCisJV0FSTl9PTihzZWcpOwogCWlmIChidXMgPT0gMSkgewogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidXMxX2ZpeHVwcyk7IGkrKykgewogCQkJaWYgKGJ1czFfZml4dXBzW2ldLmRldl9mdW5jID09IGRldmZuICYmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvY29tbW9uLmMgYi9hcmNoL3g4Ni9wY2kvY29tbW9uLmMKaW5kZXggNWZlNzUwMi4uOTJkZjMyMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2NvbW1vbi5jCisrKyBiL2FyY2gveDg2L3BjaS9jb21tb24uYwpAQCAtMjQ3LDEzICsyNDcsNiBAQAogCX0sCiAjZW5kaWYJCS8qIF9faTM4Nl9fICovCiAJewotCQkuY2FsbGJhY2sgPSBmaW5kX3NvcnRfbWV0aG9kLAotCQkuaWRlbnQgPSAiRGVsbCBTeXN0ZW0iLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jIiksCi0JCX0sCi0JfSwKLQl7CiAJCS5jYWxsYmFjayA9IHNldF9iZl9zb3J0LAogCQkuaWRlbnQgPSAiRGVsbCBQb3dlckVkZ2UgMTk1MCIsCiAJCS5tYXRjaGVzID0gewpAQCAtMjk0LDYgKzI4NywxMyBAQAogCQl9LAogCX0sCiAJeworCQkuY2FsbGJhY2sgPSBmaW5kX3NvcnRfbWV0aG9kLAorCQkuaWRlbnQgPSAiRGVsbCBTeXN0ZW0iLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jIiksCisJCX0sCisJfSwKKwl7CiAJCS5jYWxsYmFjayA9IHNldF9iZl9zb3J0LAogCQkuaWRlbnQgPSAiSFAgUHJvTGlhbnQgQkwyMHAgRzMiLAogCQkubWF0Y2hlcyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9kaXJlY3QuYyBiL2FyY2gveDg2L3BjaS9kaXJlY3QuYwppbmRleCBlNmZkODQ3Li40ZjJjNzA0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvZGlyZWN0LmMKKysrIGIvYXJjaC94ODYvcGNpL2RpcmVjdC5jCkBAIC0yMiw3ICsyMiw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICgoYnVzID4gMjU1KSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiA0MDk1KSkgeworCWlmIChzZWcgfHwgKGJ1cyA+IDI1NSkgfHwgKGRldmZuID4gMjU1KSB8fCAocmVnID4gNDA5NSkpIHsKIAkJKnZhbHVlID0gLTE7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTUzLDcgKzUzLDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKChidXMgPiAyNTUpIHx8IChkZXZmbiA+IDI1NSkgfHwgKHJlZyA+IDQwOTUpKQorCWlmIChzZWcgfHwgKGJ1cyA+IDI1NSkgfHwgKGRldmZuID4gMjU1KSB8fCAocmVnID4gNDA5NSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwY2lfY29uZmlnX2xvY2ssIGZsYWdzKTsKQEAgLTk3LDYgKzk3LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBkZXYsIGZuOwogCisJV0FSTl9PTihzZWcpOwogCWlmICgoYnVzID4gMjU1KSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiAyNTUpKSB7CiAJCSp2YWx1ZSA9IC0xOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEzOCw2ICsxMzksNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGRldiwgZm47CiAKKwlXQVJOX09OKHNlZyk7CiAJaWYgKChidXMgPiAyNTUpIHx8IChkZXZmbiA+IDI1NSkgfHwgKHJlZyA+IDI1NSkpIAogCQlyZXR1cm4gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL251bWFxXzMyLmMgYi9hcmNoL3g4Ni9wY2kvbnVtYXFfMzIuYwppbmRleCA1YzllMjQ1Li41MTJhODhjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvbnVtYXFfMzIuYworKysgYi9hcmNoL3g4Ni9wY2kvbnVtYXFfMzIuYwpAQCAtMzQsNiArMzQsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdm9pZCAqYWRyIF9faW9tZW0gPSBYUVVBRF9QT1JUX0FERFIoMHhjZmMsIEJVUzJRVUFEKGJ1cykpOwogCisJV0FSTl9PTihzZWcpOwogCWlmICghdmFsdWUgfHwgKGJ1cyA+PSBNQVhfTVBfQlVTU0VTKSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiAyNTUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNzMsNiArNzQsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdm9pZCAqYWRyIF9faW9tZW0gPSBYUVVBRF9QT1JUX0FERFIoMHhjZmMsIEJVUzJRVUFEKGJ1cykpOwogCisJV0FSTl9PTihzZWcpOwogCWlmICgoYnVzID49IE1BWF9NUF9CVVNTRVMpIHx8IChkZXZmbiA+IDI1NSkgfHwgKHJlZyA+IDI1NSkpIAogCQlyZXR1cm4gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL29scGMuYyBiL2FyY2gveDg2L3BjaS9vbHBjLmMKaW5kZXggMTM3MDBlYy4uNTI2MjYwMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL29scGMuYworKysgYi9hcmNoL3g4Ni9wY2kvb2xwYy5jCkBAIC0yMDYsNiArMjA2LDggQEAKIHsKIAl1aW50MzJfdCAqYWRkcjsKIAorCVdBUk5fT04oc2VnKTsKKwogCS8qIFVzZSB0aGUgaGFyZHdhcmUgbWVjaGFuaXNtIGZvciBub24tc2ltdWxhdGVkIGRldmljZXMgKi8KIAlpZiAoIWlzX3NpbXVsYXRlZChidXMsIGRldmZuKSkKIAkJcmV0dXJuIHBjaV9kaXJlY3RfY29uZjEucmVhZChzZWcsIGJ1cywgZGV2Zm4sIHJlZywgbGVuLCB2YWx1ZSk7CkBAIC0yNjQsNiArMjY2LDggQEAKIHN0YXRpYyBpbnQgcGNpX29scGNfd3JpdGUodW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgaW50IGJ1cywKIAkJdW5zaWduZWQgaW50IGRldmZuLCBpbnQgcmVnLCBpbnQgbGVuLCB1aW50MzJfdCB2YWx1ZSkKIHsKKwlXQVJOX09OKHNlZyk7CisKIAkvKiBVc2UgdGhlIGhhcmR3YXJlIG1lY2hhbmlzbSBmb3Igbm9uLXNpbXVsYXRlZCBkZXZpY2VzICovCiAJaWYgKCFpc19zaW11bGF0ZWQoYnVzLCBkZXZmbikpCiAJCXJldHVybiBwY2lfZGlyZWN0X2NvbmYxLndyaXRlKHNlZywgYnVzLCBkZXZmbiwgcmVnLCBsZW4sIHZhbHVlKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9wY2Jpb3MuYyBiL2FyY2gveDg2L3BjaS9wY2Jpb3MuYwppbmRleCBhNWY3ZDBkLi5mNjg1NTM1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvcGNiaW9zLmMKKysrIGIvYXJjaC94ODYvcGNpL3BjYmlvcy5jCkBAIC0xODEsNiArMTgxLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgYnggPSAoYnVzIDw8IDgpIHwgZGV2Zm47CiAKKwlXQVJOX09OKHNlZyk7CiAJaWYgKCF2YWx1ZSB8fCAoYnVzID4gMjU1KSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiAyNTUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMjQ3LDYgKzI0OCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBsb25nIGJ4ID0gKGJ1cyA8PCA4KSB8IGRldmZuOwogCisJV0FSTl9PTihzZWcpOwogCWlmICgoYnVzID4gMjU1KSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiAyNTUpKSAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS92aXN3cy5jIGIvYXJjaC94ODYvcGNpL3Zpc3dzLmMKaW5kZXggMDMwMDhmNy4uNmYyZjhlZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL3Zpc3dzLmMKKysrIGIvYXJjaC94ODYvcGNpL3Zpc3dzLmMKQEAgLTI0LDcgKzI0LDcgQEAKIAogdW5zaWduZWQgaW50IHBjaV9idXMwLCBwY2lfYnVzMTsKIAotc3RhdGljIGludCBfX2luaXQgdmlzd3NfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCB2aXN3c19tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxLCBidXMgPSBkZXYtPmJ1cy0+bnVtYmVyOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L01ha2VmaWxlIGIvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC9NYWtlZmlsZQppbmRleCBmNjFjY2RkLi4xZWEzODc3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L01ha2VmaWxlCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvTWFrZWZpbGUKQEAgLTEsMyArMSw0IEBACiBvYmotJChDT05GSUdfWDg2X01SU1QpCQkrPSBtcnN0Lm8KIG9iai0kKENPTkZJR19YODZfTVJTVCkJCSs9IHZydGMubwogb2JqLSQoQ09ORklHX0VBUkxZX1BSSU5US19NUlNUKQkrPSBlYXJseV9wcmludGtfbXJzdC5vCitvYmotJChDT05GSUdfWDg2X01SU1QpCQkrPSBwbXUubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC9wbXUuYyBiL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvcG11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4MWRhNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvcG11LmMKQEAgLTAsMCArMSw4MTcgQEAKKy8qCisgKiBtcnN0L3BtdS5jIC0gZHJpdmVyIGZvciBNUlNUIFBvd2VyIE1hbmFnZW1lbnQgVW5pdAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2ZpLmg+CisjaW5jbHVkZSA8YXNtL2ludGVsX3NjdV9pcGMuaD4KKyNpbmNsdWRlICJwbXUuaCIKKworI2RlZmluZSBJUENNU0dfRldfUkVWSVNJT04JMHhGNAorCitzdHJ1Y3QgbXJzdF9kZXZpY2UgeworCXUxNiBwY2lfZGV2X251bTsJLyogREVCVUcgb25seSAqLworCXUxNiBsc3M7CisJdTE2IGxhdGVzdF9yZXF1ZXN0OworCXVuc2lnbmVkIGludCBwY2lfc3RhdGVfY291bnRzW1BDSV9EM2NvbGQgKyAxXTsgLyogREVCVUcgb25seSAqLworfTsKKworLyoKKyAqIGNvbWxldGUgbGlzdCBvZiBNUlNUIFBDSSBkZXZpY2VzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbXJzdF9kZXZpY2UgbXJzdF9kZXZzW10gPSB7CisvKiAgMCAqLyB7IDB4MDgwMCwgTFNTX1NQSTAgfSwJCS8qIE1vb3Jlc3Rvd24gU1BJIEN0cmwgMCAqLworLyogIDEgKi8geyAweDA4MDEsIExTU19TUEkxIH0sCQkvKiBNb29yZXN0b3duIFNQSSBDdHJsIDEgKi8KKy8qICAyICovIHsgMHgwODAyLCBMU1NfSTJDMCB9LAkJLyogTW9vcmVzdG93biBJMkMgMCAqLworLyogIDMgKi8geyAweDA4MDMsIExTU19JMkMxIH0sCQkvKiBNb29yZXN0b3duIEkyQyAxICovCisvKiAgNCAqLyB7IDB4MDgwNCwgTFNTX0kyQzIgfSwJCS8qIE1vb3Jlc3Rvd24gSTJDIDIgKi8KKy8qICA1ICovIHsgMHgwODA1LCBMU1NfS0JEIH0sCQkvKiBNb29yZXN0b3duIEtleWJvYXJkIEN0cmwgKi8KKy8qICA2ICovIHsgMHgwODA2LCBMU1NfVVNCX0hDIH0sCS8qIE1vb3Jlc3Rvd24gVVNCIEN0cmwgKi8KKy8qICA3ICovIHsgMHgwODA3LCBMU1NfU0RfSEMwIH0sCS8qIE1vb3Jlc3Rvd24gU0QgSG9zdCBDdHJsIDAgKi8KKy8qICA4ICovIHsgMHgwODA4LCBMU1NfU0RfSEMxIH0sCS8qIE1vb3Jlc3Rvd24gU0QgSG9zdCBDdHJsIDEgKi8KKy8qICA5ICovIHsgMHgwODA5LCBMU1NfTkFORCB9LAkJLyogTW9vcmVzdG93biBOQU5EIEN0cmwgKi8KKy8qIDEwICovIHsgMHgwODBhLCBMU1NfQVVESU8gfSwJCS8qIE1vb3Jlc3Rvd24gQXVkaW8gQ3RybCAqLworLyogMTEgKi8geyAweDA4MGIsIExTU19JTUFHSU5HIH0sCS8qIE1vb3Jlc3Rvd24gSVNQICovCisvKiAxMiAqLyB7IDB4MDgwYywgTFNTX1NFQ1VSSVRZIH0sCS8qIE1vb3Jlc3Rvd24gU2VjdXJpdHkgQ29udHJvbGxlciAqLworLyogMTMgKi8geyAweDA4MGQsIExTU19ESVNQTEFZIH0sCS8qIE1vb3Jlc3Rvd24gRXh0ZXJuYWwgRGlzcGxheXMgKi8KKy8qIDE0ICovIHsgMHgwODBlLCAwIH0sCQkJLyogTW9vcmVzdG93biBTQ1UgSVBDICovCisvKiAxNSAqLyB7IDB4MDgwZiwgTFNTX0dQSU8gfSwJCS8qIE1vb3Jlc3Rvd24gR1BJTyBDb250cm9sbGVyICovCisvKiAxNiAqLyB7IDB4MDgxMCwgMCB9LAkJCS8qIE1vb3Jlc3Rvd24gUG93ZXIgTWFuYWdlbWVudCBVbml0ICovCisvKiAxNyAqLyB7IDB4MDgxMSwgTFNTX1VTQl9PVEcgfSwJLyogTW9vcmVzdG93biBPVEcgQ3RybCAqLworLyogMTggKi8geyAweDA4MTIsIExTU19TUEkyIH0sCQkvKiBNb29yZXN0b3duIFNQSSBDdHJsIDIgKi8KKy8qIDE5ICovIHsgMHgwODEzLCAwIH0sCQkJLyogTW9vcmVzdG93biBTQyBETUEgKi8KKy8qIDIwICovIHsgMHgwODE0LCBMU1NfQVVESU9fTFBFIH0sCS8qIE1vb3Jlc3Rvd24gTFBFIERNQSAqLworLyogMjEgKi8geyAweDA4MTUsIExTU19BVURJT19TU1AgfSwJLyogTW9vcmVzdG93biBTU1AwICovCisKKy8qIDIyICovIHsgMHgwODRGLCBMU1NfU0RfSEMyIH0sCS8qIE1vb3Jlc3Rvd24gU0QgSG9zdCBDdHJsIDIgKi8KKworLyogMjMgKi8geyAweDQxMDIsIDAgfSwJCQkvKiBMaW5jcm9mdCAqLworLyogMjQgKi8geyAweDQxMTAsIDAgfSwJCQkvKiBMaW5jcm9mdCAqLworfTsKKworLyogbi5iLiBXZSBpZ25vcmUgUENJLWlkIDB4ODE1IGluIExTUzkgYi9jIE1lZUdvIGhhcyBubyBkcml2ZXIgZm9yIGl0ICovCitzdGF0aWMgdTE2IG1yc3RfbHNzOV9wY2lfaWRzW10gPSB7MHgwODBhLCAweDA4MTQsIDB9Oworc3RhdGljIHUxNiBtcnN0X2xzczEwX3BjaV9pZHNbXSA9IHsweDA4MDAsIDB4MDgwMSwgMHgwODAyLCAweDA4MDMsCisJCQkJCTB4MDgwNCwgMHgwODA1LCAweDA4MGYsIDB9OworCisvKiBoYW5kbGUgY29uY3VycmVudCBTTVAgaW52b2thdGlvbnMgb2YgcG11X3BjaV9zZXRfcG93ZXJfc3RhdGUoKSAqLworc3RhdGljIHNwaW5sb2NrX3QgbXJzdF9wbXVfcG93ZXJfc3RhdGVfbG9jazsKKworc3RhdGljIHVuc2lnbmVkIGludCB3YWtlX2NvdW50ZXJzW01SU1RfTlVNX0xTU107CS8qIERFQlVHIG9ubHkgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcG11X2lycV9zdGF0c1tJTlRfSU5WQUxJRCArIDFdOwkvKiBERUJVRyBvbmx5ICovCisKK3N0YXRpYyBpbnQgZ3JhcGhpY3NfaXNfb2ZmOworc3RhdGljIGludCBsc3NfczBpM19lbmFibGVkOworc3RhdGljIGJvb2wgbXJzdF9wbXVfczBpM19lbmFibGU7CisKKy8qICBkZWJ1ZyBjb3VudGVycyAqLworc3RhdGljIHUzMiBwbXVfd2FpdF9yZWFkeV9jYWxsczsKK3N0YXRpYyB1MzIgcG11X3dhaXRfcmVhZHlfdWRlbGF5czsKK3N0YXRpYyB1MzIgcG11X3dhaXRfcmVhZHlfdWRlbGF5c19tYXg7CitzdGF0aWMgdTMyIHBtdV93YWl0X2RvbmVfY2FsbHM7CitzdGF0aWMgdTMyIHBtdV93YWl0X2RvbmVfdWRlbGF5czsKK3N0YXRpYyB1MzIgcG11X3dhaXRfZG9uZV91ZGVsYXlzX21heDsKK3N0YXRpYyB1MzIgcG11X3NldF9wb3dlcl9zdGF0ZV9lbnRyeTsKK3N0YXRpYyB1MzIgcG11X3NldF9wb3dlcl9zdGF0ZV9zZW5kX2NtZDsKKworc3RhdGljIHN0cnVjdCBtcnN0X2RldmljZSAqcGNpX2lkXzJfbXJzdF9kZXYodTE2IHBjaV9kZXZfbnVtKQoreworCWludCBpbmRleCA9IDA7CisKKwlpZiAoKHBjaV9kZXZfbnVtID49IDB4MDgwMCkgJiYgKHBjaV9kZXZfbnVtIDw9IDB4ODE1KSkKKwkJaW5kZXggPSBwY2lfZGV2X251bSAtIDB4ODAwOworCWVsc2UgaWYgKHBjaV9kZXZfbnVtID09IDB4MDg0RikKKwkJaW5kZXggPSAyMjsKKwllbHNlIGlmIChwY2lfZGV2X251bSA9PSAweDQxMDIpCisJCWluZGV4ID0gMjM7CisJZWxzZSBpZiAocGNpX2Rldl9udW0gPT0gMHg0MTEwKQorCQlpbmRleCA9IDI0OworCisJaWYgKHBjaV9kZXZfbnVtICE9IG1yc3RfZGV2c1tpbmRleF0ucGNpX2Rldl9udW0pIHsKKwkJV0FSTl9PTkNFKDEsIEZXX0JVRyAiVW5rbm93biBQQ0kgZGV2aWNlIDB4JTA0WFxuIiwgcGNpX2Rldl9udW0pOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gJm1yc3RfZGV2c1tpbmRleF07Cit9CisKKy8qKgorICogbXJzdF9wbXVfdmFsaWRhdGVfY3N0YXRlcworICogQGRldjogY3B1aWRsZV9kZXZpY2UKKyAqCisgKiBDZXJ0YWluIHN0YXRlcyBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciBnb3Zlcm5vciB0byBwaWNrIGluIHNvbWUgY2FzZXMuCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFzIGNwdWlkbGVfZGV2aWNlJ3MgcHJlcGFyZSBjYWxsYmFjayBhbmQKKyAqIHRodXMgdGVsbHMgZ292ZXJub3IgdG8gaWdub3JlIHN1Y2ggc3RhdGVzIHdoZW4gc2VsZWN0aW5nIHRoZSBuZXh0IHN0YXRlCisgKiB0byBlbnRlci4KKyAqLworCisjZGVmaW5lIElETEVfU1RBVEU0X0lTX0M2CTQKKyNkZWZpbmUgSURMRV9TVEFURTVfSVNfUzBJMwk1CisKK2ludCBtcnN0X3BtdV9pbnZhbGlkX2NzdGF0ZXModm9pZCkKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJLyoKKwkgKiBEZW1vdGUgdG8gQzQgaWYgdGhlIFBNVSBpcyBidXN5LgorCSAqIFNpbmNlIExTUyBjaGFuZ2VzIGxlYXZlIHRoZSBidXN5IGJpdCBjbGVhci4uLgorCSAqIGJ1c3kgbWVhbnMgZWl0aGVyIHRoZSBQTVUgaXMgd2FpdGluZyBmb3IgYW4gQUNLLUM2IHRoYXQKKwkgKiBpc24ndCBjb21pbmcgZHVlIHRvIGFuIE1XQUlUIHRoYXQgcmV0dXJuZWQgaW1tZWRpYXRlbHk7CisJICogb3Igd2UgcmV0dXJuZWQgZnJvbSBTMGkzIHN1Y2Nlc3NmdWxseSwgYW5kIHRoZSBQTVUKKwkgKiBpcyBub3QgZG9uZSBzZW5kaW5nIHVzIGludGVycnVwdHMuCisJICovCisJaWYgKHBtdV9yZWFkX2J1c3lfc3RhdHVzKCkpCisJCXJldHVybiAxIDw8IElETEVfU1RBVEU0X0lTX0M2IHwgMSA8PCBJRExFX1NUQVRFNV9JU19TMEkzOworCisJLyoKKwkgKiBEaXNhbGxvdyBTMGkzIGlmOiBQTVUgaXMgbm90IGluaXRpYWxpemVkLCBvciBDUFUxIGlzIGFjdGl2ZSwKKwkgKiBvciBpZiBkZXZpY2UgTFNTIGlzIGluc3VmZmljaWVudCwgb3IgdGhlIEdQVSBpcyBhY3RpdmUsCisJICogb3IgaWYgaXQgaGFzIGJlZW4gZXhwbGljaXRseSBkaXNhYmxlZC4KKwkgKi8KKwlpZiAoIXBtdV9yZWcgfHwgIWNwdW1hc2tfZXF1YWwoY3B1X29ubGluZV9tYXNrLCBjcHVtYXNrX29mKGNwdSkpIHx8CisJICAgICFsc3NfczBpM19lbmFibGVkIHx8ICFncmFwaGljc19pc19vZmYgfHwgIW1yc3RfcG11X3MwaTNfZW5hYmxlKQorCQlyZXR1cm4gMSA8PCBJRExFX1NUQVRFNV9JU19TMEkzOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwbXVfdXBkYXRlX3dha2VfY291bnRlcnMoKTogcmVhZCBQTV9XS1MsIHVwZGF0ZSB3YWtlX2NvdW50ZXJzW10KKyAqIERFQlVHIG9ubHkuCisgKi8KK3N0YXRpYyB2b2lkIHBtdV91cGRhdGVfd2FrZV9jb3VudGVycyh2b2lkKQoreworCWludCBsc3M7CisJdTMyIHdha2Vfc3RhdHVzOworCisJd2FrZV9zdGF0dXMgPSBwbXVfcmVhZF93a3MoKTsKKworCWZvciAobHNzID0gMDsgbHNzIDwgTVJTVF9OVU1fTFNTOyArK2xzcykgeworCQlpZiAod2FrZV9zdGF0dXMgJiAoMSA8PCBsc3MpKQorCQkJd2FrZV9jb3VudGVyc1tsc3NdKys7CisJfQorfQorCitpbnQgbXJzdF9wbXVfczBpM19lbnRyeSh2b2lkKQoreworCWludCBzdGF0dXM7CisKKwkvKiBDbGVhciBhbnkgcG9zc2libGUgZXJyb3IgY29uZGl0aW9ucyAqLworCXBtdV93cml0ZV9pY3MoMHgzMDApOworCisJLyogc2V0IHdha2UgY29udHJvbCB0byBjdXJyZW50IEQtc3RhdGVzICovCisJcG11X3dyaXRlX3dzc2MoUzBJM19TU1NfVEFSR0VUKTsKKworCXN0YXR1cyA9IG1yc3RfczBpM19lbnRyeShQTV9TMEkzX0NPTU1BTkQsICZwbXVfcmVnLT5wbV9jbWQpOworCXBtdV91cGRhdGVfd2FrZV9jb3VudGVycygpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIHBvbGwgZm9yIG1heGltdW0gb2YgNW1zIGZvciBidXN5IGJpdCB0byBjbGVhciAqLworc3RhdGljIGludCBwbXVfd2FpdF9yZWFkeSh2b2lkKQoreworCWludCB1ZGVsYXlzOworCisJcG11X3dhaXRfcmVhZHlfY2FsbHMrKzsKKworCWZvciAodWRlbGF5cyA9IDA7IHVkZWxheXMgPCA1MDA7ICsrdWRlbGF5cykgeworCQlpZiAodWRlbGF5cyA+IHBtdV93YWl0X3JlYWR5X3VkZWxheXNfbWF4KQorCQkJcG11X3dhaXRfcmVhZHlfdWRlbGF5c19tYXggPSB1ZGVsYXlzOworCisJCWlmIChwbXVfcmVhZF9idXN5X3N0YXR1cygpID09IDApCisJCQlyZXR1cm4gMDsKKworCQl1ZGVsYXkoMTApOworCQlwbXVfd2FpdF9yZWFkeV91ZGVsYXlzKys7CisJfQorCisJLyoKKwkgKiBpZiB0aGlzIGZpcmVzLCBvYnNlcnZlCisJICogL3N5cy9rZXJuZWwvZGVidWcvbXJzdF9wbXVfd2FpdF9yZWFkeV9jYWxscworCSAqIC9zeXMva2VybmVsL2RlYnVnL21yc3RfcG11X3dhaXRfcmVhZHlfdWRlbGF5cworCSAqLworCVdBUk5fT05DRSgxLCAiU0NVIG5vdCByZWFkeSBmb3IgNW1zIik7CisJcmV0dXJuIC1FQlVTWTsKK30KKy8qIHBvbGwgZm9yIG1heGltdW0gb2YgNTBtcyB1cyBmb3IgYnVzeSBiaXQgdG8gY2xlYXIgKi8KK3N0YXRpYyBpbnQgcG11X3dhaXRfZG9uZSh2b2lkKQoreworCWludCB1ZGVsYXlzOworCisJcG11X3dhaXRfZG9uZV9jYWxscysrOworCisJZm9yICh1ZGVsYXlzID0gMDsgdWRlbGF5cyA8IDUwMDsgKyt1ZGVsYXlzKSB7CisJCWlmICh1ZGVsYXlzID4gcG11X3dhaXRfZG9uZV91ZGVsYXlzX21heCkKKwkJCXBtdV93YWl0X2RvbmVfdWRlbGF5c19tYXggPSB1ZGVsYXlzOworCisJCWlmIChwbXVfcmVhZF9idXN5X3N0YXR1cygpID09IDApCisJCQlyZXR1cm4gMDsKKworCQl1ZGVsYXkoMTAwKTsKKwkJcG11X3dhaXRfZG9uZV91ZGVsYXlzKys7CisJfQorCisJLyoKKwkgKiBpZiB0aGlzIGZpcmVzLCBvYnNlcnZlCisJICogL3N5cy9rZXJuZWwvZGVidWcvbXJzdF9wbXVfd2FpdF9kb25lX2NhbGxzCisJICogL3N5cy9rZXJuZWwvZGVidWcvbXJzdF9wbXVfd2FpdF9kb25lX3VkZWxheXMKKwkgKi8KKwlXQVJOX09OQ0UoMSwgIlNDVSBub3QgZG9uZSBmb3IgNTBtcyIpOworCXJldHVybiAtRUJVU1k7Cit9CisKK3UzMiBtcnN0X3BtdV9tc2lfaXNfZGlzYWJsZWQodm9pZCkKK3sKKwlyZXR1cm4gcG11X21zaV9pc19kaXNhYmxlZCgpOworfQorCit2b2lkIG1yc3RfcG11X2VuYWJsZV9tc2kodm9pZCkKK3sKKwlwbXVfbXNpX2VuYWJsZSgpOworfQorCisvKioKKyAqIHBtdV9pcnEgLSBwbXUgZHJpdmVyIGludGVycnVwdCBoYW5kbGVyCisgKiBDb250ZXh0OiBpbnRlcnJ1cHQgY29udGV4dAorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgcG11X2lycShpbnQgaXJxLCB2b2lkICpkdW1teSkKK3sKKwl1bmlvbiBwbXVfcG1faWNzIHBtdV9pY3M7CisKKwlwbXVfaWNzLnZhbHVlID0gcG11X3JlYWRfaWNzKCk7CisKKwlpZiAoIXBtdV9pY3MuYml0cy5wZW5kaW5nKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlzd2l0Y2ggKHBtdV9pY3MuYml0cy5jYXVzZSkgeworCWNhc2UgSU5UX1NQVVJJT1VTOgorCWNhc2UgSU5UX0NNRF9ET05FOgorCWNhc2UgSU5UX0NNRF9FUlI6CisJY2FzZSBJTlRfV0FLRV9SWDoKKwljYXNlIElOVF9TU19FUlJPUjoKKwljYXNlIElOVF9TMElYX01JU1M6CisJY2FzZSBJTlRfTk9fQUNLQzY6CisJCXBtdV9pcnFfc3RhdHNbcG11X2ljcy5iaXRzLmNhdXNlXSsrOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwbXVfaXJxX3N0YXRzW0lOVF9JTlZBTElEXSsrOworCX0KKworCXBtdV93cml0ZV9pY3MocG11X2ljcy52YWx1ZSk7IC8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0ICovCisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBUcmFuc2xhdGUgUENJIHBvd2VyIG1hbmFnZW1lbnQgdG8gTVJTVCBMU1MgRC1zdGF0ZXMKKyAqLworc3RhdGljIGludCBwY2lfMl9tcnN0X3N0YXRlKGludCBsc3MsIHBjaV9wb3dlcl90IHBjaV9zdGF0ZSkKK3sKKwlzd2l0Y2ggKHBjaV9zdGF0ZSkgeworCWNhc2UgUENJX0QwOgorCQlpZiAoU1NNU0soRDBpMSwgbHNzKSAmIEQwSTFfQUNHX1NTU19UQVJHRVQpCisJCQlyZXR1cm4gRDBpMTsKKwkJZWxzZQorCQkJcmV0dXJuIEQwOworCWNhc2UgUENJX0QxOgorCQlyZXR1cm4gRDBpMTsKKwljYXNlIFBDSV9EMjoKKwkJcmV0dXJuIEQwaTI7CisJY2FzZSBQQ0lfRDNob3Q6CisJY2FzZSBQQ0lfRDNjb2xkOgorCQlyZXR1cm4gRDBpMzsKKwlkZWZhdWx0OgorCQlXQVJOKDEsICJwY2lfc3RhdGUgJWRcbiIsIHBjaV9zdGF0ZSk7CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludCBwbXVfaXNzdWVfY29tbWFuZCh1MzIgcG1fc3NjKQoreworCXVuaW9uIHBtdV9wbV9zZXRfY2ZnX2NtZF90IGNvbW1hbmQ7CisKKwlpZiAocG11X3JlYWRfYnVzeV9zdGF0dXMoKSkgeworCQlwcl9kZWJ1ZygicG11IGlzIGJ1c3ksIE9wZXJhdGlvbiBub3QgcGVybWl0dGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogZW5hYmxlIGludGVycnVwdHMgaW4gUE1VIHNvIHRoYXQgaW50ZXJydXB0cyBhcmUKKwkgKiBwcm9wYWdhdGVkIHdoZW4gaW9jIGJpdCBmb3IgYSBwYXJ0aWN1bGFyIHNldAorCSAqIGNvbW1hbmQgaXMgc2V0CisJICovCisKKwlwbXVfaXJxX2VuYWJsZSgpOworCisJLyogQ29uZmlndXJlIHRoZSBzdWIgc3lzdGVtcyBmb3IgcG11MiAqLworCisJcG11X3dyaXRlX3NzYyhwbV9zc2MpOworCisJLyoKKwkgKiBTZW5kIHRoZSBzZXQgY29uZmlnIGNvbW1hbmQgZm9yIHBtdSBpdHMgY29uZmlndXJlZAorCSAqIGZvciBtb2RlIENNX0lNTUVESUFURSAmIGhlbmNlIHdpdGggTm8gVHJpZ2dlcgorCSAqLworCisJY29tbWFuZC5wbXUyX3BhcmFtcy5kX3BhcmFtLmNmZ19tb2RlID0gQ01fSU1NRURJQVRFOworCWNvbW1hbmQucG11Ml9wYXJhbXMuZF9wYXJhbS5jZmdfZGVsYXkgPSAwOworCWNvbW1hbmQucG11Ml9wYXJhbXMuZF9wYXJhbS5yc3ZkID0gMDsKKworCS8qIGNvbnN0cnVjdCB0aGUgY29tbWFuZCB0byBzZW5kIFNFVF9DRkcgdG8gcGFydGljdWxhciBQTVUgKi8KKwljb21tYW5kLnBtdTJfcGFyYW1zLmRfcGFyYW0uY21kID0gU0VUX0NGR19DTUQ7CisJY29tbWFuZC5wbXUyX3BhcmFtcy5kX3BhcmFtLmlvYyA9IDA7CisJY29tbWFuZC5wbXUyX3BhcmFtcy5kX3BhcmFtLm1vZGVfaWQgPSAwOworCWNvbW1hbmQucG11Ml9wYXJhbXMuZF9wYXJhbS5zeXNfc3RhdGUgPSBTWVNfU1RBVEVfUzBJMDsKKworCS8qIHdyaXRlIHRoZSB2YWx1ZSBvZiBQTV9DTUQgaW50byBwYXJ0aWN1bGFyIFBNVSAqLworCXByX2RlYnVnKCJwbXUgY29tbWFuZCBiZWluZyB3cml0dGVuICV4XG4iLAorCQkJY29tbWFuZC5wbXVfcG1fc2V0X2NmZ19jbWRfdmFsdWUpOworCisJcG11X3dyaXRlX2NtZChjb21tYW5kLnBtdV9wbV9zZXRfY2ZnX2NtZF92YWx1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUxNiBwbXVfbWluX2xzc19wY2lfcmVxKHUxNiAqaWRzLCB1MTYgcGNpX3N0YXRlKQoreworCXUxNiBleGlzdGluZ19yZXF1ZXN0OworCWludCBpOworCisJZm9yIChpID0gMDsgaWRzW2ldOyArK2kpIHsKKwkJc3RydWN0IG1yc3RfZGV2aWNlICptcnN0X2RldjsKKworCQltcnN0X2RldiA9IHBjaV9pZF8yX21yc3RfZGV2KGlkc1tpXSk7CisJCWlmICh1bmxpa2VseSghbXJzdF9kZXYpKQorCQkJY29udGludWU7CisKKwkJZXhpc3RpbmdfcmVxdWVzdCA9IG1yc3RfZGV2LT5sYXRlc3RfcmVxdWVzdDsKKwkJaWYgKGV4aXN0aW5nX3JlcXVlc3QgPCBwY2lfc3RhdGUpCisJCQlwY2lfc3RhdGUgPSBleGlzdGluZ19yZXF1ZXN0OworCX0KKwlyZXR1cm4gcGNpX3N0YXRlOworfQorCisvKioKKyAqIHBtdV9wY2lfc2V0X3Bvd2VyX3N0YXRlIC0gQ2FsbGJhY2sgZnVuY3Rpb24gaXMgdXNlZCBieSBhbGwgdGhlIFBDSSBkZXZpY2VzCisgKgkJCWZvciBhIHBsYXRmb3JtICBzcGVjaWZpYyBkZXZpY2UgcG93ZXIgb24vc2h1dGRvd24uCisgKi8KKworaW50IHBtdV9wY2lfc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwY2lfcG93ZXJfdCBwY2lfc3RhdGUpCit7CisJdTMyIG9sZF9zc3MsIG5ld19zc3M7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IG1yc3RfZGV2aWNlICptcnN0X2RldjsKKworCXBtdV9zZXRfcG93ZXJfc3RhdGVfZW50cnkrKzsKKworCUJVR19PTihwZGV2LT52ZW5kb3IgIT0gUENJX1ZFTkRPUl9JRF9JTlRFTCk7CisJQlVHX09OKHBjaV9zdGF0ZSA8IFBDSV9EMCB8fCBwY2lfc3RhdGUgPiBQQ0lfRDNjb2xkKTsKKworCW1yc3RfZGV2ID0gcGNpX2lkXzJfbXJzdF9kZXYocGRldi0+ZGV2aWNlKTsKKwlpZiAodW5saWtlbHkoIW1yc3RfZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltcnN0X2Rldi0+cGNpX3N0YXRlX2NvdW50c1twY2lfc3RhdGVdKys7CS8qIGNvdW50IGludm9jYXRpb25zICovCisKKwkvKiBQTVUgZHJpdmVyIGNhbGxzIHNlbGYgYXMgcGFydCBvZiBQQ0kgaW5pdGlhbGl6YXRpb24sIGlnbm9yZSAqLworCWlmIChwZGV2LT5kZXZpY2UgPT0gUENJX0RFVl9JRF9NUlNUX1BNVSkKKwkJcmV0dXJuIDA7CisKKwlCVUdfT04oIXBtdV9yZWcpOyAvKiBTVyBidWcgaWYgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXplZCAqLworCisJc3Bpbl9sb2NrKCZtcnN0X3BtdV9wb3dlcl9zdGF0ZV9sb2NrKTsKKworCWlmIChwZGV2LT5kM19kZWxheSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJkM19kZWxheSAlZCwgc2hvdWxkIGJlIDBcbiIsCisJCQlwZGV2LT5kM19kZWxheSk7CisJCXBkZXYtPmQzX2RlbGF5ID0gMDsKKwl9CisJLyoKKwkgKiBJZiBMaW5jcm9mdCBncmFwaGljcywgc2ltcGx5IHJlbWVtYmVyIHN0YXRlCisJICovCisJaWYgKChwZGV2LT5jbGFzcyA+PiAxNikgPT0gUENJX0JBU0VfQ0xBU1NfRElTUExBWQorCQkmJiAhKChwZGV2LT5jbGFzcyAmIFBDSV9TVUJfQ0xBU1NfTUFTSykgPj4gOCkpIHsKKwkJaWYgKHBjaV9zdGF0ZSA9PSBQQ0lfRDApCisJCQlncmFwaGljc19pc19vZmYgPSAwOworCQllbHNlCisJCQlncmFwaGljc19pc19vZmYgPSAxOworCQlnb3RvIHJldDsKKwl9CisKKwlpZiAoIW1yc3RfZGV2LT5sc3MpCisJCWdvdG8gcmV0OwkvKiBkZXZpY2Ugd2l0aCBubyBMU1MgKi8KKworCWlmIChtcnN0X2Rldi0+bGF0ZXN0X3JlcXVlc3QgPT0gcGNpX3N0YXRlKQorCQlnb3RvIHJldDsJLyogbm8gY2hhbmdlICovCisKKwltcnN0X2Rldi0+bGF0ZXN0X3JlcXVlc3QgPSBwY2lfc3RhdGU7CS8qIHJlY29yZCBsYXRlc3QgcmVxdWVzdCAqLworCisJLyoKKwkgKiBMU1M5IGFuZCBMU1MxMCBjb250YWluIG11bHRpcGxlIFBDSSBkZXZpY2VzLgorCSAqIFVzZSB0aGUgbG93ZXN0IG51bWJlcmVkIChoaWdoZXN0IHBvd2VyKSBzdGF0ZSBpbiB0aGUgTFNTCisJICovCisJaWYgKG1yc3RfZGV2LT5sc3MgPT0gOSkKKwkJcGNpX3N0YXRlID0gcG11X21pbl9sc3NfcGNpX3JlcShtcnN0X2xzczlfcGNpX2lkcywgcGNpX3N0YXRlKTsKKwllbHNlIGlmIChtcnN0X2Rldi0+bHNzID09IDEwKQorCQlwY2lfc3RhdGUgPSBwbXVfbWluX2xzc19wY2lfcmVxKG1yc3RfbHNzMTBfcGNpX2lkcywgcGNpX3N0YXRlKTsKKworCXN0YXR1cyA9IHBtdV93YWl0X3JlYWR5KCk7CisJaWYgKHN0YXR1cykKKwkJZ290byByZXQ7CisKKwlvbGRfc3NzID0gcG11X3JlYWRfc3NzKCk7CisJbmV3X3NzcyA9IG9sZF9zc3MgJiB+U1NNU0soMywgbXJzdF9kZXYtPmxzcyk7CisJbmV3X3NzcyB8PSBTU01TSyhwY2lfMl9tcnN0X3N0YXRlKG1yc3RfZGV2LT5sc3MsIHBjaV9zdGF0ZSksCisJCQltcnN0X2Rldi0+bHNzKTsKKworCWlmIChuZXdfc3NzID09IG9sZF9zc3MpCisJCWdvdG8gcmV0OwkvKiBub3RoaW5nIHRvIGRvICovCisKKwlwbXVfc2V0X3Bvd2VyX3N0YXRlX3NlbmRfY21kKys7CisKKwlzdGF0dXMgPSBwbXVfaXNzdWVfY29tbWFuZChuZXdfc3NzKTsKKworCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIElzc3VlIGEgUE0gY29tbWFuZFxuIik7CisJCWdvdG8gcmV0OworCX0KKworCWlmIChwbXVfd2FpdF9kb25lKCkpCisJCWdvdG8gcmV0OworCisJbHNzX3MwaTNfZW5hYmxlZCA9CisJKChwbXVfcmVhZF9zc3MoKSAmIFMwSTNfU1NTX1RBUkdFVCkgPT0gUzBJM19TU1NfVEFSR0VUKTsKK3JldDoKKwlzcGluX3VubG9jaygmbXJzdF9wbXVfcG93ZXJfc3RhdGVfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RhdGljIGNoYXIgKmQwaXhfbmFtZXNbXSA9IHsiRDAiLCAiRDBpMSIsICJEMGkyIiwgIkQwaTMifTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpkMGl4X25hbWUoaW50IHN0YXRlKQoreworCXJldHVybiBkMGl4X25hbWVzWyhpbnQpIHN0YXRlXTsKK30KKworc3RhdGljIGludCBkZWJ1Z19tcnN0X3BtdV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdW51c2VkKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKwl1MzIgY3VyX3Btc3NzOworCWludCBsc3M7CisKKwlzZXFfcHJpbnRmKHMsICIweCUwOFggRDBJMV9BQ0dfU1NTX1RBUkdFVFxuIiwgRDBJMV9BQ0dfU1NTX1RBUkdFVCk7CisKKwljdXJfcG1zc3MgPSBwbXVfcmVhZF9zc3MoKTsKKworCXNlcV9wcmludGYocywgIjB4JTA4WCBTMEkzX1NTU19UQVJHRVRcbiIsIFMwSTNfU1NTX1RBUkdFVCk7CisKKwlzZXFfcHJpbnRmKHMsICIweCUwOFggQ3VycmVudCBTU1MgIiwgY3VyX3Btc3NzKTsKKwlzZXFfcHJpbnRmKHMsIGxzc19zMGkzX2VuYWJsZWQgPyAiXG4iIDogIltCTE9DS1MgczBpM11cbiIpOworCisJaWYgKGNwdW1hc2tfZXF1YWwoY3B1X29ubGluZV9tYXNrLCBjcHVtYXNrX29mKDApKSkKKwkJc2VxX3ByaW50ZihzLCAiY3B1MCBpcyBvbmx5IGNwdSBvbmxpbmVcbiIpOworCWVsc2UKKwkJc2VxX3ByaW50ZihzLCAiY3B1MCBpcyBOT1Qgb25seSBjcHUgb25saW5lIFtCTE9DS1MgUzBpM11cbiIpOworCisJc2VxX3ByaW50ZihzLCAiR0ZYOiAlc1xuIiwgZ3JhcGhpY3NfaXNfb2ZmID8gIiIgOiAiW0JMT0NLUyBzMGkzXSIpOworCisKKwlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKKwkJaW50IHBvczsKKwkJdTE2IHBtY3NyOworCQlzdHJ1Y3QgbXJzdF9kZXZpY2UgKm1yc3RfZGV2OworCQlpbnQgaTsKKworCQltcnN0X2RldiA9IHBjaV9pZF8yX21yc3RfZGV2KHBkZXYtPmRldmljZSk7CisKKwkJc2VxX3ByaW50ZihzLCAiJXMgJTA0eC8lMDRYICUtMTYuMTZzICIsCisJCQlkZXZfbmFtZSgmcGRldi0+ZGV2KSwKKwkJCXBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlLAorCQkJZGV2X2RyaXZlcl9zdHJpbmcoJnBkZXYtPmRldikpOworCisJCWlmICh1bmxpa2VseSAoIW1yc3RfZGV2KSkgeworCQkJc2VxX3ByaW50ZihzLCAiIFVOS05PV05cbiIpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobXJzdF9kZXYtPmxzcykKKwkJCXNlcV9wcmludGYocywgIkxTUyAlMmQgJS00cyAiLCBtcnN0X2Rldi0+bHNzLAorCQkJCWQwaXhfbmFtZSgoKGN1cl9wbXNzcyA+PgorCQkJCQkobXJzdF9kZXYtPmxzcyAqIDIpKSAmIDB4MykpKTsKKwkJZWxzZQorCQkJc2VxX3ByaW50ZihzLCAiICAgICAgICAgICAgIik7CisKKwkJLyogUENJIFBNIGNvbmZpZyBzcGFjZSBzZXR0aW5nICovCisJCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9QTSk7CisJCWlmIChwb3MgIT0gMCkgeworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BNX0NUUkwsICZwbWNzcik7CisJCXNlcV9wcmludGYocywgIlBDSS0lLTRzIiwKKwkJCXBjaV9wb3dlcl9uYW1lKHBtY3NyICYgUENJX1BNX0NUUkxfU1RBVEVfTUFTSykpOworCQl9IGVsc2UgeworCQkJc2VxX3ByaW50ZihzLCAiICAgICAgICAiKTsKKwkJfQorCisJCXNlcV9wcmludGYocywgIiAlcyAiLCBwY2lfcG93ZXJfbmFtZShtcnN0X2Rldi0+bGF0ZXN0X3JlcXVlc3QpKTsKKwkJZm9yIChpID0gMDsgaSA8PSBQQ0lfRDNjb2xkOyArK2kpCisJCQlzZXFfcHJpbnRmKHMsICIlZCAiLCBtcnN0X2Rldi0+cGNpX3N0YXRlX2NvdW50c1tpXSk7CisKKwkJaWYgKG1yc3RfZGV2LT5sc3MpIHsKKwkJCXVuc2lnbmVkIGludCBsc3NtYXNrOworCisJCQlsc3NtYXNrID0gU1NNU0soRDBpMywgbXJzdF9kZXYtPmxzcyk7CisKKwkJCWlmICgobHNzbWFzayAmIFMwSTNfU1NTX1RBUkdFVCkgJiYKKwkJCQkoKGxzc21hc2sgJiBjdXJfcG1zc3MpICE9CisJCQkJCShsc3NtYXNrICYgUzBJM19TU1NfVEFSR0VUKSkpCisJCQkJCQlzZXFfcHJpbnRmKHMgLCAiW0JMT0NLUyBzMGkzXSIpOworCQl9CisKKwkJc2VxX3ByaW50ZihzLCAiXG4iKTsKKwl9CisJc2VxX3ByaW50ZihzLCAiV2FrZSBDb3VudGVyczpcbiIpOworCWZvciAobHNzID0gMDsgbHNzIDwgTVJTVF9OVU1fTFNTOyArK2xzcykKKwkJc2VxX3ByaW50ZihzLCAiTFNTJWQgJWRcbiIsIGxzcywgd2FrZV9jb3VudGVyc1tsc3NdKTsKKworCXNlcV9wcmludGYocywgIkludGVycnVwdCBDb3VudGVyczpcbiIpOworCXNlcV9wcmludGYocywKKwkJIklOVF9TUFVSSU9VUyBcdCU4dVxuIiAiSU5UX0NNRF9ET05FIFx0JTh1XG4iCisJCSJJTlRfQ01EX0VSUiAgXHQlOHVcbiIgIklOVF9XQUtFX1JYICBcdCU4dVxuIgorCQkiSU5UX1NTX0VSUk9SIFx0JTh1XG4iICJJTlRfUzBJWF9NSVNTXHQlOHVcbiIKKwkJIklOVF9OT19BQ0tDNiBcdCU4dVxuIiAiSU5UX0lOVkFMSUQgIFx0JTh1XG4iLAorCQlwbXVfaXJxX3N0YXRzW0lOVF9TUFVSSU9VU10sIHBtdV9pcnFfc3RhdHNbSU5UX0NNRF9ET05FXSwKKwkJcG11X2lycV9zdGF0c1tJTlRfQ01EX0VSUl0sIHBtdV9pcnFfc3RhdHNbSU5UX1dBS0VfUlhdLAorCQlwbXVfaXJxX3N0YXRzW0lOVF9TU19FUlJPUl0sIHBtdV9pcnFfc3RhdHNbSU5UX1MwSVhfTUlTU10sCisJCXBtdV9pcnFfc3RhdHNbSU5UX05PX0FDS0M2XSwgcG11X2lycV9zdGF0c1tJTlRfSU5WQUxJRF0pOworCisJc2VxX3ByaW50ZihzLCAibXJzdF9wbXVfd2FpdF9yZWFkeV9jYWxscyAgICAgICAgICAlOGRcbiIsCisJCQlwbXVfd2FpdF9yZWFkeV9jYWxscyk7CisJc2VxX3ByaW50ZihzLCAibXJzdF9wbXVfd2FpdF9yZWFkeV91ZGVsYXlzICAgICAgICAlOGRcbiIsCisJCQlwbXVfd2FpdF9yZWFkeV91ZGVsYXlzKTsKKwlzZXFfcHJpbnRmKHMsICJtcnN0X3BtdV93YWl0X3JlYWR5X3VkZWxheXNfbWF4ICAgICU4ZFxuIiwKKwkJCXBtdV93YWl0X3JlYWR5X3VkZWxheXNfbWF4KTsKKwlzZXFfcHJpbnRmKHMsICJtcnN0X3BtdV93YWl0X2RvbmVfY2FsbHMgICAgICAgICAgICU4ZFxuIiwKKwkJCXBtdV93YWl0X2RvbmVfY2FsbHMpOworCXNlcV9wcmludGYocywgIm1yc3RfcG11X3dhaXRfZG9uZV91ZGVsYXlzICAgICAgICAgJThkXG4iLAorCQkJcG11X3dhaXRfZG9uZV91ZGVsYXlzKTsKKwlzZXFfcHJpbnRmKHMsICJtcnN0X3BtdV93YWl0X2RvbmVfdWRlbGF5c19tYXggICAgICU4ZFxuIiwKKwkJCXBtdV93YWl0X2RvbmVfdWRlbGF5c19tYXgpOworCXNlcV9wcmludGYocywgIm1yc3RfcG11X3NldF9wb3dlcl9zdGF0ZV9lbnRyeSAgICAgJThkXG4iLAorCQkJcG11X3NldF9wb3dlcl9zdGF0ZV9lbnRyeSk7CisJc2VxX3ByaW50ZihzLCAibXJzdF9wbXVfc2V0X3Bvd2VyX3N0YXRlX3NlbmRfY21kICAlOGRcbiIsCisJCQlwbXVfc2V0X3Bvd2VyX3N0YXRlX3NlbmRfY21kKTsKKwlzZXFfcHJpbnRmKHMsICJTQ1UgYnVzeTogJWRcbiIsIHBtdV9yZWFkX2J1c3lfc3RhdHVzKCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVidWdfbXJzdF9wbXVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgZGVidWdfbXJzdF9wbXVfc2hvdywgTlVMTCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRldmljZXNfc3RhdGVfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBkZWJ1Z19tcnN0X3BtdV9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworI2VuZGlmCS8qIERFQlVHX0ZTICovCisKKy8qCisgKiBWYWxpZGF0ZSBTQ1UgUENJIHNoaW0gUENJIHZlbmRvciBjYXBhYmlsaXR5IGJ5dGUKKyAqIGFnYWluc3QgTFNTIGhhcmQtY29kZWQgaW4gbXJzdF9kZXZzW10gYWJvdmUuCisgKiBERUJVRyBvbmx5LgorICovCitzdGF0aWMgdm9pZCBwbXVfc2N1X2Zpcm13YXJlX2RlYnVnKHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCisJZm9yX2VhY2hfcGNpX2RldihwZGV2KSB7CisJCXN0cnVjdCBtcnN0X2RldmljZSAqbXJzdF9kZXY7CisJCXU4IHBjaV9jb25maWdfbHNzOworCQlpbnQgcG9zOworCisJCW1yc3RfZGV2ID0gcGNpX2lkXzJfbXJzdF9kZXYocGRldi0+ZGV2aWNlKTsKKwkJaWYgKHVubGlrZWx5KCFtcnN0X2RldikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBGV19CVUcgInBtdTogVW5rbm93biAiCisJCQkJIlBDSSBkZXZpY2UgMHglMDRYXG4iLCBwZGV2LT5kZXZpY2UpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobXJzdF9kZXYtPmxzcyA9PSAwKQorCQkJY29udGludWU7CSAvKiBubyBMU1MgaW4gb3VyIHRhYmxlICovCisKKwkJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX1ZORFIpOworCQlpZiAoIXBvcyAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgRldfQlVHICJwbXU6IDB4JTA0WCAiCisJCQkJIm1pc3NpbmcgUENJIFZlbmRvciBDYXBhYmlsaXR5XG4iLAorCQkJCXBkZXYtPmRldmljZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBwb3MgKyA0LCAmcGNpX2NvbmZpZ19sc3MpOworCQlpZiAoIShwY2lfY29uZmlnX2xzcyAmIFBDSV9WRU5ET1JfQ0FQX0xPR19TU19NQVNLKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIEZXX0JVRyAicG11OiAweCUwNFggIgorCQkJCSJpbnZhbGlkIFBDSSBWZW5kb3IgQ2FwYWJpbGl0eSAweCV4ICIKKwkJCQkiIGV4cGVjdGVkIExTUyAweCVYXG4iLAorCQkJCXBkZXYtPmRldmljZSwgcGNpX2NvbmZpZ19sc3MsIG1yc3RfZGV2LT5sc3MpOworCQkJY29udGludWU7CisJCX0KKwkJcGNpX2NvbmZpZ19sc3MgJj0gUENJX1ZFTkRPUl9DQVBfTE9HX0lEX01BU0s7CisKKwkJaWYgKG1yc3RfZGV2LT5sc3MgPT0gcGNpX2NvbmZpZ19sc3MpCisJCQljb250aW51ZTsKKworCQlwcmludGsoS0VSTl9FUlIgRldfQlVHICJwbXU6IDB4JTA0WCBMU1MgPSAlZCwgZXhwZWN0ZWQgJWRcbiIsCisJCQlwZGV2LT5kZXZpY2UsIHBjaV9jb25maWdfbHNzLCBtcnN0X2Rldi0+bHNzKTsKKwl9Cit9CisKKy8qKgorICogcG11X3Byb2JlCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHBtdV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCWludCByZXQ7CisJc3RydWN0IG1yc3RfcG11X3JlZyAqcG11OworCisJLyogSW5pdCB0aGUgZGV2aWNlICovCisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gRW5hYmxlIFBDSSBkZXZpY2VcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgTVJTVF9QTVVfRFJWX05BTUUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlcywgYWJvcnRpbmdcbiIpOworCQlnb3RvIG91dF9lcnIxOworCX0KKworCS8qIE1hcCB0aGUgbWVtb3J5IG9mIFBNVSByZWcgYmFzZSAqLworCXBtdSA9IHBjaV9pb21hcChwZGV2LCAwLCAwKTsKKwlpZiAoIXBtdSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gbWFwIHRoZSBQTVUgYWRkcmVzcyBzcGFjZVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2VycjI7CisJfQorCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisJLyogL3N5cy9rZXJuZWwvZGVidWcvbXJzdF9wbXUgKi8KKwkodm9pZCkgZGVidWdmc19jcmVhdGVfZmlsZSgibXJzdF9wbXUiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQlOVUxMLCBOVUxMLCAmZGV2aWNlc19zdGF0ZV9vcGVyYXRpb25zKTsKKyNlbmRpZgorCXBtdV9yZWcgPSBwbXU7CS8qIHN1Y2Nlc3MgKi8KKworCWlmIChyZXF1ZXN0X2lycShwZGV2LT5pcnEsIHBtdV9pcnEsIDAsIE1SU1RfUE1VX0RSVl9OQU1FLCBOVUxMKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJSZWdpc3RlcmluZyBpc3IgaGFzIGZhaWxlZFxuIik7CisJCXJldCA9IC0xOworCQlnb3RvIG91dF9lcnIzOworCX0KKworCXBtdV9zY3VfZmlybXdhcmVfZGVidWcoKTsKKworCXBtdV93cml0ZV93a2MoUzBJM19XQUtFX1NPVVJDRVMpOwkvKiBFbmFibGUgUzBpMyB3YWtldXAgc291cmNlcyAqLworCisJcG11X3dhaXRfcmVhZHkoKTsKKworCXBtdV93cml0ZV9zc2MoRDBJMV9BQ0dfU1NTX1RBUkdFVCk7CS8qIEVuYWJsZSBBdXRvLUNsb2NrX0dhdGluZyAqLworCXBtdV93cml0ZV9jbWQoMHgyMDEpOworCisJc3Bpbl9sb2NrX2luaXQoJm1yc3RfcG11X3Bvd2VyX3N0YXRlX2xvY2spOworCisJLyogRW5hYmxlIHRoZSBoYXJkd2FyZSBpbnRlcnJ1cHQgKi8KKwlwbXVfaXJxX2VuYWJsZSgpOworCXJldHVybiAwOworCitvdXRfZXJyMzoKKwlmcmVlX2lycShwZGV2LT5pcnEsIE5VTEwpOworCXBjaV9pb3VubWFwKHBkZXYsIHBtdV9yZWcpOworCXBtdV9yZWcgPSBOVUxMOworb3V0X2VycjI6CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDApOworb3V0X2VycjE6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBwbXVfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWRldl9lcnIoJnBkZXYtPmRldiwgIk1pZCBQTSBwbXVfcmVtb3ZlIGNhbGxlZFxuIik7CisKKwkvKiBGcmVlaW5nIHVwIHRoZSBpcnEgKi8KKwlmcmVlX2lycShwZGV2LT5pcnEsIE5VTEwpOworCisJcGNpX2lvdW5tYXAocGRldiwgcG11X3JlZyk7CisJcG11X3JlZyA9IE5VTEw7CisKKwkvKiBkaXNhYmxlIHRoZSBjdXJyZW50IFBDSSBkZXZpY2UgKi8KKwlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworfQorCitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUocG11X3BjaV9pZHMpID0geworCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZfSURfTVJTVF9QTVUpLCAwIH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcG11X3BjaV9pZHMpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lID0gTVJTVF9QTVVfRFJWX05BTUUsCisJLmlkX3RhYmxlID0gcG11X3BjaV9pZHMsCisJLnByb2JlID0gcG11X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChwbXVfcmVtb3ZlKSwKK307CisKKy8qKgorICogcG11X3BjaV9yZWdpc3RlciAtIHJlZ2lzdGVyIHRoZSBQTVUgZHJpdmVyIGFzIFBDSSBkZXZpY2UKKyAqLworc3RhdGljIGludCBfX2luaXQgcG11X3BjaV9yZWdpc3Rlcih2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCisvKiBSZWdpc3RlciBhbmQgcHJvYmUgdmlhIGZzX2luaXRjYWxsKCkgdG8gcHJlY2VlZCBkZXZpY2VfaW5pdGNhbGwoKSAqLworZnNfaW5pdGNhbGwocG11X3BjaV9yZWdpc3Rlcik7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtaWRfcGNpX2NsZWFudXAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK3N0YXRpYyBpbnQgaWFfbWFqb3I7CitzdGF0aWMgaW50IGlhX21pbm9yOworCitzdGF0aWMgaW50IHBtdV9zZmlfcGFyc2Vfb2VtKHN0cnVjdCBzZmlfdGFibGVfaGVhZGVyICp0YWJsZSkKK3sKKwlzdHJ1Y3Qgc2ZpX3RhYmxlX3NpbXBsZSAqc2I7CisKKwlzYiA9IChzdHJ1Y3Qgc2ZpX3RhYmxlX3NpbXBsZSAqKXRhYmxlOworCWlhX21ham9yID0gKHNiLT5wZW50cnlbMV0gPj4gMCkgJiAweEZGRkY7CisJaWFfbWlub3IgPSAoc2ItPnBlbnRyeVsxXSA+PiAxNikgJiAweEZGRkY7CisJcHJpbnRrKEtFUk5fSU5GTyAibXJzdF9wbXU6IElBIEZXIHZlcnNpb24gdiV4LiV4XG4iLAorCQlpYV9tYWpvciwgaWFfbWlub3IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNjdV9md19jaGVjayh2b2lkKQoreworCWludCByZXQ7CisJdTMyIGZ3X3ZlcnNpb247CisKKwlpZiAoIXBtdV9yZWcpCisJCXJldHVybiAwOwkvKiB0aGlzIGRyaXZlciBkaWRuJ3QgcHJvYmUtb3V0ICovCisKKwlzZmlfdGFibGVfcGFyc2UoIk9FTUIiLCBOVUxMLCBOVUxMLCBwbXVfc2ZpX3BhcnNlX29lbSk7CisKKwlpZiAoaWFfbWFqb3IgPCAweDYwMDUgfHwgaWFfbWlub3IgPCAweDE1MjUpIHsKKwkJV0FSTigxLCAibXJzdF9wbXU6IElBIEZXIHZlcnNpb24gdG9vIG9sZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXQgPSBpbnRlbF9zY3VfaXBjX2NvbW1hbmQoSVBDTVNHX0ZXX1JFVklTSU9OLCAwLCBOVUxMLCAwLAorCQkJCQkmZndfdmVyc2lvbiwgMSk7CisKKwlpZiAocmV0KSB7CisJCVdBUk4oMSwgIm1yc3RfcG11OiBJUEMgRlcgdmVyc2lvbj8gJWRcbiIsIHJldCk7CisJfSBlbHNlIHsKKwkJaW50IHNjdV9tYWpvciA9IChmd192ZXJzaW9uID4+IDgpICYgMHhGRjsKKwkJaW50IHNjdV9taW5vciA9IChmd192ZXJzaW9uID4+IDApICYgMHhGRjsKKworCQlwcmludGsoS0VSTl9JTkZPICJtcnN0X3BtdTogZmlybXdhcmUgdiV4XG4iLCBmd192ZXJzaW9uKTsKKworCQlpZiAoKHNjdV9tYWpvciA+PSAweEMwKSAmJiAoc2N1X21pbm9yID49IDB4NDkpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJtcnN0X3BtdTogZW5hYmxpbmcgUzBpM1xuIik7CisJCQltcnN0X3BtdV9zMGkzX2VuYWJsZSA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlXQVJOKDEsICJtcnN0X3BtdTogUzBpMyBkaXNhYmxlZCwgb2xkIGZpcm13YXJlICVYLiVYIiwKKwkJCQkJc2N1X21ham9yLCBzY3VfbWlub3IpOworCQl9CisJfQorCXJldHVybiAwOworfQorbGF0ZV9pbml0Y2FsbChzY3VfZndfY2hlY2spOworbW9kdWxlX2V4aXQobWlkX3BjaV9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvcG11LmggYi9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L3BtdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYmZlNjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L3BtdS5oCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogbXJzdC9wbXUuaCAtIHByaXZhdGUgZGVmaW5pdGlvbnMgZm9yIE1SU1QgUG93ZXIgTWFuYWdlbWVudCBVbml0IG1yc3QvcG11LmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2lmbmRlZiBfTVJTVF9QTVVfSF8KKyNkZWZpbmUgX01SU1RfUE1VX0hfCisKKyNkZWZpbmUgUENJX0RFVl9JRF9NUlNUX1BNVQkJMHgwODEwCisjZGVmaW5lIE1SU1RfUE1VX0RSVl9OQU1FCQkibXJzdF9wbXUiCisjZGVmaW5lCVBDSV9TVUJfQ0xBU1NfTUFTSwkJMHhGRjAwCisKKyNkZWZpbmUJUENJX1ZFTkRPUl9DQVBfTE9HX0lEX01BU0sJMHg3RgorI2RlZmluZSBQQ0lfVkVORE9SX0NBUF9MT0dfU1NfTUFTSwkweDgwCisKKyNkZWZpbmUgU1VCX1NZU19BTExfRDBJMQkweDAxMTU1NTU1CisjZGVmaW5lIFMwSTNfV0FLRV9TT1VSQ0VTCTB4MDAwMDFGRkYKKworI2RlZmluZSBQTV9TMEkzX0NPTU1BTkQJCQkJCVwKKwkoKDAgPDwgMzEpIHwJLyogUmVzZXJ2ZWQgKi8JCQlcCisJKDAgPDwgMzApIHwJLyogQ29yZSBtdXN0IGJlIGlkbGUgKi8JCVwKKwkoMHhjMiA8PCAyMikgfAkvKiBBQ0sgQzYgdHJpZ2dlciAqLwkJXAorCSgzIDw8IDE5KSB8CS8qIFRyaWdnZXIgb24gRE1JIG1lc3NhZ2UgKi8JXAorCSgzIDw8IDE2KSB8CS8qIEVudGVyIFMwaTMgKi8JCVwKKwkoMCA8PCAxMykgfAkvKiBOdW1lcmljIG1vZGUgSUQgKHN3KSAqLwlcCisJKDMgPDwgOSkgfAkvKiBUcmlnZ2VyIG1vZGUgKi8JCVwKKwkoMCA8PCA4KSB8CS8qIERvIG5vdCBpbnRlcnJ1cHQgKi8JCVwKKwkoMSA8PCAwKSkJLyogU2V0IGNvbmZpZ3VyYXRpb24gKi8KKworI2RlZmluZQlMU1NfRE1JCQkwCisjZGVmaW5lCUxTU19TRF9IQzAJMQorI2RlZmluZQlMU1NfU0RfSEMxCTIKKyNkZWZpbmUJTFNTX05BTkQJMworI2RlZmluZQlMU1NfSU1BR0lORwk0CisjZGVmaW5lCUxTU19TRUNVUklUWQk1CisjZGVmaW5lCUxTU19ESVNQTEFZCTYKKyNkZWZpbmUJTFNTX1VTQl9IQwk3CisjZGVmaW5lCUxTU19VU0JfT1RHCTgKKyNkZWZpbmUJTFNTX0FVRElPCTkKKyNkZWZpbmUJTFNTX0FVRElPX0xQRQk5CisjZGVmaW5lCUxTU19BVURJT19TU1AJOQorI2RlZmluZQlMU1NfSTJDMAkxMAorI2RlZmluZQlMU1NfSTJDMQkxMAorI2RlZmluZQlMU1NfSTJDMgkxMAorI2RlZmluZQlMU1NfS0JECQkxMAorI2RlZmluZQlMU1NfU1BJMAkxMAorI2RlZmluZQlMU1NfU1BJMQkxMAorI2RlZmluZQlMU1NfU1BJMgkxMAorI2RlZmluZQlMU1NfR1BJTwkxMAorI2RlZmluZQlMU1NfU1JBTQkxMQkvKiB1c2VkIGJ5IFNDVSwgZG8gbm90IHRvdWNoICovCisjZGVmaW5lCUxTU19TRF9IQzIJMTIKKy8qIExTUyBoYXJkd2FyZSBiaXRzIDE1LDE0LDEzIGFyZSBoYXJkd2lyZWQgdG8gMCwgdGh1cyB1bnVzYWJsZSAqLworI2RlZmluZSBNUlNUX05VTV9MU1MJMTMKKworI2RlZmluZSBNSU4oYSwgYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorCisjZGVmaW5lCVNTTVNLKG1hc2ssIGxzcykgKChtYXNrKSA8PCAoKGxzcykgKiAyKSkKKyNkZWZpbmUJRDAJMAorI2RlZmluZQlEMGkxCTEKKyNkZWZpbmUJRDBpMgkyCisjZGVmaW5lCUQwaTMJMworCisjZGVmaW5lIFMwSTNfU1NTX1RBUkdFVAkoCQlcCisJU1NNU0soRDBpMSwgTFNTX0RNSSkgfAkJXAorCVNTTVNLKEQwaTMsIExTU19TRF9IQzApIHwJXAorCVNTTVNLKEQwaTMsIExTU19TRF9IQzEpIHwJXAorCVNTTVNLKEQwaTMsIExTU19OQU5EKSB8CQlcCisJU1NNU0soRDBpMywgTFNTX1NEX0hDMikgfAlcCisJU1NNU0soRDBpMywgTFNTX0lNQUdJTkcpIHwJXAorCVNTTVNLKEQwaTMsIExTU19TRUNVUklUWSkgfAlcCisJU1NNU0soRDBpMywgTFNTX0RJU1BMQVkpIHwJXAorCVNTTVNLKEQwaTMsIExTU19VU0JfSEMpIHwJXAorCVNTTVNLKEQwaTMsIExTU19VU0JfT1RHKSB8CVwKKwlTU01TSyhEMGkzLCBMU1NfQVVESU8pIHwJXAorCVNTTVNLKEQwaTEsIExTU19JMkMwKSkKKworLyoKKyAqIEQwaTEgb24gTGFuZ3dlbGwgaXMgQXV0b25vbW91cyBDbG9jayBHYXRpbmcgKEFDRykuCisgKiBFbmFibGUgQUNHIG9uIGV2ZXJ5IExTUyBleGNlcHQgY2FtZXJhIGFuZCBhdWRpbworICovCisjZGVmaW5lIEQwSTFfQUNHX1NTU19UQVJHRVQJIFwKKwkoU1VCX1NZU19BTExfRDBJMSAmIH5TU01TSyhEMGkxLCBMU1NfSU1BR0lORykgJiB+U1NNU0soRDBpMSwgTFNTX0FVRElPKSkKKworZW51bSBjbV9tb2RlIHsKKwlDTV9OT1AsCQkJLyogaWdub3JlIHRoZSBjb25maWcgbW9kZSB2YWx1ZSAqLworCUNNX0lNTUVESUFURSwKKwlDTV9ERUxBWSwKKwlDTV9UUklHR0VSLAorCUNNX0lOVkFMSUQKK307CisKK2VudW0gc3lzX3N0YXRlIHsKKwlTWVNfU1RBVEVfUzBJMCwKKwlTWVNfU1RBVEVfUzBJMSwKKwlTWVNfU1RBVEVfUzBJMiwKKwlTWVNfU1RBVEVfUzBJMywKKwlTWVNfU1RBVEVfUzMsCisJU1lTX1NUQVRFX1M1Cit9OworCisjZGVmaW5lIFNFVF9DRkdfQ01ECTEKKworZW51bSBpbnRfc3RhdHVzIHsKKwlJTlRfU1BVUklPVVMgPSAwLAorCUlOVF9DTURfRE9ORSA9IDEsCisJSU5UX0NNRF9FUlIgPSAyLAorCUlOVF9XQUtFX1JYID0gMywKKwlJTlRfU1NfRVJST1IgPSA0LAorCUlOVF9TMElYX01JU1MgPSA1LAorCUlOVF9OT19BQ0tDNiA9IDYsCisJSU5UX0lOVkFMSUQgPSA3LAorfTsKKworLyogUE1VIHJlZ2lzdGVyIGludGVyZmFjZSAqLworc3RhdGljIHN0cnVjdCBtcnN0X3BtdV9yZWcgeworCXUzMiBwbV9zdHM7CQkvKiAweDAwICovCisJdTMyIHBtX2NtZDsJCS8qIDB4MDQgKi8KKwl1MzIgcG1faWNzOwkJLyogMHgwOCAqLworCXUzMiBfcmVzdjE7CQkvKiAweDBDICovCisJdTMyIHBtX3drY1syXTsJCS8qIDB4MTAgKi8KKwl1MzIgcG1fd2tzWzJdOwkJLyogMHgxOCAqLworCXUzMiBwbV9zc2NbNF07CQkvKiAweDIwICovCisJdTMyIHBtX3Nzc1s0XTsJCS8qIDB4MzAgKi8KKwl1MzIgcG1fd3NzY1s0XTsJCS8qIDB4NDAgKi8KKwl1MzIgcG1fYzNjNDsJCS8qIDB4NTAgKi8KKwl1MzIgcG1fYzVjNjsJCS8qIDB4NTQgKi8KKwl1MzIgcG1fbXNpX2Rpc2FibGU7CS8qIDB4NTggKi8KK30gKnBtdV9yZWc7CisKK3N0YXRpYyBpbmxpbmUgdTMyIHBtdV9yZWFkX3N0cyh2b2lkKSB7IHJldHVybiByZWFkbCgmcG11X3JlZy0+cG1fc3RzKTsgfQorc3RhdGljIGlubGluZSB1MzIgcG11X3JlYWRfaWNzKHZvaWQpIHsgcmV0dXJuIHJlYWRsKCZwbXVfcmVnLT5wbV9pY3MpOyB9CitzdGF0aWMgaW5saW5lIHUzMiBwbXVfcmVhZF93a3Modm9pZCkgeyByZXR1cm4gcmVhZGwoJnBtdV9yZWctPnBtX3drc1swXSk7IH0KK3N0YXRpYyBpbmxpbmUgdTMyIHBtdV9yZWFkX3Nzcyh2b2lkKSB7IHJldHVybiByZWFkbCgmcG11X3JlZy0+cG1fc3NzWzBdKTsgfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcG11X3dyaXRlX2NtZCh1MzIgYXJnKSB7IHdyaXRlbChhcmcsICZwbXVfcmVnLT5wbV9jbWQpOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcG11X3dyaXRlX2ljcyh1MzIgYXJnKSB7IHdyaXRlbChhcmcsICZwbXVfcmVnLT5wbV9pY3MpOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcG11X3dyaXRlX3drYyh1MzIgYXJnKSB7IHdyaXRlbChhcmcsICZwbXVfcmVnLT5wbV93a2NbMF0pOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcG11X3dyaXRlX3NzYyh1MzIgYXJnKSB7IHdyaXRlbChhcmcsICZwbXVfcmVnLT5wbV9zc2NbMF0pOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcG11X3dyaXRlX3dzc2ModTMyIGFyZykKKwkJCQkJeyB3cml0ZWwoYXJnLCAmcG11X3JlZy0+cG1fd3NzY1swXSk7IH0KKworc3RhdGljIGlubGluZSB2b2lkIHBtdV9tc2lfZW5hYmxlKHZvaWQpIHsgd3JpdGVsKDAsICZwbXVfcmVnLT5wbV9tc2lfZGlzYWJsZSk7IH0KK3N0YXRpYyBpbmxpbmUgdTMyIHBtdV9tc2lfaXNfZGlzYWJsZWQodm9pZCkKKwkJCQl7IHJldHVybiByZWFkbCgmcG11X3JlZy0+cG1fbXNpX2Rpc2FibGUpOyB9CisKK3VuaW9uIHBtdV9wbV9pY3MgeworCXN0cnVjdCB7CisJCXUzMiBjYXVzZTo4OworCQl1MzIgZW5hYmxlOjE7CisJCXUzMiBwZW5kaW5nOjE7CisJCXUzMiByZXNlcnZlZDoyMjsKKwl9IGJpdHM7CisJdTMyIHZhbHVlOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHBtdV9pcnFfZW5hYmxlKHZvaWQpCit7CisJdW5pb24gcG11X3BtX2ljcyBwbXVfaWNzOworCisJcG11X2ljcy52YWx1ZSA9IHBtdV9yZWFkX2ljcygpOworCXBtdV9pY3MuYml0cy5lbmFibGUgPSAxOworCXBtdV93cml0ZV9pY3MocG11X2ljcy52YWx1ZSk7Cit9CisKK3VuaW9uIHBtdV9wbV9zdGF0dXMgeworCXN0cnVjdCB7CisJCXUzMiBwbXVfcmV2Ojg7CisJCXUzMiBwbXVfYnVzeToxOworCQl1MzIgbW9kZV9pZDo0OworCQl1MzIgUmVzZXJ2ZWQ6MTk7CisJfSBwbXVfc3RhdHVzX3BhcnRzOworCXUzMiBwbXVfc3RhdHVzX3ZhbHVlOworfTsKKworc3RhdGljIGlubGluZSBpbnQgcG11X3JlYWRfYnVzeV9zdGF0dXModm9pZCkKK3sKKwl1bmlvbiBwbXVfcG1fc3RhdHVzIHJlc3VsdDsKKworCXJlc3VsdC5wbXVfc3RhdHVzX3ZhbHVlID0gcG11X3JlYWRfc3RzKCk7CisKKwlyZXR1cm4gcmVzdWx0LnBtdV9zdGF0dXNfcGFydHMucG11X2J1c3k7Cit9CisKKy8qIHBtdSBzZXQgY29uZmlnIHBhcmFtZXRlcnMgKi8KK3N0cnVjdCBjZmdfZGVsYXlfcGFyYW1fdCB7CisJdTMyIGNtZDo4OworCXUzMiBpb2M6MTsKKwl1MzIgY2ZnX21vZGU6NDsKKwl1MzIgbW9kZV9pZDozOworCXUzMiBzeXNfc3RhdGU6MzsKKwl1MzIgY2ZnX2RlbGF5Ojg7CisJdTMyIHJzdmQ6NTsKK307CisKK3N0cnVjdCBjZmdfdHJpZ19wYXJhbV90IHsKKwl1MzIgY21kOjg7CisJdTMyIGlvYzoxOworCXUzMiBjZmdfbW9kZTo0OworCXUzMiBtb2RlX2lkOjM7CisJdTMyIHN5c19zdGF0ZTozOworCXUzMiBjZmdfdHJpZ190eXBlOjM7CisJdTMyIGNmZ190cmlnX3ZhbDo4OworCXUzMiBjbWJpOjE7CisJdTMyIHJzdmQxOjE7Cit9OworCit1bmlvbiBwbXVfcG1fc2V0X2NmZ19jbWRfdCB7CisJdW5pb24geworCQlzdHJ1Y3QgY2ZnX2RlbGF5X3BhcmFtX3QgZF9wYXJhbTsKKwkJc3RydWN0IGNmZ190cmlnX3BhcmFtX3QgdF9wYXJhbTsKKwl9IHBtdTJfcGFyYW1zOworCXUzMiBwbXVfcG1fc2V0X2NmZ19jbWRfdmFsdWU7Cit9OworCisjaWZkZWYgRlVUVVJFX1BBVENICitleHRlcm4gaW50IG1yc3RfczBpM19lbnRyeSh1MzIgcmVndmFsLCB1MzIgKnJlZ2FkZHIpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IG1yc3RfczBpM19lbnRyeSh1MzIgcmVndmFsLCB1MzIgKnJlZ2FkZHIpIHsgcmV0dXJuIC0xOyB9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL01ha2VmaWxlIGIvYXJjaC94ODYveGVuL01ha2VmaWxlCmluZGV4IGNjZjczYjIuLjQ1ZTk0YWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni94ZW4vTWFrZWZpbGUKQEAgLTEzLDcgKzEzLDkgQEAKIG9iai15CQk6PSBlbmxpZ2h0ZW4ubyBzZXR1cC5vIG11bHRpY2FsbHMubyBtbXUubyBpcnEubyBcCiAJCQl0aW1lLm8geGVuLWFzbS5vIHhlbi1hc21fJChCSVRTKS5vIFwKIAkJCWdyYW50LXRhYmxlLm8gc3VzcGVuZC5vIHBsYXRmb3JtLXBjaS11bnBsdWcubyBcCi0JCQlwMm0ubyB0cmFjZS5vCisJCQlwMm0ubworCitvYmotJChDT05GSUdfRlVOQ1RJT05fVFJBQ0VSKSArPSB0cmFjZS5vCiAKIG9iai0kKENPTkZJR19TTVApCQkrPSBzbXAubwogb2JqLSQoQ09ORklHX1BBUkFWSVJUX1NQSU5MT0NLUykrPSBzcGlubG9jay5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vc2V0dXAuYyBiL2FyY2gveDg2L3hlbi9zZXR1cC5jCmluZGV4IDYwYWVlYjUuLmE5NjI3ZTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9zZXR1cC5jCisrKyBiL2FyY2gveDg2L3hlbi9zZXR1cC5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KIAogI2luY2x1ZGUgPGFzbS9lbGYuaD4KICNpbmNsdWRlIDxhc20vdmRzby5oPgpAQCAtNDI2LDcgKzQyNyw3IEBACiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogCWJvb3RfY3B1X2RhdGEuaGx0X3dvcmtzX29rID0gMTsKICNlbmRpZgotCXBtX2lkbGUgPSBkZWZhdWx0X2lkbGU7CisJZGlzYWJsZV9jcHVpZGxlKCk7CiAJYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZSA9IElETEVfSEFMVDsKIAogCWZpZGRsZV92ZHNvKCk7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstY29yZS5jIGIvYmxvY2svYmxrLWNvcmUuYwppbmRleCBiODUwYmVkLi5iNjI3NTU4IDEwMDY0NAotLS0gYS9ibG9jay9ibGstY29yZS5jCisrKyBiL2Jsb2NrL2Jsay1jb3JlLmMKQEAgLTEzNjgsOCArMTM2OCwxMCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBmYWlsX21ha2VfcmVxdWVzdF9kZWJ1Z2ZzKHZvaWQpCiB7Ci0JcmV0dXJuIGluaXRfZmF1bHRfYXR0cl9kZW50cmllcygmZmFpbF9tYWtlX3JlcXVlc3QsCi0JCQkJCSJmYWlsX21ha2VfcmVxdWVzdCIpOworCXN0cnVjdCBkZW50cnkgKmRpciA9IGZhdWx0X2NyZWF0ZV9kZWJ1Z2ZzX2F0dHIoImZhaWxfbWFrZV9yZXF1ZXN0IiwKKwkJCQkJCU5VTEwsICZmYWlsX21ha2VfcmVxdWVzdCk7CisKKwlyZXR1cm4gSVNfRVJSKGRpcikgPyBQVFJfRVJSKGRpcikgOiAwOwogfQogCiBsYXRlX2luaXRjYWxsKGZhaWxfbWFrZV9yZXF1ZXN0X2RlYnVnZnMpOwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLXRpbWVvdXQuYyBiL2Jsb2NrL2Jsay10aW1lb3V0LmMKaW5kZXggNGYwYzA2Yy4uNzgwMzU0OCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLXRpbWVvdXQuYworKysgYi9ibG9jay9ibGstdGltZW91dC5jCkBAIC0yOCw3ICsyOCwxMCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBmYWlsX2lvX3RpbWVvdXRfZGVidWdmcyh2b2lkKQogewotCXJldHVybiBpbml0X2ZhdWx0X2F0dHJfZGVudHJpZXMoJmZhaWxfaW9fdGltZW91dCwgImZhaWxfaW9fdGltZW91dCIpOworCXN0cnVjdCBkZW50cnkgKmRpciA9IGZhdWx0X2NyZWF0ZV9kZWJ1Z2ZzX2F0dHIoImZhaWxfaW9fdGltZW91dCIsCisJCQkJCQlOVUxMLCAmZmFpbF9pb190aW1lb3V0KTsKKworCXJldHVybiBJU19FUlIoZGlyKSA/IFBUUl9FUlIoZGlyKSA6IDA7CiB9CiAKIGxhdGVfaW5pdGNhbGwoZmFpbF9pb190aW1lb3V0X2RlYnVnZnMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY2dsb2JhbC5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2dsb2JhbC5oCmluZGV4IDczODYzZDguLjc2ZGMwMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNnbG9iYWwuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjZ2xvYmFsLmgKQEAgLTEyNiw2ICsxMjYsMTIgQEAKICAqLwogdTggQUNQSV9JTklUX0dMT0JBTChhY3BpX2dibF90cnVuY2F0ZV9pb19hZGRyZXNzZXMsIEZBTFNFKTsKIAorLyoKKyAqIERpc2FibGUgcnVudGltZSBjaGVja2luZyBhbmQgcmVwYWlyIG9mIHZhbHVlcyByZXR1cm5lZCBieSBjb250cm9sIG1ldGhvZHMuCisgKiBVc2Ugb25seSBpZiB0aGUgcmVwYWlyIGlzIGNhdXNpbmcgYSBwcm9ibGVtIG9uIGEgcGFydGljdWxhciBtYWNoaW5lLgorICovCit1OCBBQ1BJX0lOSVRfR0xPQkFMKGFjcGlfZ2JsX2Rpc2FibGVfYXV0b19yZXBhaXIsIEZBTFNFKTsKKwogLyogYWNwaV9nYmxfRkFEVCBpcyBhIGxvY2FsIGNvcHkgb2YgdGhlIEZBRFQsIGNvbnZlcnRlZCB0byBhIGNvbW1vbiBmb3JtYXQuICovCiAKIHN0cnVjdCBhY3BpX3RhYmxlX2ZhZHQgYWNwaV9nYmxfRkFEVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNsb2NhbC5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2xvY2FsLmgKaW5kZXggYzdmNzQzYy4uNTU1MjEyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY2xvY2FsLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2xvY2FsLmgKQEAgLTM1Nyw2ICszNTcsNyBAQAogCWNoYXIgKnBhdGhuYW1lOwogCWNvbnN0IHVuaW9uIGFjcGlfcHJlZGVmaW5lZF9pbmZvICpwcmVkZWZpbmVkOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnBhcmVudF9wYWNrYWdlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwogCXUzMiBmbGFnczsKIAl1OCBub2RlX2ZsYWdzOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNwcmVkZWYuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNwcmVkZWYuaAppbmRleCA5NGU3M2M5Li5jNDQ1Y2NhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjcHJlZGVmLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY3ByZWRlZi5oCkBAIC00NjgsNiArNDY4LDcgQEAKIAl7eyJfU1dTIiwgMCwgQUNQSV9SVFlQRV9JTlRFR0VSfX0sCiAJe3siX1RDMSIsIDAsIEFDUElfUlRZUEVfSU5URUdFUn19LAogCXt7Il9UQzIiLCAwLCBBQ1BJX1JUWVBFX0lOVEVHRVJ9fSwKKwl7eyJfVERMIiwgMCwgQUNQSV9SVFlQRV9JTlRFR0VSfX0sCiAJe3siX1RJUCIsIDEsIEFDUElfUlRZUEVfSU5URUdFUn19LAogCXt7Il9USVYiLCAxLCBBQ1BJX1JUWVBFX0lOVEVHRVJ9fSwKIAl7eyJfVE1QIiwgMCwgQUNQSV9SVFlQRV9JTlRFR0VSfX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcHJlZGVmLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcHJlZGVmLmMKaW5kZXggOWZiMDNmYS4uYzg0NWM4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3ByZWRlZi5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNwcmVkZWYuYwpAQCAtMTkzLDE0ICsxOTMsMjAgQEAKIAl9CiAKIAkvKgotCSAqIDEpIFdlIGhhdmUgYSByZXR1cm4gdmFsdWUsIGJ1dCBpZiBvbmUgd2Fzbid0IGV4cGVjdGVkLCBqdXN0IGV4aXQsIHRoaXMgaXMKLQkgKiBub3QgYSBwcm9ibGVtLiBGb3IgZXhhbXBsZSwgaWYgdGhlICJJbXBsaWNpdCBSZXR1cm4iIGZlYXR1cmUgaXMKLQkgKiBlbmFibGVkLCBtZXRob2RzIHdpbGwgYWx3YXlzIHJldHVybiBhIHZhbHVlLgorCSAqIFJldHVybiB2YWx1ZSB2YWxpZGF0aW9uIGFuZCBwb3NzaWJsZSByZXBhaXIuCiAJICoKLQkgKiAyKSBJZiB0aGUgcmV0dXJuIHZhbHVlIGNhbiBiZSBvZiBhbnkgdHlwZSwgdGhlbiB3ZSBjYW5ub3QgcGVyZm9ybSBhbnkKLQkgKiB2YWxpZGF0aW9uLCBleGl0LgorCSAqIDEpIERvbid0IHBlcmZvcm0gcmV0dXJuIHZhbHVlIHZhbGlkYXRpb24vcmVwYWlyIGlmIHRoaXMgZmVhdHVyZQorCSAqIGhhcyBiZWVuIGRpc2FibGVkIHZpYSBhIGdsb2JhbCBvcHRpb24uCisJICoKKwkgKiAyKSBXZSBoYXZlIGEgcmV0dXJuIHZhbHVlLCBidXQgaWYgb25lIHdhc24ndCBleHBlY3RlZCwganVzdCBleGl0LAorCSAqIHRoaXMgaXMgbm90IGEgcHJvYmxlbS4gRm9yIGV4YW1wbGUsIGlmIHRoZSAiSW1wbGljaXQgUmV0dXJuIgorCSAqIGZlYXR1cmUgaXMgZW5hYmxlZCwgbWV0aG9kcyB3aWxsIGFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KKwkgKgorCSAqIDMpIElmIHRoZSByZXR1cm4gdmFsdWUgY2FuIGJlIG9mIGFueSB0eXBlLCB0aGVuIHdlIGNhbm5vdCBwZXJmb3JtCisJICogYW55IHZhbGlkYXRpb24sIGp1c3QgZXhpdC4KIAkgKi8KLQlpZiAoKCFwcmVkZWZpbmVkLT5pbmZvLmV4cGVjdGVkX2J0eXBlcykgfHwKKwlpZiAoYWNwaV9nYmxfZGlzYWJsZV9hdXRvX3JlcGFpciB8fAorCSAgICAoIXByZWRlZmluZWQtPmluZm8uZXhwZWN0ZWRfYnR5cGVzKSB8fAogCSAgICAocHJlZGVmaW5lZC0+aW5mby5leHBlY3RlZF9idHlwZXMgPT0gQUNQSV9SVFlQRV9BTEwpKSB7CiAJCWdvdG8gY2xlYW51cDsKIAl9CkBAIC0yMTIsNiArMjE4LDcgQEAKIAkJZ290byBjbGVhbnVwOwogCX0KIAlkYXRhLT5wcmVkZWZpbmVkID0gcHJlZGVmaW5lZDsKKwlkYXRhLT5ub2RlID0gbm9kZTsKIAlkYXRhLT5ub2RlX2ZsYWdzID0gbm9kZS0+ZmxhZ3M7CiAJZGF0YS0+cGF0aG5hbWUgPSBwYXRobmFtZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3JlcGFpcjIuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNyZXBhaXIyLmMKaW5kZXggOTczODgzYi4uMDI0YzRmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3JlcGFpcjIuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcmVwYWlyMi5jCkBAIC01MDMsNiArNTAzLDIxIEBACiB7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX29iamVjdCA9ICpyZXR1cm5fb2JqZWN0X3B0cjsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisKKwkvKgorCSAqIFdlIGNhbiBvbmx5IHNvcnQgdGhlIF9UU1MgcmV0dXJuIHBhY2thZ2UgaWYgdGhlcmUgaXMgbm8gX1BTUyBpbiB0aGUKKwkgKiBzYW1lIHNjb3BlLiBUaGlzIGlzIGJlY2F1c2UgaWYgX1BTUyBpcyBwcmVzZW50LCB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uCisJICogZGljdGF0ZXMgdGhhdCB0aGUgX1RTUyBQb3dlciBEaXNzaXBhdGlvbiBmaWVsZCBpcyB0byBiZSBpZ25vcmVkLCBhbmQKKwkgKiB0aGVyZWZvcmUgc29tZSBCSU9TcyBsZWF2ZSBnYXJiYWdlIHZhbHVlcyBpbiB0aGUgX1RTUyBQb3dlciBmaWVsZChzKS4KKwkgKiBJbiB0aGlzIGNhc2UsIGl0IGlzIGJlc3QgdG8ganVzdCByZXR1cm4gdGhlIF9UU1MgcGFja2FnZSBhcy1pcy4KKwkgKiAoTWF5LCAyMDExKQorCSAqLworCXN0YXR1cyA9CisJICAgIGFjcGlfbnNfZ2V0X25vZGUoZGF0YS0+bm9kZSwgIl5fUFNTIiwgQUNQSV9OU19OT19VUFNFQVJDSCwgJm5vZGUpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlyZXR1cm4gKEFFX09LKTsKKwl9CiAKIAlzdGF0dXMgPSBhY3BpX25zX2NoZWNrX3NvcnRlZF9saXN0KGRhdGEsIHJldHVybl9vYmplY3QsIDUsIDEsCiAJCQkJCSAgIEFDUElfU09SVF9ERVNDRU5ESU5HLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS90Ymluc3RhbC5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS90Ymluc3RhbC5jCmluZGV4IDQ4ZGIwOTQuLjYyMzY1ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJpbnN0YWwuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RiaW5zdGFsLmMKQEAgLTEyNiwxMiArMTI2LDI5IEBACiAJfQogCiAJLyoKLQkgKiBPcmlnaW5hbGx5LCB3ZSBjaGVja2VkIHRoZSB0YWJsZSBzaWduYXR1cmUgZm9yICJTU0RUIiBvciAiUFNEVCIgaGVyZS4KLQkgKiBOZXh0LCB3ZSBhZGRlZCBzdXBwb3J0IGZvciBPRU14IHRhYmxlcywgc2lnbmF0dXJlICJPRU0iLgotCSAqIFZhbGlkIHRhYmxlcyB3ZXJlIGVuY291bnRlcmVkIHdpdGggYSBudWxsIHNpZ25hdHVyZSwgc28gd2UndmUganVzdAotCSAqIGdpdmVuIHVwIG9uIHZhbGlkYXRpbmcgdGhlIHNpZ25hdHVyZSwgc2luY2UgaXQgc2VlbXMgdG8gYmUgYSB3YXN0ZQotCSAqIG9mIGNvZGUuIFRoZSBvcmlnaW5hbCBjb2RlIHdhcyByZW1vdmVkICgwNS8yMDA4KS4KKwkgKiBWYWxpZGF0ZSB0aGUgaW5jb21pbmcgdGFibGUgc2lnbmF0dXJlLgorCSAqCisJICogMSkgT3JpZ2luYWxseSwgd2UgY2hlY2tlZCB0aGUgdGFibGUgc2lnbmF0dXJlIGZvciAiU1NEVCIgb3IgIlBTRFQiLgorCSAqIDIpIFdlIGFkZGVkIHN1cHBvcnQgZm9yIE9FTXggdGFibGVzLCBzaWduYXR1cmUgIk9FTSIuCisJICogMykgVmFsaWQgdGFibGVzIHdlcmUgZW5jb3VudGVyZWQgd2l0aCBhIG51bGwgc2lnbmF0dXJlLCBzbyB3ZSBqdXN0CisJICogICAgZ2F2ZSB1cCBvbiB2YWxpZGF0aW5nIHRoZSBzaWduYXR1cmUsICgwNS8yMDA4KS4KKwkgKiA0KSBXZSBlbmNvdW50ZXJlZCBub24tQU1MIHRhYmxlcyBzdWNoIGFzIHRoZSBNQURULCB3aGljaCBjYXVzZWQKKwkgKiAgICBpbnRlcnByZXRlciBlcnJvcnMgYW5kIGtlcm5lbCBmYXVsdHMuIFNvIG5vdywgd2Ugb25jZSBhZ2FpbiBhbGxvdworCSAqICAgIG9ubHkgIlNTRFQiLCAiT0VNeCIsIGFuZCBub3csIGFsc28gYSBudWxsIHNpZ25hdHVyZS4gKDA1LzIwMTEpLgogCSAqLworCWlmICgodGFibGVfZGVzYy0+cG9pbnRlci0+c2lnbmF0dXJlWzBdICE9IDB4MDApICYmCisJICAgICghQUNQSV9DT01QQVJFX05BTUUodGFibGVfZGVzYy0+cG9pbnRlci0+c2lnbmF0dXJlLCBBQ1BJX1NJR19TU0RUKSkKKwkgICAgJiYgKEFDUElfU1RSTkNNUCh0YWJsZV9kZXNjLT5wb2ludGVyLT5zaWduYXR1cmUsICJPRU0iLCAzKSkpIHsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCSAgICAiVGFibGUgaGFzIGludmFsaWQgc2lnbmF0dXJlIFslNC40c10gKDB4JTguOFgpLCBtdXN0IGJlIFNTRFQgb3IgT0VNeCIsCisJCQkgICAgYWNwaV91dF92YWxpZF9hY3BpX25hbWUoKih1MzIgKil0YWJsZV9kZXNjLT4KKwkJCQkJCSAgICBwb2ludGVyLT4KKwkJCQkJCSAgICBzaWduYXR1cmUpID8gdGFibGVfZGVzYy0+CisJCQkgICAgcG9pbnRlci0+c2lnbmF0dXJlIDogIj8/Pz8iLAorCQkJICAgICoodTMyICopdGFibGVfZGVzYy0+cG9pbnRlci0+c2lnbmF0dXJlKSk7CisKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9TSUdOQVRVUkUpOworCX0KIAogCSh2b2lkKWFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXBlaS9LY29uZmlnIGIvZHJpdmVycy9hY3BpL2FwZWkvS2NvbmZpZwppbmRleCBmNzM5YTcwLi5jMzRhYTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXBlaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYWNwaS9hcGVpL0tjb25maWcKQEAgLTEwLDkgKzEwLDExIEBACiAJICBlcnJvciBpbmplY3Rpb24uCiAKIGNvbmZpZyBBQ1BJX0FQRUlfR0hFUwotCXRyaXN0YXRlICJBUEVJIEdlbmVyaWMgSGFyZHdhcmUgRXJyb3IgU291cmNlIgorCWJvb2wgIkFQRUkgR2VuZXJpYyBIYXJkd2FyZSBFcnJvciBTb3VyY2UiCiAJZGVwZW5kcyBvbiBBQ1BJX0FQRUkgJiYgWDg2CiAJc2VsZWN0IEFDUElfSEVECisJc2VsZWN0IExMSVNUCisJc2VsZWN0IEdFTkVSSUNfQUxMT0NBVE9SCiAJaGVscAogCSAgR2VuZXJpYyBIYXJkd2FyZSBFcnJvciBTb3VyY2UgcHJvdmlkZXMgYSB3YXkgdG8gcmVwb3J0CiAJICBwbGF0Zm9ybSBoYXJkd2FyZSBlcnJvcnMgKHN1Y2ggYXMgdGhhdCBmcm9tIGNoaXBzZXQpLiBJdApAQCAtMzAsNiArMzIsMTMgQEAKIAkgIFBDSWUgQUVSIGVycm9ycyBtYXkgYmUgcmVwb3J0ZWQgdmlhIEFQRUkgZmlybXdhcmUgZmlyc3QgbW9kZS4KIAkgIFR1cm4gb24gdGhpcyBvcHRpb24gdG8gZW5hYmxlIHRoZSBjb3JyZXNwb25kaW5nIHN1cHBvcnQuCiAKK2NvbmZpZyBBQ1BJX0FQRUlfTUVNT1JZX0ZBSUxVUkUKKwlib29sICJBUEVJIG1lbW9yeSBlcnJvciByZWNvdmVyaW5nIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBQ1BJX0FQRUkgJiYgTUVNT1JZX0ZBSUxVUkUKKwloZWxwCisJICBNZW1vcnkgZXJyb3JzIG1heSBiZSByZXBvcnRlZCB2aWEgQVBFSSBmaXJtd2FyZSBmaXJzdCBtb2RlLgorCSAgVHVybiBvbiB0aGlzIG9wdGlvbiB0byBlbmFibGUgdGhlIG1lbW9yeSByZWNvdmVyaW5nIHN1cHBvcnQuCisKIGNvbmZpZyBBQ1BJX0FQRUlfRUlOSgogCXRyaXN0YXRlICJBUEVJIEVycm9yIElOSmVjdGlvbiAoRUlOSikiCiAJZGVwZW5kcyBvbiBBQ1BJX0FQRUkgJiYgREVCVUdfRlMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hcGVpL2FwZWktYmFzZS5jIGIvZHJpdmVycy9hY3BpL2FwZWkvYXBlaS1iYXNlLmMKaW5kZXggNGE5MDRhNC4uODA0MTI0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FwZWkvYXBlaS1iYXNlLmMKKysrIGIvZHJpdmVycy9hY3BpL2FwZWkvYXBlaS1iYXNlLmMKQEAgLTE1Nyw5ICsxNTcsMTAgQEAKICAqIEludGVycHJldCB0aGUgc3BlY2lmaWVkIGFjdGlvbi4gR28gdGhyb3VnaCB3aG9sZSBhY3Rpb24gdGFibGUsCiAgKiBleGVjdXRlIGFsbCBpbnN0cnVjdGlvbnMgYmVsb25nIHRvIHRoZSBhY3Rpb24uCiAgKi8KLWludCBhcGVpX2V4ZWNfcnVuKHN0cnVjdCBhcGVpX2V4ZWNfY29udGV4dCAqY3R4LCB1OCBhY3Rpb24pCitpbnQgX19hcGVpX2V4ZWNfcnVuKHN0cnVjdCBhcGVpX2V4ZWNfY29udGV4dCAqY3R4LCB1OCBhY3Rpb24sCisJCSAgICBib29sIG9wdGlvbmFsKQogewotCWludCByYzsKKwlpbnQgcmMgPSAtRU5PRU5UOwogCXUzMiBpLCBpcDsKIAlzdHJ1Y3QgYWNwaV93aGVhX2hlYWRlciAqZW50cnk7CiAJYXBlaV9leGVjX2luc19mdW5jX3QgcnVuOwpAQCAtMTk4LDkgKzE5OSw5IEBACiAJCQlnb3RvIHJld2luZDsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gIW9wdGlvbmFsICYmIHJjIDwgMCA/IHJjIDogMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGFwZWlfZXhlY19ydW4pOworRVhQT1JUX1NZTUJPTF9HUEwoX19hcGVpX2V4ZWNfcnVuKTsKIAogdHlwZWRlZiBpbnQgKCphcGVpX2V4ZWNfZW50cnlfZnVuY190KShzdHJ1Y3QgYXBlaV9leGVjX2NvbnRleHQgKmN0eCwKIAkJCQkgICAgICBzdHJ1Y3QgYWNwaV93aGVhX2hlYWRlciAqZW50cnksCkBAIC02MDMsMyArNjA0LDI5IEBACiAJcmV0dXJuIGRhcGVpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYXBlaV9nZXRfZGVidWdmc19kaXIpOworCitpbnQgYXBlaV9vc2Nfc2V0dXAodm9pZCkKK3sKKwlzdGF0aWMgdTggd2hlYV91dWlkX3N0cltdID0gImVkODU1ZTBjLTZjOTAtNDdiZi1hNjJhLTI2ZGUwZmM1YWQ1YyI7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCXUzMiBjYXBidWZbM107CisJc3RydWN0IGFjcGlfb3NjX2NvbnRleHQgY29udGV4dCA9IHsKKwkJLnV1aWRfc3RyCT0gd2hlYV91dWlkX3N0ciwKKwkJLnJldgkJPSAxLAorCQkuY2FwLmxlbmd0aAk9IHNpemVvZihjYXBidWYpLAorCQkuY2FwLnBvaW50ZXIJPSBjYXBidWYsCisJfTsKKworCWNhcGJ1ZltPU0NfUVVFUllfVFlQRV0gPSBPU0NfUVVFUllfRU5BQkxFOworCWNhcGJ1ZltPU0NfU1VQUE9SVF9UWVBFXSA9IDA7CisJY2FwYnVmW09TQ19DT05UUk9MX1RZUEVdID0gMDsKKworCWlmIChBQ1BJX0ZBSUxVUkUoYWNwaV9nZXRfaGFuZGxlKE5VTEwsICJcXF9TQiIsICZoYW5kbGUpKQorCSAgICB8fCBBQ1BJX0ZBSUxVUkUoYWNwaV9ydW5fb3NjKGhhbmRsZSwgJmNvbnRleHQpKSkKKwkJcmV0dXJuIC1FSU87CisJZWxzZSB7CisJCWtmcmVlKGNvbnRleHQucmV0LnBvaW50ZXIpOworCQlyZXR1cm4gMDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhcGVpX29zY19zZXR1cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXBlaS9hcGVpLWludGVybmFsLmggYi9kcml2ZXJzL2FjcGkvYXBlaS9hcGVpLWludGVybmFsLmgKaW5kZXggZWYwNTgxZi4uZjU3MDUwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FwZWkvYXBlaS1pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvYWNwaS9hcGVpL2FwZWktaW50ZXJuYWwuaApAQCAtNTAsNyArNTAsMTggQEAKIAlyZXR1cm4gY3R4LT52YWx1ZTsKIH0KIAotaW50IGFwZWlfZXhlY19ydW4oc3RydWN0IGFwZWlfZXhlY19jb250ZXh0ICpjdHgsIHU4IGFjdGlvbik7CitpbnQgX19hcGVpX2V4ZWNfcnVuKHN0cnVjdCBhcGVpX2V4ZWNfY29udGV4dCAqY3R4LCB1OCBhY3Rpb24sIGJvb2wgb3B0aW9uYWwpOworCitzdGF0aWMgaW5saW5lIGludCBhcGVpX2V4ZWNfcnVuKHN0cnVjdCBhcGVpX2V4ZWNfY29udGV4dCAqY3R4LCB1OCBhY3Rpb24pCit7CisJcmV0dXJuIF9fYXBlaV9leGVjX3J1bihjdHgsIGFjdGlvbiwgMCk7Cit9CisKKy8qIEl0IGlzIG9wdGlvbmFsIHdoZXRoZXIgdGhlIGZpcm13YXJlIHByb3ZpZGVzIHRoZSBhY3Rpb24gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGFwZWlfZXhlY19ydW5fb3B0aW9uYWwoc3RydWN0IGFwZWlfZXhlY19jb250ZXh0ICpjdHgsIHU4IGFjdGlvbikKK3sKKwlyZXR1cm4gX19hcGVpX2V4ZWNfcnVuKGN0eCwgYWN0aW9uLCAxKTsKK30KIAogLyogQ29tbW9uIGluc3RydWN0aW9uIGltcGxlbWVudGF0aW9uICovCiAKQEAgLTExMyw0ICsxMjQsNiBAQAogCQkJY29uc3Qgc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX3N0YXR1cyAqZXN0YXR1cyk7CiBpbnQgYXBlaV9lc3RhdHVzX2NoZWNrX2hlYWRlcihjb25zdCBzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWNfc3RhdHVzICplc3RhdHVzKTsKIGludCBhcGVpX2VzdGF0dXNfY2hlY2soY29uc3Qgc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX3N0YXR1cyAqZXN0YXR1cyk7CisKK2ludCBhcGVpX29zY19zZXR1cCh2b2lkKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FwZWkvZWluai5jIGIvZHJpdmVycy9hY3BpL2FwZWkvZWluai5jCmluZGV4IGY3NGIyZWEuLjU4OWI5NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hcGVpL2VpbmouYworKysgYi9kcml2ZXJzL2FjcGkvYXBlaS9laW5qLmMKQEAgLTQ2LDcgKzQ2LDggQEAKICAqIFNvbWUgQklPU2VzIGFsbG93IHBhcmFtZXRlcnMgdG8gdGhlIFNFVF9FUlJPUl9UWVBFIGVudHJpZXMgaW4gdGhlCiAgKiBFSU5KIHRhYmxlIHRocm91Z2ggYW4gdW5wdWJsaXNoZWQgZXh0ZW5zaW9uLiBVc2Ugd2l0aCBjYXV0aW9uIGFzCiAgKiBtb3N0IHdpbGwgaWdub3JlIHRoZSBwYXJhbWV0ZXIgYW5kIG1ha2UgdGhlaXIgb3duIGNob2ljZSBvZiBhZGRyZXNzCi0gKiBmb3IgZXJyb3IgaW5qZWN0aW9uLgorICogZm9yIGVycm9yIGluamVjdGlvbi4gIFRoaXMgZXh0ZW5zaW9uIGlzIHVzZWQgb25seSBpZgorICogcGFyYW1fZXh0ZW5zaW9uIG1vZHVsZSBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkLgogICovCiBzdHJ1Y3QgZWlual9wYXJhbWV0ZXIgewogCXU2NCB0eXBlOwpAQCAtNjUsNiArNjYsOSBAQAogCSgoc3RydWN0IGFjcGlfd2hlYV9oZWFkZXIgKikoKGNoYXIgKikodGFiKSArCQkJXAogCQkJCSAgICBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZWluaikpKQogCitzdGF0aWMgYm9vbCBwYXJhbV9leHRlbnNpb247Cittb2R1bGVfcGFyYW0ocGFyYW1fZXh0ZW5zaW9uLCBib29sLCAwKTsKKwogc3RhdGljIHN0cnVjdCBhY3BpX3RhYmxlX2VpbmogKmVpbmpfdGFiOwogCiBzdGF0aWMgc3RydWN0IGFwZWlfcmVzb3VyY2VzIGVpbmpfcmVzb3VyY2VzOwpAQCAtMjg1LDcgKzI4OSw3IEBACiAKIAllaW5qX2V4ZWNfY3R4X2luaXQoJmN0eCk7CiAKLQlyYyA9IGFwZWlfZXhlY19ydW4oJmN0eCwgQUNQSV9FSU5KX0JFR0lOX09QRVJBVElPTik7CisJcmMgPSBhcGVpX2V4ZWNfcnVuX29wdGlvbmFsKCZjdHgsIEFDUElfRUlOSl9CRUdJTl9PUEVSQVRJT04pOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCWFwZWlfZXhlY19jdHhfc2V0X2lucHV0KCZjdHgsIHR5cGUpOwpAQCAtMzIzLDcgKzMyNyw3IEBACiAJcmMgPSBfX2VpbmpfZXJyb3JfdHJpZ2dlcih0cmlnZ2VyX3BhZGRyKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKLQlyYyA9IGFwZWlfZXhlY19ydW4oJmN0eCwgQUNQSV9FSU5KX0VORF9PUEVSQVRJT04pOworCXJjID0gYXBlaV9leGVjX3J1bl9vcHRpb25hbCgmY3R4LCBBQ1BJX0VJTkpfRU5EX09QRVJBVElPTik7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC00ODksMTQgKzQ5Myw2IEBACiAJCQkJICAgICBlaW5qX2RlYnVnX2RpciwgTlVMTCwgJmVycm9yX3R5cGVfZm9wcyk7CiAJaWYgKCFmZW50cnkpCiAJCWdvdG8gZXJyX2NsZWFudXA7Ci0JZmVudHJ5ID0gZGVidWdmc19jcmVhdGVfeDY0KCJwYXJhbTEiLCBTX0lSVVNSIHwgU19JV1VTUiwKLQkJCQkgICAgZWlual9kZWJ1Z19kaXIsICZlcnJvcl9wYXJhbTEpOwotCWlmICghZmVudHJ5KQotCQlnb3RvIGVycl9jbGVhbnVwOwotCWZlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX3g2NCgicGFyYW0yIiwgU19JUlVTUiB8IFNfSVdVU1IsCi0JCQkJICAgIGVpbmpfZGVidWdfZGlyLCAmZXJyb3JfcGFyYW0yKTsKLQlpZiAoIWZlbnRyeSkKLQkJZ290byBlcnJfY2xlYW51cDsKIAlmZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJlcnJvcl9pbmplY3QiLCBTX0lXVVNSLAogCQkJCSAgICAgZWlual9kZWJ1Z19kaXIsIE5VTEwsICZlcnJvcl9pbmplY3RfZm9wcyk7CiAJaWYgKCFmZW50cnkpCkBAIC01MTMsMTIgKzUwOSwyMyBAQAogCXJjID0gYXBlaV9leGVjX3ByZV9tYXBfZ2FycygmY3R4KTsKIAlpZiAocmMpCiAJCWdvdG8gZXJyX3JlbGVhc2U7Ci0JcGFyYW1fcGFkZHIgPSBlaW5qX2dldF9wYXJhbWV0ZXJfYWRkcmVzcygpOwotCWlmIChwYXJhbV9wYWRkcikgewotCQllaW5qX3BhcmFtID0gaW9yZW1hcChwYXJhbV9wYWRkciwgc2l6ZW9mKCplaW5qX3BhcmFtKSk7Ci0JCXJjID0gLUVOT01FTTsKLQkJaWYgKCFlaW5qX3BhcmFtKQotCQkJZ290byBlcnJfdW5tYXA7CisJaWYgKHBhcmFtX2V4dGVuc2lvbikgeworCQlwYXJhbV9wYWRkciA9IGVpbmpfZ2V0X3BhcmFtZXRlcl9hZGRyZXNzKCk7CisJCWlmIChwYXJhbV9wYWRkcikgeworCQkJZWlual9wYXJhbSA9IGlvcmVtYXAocGFyYW1fcGFkZHIsIHNpemVvZigqZWlual9wYXJhbSkpOworCQkJcmMgPSAtRU5PTUVNOworCQkJaWYgKCFlaW5qX3BhcmFtKQorCQkJCWdvdG8gZXJyX3VubWFwOworCQkJZmVudHJ5ID0gZGVidWdmc19jcmVhdGVfeDY0KCJwYXJhbTEiLCBTX0lSVVNSIHwgU19JV1VTUiwKKwkJCQkJCSAgICBlaW5qX2RlYnVnX2RpciwgJmVycm9yX3BhcmFtMSk7CisJCQlpZiAoIWZlbnRyeSkKKwkJCQlnb3RvIGVycl91bm1hcDsKKwkJCWZlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX3g2NCgicGFyYW0yIiwgU19JUlVTUiB8IFNfSVdVU1IsCisJCQkJCQkgICAgZWlual9kZWJ1Z19kaXIsICZlcnJvcl9wYXJhbTIpOworCQkJaWYgKCFmZW50cnkpCisJCQkJZ290byBlcnJfdW5tYXA7CisJCX0gZWxzZQorCQkJcHJfd2FybihFSU5KX1BGWCAiUGFyYW1ldGVyIGV4dGVuc2lvbiBpcyBub3Qgc3VwcG9ydGVkLlxuIik7CiAJfQogCiAJcHJfaW5mbyhFSU5KX1BGWCAiRXJyb3IgSU5KZWN0aW9uIGlzIGluaXRpYWxpemVkLlxuIik7CkBAIC01MjYsNiArNTMzLDggQEAKIAlyZXR1cm4gMDsKIAogZXJyX3VubWFwOgorCWlmIChlaW5qX3BhcmFtKQorCQlpb3VubWFwKGVpbmpfcGFyYW0pOwogCWFwZWlfZXhlY19wb3N0X3VubWFwX2dhcnMoJmN0eCk7CiBlcnJfcmVsZWFzZToKIAlhcGVpX3Jlc291cmNlc19yZWxlYXNlKCZlaW5qX3Jlc291cmNlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXBlaS9lcnN0LWRiZy5jIGIvZHJpdmVycy9hY3BpL2FwZWkvZXJzdC1kYmcuYwppbmRleCBhNGNmYjY0Li45MDM1NDlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXBlaS9lcnN0LWRiZy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hcGVpL2Vyc3QtZGJnLmMKQEAgLTMzLDcgKzMzLDcgQEAKIAogI2RlZmluZSBFUlNUX0RCR19QRlgJCQkiRVJTVCBEQkc6ICIKIAotI2RlZmluZSBFUlNUX0RCR19SRUNPUkRfTEVOX01BWAkJNDA5NgorI2RlZmluZSBFUlNUX0RCR19SRUNPUkRfTEVOX01BWAkJMHg0MDAwCiAKIHN0YXRpYyB2b2lkICplcnN0X2RiZ19idWY7CiBzdGF0aWMgdW5zaWduZWQgaW50IGVyc3RfZGJnX2J1Zl9sZW47CkBAIC0yMTMsNiArMjEzLDEwIEBACiAKIHN0YXRpYyBfX2luaXQgaW50IGVyc3RfZGJnX2luaXQodm9pZCkKIHsKKwlpZiAoZXJzdF9kaXNhYmxlKSB7CisJCXByX2luZm8oRVJTVF9EQkdfUEZYICJFUlNUIHN1cHBvcnQgaXMgZGlzYWJsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQogCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZlcnN0X2RiZ19kZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXBlaS9lcnN0LmMgYi9kcml2ZXJzL2FjcGkvYXBlaS9lcnN0LmMKaW5kZXggZTZjZWY4ZS4uMmNhNTlkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FwZWkvZXJzdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hcGVpL2Vyc3QuYwpAQCAtNjQyLDcgKzY0Miw3IEBACiAJaW50IHJjOwogCiAJZXJzdF9leGVjX2N0eF9pbml0KCZjdHgpOwotCXJjID0gYXBlaV9leGVjX3J1bigmY3R4LCBBQ1BJX0VSU1RfQkVHSU5fV1JJVEUpOworCXJjID0gYXBlaV9leGVjX3J1bl9vcHRpb25hbCgmY3R4LCBBQ1BJX0VSU1RfQkVHSU5fV1JJVEUpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCWFwZWlfZXhlY19jdHhfc2V0X2lucHV0KCZjdHgsIG9mZnNldCk7CkBAIC02NjYsNyArNjY2LDcgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAl2YWwgPSBhcGVpX2V4ZWNfY3R4X2dldF9vdXRwdXQoJmN0eCk7Ci0JcmMgPSBhcGVpX2V4ZWNfcnVuKCZjdHgsIEFDUElfRVJTVF9FTkQpOworCXJjID0gYXBlaV9leGVjX3J1bl9vcHRpb25hbCgmY3R4LCBBQ1BJX0VSU1RfRU5EKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApAQCAtNjgxLDcgKzY4MSw3IEBACiAJaW50IHJjOwogCiAJZXJzdF9leGVjX2N0eF9pbml0KCZjdHgpOwotCXJjID0gYXBlaV9leGVjX3J1bigmY3R4LCBBQ1BJX0VSU1RfQkVHSU5fUkVBRCk7CisJcmMgPSBhcGVpX2V4ZWNfcnVuX29wdGlvbmFsKCZjdHgsIEFDUElfRVJTVF9CRUdJTl9SRUFEKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAlhcGVpX2V4ZWNfY3R4X3NldF9pbnB1dCgmY3R4LCBvZmZzZXQpOwpAQCAtNzA5LDcgKzcwOSw3IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAJdmFsID0gYXBlaV9leGVjX2N0eF9nZXRfb3V0cHV0KCZjdHgpOwotCXJjID0gYXBlaV9leGVjX3J1bigmY3R4LCBBQ1BJX0VSU1RfRU5EKTsKKwlyYyA9IGFwZWlfZXhlY19ydW5fb3B0aW9uYWwoJmN0eCwgQUNQSV9FUlNUX0VORCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKQEAgLTcyNCw3ICs3MjQsNyBAQAogCWludCByYzsKIAogCWVyc3RfZXhlY19jdHhfaW5pdCgmY3R4KTsKLQlyYyA9IGFwZWlfZXhlY19ydW4oJmN0eCwgQUNQSV9FUlNUX0JFR0lOX0NMRUFSKTsKKwlyYyA9IGFwZWlfZXhlY19ydW5fb3B0aW9uYWwoJmN0eCwgQUNQSV9FUlNUX0JFR0lOX0NMRUFSKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAlhcGVpX2V4ZWNfY3R4X3NldF9pbnB1dCgmY3R4LCByZWNvcmRfaWQpOwpAQCAtNzQ4LDcgKzc0OCw3IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAJdmFsID0gYXBlaV9leGVjX2N0eF9nZXRfb3V0cHV0KCZjdHgpOwotCXJjID0gYXBlaV9leGVjX3J1bigmY3R4LCBBQ1BJX0VSU1RfRU5EKTsKKwlyYyA9IGFwZWlfZXhlY19ydW5fb3B0aW9uYWwoJmN0eCwgQUNQSV9FUlNUX0VORCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKQEAgLTkzMiw4ICs5MzIsMTEgQEAKIHN0YXRpYyBpbnQgZXJzdF9vcGVuX3BzdG9yZShzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CiBzdGF0aWMgaW50IGVyc3RfY2xvc2VfcHN0b3JlKHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKTsKIHN0YXRpYyBzc2l6ZV90IGVyc3RfcmVhZGVyKHU2NCAqaWQsIGVudW0gcHN0b3JlX3R5cGVfaWQgKnR5cGUsCi0JCSAgICAgICBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpOwotc3RhdGljIHU2NCBlcnN0X3dyaXRlcihlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHNpemVfdCBzaXplKTsKKwkJCSAgIHN0cnVjdCB0aW1lc3BlYyAqdGltZSwgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpOworc3RhdGljIHU2NCBlcnN0X3dyaXRlcihlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHVuc2lnbmVkIGludCBwYXJ0LAorCQkgICAgICAgc2l6ZV90IHNpemUsIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKTsKK3N0YXRpYyBpbnQgZXJzdF9jbGVhcmVyKGVudW0gcHN0b3JlX3R5cGVfaWQgdHlwZSwgdTY0IGlkLAorCQkJc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpOwogCiBzdGF0aWMgc3RydWN0IHBzdG9yZV9pbmZvIGVyc3RfaW5mbyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCkBAIC05NDIsNyArOTQ1LDcgQEAKIAkuY2xvc2UJCT0gZXJzdF9jbG9zZV9wc3RvcmUsCiAJLnJlYWQJCT0gZXJzdF9yZWFkZXIsCiAJLndyaXRlCQk9IGVyc3Rfd3JpdGVyLAotCS5lcmFzZQkJPSBlcnN0X2NsZWFyCisJLmVyYXNlCQk9IGVyc3RfY2xlYXJlcgogfTsKIAogI2RlZmluZSBDUEVSX0NSRUFUT1JfUFNUT1JFCQkJCQkJXApAQCAtOTgzLDcgKzk4Niw3IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGVyc3RfcmVhZGVyKHU2NCAqaWQsIGVudW0gcHN0b3JlX3R5cGVfaWQgKnR5cGUsCi0JCSAgICAgICBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpCisJCQkgICBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUsIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQogewogCWludCByYzsKIAlzc2l6ZV90IGxlbiA9IDA7CkBAIC0xMDM3LDcgKzEwNDAsOCBAQAogCXJldHVybiAocmMgPCAwKSA/IHJjIDogKGxlbiAtIHNpemVvZigqcmNkKSk7CiB9CiAKLXN0YXRpYyB1NjQgZXJzdF93cml0ZXIoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyB1NjQgZXJzdF93cml0ZXIoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1bnNpZ25lZCBpbnQgcGFydCwKKwkJICAgICAgIHNpemVfdCBzaXplLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSkKIHsKIAlzdHJ1Y3QgY3Blcl9wc3RvcmVfcmVjb3JkICpyY2QgPSAoc3RydWN0IGNwZXJfcHN0b3JlX3JlY29yZCAqKQogCQkJCQkoZXJzdF9pbmZvLmJ1ZiAtIHNpemVvZigqcmNkKSk7CkBAIC0xMDgwLDYgKzEwODQsMTIgQEAKIAlyZXR1cm4gcmNkLT5oZHIucmVjb3JkX2lkOwogfQogCitzdGF0aWMgaW50IGVyc3RfY2xlYXJlcihlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHU2NCBpZCwKKwkJCXN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQoreworCXJldHVybiBlcnN0X2NsZWFyKGlkKTsKK30KKwogc3RhdGljIGludCBfX2luaXQgZXJzdF9pbml0KHZvaWQpCiB7CiAJaW50IHJjID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hcGVpL2doZXMuYyBiL2RyaXZlcnMvYWNwaS9hcGVpL2doZXMuYwppbmRleCBmNzAzYjI4Li4wNzg0Zjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXBlaS9naGVzLmMKKysrIGIvZHJpdmVycy9hY3BpL2FwZWkvZ2hlcy5jCkBAIC0xMiw3ICsxMiw3IEBACiAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBHZW5lcmljIEhhcmR3YXJlIEVycm9yIFNvdXJjZSwgcGxlYXNlCiAgKiByZWZlciB0byBBQ1BJIFNwZWNpZmljYXRpb24gdmVyc2lvbiA0LjAsIHNlY3Rpb24gMTcuMy4yLjYKICAqCi0gKiBDb3B5cmlnaHQgMjAxMCBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IDIwMTAsMjAxMSBJbnRlbCBDb3JwLgogICogICBBdXRob3I6IEh1YW5nIFlpbmcgPHlpbmcuaHVhbmdAaW50ZWwuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTQyLDYgKzQyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFfd29yay5oPgorI2luY2x1ZGUgPGxpbnV4L2xsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZ2VuYWxsb2MuaD4KICNpbmNsdWRlIDxhY3BpL2FwZWkuaD4KICNpbmNsdWRlIDxhY3BpL2F0b21pY2lvLmg+CiAjaW5jbHVkZSA8YWNwaS9oZWQuaD4KQEAgLTUzLDYgKzU2LDMwIEBACiAjZGVmaW5lIEdIRVNfUEZYCSJHSEVTOiAiCiAKICNkZWZpbmUgR0hFU19FU1RBVFVTX01BWF9TSVpFCQk2NTUzNgorI2RlZmluZSBHSEVTX0VTT1VSQ0VfUFJFQUxMT0NfTUFYX1NJWkUJNjU1MzYKKworI2RlZmluZSBHSEVTX0VTVEFUVVNfUE9PTF9NSU5fQUxMT0NfT1JERVIgMworCisvKiBUaGlzIGlzIGp1c3QgYW4gZXN0aW1hdGlvbiBmb3IgbWVtb3J5IHBvb2wgYWxsb2NhdGlvbiAqLworI2RlZmluZSBHSEVTX0VTVEFUVVNfQ0FDSEVfQVZHX1NJWkUJNTEyCisKKyNkZWZpbmUgR0hFU19FU1RBVFVTX0NBQ0hFU19TSVpFCTQKKworI2RlZmluZSBHSEVTX0VTVEFUVVNfSU5fQ0FDSEVfTUFYX05TRUMJMTAwMDAwMDAwMDBVTEwKKy8qIFByZXZlbnQgdG9vIG1hbnkgY2FjaGVzIGFyZSBhbGxvY2F0ZWQgYmVjYXVzZSBvZiBSQ1UgKi8KKyNkZWZpbmUgR0hFU19FU1RBVFVTX0NBQ0hFX0FMTE9DRURfTUFYCShHSEVTX0VTVEFUVVNfQ0FDSEVTX1NJWkUgKiAzIC8gMikKKworI2RlZmluZSBHSEVTX0VTVEFUVVNfQ0FDSEVfTEVOKGVzdGF0dXNfbGVuKQkJCVwKKwkoc2l6ZW9mKHN0cnVjdCBnaGVzX2VzdGF0dXNfY2FjaGUpICsgKGVzdGF0dXNfbGVuKSkKKyNkZWZpbmUgR0hFU19FU1RBVFVTX0ZST01fQ0FDSEUoZXN0YXR1c19jYWNoZSkJCQlcCisJKChzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWNfc3RhdHVzICopCQkJXAorCSAoKHN0cnVjdCBnaGVzX2VzdGF0dXNfY2FjaGUgKikoZXN0YXR1c19jYWNoZSkgKyAxKSkKKworI2RlZmluZSBHSEVTX0VTVEFUVVNfTk9ERV9MRU4oZXN0YXR1c19sZW4pCQkJXAorCShzaXplb2Yoc3RydWN0IGdoZXNfZXN0YXR1c19ub2RlKSArIChlc3RhdHVzX2xlbikpCisjZGVmaW5lIEdIRVNfRVNUQVRVU19GUk9NX05PREUoZXN0YXR1c19ub2RlKQkJCQlcCisJKChzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWNfc3RhdHVzICopCQkJCVwKKwkgKChzdHJ1Y3QgZ2hlc19lc3RhdHVzX25vZGUgKikoZXN0YXR1c19ub2RlKSArIDEpKQogCiAvKgogICogT25lIHN0cnVjdCBnaGVzIGlzIGNyZWF0ZWQgZm9yIGVhY2ggZ2VuZXJpYyBoYXJkd2FyZSBlcnJvciBzb3VyY2UuCkBAIC03Nyw2ICsxMDQsMjIgQEAKIAl9OwogfTsKIAorc3RydWN0IGdoZXNfZXN0YXR1c19ub2RlIHsKKwlzdHJ1Y3QgbGxpc3Rfbm9kZSBsbG5vZGU7CisJc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljICpnZW5lcmljOworfTsKKworc3RydWN0IGdoZXNfZXN0YXR1c19jYWNoZSB7CisJdTMyIGVzdGF0dXNfbGVuOworCWF0b21pY190IGNvdW50OworCXN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpYyAqZ2VuZXJpYzsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdGltZV9pbjsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1OworfTsKKworaW50IGdoZXNfZGlzYWJsZTsKK21vZHVsZV9wYXJhbV9uYW1lZChkaXNhYmxlLCBnaGVzX2Rpc2FibGUsIGJvb2wsIDApOworCiBzdGF0aWMgaW50IGdoZXNfcGFuaWNfdGltZW91dAlfX3JlYWRfbW9zdGx5ID0gMzA7CiAKIC8qCkBAIC0xMjEsNiArMTY0LDIyIEBACiBzdGF0aWMgREVGSU5FX1JBV19TUElOTE9DSyhnaGVzX2lvcmVtYXBfbG9ja19ubWkpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhnaGVzX2lvcmVtYXBfbG9ja19pcnEpOwogCisvKgorICogcHJpbnRrIGlzIG5vdCBzYWZlIGluIE5NSSBjb250ZXh0LiAgU28gaW4gTk1JIGhhbmRsZXIsIHdlIGFsbG9jYXRlCisgKiByZXF1aXJlZCBtZW1vcnkgZnJvbSBsb2NrLWxlc3MgbWVtb3J5IGFsbG9jYXRvcgorICogKGdoZXNfZXN0YXR1c19wb29sKSwgc2F2ZSBlc3RhdHVzIGludG8gaXQsIHB1dCB0aGVtIGludG8gbG9jay1sZXNzCisgKiBsaXN0IChnaGVzX2VzdGF0dXNfbGxpc3QpLCB0aGVuIGRlbGF5IHByaW50ayBpbnRvIElSUSBjb250ZXh0IHZpYQorICogaXJxX3dvcmsgKGdoZXNfcHJvY19pcnFfd29yaykuICBnaGVzX2VzdGF0dXNfc2l6ZV9yZXF1ZXN0IHJlY29yZAorICogcmVxdWlyZWQgcG9vbCBzaXplIGJ5IGFsbCBOTUkgZXJyb3Igc291cmNlLgorICovCitzdGF0aWMgc3RydWN0IGdlbl9wb29sICpnaGVzX2VzdGF0dXNfcG9vbDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdoZXNfZXN0YXR1c19wb29sX3NpemVfcmVxdWVzdDsKK3N0YXRpYyBzdHJ1Y3QgbGxpc3RfaGVhZCBnaGVzX2VzdGF0dXNfbGxpc3Q7CitzdGF0aWMgc3RydWN0IGlycV93b3JrIGdoZXNfcHJvY19pcnFfd29yazsKKworc3RydWN0IGdoZXNfZXN0YXR1c19jYWNoZSAqZ2hlc19lc3RhdHVzX2NhY2hlc1tHSEVTX0VTVEFUVVNfQ0FDSEVTX1NJWkVdOworc3RhdGljIGF0b21pY190IGdoZXNfZXN0YXR1c19jYWNoZV9hbGxvY2VkOworCiBzdGF0aWMgaW50IGdoZXNfaW9yZW1hcF9pbml0KHZvaWQpCiB7CiAJZ2hlc19pb3JlbWFwX2FyZWEgPSBfX2dldF92bV9hcmVhKFBBR0VfU0laRSAqIEdIRVNfSU9SRU1BUF9QQUdFUywKQEAgLTE4MCw2ICsyMzksNTUgQEAKIAlfX2ZsdXNoX3RsYl9vbmUodmFkZHIpOwogfQogCitzdGF0aWMgaW50IGdoZXNfZXN0YXR1c19wb29sX2luaXQodm9pZCkKK3sKKwlnaGVzX2VzdGF0dXNfcG9vbCA9IGdlbl9wb29sX2NyZWF0ZShHSEVTX0VTVEFUVVNfUE9PTF9NSU5fQUxMT0NfT1JERVIsIC0xKTsKKwlpZiAoIWdoZXNfZXN0YXR1c19wb29sKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2hlc19lc3RhdHVzX3Bvb2xfZnJlZV9jaHVua19wYWdlKHN0cnVjdCBnZW5fcG9vbCAqcG9vbCwKKwkJCQkJICAgICAgc3RydWN0IGdlbl9wb29sX2NodW5rICpjaHVuaywKKwkJCQkJICAgICAgdm9pZCAqZGF0YSkKK3sKKwlmcmVlX3BhZ2UoY2h1bmstPnN0YXJ0X2FkZHIpOworfQorCitzdGF0aWMgdm9pZCBnaGVzX2VzdGF0dXNfcG9vbF9leGl0KHZvaWQpCit7CisJZ2VuX3Bvb2xfZm9yX2VhY2hfY2h1bmsoZ2hlc19lc3RhdHVzX3Bvb2wsCisJCQkJZ2hlc19lc3RhdHVzX3Bvb2xfZnJlZV9jaHVua19wYWdlLCBOVUxMKTsKKwlnZW5fcG9vbF9kZXN0cm95KGdoZXNfZXN0YXR1c19wb29sKTsKK30KKworc3RhdGljIGludCBnaGVzX2VzdGF0dXNfcG9vbF9leHBhbmQodW5zaWduZWQgbG9uZyBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBpLCBwYWdlcywgc2l6ZSwgYWRkcjsKKwlpbnQgcmV0OworCisJZ2hlc19lc3RhdHVzX3Bvb2xfc2l6ZV9yZXF1ZXN0ICs9IFBBR0VfQUxJR04obGVuKTsKKwlzaXplID0gZ2VuX3Bvb2xfc2l6ZShnaGVzX2VzdGF0dXNfcG9vbCk7CisJaWYgKHNpemUgPj0gZ2hlc19lc3RhdHVzX3Bvb2xfc2l6ZV9yZXF1ZXN0KQorCQlyZXR1cm4gMDsKKwlwYWdlcyA9IChnaGVzX2VzdGF0dXNfcG9vbF9zaXplX3JlcXVlc3QgLSBzaXplKSAvIFBBR0VfU0laRTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworCQlhZGRyID0gX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIWFkZHIpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0ID0gZ2VuX3Bvb2xfYWRkKGdoZXNfZXN0YXR1c19wb29sLCBhZGRyLCBQQUdFX1NJWkUsIC0xKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdoZXNfZXN0YXR1c19wb29sX3Nocmluayh1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlnaGVzX2VzdGF0dXNfcG9vbF9zaXplX3JlcXVlc3QgLT0gUEFHRV9BTElHTihsZW4pOworfQorCiBzdGF0aWMgc3RydWN0IGdoZXMgKmdoZXNfbmV3KHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpYyAqZ2VuZXJpYykKIHsKIAlzdHJ1Y3QgZ2hlcyAqZ2hlczsKQEAgLTM0MSw0MyArNDQ5LDE5NiBAQAogCWdoZXMtPmZsYWdzICY9IH5HSEVTX1RPX0NMRUFSOwogfQogCi1zdGF0aWMgdm9pZCBnaGVzX2RvX3Byb2Moc3RydWN0IGdoZXMgKmdoZXMpCitzdGF0aWMgdm9pZCBnaGVzX2RvX3Byb2MoY29uc3Qgc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX3N0YXR1cyAqZXN0YXR1cykKIHsKLQlpbnQgc2V2LCBwcm9jZXNzZWQgPSAwOworCWludCBzZXYsIHNlY19zZXY7CiAJc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX2RhdGEgKmdkYXRhOwogCi0Jc2V2ID0gZ2hlc19zZXZlcml0eShnaGVzLT5lc3RhdHVzLT5lcnJvcl9zZXZlcml0eSk7Ci0JYXBlaV9lc3RhdHVzX2Zvcl9lYWNoX3NlY3Rpb24oZ2hlcy0+ZXN0YXR1cywgZ2RhdGEpIHsKLSNpZmRlZiBDT05GSUdfWDg2X01DRQorCXNldiA9IGdoZXNfc2V2ZXJpdHkoZXN0YXR1cy0+ZXJyb3Jfc2V2ZXJpdHkpOworCWFwZWlfZXN0YXR1c19mb3JfZWFjaF9zZWN0aW9uKGVzdGF0dXMsIGdkYXRhKSB7CisJCXNlY19zZXYgPSBnaGVzX3NldmVyaXR5KGdkYXRhLT5lcnJvcl9zZXZlcml0eSk7CiAJCWlmICghdXVpZF9sZV9jbXAoKih1dWlkX2xlICopZ2RhdGEtPnNlY3Rpb25fdHlwZSwKIAkJCQkgQ1BFUl9TRUNfUExBVEZPUk1fTUVNKSkgewotCQkJYXBlaV9tY2VfcmVwb3J0X21lbV9lcnJvcigKLQkJCQlzZXYgPT0gR0hFU19TRVZfQ09SUkVDVEVELAotCQkJCShzdHJ1Y3QgY3Blcl9zZWNfbWVtX2VyciAqKShnZGF0YSsxKSk7Ci0JCQlwcm9jZXNzZWQgPSAxOwotCQl9CisJCQlzdHJ1Y3QgY3Blcl9zZWNfbWVtX2VyciAqbWVtX2VycjsKKwkJCW1lbV9lcnIgPSAoc3RydWN0IGNwZXJfc2VjX21lbV9lcnIgKikoZ2RhdGErMSk7CisjaWZkZWYgQ09ORklHX1g4Nl9NQ0UKKwkJCWFwZWlfbWNlX3JlcG9ydF9tZW1fZXJyb3Ioc2V2ID09IEdIRVNfU0VWX0NPUlJFQ1RFRCwKKwkJCQkJCSAgbWVtX2Vycik7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQUNQSV9BUEVJX01FTU9SWV9GQUlMVVJFCisJCQlpZiAoc2V2ID09IEdIRVNfU0VWX1JFQ09WRVJBQkxFICYmCisJCQkgICAgc2VjX3NldiA9PSBHSEVTX1NFVl9SRUNPVkVSQUJMRSAmJgorCQkJICAgIG1lbV9lcnItPnZhbGlkYXRpb25fYml0cyAmIENQRVJfTUVNX1ZBTElEX1BIWVNJQ0FMX0FERFJFU1MpIHsKKwkJCQl1bnNpZ25lZCBsb25nIHBmbjsKKwkJCQlwZm4gPSBtZW1fZXJyLT5waHlzaWNhbF9hZGRyID4+IFBBR0VfU0hJRlQ7CisJCQkJbWVtb3J5X2ZhaWx1cmVfcXVldWUocGZuLCAwLCAwKTsKKwkJCX0KKyNlbmRpZgorCQl9CiAJfQogfQogCi1zdGF0aWMgdm9pZCBnaGVzX3ByaW50X2VzdGF0dXMoY29uc3QgY2hhciAqcGZ4LCBzdHJ1Y3QgZ2hlcyAqZ2hlcykKK3N0YXRpYyB2b2lkIF9fZ2hlc19wcmludF9lc3RhdHVzKGNvbnN0IGNoYXIgKnBmeCwKKwkJCQkgY29uc3Qgc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljICpnZW5lcmljLAorCQkJCSBjb25zdCBzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWNfc3RhdHVzICplc3RhdHVzKQogewotCS8qIE5vdCBtb3JlIHRoYW4gMiBtZXNzYWdlcyBldmVyeSA1IHNlY29uZHMgKi8KLQlzdGF0aWMgREVGSU5FX1JBVEVMSU1JVF9TVEFURShyYXRlbGltaXQsIDUqSFosIDIpOwotCiAJaWYgKHBmeCA9PSBOVUxMKSB7Ci0JCWlmIChnaGVzX3NldmVyaXR5KGdoZXMtPmVzdGF0dXMtPmVycm9yX3NldmVyaXR5KSA8PQorCQlpZiAoZ2hlc19zZXZlcml0eShlc3RhdHVzLT5lcnJvcl9zZXZlcml0eSkgPD0KIAkJICAgIEdIRVNfU0VWX0NPUlJFQ1RFRCkKIAkJCXBmeCA9IEtFUk5fV0FSTklORyBIV19FUlI7CiAJCWVsc2UKIAkJCXBmeCA9IEtFUk5fRVJSIEhXX0VSUjsKIAl9Ci0JaWYgKF9fcmF0ZWxpbWl0KCZyYXRlbGltaXQpKSB7Ci0JCXByaW50aygKLQkiJXMiIkhhcmR3YXJlIGVycm9yIGZyb20gQVBFSSBHZW5lcmljIEhhcmR3YXJlIEVycm9yIFNvdXJjZTogJWRcbiIsCi0JcGZ4LCBnaGVzLT5nZW5lcmljLT5oZWFkZXIuc291cmNlX2lkKTsKLQkJYXBlaV9lc3RhdHVzX3ByaW50KHBmeCwgZ2hlcy0+ZXN0YXR1cyk7CisJcHJpbnRrKCIlcyIiSGFyZHdhcmUgZXJyb3IgZnJvbSBBUEVJIEdlbmVyaWMgSGFyZHdhcmUgRXJyb3IgU291cmNlOiAlZFxuIiwKKwkgICAgICAgcGZ4LCBnZW5lcmljLT5oZWFkZXIuc291cmNlX2lkKTsKKwlhcGVpX2VzdGF0dXNfcHJpbnQocGZ4LCBlc3RhdHVzKTsKK30KKworc3RhdGljIGludCBnaGVzX3ByaW50X2VzdGF0dXMoY29uc3QgY2hhciAqcGZ4LAorCQkJICAgICAgY29uc3Qgc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljICpnZW5lcmljLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX3N0YXR1cyAqZXN0YXR1cykKK3sKKwkvKiBOb3QgbW9yZSB0aGFuIDIgbWVzc2FnZXMgZXZlcnkgNSBzZWNvbmRzICovCisJc3RhdGljIERFRklORV9SQVRFTElNSVRfU1RBVEUocmF0ZWxpbWl0X2NvcnJlY3RlZCwgNSpIWiwgMik7CisJc3RhdGljIERFRklORV9SQVRFTElNSVRfU1RBVEUocmF0ZWxpbWl0X3VuY29ycmVjdGVkLCA1KkhaLCAyKTsKKwlzdHJ1Y3QgcmF0ZWxpbWl0X3N0YXRlICpyYXRlbGltaXQ7CisKKwlpZiAoZ2hlc19zZXZlcml0eShlc3RhdHVzLT5lcnJvcl9zZXZlcml0eSkgPD0gR0hFU19TRVZfQ09SUkVDVEVEKQorCQlyYXRlbGltaXQgPSAmcmF0ZWxpbWl0X2NvcnJlY3RlZDsKKwllbHNlCisJCXJhdGVsaW1pdCA9ICZyYXRlbGltaXRfdW5jb3JyZWN0ZWQ7CisJaWYgKF9fcmF0ZWxpbWl0KHJhdGVsaW1pdCkpIHsKKwkJX19naGVzX3ByaW50X2VzdGF0dXMocGZ4LCBnZW5lcmljLCBlc3RhdHVzKTsKKwkJcmV0dXJuIDE7CiAJfQorCXJldHVybiAwOworfQorCisvKgorICogR0hFUyBlcnJvciBzdGF0dXMgcmVwb3J0aW5nIHRocm90dGxlLCB0byByZXBvcnQgbW9yZSBraW5kcyBvZgorICogZXJyb3JzLCBpbnN0ZWFkIG9mIGp1c3QgbW9zdCBmcmVxdWVudGx5IG9jY3VycmVkIGVycm9ycy4KKyAqLworc3RhdGljIGludCBnaGVzX2VzdGF0dXNfY2FjaGVkKHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19zdGF0dXMgKmVzdGF0dXMpCit7CisJdTMyIGxlbjsKKwlpbnQgaSwgY2FjaGVkID0gMDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbm93OworCXN0cnVjdCBnaGVzX2VzdGF0dXNfY2FjaGUgKmNhY2hlOworCXN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19zdGF0dXMgKmNhY2hlX2VzdGF0dXM7CisKKwlsZW4gPSBhcGVpX2VzdGF0dXNfbGVuKGVzdGF0dXMpOworCXJjdV9yZWFkX2xvY2soKTsKKwlmb3IgKGkgPSAwOyBpIDwgR0hFU19FU1RBVFVTX0NBQ0hFU19TSVpFOyBpKyspIHsKKwkJY2FjaGUgPSByY3VfZGVyZWZlcmVuY2UoZ2hlc19lc3RhdHVzX2NhY2hlc1tpXSk7CisJCWlmIChjYWNoZSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWlmIChsZW4gIT0gY2FjaGUtPmVzdGF0dXNfbGVuKQorCQkJY29udGludWU7CisJCWNhY2hlX2VzdGF0dXMgPSBHSEVTX0VTVEFUVVNfRlJPTV9DQUNIRShjYWNoZSk7CisJCWlmIChtZW1jbXAoZXN0YXR1cywgY2FjaGVfZXN0YXR1cywgbGVuKSkKKwkJCWNvbnRpbnVlOworCQlhdG9taWNfaW5jKCZjYWNoZS0+Y291bnQpOworCQlub3cgPSBzY2hlZF9jbG9jaygpOworCQlpZiAobm93IC0gY2FjaGUtPnRpbWVfaW4gPCBHSEVTX0VTVEFUVVNfSU5fQ0FDSEVfTUFYX05TRUMpCisJCQljYWNoZWQgPSAxOworCQlicmVhazsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIGNhY2hlZDsKK30KKworc3RhdGljIHN0cnVjdCBnaGVzX2VzdGF0dXNfY2FjaGUgKmdoZXNfZXN0YXR1c19jYWNoZV9hbGxvYygKKwlzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWMgKmdlbmVyaWMsCisJc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX3N0YXR1cyAqZXN0YXR1cykKK3sKKwlpbnQgYWxsb2NlZDsKKwl1MzIgbGVuLCBjYWNoZV9sZW47CisJc3RydWN0IGdoZXNfZXN0YXR1c19jYWNoZSAqY2FjaGU7CisJc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX3N0YXR1cyAqY2FjaGVfZXN0YXR1czsKKworCWFsbG9jZWQgPSBhdG9taWNfYWRkX3JldHVybigxLCAmZ2hlc19lc3RhdHVzX2NhY2hlX2FsbG9jZWQpOworCWlmIChhbGxvY2VkID4gR0hFU19FU1RBVFVTX0NBQ0hFX0FMTE9DRURfTUFYKSB7CisJCWF0b21pY19kZWMoJmdoZXNfZXN0YXR1c19jYWNoZV9hbGxvY2VkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWxlbiA9IGFwZWlfZXN0YXR1c19sZW4oZXN0YXR1cyk7CisJY2FjaGVfbGVuID0gR0hFU19FU1RBVFVTX0NBQ0hFX0xFTihsZW4pOworCWNhY2hlID0gKHZvaWQgKilnZW5fcG9vbF9hbGxvYyhnaGVzX2VzdGF0dXNfcG9vbCwgY2FjaGVfbGVuKTsKKwlpZiAoIWNhY2hlKSB7CisJCWF0b21pY19kZWMoJmdoZXNfZXN0YXR1c19jYWNoZV9hbGxvY2VkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWNhY2hlX2VzdGF0dXMgPSBHSEVTX0VTVEFUVVNfRlJPTV9DQUNIRShjYWNoZSk7CisJbWVtY3B5KGNhY2hlX2VzdGF0dXMsIGVzdGF0dXMsIGxlbik7CisJY2FjaGUtPmVzdGF0dXNfbGVuID0gbGVuOworCWF0b21pY19zZXQoJmNhY2hlLT5jb3VudCwgMCk7CisJY2FjaGUtPmdlbmVyaWMgPSBnZW5lcmljOworCWNhY2hlLT50aW1lX2luID0gc2NoZWRfY2xvY2soKTsKKwlyZXR1cm4gY2FjaGU7Cit9CisKK3N0YXRpYyB2b2lkIGdoZXNfZXN0YXR1c19jYWNoZV9mcmVlKHN0cnVjdCBnaGVzX2VzdGF0dXNfY2FjaGUgKmNhY2hlKQoreworCXUzMiBsZW47CisKKwlsZW4gPSBhcGVpX2VzdGF0dXNfbGVuKEdIRVNfRVNUQVRVU19GUk9NX0NBQ0hFKGNhY2hlKSk7CisJbGVuID0gR0hFU19FU1RBVFVTX0NBQ0hFX0xFTihsZW4pOworCWdlbl9wb29sX2ZyZWUoZ2hlc19lc3RhdHVzX3Bvb2wsICh1bnNpZ25lZCBsb25nKWNhY2hlLCBsZW4pOworCWF0b21pY19kZWMoJmdoZXNfZXN0YXR1c19jYWNoZV9hbGxvY2VkKTsKK30KKworc3RhdGljIHZvaWQgZ2hlc19lc3RhdHVzX2NhY2hlX3JjdV9mcmVlKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgZ2hlc19lc3RhdHVzX2NhY2hlICpjYWNoZTsKKworCWNhY2hlID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBnaGVzX2VzdGF0dXNfY2FjaGUsIHJjdSk7CisJZ2hlc19lc3RhdHVzX2NhY2hlX2ZyZWUoY2FjaGUpOworfQorCitzdGF0aWMgdm9pZCBnaGVzX2VzdGF0dXNfY2FjaGVfYWRkKAorCXN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpYyAqZ2VuZXJpYywKKwlzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWNfc3RhdHVzICplc3RhdHVzKQoreworCWludCBpLCBzbG90ID0gLTEsIGNvdW50OworCXVuc2lnbmVkIGxvbmcgbG9uZyBub3csIGR1cmF0aW9uLCBwZXJpb2QsIG1heF9wZXJpb2QgPSAwOworCXN0cnVjdCBnaGVzX2VzdGF0dXNfY2FjaGUgKmNhY2hlLCAqc2xvdF9jYWNoZSA9IE5VTEwsICpuZXdfY2FjaGU7CisKKwluZXdfY2FjaGUgPSBnaGVzX2VzdGF0dXNfY2FjaGVfYWxsb2MoZ2VuZXJpYywgZXN0YXR1cyk7CisJaWYgKG5ld19jYWNoZSA9PSBOVUxMKQorCQlyZXR1cm47CisJcmN1X3JlYWRfbG9jaygpOworCW5vdyA9IHNjaGVkX2Nsb2NrKCk7CisJZm9yIChpID0gMDsgaSA8IEdIRVNfRVNUQVRVU19DQUNIRVNfU0laRTsgaSsrKSB7CisJCWNhY2hlID0gcmN1X2RlcmVmZXJlbmNlKGdoZXNfZXN0YXR1c19jYWNoZXNbaV0pOworCQlpZiAoY2FjaGUgPT0gTlVMTCkgeworCQkJc2xvdCA9IGk7CisJCQlzbG90X2NhY2hlID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWR1cmF0aW9uID0gbm93IC0gY2FjaGUtPnRpbWVfaW47CisJCWlmIChkdXJhdGlvbiA+PSBHSEVTX0VTVEFUVVNfSU5fQ0FDSEVfTUFYX05TRUMpIHsKKwkJCXNsb3QgPSBpOworCQkJc2xvdF9jYWNoZSA9IGNhY2hlOworCQkJYnJlYWs7CisJCX0KKwkJY291bnQgPSBhdG9taWNfcmVhZCgmY2FjaGUtPmNvdW50KTsKKwkJcGVyaW9kID0gZHVyYXRpb247CisJCWRvX2RpdihwZXJpb2QsIChjb3VudCArIDEpKTsKKwkJaWYgKHBlcmlvZCA+IG1heF9wZXJpb2QpIHsKKwkJCW1heF9wZXJpb2QgPSBwZXJpb2Q7CisJCQlzbG90ID0gaTsKKwkJCXNsb3RfY2FjaGUgPSBjYWNoZTsKKwkJfQorCX0KKwkvKiBuZXdfY2FjaGUgbXVzdCBiZSBwdXQgaW50byBhcnJheSBhZnRlciBpdHMgY29udGVudHMgYXJlIHdyaXR0ZW4gKi8KKwlzbXBfd21iKCk7CisJaWYgKHNsb3QgIT0gLTEgJiYgY21weGNoZyhnaGVzX2VzdGF0dXNfY2FjaGVzICsgc2xvdCwKKwkJCQkgIHNsb3RfY2FjaGUsIG5ld19jYWNoZSkgPT0gc2xvdF9jYWNoZSkgeworCQlpZiAoc2xvdF9jYWNoZSkKKwkJCWNhbGxfcmN1KCZzbG90X2NhY2hlLT5yY3UsIGdoZXNfZXN0YXR1c19jYWNoZV9yY3VfZnJlZSk7CisJfSBlbHNlCisJCWdoZXNfZXN0YXR1c19jYWNoZV9mcmVlKG5ld19jYWNoZSk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKIHN0YXRpYyBpbnQgZ2hlc19wcm9jKHN0cnVjdCBnaGVzICpnaGVzKQpAQCAtMzg3LDkgKzY0OCwxMSBAQAogCXJjID0gZ2hlc19yZWFkX2VzdGF0dXMoZ2hlcywgMCk7CiAJaWYgKHJjKQogCQlnb3RvIG91dDsKLQlnaGVzX3ByaW50X2VzdGF0dXMoTlVMTCwgZ2hlcyk7Ci0JZ2hlc19kb19wcm9jKGdoZXMpOwotCisJaWYgKCFnaGVzX2VzdGF0dXNfY2FjaGVkKGdoZXMtPmVzdGF0dXMpKSB7CisJCWlmIChnaGVzX3ByaW50X2VzdGF0dXMoTlVMTCwgZ2hlcy0+Z2VuZXJpYywgZ2hlcy0+ZXN0YXR1cykpCisJCQlnaGVzX2VzdGF0dXNfY2FjaGVfYWRkKGdoZXMtPmdlbmVyaWMsIGdoZXMtPmVzdGF0dXMpOworCX0KKwlnaGVzX2RvX3Byb2MoZ2hlcy0+ZXN0YXR1cyk7CiBvdXQ6CiAJZ2hlc19jbGVhcl9lc3RhdHVzKGdoZXMpOwogCXJldHVybiAwOwpAQCAtNDQ3LDYgKzcxMCw0NSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIGdoZXNfcHJvY19pbl9pcnEoc3RydWN0IGlycV93b3JrICppcnFfd29yaykKK3sKKwlzdHJ1Y3QgbGxpc3Rfbm9kZSAqbGxub2RlLCAqbmV4dCwgKnRhaWwgPSBOVUxMOworCXN0cnVjdCBnaGVzX2VzdGF0dXNfbm9kZSAqZXN0YXR1c19ub2RlOworCXN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpYyAqZ2VuZXJpYzsKKwlzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWNfc3RhdHVzICplc3RhdHVzOworCXUzMiBsZW4sIG5vZGVfbGVuOworCisJLyoKKwkgKiBCZWNhdXNlIHRoZSB0aW1lIG9yZGVyIG9mIGVzdGF0dXMgaW4gbGlzdCBpcyByZXZlcnNlZCwKKwkgKiByZXZlcnQgaXQgYmFjayB0byBwcm9wZXIgb3JkZXIuCisJICovCisJbGxub2RlID0gbGxpc3RfZGVsX2FsbCgmZ2hlc19lc3RhdHVzX2xsaXN0KTsKKwl3aGlsZSAobGxub2RlKSB7CisJCW5leHQgPSBsbG5vZGUtPm5leHQ7CisJCWxsbm9kZS0+bmV4dCA9IHRhaWw7CisJCXRhaWwgPSBsbG5vZGU7CisJCWxsbm9kZSA9IG5leHQ7CisJfQorCWxsbm9kZSA9IHRhaWw7CisJd2hpbGUgKGxsbm9kZSkgeworCQluZXh0ID0gbGxub2RlLT5uZXh0OworCQllc3RhdHVzX25vZGUgPSBsbGlzdF9lbnRyeShsbG5vZGUsIHN0cnVjdCBnaGVzX2VzdGF0dXNfbm9kZSwKKwkJCQkJICAgbGxub2RlKTsKKwkJZXN0YXR1cyA9IEdIRVNfRVNUQVRVU19GUk9NX05PREUoZXN0YXR1c19ub2RlKTsKKwkJbGVuID0gYXBlaV9lc3RhdHVzX2xlbihlc3RhdHVzKTsKKwkJbm9kZV9sZW4gPSBHSEVTX0VTVEFUVVNfTk9ERV9MRU4obGVuKTsKKwkJZ2hlc19kb19wcm9jKGVzdGF0dXMpOworCQlpZiAoIWdoZXNfZXN0YXR1c19jYWNoZWQoZXN0YXR1cykpIHsKKwkJCWdlbmVyaWMgPSBlc3RhdHVzX25vZGUtPmdlbmVyaWM7CisJCQlpZiAoZ2hlc19wcmludF9lc3RhdHVzKE5VTEwsIGdlbmVyaWMsIGVzdGF0dXMpKQorCQkJCWdoZXNfZXN0YXR1c19jYWNoZV9hZGQoZ2VuZXJpYywgZXN0YXR1cyk7CisJCX0KKwkJZ2VuX3Bvb2xfZnJlZShnaGVzX2VzdGF0dXNfcG9vbCwgKHVuc2lnbmVkIGxvbmcpZXN0YXR1c19ub2RlLAorCQkJICAgICAgbm9kZV9sZW4pOworCQlsbG5vZGUgPSBuZXh0OworCX0KK30KKwogc3RhdGljIGludCBnaGVzX25vdGlmeV9ubWkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAogCQkJCSAgdW5zaWduZWQgbG9uZyBjbWQsIHZvaWQgKmRhdGEpCiB7CkBAIC00NzYsNyArNzc4LDggQEAKIAogCWlmIChzZXZfZ2xvYmFsID49IEdIRVNfU0VWX1BBTklDKSB7CiAJCW9vcHNfYmVnaW4oKTsKLQkJZ2hlc19wcmludF9lc3RhdHVzKEtFUk5fRU1FUkcgSFdfRVJSLCBnaGVzX2dsb2JhbCk7CisJCV9fZ2hlc19wcmludF9lc3RhdHVzKEtFUk5fRU1FUkcgSFdfRVJSLCBnaGVzX2dsb2JhbC0+Z2VuZXJpYywKKwkJCQkgICAgIGdoZXNfZ2xvYmFsLT5lc3RhdHVzKTsKIAkJLyogcmVib290IHRvIGxvZyB0aGUgZXJyb3IhICovCiAJCWlmIChwYW5pY190aW1lb3V0ID09IDApCiAJCQlwYW5pY190aW1lb3V0ID0gZ2hlc19wYW5pY190aW1lb3V0OwpAQCAtNDg0LDEyICs3ODcsMzQgQEAKIAl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShnaGVzLCAmZ2hlc19ubWksIGxpc3QpIHsKKyNpZmRlZiBDT05GSUdfQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKKwkJdTMyIGxlbiwgbm9kZV9sZW47CisJCXN0cnVjdCBnaGVzX2VzdGF0dXNfbm9kZSAqZXN0YXR1c19ub2RlOworCQlzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWNfc3RhdHVzICplc3RhdHVzOworI2VuZGlmCiAJCWlmICghKGdoZXMtPmZsYWdzICYgR0hFU19UT19DTEVBUikpCiAJCQljb250aW51ZTsKLQkJLyogRG8gbm90IHByaW50IGVzdGF0dXMgYmVjYXVzZSBwcmludGsgaXMgbm90IE5NSSBzYWZlICovCi0JCWdoZXNfZG9fcHJvYyhnaGVzKTsKKyNpZmRlZiBDT05GSUdfQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKKwkJaWYgKGdoZXNfZXN0YXR1c19jYWNoZWQoZ2hlcy0+ZXN0YXR1cykpCisJCQlnb3RvIG5leHQ7CisJCS8qIFNhdmUgZXN0YXR1cyBmb3IgZnVydGhlciBwcm9jZXNzaW5nIGluIElSUSBjb250ZXh0ICovCisJCWxlbiA9IGFwZWlfZXN0YXR1c19sZW4oZ2hlcy0+ZXN0YXR1cyk7CisJCW5vZGVfbGVuID0gR0hFU19FU1RBVFVTX05PREVfTEVOKGxlbik7CisJCWVzdGF0dXNfbm9kZSA9ICh2b2lkICopZ2VuX3Bvb2xfYWxsb2MoZ2hlc19lc3RhdHVzX3Bvb2wsCisJCQkJCQkgICAgICBub2RlX2xlbik7CisJCWlmIChlc3RhdHVzX25vZGUpIHsKKwkJCWVzdGF0dXNfbm9kZS0+Z2VuZXJpYyA9IGdoZXMtPmdlbmVyaWM7CisJCQllc3RhdHVzID0gR0hFU19FU1RBVFVTX0ZST01fTk9ERShlc3RhdHVzX25vZGUpOworCQkJbWVtY3B5KGVzdGF0dXMsIGdoZXMtPmVzdGF0dXMsIGxlbik7CisJCQlsbGlzdF9hZGQoJmVzdGF0dXNfbm9kZS0+bGxub2RlLCAmZ2hlc19lc3RhdHVzX2xsaXN0KTsKKwkJfQorbmV4dDoKKyNlbmRpZgogCQlnaGVzX2NsZWFyX2VzdGF0dXMoZ2hlcyk7CiAJfQorI2lmZGVmIENPTkZJR19BUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRworCWlycV93b3JrX3F1ZXVlKCZnaGVzX3Byb2NfaXJxX3dvcmspOworI2VuZGlmCiAKIG91dDoKIAlyYXdfc3Bpbl91bmxvY2soJmdoZXNfbm1pX2xvY2spOwpAQCAtNTA0LDEwICs4MjksMjYgQEAKIAkubm90aWZpZXJfY2FsbCA9IGdoZXNfbm90aWZ5X25taSwKIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdoZXNfZXNvdXJjZV9wcmVhbGxvY19zaXplKAorCWNvbnN0IHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpYyAqZ2VuZXJpYykKK3sKKwl1bnNpZ25lZCBsb25nIGJsb2NrX2xlbmd0aCwgcHJlYWxsb2NfcmVjb3JkcywgcHJlYWxsb2Nfc2l6ZTsKKworCWJsb2NrX2xlbmd0aCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGdlbmVyaWMtPmVycm9yX2Jsb2NrX2xlbmd0aCwKKwkJCSAgICAgR0hFU19FU1RBVFVTX01BWF9TSVpFKTsKKwlwcmVhbGxvY19yZWNvcmRzID0gbWF4X3QodW5zaWduZWQgbG9uZywKKwkJCQkgZ2VuZXJpYy0+cmVjb3Jkc190b19wcmVhbGxvY2F0ZSwgMSk7CisJcHJlYWxsb2Nfc2l6ZSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGJsb2NrX2xlbmd0aCAqIHByZWFsbG9jX3JlY29yZHMsCisJCQkgICAgICBHSEVTX0VTT1VSQ0VfUFJFQUxMT0NfTUFYX1NJWkUpOworCisJcmV0dXJuIHByZWFsbG9jX3NpemU7Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGdoZXNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZ2hlc19kZXYpCiB7CiAJc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljICpnZW5lcmljOwogCXN0cnVjdCBnaGVzICpnaGVzID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGxlbjsKIAlpbnQgcmMgPSAtRUlOVkFMOwogCiAJZ2VuZXJpYyA9ICooc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljICoqKWdoZXNfZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKQEAgLTU3Myw2ICs5MTQsOCBAQAogCQltdXRleF91bmxvY2soJmdoZXNfbGlzdF9tdXRleCk7CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9IRVNUX05PVElGWV9OTUk6CisJCWxlbiA9IGdoZXNfZXNvdXJjZV9wcmVhbGxvY19zaXplKGdlbmVyaWMpOworCQlnaGVzX2VzdGF0dXNfcG9vbF9leHBhbmQobGVuKTsKIAkJbXV0ZXhfbG9jaygmZ2hlc19saXN0X211dGV4KTsKIAkJaWYgKGxpc3RfZW1wdHkoJmdoZXNfbm1pKSkKIAkJCXJlZ2lzdGVyX2RpZV9ub3RpZmllcigmZ2hlc19ub3RpZmllcl9ubWkpOwpAQCAtNTk3LDYgKzk0MCw3IEBACiB7CiAJc3RydWN0IGdoZXMgKmdoZXM7CiAJc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljICpnZW5lcmljOworCXVuc2lnbmVkIGxvbmcgbGVuOwogCiAJZ2hlcyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGdoZXNfZGV2KTsKIAlnZW5lcmljID0gZ2hlcy0+Z2VuZXJpYzsKQEAgLTYyNyw2ICs5NzEsOCBAQAogCQkgKiBmcmVlZCBhZnRlciBOTUkgaGFuZGxlciBmaW5pc2hlcy4KIAkJICovCiAJCXN5bmNocm9uaXplX3JjdSgpOworCQlsZW4gPSBnaGVzX2Vzb3VyY2VfcHJlYWxsb2Nfc2l6ZShnZW5lcmljKTsKKwkJZ2hlc19lc3RhdHVzX3Bvb2xfc2hyaW5rKGxlbik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwpAQCAtNjYyLDE1ICsxMDA4LDQzIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmIChnaGVzX2Rpc2FibGUpIHsKKwkJcHJfaW5mbyhHSEVTX1BGWCAiR0hFUyBpcyBub3QgZW5hYmxlZCFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpbml0X2lycV93b3JrKCZnaGVzX3Byb2NfaXJxX3dvcmssIGdoZXNfcHJvY19pbl9pcnEpOworCiAJcmMgPSBnaGVzX2lvcmVtYXBfaW5pdCgpOwogCWlmIChyYykKIAkJZ290byBlcnI7CiAKLQlyYyA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZ2hlc19wbGF0Zm9ybV9kcml2ZXIpOworCXJjID0gZ2hlc19lc3RhdHVzX3Bvb2xfaW5pdCgpOwogCWlmIChyYykKIAkJZ290byBlcnJfaW9yZW1hcF9leGl0OwogCisJcmMgPSBnaGVzX2VzdGF0dXNfcG9vbF9leHBhbmQoR0hFU19FU1RBVFVTX0NBQ0hFX0FWR19TSVpFICoKKwkJCQkgICAgICBHSEVTX0VTVEFUVVNfQ0FDSEVfQUxMT0NFRF9NQVgpOworCWlmIChyYykKKwkJZ290byBlcnJfcG9vbF9leGl0OworCisJcmMgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmdoZXNfcGxhdGZvcm1fZHJpdmVyKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX3Bvb2xfZXhpdDsKKworCXJjID0gYXBlaV9vc2Nfc2V0dXAoKTsKKwlpZiAocmMgPT0gMCAmJiBvc2Nfc2JfYXBlaV9zdXBwb3J0X2Fja2VkKQorCQlwcl9pbmZvKEdIRVNfUEZYICJBUEVJIGZpcm13YXJlIGZpcnN0IG1vZGUgaXMgZW5hYmxlZCBieSBBUEVJIGJpdCBhbmQgV0hFQSBfT1NDLlxuIik7CisJZWxzZSBpZiAocmMgPT0gMCAmJiAhb3NjX3NiX2FwZWlfc3VwcG9ydF9hY2tlZCkKKwkJcHJfaW5mbyhHSEVTX1BGWCAiQVBFSSBmaXJtd2FyZSBmaXJzdCBtb2RlIGlzIGVuYWJsZWQgYnkgV0hFQSBfT1NDLlxuIik7CisJZWxzZSBpZiAocmMgJiYgb3NjX3NiX2FwZWlfc3VwcG9ydF9hY2tlZCkKKwkJcHJfaW5mbyhHSEVTX1BGWCAiQVBFSSBmaXJtd2FyZSBmaXJzdCBtb2RlIGlzIGVuYWJsZWQgYnkgQVBFSSBiaXQuXG4iKTsKKwllbHNlCisJCXByX2luZm8oR0hFU19QRlggIkZhaWxlZCB0byBlbmFibGUgQVBFSSBmaXJtd2FyZSBmaXJzdCBtb2RlLlxuIik7CisKIAlyZXR1cm4gMDsKK2Vycl9wb29sX2V4aXQ6CisJZ2hlc19lc3RhdHVzX3Bvb2xfZXhpdCgpOwogZXJyX2lvcmVtYXBfZXhpdDoKIAlnaGVzX2lvcmVtYXBfZXhpdCgpOwogZXJyOgpAQCAtNjgwLDYgKzEwNTQsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IGdoZXNfZXhpdCh2b2lkKQogewogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZnaGVzX3BsYXRmb3JtX2RyaXZlcik7CisJZ2hlc19lc3RhdHVzX3Bvb2xfZXhpdCgpOwogCWdoZXNfaW9yZW1hcF9leGl0KCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hcGVpL2hlc3QuYyBiL2RyaXZlcnMvYWNwaS9hcGVpL2hlc3QuYwppbmRleCAxODFiYzJmLi4wNWZlZTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXBlaS9oZXN0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FwZWkvaGVzdC5jCkBAIC0yMzEsMTYgKzIzMSwxNyBAQAogCQlnb3RvIGVycjsKIAl9CiAKLQlyYyA9IGFwZWlfaGVzdF9wYXJzZShoZXN0X3BhcnNlX2doZXNfY291bnQsICZnaGVzX2NvdW50KTsKLQlpZiAocmMpCi0JCWdvdG8gZXJyOwotCi0JcmMgPSBoZXN0X2doZXNfZGV2X3JlZ2lzdGVyKGdoZXNfY291bnQpOwotCWlmICghcmMpIHsKLQkJcHJfaW5mbyhIRVNUX1BGWCAiVGFibGUgcGFyc2luZyBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiIpOwotCQlyZXR1cm47CisJaWYgKCFnaGVzX2Rpc2FibGUpIHsKKwkJcmMgPSBhcGVpX2hlc3RfcGFyc2UoaGVzdF9wYXJzZV9naGVzX2NvdW50LCAmZ2hlc19jb3VudCk7CisJCWlmIChyYykKKwkJCWdvdG8gZXJyOworCQlyYyA9IGhlc3RfZ2hlc19kZXZfcmVnaXN0ZXIoZ2hlc19jb3VudCk7CisJCWlmIChyYykKKwkJCWdvdG8gZXJyOwogCX0KIAorCXByX2luZm8oSEVTVF9QRlggIlRhYmxlIHBhcnNpbmcgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4iKTsKKwlyZXR1cm47CiBlcnI6CiAJaGVzdF9kaXNhYmxlID0gMTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMgYi9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCmluZGV4IDJjNjYxMzUuLjg3YzBhOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9hY3BpL2JhdHRlcnkuYwpAQCAtNTUsNiArNTUsOSBAQAogI2RlZmluZSBBQ1BJX0JBVFRFUllfTk9USUZZX0lORk8JMHg4MQogI2RlZmluZSBBQ1BJX0JBVFRFUllfTk9USUZZX1RIUkVTSE9MRCAgIDB4ODIKIAorLyogQmF0dGVyeSBwb3dlciB1bml0OiAwIG1lYW5zIG1XLCAxIG1lYW5zIG1BICovCisjZGVmaW5lIEFDUElfQkFUVEVSWV9QT1dFUl9VTklUX01BCTEKKwogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX0JBVFRFUllfQ09NUE9ORU5UCiAKIEFDUElfTU9EVUxFX05BTUUoImJhdHRlcnkiKTsKQEAgLTkxLDExICs5NCw2IEBACiBlbnVtIHsKIAlBQ1BJX0JBVFRFUllfQUxBUk1fUFJFU0VOVCwKIAlBQ1BJX0JBVFRFUllfWElORk9fUFJFU0VOVCwKLQkvKiBGb3IgYnVnZ3kgRFNEVHMgdGhhdCByZXBvcnQgbmVnYXRpdmUgMTYtYml0IHZhbHVlcyBmb3IgZWl0aGVyCi0JICogY2hhcmdpbmcgb3IgZGlzY2hhcmdpbmcgY3VycmVudCBhbmQvb3IgcmVwb3J0IDAgYXMgNjU1MzYKLQkgKiBkdWUgdG8gYmFkIG1hdGguCi0JICovCi0JQUNQSV9CQVRURVJZX1FVSVJLX1NJR05FRDE2X0NVUlJFTlQsCiAJQUNQSV9CQVRURVJZX1FVSVJLX1BFUkNFTlRBR0VfQ0FQQUNJVFksCiB9OwogCkBAIC0zMDEsNyArMjk5LDggQEAKICNpZmRlZiBDT05GSUdfQUNQSV9QUk9DRlNfUE9XRVIKIGlubGluZSBjaGFyICphY3BpX2JhdHRlcnlfdW5pdHMoc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSkKIHsKLQlyZXR1cm4gKGJhdHRlcnktPnBvd2VyX3VuaXQpPyJtQSI6Im1XIjsKKwlyZXR1cm4gKGJhdHRlcnktPnBvd2VyX3VuaXQgPT0gQUNQSV9CQVRURVJZX1BPV0VSX1VOSVRfTUEpID8KKwkJIm1BIiA6ICJtVyI7CiB9CiAjZW5kaWYKIApAQCAtNDYxLDkgKzQ2MCwxNyBAQAogCWJhdHRlcnktPnVwZGF0ZV90aW1lID0gamlmZmllczsKIAlrZnJlZShidWZmZXIucG9pbnRlcik7CiAKLQlpZiAodGVzdF9iaXQoQUNQSV9CQVRURVJZX1FVSVJLX1NJR05FRDE2X0NVUlJFTlQsICZiYXR0ZXJ5LT5mbGFncykgJiYKLQkgICAgYmF0dGVyeS0+cmF0ZV9ub3cgIT0gLTEpCisJLyogRm9yIGJ1Z2d5IERTRFRzIHRoYXQgcmVwb3J0IG5lZ2F0aXZlIDE2LWJpdCB2YWx1ZXMgZm9yIGVpdGhlcgorCSAqIGNoYXJnaW5nIG9yIGRpc2NoYXJnaW5nIGN1cnJlbnQgYW5kL29yIHJlcG9ydCAwIGFzIDY1NTM2CisJICogZHVlIHRvIGJhZCBtYXRoLgorCSAqLworCWlmIChiYXR0ZXJ5LT5wb3dlcl91bml0ID09IEFDUElfQkFUVEVSWV9QT1dFUl9VTklUX01BICYmCisJCWJhdHRlcnktPnJhdGVfbm93ICE9IEFDUElfQkFUVEVSWV9WQUxVRV9VTktOT1dOICYmCisJCShzMTYpKGJhdHRlcnktPnJhdGVfbm93KSA8IDApIHsKIAkJYmF0dGVyeS0+cmF0ZV9ub3cgPSBhYnMoKHMxNiliYXR0ZXJ5LT5yYXRlX25vdyk7CisJCXByaW50a19vbmNlKEtFUk5fV0FSTklORyBGV19CVUcgImJhdHRlcnk6IChkaXMpY2hhcmdlIHJhdGUiCisJCQkiIGludmFsaWQuXG4iKTsKKwl9CiAKIAlpZiAodGVzdF9iaXQoQUNQSV9CQVRURVJZX1FVSVJLX1BFUkNFTlRBR0VfQ0FQQUNJVFksICZiYXR0ZXJ5LT5mbGFncykKIAkgICAgJiYgYmF0dGVyeS0+Y2FwYWNpdHlfbm93ID49IDAgJiYgYmF0dGVyeS0+Y2FwYWNpdHlfbm93IDw9IDEwMCkKQEAgLTU0NCw3ICs1NTEsNyBAQAogewogCWludCByZXN1bHQ7CiAKLQlpZiAoYmF0dGVyeS0+cG93ZXJfdW5pdCkgeworCWlmIChiYXR0ZXJ5LT5wb3dlcl91bml0ID09IEFDUElfQkFUVEVSWV9QT1dFUl9VTklUX01BKSB7CiAJCWJhdHRlcnktPmJhdC5wcm9wZXJ0aWVzID0gY2hhcmdlX2JhdHRlcnlfcHJvcHM7CiAJCWJhdHRlcnktPmJhdC5udW1fcHJvcGVydGllcyA9CiAJCQlBUlJBWV9TSVpFKGNoYXJnZV9iYXR0ZXJ5X3Byb3BzKTsKQEAgLTU2NiwxOCArNTczLDE2IEBACiAKIHN0YXRpYyB2b2lkIHN5c2ZzX3JlbW92ZV9iYXR0ZXJ5KHN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnkpCiB7Ci0JaWYgKCFiYXR0ZXJ5LT5iYXQuZGV2KQorCW11dGV4X2xvY2soJmJhdHRlcnktPmxvY2spOworCWlmICghYmF0dGVyeS0+YmF0LmRldikgeworCQltdXRleF91bmxvY2soJmJhdHRlcnktPmxvY2spOwogCQlyZXR1cm47CisJfQorCiAJZGV2aWNlX3JlbW92ZV9maWxlKGJhdHRlcnktPmJhdC5kZXYsICZhbGFybV9hdHRyKTsKIAlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmYmF0dGVyeS0+YmF0KTsKIAliYXR0ZXJ5LT5iYXQuZGV2ID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgYWNwaV9iYXR0ZXJ5X3F1aXJrcyhzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5KQotewotCWlmIChkbWlfbmFtZV9pbl92ZW5kb3JzKCJBY2VyIikgJiYgYmF0dGVyeS0+cG93ZXJfdW5pdCkgewotCQlzZXRfYml0KEFDUElfQkFUVEVSWV9RVUlSS19TSUdORUQxNl9DVVJSRU5ULCAmYmF0dGVyeS0+ZmxhZ3MpOwotCX0KKwltdXRleF91bmxvY2soJmJhdHRlcnktPmxvY2spOwogfQogCiAvKgpAQCAtNTkyLDcgKzU5Nyw3IEBACiAgKgogICogSGFuZGxlIHRoaXMgY29ycmVjdGx5IHNvIHRoYXQgdGhleSB3b24ndCBicmVhayB1c2Vyc3BhY2UuCiAgKi8KLXN0YXRpYyB2b2lkIGFjcGlfYmF0dGVyeV9xdWlya3MyKHN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnkpCitzdGF0aWMgdm9pZCBhY3BpX2JhdHRlcnlfcXVpcmtzKHN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnkpCiB7CiAJaWYgKHRlc3RfYml0KEFDUElfQkFUVEVSWV9RVUlSS19QRVJDRU5UQUdFX0NBUEFDSVRZLCAmYmF0dGVyeS0+ZmxhZ3MpKQogCQlyZXR1cm4gOwpAQCAtNjIzLDEzICs2MjgsMTUgQEAKIAkJcmVzdWx0ID0gYWNwaV9iYXR0ZXJ5X2dldF9pbmZvKGJhdHRlcnkpOwogCQlpZiAocmVzdWx0KQogCQkJcmV0dXJuIHJlc3VsdDsKLQkJYWNwaV9iYXR0ZXJ5X3F1aXJrcyhiYXR0ZXJ5KTsKIAkJYWNwaV9iYXR0ZXJ5X2luaXRfYWxhcm0oYmF0dGVyeSk7CiAJfQotCWlmICghYmF0dGVyeS0+YmF0LmRldikKLQkJc3lzZnNfYWRkX2JhdHRlcnkoYmF0dGVyeSk7CisJaWYgKCFiYXR0ZXJ5LT5iYXQuZGV2KSB7CisJCXJlc3VsdCA9IHN5c2ZzX2FkZF9iYXR0ZXJ5KGJhdHRlcnkpOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKwl9CiAJcmVzdWx0ID0gYWNwaV9iYXR0ZXJ5X2dldF9zdGF0ZShiYXR0ZXJ5KTsKLQlhY3BpX2JhdHRlcnlfcXVpcmtzMihiYXR0ZXJ5KTsKKwlhY3BpX2JhdHRlcnlfcXVpcmtzKGJhdHRlcnkpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTg2Myw3ICs4NzAsNyBAQAogCQl9LCBcCiAJfQogCi1zdGF0aWMgc3RydWN0IGJhdHRlcnlfZmlsZSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGJhdHRlcnlfZmlsZSB7CiAJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvcHM7CiAJbW9kZV90IG1vZGU7CiAJY29uc3QgY2hhciAqbmFtZTsKQEAgLTk0OCw5ICs5NTUsMTIgQEAKIAlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5ID0gY29udGFpbmVyX29mKG5iLCBzdHJ1Y3QgYWNwaV9iYXR0ZXJ5LAogCQkJCQkJICAgIHBtX25iKTsKIAlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIFBNX1BPU1RfSElCRVJOQVRJT046CiAJY2FzZSBQTV9QT1NUX1NVU1BFTkQ6Ci0JCXN5c2ZzX3JlbW92ZV9iYXR0ZXJ5KGJhdHRlcnkpOwotCQlzeXNmc19hZGRfYmF0dGVyeShiYXR0ZXJ5KTsKKwkJaWYgKGJhdHRlcnktPmJhdC5kZXYpIHsKKwkJCXN5c2ZzX3JlbW92ZV9iYXR0ZXJ5KGJhdHRlcnkpOworCQkJc3lzZnNfYWRkX2JhdHRlcnkoYmF0dGVyeSk7CisJCX0KIAkJYnJlYWs7CiAJfQogCkBAIC05NzUsMjUgKzk4NSwzMyBAQAogCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKGJhdHRlcnktPmRldmljZS0+aGFuZGxlLAogCQkJIl9CSVgiLCAmaGFuZGxlKSkpCiAJCXNldF9iaXQoQUNQSV9CQVRURVJZX1hJTkZPX1BSRVNFTlQsICZiYXR0ZXJ5LT5mbGFncyk7Ci0JYWNwaV9iYXR0ZXJ5X3VwZGF0ZShiYXR0ZXJ5KTsKKwlyZXN1bHQgPSBhY3BpX2JhdHRlcnlfdXBkYXRlKGJhdHRlcnkpOworCWlmIChyZXN1bHQpCisJCWdvdG8gZmFpbDsKICNpZmRlZiBDT05GSUdfQUNQSV9QUk9DRlNfUE9XRVIKIAlyZXN1bHQgPSBhY3BpX2JhdHRlcnlfYWRkX2ZzKGRldmljZSk7CiAjZW5kaWYKLQlpZiAoIXJlc3VsdCkgewotCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgU2xvdCBbJXNdIChiYXR0ZXJ5ICVzKVxuIiwKLQkJCUFDUElfQkFUVEVSWV9ERVZJQ0VfTkFNRSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCi0JCQlkZXZpY2UtPnN0YXR1cy5iYXR0ZXJ5X3ByZXNlbnQgPyAicHJlc2VudCIgOiAiYWJzZW50Iik7Ci0JfSBlbHNlIHsKKwlpZiAocmVzdWx0KSB7CiAjaWZkZWYgQ09ORklHX0FDUElfUFJPQ0ZTX1BPV0VSCiAJCWFjcGlfYmF0dGVyeV9yZW1vdmVfZnMoZGV2aWNlKTsKICNlbmRpZgotCQlrZnJlZShiYXR0ZXJ5KTsKKwkJZ290byBmYWlsOwogCX0KIAorCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBTbG90IFslc10gKGJhdHRlcnkgJXMpXG4iLAorCQlBQ1BJX0JBVFRFUllfREVWSUNFX05BTUUsIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAorCQlkZXZpY2UtPnN0YXR1cy5iYXR0ZXJ5X3ByZXNlbnQgPyAicHJlc2VudCIgOiAiYWJzZW50Iik7CisKIAliYXR0ZXJ5LT5wbV9uYi5ub3RpZmllcl9jYWxsID0gYmF0dGVyeV9ub3RpZnk7CiAJcmVnaXN0ZXJfcG1fbm90aWZpZXIoJmJhdHRlcnktPnBtX25iKTsKIAogCXJldHVybiByZXN1bHQ7CisKK2ZhaWw6CisJc3lzZnNfcmVtb3ZlX2JhdHRlcnkoYmF0dGVyeSk7CisJbXV0ZXhfZGVzdHJveSgmYmF0dGVyeS0+bG9jayk7CisJa2ZyZWUoYmF0dGVyeSk7CisJcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGludCBhY3BpX2JhdHRlcnlfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9idXMuYyBiL2RyaXZlcnMvYWNwaS9idXMuYwppbmRleCBkMWUwNmMxLi40MzdkZGJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYnVzLmMKKysrIGIvZHJpdmVycy9hY3BpL2J1cy5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CisjaW5jbHVkZSA8YWNwaS9hcGVpLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogCkBAIC01MTksNiArNTIwLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woYWNwaV9ydW5fb3NjKTsKIAorYm9vbCBvc2Nfc2JfYXBlaV9zdXBwb3J0X2Fja2VkOwogc3RhdGljIHU4IHNiX3V1aWRfc3RyW10gPSAiMDgxMUIwNkUtNEEyNy00NEY5LThENjAtM0NCQkMyMkU3QjQ4IjsKIHN0YXRpYyB2b2lkIGFjcGlfYnVzX29zY19zdXBwb3J0KHZvaWQpCiB7CkBAIC01NDEsMTEgKzU0MywxOSBAQAogI2lmIGRlZmluZWQoQ09ORklHX0FDUElfUFJPQ0VTU09SKSB8fCBkZWZpbmVkKENPTkZJR19BQ1BJX1BST0NFU1NPUl9NT0RVTEUpCiAJY2FwYnVmW09TQ19TVVBQT1JUX1RZUEVdIHw9IE9TQ19TQl9QUENfT1NUX1NVUFBPUlQ7CiAjZW5kaWYKKworCWlmICghZ2hlc19kaXNhYmxlKQorCQljYXBidWZbT1NDX1NVUFBPUlRfVFlQRV0gfD0gT1NDX1NCX0FQRUlfU1VQUE9SVDsKIAlpZiAoQUNQSV9GQUlMVVJFKGFjcGlfZ2V0X2hhbmRsZShOVUxMLCAiXFxfU0IiLCAmaGFuZGxlKSkpCiAJCXJldHVybjsKLQlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfcnVuX29zYyhoYW5kbGUsICZjb250ZXh0KSkpCisJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX3J1bl9vc2MoaGFuZGxlLCAmY29udGV4dCkpKSB7CisJCXUzMiAqY2FwYnVmX3JldCA9IGNvbnRleHQucmV0LnBvaW50ZXI7CisJCWlmIChjb250ZXh0LnJldC5sZW5ndGggPiBPU0NfU1VQUE9SVF9UWVBFKQorCQkJb3NjX3NiX2FwZWlfc3VwcG9ydF9hY2tlZCA9CisJCQkJY2FwYnVmX3JldFtPU0NfU1VQUE9SVF9UWVBFXSAmIE9TQ19TQl9BUEVJX1NVUFBPUlQ7CiAJCWtmcmVlKGNvbnRleHQucmV0LnBvaW50ZXIpOwotCS8qIGRvIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHJldHVybmVkIGNhcD8gU291bmRzIG5vICovCisJfQorCS8qIGRvIHdlIG5lZWQgdG8gY2hlY2sgb3RoZXIgcmV0dXJuZWQgY2FwPyBTb3VuZHMgbm8gKi8KIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kb2NrLmMgYi9kcml2ZXJzL2FjcGkvZG9jay5jCmluZGV4IDE4NjRhZDMuLjE5YTYxMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kb2NrLmMKKysrIGIvZHJpdmVycy9hY3BpL2RvY2suYwpAQCAtNzcsNyArNzcsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGhvdHBsdWdfbGlzdDsKIAlhY3BpX2hhbmRsZSBoYW5kbGU7Ci0Jc3RydWN0IGFjcGlfZG9ja19vcHMgKm9wczsKKwljb25zdCBzdHJ1Y3QgYWNwaV9kb2NrX29wcyAqb3BzOwogCXZvaWQgKmNvbnRleHQ7CiB9OwogCkBAIC01ODksNyArNTg5LDcgQEAKICAqIHRoZSBkb2NrIGRyaXZlciBhZnRlciBfRENLIGlzIGV4ZWN1dGVkLgogICovCiBpbnQKLXJlZ2lzdGVyX2hvdHBsdWdfZG9ja19kZXZpY2UoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9kb2NrX29wcyAqb3BzLAorcmVnaXN0ZXJfaG90cGx1Z19kb2NrX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUsIGNvbnN0IHN0cnVjdCBhY3BpX2RvY2tfb3BzICpvcHMsCiAJCQkgICAgIHZvaWQgKmNvbnRleHQpCiB7CiAJc3RydWN0IGRvY2tfZGVwZW5kZW50X2RldmljZSAqZGQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZWNfc3lzLmMgYi9kcml2ZXJzL2FjcGkvZWNfc3lzLmMKaW5kZXggMDViNDQyMC4uMjJmOTE4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2VjX3N5cy5jCisrKyBiL2RyaXZlcnMvYWNwaS9lY19zeXMuYwpAQCAtOTIsNyArOTIsNyBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9lY19pb19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX2VjX2lvX29wcyA9IHsKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkub3BlbiAgPSBhY3BpX2VjX29wZW5faW8sCiAJLnJlYWQgID0gYWNwaV9lY19yZWFkX2lvLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Zhbi5jIGIvZHJpdmVycy9hY3BpL2Zhbi5jCmluZGV4IDQ2NzQ3OWYuLjBmMDM1NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9mYW4uYworKysgYi9kcml2ZXJzL2FjcGkvZmFuLmMKQEAgLTExMCw3ICsxMTAsNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZV9vcHMgZmFuX2Nvb2xpbmdfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX29wcyBmYW5fY29vbGluZ19vcHMgPSB7CiAJLmdldF9tYXhfc3RhdGUgPSBmYW5fZ2V0X21heF9zdGF0ZSwKIAkuZ2V0X2N1cl9zdGF0ZSA9IGZhbl9nZXRfY3VyX3N0YXRlLAogCS5zZXRfY3VyX3N0YXRlID0gZmFuX3NldF9jdXJfc3RhdGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvb3NsLmMgYi9kcml2ZXJzL2FjcGkvb3NsLmMKaW5kZXggMzcyZjliNy4uZmEzMmY1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL29zbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9vc2wuYwpAQCAtMTU1LDcgKzE1NSw3IEBACiB7CiAJaWYgKCFzdHJjbXAoIkxpbnV4IiwgaW50ZXJmYWNlKSkgewogCi0JCXByaW50ayhLRVJOX05PVElDRSBGV19CVUcgUFJFRklYCisJCXByaW50a19vbmNlKEtFUk5fTk9USUNFIEZXX0JVRyBQUkVGSVgKIAkJCSJCSU9TIF9PU0koTGludXgpIHF1ZXJ5ICVzJXNcbiIsCiAJCQlvc2lfbGludXguZW5hYmxlID8gImhvbm9yZWQiIDogImlnbm9yZWQiLAogCQkJb3NpX2xpbnV4LmNtZGxpbmUgPyAiIHZpYSBjbWRsaW5lIiA6CkBAIC0yMzcsOCArMjM3LDIzIEBACiAjZW5kaWYKIH0KIAorI2lmZGVmIENPTkZJR19LRVhFQworc3RhdGljIHVuc2lnbmVkIGxvbmcgYWNwaV9yc2RwOworc3RhdGljIGludCBfX2luaXQgc2V0dXBfYWNwaV9yc2RwKGNoYXIgKmFyZykKK3sKKwlhY3BpX3JzZHAgPSBzaW1wbGVfc3RydG91bChhcmcsIE5VTEwsIDE2KTsKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJhY3BpX3JzZHAiLCBzZXR1cF9hY3BpX3JzZHApOworI2VuZGlmCisKIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBfX2luaXQgYWNwaV9vc19nZXRfcm9vdF9wb2ludGVyKHZvaWQpCiB7CisjaWZkZWYgQ09ORklHX0tFWEVDCisJaWYgKGFjcGlfcnNkcCkKKwkJcmV0dXJuIGFjcGlfcnNkcDsKKyNlbmRpZgorCiAJaWYgKGVmaV9lbmFibGVkKSB7CiAJCWlmIChlZmkuYWNwaTIwICE9IEVGSV9JTlZBTElEX1RBQkxFX0FERFIpCiAJCQlyZXR1cm4gZWZpLmFjcGkyMDsKQEAgLTEwODMsNyArMTA5OCwxMyBAQAogCWJvb2wgZW5hYmxlOwogfTsKIAotc3RhdGljIHN0cnVjdCBvc2lfc2V0dXBfZW50cnkgX19pbml0ZGF0YSBvc2lfc2V0dXBfZW50cmllc1tPU0lfU1RSSU5HX0VOVFJJRVNfTUFYXTsKK3N0YXRpYyBzdHJ1Y3Qgb3NpX3NldHVwX2VudHJ5IF9faW5pdGRhdGEKKwkJb3NpX3NldHVwX2VudHJpZXNbT1NJX1NUUklOR19FTlRSSUVTX01BWF0gPSB7CisJeyJNb2R1bGUgRGV2aWNlIiwgdHJ1ZX0sCisJeyJQcm9jZXNzb3IgRGV2aWNlIiwgdHJ1ZX0sCisJeyIzLjAgX1NDUCBFeHRlbnNpb25zIiwgdHJ1ZX0sCisJeyJQcm9jZXNzb3IgQWdncmVnYXRvciBEZXZpY2UiLCB0cnVlfSwKK307CiAKIHZvaWQgX19pbml0IGFjcGlfb3NpX3NldHVwKGNoYXIgKnN0cikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMgYi9kcml2ZXJzL2FjcGkvcGNpX2lycS5jCmluZGV4IGY5MDdjZmIuLjdmOWViYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9pcnEuYwpAQCAtMzAzLDYgKzMwMyw2MSBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJIEludGVycnVwdCBSb3V0aW5nIFN1cHBvcnQKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCitleHRlcm4gaW50IG5vaW9hcGljcXVpcms7CitleHRlcm4gaW50IG5vaW9hcGljcmVyb3V0ZTsKKworc3RhdGljIGludCBicmlkZ2VfaGFzX2Jvb3RfaW50ZXJydXB0X3ZhcmlhbnQoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzX2l0OworCisJZm9yIChidXNfaXQgPSBidXMgOyBidXNfaXQgOyBidXNfaXQgPSBidXNfaXQtPnBhcmVudCkgeworCQlpZiAoIWJ1c19pdC0+c2VsZikKKwkJCXJldHVybiAwOworCQlpZiAoYnVzX2l0LT5zZWxmLT5pcnFfcmVyb3V0ZV92YXJpYW50KQorCQkJcmV0dXJuIGJ1c19pdC0+c2VsZi0+aXJxX3Jlcm91dGVfdmFyaWFudDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTb21lIGNoaXBzZXRzIChlLmcuIEludGVsIDY3MDBQWEgpIGdlbmVyYXRlIGEgbGVnYWN5IElOVHggd2hlbiB0aGUgSVJRCisgKiBlbnRyeSBpbiB0aGUgY2hpcHNldCdzIElPLUFQSUMgaXMgbWFza2VkIChhcywgZS5nLiB0aGUgUlQga2VybmVsIGRvZXMKKyAqIGR1cmluZyBpbnRlcnJ1cHQgaGFuZGxpbmcpLiBXaGVuIHRoaXMgSU5UeCBnZW5lcmF0aW9uIGNhbm5vdCBiZSBkaXNhYmxlZCwKKyAqIHdlIHJlcm91dGUgdGhlc2UgaW50ZXJydXB0cyB0byB0aGVpciBsZWdhY3kgZXF1aXZhbGVudCB0byBnZXQgcmlkIG9mCisgKiBzcHVyaW91cyBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgaW50IGFjcGlfcmVyb3V0ZV9ib290X2ludGVycnVwdChzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKmVudHJ5KQoreworCWlmIChub2lvYXBpY3F1aXJrIHx8IG5vaW9hcGljcmVyb3V0ZSkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKGJyaWRnZV9oYXNfYm9vdF9pbnRlcnJ1cHRfdmFyaWFudChkZXYtPmJ1cykpIHsKKwkJY2FzZSAwOgorCQkJLyogbm8gcmVyb3V0aW5nIG5lY2Vzc2FyeSAqLworCQkJcmV0dXJuIDA7CisJCWNhc2UgSU5URUxfSVJRX1JFUk9VVEVfVkFSSUFOVDoKKwkJCS8qCisJCQkgKiBSZW1hcCBhY2NvcmRpbmcgdG8gSU5UeCByb3V0aW5nIHRhYmxlIGluIDY3MDBQWEgKKwkJCSAqIHNwZWNzLCBpbnRlbCBvcmRlciBudW1iZXIgMzAyNjI4LTAwMiwgc2VjdGlvbgorCQkJICogMi4xNS4yLiBPdGhlciBjaGlwc2V0cyAoODAzMzIsIC4uLikgaGF2ZSB0aGUgc2FtZQorCQkJICogbWFwcGluZyBhbmQgYXJlIGhhbmRsZWQgaGVyZSBhcyB3ZWxsLgorCQkJICovCisJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJQQ0kgSVJRICVkIC0+IHJlcm91dGVkIHRvIGxlZ2FjeSAiCisJCQkJICJJUlEgJWRcbiIsIGVudHJ5LT5pbmRleCwKKwkJCQkgKGVudHJ5LT5pbmRleCAlIDQpICsgMTYpOworCQkJZW50cnktPmluZGV4ID0gKGVudHJ5LT5pbmRleCAlIDQpICsgMTY7CisJCQlyZXR1cm4gMTsKKwkJZGVmYXVsdDoKKwkJCWRldl93YXJuKCZkZXYtPmRldiwgIkNhbm5vdCByZXJvdXRlIElSUSAlZCB0byBsZWdhY3kgIgorCQkJCSAiSVJROiB1bmtub3duIG1hcHBpbmdcbiIsIGVudHJ5LT5pbmRleCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogQ09ORklHX1g4Nl9JT19BUElDICovCisKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKmFjcGlfcGNpX2lycV9sb29rdXAoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpbikKIHsKIAlzdHJ1Y3QgYWNwaV9wcnRfZW50cnkgKmVudHJ5OwpAQCAtMzExLDYgKzM2Niw5IEBACiAKIAllbnRyeSA9IGFjcGlfcGNpX2lycV9maW5kX3BydF9lbnRyeShkZXYsIHBpbik7CiAJaWYgKGVudHJ5KSB7CisjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCisJCWFjcGlfcmVyb3V0ZV9ib290X2ludGVycnVwdChkZXYsIGVudHJ5KTsKKyNlbmRpZiAvKiBDT05GSUdfWDg2X0lPX0FQSUMgKi8KIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRm91bmQgJXNbJWNdIF9QUlQgZW50cnlcbiIsCiAJCQkJICBwY2lfbmFtZShkZXYpLCBwaW5fbmFtZShwaW4pKSk7CiAJCXJldHVybiBlbnRyeTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jIGIvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKaW5kZXggZDA2MDc4ZC4uMjY3MmM3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKQEAgLTQ4NSw3ICs0ODUsOCBAQAogCQlyb290LT5zZWNvbmRhcnkuZW5kID0gMHhGRjsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBGV19CVUcgUFJFRklYCiAJCSAgICAgICAibm8gc2Vjb25kYXJ5IGJ1cyByYW5nZSBpbiBfQ1JTXG4iKTsKLQkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGRldmljZS0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fQkJOLAkJCQkJICAgICAgIE5VTEwsICZidXMpOworCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZGV2aWNlLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19CQk4sCisJCQkJCSAgICAgICBOVUxMLCAmYnVzKTsKIAkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQogCQkJcm9vdC0+c2Vjb25kYXJ5LnN0YXJ0ID0gYnVzOwogCQllbHNlIGlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl90aGVybWFsLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3RoZXJtYWwuYwppbmRleCA3OWNiNjUzLi44NzA1NTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3RoZXJtYWwuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3RoZXJtYWwuYwpAQCAtMjQ0LDcgKzI0NCw3IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzIHByb2Nlc3Nvcl9jb29saW5nX29wcyA9IHsKK2NvbnN0IHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX29wcyBwcm9jZXNzb3JfY29vbGluZ19vcHMgPSB7CiAJLmdldF9tYXhfc3RhdGUgPSBwcm9jZXNzb3JfZ2V0X21heF9zdGF0ZSwKIAkuZ2V0X2N1cl9zdGF0ZSA9IHByb2Nlc3Nvcl9nZXRfY3VyX3N0YXRlLAogCS5zZXRfY3VyX3N0YXRlID0gcHJvY2Vzc29yX3NldF9jdXJfc3RhdGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2JzLmMgYi9kcml2ZXJzL2FjcGkvc2JzLmMKaW5kZXggNTA2NThmZi4uNmUzNmQwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Nicy5jCisrKyBiL2RyaXZlcnMvYWNwaS9zYnMuYwpAQCAtMTMwLDYgKzEzMCw5IEBACiAKICNkZWZpbmUgdG9fYWNwaV9zYnMoeCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBhY3BpX3NicywgY2hhcmdlcikKIAorc3RhdGljIGludCBhY3BpX3Nic19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKK3N0YXRpYyBpbnQgYWNwaV9iYXR0ZXJ5X2dldF9zdGF0ZShzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5KTsKKwogc3RhdGljIGlubGluZSBpbnQgYmF0dGVyeV9zY2FsZShpbnQgbG9nKQogewogCWludCBzY2FsZSA9IDE7CkBAIC0xOTUsNiArMTk4LDggQEAKIAogCWlmICgoIWJhdHRlcnktPnByZXNlbnQpICYmIHBzcCAhPSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UKQogCQlyZXR1cm4gLUVOT0RFVjsKKworCWFjcGlfYmF0dGVyeV9nZXRfc3RhdGUoYmF0dGVyeSk7CiAJc3dpdGNoIChwc3ApIHsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKIAkJaWYgKGJhdHRlcnktPnJhdGVfbm93IDwgMCkKQEAgLTIyNSwxMSArMjMwLDE3IEBACiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QT1dFUl9OT1c6CiAJCXZhbC0+aW50dmFsID0gYWJzKGJhdHRlcnktPnJhdGVfbm93KSAqCiAJCQkJYWNwaV9iYXR0ZXJ5X2lwc2NhbGUoYmF0dGVyeSkgKiAxMDAwOworCQl2YWwtPmludHZhbCAqPSAoYWNwaV9iYXR0ZXJ5X21vZGUoYmF0dGVyeSkpID8KKwkJCQkoYmF0dGVyeS0+dm9sdGFnZV9ub3cgKgorCQkJCWFjcGlfYmF0dGVyeV92c2NhbGUoYmF0dGVyeSkgLyAxMDAwKSA6IDE7CiAJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9BVkc6CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QT1dFUl9BVkc6CiAJCXZhbC0+aW50dmFsID0gYWJzKGJhdHRlcnktPnJhdGVfYXZnKSAqCiAJCQkJYWNwaV9iYXR0ZXJ5X2lwc2NhbGUoYmF0dGVyeSkgKiAxMDAwOworCQl2YWwtPmludHZhbCAqPSAoYWNwaV9iYXR0ZXJ5X21vZGUoYmF0dGVyeSkpID8KKwkJCQkoYmF0dGVyeS0+dm9sdGFnZV9ub3cgKgorCQkJCWFjcGlfYmF0dGVyeV92c2NhbGUoYmF0dGVyeSkgLyAxMDAwKSA6IDE7CiAJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFk6CiAJCXZhbC0+aW50dmFsID0gYmF0dGVyeS0+c3RhdGVfb2ZfY2hhcmdlOwpAQCAtOTAzLDggKzkxNCw2IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGFjcGlfc2JzX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwotCiBzdGF0aWMgaW50IGFjcGlfc2JzX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgYWNwaV9zYnMgKnNiczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zbGVlcC5jIGIvZHJpdmVycy9hY3BpL3NsZWVwLmMKaW5kZXggNmM5NDk2MC4uM2VkODBiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwLmMKKysrIGIvZHJpdmVycy9hY3BpL3NsZWVwLmMKQEAgLTQyOCw2ICs0MjgsMjIgQEAKIAkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICIxMDAwIFNlcmllcyIpLAogCQl9LAogCX0sCisJeworCS5jYWxsYmFjayA9IGluaXRfb2xkX3N1c3BlbmRfb3JkZXJpbmcsCisJLmlkZW50ID0gIkFzdXMgQThOLVNMSSBERUxVWEUiLAorCS5tYXRjaGVzID0geworCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DLiIpLAorCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJBOE4tU0xJIERFTFVYRSIpLAorCQl9LAorCX0sCisJeworCS5jYWxsYmFjayA9IGluaXRfb2xkX3N1c3BlbmRfb3JkZXJpbmcsCisJLmlkZW50ID0gIkFzdXMgQThOLVNMSSBQcmVtaXVtIiwKKwkubWF0Y2hlcyA9IHsKKwkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQy4iKSwKKwkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiQThOLVNMSSBQcmVtaXVtIiksCisJCX0sCisJfSwKIAl7fSwKIH07CiAjZW5kaWYgLyogQ09ORklHX1NVU1BFTkQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zeXNmcy5jIGIvZHJpdmVycy9hY3BpL3N5c2ZzLmMKaW5kZXggNzcyNTVmMi4uYzUzOGQwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3N5c2ZzLmMKKysrIGIvZHJpdmVycy9hY3BpL3N5c2ZzLmMKQEAgLTE0OSwxMiArMTQ5LDEyIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHN0cnVjdCBrZXJuZWxfcGFyYW1fb3BzIHBhcmFtX29wc19kZWJ1Z19sYXllciA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qga2VybmVsX3BhcmFtX29wcyBwYXJhbV9vcHNfZGVidWdfbGF5ZXIgPSB7CiAJLnNldCA9IHBhcmFtX3NldF91aW50LAogCS5nZXQgPSBwYXJhbV9nZXRfZGVidWdfbGF5ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IGtlcm5lbF9wYXJhbV9vcHMgcGFyYW1fb3BzX2RlYnVnX2xldmVsID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBrZXJuZWxfcGFyYW1fb3BzIHBhcmFtX29wc19kZWJ1Z19sZXZlbCA9IHsKIAkuc2V0ID0gcGFyYW1fc2V0X3VpbnQsCiAJLmdldCA9IHBhcmFtX2dldF9kZWJ1Z19sZXZlbCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGhlcm1hbC5jIGIvZHJpdmVycy9hY3BpL3RoZXJtYWwuYwppbmRleCAyNjA3ZTE3Li40OGZiYzY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGhlcm1hbC5jCisrKyBiL2RyaXZlcnMvYWNwaS90aGVybWFsLmMKQEAgLTgxMiw3ICs4MTIsNyBAQAogCQkJCXRoZXJtYWxfem9uZV91bmJpbmRfY29vbGluZ19kZXZpY2UpOwogfQogCi1zdGF0aWMgc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2Vfb3BzIGFjcGlfdGhlcm1hbF96b25lX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZV9vcHMgYWNwaV90aGVybWFsX3pvbmVfb3BzID0gewogCS5iaW5kID0gYWNwaV90aGVybWFsX2JpbmRfY29vbGluZ19kZXZpY2UsCiAJLnVuYmluZAk9IGFjcGlfdGhlcm1hbF91bmJpbmRfY29vbGluZ19kZXZpY2UsCiAJLmdldF90ZW1wID0gdGhlcm1hbF9nZXRfdGVtcCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS92aWRlby5jIGIvZHJpdmVycy9hY3BpL3ZpZGVvLmMKaW5kZXggYWRhNGI0ZC4uMDhhNDRiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3ZpZGVvLmMKKysrIGIvZHJpdmVycy9hY3BpL3ZpZGVvLmMKQEAgLTMwNyw3ICszMDcsNyBAQAogCXJldHVybiBhY3BpX3ZpZGVvX2RldmljZV9sY2Rfc2V0X2xldmVsKHZpZGVvLCBsZXZlbCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZV9vcHMgdmlkZW9fY29vbGluZ19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzIHZpZGVvX2Nvb2xpbmdfb3BzID0gewogCS5nZXRfbWF4X3N0YXRlID0gdmlkZW9fZ2V0X21heF9zdGF0ZSwKIAkuZ2V0X2N1cl9zdGF0ZSA9IHZpZGVvX2dldF9jdXJfc3RhdGUsCiAJLnNldF9jdXJfc3RhdGUgPSB2aWRlb19zZXRfY3VyX3N0YXRlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWFjcGkuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1hY3BpLmMKaW5kZXggZTBhNWI1NS4uYmI3YzVmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLWFjcGkuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtYWNwaS5jCkBAIC0yMTgsMTIgKzIxOCwxMiBAQAogCWF0YV9hY3BpX3VldmVudChkZXYtPmxpbmstPmFwLCBkZXYsIGV2ZW50KTsKIH0KIAotc3RhdGljIHN0cnVjdCBhY3BpX2RvY2tfb3BzIGF0YV9hY3BpX2Rldl9kb2NrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kb2NrX29wcyBhdGFfYWNwaV9kZXZfZG9ja19vcHMgPSB7CiAJLmhhbmRsZXIgPSBhdGFfYWNwaV9kZXZfbm90aWZ5X2RvY2ssCiAJLnVldmVudCA9IGF0YV9hY3BpX2Rldl91ZXZlbnQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGFjcGlfZG9ja19vcHMgYXRhX2FjcGlfYXBfZG9ja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZG9ja19vcHMgYXRhX2FjcGlfYXBfZG9ja19vcHMgPSB7CiAJLmhhbmRsZXIgPSBhdGFfYWNwaV9hcF9ub3RpZnlfZG9jaywKIAkudWV2ZW50ID0gYXRhX2FjcGlfYXBfdWV2ZW50LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kZXZ0bXBmcy5jIGIvZHJpdmVycy9iYXNlL2RldnRtcGZzLmMKaW5kZXggYjg5ZmZmYy4uMzNlMWJlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RldnRtcGZzLmMKKysrIGIvZHJpdmVycy9iYXNlL2RldnRtcGZzLmMKQEAgLTE2Niw3ICsxNjYsNyBAQAogewogCWNoYXIgKnBhdGg7CiAJY2hhciAqczsKLQlpbnQgZXJyOworCWludCBlcnIgPSAwOwogCiAJLyogcGFyZW50IGRpcmVjdG9yaWVzIGRvIG5vdCBleGlzdCwgY3JlYXRlIHRoZW0gKi8KIAlwYXRoID0ga3N0cmR1cChub2RlcGF0aCwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCmluZGV4IDQ5NTAyYmMuLjQyM2ZkNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCkBAIC02MTYsNSArNjE2LDE2IEBACiAJICBFbmFibGVzIHVzZXJzcGFjZSBjbGllbnRzIHRvIHJlYWQgYW5kIHdyaXRlIHRvIHNvbWUgcGFja2V0IFNNRAogCSAgcG9ydHMgdmlhIGRldmljZSBpbnRlcmZhY2UgZm9yIE1TTSBjaGlwc2V0LgogCitjb25maWcgVElMRV9TUk9NCisJYm9vbCAiQ2hhcmFjdGVyLWRldmljZSBhY2Nlc3MgdmlhIGh5cGVydmlzb3IgdG8gdGhlIFRpbGVyYSBTUEkgUk9NIgorCWRlcGVuZHMgb24gVElMRQorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZGV2aWNlIHByb3ZpZGVzIGNoYXJhY3Rlci1sZXZlbCByZWFkLXdyaXRlIGFjY2VzcworCSAgdG8gdGhlIFNST00sIHR5cGljYWxseSB2aWEgdGhlICIwIiwgIjEiLCBhbmQgIjIiIGRldmljZXMKKwkgIGluIC9kZXYvc3JvbS8uICBUaGUgVGlsZXJhIGh5cGVydmlzb3IgbWFrZXMgdGhlIGZsYXNoCisJICBkZXZpY2UgYXBwZWFyIG11Y2ggbGlrZSBhIHNpbXBsZSBFRVBST00sIGFuZCBrbm93cworCSAgaG93IHRvIHBhcnRpdGlvbiBhIHNpbmdsZSBST00gZm9yIG11bHRpcGxlIHB1cnBvc2VzLgorCiBlbmRtZW51CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9NYWtlZmlsZQppbmRleCA3YTAwNjcyLi4zMjc2MmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCkBAIC02MywzICs2Myw1IEBACiAKIG9iai0kKENPTkZJR19KU19SVEMpCQkrPSBqcy1ydGMubwoganMtcnRjLXkgPSBydGMubworCitvYmotJChDT05GSUdfVElMRV9TUk9NKQkJKz0gdGlsZS1zcm9tLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yYW1vb3BzLmMgYi9kcml2ZXJzL2NoYXIvcmFtb29wcy5jCmluZGV4IGJkOWI5NGIuLjgxMGFmZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yYW1vb3BzLmMKKysrIGIvZHJpdmVycy9jaGFyL3JhbW9vcHMuYwpAQCAtMjIsNiArMjIsNyBAQAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva21zZ19kdW1wLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgpAQCAtMTQ2LDYgKzE0NywxNCBAQAogCWN4dC0+cGh5c19hZGRyID0gcGRhdGEtPm1lbV9hZGRyZXNzOwogCWN4dC0+cmVjb3JkX3NpemUgPSBwZGF0YS0+cmVjb3JkX3NpemU7CiAJY3h0LT5kdW1wX29vcHMgPSBwZGF0YS0+ZHVtcF9vb3BzOworCS8qCisJICogVXBkYXRlIHRoZSBtb2R1bGUgcGFyYW1ldGVyIHZhcmlhYmxlcyBhcyB3ZWxsIHNvIHRoZXkgYXJlIHZpc2libGUKKwkgKiB0aHJvdWdoIC9zeXMvbW9kdWxlL3JhbW9vcHMvcGFyYW1ldGVycy8KKwkgKi8KKwltZW1fc2l6ZSA9IHBkYXRhLT5tZW1fc2l6ZTsKKwltZW1fYWRkcmVzcyA9IHBkYXRhLT5tZW1fYWRkcmVzczsKKwlyZWNvcmRfc2l6ZSA9IHBkYXRhLT5yZWNvcmRfc2l6ZTsKKwlkdW1wX29vcHMgPSBwZGF0YS0+ZHVtcF9vb3BzOwogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oY3h0LT5waHlzX2FkZHIsIGN4dC0+c2l6ZSwgInJhbW9vcHMiKSkgewogCQlwcl9lcnIoInJlcXVlc3QgbWVtIHJlZ2lvbiBmYWlsZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RpbGUtc3JvbS5jIGIvZHJpdmVycy9jaGFyL3RpbGUtc3JvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmM2VlMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvdGlsZS1zcm9tLmMKQEAgLTAsMCArMSw0ODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBUaWxlcmEgQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiAgIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogICBtb3JlIGRldGFpbHMuCisgKgorICogU1BJIEZsYXNoIFJPTSBkcml2ZXIKKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGRlcml2ZWQgZnJvbSBjb2RlIHByb3ZpZGVkIGluICJMaW51eCBEZXZpY2UKKyAqIERyaXZlcnMsIFRoaXJkIEVkaXRpb24iLCBieSBKb25hdGhhbiBDb3JiZXQsIEFsZXNzYW5kcm8gUnViaW5pLCBhbmQKKyAqIEdyZWcgS3JvYWgtSGFydG1hbiwgcHVibGlzaGVkIGJ5IE8nUmVpbGx5IE1lZGlhLCBJbmMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBwcmludGsoKSAqLworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4JCS8qIGttYWxsb2MoKSAqLworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CQkvKiBldmVyeXRoaW5nLi4uICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4JLyogZXJyb3IgY29kZXMgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgkvKiBzaXplX3QgKi8KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4JLyogT19BQ0NNT0RFICovCisjaW5jbHVkZSA8bGludXgvYWlvLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8aHYvaHlwZXJ2aXNvci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8aHYvZHJ2X3Nyb21faW50Zi5oPgorCisvKgorICogU2l6ZSBvZiBvdXIgaHlwZXJ2aXNvciBJL08gcmVxdWVzdHMuICBXZSBicmVhayB1cCBsYXJnZSB0cmFuc2ZlcnMKKyAqIHNvIHRoYXQgd2UgZG9uJ3Qgc3BlbmQgbGFyZ2UgdW5pbnRlcnJ1cHRlZCBzcGFucyBvZiB0aW1lIGluIHRoZQorICogaHlwZXJ2aXNvci4gIEVyYXNpbmcgYW4gU1JPTSBzZWN0b3IgdGFrZXMgYSBzaWduaWZpY2FudCBmcmFjdGlvbiBvZgorICogYSBzZWNvbmQsIHNvIGlmIHdlIGFsbG93ZWQgdGhlIHVzZXIgdG8sIHNheSwgZG8gb25lIEkvTyB0byB3cml0ZSB0aGUKKyAqIGVudGlyZSBST00sIHdlJ2QgZ2V0IHNvZnQgbG9ja3VwIHRpbWVvdXRzLCBvciB3b3JzZS4KKyAqLworI2RlZmluZSBTUk9NX0NIVU5LX1NJWkUgKChzaXplX3QpNDA5NikKKworLyoKKyAqIFdoZW4gaHlwZXJ2aXNvciBpcyBidXN5IChlLmcuIGVyYXNpbmcpLCBwb2xsIHRoZSBzdGF0dXMgcGVyaW9kaWNhbGx5LgorICovCisKKy8qCisgKiBJbnRlcnZhbCB0byBwb2xsIHRoZSBzdGF0ZSBpbiBtc2VjCisgKi8KKyNkZWZpbmUgU1JPTV9XQUlUX1RSWV9JTlRFUlZBTCAyMAorCisvKgorICogTWF4aW11bSB0aW1lcyB0byBwb2xsIHRoZSBzdGF0ZQorICovCisjZGVmaW5lIFNST01fTUFYX1dBSVRfVFJZX1RJTUVTIDEwMDAKKworc3RydWN0IHNyb21fZGV2IHsKKwlpbnQgaHZfZGV2aGRsOwkJCS8qIEhhbmRsZSBmb3IgaHlwZXJ2aXNvciBkZXZpY2UgKi8KKwl1MzIgdG90YWxfc2l6ZTsJCQkvKiBTaXplIG9mIHRoaXMgZGV2aWNlICovCisJdTMyIHNlY3Rvcl9zaXplOwkJLyogU2l6ZSBvZiBhIHNlY3RvciAqLworCXUzMiBwYWdlX3NpemU7CQkJLyogU2l6ZSBvZiBhIHBhZ2UgKi8KKwlzdHJ1Y3QgbXV0ZXggbG9jazsJCS8qIEFsbG93IG9ubHkgb25lIGFjY2Vzc29yIGF0IGEgdGltZSAqLworfTsKKworc3RhdGljIGludCBzcm9tX21ham9yOwkJCS8qIER5bmFtaWMgbWFqb3IgYnkgZGVmYXVsdCAqLworbW9kdWxlX3BhcmFtKHNyb21fbWFqb3IsIGludCwgMCk7CitNT0RVTEVfQVVUSE9SKCJUaWxlcmEgQ29ycG9yYXRpb24iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBzcm9tX2RldnM7CQkJLyogTnVtYmVyIG9mIFNST00gcGFydGl0aW9ucyAqLworc3RhdGljIHN0cnVjdCBjZGV2IHNyb21fY2RldjsKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKnNyb21fY2xhc3M7CitzdGF0aWMgc3RydWN0IHNyb21fZGV2ICpzcm9tX2RldmljZXM7CisKKy8qCisgKiBIYW5kbGUgY2FsbGluZyB0aGUgaHlwZXJ2aXNvciBhbmQgbWFuYWdpbmcgRUFHQUlOL0VCVVNZLgorICovCisKK3N0YXRpYyBzc2l6ZV90IF9zcm9tX3JlYWQoaW50IGh2X2RldmhkbCwgdm9pZCAqYnVmLAorCQkJICBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJaW50IHJldHZhbCwgcmV0cmllcyA9IFNST01fTUFYX1dBSVRfVFJZX1RJTUVTOworCWZvciAoOzspIHsKKwkJcmV0dmFsID0gaHZfZGV2X3ByZWFkKGh2X2RldmhkbCwgMCwgKEhWX1ZpcnRBZGRyKWJ1ZiwKKwkJCQkgICAgICBjb3VudCwgb2ZmKTsKKwkJaWYgKHJldHZhbCA+PSAwKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJaWYgKHJldHZhbCA9PSBIVl9FQUdBSU4pCisJCQljb250aW51ZTsKKwkJaWYgKHJldHZhbCA9PSBIVl9FQlVTWSAmJiAtLXJldHJpZXMgPiAwKSB7CisJCQltc2xlZXAoU1JPTV9XQUlUX1RSWV9JTlRFUlZBTCk7CisJCQljb250aW51ZTsKKwkJfQorCQlwcl9lcnIoIl9zcm9tX3JlYWQ6IGVycm9yICVkXG4iLCByZXR2YWwpOworCQlyZXR1cm4gLUVJTzsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90IF9zcm9tX3dyaXRlKGludCBodl9kZXZoZGwsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCSAgIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgcmV0dmFsLCByZXRyaWVzID0gU1JPTV9NQVhfV0FJVF9UUllfVElNRVM7CisJZm9yICg7OykgeworCQlyZXR2YWwgPSBodl9kZXZfcHdyaXRlKGh2X2RldmhkbCwgMCwgKEhWX1ZpcnRBZGRyKWJ1ZiwKKwkJCQkgICAgICAgY291bnQsIG9mZik7CisJCWlmIChyZXR2YWwgPj0gMCkKKwkJCXJldHVybiByZXR2YWw7CisJCWlmIChyZXR2YWwgPT0gSFZfRUFHQUlOKQorCQkJY29udGludWU7CisJCWlmIChyZXR2YWwgPT0gSFZfRUJVU1kgJiYgLS1yZXRyaWVzID4gMCkgeworCQkJbXNsZWVwKFNST01fV0FJVF9UUllfSU5URVJWQUwpOworCQkJY29udGludWU7CisJCX0KKwkJcHJfZXJyKCJfc3JvbV93cml0ZTogZXJyb3IgJWRcbiIsIHJldHZhbCk7CisJCXJldHVybiAtRUlPOworCX0KK30KKworLyoqCisgKiBzcm9tX29wZW4oKSAtIERldmljZSBvcGVuIHJvdXRpbmUuCisgKiBAaW5vZGU6IElub2RlIGZvciB0aGlzIGRldmljZS4KKyAqIEBmaWxwOiBGaWxlIGZvciB0aGlzIHNwZWNpZmljIG9wZW4gb2YgdGhlIGRldmljZS4KKyAqCisgKiBSZXR1cm5zIHplcm8sIG9yIGFuIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgc3JvbV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWZpbHAtPnByaXZhdGVfZGF0YSA9ICZzcm9tX2RldmljZXNbaW1pbm9yKGlub2RlKV07CisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBzcm9tX3JlbGVhc2UoKSAtIERldmljZSByZWxlYXNlIHJvdXRpbmUuCisgKiBAaW5vZGU6IElub2RlIGZvciB0aGlzIGRldmljZS4KKyAqIEBmaWxwOiBGaWxlIGZvciB0aGlzIHNwZWNpZmljIG9wZW4gb2YgdGhlIGRldmljZS4KKyAqCisgKiBSZXR1cm5zIHplcm8sIG9yIGFuIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgc3JvbV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBzcm9tX2RldiAqc3JvbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwljaGFyIGR1bW15OworCisJLyogTWFrZSBzdXJlIHdlJ3ZlIGZsdXNoZWQgYW55dGhpbmcgd3JpdHRlbiB0byB0aGUgUk9NLiAqLworCW11dGV4X2xvY2soJnNyb20tPmxvY2spOworCWlmIChzcm9tLT5odl9kZXZoZGwgPj0gMCkKKwkJX3Nyb21fd3JpdGUoc3JvbS0+aHZfZGV2aGRsLCAmZHVtbXksIFNST01fRkxVU0hfT0ZGLCAxKTsKKwltdXRleF91bmxvY2soJnNyb20tPmxvY2spOworCisJZmlscC0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICogc3JvbV9yZWFkKCkgLSBSZWFkIGRhdGEgZnJvbSB0aGUgZGV2aWNlLgorICogQGZpbHA6IEZpbGUgZm9yIHRoaXMgc3BlY2lmaWMgb3BlbiBvZiB0aGUgZGV2aWNlLgorICogQGJ1ZjogVXNlcidzIGRhdGEgYnVmZmVyLgorICogQGNvdW50OiBOdW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkLgorICogQGZfcG9zOiBGaWxlIHBvc2l0aW9uLgorICoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIGFuIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNyb21fcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqZl9wb3MpCit7CisJaW50IHJldHZhbCA9IDA7CisJdm9pZCAqa2VybmJ1ZjsKKwlzdHJ1Y3Qgc3JvbV9kZXYgKnNyb20gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlrZXJuYnVmID0ga21hbGxvYyhTUk9NX0NIVU5LX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICgha2VybmJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzcm9tLT5sb2NrKSkgeworCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCWtmcmVlKGtlcm5idWYpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXdoaWxlIChjb3VudCkgeworCQlpbnQgaHZfcmV0dmFsOworCQlpbnQgYnl0ZXNfdGhpc19wYXNzID0gbWluKGNvdW50LCBTUk9NX0NIVU5LX1NJWkUpOworCisJCWh2X3JldHZhbCA9IF9zcm9tX3JlYWQoc3JvbS0+aHZfZGV2aGRsLCBrZXJuYnVmLAorCQkJCSAgICAgICAqZl9wb3MsIGJ5dGVzX3RoaXNfcGFzcyk7CisJCWlmIChodl9yZXR2YWwgPiAwKSB7CisJCQlpZiAoY29weV90b191c2VyKGJ1Ziwga2VybmJ1ZiwgaHZfcmV0dmFsKSAhPSAwKSB7CisJCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIGlmIChodl9yZXR2YWwgPD0gMCkgeworCQkJaWYgKHJldHZhbCA9PSAwKQorCQkJCXJldHZhbCA9IGh2X3JldHZhbDsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0dmFsICs9IGh2X3JldHZhbDsKKwkJKmZfcG9zICs9IGh2X3JldHZhbDsKKwkJYnVmICs9IGh2X3JldHZhbDsKKwkJY291bnQgLT0gaHZfcmV0dmFsOworCX0KKworCW11dGV4X3VubG9jaygmc3JvbS0+bG9jayk7CisJa2ZyZWUoa2VybmJ1Zik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHNyb21fd3JpdGUoKSAtIFdyaXRlIGRhdGEgdG8gdGhlIGRldmljZS4KKyAqIEBmaWxwOiBGaWxlIGZvciB0aGlzIHNwZWNpZmljIG9wZW4gb2YgdGhlIGRldmljZS4KKyAqIEBidWY6IFVzZXIncyBkYXRhIGJ1ZmZlci4KKyAqIEBjb3VudDogTnVtYmVyIG9mIGJ5dGVzIHJlcXVlc3RlZC4KKyAqIEBmX3BvczogRmlsZSBwb3NpdGlvbi4KKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB3cml0dGVuLCBvciBhbiBlcnJvciBjb2RlLgorICovCitzdGF0aWMgc3NpemVfdCBzcm9tX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqZl9wb3MpCit7CisJaW50IHJldHZhbCA9IDA7CisJdm9pZCAqa2VybmJ1ZjsKKwlzdHJ1Y3Qgc3JvbV9kZXYgKnNyb20gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlrZXJuYnVmID0ga21hbGxvYyhTUk9NX0NIVU5LX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICgha2VybmJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzcm9tLT5sb2NrKSkgeworCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCWtmcmVlKGtlcm5idWYpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXdoaWxlIChjb3VudCkgeworCQlpbnQgaHZfcmV0dmFsOworCQlpbnQgYnl0ZXNfdGhpc19wYXNzID0gbWluKGNvdW50LCBTUk9NX0NIVU5LX1NJWkUpOworCisJCWlmIChjb3B5X2Zyb21fdXNlcihrZXJuYnVmLCBidWYsIGJ5dGVzX3RoaXNfcGFzcykgIT0gMCkgeworCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaHZfcmV0dmFsID0gX3Nyb21fd3JpdGUoc3JvbS0+aHZfZGV2aGRsLCBrZXJuYnVmLAorCQkJCQkqZl9wb3MsIGJ5dGVzX3RoaXNfcGFzcyk7CisJCWlmIChodl9yZXR2YWwgPD0gMCkgeworCQkJaWYgKHJldHZhbCA9PSAwKQorCQkJCXJldHZhbCA9IGh2X3JldHZhbDsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0dmFsICs9IGh2X3JldHZhbDsKKwkJKmZfcG9zICs9IGh2X3JldHZhbDsKKwkJYnVmICs9IGh2X3JldHZhbDsKKwkJY291bnQgLT0gaHZfcmV0dmFsOworCX0KKworCW11dGV4X3VubG9jaygmc3JvbS0+bG9jayk7CisJa2ZyZWUoa2VybmJ1Zik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBQcm92aWRlIG91ciBvd24gaW1wbGVtZW50YXRpb24gc28gd2UgY2FuIHVzZSBzcm9tLT50b3RhbF9zaXplLiAqLworbG9mZl90IHNyb21fbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxwLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luKQoreworCXN0cnVjdCBzcm9tX2RldiAqc3JvbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnNyb20tPmxvY2spKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJc3dpdGNoIChvcmlnaW4pIHsKKwljYXNlIFNFRUtfRU5EOgorCQlvZmZzZXQgKz0gc3JvbS0+dG90YWxfc2l6ZTsKKwkJYnJlYWs7CisJY2FzZSBTRUVLX0NVUjoKKwkJb2Zmc2V0ICs9IGZpbHAtPmZfcG9zOworCQlicmVhazsKKwl9CisKKwlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBzcm9tLT50b3RhbF9zaXplKSB7CisJCW9mZnNldCA9IC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJZmlscC0+Zl9wb3MgPSBvZmZzZXQ7CisJCWZpbHAtPmZfdmVyc2lvbiA9IDA7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZzcm9tLT5sb2NrKTsKKworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRvdGFsX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzcm9tX2RldiAqc3JvbSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBzcm9tLT50b3RhbF9zaXplKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2VjdG9yX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3JvbV9kZXYgKnNyb20gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgc3JvbS0+c2VjdG9yX3NpemUpOworfQorCitzdGF0aWMgc3NpemVfdCBwYWdlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNyb21fZGV2ICpzcm9tID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHNyb20tPnBhZ2Vfc2l6ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBzcm9tX2Rldl9hdHRyc1tdID0geworCV9fQVRUUih0b3RhbF9zaXplLCBTX0lSVUdPLCB0b3RhbF9zaG93LCBOVUxMKSwKKwlfX0FUVFIoc2VjdG9yX3NpemUsIFNfSVJVR08sIHNlY3Rvcl9zaG93LCBOVUxMKSwKKwlfX0FUVFIocGFnZV9zaXplLCBTX0lSVUdPLCBwYWdlX3Nob3csIE5VTEwpLAorCV9fQVRUUl9OVUxMCit9OworCitzdGF0aWMgY2hhciAqc3JvbV9kZXZub2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgbW9kZV90ICptb2RlKQoreworCSptb2RlID0gU19JUlVHTyB8IFNfSVdVU1I7CisJcmV0dXJuIGthc3ByaW50ZihHRlBfS0VSTkVMLCAic3JvbS8lcyIsIGRldl9uYW1lKGRldikpOworfQorCisvKgorICogVGhlIGZvcHMKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3JvbV9mb3BzID0geworCS5vd25lciA9ICAgICBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gICAgc3JvbV9sbHNlZWssCisJLnJlYWQgPQkgICAgIHNyb21fcmVhZCwKKwkud3JpdGUgPSAgICAgc3JvbV93cml0ZSwKKwkub3BlbiA9CSAgICAgc3JvbV9vcGVuLAorCS5yZWxlYXNlID0gICBzcm9tX3JlbGVhc2UsCit9OworCisvKioKKyAqIHNyb21fc2V0dXBfbWlub3IoKSAtIEluaXRpYWxpemUgcGVyLW1pbm9yIGluZm9ybWF0aW9uLgorICogQHNyb206IFBlci1kZXZpY2UgU1JPTSBzdGF0ZS4KKyAqIEBpbmRleDogRGV2aWNlIHRvIHNldCB1cC4KKyAqLworc3RhdGljIGludCBzcm9tX3NldHVwX21pbm9yKHN0cnVjdCBzcm9tX2RldiAqc3JvbSwgaW50IGluZGV4KQoreworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgZGV2aGRsID0gc3JvbS0+aHZfZGV2aGRsOworCisJbXV0ZXhfaW5pdCgmc3JvbS0+bG9jayk7CisKKwlpZiAoX3Nyb21fcmVhZChkZXZoZGwsICZzcm9tLT50b3RhbF9zaXplLAorCQkgICAgICAgU1JPTV9UT1RBTF9TSVpFX09GRiwgc2l6ZW9mKHNyb20tPnRvdGFsX3NpemUpKSA8IDApCisJCXJldHVybiAtRUlPOworCWlmIChfc3JvbV9yZWFkKGRldmhkbCwgJnNyb20tPnNlY3Rvcl9zaXplLAorCQkgICAgICAgU1JPTV9TRUNUT1JfU0laRV9PRkYsIHNpemVvZihzcm9tLT5zZWN0b3Jfc2l6ZSkpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisJaWYgKF9zcm9tX3JlYWQoZGV2aGRsLCAmc3JvbS0+cGFnZV9zaXplLAorCQkgICAgICAgU1JPTV9QQUdFX1NJWkVfT0ZGLCBzaXplb2Yoc3JvbS0+cGFnZV9zaXplKSkgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCWRldiA9IGRldmljZV9jcmVhdGUoc3JvbV9jbGFzcywgJnBsYXRmb3JtX2J1cywKKwkJCSAgICBNS0RFVihzcm9tX21ham9yLCBpbmRleCksIHNyb20sICIlZCIsIGluZGV4KTsKKwlyZXR1cm4gSVNfRVJSKGRldikgPyBQVFJfRVJSKGRldikgOiAwOworfQorCisvKiogc3JvbV9pbml0KCkgLSBJbml0aWFsaXplIHRoZSBkcml2ZXIncyBtb2R1bGUuICovCitzdGF0aWMgaW50IHNyb21faW5pdCh2b2lkKQoreworCWludCByZXN1bHQsIGk7CisJZGV2X3QgZGV2ID0gTUtERVYoc3JvbV9tYWpvciwgMCk7CisKKwkvKgorCSAqIFN0YXJ0IHdpdGggYSBwbGF1c2libGUgbnVtYmVyIG9mIHBhcnRpdGlvbnM7IHRoZSBrcmVhbGxvYygpIGNhbGwKKwkgKiBiZWxvdyB3aWxsIHlpZWxkIGFib3V0IGxvZyhzcm9tX2RldnMpIGFkZGl0aW9uYWwgYWxsb2NhdGlvbnMuCisJICovCisJc3JvbV9kZXZpY2VzID0ga3phbGxvYyg0ICogc2l6ZW9mKHN0cnVjdCBzcm9tX2RldiksIEdGUF9LRVJORUwpOworCisJLyogRGlzY292ZXIgdGhlIG51bWJlciBvZiBzcm9tIHBhcnRpdGlvbnMuICovCisJZm9yIChpID0gMDsgOyBpKyspIHsKKwkJaW50IGRldmhkbDsKKwkJY2hhciBidWZbMjBdOworCQlzdHJ1Y3Qgc3JvbV9kZXYgKm5ld19zcm9tX2RldmljZXMgPQorCQkJa3JlYWxsb2Moc3JvbV9kZXZpY2VzLCAoaSsxKSAqIHNpemVvZihzdHJ1Y3Qgc3JvbV9kZXYpLAorCQkJCSBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CisJCWlmICghbmV3X3Nyb21fZGV2aWNlcykgeworCQkJcmVzdWx0ID0gLUVOT01FTTsKKwkJCWdvdG8gZmFpbF9tZW07CisJCX0KKwkJc3JvbV9kZXZpY2VzID0gbmV3X3Nyb21fZGV2aWNlczsKKwkJc3ByaW50ZihidWYsICJzcm9tLzAvJWQiLCBpKTsKKwkJZGV2aGRsID0gaHZfZGV2X29wZW4oKEhWX1ZpcnRBZGRyKWJ1ZiwgMCk7CisJCWlmIChkZXZoZGwgPCAwKSB7CisJCQlpZiAoZGV2aGRsICE9IEhWX0VOT0RFVikKKwkJCQlwcl9ub3RpY2UoInNyb20vJWQ6IGh2X2Rldl9vcGVuIGZhaWxlZDogJWQuXG4iLAorCQkJCQkgIGksIGRldmhkbCk7CisJCQlicmVhazsKKwkJfQorCQlzcm9tX2RldmljZXNbaV0uaHZfZGV2aGRsID0gZGV2aGRsOworCX0KKwlzcm9tX2RldnMgPSBpOworCisJLyogQmFpbCBvdXQgZWFybHkgaWYgd2UgaGF2ZSBubyBwYXJ0aXRpb25zIGF0IGFsbC4gKi8KKwlpZiAoc3JvbV9kZXZzID09IDApIHsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBmYWlsX21lbTsKKwl9CisKKwkvKiBSZWdpc3RlciBvdXIgbWFqb3IsIGFuZCBhY2NlcHQgYSBkeW5hbWljIG51bWJlci4gKi8KKwlpZiAoc3JvbV9tYWpvcikKKwkJcmVzdWx0ID0gcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihkZXYsIHNyb21fZGV2cywgInNyb20iKTsKKwllbHNlIHsKKwkJcmVzdWx0ID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmZGV2LCAwLCBzcm9tX2RldnMsICJzcm9tIik7CisJCXNyb21fbWFqb3IgPSBNQUpPUihkZXYpOworCX0KKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBmYWlsX21lbTsKKworCS8qIFJlZ2lzdGVyIGEgY2hhcmFjdGVyIGRldmljZS4gKi8KKwljZGV2X2luaXQoJnNyb21fY2RldiwgJnNyb21fZm9wcyk7CisJc3JvbV9jZGV2Lm93bmVyID0gVEhJU19NT0RVTEU7CisJc3JvbV9jZGV2Lm9wcyA9ICZzcm9tX2ZvcHM7CisJcmVzdWx0ID0gY2Rldl9hZGQoJnNyb21fY2RldiwgZGV2LCBzcm9tX2RldnMpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGZhaWxfY2hyZGV2OworCisJLyogQ3JlYXRlIGEgc3lzZnMgY2xhc3MuICovCisJc3JvbV9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgInNyb20iKTsKKwlpZiAoSVNfRVJSKHNyb21fY2xhc3MpKSB7CisJCXJlc3VsdCA9IFBUUl9FUlIoc3JvbV9jbGFzcyk7CisJCWdvdG8gZmFpbF9jZGV2OworCX0KKwlzcm9tX2NsYXNzLT5kZXZfYXR0cnMgPSBzcm9tX2Rldl9hdHRyczsKKwlzcm9tX2NsYXNzLT5kZXZub2RlID0gc3JvbV9kZXZub2RlOworCisJLyogRG8gcGVyLXBhcnRpdGlvbiBpbml0aWFsaXphdGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCBzcm9tX2RldnM7IGkrKykgeworCQlyZXN1bHQgPSBzcm9tX3NldHVwX21pbm9yKHNyb21fZGV2aWNlcyArIGksIGkpOworCQlpZiAocmVzdWx0IDwgMCkKKwkJCWdvdG8gZmFpbF9jbGFzczsKKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbF9jbGFzczoKKwlmb3IgKGkgPSAwOyBpIDwgc3JvbV9kZXZzOyBpKyspCisJCWRldmljZV9kZXN0cm95KHNyb21fY2xhc3MsIE1LREVWKHNyb21fbWFqb3IsIGkpKTsKKwljbGFzc19kZXN0cm95KHNyb21fY2xhc3MpOworZmFpbF9jZGV2OgorCWNkZXZfZGVsKCZzcm9tX2NkZXYpOworZmFpbF9jaHJkZXY6CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRldiwgc3JvbV9kZXZzKTsKK2ZhaWxfbWVtOgorCWtmcmVlKHNyb21fZGV2aWNlcyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqIHNyb21fY2xlYW51cCgpIC0gQ2xlYW4gdXAgdGhlIGRyaXZlcidzIG1vZHVsZS4gKi8KK3N0YXRpYyB2b2lkIHNyb21fY2xlYW51cCh2b2lkKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBzcm9tX2RldnM7IGkrKykKKwkJZGV2aWNlX2Rlc3Ryb3koc3JvbV9jbGFzcywgTUtERVYoc3JvbV9tYWpvciwgaSkpOworCWNsYXNzX2Rlc3Ryb3koc3JvbV9jbGFzcyk7CisJY2Rldl9kZWwoJnNyb21fY2Rldik7CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKHNyb21fbWFqb3IsIDApLCBzcm9tX2RldnMpOworCWtmcmVlKHNyb21fZGV2aWNlcyk7Cit9CisKK21vZHVsZV9pbml0KHNyb21faW5pdCk7Cittb2R1bGVfZXhpdChzcm9tX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG1fdGlzLmMgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbV90aXMuYwppbmRleCA3ZmMyZjEwLi4zZjQwNTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV90aXMuYworKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbV90aXMuYwpAQCAtODAsNyArODAsNyBAQAogc3RhdGljIExJU1RfSEVBRCh0aXNfY2hpcHMpOwogc3RhdGljIERFRklORV9TUElOTE9DSyh0aXNfbG9jayk7CiAKLSNpZmRlZiBDT05GSUdfUE5QCisjaWYgZGVmaW5lZChDT05GSUdfUE5QKSAmJiBkZWZpbmVkKENPTkZJR19BQ1BJKQogc3RhdGljIGludCBpc19pdHBtKHN0cnVjdCBwbnBfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGFjcGlfZGV2aWNlICphY3BpID0gcG5wX2FjcGlfZGV2aWNlKGRldik7CkBAIC05Myw2ICs5MywxMSBAQAogCiAJcmV0dXJuIDA7CiB9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgaXNfaXRwbShzdHJ1Y3QgcG5wX2RldiAqZGV2KQoreworCXJldHVybiAwOworfQogI2VuZGlmCiAKIHN0YXRpYyBpbnQgY2hlY2tfbG9jYWxpdHkoc3RydWN0IHRwbV9jaGlwICpjaGlwLCBpbnQgbCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLmMgYi9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5jCmluZGV4IGJmNTA5MjQuLmQ0YzU0MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUuYwpAQCAtMjUsOSArMjUsMTkgQEAKIAogREVGSU5FX01VVEVYKGNwdWlkbGVfbG9jayk7CiBMSVNUX0hFQUQoY3B1aWRsZV9kZXRlY3RlZF9kZXZpY2VzKTsKLXN0YXRpYyB2b2lkICgqcG1faWRsZV9vbGQpKHZvaWQpOwogCiBzdGF0aWMgaW50IGVuYWJsZWRfZGV2aWNlczsKK3N0YXRpYyBpbnQgb2ZmIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgaW50IGluaXRpYWxpemVkIF9fcmVhZF9tb3N0bHk7CisKK2ludCBjcHVpZGxlX2Rpc2FibGVkKHZvaWQpCit7CisJcmV0dXJuIG9mZjsKK30KK3ZvaWQgZGlzYWJsZV9jcHVpZGxlKHZvaWQpCit7CisJb2ZmID0gMTsKK30KIAogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfSEFTX0NQVV9JRExFX1dBSVQpCiBzdGF0aWMgdm9pZCBjcHVpZGxlX2tpY2tfY3B1cyh2b2lkKQpAQCAtNDYsMjUgKzU2LDIzIEBACiAgKiBjcHVpZGxlX2lkbGVfY2FsbCAtIHRoZSBtYWluIGlkbGUgbG9vcAogICoKICAqIE5PVEU6IG5vIGxvY2tzIG9yIHNlbWFwaG9yZXMgc2hvdWxkIGJlIHVzZWQgaGVyZQorICogcmV0dXJuIG5vbi16ZXJvIG9uIGZhaWx1cmUKICAqLwotc3RhdGljIHZvaWQgY3B1aWRsZV9pZGxlX2NhbGwodm9pZCkKK2ludCBjcHVpZGxlX2lkbGVfY2FsbCh2b2lkKQogewogCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2ID0gX190aGlzX2NwdV9yZWFkKGNwdWlkbGVfZGV2aWNlcyk7CiAJc3RydWN0IGNwdWlkbGVfc3RhdGUgKnRhcmdldF9zdGF0ZTsKIAlpbnQgbmV4dF9zdGF0ZTsKIAorCWlmIChvZmYpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFpbml0aWFsaXplZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAkvKiBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIHJlYWR5ICovCi0JaWYgKCFkZXYgfHwgIWRldi0+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+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3NoZG1hLmggYi9kcml2ZXJzL2RtYS9zaGRtYS5oCmluZGV4IDVhZTlmYzUuLmRjNTY1NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3NoZG1hLmgKKysrIGIvZHJpdmVycy9kbWEvc2hkbWEuaApAQCAtNDcsMTAgKzQ3LDE0IEBACiAJc3RydWN0IGxpc3RfaGVhZCBub2RlOwogCXUzMiBfX2lvbWVtICpjaGFuX3JlZzsKIAl1MTYgX19pb21lbSAqZG1hcnM7CisJdW5zaWduZWQgaW50IGNoY3Jfb2Zmc2V0OworCXUzMiBjaGNyX2llX2JpdDsKIH07CiAKICNkZWZpbmUgdG9fc2hfY2hhbihjaGFuKSBjb250YWluZXJfb2YoY2hhbiwgc3RydWN0IHNoX2RtYWVfY2hhbiwgY29tbW9uKQogI2RlZmluZSB0b19zaF9kZXNjKGxoKSBjb250YWluZXJfb2YobGgsIHN0cnVjdCBzaF9kZXNjLCBub2RlKQogI2RlZmluZSB0eF90b19zaF9kZXNjKHR4KSBjb250YWluZXJfb2YodHgsIHN0cnVjdCBzaF9kZXNjLCBhc3luY190eCkKKyNkZWZpbmUgdG9fc2hfZGV2KGNoYW4pIGNvbnRhaW5lcl9vZihjaGFuLT5jb21tb24uZGV2aWNlLFwKKwkJCQkgICAgIHN0cnVjdCBzaF9kbWFlX2RldmljZSwgY29tbW9uKQogCiAjZW5kaWYJLyogX19ETUFfU0hETUFfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvc3RlX2RtYTQwLmMgYi9kcml2ZXJzL2RtYS9zdGVfZG1hNDAuYwppbmRleCAyOWQxYWRkLi5jZDNhN2M3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9zdGVfZG1hNDAuYworKysgYi9kcml2ZXJzL2RtYS9zdGVfZG1hNDAuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KIAogI2luY2x1ZGUgPHBsYXQvc3RlX2RtYTQwLmg+CiAKQEAgLTQ1LDkgKzQ2LDYgQEAKICNkZWZpbmUgRDQwX0FMTE9DX1BIWQkJKDEgPDwgMzApCiAjZGVmaW5lIEQ0MF9BTExPQ19MT0dfRlJFRQkwCiAKLS8qIEhhcmR3YXJlIGRlc2lnbmVyIG9mIHRoZSBibG9jayAqLwotI2RlZmluZSBENDBfSFdfREVTSUdORVIgMHg4Ci0KIC8qKgogICogZW51bSA0MF9jb21tYW5kIC0gVGhlIGRpZmZlcmVudCBjb21tYW5kcyBhbmQvb3Igc3RhdHVzZXMuCiAgKgpAQCAtMTg2LDYgKzE4NCw4IEBACiAgKiBAbG9nX2RlZjogRGVmYXVsdCBsb2dpY2FsIGNoYW5uZWwgc2V0dGluZ3MuCiAgKiBAbGNsYTogU3BhY2UgZm9yIG9uZSBkc3Qgc3JjIHBhaXIgZm9yIGxvZ2ljYWwgY2hhbm5lbCB0cmFuc2ZlcnMuCiAgKiBAbGNwYTogUG9pbnRlciB0byBkc3QgYW5kIHNyYyBsY3BhIHNldHRpbmdzLgorICogQHJ1bnRpbWVfYWRkcjogcnVudGltZSBjb25maWd1cmVkIGFkZHJlc3MuCisgKiBAcnVudGltZV9kaXJlY3Rpb246IHJ1bnRpbWUgY29uZmlndXJlZCBkaXJlY3Rpb24uCiAgKgogICogVGhpcyBzdHJ1Y3QgY2FuIGVpdGhlciAiYmUiIGEgbG9naWNhbCBvciBhIHBoeXNpY2FsIGNoYW5uZWwuCiAgKi8KQEAgLTIwMCw2ICsyMDAsNyBAQAogCXN0cnVjdCBkbWFfY2hhbgkJCSBjaGFuOwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAkJIHRhc2tsZXQ7CiAJc3RydWN0IGxpc3RfaGVhZAkJIGNsaWVudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQkgcGVuZGluZ19xdWV1ZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQkgYWN0aXZlOwogCXN0cnVjdCBsaXN0X2hlYWQJCSBxdWV1ZTsKIAlzdHJ1Y3Qgc3RlZG1hNDBfY2hhbl9jZmcJIGRtYV9jZmc7CkBAIC02NDUsNyArNjQ2LDIwIEBACiAKIHN0YXRpYyB2b2lkIGQ0MF9kZXNjX3F1ZXVlKHN0cnVjdCBkNDBfY2hhbiAqZDQwYywgc3RydWN0IGQ0MF9kZXNjICpkZXNjKQogewotCWxpc3RfYWRkX3RhaWwoJmRlc2MtPm5vZGUsICZkNDBjLT5xdWV1ZSk7CisJbGlzdF9hZGRfdGFpbCgmZGVzYy0+bm9kZSwgJmQ0MGMtPnBlbmRpbmdfcXVldWUpOworfQorCitzdGF0aWMgc3RydWN0IGQ0MF9kZXNjICpkNDBfZmlyc3RfcGVuZGluZyhzdHJ1Y3QgZDQwX2NoYW4gKmQ0MGMpCit7CisJc3RydWN0IGQ0MF9kZXNjICpkOworCisJaWYgKGxpc3RfZW1wdHkoJmQ0MGMtPnBlbmRpbmdfcXVldWUpKQorCQlyZXR1cm4gTlVMTDsKKworCWQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZkNDBjLT5wZW5kaW5nX3F1ZXVlLAorCQkJICAgICBzdHJ1Y3QgZDQwX2Rlc2MsCisJCQkgICAgIG5vZGUpOworCXJldHVybiBkOwogfQogCiBzdGF0aWMgc3RydWN0IGQ0MF9kZXNjICpkNDBfZmlyc3RfcXVldWVkKHN0cnVjdCBkNDBfY2hhbiAqZDQwYykKQEAgLTgwMiw2ICs4MTYsMTEgQEAKIAkJZDQwX2Rlc2NfZnJlZShkNDBjLCBkNDBkKTsKIAl9CiAKKwkvKiBSZWxlYXNlIHBlbmRpbmcgZGVzY3JpcHRvcnMgKi8KKwl3aGlsZSAoKGQ0MGQgPSBkNDBfZmlyc3RfcGVuZGluZyhkNDBjKSkpIHsKKwkJZDQwX2Rlc2NfcmVtb3ZlKGQ0MGQpOworCQlkNDBfZGVzY19mcmVlKGQ0MGMsIGQ0MGQpOworCX0KIAogCWQ0MGMtPnBlbmRpbmdfdHggPSAwOwogCWQ0MGMtPmJ1c3kgPSBmYWxzZTsKQEAgLTIwOTIsNyArMjExMSw3IEBACiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIAlpbnQgaTsKIAotCXNnID0ga2NhbGxvYyhwZXJpb2RzICsgMSwgc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCksIEdGUF9LRVJORUwpOworCXNnID0ga2NhbGxvYyhwZXJpb2RzICsgMSwgc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCksIEdGUF9OT1dBSVQpOwogCWZvciAoaSA9IDA7IGkgPCBwZXJpb2RzOyBpKyspIHsKIAkJc2dfZG1hX2FkZHJlc3MoJnNnW2ldKSA9IGRtYV9hZGRyOwogCQlzZ19kbWFfbGVuKCZzZ1tpXSkgPSBwZXJpb2RfbGVuOwpAQCAtMjE1MiwyNCArMjE3MSw4NyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmQ0MGMtPmxvY2ssIGZsYWdzKTsKIAotCS8qIEJ1c3kgbWVhbnMgdGhhdCBwZW5kaW5nIGpvYnMgYXJlIGFscmVhZHkgYmVpbmcgcHJvY2Vzc2VkICovCisJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZkNDBjLT5wZW5kaW5nX3F1ZXVlLCAmZDQwYy0+cXVldWUpOworCisJLyogQnVzeSBtZWFucyB0aGF0IHF1ZXVlZCBqb2JzIGFyZSBhbHJlYWR5IGJlaW5nIHByb2Nlc3NlZCAqLwogCWlmICghZDQwYy0+YnVzeSkKIAkJKHZvaWQpIGQ0MF9xdWV1ZV9zdGFydChkNDBjKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQ0MGMtPmxvY2ssIGZsYWdzKTsKIH0KIAorc3RhdGljIGludAorZG1hNDBfY29uZmlnX3RvX2hhbGZjaGFubmVsKHN0cnVjdCBkNDBfY2hhbiAqZDQwYywKKwkJCSAgICBzdHJ1Y3Qgc3RlZG1hNDBfaGFsZl9jaGFubmVsX2luZm8gKmluZm8sCisJCQkgICAgZW51bSBkbWFfc2xhdmVfYnVzd2lkdGggd2lkdGgsCisJCQkgICAgdTMyIG1heGJ1cnN0KQoreworCWVudW0gc3RlZG1hNDBfcGVyaXBoX2RhdGFfd2lkdGggYWRkcl93aWR0aDsKKwlpbnQgcHNpemU7CisKKwlzd2l0Y2ggKHdpZHRoKSB7CisJY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFOgorCQlhZGRyX3dpZHRoID0gU1RFRE1BNDBfQllURV9XSURUSDsKKwkJYnJlYWs7CisJY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfMl9CWVRFUzoKKwkJYWRkcl93aWR0aCA9IFNURURNQTQwX0hBTEZXT1JEX1dJRFRIOworCQlicmVhazsKKwljYXNlIERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOgorCQlhZGRyX3dpZHRoID0gU1RFRE1BNDBfV09SRF9XSURUSDsKKwkJYnJlYWs7CisJY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfOF9CWVRFUzoKKwkJYWRkcl93aWR0aCA9IFNURURNQTQwX0RPVUJMRVdPUkRfV0lEVEg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoZDQwYy0+YmFzZS0+ZGV2LAorCQkJImlsbGVnYWwgcGVyaXBoZXJhbCBhZGRyZXNzIHdpZHRoICIKKwkJCSJyZXF1ZXN0ZWQgKCVkKVxuIiwKKwkJCXdpZHRoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNoYW5faXNfbG9naWNhbChkNDBjKSkgeworCQlpZiAobWF4YnVyc3QgPj0gMTYpCisJCQlwc2l6ZSA9IFNURURNQTQwX1BTSVpFX0xPR18xNjsKKwkJZWxzZSBpZiAobWF4YnVyc3QgPj0gOCkKKwkJCXBzaXplID0gU1RFRE1BNDBfUFNJWkVfTE9HXzg7CisJCWVsc2UgaWYgKG1heGJ1cnN0ID49IDQpCisJCQlwc2l6ZSA9IFNURURNQTQwX1BTSVpFX0xPR180OworCQllbHNlCisJCQlwc2l6ZSA9IFNURURNQTQwX1BTSVpFX0xPR18xOworCX0gZWxzZSB7CisJCWlmIChtYXhidXJzdCA+PSAxNikKKwkJCXBzaXplID0gU1RFRE1BNDBfUFNJWkVfUEhZXzE2OworCQllbHNlIGlmIChtYXhidXJzdCA+PSA4KQorCQkJcHNpemUgPSBTVEVETUE0MF9QU0laRV9QSFlfODsKKwkJZWxzZSBpZiAobWF4YnVyc3QgPj0gNCkKKwkJCXBzaXplID0gU1RFRE1BNDBfUFNJWkVfUEhZXzQ7CisJCWVsc2UKKwkJCXBzaXplID0gU1RFRE1BNDBfUFNJWkVfUEhZXzE7CisJfQorCisJaW5mby0+ZGF0YV93aWR0aCA9IGFkZHJfd2lkdGg7CisJaW5mby0+cHNpemUgPSBwc2l6ZTsKKwlpbmZvLT5mbG93X2N0cmwgPSBTVEVETUE0MF9OT19GTE9XX0NUUkw7CisKKwlyZXR1cm4gMDsKK30KKwogLyogUnVudGltZSByZWNvbmZpZ3VyYXRpb24gZXh0ZW5zaW9uICovCi1zdGF0aWMgdm9pZCBkNDBfc2V0X3J1bnRpbWVfY29uZmlnKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKLQkJCSAgICAgICBzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyAqY29uZmlnKQorc3RhdGljIGludCBkNDBfc2V0X3J1bnRpbWVfY29uZmlnKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKKwkJCQkgIHN0cnVjdCBkbWFfc2xhdmVfY29uZmlnICpjb25maWcpCiB7CiAJc3RydWN0IGQ0MF9jaGFuICpkNDBjID0gY29udGFpbmVyX29mKGNoYW4sIHN0cnVjdCBkNDBfY2hhbiwgY2hhbik7CiAJc3RydWN0IHN0ZWRtYTQwX2NoYW5fY2ZnICpjZmcgPSAmZDQwYy0+ZG1hX2NmZzsKLQllbnVtIGRtYV9zbGF2ZV9idXN3aWR0aCBjb25maWdfYWRkcl93aWR0aDsKKwllbnVtIGRtYV9zbGF2ZV9idXN3aWR0aCBzcmNfYWRkcl93aWR0aCwgZHN0X2FkZHJfd2lkdGg7CiAJZG1hX2FkZHJfdCBjb25maWdfYWRkcjsKLQl1MzIgY29uZmlnX21heGJ1cnN0OwotCWVudW0gc3RlZG1hNDBfcGVyaXBoX2RhdGFfd2lkdGggYWRkcl93aWR0aDsKLQlpbnQgcHNpemU7CisJdTMyIHNyY19tYXhidXJzdCwgZHN0X21heGJ1cnN0OworCWludCByZXQ7CisKKwlzcmNfYWRkcl93aWR0aCA9IGNvbmZpZy0+c3JjX2FkZHJfd2lkdGg7CisJc3JjX21heGJ1cnN0ID0gY29uZmlnLT5zcmNfbWF4YnVyc3Q7CisJZHN0X2FkZHJfd2lkdGggPSBjb25maWctPmRzdF9hZGRyX3dpZHRoOworCWRzdF9tYXhidXJzdCA9IGNvbmZpZy0+ZHN0X21heGJ1cnN0OwogCiAJaWYgKGNvbmZpZy0+ZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkgewogCQlkbWFfYWRkcl90IGRldl9hZGRyX3J4ID0KQEAgLTIxODgsOCArMjI3MCwxMSBAQAogCQkJCWNmZy0+ZGlyKTsKIAkJY2ZnLT5kaXIgPSBTVEVETUE0MF9QRVJJUEhfVE9fTUVNOwogCi0JCWNvbmZpZ19hZGRyX3dpZHRoID0gY29uZmlnLT5zcmNfYWRkcl93aWR0aDsKLQkJY29uZmlnX21heGJ1cnN0ID0gY29uZmlnLT5zcmNfbWF4YnVyc3Q7CisJCS8qIENvbmZpZ3VyZSB0aGUgbWVtb3J5IHNpZGUgKi8KKwkJaWYgKGRzdF9hZGRyX3dpZHRoID09IERNQV9TTEFWRV9CVVNXSURUSF9VTkRFRklORUQpCisJCQlkc3RfYWRkcl93aWR0aCA9IHNyY19hZGRyX3dpZHRoOworCQlpZiAoZHN0X21heGJ1cnN0ID09IDApCisJCQlkc3RfbWF4YnVyc3QgPSBzcmNfbWF4YnVyc3Q7CiAKIAl9IGVsc2UgaWYgKGNvbmZpZy0+ZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKIAkJZG1hX2FkZHJfdCBkZXZfYWRkcl90eCA9CkBAIC0yMjA4LDY4ICsyMjkzLDM5IEBACiAJCQkJY2ZnLT5kaXIpOwogCQljZmctPmRpciA9IFNURURNQTQwX01FTV9UT19QRVJJUEg7CiAKLQkJY29uZmlnX2FkZHJfd2lkdGggPSBjb25maWctPmRzdF9hZGRyX3dpZHRoOwotCQljb25maWdfbWF4YnVyc3QgPSBjb25maWctPmRzdF9tYXhidXJzdDsKLQorCQkvKiBDb25maWd1cmUgdGhlIG1lbW9yeSBzaWRlICovCisJCWlmIChzcmNfYWRkcl93aWR0aCA9PSBETUFfU0xBVkVfQlVTV0lEVEhfVU5ERUZJTkVEKQorCQkJc3JjX2FkZHJfd2lkdGggPSBkc3RfYWRkcl93aWR0aDsKKwkJaWYgKHNyY19tYXhidXJzdCA9PSAwKQorCQkJc3JjX21heGJ1cnN0ID0gZHN0X21heGJ1cnN0OwogCX0gZWxzZSB7CiAJCWRldl9lcnIoZDQwYy0+YmFzZS0+ZGV2LAogCQkJInVucmVjb2duaXplZCBjaGFubmVsIGRpcmVjdGlvbiAlZFxuIiwKIAkJCWNvbmZpZy0+ZGlyZWN0aW9uKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlzd2l0Y2ggKGNvbmZpZ19hZGRyX3dpZHRoKSB7Ci0JY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFOgotCQlhZGRyX3dpZHRoID0gU1RFRE1BNDBfQllURV9XSURUSDsKLQkJYnJlYWs7Ci0JY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfMl9CWVRFUzoKLQkJYWRkcl93aWR0aCA9IFNURURNQTQwX0hBTEZXT1JEX1dJRFRIOwotCQlicmVhazsKLQljYXNlIERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOgotCQlhZGRyX3dpZHRoID0gU1RFRE1BNDBfV09SRF9XSURUSDsKLQkJYnJlYWs7Ci0JY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfOF9CWVRFUzoKLQkJYWRkcl93aWR0aCA9IFNURURNQTQwX0RPVUJMRVdPUkRfV0lEVEg7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6CisJaWYgKHNyY19tYXhidXJzdCAqIHNyY19hZGRyX3dpZHRoICE9IGRzdF9tYXhidXJzdCAqIGRzdF9hZGRyX3dpZHRoKSB7CiAJCWRldl9lcnIoZDQwYy0+YmFzZS0+ZGV2LAotCQkJImlsbGVnYWwgcGVyaXBoZXJhbCBhZGRyZXNzIHdpZHRoICIKLQkJCSJyZXF1ZXN0ZWQgKCVkKVxuIiwKLQkJCWNvbmZpZy0+c3JjX2FkZHJfd2lkdGgpOwotCQlyZXR1cm47CisJCQkic3JjL2RzdCB3aWR0aC9tYXhidXJzdCBtaXNtYXRjaDogJWQqJWQgIT0gJWQqJWRcbiIsCisJCQlzcmNfbWF4YnVyc3QsCisJCQlzcmNfYWRkcl93aWR0aCwKKwkJCWRzdF9tYXhidXJzdCwKKwkJCWRzdF9hZGRyX3dpZHRoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGNoYW5faXNfbG9naWNhbChkNDBjKSkgewotCQlpZiAoY29uZmlnX21heGJ1cnN0ID49IDE2KQotCQkJcHNpemUgPSBTVEVETUE0MF9QU0laRV9MT0dfMTY7Ci0JCWVsc2UgaWYgKGNvbmZpZ19tYXhidXJzdCA+PSA4KQotCQkJcHNpemUgPSBTVEVETUE0MF9QU0laRV9MT0dfODsKLQkJZWxzZSBpZiAoY29uZmlnX21heGJ1cnN0ID49IDQpCi0JCQlwc2l6ZSA9IFNURURNQTQwX1BTSVpFX0xPR180OwotCQllbHNlCi0JCQlwc2l6ZSA9IFNURURNQTQwX1BTSVpFX0xPR18xOwotCX0gZWxzZSB7Ci0JCWlmIChjb25maWdfbWF4YnVyc3QgPj0gMTYpCi0JCQlwc2l6ZSA9IFNURURNQTQwX1BTSVpFX1BIWV8xNjsKLQkJZWxzZSBpZiAoY29uZmlnX21heGJ1cnN0ID49IDgpCi0JCQlwc2l6ZSA9IFNURURNQTQwX1BTSVpFX1BIWV84OwotCQllbHNlIGlmIChjb25maWdfbWF4YnVyc3QgPj0gNCkKLQkJCXBzaXplID0gU1RFRE1BNDBfUFNJWkVfUEhZXzQ7Ci0JCWVsc2UgaWYgKGNvbmZpZ19tYXhidXJzdCA+PSAyKQotCQkJcHNpemUgPSBTVEVETUE0MF9QU0laRV9QSFlfMjsKLQkJZWxzZQotCQkJcHNpemUgPSBTVEVETUE0MF9QU0laRV9QSFlfMTsKLQl9CisJcmV0ID0gZG1hNDBfY29uZmlnX3RvX2hhbGZjaGFubmVsKGQ0MGMsICZjZmctPnNyY19pbmZvLAorCQkJCQkgIHNyY19hZGRyX3dpZHRoLAorCQkJCQkgIHNyY19tYXhidXJzdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAotCS8qIFNldCB1cCBhbGwgdGhlIGVuZHBvaW50IGNvbmZpZ3MgKi8KLQljZmctPnNyY19pbmZvLmRhdGFfd2lkdGggPSBhZGRyX3dpZHRoOwotCWNmZy0+c3JjX2luZm8ucHNpemUgPSBwc2l6ZTsKLQljZmctPnNyY19pbmZvLmJpZ19lbmRpYW4gPSBmYWxzZTsKLQljZmctPnNyY19pbmZvLmZsb3dfY3RybCA9IFNURURNQTQwX05PX0ZMT1dfQ1RSTDsKLQljZmctPmRzdF9pbmZvLmRhdGFfd2lkdGggPSBhZGRyX3dpZHRoOwotCWNmZy0+ZHN0X2luZm8ucHNpemUgPSBwc2l6ZTsKLQljZmctPmRzdF9pbmZvLmJpZ19lbmRpYW4gPSBmYWxzZTsKLQljZmctPmRzdF9pbmZvLmZsb3dfY3RybCA9IFNURURNQTQwX05PX0ZMT1dfQ1RSTDsKKwlyZXQgPSBkbWE0MF9jb25maWdfdG9faGFsZmNoYW5uZWwoZDQwYywgJmNmZy0+ZHN0X2luZm8sCisJCQkJCSAgZHN0X2FkZHJfd2lkdGgsCisJCQkJCSAgZHN0X21heGJ1cnN0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJLyogRmlsbCBpbiByZWdpc3RlciB2YWx1ZXMgKi8KIAlpZiAoY2hhbl9pc19sb2dpY2FsKGQ0MGMpKQpAQCAtMjI4MiwxMiArMjMzOCwxNCBAQAogCWQ0MGMtPnJ1bnRpbWVfYWRkciA9IGNvbmZpZ19hZGRyOwogCWQ0MGMtPnJ1bnRpbWVfZGlyZWN0aW9uID0gY29uZmlnLT5kaXJlY3Rpb247CiAJZGV2X2RiZyhkNDBjLT5iYXNlLT5kZXYsCi0JCSJjb25maWd1cmVkIGNoYW5uZWwgJXMgZm9yICVzLCBkYXRhIHdpZHRoICVkLCAiCi0JCSJtYXhidXJzdCAlZCBieXRlcywgTEUsIG5vIGZsb3cgY29udHJvbFxuIiwKKwkJImNvbmZpZ3VyZWQgY2hhbm5lbCAlcyBmb3IgJXMsIGRhdGEgd2lkdGggJWQvJWQsICIKKwkJIm1heGJ1cnN0ICVkLyVkIGVsZW1lbnRzLCBMRSwgbm8gZmxvdyBjb250cm9sXG4iLAogCQlkbWFfY2hhbl9uYW1lKGNoYW4pLAogCQkoY29uZmlnLT5kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSA/ICJSWCIgOiAiVFgiLAotCQljb25maWdfYWRkcl93aWR0aCwKLQkJY29uZmlnX21heGJ1cnN0KTsKKwkJc3JjX2FkZHJfd2lkdGgsIGRzdF9hZGRyX3dpZHRoLAorCQlzcmNfbWF4YnVyc3QsIGRzdF9tYXhidXJzdCk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBkNDBfY29udHJvbChzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGVudW0gZG1hX2N0cmxfY21kIGNtZCwKQEAgLTIzMDgsOSArMjM2Niw4IEBACiAJY2FzZSBETUFfUkVTVU1FOgogCQlyZXR1cm4gZDQwX3Jlc3VtZShkNDBjKTsKIAljYXNlIERNQV9TTEFWRV9DT05GSUc6Ci0JCWQ0MF9zZXRfcnVudGltZV9jb25maWcoY2hhbiwKKwkJcmV0dXJuIGQ0MF9zZXRfcnVudGltZV9jb25maWcoY2hhbiwKIAkJCShzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyAqKSBhcmcpOwotCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC0yMzQxLDYgKzIzOTgsNyBAQAogCiAJCUlOSVRfTElTVF9IRUFEKCZkNDBjLT5hY3RpdmUpOwogCQlJTklUX0xJU1RfSEVBRCgmZDQwYy0+cXVldWUpOworCQlJTklUX0xJU1RfSEVBRCgmZDQwYy0+cGVuZGluZ19xdWV1ZSk7CiAJCUlOSVRfTElTVF9IRUFEKCZkNDBjLT5jbGllbnQpOwogCiAJCXRhc2tsZXRfaW5pdCgmZDQwYy0+dGFza2xldCwgZG1hX3Rhc2tsZXQsCkBAIC0yNTAyLDI1ICsyNTYwLDYgQEAKIAogc3RhdGljIHN0cnVjdCBkNDBfYmFzZSAqIF9faW5pdCBkNDBfaHdfZGV0ZWN0X2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IGQ0MF9yZWdfdmFsIGRtYV9pZF9yZWdzW10gPSB7Ci0JCS8qIFBlcmlwaGVyYWwgSWQgKi8KLQkJeyAucmVnID0gRDQwX0RSRUdfUEVSSVBISUQwLCAudmFsID0gMHgwMDQwfSwKLQkJeyAucmVnID0gRDQwX0RSRUdfUEVSSVBISUQxLCAudmFsID0gMHgwMDAwfSwKLQkJLyoKLQkJICogRDQwX0RSRUdfUEVSSVBISUQyIERlcGVuZHMgb24gSFcgcmV2aXNpb246Ci0JCSAqICBEQjg1MDBlZCBoYXMgMHgwMDA4LAotCQkgKiAgPyBoYXMgMHgwMDE4LAotCQkgKiAgREI4NTAwdjEgaGFzIDB4MDAyOAotCQkgKiAgREI4NTAwdjIgaGFzIDB4MDAzOAotCQkgKi8KLQkJeyAucmVnID0gRDQwX0RSRUdfUEVSSVBISUQzLCAudmFsID0gMHgwMDAwfSwKLQotCQkvKiBQQ2VsbCBJZCAqLwotCQl7IC5yZWcgPSBENDBfRFJFR19DRUxMSUQwLCAudmFsID0gMHgwMDBkfSwKLQkJeyAucmVnID0gRDQwX0RSRUdfQ0VMTElEMSwgLnZhbCA9IDB4MDBmMH0sCi0JCXsgLnJlZyA9IEQ0MF9EUkVHX0NFTExJRDIsIC52YWwgPSAweDAwMDV9LAotCQl7IC5yZWcgPSBENDBfRFJFR19DRUxMSUQzLCAudmFsID0gMHgwMGIxfQotCX07CiAJc3RydWN0IHN0ZWRtYTQwX3BsYXRmb3JtX2RhdGEgKnBsYXRfZGF0YTsKIAlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOwogCXZvaWQgX19pb21lbSAqdmlydGJhc2UgPSBOVUxMOwpAQCAtMjUyOSw4ICsyNTY4LDkgQEAKIAlpbnQgbnVtX2xvZ19jaGFucyA9IDA7CiAJaW50IG51bV9waHlfY2hhbnM7CiAJaW50IGk7Ci0JdTMyIHZhbDsKLQl1MzIgcmV2OworCXUzMiBwaWQ7CisJdTMyIGNpZDsKKwl1OCByZXY7CiAKIAljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOwogCkBAIC0yNTU0LDMyICsyNTk0LDMyIEBACiAJaWYgKCF2aXJ0YmFzZSkKIAkJZ290byBmYWlsdXJlOwogCi0JLyogSFcgdmVyc2lvbiBjaGVjayAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRtYV9pZF9yZWdzKTsgaSsrKSB7Ci0JCWlmIChkbWFfaWRfcmVnc1tpXS52YWwgIT0KLQkJICAgIHJlYWRsKHZpcnRiYXNlICsgZG1hX2lkX3JlZ3NbaV0ucmVnKSkgewotCQkJZDQwX2VycigmcGRldi0+ZGV2LAotCQkJCSJVbmtub3duIGhhcmR3YXJlISBFeHBlY3RlZCAweCV4IGF0IDB4JXggYnV0IGdvdCAweCV4XG4iLAotCQkJCWRtYV9pZF9yZWdzW2ldLnZhbCwKLQkJCQlkbWFfaWRfcmVnc1tpXS5yZWcsCi0JCQkJcmVhZGwodmlydGJhc2UgKyBkbWFfaWRfcmVnc1tpXS5yZWcpKTsKLQkJCWdvdG8gZmFpbHVyZTsKLQkJfQotCX0KKwkvKiBUaGlzIGlzIGp1c3QgYSByZWd1bGFyIEFNQkEgUHJpbWVDZWxsIElEIGFjdHVhbGx5ICovCisJZm9yIChwaWQgPSAwLCBpID0gMDsgaSA8IDQ7IGkrKykKKwkJcGlkIHw9IChyZWFkbCh2aXJ0YmFzZSArIHJlc291cmNlX3NpemUocmVzKSAtIDB4MjAgKyA0ICogaSkKKwkJCSYgMjU1KSA8PCAoaSAqIDgpOworCWZvciAoY2lkID0gMCwgaSA9IDA7IGkgPCA0OyBpKyspCisJCWNpZCB8PSAocmVhZGwodmlydGJhc2UgKyByZXNvdXJjZV9zaXplKHJlcykgLSAweDEwICsgNCAqIGkpCisJCQkmIDI1NSkgPDwgKGkgKiA4KTsKIAotCS8qIEdldCBzaWxpY29uIHJldmlzaW9uIGFuZCBkZXNpZ25lciAqLwotCXZhbCA9IHJlYWRsKHZpcnRiYXNlICsgRDQwX0RSRUdfUEVSSVBISUQyKTsKLQotCWlmICgodmFsICYgRDQwX0RSRUdfUEVSSVBISUQyX0RFU0lHTkVSX01BU0spICE9Ci0JICAgIEQ0MF9IV19ERVNJR05FUikgewotCQlkNDBfZXJyKCZwZGV2LT5kZXYsICJVbmtub3duIGRlc2lnbmVyISBHb3QgJXggd2FudGVkICV4XG4iLAotCQkJdmFsICYgRDQwX0RSRUdfUEVSSVBISUQyX0RFU0lHTkVSX01BU0ssCi0JCQlENDBfSFdfREVTSUdORVIpOworCWlmIChjaWQgIT0gQU1CQV9DSUQpIHsKKwkJZDQwX2VycigmcGRldi0+ZGV2LCAiVW5rbm93biBoYXJkd2FyZSEgTm8gUHJpbWVDZWxsIElEXG4iKTsKIAkJZ290byBmYWlsdXJlOwogCX0KLQotCXJldiA9ICh2YWwgJiBENDBfRFJFR19QRVJJUEhJRDJfUkVWX01BU0spID4+Ci0JCUQ0MF9EUkVHX1BFUklQSElEMl9SRVZfUE9TOworCWlmIChBTUJBX01BTkZfQklUUyhwaWQpICE9IEFNQkFfVkVORE9SX1NUKSB7CisJCWQ0MF9lcnIoJnBkZXYtPmRldiwgIlVua25vd24gZGVzaWduZXIhIEdvdCAleCB3YW50ZWQgJXhcbiIsCisJCQlBTUJBX01BTkZfQklUUyhwaWQpLAorCQkJQU1CQV9WRU5ET1JfU1QpOworCQlnb3RvIGZhaWx1cmU7CisJfQorCS8qCisJICogSFcgcmV2aXNpb246CisJICogREI4NTAwZWQgaGFzIHJldmlzaW9uIDAKKwkgKiA/IGhhcyByZXZpc2lvbiAxCisJICogREI4NTAwdjEgaGFzIHJldmlzaW9uIDIKKwkgKiBEQjg1MDB2MiBoYXMgcmV2aXNpb24gMworCSAqLworCXJldiA9IEFNQkFfUkVWX0JJVFMocGlkKTsKIAogCS8qIFRoZSBudW1iZXIgb2YgcGh5c2ljYWwgY2hhbm5lbHMgb24gdGhpcyBIVyAqLwogCW51bV9waHlfY2hhbnMgPSA0ICogKHJlYWRsKHZpcnRiYXNlICsgRDQwX0RSRUdfSUNGRykgJiAweDcpICsgNDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3N0ZV9kbWE0MF9sbC5oIGIvZHJpdmVycy9kbWEvc3RlX2RtYTQwX2xsLmgKaW5kZXggMTk1ZWU2NS4uYjQ0YzQ1NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3N0ZV9kbWE0MF9sbC5oCisrKyBiL2RyaXZlcnMvZG1hL3N0ZV9kbWE0MF9sbC5oCkBAIC0xODQsOSArMTg0LDYgQEAKICNkZWZpbmUgRDQwX0RSRUdfUEVSSVBISUQwCTB4RkUwCiAjZGVmaW5lIEQ0MF9EUkVHX1BFUklQSElEMQkweEZFNAogI2RlZmluZSBENDBfRFJFR19QRVJJUEhJRDIJMHhGRTgKLSNkZWZpbmUgRDQwX0RSRUdfUEVSSVBISUQyX1JFVl9QT1MgNAotI2RlZmluZSBENDBfRFJFR19QRVJJUEhJRDJfUkVWX01BU0sgKDB4ZiA8PCBENDBfRFJFR19QRVJJUEhJRDJfUkVWX1BPUykKLSNkZWZpbmUgRDQwX0RSRUdfUEVSSVBISUQyX0RFU0lHTkVSX01BU0sgMHhmCiAjZGVmaW5lIEQ0MF9EUkVHX1BFUklQSElEMwkweEZFQwogI2RlZmluZSBENDBfRFJFR19DRUxMSUQwCTB4RkYwCiAjZGVmaW5lIEQ0MF9EUkVHX0NFTExJRDEJMHhGRjQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWlzYS9wY2lfZWlzYS5jIGIvZHJpdmVycy9laXNhL3BjaV9laXNhLmMKaW5kZXggMzBkYTcwZC4uY2RhZTIwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9laXNhL3BjaV9laXNhLmMKKysrIGIvZHJpdmVycy9laXNhL3BjaV9laXNhLmMKQEAgLTQ1LDEzICs0NSwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgX19pbml0ZGF0YSBwY2lfZWlzYV9wY2lfdGJsW10gPSB7CitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpX2Vpc2FfcGNpX3RibFtdID0gewogCXsgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKIAkgIFBDSV9DTEFTU19CUklER0VfRUlTQSA8PCA4LCAweGZmZmYwMCwgMCB9LAogCXsgMCwgfQogfTsKIAotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIF9faW5pdGRhdGEgcGNpX2Vpc2FfZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIF9fcmVmZGF0YSBwY2lfZWlzYV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gInBjaV9laXNhIiwKIAkuaWRfdGFibGUJPSBwY2lfZWlzYV9wY2lfdGJsLAogCS5wcm9iZQkJPSBwY2lfZWlzYV9pbml0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZml2YXJzLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaXZhcnMuYwppbmRleCA1ZjI5YWFmLi5lYjgwYjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaXZhcnMuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaXZhcnMuYwpAQCAtNzgsNiArNzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcHN0b3JlLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC04OSw2ICs5MCw4IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfVkVSU0lPTihFRklWQVJTX1ZFUlNJT04pOwogCisjZGVmaW5lIERVTVBfTkFNRV9MRU4gNTIKKwogLyoKICAqIFRoZSBtYXhpbXVtIHNpemUgb2YgVmFyaWFibGVOYW1lICsgRGF0YSA9IDEwMjQKICAqIFRoZXJlZm9yZSwgaXQncyByZWFzb25hYmxlIHRvIHNhdmUgdGhhdCBtdWNoCkBAIC0xMTksNiArMTIyLDEwIEBACiAJc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOwogfTsKIAorI2RlZmluZSBQU1RPUkVfRUZJX0FUVFJJQlVURVMgXAorCShFRklfVkFSSUFCTEVfTk9OX1ZPTEFUSUxFIHwgXAorCSBFRklfVkFSSUFCTEVfQk9PVFNFUlZJQ0VfQUNDRVNTIHwgXAorCSBFRklfVkFSSUFCTEVfUlVOVElNRV9BQ0NFU1MpCiAKICNkZWZpbmUgRUZJVkFSX0FUVFIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlKSBcCiBzdHJ1Y3QgZWZpdmFyX2F0dHJpYnV0ZSBlZml2YXJfYXR0cl8jI19uYW1lID0geyBcCkBAIC0xNDEsMjMgKzE0OCw2MSBAQAogCiAvKiBSZXR1cm4gdGhlIG51bWJlciBvZiB1bmljb2RlIGNoYXJhY3RlcnMgaW4gZGF0YSAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcKLXV0Zjhfc3RybGVuKGVmaV9jaGFyMTZfdCAqZGF0YSwgdW5zaWduZWQgbG9uZyBtYXhsZW5ndGgpCit1dGYxNl9zdHJubGVuKGVmaV9jaGFyMTZfdCAqcywgc2l6ZV90IG1heGxlbmd0aCkKIHsKIAl1bnNpZ25lZCBsb25nIGxlbmd0aCA9IDA7CiAKLQl3aGlsZSAoKmRhdGErKyAhPSAwICYmIGxlbmd0aCA8IG1heGxlbmd0aCkKKwl3aGlsZSAoKnMrKyAhPSAwICYmIGxlbmd0aCA8IG1heGxlbmd0aCkKIAkJbGVuZ3RoKys7CiAJcmV0dXJuIGxlbmd0aDsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCit1dGYxNl9zdHJsZW4oZWZpX2NoYXIxNl90ICpzKQoreworCXJldHVybiB1dGYxNl9zdHJubGVuKHMsIH4wVUwpOworfQorCiAvKgogICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaXMgdGhlIGxlbmd0aCBvZiB0aGlzIHN0cmluZwogICogTm90ZTogdGhpcyBpcyBOT1QgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiB1bmljb2RlIGNoYXJhY3RlcnMKICAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi11dGY4X3N0cnNpemUoZWZpX2NoYXIxNl90ICpkYXRhLCB1bnNpZ25lZCBsb25nIG1heGxlbmd0aCkKK3V0ZjE2X3N0cnNpemUoZWZpX2NoYXIxNl90ICpkYXRhLCB1bnNpZ25lZCBsb25nIG1heGxlbmd0aCkKIHsKLQlyZXR1cm4gdXRmOF9zdHJsZW4oZGF0YSwgbWF4bGVuZ3RoL3NpemVvZihlZmlfY2hhcjE2X3QpKSAqIHNpemVvZihlZmlfY2hhcjE2X3QpOworCXJldHVybiB1dGYxNl9zdHJubGVuKGRhdGEsIG1heGxlbmd0aC9zaXplb2YoZWZpX2NoYXIxNl90KSkgKiBzaXplb2YoZWZpX2NoYXIxNl90KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3V0ZjE2X3N0cm5jbXAoY29uc3QgZWZpX2NoYXIxNl90ICphLCBjb25zdCBlZmlfY2hhcjE2X3QgKmIsIHNpemVfdCBsZW4pCit7CisJd2hpbGUgKDEpIHsKKwkJaWYgKGxlbiA9PSAwKQorCQkJcmV0dXJuIDA7CisJCWlmICgqYSA8ICpiKQorCQkJcmV0dXJuIC0xOworCQlpZiAoKmEgPiAqYikKKwkJCXJldHVybiAxOworCQlpZiAoKmEgPT0gMCkgLyogaW1wbGllcyAqYiA9PSAwICovCisJCQlyZXR1cm4gMDsKKwkJYSsrOworCQliKys7CisJCWxlbi0tOworCX0KK30KKworc3RhdGljIGVmaV9zdGF0dXNfdAorZ2V0X3Zhcl9kYXRhX2xvY2tlZChzdHJ1Y3QgZWZpdmFycyAqZWZpdmFycywgc3RydWN0IGVmaV92YXJpYWJsZSAqdmFyKQoreworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisKKwl2YXItPkRhdGFTaXplID0gMTAyNDsKKwlzdGF0dXMgPSBlZml2YXJzLT5vcHMtPmdldF92YXJpYWJsZSh2YXItPlZhcmlhYmxlTmFtZSwKKwkJCQkJICAgICZ2YXItPlZlbmRvckd1aWQsCisJCQkJCSAgICAmdmFyLT5BdHRyaWJ1dGVzLAorCQkJCQkgICAgJnZhci0+RGF0YVNpemUsCisJCQkJCSAgICB2YXItPkRhdGEpOworCXJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXRpYyBlZmlfc3RhdHVzX3QKQEAgLTE2NiwxMyArMjExLDkgQEAKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCiAJc3Bpbl9sb2NrKCZlZml2YXJzLT5sb2NrKTsKLQl2YXItPkRhdGFTaXplID0gMTAyNDsKLQlzdGF0dXMgPSBlZml2YXJzLT5vcHMtPmdldF92YXJpYWJsZSh2YXItPlZhcmlhYmxlTmFtZSwKLQkJCQkJICAgICZ2YXItPlZlbmRvckd1aWQsCi0JCQkJCSAgICAmdmFyLT5BdHRyaWJ1dGVzLAotCQkJCQkgICAgJnZhci0+RGF0YVNpemUsCi0JCQkJCSAgICB2YXItPkRhdGEpOworCXN0YXR1cyA9IGdldF92YXJfZGF0YV9sb2NrZWQoZWZpdmFycywgdmFyKTsKIAlzcGluX3VubG9jaygmZWZpdmFycy0+bG9jayk7CisKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImVmaXZhcnM6IGdldF92YXJpYWJsZSgpIGZhaWxlZCAweCVseCFcbiIsCiAJCQlzdGF0dXMpOwpAQCAtMzg3LDEyICs0MjgsMTgwIEBACiAJLmRlZmF1bHRfYXR0cnMgPSBkZWZfYXR0cnMsCiB9OwogCitzdGF0aWMgc3RydWN0IHBzdG9yZV9pbmZvIGVmaV9wc3RvcmVfaW5mbzsKKwogc3RhdGljIGlubGluZSB2b2lkCiBlZml2YXJfdW5yZWdpc3RlcihzdHJ1Y3QgZWZpdmFyX2VudHJ5ICp2YXIpCiB7CiAJa29iamVjdF9wdXQoJnZhci0+a29iaik7CiB9CiAKKyNpZmRlZiBDT05GSUdfUFNUT1JFCisKK3N0YXRpYyBpbnQgZWZpX3BzdG9yZV9vcGVuKHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQoreworCXN0cnVjdCBlZml2YXJzICplZml2YXJzID0gcHNpLT5kYXRhOworCisJc3Bpbl9sb2NrKCZlZml2YXJzLT5sb2NrKTsKKwllZml2YXJzLT53YWxrX2VudHJ5ID0gbGlzdF9maXJzdF9lbnRyeSgmZWZpdmFycy0+bGlzdCwKKwkJCQkJICAgICAgIHN0cnVjdCBlZml2YXJfZW50cnksIGxpc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVmaV9wc3RvcmVfY2xvc2Uoc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpCit7CisJc3RydWN0IGVmaXZhcnMgKmVmaXZhcnMgPSBwc2ktPmRhdGE7CisKKwlzcGluX3VubG9jaygmZWZpdmFycy0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVmaV9wc3RvcmVfcmVhZCh1NjQgKmlkLCBlbnVtIHBzdG9yZV90eXBlX2lkICp0eXBlLAorCQkJICAgICAgIHN0cnVjdCB0aW1lc3BlYyAqdGltZXNwZWMsIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQoreworCWVmaV9ndWlkX3QgdmVuZG9yID0gTElOVVhfRUZJX0NSQVNIX0dVSUQ7CisJc3RydWN0IGVmaXZhcnMgKmVmaXZhcnMgPSBwc2ktPmRhdGE7CisJY2hhciBuYW1lW0RVTVBfTkFNRV9MRU5dOworCWludCBpOworCXVuc2lnbmVkIGludCBwYXJ0LCBzaXplOworCXVuc2lnbmVkIGxvbmcgdGltZTsKKworCXdoaWxlICgmZWZpdmFycy0+d2Fsa19lbnRyeS0+bGlzdCAhPSAmZWZpdmFycy0+bGlzdCkgeworCQlpZiAoIWVmaV9ndWlkY21wKGVmaXZhcnMtPndhbGtfZW50cnktPnZhci5WZW5kb3JHdWlkLAorCQkJCSB2ZW5kb3IpKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgRFVNUF9OQU1FX0xFTjsgaSsrKSB7CisJCQkJbmFtZVtpXSA9IGVmaXZhcnMtPndhbGtfZW50cnktPnZhci5WYXJpYWJsZU5hbWVbaV07CisJCQl9CisJCQlpZiAoc3NjYW5mKG5hbWUsICJkdW1wLXR5cGUldS0ldS0lbHUiLCB0eXBlLCAmcGFydCwgJnRpbWUpID09IDMpIHsKKwkJCQkqaWQgPSBwYXJ0OworCQkJCXRpbWVzcGVjLT50dl9zZWMgPSB0aW1lOworCQkJCXRpbWVzcGVjLT50dl9uc2VjID0gMDsKKwkJCQlnZXRfdmFyX2RhdGFfbG9ja2VkKGVmaXZhcnMsICZlZml2YXJzLT53YWxrX2VudHJ5LT52YXIpOworCQkJCXNpemUgPSBlZml2YXJzLT53YWxrX2VudHJ5LT52YXIuRGF0YVNpemU7CisJCQkJbWVtY3B5KHBzaS0+YnVmLCBlZml2YXJzLT53YWxrX2VudHJ5LT52YXIuRGF0YSwgc2l6ZSk7CisJCQkJZWZpdmFycy0+d2Fsa19lbnRyeSA9IGxpc3RfZW50cnkoZWZpdmFycy0+d2Fsa19lbnRyeS0+bGlzdC5uZXh0LAorCQkJCQkgICAgICAgICAgIHN0cnVjdCBlZml2YXJfZW50cnksIGxpc3QpOworCQkJCXJldHVybiBzaXplOworCQkJfQorCQl9CisJCWVmaXZhcnMtPndhbGtfZW50cnkgPSBsaXN0X2VudHJ5KGVmaXZhcnMtPndhbGtfZW50cnktPmxpc3QubmV4dCwKKwkJCQkJCSBzdHJ1Y3QgZWZpdmFyX2VudHJ5LCBsaXN0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1NjQgZWZpX3BzdG9yZV93cml0ZShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHVuc2lnbmVkIGludCBwYXJ0LAorCQkJICAgIHNpemVfdCBzaXplLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSkKK3sKKwljaGFyIG5hbWVbRFVNUF9OQU1FX0xFTl07CisJY2hhciBzdHViX25hbWVbRFVNUF9OQU1FX0xFTl07CisJZWZpX2NoYXIxNl90IGVmaV9uYW1lW0RVTVBfTkFNRV9MRU5dOworCWVmaV9ndWlkX3QgdmVuZG9yID0gTElOVVhfRUZJX0NSQVNIX0dVSUQ7CisJc3RydWN0IGVmaXZhcnMgKmVmaXZhcnMgPSBwc2ktPmRhdGE7CisJc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnksICpmb3VuZCA9IE5VTEw7CisJaW50IGk7CisKKwlzcHJpbnRmKHN0dWJfbmFtZSwgImR1bXAtdHlwZSV1LSV1LSIsIHR5cGUsIHBhcnQpOworCXNwcmludGYobmFtZSwgIiVzJWx1Iiwgc3R1Yl9uYW1lLCBnZXRfc2Vjb25kcygpKTsKKworCXNwaW5fbG9jaygmZWZpdmFycy0+bG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRFVNUF9OQU1FX0xFTjsgaSsrKQorCQllZmlfbmFtZVtpXSA9IHN0dWJfbmFtZVtpXTsKKworCS8qCisJICogQ2xlYW4gdXAgYW55IGVudHJpZXMgd2l0aCB0aGUgc2FtZSBuYW1lCisJICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmZWZpdmFycy0+bGlzdCwgbGlzdCkgeworCQlnZXRfdmFyX2RhdGFfbG9ja2VkKGVmaXZhcnMsICZlbnRyeS0+dmFyKTsKKworCQlpZiAoZWZpX2d1aWRjbXAoZW50cnktPnZhci5WZW5kb3JHdWlkLCB2ZW5kb3IpKQorCQkJY29udGludWU7CisJCWlmICh1dGYxNl9zdHJuY21wKGVudHJ5LT52YXIuVmFyaWFibGVOYW1lLCBlZmlfbmFtZSwKKwkJCQkgIHV0ZjE2X3N0cmxlbihlZmlfbmFtZSkpKQorCQkJY29udGludWU7CisJCS8qIE5lZWRzIHRvIGJlIGEgcHJlZml4ICovCisJCWlmIChlbnRyeS0+dmFyLlZhcmlhYmxlTmFtZVt1dGYxNl9zdHJsZW4oZWZpX25hbWUpXSA9PSAwKQorCQkJY29udGludWU7CisKKwkJLyogZm91bmQgKi8KKwkJZm91bmQgPSBlbnRyeTsKKwkJZWZpdmFycy0+b3BzLT5zZXRfdmFyaWFibGUoZW50cnktPnZhci5WYXJpYWJsZU5hbWUsCisJCQkJCSAgICZlbnRyeS0+dmFyLlZlbmRvckd1aWQsCisJCQkJCSAgIFBTVE9SRV9FRklfQVRUUklCVVRFUywKKwkJCQkJICAgMCwgTlVMTCk7CisJfQorCisJaWYgKGZvdW5kKQorCQlsaXN0X2RlbCgmZm91bmQtPmxpc3QpOworCisJZm9yIChpID0gMDsgaSA8IERVTVBfTkFNRV9MRU47IGkrKykKKwkJZWZpX25hbWVbaV0gPSBuYW1lW2ldOworCisJZWZpdmFycy0+b3BzLT5zZXRfdmFyaWFibGUoZWZpX25hbWUsICZ2ZW5kb3IsIFBTVE9SRV9FRklfQVRUUklCVVRFUywKKwkJCQkgICBzaXplLCBwc2ktPmJ1Zik7CisKKwlzcGluX3VubG9jaygmZWZpdmFycy0+bG9jayk7CisKKwlpZiAoZm91bmQpCisJCWVmaXZhcl91bnJlZ2lzdGVyKGZvdW5kKTsKKworCWlmIChzaXplKQorCQllZml2YXJfY3JlYXRlX3N5c2ZzX2VudHJ5KGVmaXZhcnMsCisJCQkJCSAgdXRmMTZfc3Ryc2l6ZShlZmlfbmFtZSwKKwkJCQkJCQlEVU1QX05BTUVfTEVOICogMiksCisJCQkJCSAgZWZpX25hbWUsICZ2ZW5kb3IpOworCisJcmV0dXJuIHBhcnQ7Cit9OworCitzdGF0aWMgaW50IGVmaV9wc3RvcmVfZXJhc2UoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1NjQgaWQsCisJCQkgICAgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpCit7CisJZWZpX3BzdG9yZV93cml0ZSh0eXBlLCBpZCwgMCwgcHNpKTsKKworCXJldHVybiAwOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgZWZpX3BzdG9yZV9vcGVuKHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVmaV9wc3RvcmVfY2xvc2Uoc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVmaV9wc3RvcmVfcmVhZCh1NjQgKmlkLCBlbnVtIHBzdG9yZV90eXBlX2lkICp0eXBlLAorCQkJICAgICAgIHN0cnVjdCB0aW1lc3BlYyAqdGltZSwgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpCit7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdTY0IGVmaV9wc3RvcmVfd3JpdGUoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1bnNpZ25lZCBpbnQgcGFydCwKKwkJCSAgICBzaXplX3Qgc2l6ZSwgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZWZpX3BzdG9yZV9lcmFzZShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHU2NCBpZCwKKwkJCSAgICBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBzdG9yZV9pbmZvIGVmaV9wc3RvcmVfaW5mbyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImVmaSIsCisJLm9wZW4JCT0gZWZpX3BzdG9yZV9vcGVuLAorCS5jbG9zZQkJPSBlZmlfcHN0b3JlX2Nsb3NlLAorCS5yZWFkCQk9IGVmaV9wc3RvcmVfcmVhZCwKKwkud3JpdGUJCT0gZWZpX3BzdG9yZV93cml0ZSwKKwkuZXJhc2UJCT0gZWZpX3BzdG9yZV9lcmFzZSwKK307CiAKIHN0YXRpYyBzc2l6ZV90IGVmaXZhcl9jcmVhdGUoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQkJICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYmluX2F0dHIsCkBAIC00MTQsOCArNjIzLDggQEAKIAkgKiBEb2VzIHRoaXMgdmFyaWFibGUgYWxyZWFkeSBleGlzdD8KIAkgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2VhcmNoX2VmaXZhciwgbiwgJmVmaXZhcnMtPmxpc3QsIGxpc3QpIHsKLQkJc3Ryc2l6ZTEgPSB1dGY4X3N0cnNpemUoc2VhcmNoX2VmaXZhci0+dmFyLlZhcmlhYmxlTmFtZSwgMTAyNCk7Ci0JCXN0cnNpemUyID0gdXRmOF9zdHJzaXplKG5ld192YXItPlZhcmlhYmxlTmFtZSwgMTAyNCk7CisJCXN0cnNpemUxID0gdXRmMTZfc3Ryc2l6ZShzZWFyY2hfZWZpdmFyLT52YXIuVmFyaWFibGVOYW1lLCAxMDI0KTsKKwkJc3Ryc2l6ZTIgPSB1dGYxNl9zdHJzaXplKG5ld192YXItPlZhcmlhYmxlTmFtZSwgMTAyNCk7CiAJCWlmIChzdHJzaXplMSA9PSBzdHJzaXplMiAmJgogCQkJIW1lbWNtcCgmKHNlYXJjaF9lZml2YXItPnZhci5WYXJpYWJsZU5hbWUpLAogCQkJCW5ld192YXItPlZhcmlhYmxlTmFtZSwgc3Ryc2l6ZTEpICYmCkBAIC00NDcsOCArNjU2LDggQEAKIAogCS8qIENyZWF0ZSB0aGUgZW50cnkgaW4gc3lzZnMuICBMb2NraW5nIGlzIG5vdCByZXF1aXJlZCBoZXJlICovCiAJc3RhdHVzID0gZWZpdmFyX2NyZWF0ZV9zeXNmc19lbnRyeShlZml2YXJzLAotCQkJCQkgICB1dGY4X3N0cnNpemUobmV3X3Zhci0+VmFyaWFibGVOYW1lLAotCQkJCQkJCTEwMjQpLAorCQkJCQkgICB1dGYxNl9zdHJzaXplKG5ld192YXItPlZhcmlhYmxlTmFtZSwKKwkJCQkJCQkgMTAyNCksCiAJCQkJCSAgIG5ld192YXItPlZhcmlhYmxlTmFtZSwKIAkJCQkJICAgJm5ld192YXItPlZlbmRvckd1aWQpOwogCWlmIChzdGF0dXMpIHsKQEAgLTQ3Nyw4ICs2ODYsOCBAQAogCSAqIERvZXMgdGhpcyB2YXJpYWJsZSBhbHJlYWR5IGV4aXN0PwogCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzZWFyY2hfZWZpdmFyLCBuLCAmZWZpdmFycy0+bGlzdCwgbGlzdCkgewotCQlzdHJzaXplMSA9IHV0Zjhfc3Ryc2l6ZShzZWFyY2hfZWZpdmFyLT52YXIuVmFyaWFibGVOYW1lLCAxMDI0KTsKLQkJc3Ryc2l6ZTIgPSB1dGY4X3N0cnNpemUoZGVsX3Zhci0+VmFyaWFibGVOYW1lLCAxMDI0KTsKKwkJc3Ryc2l6ZTEgPSB1dGYxNl9zdHJzaXplKHNlYXJjaF9lZml2YXItPnZhci5WYXJpYWJsZU5hbWUsIDEwMjQpOworCQlzdHJzaXplMiA9IHV0ZjE2X3N0cnNpemUoZGVsX3Zhci0+VmFyaWFibGVOYW1lLCAxMDI0KTsKIAkJaWYgKHN0cnNpemUxID09IHN0cnNpemUyICYmCiAJCQkhbWVtY21wKCYoc2VhcmNoX2VmaXZhci0+dmFyLlZhcmlhYmxlTmFtZSksCiAJCQkJZGVsX3Zhci0+VmFyaWFibGVOYW1lLCBzdHJzaXplMSkgJiYKQEAgLTc2Myw2ICs5NzIsMTYgQEAKIAlpZiAoZXJyb3IpCiAJCXVucmVnaXN0ZXJfZWZpdmFycyhlZml2YXJzKTsKIAorCWVmaXZhcnMtPmVmaV9wc3RvcmVfaW5mbyA9IGVmaV9wc3RvcmVfaW5mbzsKKworCWVmaXZhcnMtPmVmaV9wc3RvcmVfaW5mby5idWYgPSBrbWFsbG9jKDQwOTYsIEdGUF9LRVJORUwpOworCWlmIChlZml2YXJzLT5lZmlfcHN0b3JlX2luZm8uYnVmKSB7CisJCWVmaXZhcnMtPmVmaV9wc3RvcmVfaW5mby5idWZzaXplID0gMTAyNDsKKwkJZWZpdmFycy0+ZWZpX3BzdG9yZV9pbmZvLmRhdGEgPSBlZml2YXJzOworCQltdXRleF9pbml0KCZlZml2YXJzLT5lZmlfcHN0b3JlX2luZm8uYnVmX211dGV4KTsKKwkJcHN0b3JlX3JlZ2lzdGVyKCZlZml2YXJzLT5lZmlfcHN0b3JlX2luZm8pOworCX0KKwogb3V0OgogCWtmcmVlKHZhcmlhYmxlX25hbWUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vS2NvbmZpZyBiL2RyaXZlcnMvZ3Bpby9LY29uZmlnCmluZGV4IDM2MzQ5ODYuLmQ1MzllZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3Bpby9LY29uZmlnCkBAIC0xMDMsNiArMTAzLDIyIEBACiAJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gUFBDX01QQzUyeHgKIAorY29uZmlnIEdQSU9fTVNNX1YxCisJdHJpc3RhdGUgIlF1YWxjb21tIE1TTSBHUElPIHYxIgorCWRlcGVuZHMgb24gR1BJT0xJQiAmJiBBUkNIX01TTQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBzdXBwb3J0IHRoZSBHUElPIGludGVyZmFjZSBvbiBBUk0gdjYgYmFzZWQKKwkgIFF1YWxjb21tIE1TTSBjaGlwcy4gIE1vc3Qgb2YgdGhlIHBpbnMgb24gdGhlIE1TTSBjYW4gYmUKKwkgIHNlbGVjdGVkIGZvciBHUElPLCBhbmQgYXJlIGNvbnRyb2xsZWQgYnkgdGhpcyBkcml2ZXIuCisKK2NvbmZpZyBHUElPX01TTV9WMgorCXRyaXN0YXRlICJRdWFsY29tbSBNU00gR1BJTyB2MiIKKwlkZXBlbmRzIG9uIEdQSU9MSUIgJiYgQVJDSF9NU00KKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gc3VwcG9ydCB0aGUgR1BJTyBpbnRlcmZhY2Ugb24gQVJNIHY3IGJhc2VkCisJICBRdWFsY29tbSBNU00gY2hpcHMuICBNb3N0IG9mIHRoZSBwaW5zIG9uIHRoZSBNU00gY2FuIGJlCisJICBzZWxlY3RlZCBmb3IgR1BJTywgYW5kIGFyZSBjb250cm9sbGVkIGJ5IHRoaXMgZHJpdmVyLgorCiBjb25maWcgR1BJT19NWEMKIAlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiBBUkNIX01YQwpAQCAtMjgwLDYgKzI5NiwxMiBAQAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBHUElPcyBmb3VuZCBvbiB0aGUgVEMzNTg5WAogCSAgSS9PIEV4cGFuZGVyLgogCitjb25maWcgR1BJT19UUFM2NTkxMgorCXRyaXN0YXRlICJUSSBUUFM2NTkxMiBHUElPIgorCWRlcGVuZHMgb24gKE1GRF9UUFM2NTkxMl9JMkMgfHwgTUZEX1RQUzY1OTEyX1NQSSkKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBUUFM2NTkxMiBncGlvIGNoaXAKKwogY29uZmlnIEdQSU9fVFdMNDAzMAogCXRyaXN0YXRlICJUV0w0MDMwLCBUV0w1MDMwLCBhbmQgVFBTNjU5eDAgR1BJT3MiCiAJZGVwZW5kcyBvbiBUV0w0MDMwX0NPUkUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9NYWtlZmlsZSBiL2RyaXZlcnMvZ3Bpby9NYWtlZmlsZQppbmRleCA3MjA3MTEyLi45NTg4OTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncGlvL01ha2VmaWxlCkBAIC0yNyw2ICsyNyw4IEBACiBvYmotJChDT05GSUdfR1BJT19NQ1AyM1MwOCkJKz0gZ3Bpby1tY3AyM3MwOC5vCiBvYmotJChDT05GSUdfR1BJT19NTF9JT0gpCSs9IGdwaW8tbWwtaW9oLm8KIG9iai0kKENPTkZJR19HUElPX01QQzUyMDApCSs9IGdwaW8tbXBjNTIwMC5vCitvYmotJChDT05GSUdfR1BJT19NU01fVjEpCSs9IGdwaW8tbXNtLXYxLm8KK29iai0kKENPTkZJR19HUElPX01TTV9WMikJKz0gZ3Bpby1tc20tdjIubwogb2JqLSQoQ09ORklHX0dQSU9fTVhDKQkJKz0gZ3Bpby1teGMubwogb2JqLSQoQ09ORklHX0dQSU9fTVhTKQkJKz0gZ3Bpby1teHMubwogb2JqLSQoQ09ORklHX1BMQVRfTk9NQURJSykJKz0gZ3Bpby1ub21hZGlrLm8KQEAgLTQ4LDYgKzUwLDcgQEAKIG9iai0kKENPTkZJR19BUkNIX1RFR1JBKQkrPSBncGlvLXRlZ3JhLm8KIG9iai0kKENPTkZJR19HUElPX1RJTUJFUkRBTEUpCSs9IGdwaW8tdGltYmVyZGFsZS5vCiBvYmotJChDT05GSUdfR1BJT19UUFM2NTkxMCkJKz0gZ3Bpby10cHM2NTkxMC5vCitvYmotJChDT05GSUdfR1BJT19UUFM2NTkxMikJKz0gZ3Bpby10cHM2NTkxMi5vCiBvYmotJChDT05GSUdfR1BJT19UV0w0MDMwKQkrPSBncGlvLXR3bDQwMzAubwogb2JqLSQoQ09ORklHX01BQ0hfVTMwMCkJCSs9IGdwaW8tdTMwMC5vCiBvYmotJChDT05GSUdfR1BJT19VQ0IxNDAwKQkrPSBncGlvLXVjYjE0MDAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tYWI4NTAwLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1hYjg1MDAuYwppbmRleCBlZDc5NWU2Li4wNTBjMDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1hYjg1MDAuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1hYjg1MDAuYwpAQCAtNTE2LDUgKzUxNiw1IEBACiAKIE1PRFVMRV9BVVRIT1IoIkJJQkVLIEJBU1UgPGJpYmVrLmJhc3VAc3Rlcmljc3Nvbi5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBhbGxvd3MgdG8gdXNlIEFCODUwMCB1bnVzZWQgcGlucyB0byBiZSB1c2VkIGFzIEdQSU8iKTsKLU1PRFVMRV9BTElBUygiQUI4NTAwIEdQSU8gZHJpdmVyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmFiODUwMC1ncGlvIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1tc20tdjEuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1zbS12MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYTRkNDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tc20tdjEuYwpAQCAtMCwwICsxLDYzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBHb29nbGUsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bWFjaC9jcHUuaD4KKyNpbmNsdWRlIDxtYWNoL21zbV9ncGlvbXV4Lmg+CisjaW5jbHVkZSA8bWFjaC9tc21faW9tYXAuaD4KKworLyogc2VlIDgwLVZBNzM2LTIgUmV2IEMgcHAgNjk1LTc1MQorKioKKyoqIFRoZXNlIGFyZSBhY3R1YWxseSB0aGUgKnNoYWRvdyogZ3BpbyByZWdpc3RlcnMsIHNpbmNlIHRoZQorKiogcmVhbCBvbmVzICh3aGljaCBhbGxvdyBmdWxsIGFjY2VzcykgYXJlIG9ubHkgYXZhaWxhYmxlIHRvIHRoZQorKiogQVJNOSBzaWRlIG9mIHRoZSB3b3JsZC4KKyoqCisqKiBTaW5jZSB0aGUgX0JBU0UgbmVlZCB0byBiZSBwYWdlLWFsaWduZWQgd2hlbiB3ZSdyZSBtYXBwaW5nIHRoZW0KKyoqIHRvIHZpcnR1YWwgYWRkcmVzc2VzLCBhZGp1c3QgZm9yIHRoZSBhZGRpdGlvbmFsIG9mZnNldCBpbiB0aGVzZQorKiogbWFjcm9zLgorKi8KKworI2RlZmluZSBNU01fR1BJTzFfUkVHKG9mZikgKE1TTV9HUElPMV9CQVNFICsgKG9mZikpCisjZGVmaW5lIE1TTV9HUElPMl9SRUcob2ZmKSAoTVNNX0dQSU8yX0JBU0UgKyAweDQwMCArIChvZmYpKQorI2RlZmluZSBNU01fR1BJTzFfU0hBRE9XX1JFRyhvZmYpIChNU01fR1BJTzFfQkFTRSArIDB4ODAwICsgKG9mZikpCisjZGVmaW5lIE1TTV9HUElPMl9TSEFET1dfUkVHKG9mZikgKE1TTV9HUElPMl9CQVNFICsgMHhDMDAgKyAob2ZmKSkKKworLyoKKyAqIE1TTTdYMDAgcmVnaXN0ZXJzCisgKi8KKy8qIG91dHB1dCB2YWx1ZSAqLworI2RlZmluZSBNU003WDAwX0dQSU9fT1VUXzAJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgwMCkgIC8qIGdwaW8gIDE1LTAgICovCisjZGVmaW5lIE1TTTdYMDBfR1BJT19PVVRfMQlNU01fR1BJTzJfU0hBRE9XX1JFRygweDAwKSAgLyogZ3BpbyAgNDItMTYgKi8KKyNkZWZpbmUgTVNNN1gwMF9HUElPX09VVF8yCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4MDQpICAvKiBncGlvICA2Ny00MyAqLworI2RlZmluZSBNU003WDAwX0dQSU9fT1VUXzMJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgwOCkgIC8qIGdwaW8gIDk0LTY4ICovCisjZGVmaW5lIE1TTTdYMDBfR1BJT19PVVRfNAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDBDKSAgLyogZ3BpbyAxMDYtOTUgKi8KKyNkZWZpbmUgTVNNN1gwMF9HUElPX09VVF81CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NTApICAvKiBncGlvIDEwNy0xMjEgKi8KKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBvdXRwdXQgZW5hYmxlICovCisjZGVmaW5lIE1TTTdYMDBfR1BJT19PRV8wCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4MTApCisjZGVmaW5lIE1TTTdYMDBfR1BJT19PRV8xCU1TTV9HUElPMl9TSEFET1dfUkVHKDB4MDgpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19PRV8yCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4MTQpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19PRV8zCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4MTgpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19PRV80CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4MUMpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19PRV81CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NTQpCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgaW5wdXQgcmVhZCAqLworI2RlZmluZSBNU003WDAwX0dQSU9fSU5fMAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDM0KQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5fMQlNU01fR1BJTzJfU0hBRE9XX1JFRygweDIwKQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5fMglNU01fR1BJTzFfU0hBRE9XX1JFRygweDM4KQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5fMwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDNDKQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5fNAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDQwKQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5fNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweDQ0KQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIDE9ZWRnZSAwPWxldmVsIGludGVycnVwICovCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfRURHRV8wCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NjApCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfRURHRV8xCU1TTV9HUElPMl9TSEFET1dfUkVHKDB4NTApCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfRURHRV8yCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NjQpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfRURHRV8zCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NjgpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfRURHRV80CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NkMpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfRURHRV81CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4QzApCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgMT1wb3NpdGl2ZSAwPW5lZ2F0aXZlICovCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfUE9TXzAJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg3MCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9QT1NfMQlNU01fR1BJTzJfU0hBRE9XX1JFRygweDU4KQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX1BPU18yCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NzQpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfUE9TXzMJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg3OCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9QT1NfNAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDdDKQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX1BPU181CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4QkMpCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX0VOXzAJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg4MCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9FTl8xCU1TTV9HUElPMl9TSEFET1dfUkVHKDB4NjApCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfRU5fMglNU01fR1BJTzFfU0hBRE9XX1JFRygweDg0KQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX0VOXzMJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg4OCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9FTl80CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4OEMpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfRU5fNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweEI4KQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIHdyaXRlIDEgdG8gY2xlYXIgaW50ZXJydXB0ICovCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfQ0xFQVJfMAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDkwKQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX0NMRUFSXzEJTVNNX0dQSU8yX1NIQURPV19SRUcoMHg2OCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9DTEVBUl8yCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4OTQpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfQ0xFQVJfMwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDk4KQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX0NMRUFSXzQJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg5QykKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9DTEVBUl81CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4QjQpCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgMT1pbnRlcnJ1cHQgcGVuZGluZyAqLworI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX1NUQVRVU18wCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4QTApCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfU1RBVFVTXzEJTVNNX0dQSU8yX1NIQURPV19SRUcoMHg3MCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9TVEFUVVNfMglNU01fR1BJTzFfU0hBRE9XX1JFRygweEE0KQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX1NUQVRVU18zCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4QTgpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfU1RBVFVTXzQJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhBQykKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9TVEFUVVNfNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweEIwKQorCisvKgorICogUVNEOFg1MCByZWdpc3RlcnMKKyAqLworLyogb3V0cHV0IHZhbHVlICovCisjZGVmaW5lIFFTRDhYNTBfR1BJT19PVVRfMAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDAwKSAgLyogZ3BpbyAgMTUtMCAgICovCisjZGVmaW5lIFFTRDhYNTBfR1BJT19PVVRfMQlNU01fR1BJTzJfU0hBRE9XX1JFRygweDAwKSAgLyogZ3BpbyAgNDItMTYgICovCisjZGVmaW5lIFFTRDhYNTBfR1BJT19PVVRfMglNU01fR1BJTzFfU0hBRE9XX1JFRygweDA0KSAgLyogZ3BpbyAgNjctNDMgICovCisjZGVmaW5lIFFTRDhYNTBfR1BJT19PVVRfMwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDA4KSAgLyogZ3BpbyAgOTQtNjggICovCisjZGVmaW5lIFFTRDhYNTBfR1BJT19PVVRfNAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDBDKSAgLyogZ3BpbyAxMDMtOTUgICovCisjZGVmaW5lIFFTRDhYNTBfR1BJT19PVVRfNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweDEwKSAgLyogZ3BpbyAxMjEtMTA0ICovCisjZGVmaW5lIFFTRDhYNTBfR1BJT19PVVRfNglNU01fR1BJTzFfU0hBRE9XX1JFRygweDE0KSAgLyogZ3BpbyAxNTItMTIyICovCisjZGVmaW5lIFFTRDhYNTBfR1BJT19PVVRfNwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDE4KSAgLyogZ3BpbyAxNjQtMTUzICovCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgb3V0cHV0IGVuYWJsZSAqLworI2RlZmluZSBRU0Q4WDUwX0dQSU9fT0VfMAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDIwKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fT0VfMQlNU01fR1BJTzJfU0hBRE9XX1JFRygweDA4KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fT0VfMglNU01fR1BJTzFfU0hBRE9XX1JFRygweDI0KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fT0VfMwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDI4KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fT0VfNAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDJDKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fT0VfNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweDMwKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fT0VfNglNU01fR1BJTzFfU0hBRE9XX1JFRygweDM0KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fT0VfNwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDM4KQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIGlucHV0IHJlYWQgKi8KKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOXzAJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg1MCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOXzEJTVNNX0dQSU8yX1NIQURPV19SRUcoMHgyMCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOXzIJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg1NCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOXzMJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg1OCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOXzQJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg1QykKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOXzUJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg2MCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOXzYJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg2NCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOXzcJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg2OCkKKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCAxPWVkZ2UgMD1sZXZlbCBpbnRlcnJ1cCAqLworI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VER0VfMAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDcwKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VER0VfMQlNU01fR1BJTzJfU0hBRE9XX1JFRygweDUwKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VER0VfMglNU01fR1BJTzFfU0hBRE9XX1JFRygweDc0KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VER0VfMwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDc4KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VER0VfNAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDdDKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VER0VfNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweDgwKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VER0VfNglNU01fR1BJTzFfU0hBRE9XX1JFRygweDg0KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VER0VfNwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDg4KQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIDE9cG9zaXRpdmUgMD1uZWdhdGl2ZSAqLworI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX1BPU18wCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4OTApCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfUE9TXzEJTVNNX0dQSU8yX1NIQURPV19SRUcoMHg1OCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9QT1NfMglNU01fR1BJTzFfU0hBRE9XX1JFRygweDk0KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX1BPU18zCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4OTgpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfUE9TXzQJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg5QykKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9QT1NfNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweEEwKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX1BPU182CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4QTQpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfUE9TXzcJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhBOCkKKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfRU5fMAlNU01fR1BJTzFfU0hBRE9XX1JFRygweEIwKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VOXzEJTVNNX0dQSU8yX1NIQURPV19SRUcoMHg2MCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9FTl8yCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4QjQpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfRU5fMwlNU01fR1BJTzFfU0hBRE9XX1JFRygweEI4KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VOXzQJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhCQykKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9FTl81CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4QzApCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfRU5fNglNU01fR1BJTzFfU0hBRE9XX1JFRygweEM0KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VOXzcJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhDOCkKKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCB3cml0ZSAxIHRvIGNsZWFyIGludGVycnVwdCAqLworI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0NMRUFSXzAJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhEMCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9DTEVBUl8xCU1TTV9HUElPMl9TSEFET1dfUkVHKDB4NjgpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfQ0xFQVJfMglNU01fR1BJTzFfU0hBRE9XX1JFRygweEQ0KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0NMRUFSXzMJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhEOCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9DTEVBUl80CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4REMpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfQ0xFQVJfNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweEUwKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0NMRUFSXzYJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhFNCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9DTEVBUl83CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4RTgpCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgMT1pbnRlcnJ1cHQgcGVuZGluZyAqLworI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX1NUQVRVU18wCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4RjApCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfU1RBVFVTXzEJTVNNX0dQSU8yX1NIQURPV19SRUcoMHg3MCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9TVEFUVVNfMglNU01fR1BJTzFfU0hBRE9XX1JFRygweEY0KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX1NUQVRVU18zCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4RjgpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfU1RBVFVTXzQJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhGQykKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9TVEFUVVNfNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweDEwMCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9TVEFUVVNfNglNU01fR1BJTzFfU0hBRE9XX1JFRygweDEwNCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9TVEFUVVNfNwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDEwOCkKKworLyoKKyAqIE1TTTdYMzAgcmVnaXN0ZXJzCisgKi8KKy8qIG91dHB1dCB2YWx1ZSAqLworI2RlZmluZSBNU003WDMwX0dQSU9fT1VUXzAJTVNNX0dQSU8xX1JFRygweDAwKSAgIC8qIGdwaW8gIDE1LTAgICAqLworI2RlZmluZSBNU003WDMwX0dQSU9fT1VUXzEJTVNNX0dQSU8yX1JFRygweDAwKSAgIC8qIGdwaW8gIDQzLTE2ICAqLworI2RlZmluZSBNU003WDMwX0dQSU9fT1VUXzIJTVNNX0dQSU8xX1JFRygweDA0KSAgIC8qIGdwaW8gIDY3LTQ0ICAqLworI2RlZmluZSBNU003WDMwX0dQSU9fT1VUXzMJTVNNX0dQSU8xX1JFRygweDA4KSAgIC8qIGdwaW8gIDk0LTY4ICAqLworI2RlZmluZSBNU003WDMwX0dQSU9fT1VUXzQJTVNNX0dQSU8xX1JFRygweDBDKSAgIC8qIGdwaW8gMTA2LTk1ICAqLworI2RlZmluZSBNU003WDMwX0dQSU9fT1VUXzUJTVNNX0dQSU8xX1JFRygweDUwKSAgIC8qIGdwaW8gMTMzLTEwNyAqLworI2RlZmluZSBNU003WDMwX0dQSU9fT1VUXzYJTVNNX0dQSU8xX1JFRygweEM0KSAgIC8qIGdwaW8gMTUwLTEzNCAqLworI2RlZmluZSBNU003WDMwX0dQSU9fT1VUXzcJTVNNX0dQSU8xX1JFRygweDIxNCkgIC8qIGdwaW8gMTgxLTE1MSAqLworCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIG91dHB1dCBlbmFibGUgKi8KKyNkZWZpbmUgTVNNN1gzMF9HUElPX09FXzAJTVNNX0dQSU8xX1JFRygweDEwKQorI2RlZmluZSBNU003WDMwX0dQSU9fT0VfMQlNU01fR1BJTzJfUkVHKDB4MDgpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19PRV8yCU1TTV9HUElPMV9SRUcoMHgxNCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX09FXzMJTVNNX0dQSU8xX1JFRygweDE4KQorI2RlZmluZSBNU003WDMwX0dQSU9fT0VfNAlNU01fR1BJTzFfUkVHKDB4MUMpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19PRV81CU1TTV9HUElPMV9SRUcoMHg1NCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX09FXzYJTVNNX0dQSU8xX1JFRygweEM4KQorI2RlZmluZSBNU003WDMwX0dQSU9fT0VfNwlNU01fR1BJTzFfUkVHKDB4MjE4KQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIGlucHV0IHJlYWQgKi8KKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOXzAJTVNNX0dQSU8xX1JFRygweDM0KQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5fMQlNU01fR1BJTzJfUkVHKDB4MjApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTl8yCU1TTV9HUElPMV9SRUcoMHgzOCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOXzMJTVNNX0dQSU8xX1JFRygweDNDKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5fNAlNU01fR1BJTzFfUkVHKDB4NDApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTl81CU1TTV9HUElPMV9SRUcoMHg0NCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOXzYJTVNNX0dQSU8xX1JFRygweENDKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5fNwlNU01fR1BJTzFfUkVHKDB4MjFDKQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIDE9ZWRnZSAwPWxldmVsIGludGVycnVwICovCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRURHRV8wCU1TTV9HUElPMV9SRUcoMHg2MCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9FREdFXzEJTVNNX0dQSU8yX1JFRygweDUwKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0VER0VfMglNU01fR1BJTzFfUkVHKDB4NjQpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRURHRV8zCU1TTV9HUElPMV9SRUcoMHg2OCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9FREdFXzQJTVNNX0dQSU8xX1JFRygweDZDKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0VER0VfNQlNU01fR1BJTzFfUkVHKDB4QzApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRURHRV82CU1TTV9HUElPMV9SRUcoMHhEMCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9FREdFXzcJTVNNX0dQSU8xX1JFRygweDI0MCkKKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCAxPXBvc2l0aXZlIDA9bmVnYXRpdmUgKi8KKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9QT1NfMAlNU01fR1BJTzFfUkVHKDB4NzApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfUE9TXzEJTVNNX0dQSU8yX1JFRygweDU4KQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX1BPU18yCU1TTV9HUElPMV9SRUcoMHg3NCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9QT1NfMwlNU01fR1BJTzFfUkVHKDB4NzgpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfUE9TXzQJTVNNX0dQSU8xX1JFRygweDdDKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX1BPU181CU1TTV9HUElPMV9SRUcoMHhCQykKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9QT1NfNglNU01fR1BJTzFfUkVHKDB4RDQpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfUE9TXzcJTVNNX0dQSU8xX1JFRygweDIyOCkKKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRU5fMAlNU01fR1BJTzFfUkVHKDB4ODApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRU5fMQlNU01fR1BJTzJfUkVHKDB4NjApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRU5fMglNU01fR1BJTzFfUkVHKDB4ODQpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRU5fMwlNU01fR1BJTzFfUkVHKDB4ODgpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRU5fNAlNU01fR1BJTzFfUkVHKDB4OEMpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRU5fNQlNU01fR1BJTzFfUkVHKDB4QjgpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRU5fNglNU01fR1BJTzFfUkVHKDB4RDgpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRU5fNwlNU01fR1BJTzFfUkVHKDB4MjJDKQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIHdyaXRlIDEgdG8gY2xlYXIgaW50ZXJydXB0ICovCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfQ0xFQVJfMAlNU01fR1BJTzFfUkVHKDB4OTApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfQ0xFQVJfMQlNU01fR1BJTzJfUkVHKDB4NjgpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfQ0xFQVJfMglNU01fR1BJTzFfUkVHKDB4OTQpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfQ0xFQVJfMwlNU01fR1BJTzFfUkVHKDB4OTgpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfQ0xFQVJfNAlNU01fR1BJTzFfUkVHKDB4OUMpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfQ0xFQVJfNQlNU01fR1BJTzFfUkVHKDB4QjQpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfQ0xFQVJfNglNU01fR1BJTzFfUkVHKDB4REMpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfQ0xFQVJfNwlNU01fR1BJTzFfUkVHKDB4MjMwKQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIDE9aW50ZXJydXB0IHBlbmRpbmcgKi8KKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9TVEFUVVNfMAlNU01fR1BJTzFfUkVHKDB4QTApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfU1RBVFVTXzEJTVNNX0dQSU8yX1JFRygweDcwKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX1NUQVRVU18yCU1TTV9HUElPMV9SRUcoMHhBNCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9TVEFUVVNfMwlNU01fR1BJTzFfUkVHKDB4QTgpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfU1RBVFVTXzQJTVNNX0dQSU8xX1JFRygweEFDKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX1NUQVRVU181CU1TTV9HUElPMV9SRUcoMHhCMCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9TVEFUVVNfNglNU01fR1BJTzFfUkVHKDB4RTApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfU1RBVFVTXzcJTVNNX0dQSU8xX1JFRygweDIzNCkKKworI2RlZmluZSBGSVJTVF9HUElPX0lSUSBNU01fR1BJT19UT19JTlQoMCkKKworI2RlZmluZSBNU01fR1BJT19CQU5LKHNvYywgYmFuaywgZmlyc3QsIGxhc3QpCQkJCVwKKwl7CQkJCQkJCQlcCisJCS5yZWdzID0gewkJCQkJCVwKKwkJCS5vdXQgPSAgICAgICAgIHNvYyMjX0dQSU9fT1VUXyMjYmFuaywJCVwKKwkJCS5pbiA9ICAgICAgICAgIHNvYyMjX0dQSU9fSU5fIyNiYW5rLAkJXAorCQkJLmludF9zdGF0dXMgPSAgc29jIyNfR1BJT19JTlRfU1RBVFVTXyMjYmFuaywJXAorCQkJLmludF9jbGVhciA9ICAgc29jIyNfR1BJT19JTlRfQ0xFQVJfIyNiYW5rLAlcCisJCQkuaW50X2VuID0gICAgICBzb2MjI19HUElPX0lOVF9FTl8jI2JhbmssCVwKKwkJCS5pbnRfZWRnZSA9ICAgIHNvYyMjX0dQSU9fSU5UX0VER0VfIyNiYW5rLAlcCisJCQkuaW50X3BvcyA9ICAgICBzb2MjI19HUElPX0lOVF9QT1NfIyNiYW5rLAlcCisJCQkub2UgPSAgICAgICAgICBzb2MjI19HUElPX09FXyMjYmFuaywJCVwKKwkJfSwJCQkJCQkJXAorCQkuY2hpcCA9IHsJCQkJCQlcCisJCQkuYmFzZSA9IChmaXJzdCksCQkJCVwKKwkJCS5uZ3BpbyA9IChsYXN0KSAtIChmaXJzdCkgKyAxLAkJCVwKKwkJCS5nZXQgPSBtc21fZ3Bpb19nZXQsCQkJCVwKKwkJCS5zZXQgPSBtc21fZ3Bpb19zZXQsCQkJCVwKKwkJCS5kaXJlY3Rpb25faW5wdXQgPSBtc21fZ3Bpb19kaXJlY3Rpb25faW5wdXQsCVwKKwkJCS5kaXJlY3Rpb25fb3V0cHV0ID0gbXNtX2dwaW9fZGlyZWN0aW9uX291dHB1dCwJXAorCQkJLnRvX2lycSA9IG1zbV9ncGlvX3RvX2lycSwJCQlcCisJCQkucmVxdWVzdCA9IG1zbV9ncGlvX3JlcXVlc3QsCQkJXAorCQkJLmZyZWUgPSBtc21fZ3Bpb19mcmVlLAkJCQlcCisJCX0JCQkJCQkJXAorCX0KKworI2RlZmluZSBNU01fR1BJT19CUk9LRU5fSU5UX0NMRUFSIDEKKworc3RydWN0IG1zbV9ncGlvX3JlZ3MgeworCXZvaWQgX19pb21lbSAqb3V0OworCXZvaWQgX19pb21lbSAqaW47CisJdm9pZCBfX2lvbWVtICppbnRfc3RhdHVzOworCXZvaWQgX19pb21lbSAqaW50X2NsZWFyOworCXZvaWQgX19pb21lbSAqaW50X2VuOworCXZvaWQgX19pb21lbSAqaW50X2VkZ2U7CisJdm9pZCBfX2lvbWVtICppbnRfcG9zOworCXZvaWQgX19pb21lbSAqb2U7Cit9OworCitzdHJ1Y3QgbXNtX2dwaW9fY2hpcCB7CisJc3BpbmxvY2tfdAkJbG9jazsKKwlzdHJ1Y3QgZ3Bpb19jaGlwCWNoaXA7CisJc3RydWN0IG1zbV9ncGlvX3JlZ3MJcmVnczsKKyNpZiBNU01fR1BJT19CUk9LRU5fSU5UX0NMRUFSCisJdW5zaWduZWQgICAgICAgICAgICAgICAgaW50X3N0YXR1c19jb3B5OworI2VuZGlmCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgYm90aF9lZGdlX2RldGVjdDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBpbnRfZW5hYmxlWzJdOyAvKiAwOiBhd2FrZSwgMTogc2xlZXAgKi8KK307CisKK3N0YXRpYyBpbnQgbXNtX2dwaW9fd3JpdGUoc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwLAorCQkJICB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIG9uKQoreworCXVuc2lnbmVkIG1hc2sgPSBCSVQob2Zmc2V0KTsKKwl1bnNpZ25lZCB2YWw7CisKKwl2YWwgPSByZWFkbChtc21fY2hpcC0+cmVncy5vdXQpOworCWlmIChvbikKKwkJd3JpdGVsKHZhbCB8IG1hc2ssIG1zbV9jaGlwLT5yZWdzLm91dCk7CisJZWxzZQorCQl3cml0ZWwodmFsICYgfm1hc2ssIG1zbV9jaGlwLT5yZWdzLm91dCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9ncGlvX3VwZGF0ZV9ib3RoX2VkZ2VfZGV0ZWN0KHN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCkKK3sKKwlpbnQgbG9vcF9saW1pdCA9IDEwMDsKKwl1bnNpZ25lZCBwb2wsIHZhbCwgdmFsMiwgaW50c3RhdDsKKwlkbyB7CisJCXZhbCA9IHJlYWRsKG1zbV9jaGlwLT5yZWdzLmluKTsKKwkJcG9sID0gcmVhZGwobXNtX2NoaXAtPnJlZ3MuaW50X3Bvcyk7CisJCXBvbCA9IChwb2wgJiB+bXNtX2NoaXAtPmJvdGhfZWRnZV9kZXRlY3QpIHwKKwkJICAgICAgKH52YWwgJiBtc21fY2hpcC0+Ym90aF9lZGdlX2RldGVjdCk7CisJCXdyaXRlbChwb2wsIG1zbV9jaGlwLT5yZWdzLmludF9wb3MpOworCQlpbnRzdGF0ID0gcmVhZGwobXNtX2NoaXAtPnJlZ3MuaW50X3N0YXR1cyk7CisJCXZhbDIgPSByZWFkbChtc21fY2hpcC0+cmVncy5pbik7CisJCWlmICgoKHZhbCBeIHZhbDIpICYgbXNtX2NoaXAtPmJvdGhfZWRnZV9kZXRlY3QgJiB+aW50c3RhdCkgPT0gMCkKKwkJCXJldHVybjsKKwl9IHdoaWxlIChsb29wX2xpbWl0LS0gPiAwKTsKKwlwcmludGsoS0VSTl9FUlIgIm1zbV9ncGlvX3VwZGF0ZV9ib3RoX2VkZ2VfZGV0ZWN0LCAiCisJICAgICAgICJmYWlsZWQgdG8gcmVhY2ggc3RhYmxlIHN0YXRlICV4ICE9ICV4XG4iLCB2YWwsIHZhbDIpOworfQorCitzdGF0aWMgaW50IG1zbV9ncGlvX2NsZWFyX2RldGVjdF9zdGF0dXMoc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwLAorCQkJCQl1bnNpZ25lZCBvZmZzZXQpCit7CisJdW5zaWduZWQgYml0ID0gQklUKG9mZnNldCk7CisKKyNpZiBNU01fR1BJT19CUk9LRU5fSU5UX0NMRUFSCisJLyogU2F2ZSBpbnRlcnJ1cHRzIHRoYXQgYWxyZWFkeSB0cmlnZ2VyZWQgYmVmb3JlIHdlIGxvb3NlIHRoZW0uICovCisJLyogQW55IGludGVycnVwdCB0aGF0IHRyaWdnZXJzIGJldHdlZW4gdGhlIHJlYWQgb2YgaW50X3N0YXR1cyAqLworCS8qIGFuZCB0aGUgd3JpdGUgdG8gaW50X2NsZWFyIHdpbGwgc3RpbGwgYmUgbG9zdCB0aG91Z2guICovCisJbXNtX2NoaXAtPmludF9zdGF0dXNfY29weSB8PSByZWFkbChtc21fY2hpcC0+cmVncy5pbnRfc3RhdHVzKTsKKwltc21fY2hpcC0+aW50X3N0YXR1c19jb3B5ICY9IH5iaXQ7CisjZW5kaWYKKwl3cml0ZWwoYml0LCBtc21fY2hpcC0+cmVncy5pbnRfY2xlYXIpOworCW1zbV9ncGlvX3VwZGF0ZV9ib3RoX2VkZ2VfZGV0ZWN0KG1zbV9jaGlwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCW1zbV9jaGlwID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBtc21fZ3Bpb19jaGlwLCBjaGlwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7CisJd3JpdGVsKHJlYWRsKG1zbV9jaGlwLT5yZWdzLm9lKSAmIH5CSVQob2Zmc2V0KSwgbXNtX2NoaXAtPnJlZ3Mub2UpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cittc21fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCW1zbV9jaGlwID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBtc21fZ3Bpb19jaGlwLCBjaGlwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7CisJbXNtX2dwaW9fd3JpdGUobXNtX2NoaXAsIG9mZnNldCwgdmFsdWUpOworCXdyaXRlbChyZWFkbChtc21fY2hpcC0+cmVncy5vZSkgfCBCSVQob2Zmc2V0KSwgbXNtX2NoaXAtPnJlZ3Mub2UpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwOworCisJbXNtX2NoaXAgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IG1zbV9ncGlvX2NoaXAsIGNoaXApOworCXJldHVybiAocmVhZGwobXNtX2NoaXAtPnJlZ3MuaW4pICYgKDFVIDw8IG9mZnNldCkpID8gMSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2NoaXA7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisKKwltc21fY2hpcCA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbXNtX2dwaW9fY2hpcCwgY2hpcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOworCW1zbV9ncGlvX3dyaXRlKG1zbV9jaGlwLCBvZmZzZXQsIHZhbHVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKK30KKworc3RhdGljIGludCBtc21fZ3Bpb190b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXJldHVybiBNU01fR1BJT19UT19JTlQoY2hpcC0+YmFzZSArIG9mZnNldCk7Cit9CisKKyNpZmRlZiBDT05GSUdfTVNNX0dQSU9NVVgKK3N0YXRpYyBpbnQgbXNtX2dwaW9fcmVxdWVzdChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIG1zbV9ncGlvbXV4X2dldChjaGlwLT5iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgbXNtX2dwaW9fZnJlZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJbXNtX2dwaW9tdXhfcHV0KGNoaXAtPmJhc2UgKyBvZmZzZXQpOworfQorI2Vsc2UKKyNkZWZpbmUgbXNtX2dwaW9fcmVxdWVzdCBOVUxMCisjZGVmaW5lIG1zbV9ncGlvX2ZyZWUgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2dwaW9fY2hpcHM7CitzdGF0aWMgaW50IG1zbV9ncGlvX2NvdW50OworCitzdGF0aWMgc3RydWN0IG1zbV9ncGlvX2NoaXAgbXNtX2dwaW9fY2hpcHNfbXNtN3gwMVtdID0geworCU1TTV9HUElPX0JBTksoTVNNN1gwMCwgMCwgICAwLCAgMTUpLAorCU1TTV9HUElPX0JBTksoTVNNN1gwMCwgMSwgIDE2LCAgNDIpLAorCU1TTV9HUElPX0JBTksoTVNNN1gwMCwgMiwgIDQzLCAgNjcpLAorCU1TTV9HUElPX0JBTksoTVNNN1gwMCwgMywgIDY4LCAgOTQpLAorCU1TTV9HUElPX0JBTksoTVNNN1gwMCwgNCwgIDk1LCAxMDYpLAorCU1TTV9HUElPX0JBTksoTVNNN1gwMCwgNSwgMTA3LCAxMjEpLAorfTsKKworc3RhdGljIHN0cnVjdCBtc21fZ3Bpb19jaGlwIG1zbV9ncGlvX2NoaXBzX21zbTd4MzBbXSA9IHsKKwlNU01fR1BJT19CQU5LKE1TTTdYMzAsIDAsICAgMCwgIDE1KSwKKwlNU01fR1BJT19CQU5LKE1TTTdYMzAsIDEsICAxNiwgIDQzKSwKKwlNU01fR1BJT19CQU5LKE1TTTdYMzAsIDIsICA0NCwgIDY3KSwKKwlNU01fR1BJT19CQU5LKE1TTTdYMzAsIDMsICA2OCwgIDk0KSwKKwlNU01fR1BJT19CQU5LKE1TTTdYMzAsIDQsICA5NSwgMTA2KSwKKwlNU01fR1BJT19CQU5LKE1TTTdYMzAsIDUsIDEwNywgMTMzKSwKKwlNU01fR1BJT19CQU5LKE1TTTdYMzAsIDYsIDEzNCwgMTUwKSwKKwlNU01fR1BJT19CQU5LKE1TTTdYMzAsIDcsIDE1MSwgMTgxKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXNtX2dwaW9fY2hpcCBtc21fZ3Bpb19jaGlwc19xc2Q4eDUwW10gPSB7CisJTVNNX0dQSU9fQkFOSyhRU0Q4WDUwLCAwLCAgIDAsICAxNSksCisJTVNNX0dQSU9fQkFOSyhRU0Q4WDUwLCAxLCAgMTYsICA0MiksCisJTVNNX0dQSU9fQkFOSyhRU0Q4WDUwLCAyLCAgNDMsICA2NyksCisJTVNNX0dQSU9fQkFOSyhRU0Q4WDUwLCAzLCAgNjgsICA5NCksCisJTVNNX0dQSU9fQkFOSyhRU0Q4WDUwLCA0LCAgOTUsIDEwMyksCisJTVNNX0dQSU9fQkFOSyhRU0Q4WDUwLCA1LCAxMDQsIDEyMSksCisJTVNNX0dQSU9fQkFOSyhRU0Q4WDUwLCA2LCAxMjIsIDE1MiksCisJTVNNX0dQSU9fQkFOSyhRU0Q4WDUwLCA3LCAxNTMsIDE2NCksCit9OworCitzdGF0aWMgdm9pZCBtc21fZ3Bpb19pcnFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKwlzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2NoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7CisJbXNtX2dwaW9fY2xlYXJfZGV0ZWN0X3N0YXR1cyhtc21fY2hpcCwKKwkJCQkgICAgIGQtPmlycSAtIGdwaW9fdG9faXJxKG1zbV9jaGlwLT5jaGlwLmJhc2UpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbXNtX2dwaW9faXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXVuc2lnbmVkIG9mZnNldCA9IGQtPmlycSAtIGdwaW9fdG9faXJxKG1zbV9jaGlwLT5jaGlwLmJhc2UpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOworCS8qIGxldmVsIHRyaWdnZXJlZCBpbnRlcnJ1cHRzIGFyZSBhbHNvIGxhdGNoZWQgKi8KKwlpZiAoIShyZWFkbChtc21fY2hpcC0+cmVncy5pbnRfZWRnZSkgJiBCSVQob2Zmc2V0KSkpCisJCW1zbV9ncGlvX2NsZWFyX2RldGVjdF9zdGF0dXMobXNtX2NoaXAsIG9mZnNldCk7CisJbXNtX2NoaXAtPmludF9lbmFibGVbMF0gJj0gfkJJVChvZmZzZXQpOworCXdyaXRlbChtc21fY2hpcC0+aW50X2VuYWJsZVswXSwgbXNtX2NoaXAtPnJlZ3MuaW50X2VuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbXNtX2dwaW9faXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJdW5zaWduZWQgb2Zmc2V0ID0gZC0+aXJxIC0gZ3Bpb190b19pcnEobXNtX2NoaXAtPmNoaXAuYmFzZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7CisJLyogbGV2ZWwgdHJpZ2dlcmVkIGludGVycnVwdHMgYXJlIGFsc28gbGF0Y2hlZCAqLworCWlmICghKHJlYWRsKG1zbV9jaGlwLT5yZWdzLmludF9lZGdlKSAmIEJJVChvZmZzZXQpKSkKKwkJbXNtX2dwaW9fY2xlYXJfZGV0ZWN0X3N0YXR1cyhtc21fY2hpcCwgb2Zmc2V0KTsKKwltc21fY2hpcC0+aW50X2VuYWJsZVswXSB8PSBCSVQob2Zmc2V0KTsKKwl3cml0ZWwobXNtX2NoaXAtPmludF9lbmFibGVbMF0sIG1zbV9jaGlwLT5yZWdzLmludF9lbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2dwaW9faXJxX3NldF93YWtlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IG9uKQoreworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXVuc2lnbmVkIG9mZnNldCA9IGQtPmlycSAtIGdwaW9fdG9faXJxKG1zbV9jaGlwLT5jaGlwLmJhc2UpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOworCisJaWYgKG9uKQorCQltc21fY2hpcC0+aW50X2VuYWJsZVsxXSB8PSBCSVQob2Zmc2V0KTsKKwllbHNlCisJCW1zbV9jaGlwLT5pbnRfZW5hYmxlWzFdICY9IH5CSVQob2Zmc2V0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9ncGlvX2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBmbG93X3R5cGUpCit7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJdW5zaWduZWQgb2Zmc2V0ID0gZC0+aXJxIC0gZ3Bpb190b19pcnEobXNtX2NoaXAtPmNoaXAuYmFzZSk7CisJdW5zaWduZWQgdmFsLCBtYXNrID0gQklUKG9mZnNldCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7CisJdmFsID0gcmVhZGwobXNtX2NoaXAtPnJlZ3MuaW50X2VkZ2UpOworCWlmIChmbG93X3R5cGUgJiBJUlFfVFlQRV9FREdFX0JPVEgpIHsKKwkJd3JpdGVsKHZhbCB8IG1hc2ssIG1zbV9jaGlwLT5yZWdzLmludF9lZGdlKTsKKwkJX19pcnFfc2V0X2hhbmRsZXJfbG9ja2VkKGQtPmlycSwgaGFuZGxlX2VkZ2VfaXJxKTsKKwl9IGVsc2UgeworCQl3cml0ZWwodmFsICYgfm1hc2ssIG1zbV9jaGlwLT5yZWdzLmludF9lZGdlKTsKKwkJX19pcnFfc2V0X2hhbmRsZXJfbG9ja2VkKGQtPmlycSwgaGFuZGxlX2xldmVsX2lycSk7CisJfQorCWlmICgoZmxvd190eXBlICYgSVJRX1RZUEVfRURHRV9CT1RIKSA9PSBJUlFfVFlQRV9FREdFX0JPVEgpIHsKKwkJbXNtX2NoaXAtPmJvdGhfZWRnZV9kZXRlY3QgfD0gbWFzazsKKwkJbXNtX2dwaW9fdXBkYXRlX2JvdGhfZWRnZV9kZXRlY3QobXNtX2NoaXApOworCX0gZWxzZSB7CisJCW1zbV9jaGlwLT5ib3RoX2VkZ2VfZGV0ZWN0ICY9IH5tYXNrOworCQl2YWwgPSByZWFkbChtc21fY2hpcC0+cmVncy5pbnRfcG9zKTsKKwkJaWYgKGZsb3dfdHlwZSAmIChJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0hJR0gpKQorCQkJd3JpdGVsKHZhbCB8IG1hc2ssIG1zbV9jaGlwLT5yZWdzLmludF9wb3MpOworCQllbHNlCisJCQl3cml0ZWwodmFsICYgfm1hc2ssIG1zbV9jaGlwLT5yZWdzLmludF9wb3MpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXNtX2dwaW9faXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCWludCBpLCBqLCBtYXNrOworCXVuc2lnbmVkIHZhbDsKKworCWZvciAoaSA9IDA7IGkgPCBtc21fZ3Bpb19jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCA9ICZtc21fZ3Bpb19jaGlwc1tpXTsKKwkJdmFsID0gcmVhZGwobXNtX2NoaXAtPnJlZ3MuaW50X3N0YXR1cyk7CisJCXZhbCAmPSBtc21fY2hpcC0+aW50X2VuYWJsZVswXTsKKwkJd2hpbGUgKHZhbCkgeworCQkJbWFzayA9IHZhbCAmIC12YWw7CisJCQlqID0gZmxzKG1hc2spIC0gMTsKKwkJCS8qIHByaW50aygiJXMgJTA4eCAlMDh4IGJpdCAlZCBncGlvICVkIGlycSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgdiwgbSwgaiwgbXNtX2NoaXAtPmNoaXAuc3RhcnQgKyBqLAorCQkJCUZJUlNUX0dQSU9fSVJRICsgbXNtX2NoaXAtPmNoaXAuc3RhcnQgKyBqKTsgKi8KKwkJCXZhbCAmPSB+bWFzazsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShGSVJTVF9HUElPX0lSUSArCisJCQkJCSAgIG1zbV9jaGlwLT5jaGlwLmJhc2UgKyBqKTsKKwkJfQorCX0KKwlkZXNjLT5pcnFfZGF0YS5jaGlwLT5pcnFfYWNrKCZkZXNjLT5pcnFfZGF0YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbXNtX2dwaW9faXJxX2NoaXAgPSB7CisJLm5hbWUgICAgICAgICAgPSAibXNtZ3BpbyIsCisJLmlycV9hY2sgICAgICAgPSBtc21fZ3Bpb19pcnFfYWNrLAorCS5pcnFfbWFzayAgICAgID0gbXNtX2dwaW9faXJxX21hc2ssCisJLmlycV91bm1hc2sgICAgPSBtc21fZ3Bpb19pcnFfdW5tYXNrLAorCS5pcnFfc2V0X3dha2UgID0gbXNtX2dwaW9faXJxX3NldF93YWtlLAorCS5pcnFfc2V0X3R5cGUgID0gbXNtX2dwaW9faXJxX3NldF90eXBlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbXNtX2luaXRfZ3Bpbyh2b2lkKQoreworCWludCBpLCBqID0gMDsKKworCWlmIChjcHVfaXNfbXNtN3gwMSgpKSB7CisJCW1zbV9ncGlvX2NoaXBzID0gbXNtX2dwaW9fY2hpcHNfbXNtN3gwMTsKKwkJbXNtX2dwaW9fY291bnQgPSBBUlJBWV9TSVpFKG1zbV9ncGlvX2NoaXBzX21zbTd4MDEpOworCX0gZWxzZSBpZiAoY3B1X2lzX21zbTd4MzAoKSkgeworCQltc21fZ3Bpb19jaGlwcyA9IG1zbV9ncGlvX2NoaXBzX21zbTd4MzA7CisJCW1zbV9ncGlvX2NvdW50ID0gQVJSQVlfU0laRShtc21fZ3Bpb19jaGlwc19tc203eDMwKTsKKwl9IGVsc2UgaWYgKGNwdV9pc19xc2Q4eDUwKCkpIHsKKwkJbXNtX2dwaW9fY2hpcHMgPSBtc21fZ3Bpb19jaGlwc19xc2Q4eDUwOworCQltc21fZ3Bpb19jb3VudCA9IEFSUkFZX1NJWkUobXNtX2dwaW9fY2hpcHNfcXNkOHg1MCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gRklSU1RfR1BJT19JUlE7IGkgPCBGSVJTVF9HUElPX0lSUSArIE5SX0dQSU9fSVJRUzsgaSsrKSB7CisJCWlmIChpIC0gRklSU1RfR1BJT19JUlEgPj0KKwkJCW1zbV9ncGlvX2NoaXBzW2pdLmNoaXAuYmFzZSArCisJCQltc21fZ3Bpb19jaGlwc1tqXS5jaGlwLm5ncGlvKQorCQkJaisrOworCQlpcnFfc2V0X2NoaXBfZGF0YShpLCAmbXNtX2dwaW9fY2hpcHNbal0pOworCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaSwgJm1zbV9ncGlvX2lycV9jaGlwLAorCQkJCQkgaGFuZGxlX2VkZ2VfaXJxKTsKKwkJc2V0X2lycV9mbGFncyhpLCBJUlFGX1ZBTElEKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNtX2dwaW9fY291bnQ7IGkrKykgeworCQlzcGluX2xvY2tfaW5pdCgmbXNtX2dwaW9fY2hpcHNbaV0ubG9jayk7CisJCXdyaXRlbCgwLCBtc21fZ3Bpb19jaGlwc1tpXS5yZWdzLmludF9lbik7CisJCWdwaW9jaGlwX2FkZCgmbXNtX2dwaW9fY2hpcHNbaV0uY2hpcCk7CisJfQorCisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoSU5UX0dQSU9fR1JPVVAxLCBtc21fZ3Bpb19pcnFfaGFuZGxlcik7CisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoSU5UX0dQSU9fR1JPVVAyLCBtc21fZ3Bpb19pcnFfaGFuZGxlcik7CisJaXJxX3NldF9pcnFfd2FrZShJTlRfR1BJT19HUk9VUDEsIDEpOworCWlycV9zZXRfaXJxX3dha2UoSU5UX0dQSU9fR1JPVVAyLCAyKTsKKwlyZXR1cm4gMDsKK30KKworcG9zdGNvcmVfaW5pdGNhbGwobXNtX2luaXRfZ3Bpbyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9ncGlvLXYyLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tc20tdjIuYwpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW1zbS9ncGlvLXYyLmMKcmVuYW1lIHRvIGRyaXZlcnMvZ3Bpby9ncGlvLW1zbS12Mi5jCmluZGV4IGNjOWM0ZmQuLjVjYjEyMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2dwaW8tdjIuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tc20tdjIuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMCwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZApAQCAtMzAsOCArMzAsOCBAQAogCiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKKyNpbmNsdWRlIDxtYWNoL21zbV9ncGlvbXV4Lmg+CiAjaW5jbHVkZSA8bWFjaC9tc21faW9tYXAuaD4KLSNpbmNsdWRlICJncGlvbXV4LmgiCiAKIC8qIEJpdHMgb2YgaW50ZXJlc3QgaW4gdGhlIEdQSU9fSU5fT1VUIHJlZ2lzdGVyLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby10cHM2NTkxMi5jIGIvZHJpdmVycy9ncGlvL2dwaW8tdHBzNjU5MTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWU2NmMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tdHBzNjU5MTIuYwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIFRleGFzIEluc3RydW1lbnRzIEluYy4KKyAqCisgKiBBdXRob3I6IE1hcmdhcml0YSBPbGF5YSA8bWFnaUBzbGltbG9naWMuY28udWs+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gd204MzUwIGltcGxlbWVudGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC90cHM2NTkxMi5oPgorCitzdHJ1Y3QgdHBzNjU5MTJfZ3Bpb19kYXRhIHsKKwlzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyOworCXN0cnVjdCBncGlvX2NoaXAgZ3Bpb19jaGlwOworfTsKKworc3RhdGljIGludCB0cHM2NTkxMl9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIgPSBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCB0cHM2NTkxMiwgZ3Bpbyk7CisJaW50IHZhbDsKKworCXZhbCA9IHRwczY1OTEyX3JlZ19yZWFkKHRwczY1OTEyLCBUUFM2NTkxMl9HUElPMSArIG9mZnNldCk7CisKKwlpZiAodmFsICYgR1BJT19TVFNfTUFTSykKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHBzNjU5MTJfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZnNldCwKKwkJCSAgICAgIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyID0gY29udGFpbmVyX29mKGdjLCBzdHJ1Y3QgdHBzNjU5MTIsIGdwaW8pOworCisJaWYgKHZhbHVlKQorCQl0cHM2NTkxMl9zZXRfYml0cyh0cHM2NTkxMiwgVFBTNjU5MTJfR1BJTzEgKyBvZmZzZXQsCisJCQkJCQkJR1BJT19TRVRfTUFTSyk7CisJZWxzZQorCQl0cHM2NTkxMl9jbGVhcl9iaXRzKHRwczY1OTEyLCBUUFM2NTkxMl9HUElPMSArIG9mZnNldCwKKwkJCQkJCQkJR1BJT19TRVRfTUFTSyk7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjU5MTJfZ3Bpb19vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZnNldCwKKwkJCQlpbnQgdmFsdWUpCit7CisJc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMiA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IHRwczY1OTEyLCBncGlvKTsKKworCS8qIFNldCB0aGUgaW5pdGlhbCB2YWx1ZSAqLworCXRwczY1OTEyX2dwaW9fc2V0KGdjLCBvZmZzZXQsIHZhbHVlKTsKKworCXJldHVybiB0cHM2NTkxMl9zZXRfYml0cyh0cHM2NTkxMiwgVFBTNjU5MTJfR1BJTzEgKyBvZmZzZXQsCisJCQkJCQkJCUdQSU9fQ0ZHX01BU0spOworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX2dwaW9faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyID0gY29udGFpbmVyX29mKGdjLCBzdHJ1Y3QgdHBzNjU5MTIsIGdwaW8pOworCisJcmV0dXJuIHRwczY1OTEyX2NsZWFyX2JpdHModHBzNjU5MTIsIFRQUzY1OTEyX0dQSU8xICsgb2Zmc2V0LAorCQkJCQkJCQlHUElPX0NGR19NQVNLKTsKKworfQorCitzdGF0aWMgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0geworCS5sYWJlbAkJCT0gInRwczY1OTEyIiwKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5kaXJlY3Rpb25faW5wdXQJPSB0cHM2NTkxMl9ncGlvX2lucHV0LAorCS5kaXJlY3Rpb25fb3V0cHV0CT0gdHBzNjU5MTJfZ3Bpb19vdXRwdXQsCisJLmdldAkJCT0gdHBzNjU5MTJfZ3Bpb19nZXQsCisJLnNldAkJCT0gdHBzNjU5MTJfZ3Bpb19zZXQsCisJLmNhbl9zbGVlcAkJPSAxLAorCS5uZ3BpbwkJCT0gNSwKKwkuYmFzZQkJCT0gLTEsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0cHM2NTkxMl9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMiA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgdHBzNjU5MTJfYm9hcmQgKnBkYXRhID0gdHBzNjU5MTItPmRldi0+cGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdHBzNjU5MTJfZ3Bpb19kYXRhICp0cHM2NTkxMl9ncGlvOworCWludCByZXQ7CisKKwl0cHM2NTkxMl9ncGlvID0ga3phbGxvYyhzaXplb2YoKnRwczY1OTEyX2dwaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAodHBzNjU5MTJfZ3BpbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRwczY1OTEyX2dwaW8tPnRwczY1OTEyID0gdHBzNjU5MTI7CisJdHBzNjU5MTJfZ3Bpby0+Z3Bpb19jaGlwID0gdGVtcGxhdGVfY2hpcDsKKwl0cHM2NTkxMl9ncGlvLT5ncGlvX2NoaXAuZGV2ID0gJnBkZXYtPmRldjsKKwlpZiAocGRhdGEgJiYgcGRhdGEtPmdwaW9fYmFzZSkKKwkJdHBzNjU5MTJfZ3Bpby0+Z3Bpb19jaGlwLmJhc2UgPSBwZGF0YS0+Z3Bpb19iYXNlOworCisJcmV0ID0gZ3Bpb2NoaXBfYWRkKCZ0cHM2NTkxMl9ncGlvLT5ncGlvX2NoaXApOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBncGlvY2hpcCwgJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHRwczY1OTEyX2dwaW8pOworCisJcmV0dXJuIHJldDsKKworZXJyOgorCWtmcmVlKHRwczY1OTEyX2dwaW8pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHRwczY1OTEyX2dwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRwczY1OTEyX2dwaW9fZGF0YSAgKnRwczY1OTEyX2dwaW8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ3Bpb2NoaXBfcmVtb3ZlKCZ0cHM2NTkxMl9ncGlvLT5ncGlvX2NoaXApOworCWlmIChyZXQgPT0gMCkKKwkJa2ZyZWUodHBzNjU5MTJfZ3Bpbyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0cHM2NTkxMl9ncGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ0cHM2NTkxMi1ncGlvIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSB0cHM2NTkxMl9ncGlvX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh0cHM2NTkxMl9ncGlvX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0cHM2NTkxMl9ncGlvX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0cHM2NTkxMl9ncGlvX2RyaXZlcik7Cit9CitzdWJzeXNfaW5pdGNhbGwodHBzNjU5MTJfZ3Bpb19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHRwczY1OTEyX2dwaW9fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0cHM2NTkxMl9ncGlvX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh0cHM2NTkxMl9ncGlvX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNYXJnYXJpdGEgT2xheWEgQ2FicmVyYSA8bWFnaUBzbGltbG9naWMuY28udWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdQSU8gaW50ZXJmYWNlIGZvciBUUFM2NTkxMiBQTUlDcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp0cHM2NTkxMi1ncGlvIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL0tjb25maWcgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKaW5kZXggMDU5OGNkMi4uMGI2MmMzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwpAQCAtNjIzLDcgKzYyMyw3IEBACiAJICBMTTg2LCBMTTg5IGFuZCBMTTk5LCBBbmFsb2cgRGV2aWNlcyBBRE0xMDMyLCBBRFQ3NDYxLCBhbmQgQURUNzQ2MUEsCiAJICBNYXhpbSBNQVg2NjQ2LCBNQVg2NjQ3LCBNQVg2NjQ4LCBNQVg2NjQ5LCBNQVg2NjU3LCBNQVg2NjU4LCBNQVg2NjU5LAogCSAgTUFYNjY4MCwgTUFYNjY4MSwgTUFYNjY5MiwgTUFYNjY5NSwgTUFYNjY5NiwgT04gU2VtaWNvbmR1Y3RvciBOQ1QxMDA4LAotCSAgYW5kIFdpbmJvbmQvTnV2b3RvbiBXODNMNzcxVy9HL0FXRy9BU0cgc2Vuc29yIGNoaXBzLgorCSAgV2luYm9uZC9OdXZvdG9uIFc4M0w3NzFXL0cvQVdHL0FTRyBhbmQgUGhpbGlwcyBTQTU2MDA0IHNlbnNvciBjaGlwcy4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgbG05MC4KQEAgLTY5NCwxNCArNjk0LDI0IEBACiAJICBiZSBjYWxsZWQgbHRjNDI2MS4KIAogY29uZmlnIFNFTlNPUlNfTE05NTI0MQotCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTUyNDEgc2Vuc29yIGNoaXAiCisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE05NTI0MSBhbmQgY29tcGF0aWJsZXMiCiAJZGVwZW5kcyBvbiBJMkMKIAloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTE05NTI0MSBzZW5zb3IgY2hpcC4KKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBMTTk1MjMxIGFuZCBMTTk1MjQxIHNlbnNvcgorCSAgY2hpcHMuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGxtOTUyNDEuCiAKK2NvbmZpZyBTRU5TT1JTX0xNOTUyNDUKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTk1MjQ1IHNlbnNvciBjaGlwIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBMTTk1MjQ1IHNlbnNvciBjaGlwLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsbTk1MjQ1LgorCiBjb25maWcgU0VOU09SU19NQVgxMTExCiAJdHJpc3RhdGUgIk1heGltIE1BWDExMTEgTXVsdGljaGFubmVsLCBTZXJpYWwgOC1iaXQgQURDIGNoaXAiCiAJZGVwZW5kcyBvbiBTUElfTUFTVEVSCkBAIC03MzYsNiArNzQ2LDE2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBtYXgxNjE5LgogCitjb25maWcgU0VOU09SU19NQVgxNjY4CisJdHJpc3RhdGUgIk1heGltIE1BWDE2NjggYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBNQVgxNjY4LCBNQVgxOTg5IGFuZAorCSAgTUFYMTgwNSBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWF4MTY2OC4KKwogY29uZmlnIFNFTlNPUlNfTUFYNjYzOQogCXRyaXN0YXRlICJNYXhpbSBNQVg2NjM5IHNlbnNvciBjaGlwIgogCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTApAQCAtNzY3LDYgKzc4NywyMCBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgbWF4NjY1MC4KIAorY29uZmlnIFNFTlNPUlNfTlRDX1RIRVJNSVNUT1IKKwl0cmlzdGF0ZSAiTlRDIHRoZXJtaXN0b3Igc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE5UQyB0aGVybWlzdG9ycyBzZW5zb3IgcmVhZGluZyBhbmQgaXRzCisJICBpbnRlcnByZXRhdGlvbi4gVGhlIGRyaXZlciBjYW4gYWxzbyBtb25pdG9yIHRoZSB0ZW1wZXJhdHVyZSBhbmQKKwkgIHNlbmQgbm90aWZpY2F0aW9ucyBhYm91dCB0aGUgdGVtcGVyYXR1cmUuCisKKwkgIEN1cnJlbnRseSwgdGhpcyBkcml2ZXIgc3VwcG9ydHMKKwkgIE5DUDE1V0I0NzMsIE5DUDE4V0I0NzMsIE5DUDIxV0I0NzMsIE5DUDAzV0I0NzMsIGFuZCBOQ1AxNVdMMzMzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBudGMtdGhlcm1pc3Rvci4KKwogY29uZmlnIFNFTlNPUlNfUEM4NzM2MAogCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIFBDODczNjAgZmFtaWx5IgogCXNlbGVjdCBIV01PTl9WSUQKQEAgLTgwNyw5MiArODQxLDcgQEAKIAkgIFRoZXNlIGRldmljZXMgYXJlIGhhcmQgdG8gZGV0ZWN0IGFuZCByYXJlbHkgZm91bmQgb24gbWFpbnN0cmVhbQogCSAgaGFyZHdhcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgUE1CVVMKLQl0cmlzdGF0ZSAiUE1CdXMgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBTYXkgeWVzIGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIFBNQnVzIHN1cHBvcnQuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgcG1idXNfY29yZS4KLQotaWYgUE1CVVMKLQotY29uZmlnIFNFTlNPUlNfUE1CVVMKLQl0cmlzdGF0ZSAiR2VuZXJpYyBQTUJ1cyBkZXZpY2VzIgotCWRlZmF1bHQgbgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBoYXJkd2FyZSBtb25pdG9yaW5nIHN1cHBvcnQgZm9yIGdlbmVyaWMKLQkgIFBNQnVzIGRldmljZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gQk1SNDUwLCBCTVI0NTEsIEJNUjQ1MywKLQkgIEJNUjQ1NCwgYW5kIExUQzI5NzguCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgcG1idXMuCi0KLWNvbmZpZyBTRU5TT1JTX0FETTEyNzUKLQl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURNMTI3NSIKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgaGFyZHdhcmUgbW9uaXRvcmluZyBzdXBwb3J0IGZvciBBbmFsb2cKLQkgIERldmljZXMgQURNMTI3NSBIb3QtU3dhcCBDb250cm9sbGVyIGFuZCBEaWdpdGFsIFBvd2VyIE1vbml0b3IuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgYWRtMTI3NS4KLQotY29uZmlnIFNFTlNPUlNfTUFYMTYwNjQKLQl0cmlzdGF0ZSAiTWF4aW0gTUFYMTYwNjQiCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IGhhcmR3YXJlIG1vbml0b3Jpbmcgc3VwcG9ydCBmb3IgTWF4aW0KLQkgIE1BWDE2MDY0LgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAotCSAgYmUgY2FsbGVkIG1heDE2MDY0LgotCi1jb25maWcgU0VOU09SU19NQVgzNDQ0MAotCXRyaXN0YXRlICJNYXhpbSBNQVgzNDQ0MC9NQVgzNDQ0MSIKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgaGFyZHdhcmUgbW9uaXRvcmluZyBzdXBwb3J0IGZvciBNYXhpbQotCSAgTUFYMzQ0NDAgYW5kIE1BWDM0NDQxLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAotCSAgYmUgY2FsbGVkIG1heDM0NDQwLgotCi1jb25maWcgU0VOU09SU19NQVg4Njg4Ci0JdHJpc3RhdGUgIk1heGltIE1BWDg2ODgiCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IGhhcmR3YXJlIG1vbml0b3Jpbmcgc3VwcG9ydCBmb3IgTWF4aW0KLQkgIE1BWDg2ODguCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgbWF4ODY4OC4KLQotY29uZmlnIFNFTlNPUlNfVUNEOTAwMAotCXRyaXN0YXRlICJUSSBVQ0Q5MDEyMCwgVUNEOTAxMjQsIFVDRDkwOTAsIFVDRDkwOTEwIgotCWRlZmF1bHQgbgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBoYXJkd2FyZSBtb25pdG9yaW5nIHN1cHBvcnQgZm9yIFRJCi0JICBVQ0Q5MDEyMCwgVUNEOTAxMjQsIFVDRDkwOTAsIFVDRDkwOTEwIFNlcXVlbmNlciBhbmQgU3lzdGVtIEhlYWx0aAotCSAgQ29udHJvbGxlcnMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgdWNkOTAwMC4KLQotY29uZmlnIFNFTlNPUlNfVUNEOTIwMAotCXRyaXN0YXRlICJUSSBVQ0Q5MjIwLCBVQ0Q5MjIyLCBVQ0Q5MjI0LCBVQ0Q5MjQwLCBVQ0Q5MjQ0LCBVQ0Q5MjQ2LCBVQ0Q5MjQ4IgotCWRlZmF1bHQgbgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBoYXJkd2FyZSBtb25pdG9yaW5nIHN1cHBvcnQgZm9yIFRJCi0JICBVQ0Q5MjIwLCBVQ0Q5MjIyLCBVQ0Q5MjI0LCBVQ0Q5MjQwLCBVQ0Q5MjQ0LCBVQ0Q5MjQ2LCBhbmQgVUNEOTI0OAotCSAgRGlnaXRhbCBQV00gU3lzdGVtIENvbnRyb2xsZXJzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAotCSAgYmUgY2FsbGVkIHVjZDkyMDAuCi0KLWVuZGlmICMgUE1CVVMKK3NvdXJjZSBkcml2ZXJzL2h3bW9uL3BtYnVzL0tjb25maWcKIAogY29uZmlnIFNFTlNPUlNfU0hUMTUKIAl0cmlzdGF0ZSAiU2Vuc2lyb24gaHVtaWRpdHkgYW5kIHRlbXBlcmF0dXJlIHNlbnNvcnMuIFNIVDE1IGFuZCBjb21wYXQuIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9NYWtlZmlsZSBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKaW5kZXggZDc5OTVhMS4uM2M5Y2NlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCkBAIC04MCw2ICs4MCw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19MTTkyKQkrPSBsbTkyLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xNOTMpCSs9IGxtOTMubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTE05NTI0MSkJKz0gbG05NTI0MS5vCitvYmotJChDT05GSUdfU0VOU09SU19MTTk1MjQ1KQkrPSBsbTk1MjQ1Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xUQzQxNTEpCSs9IGx0YzQxNTEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTFRDNDIxNSkJKz0gbHRjNDIxNS5vCiBvYmotJChDT05GSUdfU0VOU09SU19MVEM0MjQ1KQkrPSBsdGM0MjQ1Lm8KQEAgLTg3LDEwICs4OCwxMiBAQAogb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMTExMSkJKz0gbWF4MTExMS5vCiBvYmotJChDT05GSUdfU0VOU09SU19NQVgxNjA2NSkJKz0gbWF4MTYwNjUubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMTYxOSkJKz0gbWF4MTYxOS5vCitvYmotJChDT05GSUdfU0VOU09SU19NQVgxNjY4KQkrPSBtYXgxNjY4Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX01BWDY2MzkpCSs9IG1heDY2Mzkubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYNjY0MikJKz0gbWF4NjY0Mi5vCiBvYmotJChDT05GSUdfU0VOU09SU19NQVg2NjUwKQkrPSBtYXg2NjUwLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX01DMTM3ODNfQURDKSs9IG1jMTM3ODMtYWRjLm8KK29iai0kKENPTkZJR19TRU5TT1JTX05UQ19USEVSTUlTVE9SKQkrPSBudGNfdGhlcm1pc3Rvci5vCiBvYmotJChDT05GSUdfU0VOU09SU19QQzg3MzYwKQkrPSBwYzg3MzYwLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1BDODc0MjcpCSs9IHBjODc0Mjcubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfUENGODU5MSkJKz0gcGNmODU5MS5vCkBAIC0xMjEsMTUgKzEyNCw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19XTTgzMVgpCSs9IHdtODMxeC1od21vbi5vCiBvYmotJChDT05GSUdfU0VOU09SU19XTTgzNTApCSs9IHdtODM1MC1od21vbi5vCiAKLSMgUE1CdXMgZHJpdmVycwotb2JqLSQoQ09ORklHX1BNQlVTKQkJKz0gcG1idXNfY29yZS5vCi1vYmotJChDT05GSUdfU0VOU09SU19QTUJVUykJKz0gcG1idXMubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfQURNMTI3NSkJKz0gYWRtMTI3NS5vCi1vYmotJChDT05GSUdfU0VOU09SU19NQVgxNjA2NCkJKz0gbWF4MTYwNjQubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMzQ0NDApCSs9IG1heDM0NDQwLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX01BWDg2ODgpCSs9IG1heDg2ODgubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfVUNEOTAwMCkJKz0gdWNkOTAwMC5vCi1vYmotJChDT05GSUdfU0VOU09SU19VQ0Q5MjAwKQkrPSB1Y2Q5MjAwLm8KK29iai0kKENPTkZJR19QTUJVUykJCSs9IHBtYnVzLwogCiBjY2ZsYWdzLSQoQ09ORklHX0hXTU9OX0RFQlVHX0NISVApIDo9IC1EREVCVUcKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9jb3JldGVtcC5jIGIvZHJpdmVycy9od21vbi9jb3JldGVtcC5jCmluZGV4IDAwNzBkNTQuLjU5ZDgzZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYworKysgYi9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMKQEAgLTQ0LDcgKzQ0LDkgQEAKICNkZWZpbmUgQkFTRV9TWVNGU19BVFRSX05PCTIJLyogU3lzZnMgQmFzZSBhdHRyIG5vIGZvciBjb3JldGVtcCAqLwogI2RlZmluZSBOVU1fUkVBTF9DT1JFUwkJMTYJLyogTnVtYmVyIG9mIFJlYWwgY29yZXMgcGVyIGNwdSAqLwogI2RlZmluZSBDT1JFVEVNUF9OQU1FX0xFTkdUSAkxNwkvKiBTdHJpbmcgTGVuZ3RoIG9mIGF0dHJzICovCi0jZGVmaW5lIE1BWF9BVFRSUwkJNQkvKiBNYXhpbXVtIG5vIG9mIHBlci1jb3JlIGF0dHJzICovCisjZGVmaW5lIE1BWF9DT1JFX0FUVFJTCQk0CS8qIE1heGltdW0gbm8gb2YgYmFzaWMgYXR0cnMgKi8KKyNkZWZpbmUgTUFYX1RIUkVTSF9BVFRSUwkzCS8qIE1heGltdW0gbm8gb2YgVGhyZXNob2xkIGF0dHJzICovCisjZGVmaW5lIFRPVEFMX0FUVFJTCQkoTUFYX0NPUkVfQVRUUlMgKyBNQVhfVEhSRVNIX0FUVFJTKQogI2RlZmluZSBNQVhfQ09SRV9EQVRBCQkoTlVNX1JFQUxfQ09SRVMgKyBCQVNFX1NZU0ZTX0FUVFJfTk8pCiAKICNpZmRlZiBDT05GSUdfU01QCkBAIC02Nyw2ICs2OSw5IEBACiAgKgkJVGhpcyB2YWx1ZSBpcyBwYXNzZWQgYXMgImlkIiBmaWVsZCB0byByZG1zci93cm1zciBmdW5jdGlvbnMuCiAgKiBAc3RhdHVzX3JlZzogT25lIG9mIElBMzJfVEhFUk1fU1RBVFVTIG9yIElBMzJfUEFDS0FHRV9USEVSTV9TVEFUVVMsCiAgKgkJZnJvbSB3aGVyZSB0aGUgdGVtcGVyYXR1cmUgdmFsdWVzIHNob3VsZCBiZSByZWFkLgorICogQGludHJwdF9yZWc6IE9uZSBvZiBJQTMyX1RIRVJNX0lOVEVSUlVQVCBvciBJQTMyX1BBQ0tBR0VfVEhFUk1fSU5URVJSVVBULAorICoJCWZyb20gd2hlcmUgdGhlIHRocmVzaG9sZHMgYXJlIHJlYWQuCisgKiBAYXR0cl9zaXplOiAgVG90YWwgbnVtYmVyIG9mIHByZS1jb3JlIGF0dHJzIGRpc3BsYXllZCBpbiB0aGUgc3lzZnMuCiAgKiBAaXNfcGtnX2RhdGE6IElmIHRoaXMgaXMgMSwgdGhlIHRlbXBfZGF0YSBob2xkcyBwa2d0ZW1wIGRhdGEuCiAgKgkJT3RoZXJ3aXNlLCB0ZW1wX2RhdGEgaG9sZHMgY29yZXRlbXAgZGF0YS4KICAqIEB2YWxpZDogSWYgdGhpcyBpcyAxLCB0aGUgY3VycmVudCB0ZW1wZXJhdHVyZSBpcyB2YWxpZC4KQEAgLTc0LDE1ICs3OSwxOCBAQAogc3RydWN0IHRlbXBfZGF0YSB7CiAJaW50IHRlbXA7CiAJaW50IHR0YXJnZXQ7CisJaW50IHRtaW47CiAJaW50IHRqbWF4OwogCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwogCXVuc2lnbmVkIGludCBjcHU7CiAJdTMyIGNwdV9jb3JlX2lkOwogCXUzMiBzdGF0dXNfcmVnOworCXUzMiBpbnRycHRfcmVnOworCWludCBhdHRyX3NpemU7CiAJYm9vbCBpc19wa2dfZGF0YTsKIAlib29sIHZhbGlkOwotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZF9hdHRyc1tNQVhfQVRUUlNdOwotCWNoYXIgYXR0cl9uYW1lW01BWF9BVFRSU11bQ09SRVRFTVBfTkFNRV9MRU5HVEhdOworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZF9hdHRyc1tUT1RBTF9BVFRSU107CisJY2hhciBhdHRyX25hbWVbVE9UQUxfQVRUUlNdW0NPUkVURU1QX05BTUVfTEVOR1RIXTsKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CiB9OwogCkBAIC0xMzUsNiArMTQzLDE5IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChlYXggPj4gNSkgJiAxKTsKIH0KIAorc3RhdGljIHNzaXplX3Qgc2hvd19tYXhfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJdTMyIGVheCwgZWR4OworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdGVtcF9kYXRhICp0ZGF0YSA9IHBkYXRhLT5jb3JlX2RhdGFbYXR0ci0+aW5kZXhdOworCisJcmRtc3Jfb25fY3B1KHRkYXRhLT5jcHUsIHRkYXRhLT5zdGF0dXNfcmVnLCAmZWF4LCAmZWR4KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAhIShlYXggJiBUSEVSTV9TVEFUVVNfVEhSRVNIT0xEMSkpOworfQorCiBzdGF0aWMgc3NpemVfdCBzaG93X3RqbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCiB7CkBAIC0xNTMsNiArMTc0LDgzIEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHBkYXRhLT5jb3JlX2RhdGFbYXR0ci0+aW5kZXhdLT50dGFyZ2V0KTsKIH0KIAorc3RhdGljIHNzaXplX3Qgc3RvcmVfdHRhcmdldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCXN0cnVjdCB0ZW1wX2RhdGEgKnRkYXRhID0gcGRhdGEtPmNvcmVfZGF0YVthdHRyLT5pbmRleF07CisJdTMyIGVheCwgZWR4OworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCBkaWZmOworCisJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogVEhFUk1fTUFTS19USFJFU0hPTEQxIGlzIDcgYml0cyB3aWRlLiBWYWx1ZXMgYXJlIGVudGVyZWQgaW4gdGVybXMKKwkgKiBvZiBtaWxsaSBkZWdyZWUgY2Vsc2l1cy4gSGVuY2UgZG9uJ3QgYWNjZXB0IHZhbCA+ICgxMjcgKiAxMDAwKQorCSAqLworCWlmICh2YWwgPiB0ZGF0YS0+dGptYXggfHwgdmFsID4gMTI3MDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRpZmYgPSAodGRhdGEtPnRqbWF4IC0gdmFsKSAvIDEwMDA7CisKKwltdXRleF9sb2NrKCZ0ZGF0YS0+dXBkYXRlX2xvY2spOworCXJkbXNyX29uX2NwdSh0ZGF0YS0+Y3B1LCB0ZGF0YS0+aW50cnB0X3JlZywgJmVheCwgJmVkeCk7CisJZWF4ID0gKGVheCAmIH5USEVSTV9NQVNLX1RIUkVTSE9MRDEpIHwKKwkJCQkoZGlmZiA8PCBUSEVSTV9TSElGVF9USFJFU0hPTEQxKTsKKwl3cm1zcl9vbl9jcHUodGRhdGEtPmNwdSwgdGRhdGEtPmludHJwdF9yZWcsIGVheCwgZWR4KTsKKwl0ZGF0YS0+dHRhcmdldCA9IHZhbDsKKwltdXRleF91bmxvY2soJnRkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdG1pbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwZGF0YS0+Y29yZV9kYXRhW2F0dHItPmluZGV4XS0+dG1pbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3RtaW4oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgdGVtcF9kYXRhICp0ZGF0YSA9IHBkYXRhLT5jb3JlX2RhdGFbYXR0ci0+aW5kZXhdOworCXUzMiBlYXgsIGVkeDsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgZGlmZjsKKworCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIFRIRVJNX01BU0tfVEhSRVNIT0xEMCBpcyA3IGJpdHMgd2lkZS4gVmFsdWVzIGFyZSBlbnRlcmVkIGluIHRlcm1zCisJICogb2YgbWlsbGkgZGVncmVlIGNlbHNpdXMuIEhlbmNlIGRvbid0IGFjY2VwdCB2YWwgPiAoMTI3ICogMTAwMCkKKwkgKi8KKwlpZiAodmFsID4gdGRhdGEtPnRqbWF4IHx8IHZhbCA+IDEyNzAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkaWZmID0gKHRkYXRhLT50am1heCAtIHZhbCkgLyAxMDAwOworCisJbXV0ZXhfbG9jaygmdGRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZG1zcl9vbl9jcHUodGRhdGEtPmNwdSwgdGRhdGEtPmludHJwdF9yZWcsICZlYXgsICZlZHgpOworCWVheCA9IChlYXggJiB+VEhFUk1fTUFTS19USFJFU0hPTEQwKSB8CisJCQkJKGRpZmYgPDwgVEhFUk1fU0hJRlRfVEhSRVNIT0xEMCk7CisJd3Jtc3Jfb25fY3B1KHRkYXRhLT5jcHUsIHRkYXRhLT5pbnRycHRfcmVnLCBlYXgsIGVkeCk7CisJdGRhdGEtPnRtaW4gPSB2YWw7CisJbXV0ZXhfdW5sb2NrKCZ0ZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCiBzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAogCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKIHsKQEAgLTM0NCwyMyArNDQyLDMxIEBACiAJCQkJaW50IGF0dHJfbm8pCiB7CiAJaW50IGVyciwgaTsKLQlzdGF0aWMgc3NpemVfdCAoKnJkX3B0cltNQVhfQVRUUlNdKSAoc3RydWN0IGRldmljZSAqZGV2LAorCXN0YXRpYyBzc2l6ZV90ICgqcmRfcHRyW1RPVEFMX0FUVFJTXSkgKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpID0gewotCQkJc2hvd19sYWJlbCwgc2hvd19jcml0X2FsYXJtLCBzaG93X3R0YXJnZXQsCi0JCQlzaG93X3RlbXAsIHNob3dfdGptYXggfTsKLQlzdGF0aWMgY29uc3QgY2hhciAqbmFtZXNbTUFYX0FUVFJTXSA9IHsKKwkJCXNob3dfbGFiZWwsIHNob3dfY3JpdF9hbGFybSwgc2hvd190ZW1wLCBzaG93X3RqbWF4LAorCQkJc2hvd19tYXhfYWxhcm0sIHNob3dfdHRhcmdldCwgc2hvd190bWluIH07CisJc3RhdGljIHNzaXplX3QgKCpyd19wdHJbVE9UQUxfQVRUUlNdKSAoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCkgPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJCXN0b3JlX3R0YXJnZXQsIHN0b3JlX3RtaW4gfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqbmFtZXNbVE9UQUxfQVRUUlNdID0gewogCQkJCQkidGVtcCVkX2xhYmVsIiwgInRlbXAlZF9jcml0X2FsYXJtIiwKLQkJCQkJInRlbXAlZF9tYXgiLCAidGVtcCVkX2lucHV0IiwKLQkJCQkJInRlbXAlZF9jcml0IiB9OworCQkJCQkidGVtcCVkX2lucHV0IiwgInRlbXAlZF9jcml0IiwKKwkJCQkJInRlbXAlZF9tYXhfYWxhcm0iLCAidGVtcCVkX21heCIsCisJCQkJCSJ0ZW1wJWRfbWF4X2h5c3QiIH07CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0FUVFJTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgdGRhdGEtPmF0dHJfc2l6ZTsgaSsrKSB7CiAJCXNucHJpbnRmKHRkYXRhLT5hdHRyX25hbWVbaV0sIENPUkVURU1QX05BTUVfTEVOR1RILCBuYW1lc1tpXSwKIAkJCWF0dHJfbm8pOwogCQlzeXNmc19hdHRyX2luaXQoJnRkYXRhLT5zZF9hdHRyc1tpXS5kZXZfYXR0ci5hdHRyKTsKIAkJdGRhdGEtPnNkX2F0dHJzW2ldLmRldl9hdHRyLmF0dHIubmFtZSA9IHRkYXRhLT5hdHRyX25hbWVbaV07CiAJCXRkYXRhLT5zZF9hdHRyc1tpXS5kZXZfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOworCQlpZiAocndfcHRyW2ldKSB7CisJCQl0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIuYXR0ci5tb2RlIHw9IFNfSVdVU1I7CisJCQl0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIuc3RvcmUgPSByd19wdHJbaV07CisJCX0KIAkJdGRhdGEtPnNkX2F0dHJzW2ldLmRldl9hdHRyLnNob3cgPSByZF9wdHJbaV07Ci0JCXRkYXRhLT5zZF9hdHRyc1tpXS5kZXZfYXR0ci5zdG9yZSA9IE5VTEw7CiAJCXRkYXRhLT5zZF9hdHRyc1tpXS5pbmRleCA9IGF0dHJfbm87CiAJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZ0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIpOwogCQlpZiAoZXJyKQpAQCAtMzc0LDM4ICs0ODAsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIHVwZGF0ZV90dGFyZ2V0KF9fdTggY3B1X21vZGVsLCBzdHJ1Y3QgdGVtcF9kYXRhICp0ZGF0YSwKLQkJCQlzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaW50IGVycjsKLQl1MzIgZWF4LCBlZHg7Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgdHRhcmdldCB2YWx1ZS4gRXZlbnR1YWxseSB0aGlzIHdpbGwgYmUKLQkgKiBpbml0aWFsaXplZCB3aXRoIHRoZSB2YWx1ZSBmcm9tIE1TUl9JQTMyX1RIRVJNX0lOVEVSUlVQVAotCSAqIHJlZ2lzdGVyLiBJZiBJQTMyX1RFTVBFUkFUVVJFX1RBUkdFVCBpcyBzdXBwb3J0ZWQsIHRoaXMKLQkgKiB2YWx1ZSB3aWxsIGJlIG92ZXIgd3JpdHRlbiBiZWxvdy4KLQkgKiBUbyBEbzogUGF0Y2ggdG8gaW5pdGlhbGl6ZSB0dGFyZ2V0IGZyb20gTVNSX0lBMzJfVEhFUk1fSU5URVJSVVBUCi0JICovCi0JdGRhdGEtPnR0YXJnZXQgPSB0ZGF0YS0+dGptYXggLSAyMDAwMDsKLQotCS8qCi0JICogUmVhZCB0aGUgc3RpbGwgdW5kb2N1bWVudGVkIElBMzJfVEVNUEVSQVRVUkVfVEFSR0VULiBJdCBleGlzdHMKLQkgKiBvbiBvbGRlciBDUFVzIGJ1dCBub3QgaW4gdGhpcyByZWdpc3RlciwKLQkgKiBBdG9tcyBkb24ndCBoYXZlIGl0IGVpdGhlci4KLQkgKi8KLQlpZiAoY3B1X21vZGVsID4gMHhlICYmIGNwdV9tb2RlbCAhPSAweDFjKSB7Ci0JCWVyciA9IHJkbXNyX3NhZmVfb25fY3B1KHRkYXRhLT5jcHUsCi0JCQkJTVNSX0lBMzJfVEVNUEVSQVRVUkVfVEFSR0VULCAmZWF4LCAmZWR4KTsKLQkJaWYgKGVycikgewotCQkJZGV2X3dhcm4oZGV2LAotCQkJIlVuYWJsZSB0byByZWFkIElBMzJfVEVNUEVSQVRVUkVfVEFSR0VUIE1TUlxuIik7Ci0JCX0gZWxzZSB7Ci0JCQl0ZGF0YS0+dHRhcmdldCA9IHRkYXRhLT50am1heCAtCi0JCQkJCSgoZWF4ID4+IDgpICYgMHhmZikgKiAxMDAwOwotCQl9Ci0JfQotfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBjaGtfdWNvZGVfdmVyc2lvbihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewpAQCAtNDY0LDkgKzUzOCwxMiBAQAogCiAJdGRhdGEtPnN0YXR1c19yZWcgPSBwa2dfZmxhZyA/IE1TUl9JQTMyX1BBQ0tBR0VfVEhFUk1fU1RBVFVTIDoKIAkJCQkJCQlNU1JfSUEzMl9USEVSTV9TVEFUVVM7CisJdGRhdGEtPmludHJwdF9yZWcgPSBwa2dfZmxhZyA/IE1TUl9JQTMyX1BBQ0tBR0VfVEhFUk1fSU5URVJSVVBUIDoKKwkJCQkJCU1TUl9JQTMyX1RIRVJNX0lOVEVSUlVQVDsKIAl0ZGF0YS0+aXNfcGtnX2RhdGEgPSBwa2dfZmxhZzsKIAl0ZGF0YS0+Y3B1ID0gY3B1OwogCXRkYXRhLT5jcHVfY29yZV9pZCA9IFRPX0NPUkVfSUQoY3B1KTsKKwl0ZGF0YS0+YXR0cl9zaXplID0gTUFYX0NPUkVfQVRUUlM7CiAJbXV0ZXhfaW5pdCgmdGRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlyZXR1cm4gdGRhdGE7CiB9CkBAIC01MTYsNyArNTkzLDE3IEBACiAJZWxzZQogCQl0ZGF0YS0+dGptYXggPSBnZXRfdGptYXgoYywgY3B1LCAmcGRldi0+ZGV2KTsKIAotCXVwZGF0ZV90dGFyZ2V0KGMtPng4Nl9tb2RlbCwgdGRhdGEsICZwZGV2LT5kZXYpOworCS8qCisJICogVGVzdCBpZiB3ZSBjYW4gYWNjZXNzIHRoZSBpbnRycHQgcmVnaXN0ZXIuIElmIHNvLCBpbmNyZWFzZSB0aGUKKwkgKiAnc2l6ZScgZW5vdWdoIHRvIGhhdmUgdHRhcmdldC90bWluL21heF9hbGFybSBpbnRlcmZhY2VzLgorCSAqIEluaXRpYWxpemUgdHRhcmdldCB3aXRoIGJpdHMgMTY6MjIgb2YgTVNSX0lBMzJfVEhFUk1fSU5URVJSVVBUCisJICovCisJZXJyID0gcmRtc3Jfc2FmZV9vbl9jcHUoY3B1LCB0ZGF0YS0+aW50cnB0X3JlZywgJmVheCwgJmVkeCk7CisJaWYgKCFlcnIpIHsKKwkJdGRhdGEtPmF0dHJfc2l6ZSArPSBNQVhfVEhSRVNIX0FUVFJTOworCQl0ZGF0YS0+dHRhcmdldCA9IHRkYXRhLT50am1heCAtICgoZWF4ID4+IDE2KSAmIDB4N2YpICogMTAwMDsKKwl9CisKIAlwZGF0YS0+Y29yZV9kYXRhW2F0dHJfbm9dID0gdGRhdGE7CiAKIAkvKiBDcmVhdGUgc3lzZnMgaW50ZXJmYWNlcyAqLwpAQCAtNTUzLDcgKzY0MCw3IEBACiAJc3RydWN0IHRlbXBfZGF0YSAqdGRhdGEgPSBwZGF0YS0+Y29yZV9kYXRhW2luZHhdOwogCiAJLyogUmVtb3ZlIHRoZSBzeXNmcyBhdHRyaWJ1dGVzICovCi0JZm9yIChpID0gMDsgaSA8IE1BWF9BVFRSUzsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCB0ZGF0YS0+YXR0cl9zaXplOyBpKyspCiAJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZ0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIpOwogCiAJa2ZyZWUocGRhdGEtPmNvcmVfZGF0YVtpbmR4XSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtOTAuYyBiL2RyaXZlcnMvaHdtb24vbG05MC5jCmluZGV4IDJmOTRmOTUuLjkwZGRiODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG05MC5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG05MC5jCkBAIC01NCw2ICs1NCw5IEBACiAgKiBhbmQgZXh0ZW5kZWQgbW9kZS4gVGhleSBhcmUgbW9zdGx5IGNvbXBhdGlibGUgd2l0aCBMTTkwIGV4Y2VwdCBmb3IgYSBkYXRhCiAgKiBmb3JtYXQgZGlmZmVyZW5jZSBmb3IgdGhlIHRlbXBlcmF0dXJlIHZhbHVlIHJlZ2lzdGVycy4KICAqCisgKiBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIHRoZSBTQTU2MDA0IGZyb20gUGhpbGlwcy4gVGhpcyBkZXZpY2UgaXMKKyAqIHBpbi1jb21wYXRpYmxlIHdpdGggdGhlIExNODYsIHRoZSBFRC9FRFAgcGFydHMgYXJlIGFsc28gYWRkcmVzcy1jb21wYXRpYmxlLgorICoKICAqIFNpbmNlIHRoZSBMTTkwIHdhcyB0aGUgZmlyc3QgY2hpcHNldCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIsIG1vc3QKICAqIGNvbW1lbnRzIHdpbGwgcmVmZXIgdG8gdGhpcyBjaGlwc2V0LCBidXQgYXJlIGFjdHVhbGx5IGdlbmVyYWwgYW5kCiAgKiBjb25jZXJuIGFsbCBzdXBwb3J0ZWQgY2hpcHNldHMsIHVubGVzcyBtZW50aW9uZWQgb3RoZXJ3aXNlLgpAQCAtOTYsMTMgKzk5LDE1IEBACiAgKiBNQVg2NjU5IGNhbiBoYXZlIGFkZHJlc3MgMHg0YywgMHg0ZCBvciAweDRlLgogICogTUFYNjY4MCBhbmQgTUFYNjY4MSBjYW4gaGF2ZSBhZGRyZXNzIDB4MTgsIDB4MTksIDB4MWEsIDB4MjksIDB4MmEsIDB4MmIsCiAgKiAweDRjLCAweDRkIG9yIDB4NGUuCisgKiBTQTU2MDA0IGNhbiBoYXZlIGFkZHJlc3MgMHg0OCB0aHJvdWdoIDB4NEYuCiAgKi8KIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsKLQkweDE4LCAweDE5LCAweDFhLCAweDI5LCAweDJhLCAweDJiLCAweDRjLCAweDRkLCAweDRlLCBJMkNfQ0xJRU5UX0VORCB9OworCTB4MTgsIDB4MTksIDB4MWEsIDB4MjksIDB4MmEsIDB4MmIsIDB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsCisJMHg0ZCwgMHg0ZSwgMHg0ZiwgSTJDX0NMSUVOVF9FTkQgfTsKIAogZW51bSBjaGlwcyB7IGxtOTAsIGFkbTEwMzIsIGxtOTksIGxtODYsIG1heDY2NTcsIG1heDY2NTksIGFkdDc0NjEsIG1heDY2ODAsCi0JbWF4NjY0NiwgdzgzbDc3MSwgbWF4NjY5NiB9OworCW1heDY2NDYsIHc4M2w3NzEsIG1heDY2OTYsIHNhNTYwMDQgfTsKIAogLyoKICAqIFRoZSBMTTkwIHJlZ2lzdGVycwpAQCAtMTUyLDYgKzE1NywxMCBAQAogI2RlZmluZSBNQVg2NjU5X1JFR19SX0xPQ0FMX0VNRVJHCTB4MTcKICNkZWZpbmUgTUFYNjY1OV9SRUdfV19MT0NBTF9FTUVSRwkweDE3CiAKKy8qICBTQTU2MDA0IHJlZ2lzdGVycyAqLworCisjZGVmaW5lIFNBNTYwMDRfUkVHX1JfTE9DQUxfVEVNUEwgMHgyMgorCiAjZGVmaW5lIExNOTBfREVGX0NPTlZSQVRFX1JWQUwJNgkvKiBEZWYgY29udmVyc2lvbiByYXRlIHJlZ2lzdGVyIHZhbHVlICovCiAjZGVmaW5lIExNOTBfTUFYX0NPTlZSQVRFX01TCTE2MDAwCS8qIE1heGltdW0gY29udmVyc2lvbiByYXRlIGluIG1zICovCiAKQEAgLTE2MSw3ICsxNzAsNiBAQAogI2RlZmluZSBMTTkwX0ZMQUdfQURUNzQ2MV9FWFQJKDEgPDwgMCkgLyogQURUNzQ2MSBleHRlbmRlZCBtb2RlCSovCiAvKiBEZXZpY2UgZmVhdHVyZXMgKi8KICNkZWZpbmUgTE05MF9IQVZFX09GRlNFVAkoMSA8PCAxKSAvKiB0ZW1wZXJhdHVyZSBvZmZzZXQgcmVnaXN0ZXIJKi8KLSNkZWZpbmUgTE05MF9IQVZFX0xPQ0FMX0VYVAkoMSA8PCAyKSAvKiBleHRlbmRlZCBsb2NhbCB0ZW1wZXJhdHVyZQkqLwogI2RlZmluZSBMTTkwX0hBVkVfUkVNX0xJTUlUX0VYVAkoMSA8PCAzKSAvKiBleHRlbmRlZCByZW1vdGUgbGltaXQJKi8KICNkZWZpbmUgTE05MF9IQVZFX0VNRVJHRU5DWQkoMSA8PCA0KSAvKiAzcmQgdXBwZXIgKGVtZXJnZW5jeSkgbGltaXQJKi8KICNkZWZpbmUgTE05MF9IQVZFX0VNRVJHRU5DWV9BTEFSTSAoMSA8PCA1KS8qIGVtZXJnZW5jeSBhbGFybQkJKi8KQEAgLTE5Miw2ICsyMDAsNyBAQAogCXsgIm1heDY2OTYiLCBtYXg2Njk2IH0sCiAJeyAibmN0MTAwOCIsIGFkdDc0NjEgfSwKIAl7ICJ3ODNsNzcxIiwgdzgzbDc3MSB9LAorCXsgInNhNTYwMDQiLCBzYTU2MDA0IH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGxtOTBfaWQpOwpAQCAtMjA0LDYgKzIxMyw3IEBACiAJdTE2IGFsZXJ0X2FsYXJtczsJLyogV2hpY2ggYWxhcm0gYml0cyB0cmlnZ2VyIEFMRVJUIyAqLwogCQkJCS8qIFVwcGVyIDggYml0cyBmb3IgbWF4NjY5NS85NiAqLwogCXU4IG1heF9jb252cmF0ZTsJLyogTWF4aW11bSBjb252ZXJzaW9uIHJhdGUgcmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCByZWdfbG9jYWxfZXh0OwkvKiBFeHRlbmRlZCBsb2NhbCB0ZW1wIHJlZ2lzdGVyIChvcHRpb25hbCkgKi8KIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbG05MF9wYXJhbXMgbG05MF9wYXJhbXNbXSA9IHsKQEAgLTIzNSwxOSArMjQ1LDIwIEBACiAJCS5tYXhfY29udnJhdGUgPSA5LAogCX0sCiAJW21heDY2NDZdID0gewotCQkuZmxhZ3MgPSBMTTkwX0hBVkVfTE9DQUxfRVhULAogCQkuYWxlcnRfYWxhcm1zID0gMHg3YywKIAkJLm1heF9jb252cmF0ZSA9IDYsCisJCS5yZWdfbG9jYWxfZXh0ID0gTUFYNjY1N19SRUdfUl9MT0NBTF9URU1QTCwKIAl9LAogCVttYXg2NjU3XSA9IHsKLQkJLmZsYWdzID0gTE05MF9IQVZFX0xPQ0FMX0VYVCwKIAkJLmFsZXJ0X2FsYXJtcyA9IDB4N2MsCiAJCS5tYXhfY29udnJhdGUgPSA4LAorCQkucmVnX2xvY2FsX2V4dCA9IE1BWDY2NTdfUkVHX1JfTE9DQUxfVEVNUEwsCiAJfSwKIAlbbWF4NjY1OV0gPSB7Ci0JCS5mbGFncyA9IExNOTBfSEFWRV9MT0NBTF9FWFQgfCBMTTkwX0hBVkVfRU1FUkdFTkNZLAorCQkuZmxhZ3MgPSBMTTkwX0hBVkVfRU1FUkdFTkNZLAogCQkuYWxlcnRfYWxhcm1zID0gMHg3YywKIAkJLm1heF9jb252cmF0ZSA9IDgsCisJCS5yZWdfbG9jYWxfZXh0ID0gTUFYNjY1N19SRUdfUl9MT0NBTF9URU1QTCwKIAl9LAogCVttYXg2NjgwXSA9IHsKIAkJLmZsYWdzID0gTE05MF9IQVZFX09GRlNFVCwKQEAgLTI1NSwxNiArMjY2LDIzIEBACiAJCS5tYXhfY29udnJhdGUgPSA3LAogCX0sCiAJW21heDY2OTZdID0gewotCQkuZmxhZ3MgPSBMTTkwX0hBVkVfTE9DQUxfRVhUIHwgTE05MF9IQVZFX0VNRVJHRU5DWQorCQkuZmxhZ3MgPSBMTTkwX0hBVkVfRU1FUkdFTkNZCiAJCSAgfCBMTTkwX0hBVkVfRU1FUkdFTkNZX0FMQVJNIHwgTE05MF9IQVZFX1RFTVAzLAogCQkuYWxlcnRfYWxhcm1zID0gMHgxODdjLAogCQkubWF4X2NvbnZyYXRlID0gNiwKKwkJLnJlZ19sb2NhbF9leHQgPSBNQVg2NjU3X1JFR19SX0xPQ0FMX1RFTVBMLAogCX0sCiAJW3c4M2w3NzFdID0gewogCQkuZmxhZ3MgPSBMTTkwX0hBVkVfT0ZGU0VUIHwgTE05MF9IQVZFX1JFTV9MSU1JVF9FWFQsCiAJCS5hbGVydF9hbGFybXMgPSAweDdjLAogCQkubWF4X2NvbnZyYXRlID0gOCwKIAl9LAorCVtzYTU2MDA0XSA9IHsKKwkJLmZsYWdzID0gTE05MF9IQVZFX09GRlNFVCB8IExNOTBfSEFWRV9SRU1fTElNSVRfRVhULAorCQkuYWxlcnRfYWxhcm1zID0gMHg3YiwKKwkJLm1heF9jb252cmF0ZSA9IDksCisJCS5yZWdfbG9jYWxfZXh0ID0gU0E1NjAwNF9SRUdfUl9MT0NBTF9URU1QTCwKKwl9LAogfTsKIAogLyoKQEAgLTI4Niw2ICszMDQsNyBAQAogCXUxNiBhbGVydF9hbGFybXM7CS8qIFdoaWNoIGFsYXJtIGJpdHMgdHJpZ2dlciBBTEVSVCMgKi8KIAkJCQkvKiBVcHBlciA4IGJpdHMgZm9yIG1heDY2OTUvOTYgKi8KIAl1OCBtYXhfY29udnJhdGU7CS8qIE1heGltdW0gY29udmVyc2lvbiByYXRlICovCisJdTggcmVnX2xvY2FsX2V4dDsJLyogbG9jYWwgZXh0ZW5zaW9uIHJlZ2lzdGVyIG9mZnNldCAqLwogCiAJLyogcmVnaXN0ZXJzIHZhbHVlcyAqLwogCXM4IHRlbXA4WzhdOwkvKiAwOiBsb2NhbCBsb3cgbGltaXQKQEAgLTQ1Miw5ICs0NzEsOSBAQAogCQlsbTkwX3JlYWRfcmVnKGNsaWVudCwgTE05MF9SRUdfUl9SRU1PVEVfQ1JJVCwgJmRhdGEtPnRlbXA4WzNdKTsKIAkJbG05MF9yZWFkX3JlZyhjbGllbnQsIExNOTBfUkVHX1JfVENSSVRfSFlTVCwgJmRhdGEtPnRlbXBfaHlzdCk7CiAKLQkJaWYgKGRhdGEtPmZsYWdzICYgTE05MF9IQVZFX0xPQ0FMX0VYVCkgeworCQlpZiAoZGF0YS0+cmVnX2xvY2FsX2V4dCkgewogCQkJbG05MF9yZWFkMTYoY2xpZW50LCBMTTkwX1JFR19SX0xPQ0FMX1RFTVAsCi0JCQkJICAgIE1BWDY2NTdfUkVHX1JfTE9DQUxfVEVNUEwsCisJCQkJICAgIGRhdGEtPnJlZ19sb2NhbF9leHQsCiAJCQkJICAgICZkYXRhLT50ZW1wMTFbNF0pOwogCQl9IGVsc2UgewogCQkJaWYgKGxtOTBfcmVhZF9yZWcoY2xpZW50LCBMTTkwX1JFR19SX0xPQ0FMX1RFTVAsCkBAIC0xMDkyLDcgKzExMTEsNyBAQAogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IG5ld19jbGllbnQtPmFkYXB0ZXI7CiAJaW50IGFkZHJlc3MgPSBuZXdfY2xpZW50LT5hZGRyOwogCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotCWludCBtYW5faWQsIGNoaXBfaWQsIHJlZ19jb25maWcxLCByZWdfY29udnJhdGU7CisJaW50IG1hbl9pZCwgY2hpcF9pZCwgcmVnX2NvbmZpZzEsIHJlZ19jb25maWcyLCByZWdfY29udnJhdGU7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTEwOCwxNSArMTEyNywxNiBAQAogCQkJCQkJTE05MF9SRUdfUl9DT05WUkFURSkpIDwgMCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoKGFkZHJlc3MgPT0gMHg0QyB8fCBhZGRyZXNzID09IDB4NEQpCi0JICYmIG1hbl9pZCA9PSAweDAxKSB7IC8qIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgKi8KLQkJaW50IHJlZ19jb25maWcyOwotCisJaWYgKG1hbl9pZCA9PSAweDAxIHx8IG1hbl9pZCA9PSAweDVDIHx8IG1hbl9pZCA9PSAweDQxKSB7CiAJCXJlZ19jb25maWcyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCiAJCQkJCQlMTTkwX1JFR19SX0NPTkZJRzIpOwogCQlpZiAocmVnX2NvbmZpZzIgPCAwKQogCQkJcmV0dXJuIC1FTk9ERVY7CisJfSBlbHNlCisJCXJlZ19jb25maWcyID0gMDsJLyogTWFrZSBjb21waWxlciBoYXBweSAqLwogCisJaWYgKChhZGRyZXNzID09IDB4NEMgfHwgYWRkcmVzcyA9PSAweDREKQorCSAmJiBtYW5faWQgPT0gMHgwMSkgeyAvKiBOYXRpb25hbCBTZW1pY29uZHVjdG9yICovCiAJCWlmICgocmVnX2NvbmZpZzEgJiAweDJBKSA9PSAweDAwCiAJCSAmJiAocmVnX2NvbmZpZzIgJiAweEY4KSA9PSAweDAwCiAJCSAmJiByZWdfY29udnJhdGUgPD0gMHgwOSkgewpAQCAtMTI0NSwxMyArMTI2NSw2IEBACiAJfSBlbHNlCiAJaWYgKGFkZHJlc3MgPT0gMHg0QwogCSAmJiBtYW5faWQgPT0gMHg1QykgeyAvKiBXaW5ib25kL051dm90b24gKi8KLQkJaW50IHJlZ19jb25maWcyOwotCi0JCXJlZ19jb25maWcyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCi0JCQkJCQlMTTkwX1JFR19SX0NPTkZJRzIpOwotCQlpZiAocmVnX2NvbmZpZzIgPCAwKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAkJaWYgKChyZWdfY29uZmlnMSAmIDB4MkEpID09IDB4MDAKIAkJICYmIChyZWdfY29uZmlnMiAmIDB4RjgpID09IDB4MDApIHsKIAkJCWlmIChjaGlwX2lkID09IDB4MDEgLyogVzgzTDc3MVcvRyAqLwpAQCAtMTI2Myw2ICsxMjc2LDE1IEBACiAJCQkJbmFtZSA9ICJ3ODNsNzcxIjsKIAkJCX0KIAkJfQorCX0gZWxzZQorCWlmIChhZGRyZXNzID49IDB4NDggJiYgYWRkcmVzcyA8PSAweDRGCisJICYmIG1hbl9pZCA9PSAweEExKSB7IC8qICBOWFAgU2VtaWNvbmR1Y3Rvci9QaGlsaXBzICovCisJCWlmIChjaGlwX2lkID09IDB4MDAKKwkJICYmIChyZWdfY29uZmlnMSAmIDB4MkEpID09IDB4MDAKKwkJICYmIChyZWdfY29uZmlnMiAmIDB4RkUpID09IDB4MDAKKwkJICYmIHJlZ19jb252cmF0ZSA8PSAweDA5KSB7CisJCQluYW1lID0gInNhNTYwMDQiOworCQl9CiAJfQogCiAJaWYgKCFuYW1lKSB7IC8qIGlkZW50aWZpY2F0aW9uIGZhaWxlZCAqLwpAQCAtMTM2OCw2ICsxMzkwLDcgQEAKIAogCS8qIFNldCBjaGlwIGNhcGFiaWxpdGllcyAqLwogCWRhdGEtPmZsYWdzID0gbG05MF9wYXJhbXNbZGF0YS0+a2luZF0uZmxhZ3M7CisJZGF0YS0+cmVnX2xvY2FsX2V4dCA9IGxtOTBfcGFyYW1zW2RhdGEtPmtpbmRdLnJlZ19sb2NhbF9leHQ7CiAKIAkvKiBTZXQgbWF4aW11bSBjb252ZXJzaW9uIHJhdGUgKi8KIAlkYXRhLT5tYXhfY29udnJhdGUgPSBsbTkwX3BhcmFtc1tkYXRhLT5raW5kXS5tYXhfY29udnJhdGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYyBiL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCmluZGV4IGQzYjQ2NGIuLjUxMzkwMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCkBAIC03NCw4ICs3NCw5IEBACiAjZGVmaW5lIFRUX09GRiAwCiAjZGVmaW5lIFRUX09OIDEKICNkZWZpbmUgVFRfTUFTSyA3Ci0jZGVmaW5lIE1BTlVGQUNUVVJFUl9JRCAweDAxCi0jZGVmaW5lIERFRkFVTFRfUkVWSVNJT04gMHhBNAorI2RlZmluZSBOQVRTRU1JX01BTl9JRAkweDAxCisjZGVmaW5lIExNOTUyMzFfQ0hJUF9JRAkweEExCisjZGVmaW5lIExNOTUyNDFfQ0hJUF9JRAkweEE0CiAKIHN0YXRpYyBjb25zdCB1OCBsbTk1MjQxX3JlZ19hZGRyZXNzW10gPSB7CiAJTE05NTI0MV9SRUdfUl9MT0NBTF9URU1QSCwKQEAgLTMzOCwyMCArMzM5LDI1IEBACiAJCQkgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXdfY2xpZW50LT5hZGFwdGVyOwotCWludCBhZGRyZXNzID0gbmV3X2NsaWVudC0+YWRkcjsKIAljb25zdCBjaGFyICpuYW1lOworCWludCBtZmdfaWQsIGNoaXBfaWQ7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE05NTI0MV9SRUdfUl9NQU5fSUQpCi0JICAgICA9PSBNQU5VRkFDVFVSRVJfSUQpCi0JICAgICYmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE05NTI0MV9SRUdfUl9DSElQX0lEKQotCQk9PSBERUZBVUxUX1JFVklTSU9OKSkgewotCQluYW1lID0gREVWTkFNRTsKLQl9IGVsc2UgewotCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJMTTk1MjQxIGRldGVjdGlvbiBmYWlsZWQgYXQgMHglMDJ4XG4iLAotCQkJYWRkcmVzcyk7CisJbWZnX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNOTUyNDFfUkVHX1JfTUFOX0lEKTsKKwlpZiAobWZnX2lkICE9IE5BVFNFTUlfTUFOX0lEKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNoaXBfaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE05NTI0MV9SRUdfUl9DSElQX0lEKTsKKwlzd2l0Y2ggKGNoaXBfaWQpIHsKKwljYXNlIExNOTUyMzFfQ0hJUF9JRDoKKwkJbmFtZSA9ICJsbTk1MjMxIjsKKwkJYnJlYWs7CisJY2FzZSBMTTk1MjQxX0NISVBfSUQ6CisJCW5hbWUgPSAibG05NTI0MSI7CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtNDMxLDcgKzQzNyw4IEBACiAKIC8qIERyaXZlciBkYXRhIChjb21tb24gdG8gYWxsIGNsaWVudHMpICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbG05NTI0MV9pZFtdID0gewotCXsgREVWTkFNRSwgMCB9LAorCXsgImxtOTUyMzEiLCAwIH0sCisJeyAibG05NTI0MSIsIDAgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbG05NTI0MV9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtOTUyNDUuYyBiL2RyaXZlcnMvaHdtb24vbG05NTI0NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZTllNjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL2xtOTUyNDUuYwpAQCAtMCwwICsxLDU0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBBbGV4YW5kZXIgU3RlaW4gPGFsZXhhbmRlci5zdGVpbkBzeXN0ZWMtZWxlY3Ryb25pYy5jb20+CisgKgorICogVGhlIExNOTUyNDUgaXMgYSBzZW5zb3IgY2hpcCBtYWRlIGJ5IE5hdGlvbmFsIFNlbWljb25kdWN0b3JzLgorICogSXQgcmVwb3J0cyB1cCB0byB0d28gdGVtcGVyYXR1cmVzIChpdHMgb3duIHBsdXMgYW4gZXh0ZXJuYWwgb25lKS4KKyAqIENvbXBsZXRlIGRhdGFzaGVldCBjYW4gYmUgb2J0YWluZWQgZnJvbSBOYXRpb25hbCdzIHdlYnNpdGUgYXQ6CisgKiAgIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL2RzLmNnaS9MTS9MTTk1MjQ1LnBkZgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIGxtOTUyNDEuYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorCisjZGVmaW5lIERFVk5BTUUgImxtOTUyNDUiCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7CisJMHgxOCwgMHgxOSwgMHgyOSwgMHg0YywgMHg0ZCwgSTJDX0NMSUVOVF9FTkQgfTsKKworLyogTE05NTI0NSByZWdpc3RlcnMgKi8KKy8qIGdlbmVyYWwgcmVnaXN0ZXJzICovCisjZGVmaW5lIExNOTUyNDVfUkVHX1JXX0NPTkZJRzEJCTB4MDMKKyNkZWZpbmUgTE05NTI0NV9SRUdfUldfQ09OVkVSU19SQVRFCTB4MDQKKyNkZWZpbmUgTE05NTI0NV9SRUdfV19PTkVfU0hPVAkJMHgwRgorCisvKiBkaW9kZSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIExNOTUyNDVfUkVHX1JXX0NPTkZJRzIJCTB4QkYKKyNkZWZpbmUgTE05NTI0NV9SRUdfUldfUkVNT1RFX09GRkgJMHgxMQorI2RlZmluZSBMTTk1MjQ1X1JFR19SV19SRU1PVEVfT0ZGTAkweDEyCisKKy8qIHN0YXR1cyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTE05NTI0NV9SRUdfUl9TVEFUVVMxCQkweDAyCisjZGVmaW5lIExNOTUyNDVfUkVHX1JfU1RBVFVTMgkJMHgzMworCisvKiBsaW1pdCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTE05NTI0NV9SRUdfUldfUkVNT1RFX09TX0xJTUlUCQkweDA3CisjZGVmaW5lIExNOTUyNDVfUkVHX1JXX0xPQ0FMX09TX1RDUklUX0xJTUlUCTB4MjAKKyNkZWZpbmUgTE05NTI0NV9SRUdfUldfUkVNT1RFX1RDUklUX0xJTUlUCTB4MTkKKyNkZWZpbmUgTE05NTI0NV9SRUdfUldfQ09NTU9OX0hZU1RFUkVTSVMJMHgyMQorCisvKiB0ZW1wZXJhdHVyZSBzaWduZWQgKi8KKyNkZWZpbmUgTE05NTI0NV9SRUdfUl9MT0NBTF9URU1QSF9TCTB4MDAKKyNkZWZpbmUgTE05NTI0NV9SRUdfUl9MT0NBTF9URU1QTF9TCTB4MzAKKyNkZWZpbmUgTE05NTI0NV9SRUdfUl9SRU1PVEVfVEVNUEhfUwkweDAxCisjZGVmaW5lIExNOTUyNDVfUkVHX1JfUkVNT1RFX1RFTVBMX1MJMHgxMAorLyogdGVtcGVyYXR1cmUgdW5zaWduZWQgKi8KKyNkZWZpbmUgTE05NTI0NV9SRUdfUl9SRU1PVEVfVEVNUEhfVQkweDMxCisjZGVmaW5lIExNOTUyNDVfUkVHX1JfUkVNT1RFX1RFTVBMX1UJMHgzMgorCisvKiBpZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTE05NTI0NV9SRUdfUl9NQU5fSUQJCTB4RkUKKyNkZWZpbmUgTE05NTI0NV9SRUdfUl9DSElQX0lECQkweEZGCisKKy8qIExNOTUyNDUgc3BlY2lmaWMgYml0ZmllbGRzICovCisjZGVmaW5lIENGR19TVE9QCQkweDQwCisjZGVmaW5lIENGR19SRU1PVEVfVENSSVRfTUFTSwkweDEwCisjZGVmaW5lIENGR19SRU1PVEVfT1NfTUFTSwkweDA4CisjZGVmaW5lIENGR19MT0NBTF9UQ1JJVF9NQVNLCTB4MDQKKyNkZWZpbmUgQ0ZHX0xPQ0FMX09TX01BU0sJMHgwMgorCisjZGVmaW5lIENGRzJfT1NfQTAJCTB4NDAKKyNkZWZpbmUgQ0ZHMl9ESU9ERV9GQVVMVF9PUwkweDIwCisjZGVmaW5lIENGRzJfRElPREVfRkFVTFRfVENSSVQJMHgxMAorI2RlZmluZSBDRkcyX1JFTU9URV9UVAkJMHgwOAorI2RlZmluZSBDRkcyX1JFTU9URV9GSUxURVJfRElTCTB4MDAKKyNkZWZpbmUgQ0ZHMl9SRU1PVEVfRklMVEVSX0VOCTB4MDYKKworLyogY29udmVyc2F0aW9uIHJhdGUgaW4gbXMgKi8KKyNkZWZpbmUgUkFURV9DUjAwNjMJMHgwMAorI2RlZmluZSBSQVRFX0NSMDM2NAkweDAxCisjZGVmaW5lIFJBVEVfQ1IxMDAwCTB4MDIKKyNkZWZpbmUgUkFURV9DUjI1MDAJMHgwMworCisjZGVmaW5lIFNUQVRVUzFfRElPREVfRkFVTFQJMHgwNAorI2RlZmluZSBTVEFUVVMxX1JUQ1JJVAkJMHgwMgorI2RlZmluZSBTVEFUVVMxX0xPQwkJMHgwMQorCisjZGVmaW5lIE1BTlVGQUNUVVJFUl9JRAkJMHgwMQorI2RlZmluZSBERUZBVUxUX1JFVklTSU9OCTB4QjMKKworc3RhdGljIGNvbnN0IHU4IGxtOTUyNDVfcmVnX2FkZHJlc3NbXSA9IHsKKwlMTTk1MjQ1X1JFR19SX0xPQ0FMX1RFTVBIX1MsCisJTE05NTI0NV9SRUdfUl9MT0NBTF9URU1QTF9TLAorCUxNOTUyNDVfUkVHX1JfUkVNT1RFX1RFTVBIX1MsCisJTE05NTI0NV9SRUdfUl9SRU1PVEVfVEVNUExfUywKKwlMTTk1MjQ1X1JFR19SX1JFTU9URV9URU1QSF9VLAorCUxNOTUyNDVfUkVHX1JfUkVNT1RFX1RFTVBMX1UsCisJTE05NTI0NV9SRUdfUldfTE9DQUxfT1NfVENSSVRfTElNSVQsCisJTE05NTI0NV9SRUdfUldfUkVNT1RFX1RDUklUX0xJTUlULAorCUxNOTUyNDVfUkVHX1JXX0NPTU1PTl9IWVNURVJFU0lTLAorCUxNOTUyNDVfUkVHX1JfU1RBVFVTMSwKK307CisKKy8qIENsaWVudCBkYXRhIChlYWNoIGNsaWVudCBnZXRzIGl0cyBvd24pICovCitzdHJ1Y3QgbG05NTI0NV9kYXRhIHsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwkvKiBpbiBqaWZmaWVzICovCisJdW5zaWduZWQgbG9uZyBpbnRlcnZhbDsJLyogaW4gbXNlY3MgKi8KKwlib29sIHZhbGlkOwkJLyogemVybyB1bnRpbCBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCS8qIHJlZ2lzdGVycyB2YWx1ZXMgKi8KKwl1OCByZWdzW0FSUkFZX1NJWkUobG05NTI0NV9yZWdfYWRkcmVzcyldOworCXU4IGNvbmZpZzEsIGNvbmZpZzI7Cit9OworCisvKiBDb252ZXJzaW9ucyAqLworc3RhdGljIGludCB0ZW1wX2Zyb21fcmVnX3Vuc2lnbmVkKHU4IHZhbF9oLCB1OCB2YWxfbCkKK3sKKwlyZXR1cm4gdmFsX2ggKiAxMDAwICsgdmFsX2wgKiAxMDAwIC8gMjU2OworfQorCitzdGF0aWMgaW50IHRlbXBfZnJvbV9yZWdfc2lnbmVkKHU4IHZhbF9oLCB1OCB2YWxfbCkKK3sKKwlpZiAodmFsX2ggJiAweDgwKQorCQlyZXR1cm4gKHZhbF9oIC0gMHgxMDApICogMTAwMDsKKwlyZXR1cm4gdGVtcF9mcm9tX3JlZ191bnNpZ25lZCh2YWxfaCwgdmFsX2wpOworfQorCitzdGF0aWMgc3RydWN0IGxtOTUyNDVfZGF0YSAqbG05NTI0NV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZAorCQkrIG1zZWNzX3RvX2ppZmZpZXMoZGF0YS0+aW50ZXJ2YWwpKSB8fCAhZGF0YS0+dmFsaWQpIHsKKwkJaW50IGk7CisKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJVcGRhdGluZyBsbTk1MjQ1IGRhdGEuXG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobG05NTI0NV9yZWdfYWRkcmVzcyk7IGkrKykKKwkJCWRhdGEtPnJlZ3NbaV0KKwkJCSAgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJICAgICBsbTk1MjQ1X3JlZ19hZGRyZXNzW2ldKTsKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxtOTUyNDVfcmVhZF9jb252ZXJzaW9uX3JhdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgcmF0ZTsKKwl1bnNpZ25lZCBsb25nIGludGVydmFsOworCisJcmF0ZSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDVfUkVHX1JXX0NPTlZFUlNfUkFURSk7CisKKwlzd2l0Y2ggKHJhdGUpIHsKKwljYXNlIFJBVEVfQ1IwMDYzOgorCQlpbnRlcnZhbCA9IDYzOworCQlicmVhazsKKwljYXNlIFJBVEVfQ1IwMzY0OgorCQlpbnRlcnZhbCA9IDM2NDsKKwkJYnJlYWs7CisJY2FzZSBSQVRFX0NSMTAwMDoKKwkJaW50ZXJ2YWwgPSAxMDAwOworCQlicmVhazsKKwljYXNlIFJBVEVfQ1IyNTAwOgorCWRlZmF1bHQ6CisJCWludGVydmFsID0gMjUwMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGludGVydmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsbTk1MjQ1X3NldF9jb252ZXJzaW9uX3JhdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCXVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwpCit7CisJaW50IHJhdGU7CisKKwlpZiAoaW50ZXJ2YWwgPD0gNjMpIHsKKwkJaW50ZXJ2YWwgPSA2MzsKKwkJcmF0ZSA9IFJBVEVfQ1IwMDYzOworCX0gZWxzZSBpZiAoaW50ZXJ2YWwgPD0gMzY0KSB7CisJCWludGVydmFsID0gMzY0OworCQlyYXRlID0gUkFURV9DUjAzNjQ7CisJfSBlbHNlIGlmIChpbnRlcnZhbCA8PSAxMDAwKSB7CisJCWludGVydmFsID0gMTAwMDsKKwkJcmF0ZSA9IFJBVEVfQ1IxMDAwOworCX0gZWxzZSB7CisJCWludGVydmFsID0gMjUwMDsKKwkJcmF0ZSA9IFJBVEVfQ1IyNTAwOworCX0KKworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQ1X1JFR19SV19DT05WRVJTX1JBVEUsIHJhdGUpOworCisJcmV0dXJuIGludGVydmFsOworfQorCisvKiBTeXNmcyBzdHVmZiAqLworc3RhdGljIHNzaXplX3Qgc2hvd19pbnB1dChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICBjaGFyICpidWYpCit7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGxtOTUyNDVfdXBkYXRlX2RldmljZShkZXYpOworCWludCB0ZW1wOworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisKKwkvKgorCSAqIEluZGV4IDAgKExvY2FsIHRlbXApIGlzIGFsd2F5cyBzaWduZWQKKwkgKiBJbmRleCAyIChSZW1vdGUgdGVtcCkgaGFzIGJvdGggc2lnbmVkIGFuZCB1bnNpZ25lZCBkYXRhCisJICogdXNlIHNpZ25lZCBjYWxjdWxhdGlvbiBmb3IgcmVtb3RlIGlmIHNpZ25lZCBiaXQgaXMgc2V0CisJICovCisJaWYgKGluZGV4ID09IDAgfHwgZGF0YS0+cmVnc1tpbmRleF0gJiAweDgwKQorCQl0ZW1wID0gdGVtcF9mcm9tX3JlZ19zaWduZWQoZGF0YS0+cmVnc1tpbmRleF0sCisJCQkgICAgZGF0YS0+cmVnc1tpbmRleCArIDFdKTsKKwllbHNlCisJCXRlbXAgPSB0ZW1wX2Zyb21fcmVnX3Vuc2lnbmVkKGRhdGEtPnJlZ3NbaW5kZXggKyAyXSwKKwkJCSAgICBkYXRhLT5yZWdzW2luZGV4ICsgM10pOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVkXG4iLCB0ZW1wKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19saW1pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gbG05NTI0NV91cGRhdGVfZGV2aWNlKGRldik7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlZFxuIiwKKwkJCWRhdGEtPnJlZ3NbaW5kZXhdICogMTAwMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9saW1pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJdmFsIC89IDEwMDA7CisKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgKGluZGV4ID09IDYgPyAxMjcgOiAyNTUpKTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWRhdGEtPnZhbGlkID0gMDsKKworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBsbTk1MjQ1X3JlZ19hZGRyZXNzW2luZGV4XSwgdmFsKTsKKworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfY3JpdF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJdmFsIC89IDEwMDA7CisKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMzEpOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJZGF0YS0+dmFsaWQgPSAwOworCisJLyogc2hhcmVkIGNyaXQgaHlzdGVyZXNpcyAqLworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQ1X1JFR19SV19DT01NT05fSFlTVEVSRVNJUywKKwkJdmFsKTsKKworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3R5cGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLAorCQlkYXRhLT5jb25maWcyICYgQ0ZHMl9SRU1PVEVfVFQgPyAiMVxuIiA6ICIyXG4iKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3R5cGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh2YWwgPT0gMSkKKwkJZGF0YS0+Y29uZmlnMiB8PSBDRkcyX1JFTU9URV9UVDsKKwllbHNlCisJCWRhdGEtPmNvbmZpZzIgJj0gfkNGRzJfUkVNT1RFX1RUOworCisJZGF0YS0+dmFsaWQgPSAwOworCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDVfUkVHX1JXX0NPTkZJRzIsCisJCQkJICBkYXRhLT5jb25maWcyKTsKKworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBsbTk1MjQ1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVkXG4iLAorCQkJISEoZGF0YS0+cmVnc1s5XSAmIGluZGV4KSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW50ZXJ2YWwoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBsbTk1MjQ1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlbHVcbiIsIGRhdGEtPmludGVydmFsKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWRhdGEtPmludGVydmFsID0gbG05NTI0NV9zZXRfY29udmVyc2lvbl9yYXRlKGNsaWVudCwgdmFsKTsKKworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X2lucHV0LCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbGltaXQsCisJCXNldF9saW1pdCwgNik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXRfaHlzdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbGltaXQsCisJCXNldF9jcml0X2h5c3QsIDgpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLAorCQlTVEFUVVMxX0xPQyk7CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5wdXQsIE5VTEwsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9jcml0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19saW1pdCwKKwkJc2V0X2xpbWl0LCA3KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfY3JpdF9oeXN0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19saW1pdCwKKwkJc2V0X2NyaXRfaHlzdCwgOCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2NyaXRfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsCisJCVNUQVRVUzFfUlRDUklUKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfdHlwZSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdHlwZSwKKwkJc2V0X3R5cGUsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9mYXVsdCwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwKKwkJU1RBVFVTMV9ESU9ERV9GQVVMVCk7CisKK3N0YXRpYyBERVZJQ0VfQVRUUih1cGRhdGVfaW50ZXJ2YWwsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2ludGVydmFsLAorCQlzZXRfaW50ZXJ2YWwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbG05NTI0NV9hdHRyaWJ1dGVzW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdF9oeXN0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9jcml0X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfY3JpdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfY3JpdF9oeXN0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9jcml0X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl90eXBlLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9mYXVsdC5kZXZfYXR0ci5hdHRyLAorCSZkZXZfYXR0cl91cGRhdGVfaW50ZXJ2YWwuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsbTk1MjQ1X2dyb3VwID0geworCS5hdHRycyA9IGxtOTUyNDVfYXR0cmlidXRlcywKK307CisKKy8qIFJldHVybiAwIGlmIGRldGVjdGlvbiBpcyBzdWNjZXNzZnVsLCAtRU5PREVWIG90aGVyd2lzZSAqLworc3RhdGljIGludCBsbTk1MjQ1X2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudCwKKwkJCSAgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQoreworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IG5ld19jbGllbnQtPmFkYXB0ZXI7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBMTTk1MjQ1X1JFR19SX01BTl9JRCkKKwkJCSE9IE1BTlVGQUNUVVJFUl9JRAorCQl8fCBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE05NTI0NV9SRUdfUl9DSElQX0lEKQorCQkJIT0gREVGQVVMVF9SRVZJU0lPTikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzdHJsY3B5KGluZm8tPnR5cGUsIERFVk5BTUUsIEkyQ19OQU1FX1NJWkUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsbTk1MjQ1X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZGF0YS0+dmFsaWQgPSAwOworCWRhdGEtPmludGVydmFsID0gbG05NTI0NV9yZWFkX2NvbnZlcnNpb25fcmF0ZShjbGllbnQpOworCisJZGF0YS0+Y29uZmlnMSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCUxNOTUyNDVfUkVHX1JXX0NPTkZJRzEpOworCWRhdGEtPmNvbmZpZzIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQlMTTk1MjQ1X1JFR19SV19DT05GSUcyKTsKKworCWlmIChkYXRhLT5jb25maWcxICYgQ0ZHX1NUT1ApIHsKKwkJLyogQ2xlYXIgdGhlIHN0YW5kYnkgYml0ICovCisJCWRhdGEtPmNvbmZpZzEgJj0gfkNGR19TVE9QOworCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0NV9SRUdfUldfQ09ORklHMSwKKwkJCWRhdGEtPmNvbmZpZzEpOworCX0KK30KKworc3RhdGljIGludCBsbTk1MjQ1X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhOworCWludCBlcnI7CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxtOTUyNDVfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIEluaXRpYWxpemUgdGhlIExNOTUyNDUgY2hpcCAqLworCWxtOTUyNDVfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmbmV3X2NsaWVudC0+ZGV2LmtvYmosICZsbTk1MjQ1X2dyb3VwKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfZnJlZTsKKworCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOworCQlnb3RvIGV4aXRfcmVtb3ZlX2ZpbGVzOworCX0KKworCXJldHVybiAwOworCitleGl0X3JlbW92ZV9maWxlczoKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmbG05NTI0NV9ncm91cCk7CitleGl0X2ZyZWU6CisJa2ZyZWUoZGF0YSk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbG05NTI0NV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmxtOTUyNDVfZ3JvdXApOworCisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIERyaXZlciBkYXRhIChjb21tb24gdG8gYWxsIGNsaWVudHMpICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbG05NTI0NV9pZFtdID0geworCXsgREVWTkFNRSwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBsbTk1MjQ1X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGxtOTUyNDVfZHJpdmVyID0geworCS5jbGFzcwkJPSBJMkNfQ0xBU1NfSFdNT04sCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSBERVZOQU1FLAorCX0sCisJLnByb2JlCQk9IGxtOTUyNDVfcHJvYmUsCisJLnJlbW92ZQkJPSBsbTk1MjQ1X3JlbW92ZSwKKwkuaWRfdGFibGUJPSBsbTk1MjQ1X2lkLAorCS5kZXRlY3QJCT0gbG05NTI0NV9kZXRlY3QsCisJLmFkZHJlc3NfbGlzdAk9IG5vcm1hbF9pMmMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzZW5zb3JzX2xtOTUyNDVfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmbG05NTI0NV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2Vuc29yc19sbTk1MjQ1X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmbG05NTI0NV9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJBbGV4YW5kZXIgU3RlaW4gPGFsZXhhbmRlci5zdGVpbkBzeXN0ZWMtZWxlY3Ryb25pYy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxNOTUyNDUgc2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzZW5zb3JzX2xtOTUyNDVfaW5pdCk7Cittb2R1bGVfZXhpdChzZW5zb3JzX2xtOTUyNDVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL21heDE2NjguYyBiL2RyaXZlcnMvaHdtb24vbWF4MTY2OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZDFiMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL21heDE2NjguYwpAQCAtMCwwICsxLDUwMiBAQAorLyoKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEgRGF2aWQgR2VvcmdlIDxkYXZpZC5nZW9yZ2VAc2thLmFjLnphPgorCisgICAgYmFzZWQgb24gYWRtMTAyMS5jCisgICAgc29tZSBjcmVkaXQgdG8gQ2hyaXN0b3BoIFNjaGV1cmVyLCBidXQgbGFyZ2VseSBhIHJld3JpdGUKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorCisvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG1heDE2NjhfYWRkcl9saXN0W10gPSB7CisJMHgxOCwgMHgxOSwgMHgxYSwgMHgyOSwgMHgyYSwgMHgyYiwgMHg0YywgMHg0ZCwgMHg0ZSwgSTJDX0NMSUVOVF9FTkQgfTsKKworLyogbWF4MTY2OCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBNQVgxNjY4X1JFR19URU1QKG5yKQkobnIpCisjZGVmaW5lIE1BWDE2NjhfUkVHX1NUQVQxCTB4MDUKKyNkZWZpbmUgTUFYMTY2OF9SRUdfU1RBVDIJMHgwNgorI2RlZmluZSBNQVgxNjY4X1JFR19NQU5fSUQJMHhmZQorI2RlZmluZSBNQVgxNjY4X1JFR19ERVZfSUQJMHhmZgorCisvKiBsaW1pdHMgKi8KKworLyogd3JpdGUgaGlnaCBsaW1pdHMgKi8KKyNkZWZpbmUgTUFYMTY2OF9SRUdfTElNSF9XUihucikJKDB4MTMgKyAyICogKG5yKSkKKy8qIHdyaXRlIGxvdyBsaW1pdHMgKi8KKyNkZWZpbmUgTUFYMTY2OF9SRUdfTElNTF9XUihucikJKDB4MTQgKyAyICogKG5yKSkKKy8qIHJlYWQgaGlnaCBsaW1pdHMgKi8KKyNkZWZpbmUgTUFYMTY2OF9SRUdfTElNSF9SRChucikJKDB4MDggKyAyICogKG5yKSkKKy8qIHJlYWQgbG93IGxpbWl0cyAqLworI2RlZmluZSBNQVgxNjY4X1JFR19MSU1MX1JEKG5yKQkoMHgwOSArIDIgKiAobnIpKQorCisvKiBtYW51ZmFjdHVyZXIgYW5kIGRldmljZSBJRCBDb25zdGFudHMgKi8KKyNkZWZpbmUgTUFOX0lEX01BWElNCQkweDRkCisjZGVmaW5lIERFVl9JRF9NQVgxNjY4CQkweDMKKyNkZWZpbmUgREVWX0lEX01BWDE4MDUJCTB4NQorI2RlZmluZSBERVZfSURfTUFYMTk4OQkJMHhiCisKKy8qIHJlYWQgb25seSBtb2RlIG1vZHVsZSBwYXJhbWV0ZXIgKi8KK3N0YXRpYyBpbnQgcmVhZF9vbmx5OworbW9kdWxlX3BhcmFtKHJlYWRfb25seSwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlYWRfb25seSwgIkRvbid0IHNldCBhbnkgdmFsdWVzLCByZWFkIG9ubHkgbW9kZSIpOworCitlbnVtIGNoaXBzIHsgbWF4MTY2OCwgbWF4MTgwNSwgbWF4MTk4OSB9OworCitzdHJ1Y3QgbWF4MTY2OF9kYXRhIHsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisJZW51bSBjaGlwcyB0eXBlOworCisJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOworCWNoYXIgdmFsaWQ7CQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCisJLyogMXggbG9jYWwgYW5kIDR4IHJlbW90ZSAqLworCXM4IHRlbXBfbWF4WzVdOworCXM4IHRlbXBfbWluWzVdOworCXM4IHRlbXBbNV07CisJdTE2IGFsYXJtczsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWF4MTY2OF9kYXRhICptYXgxNjY4X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IG1heDE2NjhfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtYXgxNjY4X2RhdGEgKnJldCA9IGRhdGE7CisJczMyIHZhbDsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmIChkYXRhLT52YWxpZCAmJiAhdGltZV9hZnRlcihqaWZmaWVzLAorCQkJZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKyBIWiAvIDIpKQorCQlnb3RvIGFib3J0OworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQVgxNjY4X1JFR19URU1QKGkpKTsKKwkJaWYgKHVubGlrZWx5KHZhbCA8IDApKSB7CisJCQlyZXQgPSBFUlJfUFRSKHZhbCk7CisJCQlnb3RvIGFib3J0OworCQl9CisJCWRhdGEtPnRlbXBbaV0gPSAoczgpIHZhbDsKKworCQl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQVgxNjY4X1JFR19MSU1IX1JEKGkpKTsKKwkJaWYgKHVubGlrZWx5KHZhbCA8IDApKSB7CisJCQlyZXQgPSBFUlJfUFRSKHZhbCk7CisJCQlnb3RvIGFib3J0OworCQl9CisJCWRhdGEtPnRlbXBfbWF4W2ldID0gKHM4KSB2YWw7CisKKwkJdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUFYMTY2OF9SRUdfTElNTF9SRChpKSk7CisJCWlmICh1bmxpa2VseSh2YWwgPCAwKSkgeworCQkJcmV0ID0gRVJSX1BUUih2YWwpOworCQkJZ290byBhYm9ydDsKKwkJfQorCQlkYXRhLT50ZW1wX21pbltpXSA9IChzOCkgdmFsOworCX0KKworCXZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1BWDE2NjhfUkVHX1NUQVQxKTsKKwlpZiAodW5saWtlbHkodmFsIDwgMCkpIHsKKwkJcmV0ID0gRVJSX1BUUih2YWwpOworCQlnb3RvIGFib3J0OworCX0KKwlkYXRhLT5hbGFybXMgPSB2YWwgPDwgODsKKworCXZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1BWDE2NjhfUkVHX1NUQVQyKTsKKwlpZiAodW5saWtlbHkodmFsIDwgMCkpIHsKKwkJcmV0ID0gRVJSX1BUUih2YWwpOworCQlnb3RvIGFib3J0OworCX0KKwlkYXRhLT5hbGFybXMgfD0gdmFsOworCisJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwlkYXRhLT52YWxpZCA9IDE7CithYm9ydDoKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCXN0cnVjdCBtYXgxNjY4X2RhdGEgKmRhdGEgPSBtYXgxNjY4X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKworCWlmIChJU19FUlIoZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnRlbXBbaW5kZXhdICogMTAwMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9tYXgoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJc3RydWN0IG1heDE2NjhfZGF0YSAqZGF0YSA9IG1heDE2NjhfdXBkYXRlX2RldmljZShkZXYpOworCisJaWYgKElTX0VSUihkYXRhKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+dGVtcF9tYXhbaW5kZXhdICogMTAwMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9taW4oc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJc3RydWN0IG1heDE2NjhfZGF0YSAqZGF0YSA9IG1heDE2NjhfdXBkYXRlX2RldmljZShkZXYpOworCisJaWYgKElTX0VSUihkYXRhKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+dGVtcF9taW5baW5kZXhdICogMTAwMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY2hhciAqYnVmKQoreworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJc3RydWN0IG1heDE2NjhfZGF0YSAqZGF0YSA9IG1heDE2NjhfdXBkYXRlX2RldmljZShkZXYpOworCisJaWYgKElTX0VSUihkYXRhKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgKGRhdGEtPmFsYXJtcyA+PiBpbmRleCkgJiAweDEpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2ZhdWx0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCXN0cnVjdCBtYXgxNjY4X2RhdGEgKmRhdGEgPSBtYXgxNjY4X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKworCWlmIChJU19FUlIoZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsCisJCSAgICAgICAoZGF0YS0+YWxhcm1zICYgKDEgPDwgMTIpKSAmJiBkYXRhLT50ZW1wW2luZGV4XSA9PSAxMjcpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9tYXgoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbWF4MTY2OF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB0ZW1wOworCWludCByZXQ7CisKKwlyZXQgPSBrc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX21heFtpbmRleF0gPSBTRU5TT1JTX0xJTUlUKHRlbXAvMTAwMCwgLTEyOCwgMTI3KTsKKwlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCU1BWDE2NjhfUkVHX0xJTUhfV1IoaW5kZXgpLAorCQkJCQlkYXRhLT50ZW1wX21heFtpbmRleF0pKQorCQljb3VudCA9IC1FSU87CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBtYXgxNjY4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHRlbXA7CisJaW50IHJldDsKKworCXJldCA9IGtzdHJ0b2woYnVmLCAxMCwgJnRlbXApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfbWluW2luZGV4XSA9IFNFTlNPUlNfTElNSVQodGVtcC8xMDAwLCAtMTI4LCAxMjcpOworCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJTUFYMTY2OF9SRUdfTElNTF9XUihpbmRleCksCisJCQkJCWRhdGEtPnRlbXBfbWF4W2luZGV4XSkpCisJCWNvdW50ID0gLUVJTzsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lSVUdPLCBzaG93X3RlbXBfbWF4LAorCQkJCXNldF90ZW1wX21heCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21pbiwgU19JUlVHTywgc2hvd190ZW1wX21pbiwKKwkJCQlzZXRfdGVtcF9taW4sIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbWF4LCBTX0lSVUdPLCBzaG93X3RlbXBfbWF4LAorCQkJCXNldF90ZW1wX21heCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX21pbiwgU19JUlVHTywgc2hvd190ZW1wX21pbiwKKwkJCQlzZXRfdGVtcF9taW4sIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfbWF4LCBTX0lSVUdPLCBzaG93X3RlbXBfbWF4LAorCQkJCXNldF90ZW1wX21heCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX21pbiwgU19JUlVHTywgc2hvd190ZW1wX21pbiwKKwkJCQlzZXRfdGVtcF9taW4sIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNF9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDRfbWF4LCBTX0lSVUdPLCBzaG93X3RlbXBfbWF4LAorCQkJCXNldF90ZW1wX21heCwgMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA0X21pbiwgU19JUlVHTywgc2hvd190ZW1wX21pbiwKKwkJCQlzZXRfdGVtcF9taW4sIDMpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCA0KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDVfbWF4LCBTX0lSVUdPLCBzaG93X3RlbXBfbWF4LAorCQkJCXNldF90ZW1wX21heCwgNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA1X21pbiwgU19JUlVHTywgc2hvd190ZW1wX21pbiwKKwkJCQlzZXRfdGVtcF9taW4sIDQpOworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTQpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9taW5fYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbWluX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA3KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbWF4X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA2KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfbWluX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA1KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfbWF4X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA0KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDRfbWluX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDRfbWF4X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDVfbWluX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDVfbWF4X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAwKTsKKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9mYXVsdCwgU19JUlVHTywgc2hvd19mYXVsdCwgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2ZhdWx0LCBTX0lSVUdPLCBzaG93X2ZhdWx0LCBOVUxMLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDRfZmF1bHQsIFNfSVJVR08sIHNob3dfZmF1bHQsIE5VTEwsIDMpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNV9mYXVsdCwgU19JUlVHTywgc2hvd19mYXVsdCwgTlVMTCwgNCk7CisKKy8qIEF0dHJpYnV0ZXMgY29tbW9uIHRvIE1BWDE2NjgsIE1BWDE5ODkgYW5kIE1BWDE4MDUgKi8KK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICptYXgxNjY4X2F0dHJpYnV0ZV9jb21tb25bXSA9IHsKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKworCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9mYXVsdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfZmF1bHQuZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCisvKiBBdHRyaWJ1dGVzIG5vdCBwcmVzZW50IG9uIE1BWDE4MDUgKi8KK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICptYXgxNjY4X2F0dHJpYnV0ZV91bmlxdWVbXSA9IHsKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDVfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wNV9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXA1X2lucHV0LmRldl9hdHRyLmF0dHIsCisKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wNV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXA1X21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wNF9mYXVsdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDVfZmF1bHQuZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgbW9kZV90IG1heDE2NjhfYXR0cmlidXRlX21vZGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBpbnQgaW5kZXgpCit7CisJaW50IHJldCA9IFNfSVJVR087CisJaWYgKHJlYWRfb25seSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoYXR0ciA9PSAmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heC5kZXZfYXR0ci5hdHRyIHx8CisJICAgIGF0dHIgPT0gJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9tYXguZGV2X2F0dHIuYXR0ciB8fAorCSAgICBhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWF4LmRldl9hdHRyLmF0dHIgfHwKKwkgICAgYXR0ciA9PSAmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X21heC5kZXZfYXR0ci5hdHRyIHx8CisJICAgIGF0dHIgPT0gJnNlbnNvcl9kZXZfYXR0cl90ZW1wNV9tYXguZGV2X2F0dHIuYXR0ciB8fAorCSAgICBhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWluLmRldl9hdHRyLmF0dHIgfHwKKwkgICAgYXR0ciA9PSAmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21pbi5kZXZfYXR0ci5hdHRyIHx8CisJICAgIGF0dHIgPT0gJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19taW4uZGV2X2F0dHIuYXR0ciB8fAorCSAgICBhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfbWluLmRldl9hdHRyLmF0dHIgfHwKKwkgICAgYXR0ciA9PSAmc2Vuc29yX2Rldl9hdHRyX3RlbXA1X21pbi5kZXZfYXR0ci5hdHRyKQorCQlyZXQgfD0gU19JV1VTUjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtYXgxNjY4X2dyb3VwX2NvbW1vbiA9IHsKKwkuYXR0cnMgPSBtYXgxNjY4X2F0dHJpYnV0ZV9jb21tb24sCisJLmlzX3Zpc2libGUgPSBtYXgxNjY4X2F0dHJpYnV0ZV9tb2RlCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtYXgxNjY4X2dyb3VwX3VuaXF1ZSA9IHsKKwkuYXR0cnMgPSBtYXgxNjY4X2F0dHJpYnV0ZV91bmlxdWUsCisJLmlzX3Zpc2libGUgPSBtYXgxNjY4X2F0dHJpYnV0ZV9tb2RlCit9OworCisvKiBSZXR1cm4gMCBpZiBkZXRlY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgLUVOT0RFViBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbnQgbWF4MTY2OF9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQoreworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKKwljb25zdCBjaGFyICp0eXBlX25hbWU7CisJaW50IG1hbl9pZCwgZGV2X2lkOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIENoZWNrIGZvciB1bnN1cHBvcnRlZCBwYXJ0ICovCisJbWFuX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUFYMTY2OF9SRUdfTUFOX0lEKTsKKwlpZiAobWFuX2lkICE9IE1BTl9JRF9NQVhJTSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkZXZfaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQVgxNjY4X1JFR19ERVZfSUQpOworCWlmIChkZXZfaWQgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXR5cGVfbmFtZSA9IE5VTEw7CisJaWYgKGRldl9pZCA9PSBERVZfSURfTUFYMTY2OCkKKwkJdHlwZV9uYW1lID0gIm1heDE2NjgiOworCWVsc2UgaWYgKGRldl9pZCA9PSBERVZfSURfTUFYMTgwNSkKKwkJdHlwZV9uYW1lID0gIm1heDE4MDUiOworCWVsc2UgaWYgKGRldl9pZCA9PSBERVZfSURfTUFYMTk4OSkKKwkJdHlwZV9uYW1lID0gIm1heDE5ODkiOworCisJaWYgKCF0eXBlX25hbWUpCisJCXJldHVybiAtRU5PREVWOworCisJc3RybGNweShpbmZvLT50eXBlLCB0eXBlX25hbWUsIEkyQ19OQU1FX1NJWkUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF4MTY2OF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbGllbnQtPmFkYXB0ZXI7CisJc3RydWN0IG1heDE2NjhfZGF0YSAqZGF0YTsKKwlpbnQgZXJyOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWF4MTY2OF9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOworCWRhdGEtPnR5cGUgPSBpZC0+ZHJpdmVyX2RhdGE7CisJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZtYXgxNjY4X2dyb3VwX2NvbW1vbik7CisJaWYgKGVycikKKwkJZ290byBlcnJvcl9mcmVlOworCisJaWYgKGRhdGEtPnR5cGUgPT0gbWF4MTY2OCB8fCBkYXRhLT50eXBlID09IG1heDE5ODkpIHsKKwkJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLAorCQkJCQkgJm1heDE2NjhfZ3JvdXBfdW5pcXVlKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyb3Jfc3lzcmVtMDsKKwl9CisKKwlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOworCQlnb3RvIGVycm9yX3N5c3JlbTE7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycm9yX3N5c3JlbTE6CisJaWYgKGRhdGEtPnR5cGUgPT0gbWF4MTY2OCB8fCBkYXRhLT50eXBlID09IG1heDE5ODkpCisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDE2NjhfZ3JvdXBfdW5pcXVlKTsKK2Vycm9yX3N5c3JlbTA6CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbWF4MTY2OF9ncm91cF9jb21tb24pOworZXJyb3JfZnJlZToKKwlrZnJlZShkYXRhKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1heDE2NjhfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG1heDE2NjhfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+aHdtb25fZGV2KTsKKwlpZiAoZGF0YS0+dHlwZSA9PSBtYXgxNjY4IHx8IGRhdGEtPnR5cGUgPT0gbWF4MTk4OSkKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbWF4MTY2OF9ncm91cF91bmlxdWUpOworCisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbWF4MTY2OF9ncm91cF9jb21tb24pOworCisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBtYXgxNjY4X2lkW10gPSB7CisJeyAibWF4MTY2OCIsIG1heDE2NjggfSwKKwl7ICJtYXgxODA1IiwgbWF4MTgwNSB9LAorCXsgIm1heDE5ODkiLCBtYXgxOTg5IH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG1heDE2NjhfaWQpOworCisvKiBUaGlzIGlzIHRoZSBkcml2ZXIgdGhhdCB3aWxsIGJlIGluc2VydGVkICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWF4MTY2OF9kcml2ZXIgPSB7CisJLmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OLAorCS5kcml2ZXIgPSB7CisJCSAgLm5hbWUJPSAibWF4MTY2OCIsCisJCSAgfSwKKwkucHJvYmUgPSBtYXgxNjY4X3Byb2JlLAorCS5yZW1vdmUJPSBtYXgxNjY4X3JlbW92ZSwKKwkuaWRfdGFibGUgPSBtYXgxNjY4X2lkLAorCS5kZXRlY3QJPSBtYXgxNjY4X2RldGVjdCwKKwkuYWRkcmVzc19saXN0ID0gbWF4MTY2OF9hZGRyX2xpc3QsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzZW5zb3JzX21heDE2NjhfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmbWF4MTY2OF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2Vuc29yc19tYXgxNjY4X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmbWF4MTY2OF9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBHZW9yZ2UgPGRhdmlkLmdlb3JnZUBza2EuYWMuemE+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1BWDE2NjggcmVtb3RlIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc2Vuc29yc19tYXgxNjY4X2luaXQpCittb2R1bGVfZXhpdChzZW5zb3JzX21heDE2NjhfZXhpdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbnRjX3RoZXJtaXN0b3IuYyBiL2RyaXZlcnMvaHdtb24vbnRjX3RoZXJtaXN0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzkyNmY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9udGNfdGhlcm1pc3Rvci5jCkBAIC0wLDAgKzEsNDUzIEBACisvKgorICogbnRjX3RoZXJtaXN0b3IuYyAtIE5UQyBUaGVybWlzdG9ycworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcworICogIE15dW5nSm9vIEhhbSA8bXl1bmdqb28uaGFtQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL250Y190aGVybWlzdG9yLmg+CisKKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisKK3N0cnVjdCBudGNfY29tcGVuc2F0aW9uIHsKKwlpbnQJCXRlbXBfQzsKKwl1bnNpZ25lZCBpbnQJb2htOworfTsKKworLyoKKyAqIEEgY29tcGVuc2F0aW9uIHRhYmxlIHNob3VsZCBiZSBzb3J0ZWQgYnkgdGhlIHZhbHVlcyBvZiAub2htCisgKiBpbiBkZXNjZW5kaW5nIG9yZGVyLgorICogVGhlIGZvbGxvd2luZyBjb21wZW5zYXRpb24gdGFibGVzIGFyZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIG9mIE11cmF0YSBOVEMKKyAqIFRoZXJtaXN0b3JzIERhdGFzaGVldAorICovCitjb25zdCBzdHJ1Y3QgbnRjX2NvbXBlbnNhdGlvbiBuY3BYWHdiNDczW10gPSB7CisJeyAudGVtcF9DCT0gLTQwLCAub2htCT0gMTc0NzkyMCB9LAorCXsgLnRlbXBfQwk9IC0zNSwgLm9obQk9IDEyNDU0MjggfSwKKwl7IC50ZW1wX0MJPSAtMzAsIC5vaG0JPSA4OTg0ODUgfSwKKwl7IC50ZW1wX0MJPSAtMjUsIC5vaG0JPSA2NTU4MDIgfSwKKwl7IC50ZW1wX0MJPSAtMjAsIC5vaG0JPSA0ODM5NTQgfSwKKwl7IC50ZW1wX0MJPSAtMTUsIC5vaG0JPSAzNjA4NTAgfSwKKwl7IC50ZW1wX0MJPSAtMTAsIC5vaG0JPSAyNzE2OTcgfSwKKwl7IC50ZW1wX0MJPSAtNSwgLm9obQk9IDIwNjQ2MyB9LAorCXsgLnRlbXBfQwk9IDAsIC5vaG0JPSAxNTgyMTQgfSwKKwl7IC50ZW1wX0MJPSA1LCAub2htCT0gMTIyMjU5IH0sCisJeyAudGVtcF9DCT0gMTAsIC5vaG0JPSA5NTIyNyB9LAorCXsgLnRlbXBfQwk9IDE1LCAub2htCT0gNzQ3MzAgfSwKKwl7IC50ZW1wX0MJPSAyMCwgLm9obQk9IDU5MDY1IH0sCisJeyAudGVtcF9DCT0gMjUsIC5vaG0JPSA0NzAwMCB9LAorCXsgLnRlbXBfQwk9IDMwLCAub2htCT0gMzc2NDMgfSwKKwl7IC50ZW1wX0MJPSAzNSwgLm9obQk9IDMwMzM0IH0sCisJeyAudGVtcF9DCT0gNDAsIC5vaG0JPSAyNDU5MSB9LAorCXsgLnRlbXBfQwk9IDQ1LCAub2htCT0gMjAwNDggfSwKKwl7IC50ZW1wX0MJPSA1MCwgLm9obQk9IDE2NDMzIH0sCisJeyAudGVtcF9DCT0gNTUsIC5vaG0JPSAxMzUzOSB9LAorCXsgLnRlbXBfQwk9IDYwLCAub2htCT0gMTEyMDkgfSwKKwl7IC50ZW1wX0MJPSA2NSwgLm9obQk9IDkzMjggfSwKKwl7IC50ZW1wX0MJPSA3MCwgLm9obQk9IDc3OTggfSwKKwl7IC50ZW1wX0MJPSA3NSwgLm9obQk9IDY1NDQgfSwKKwl7IC50ZW1wX0MJPSA4MCwgLm9obQk9IDU1MTggfSwKKwl7IC50ZW1wX0MJPSA4NSwgLm9obQk9IDQ2NzQgfSwKKwl7IC50ZW1wX0MJPSA5MCwgLm9obQk9IDM5NzIgfSwKKwl7IC50ZW1wX0MJPSA5NSwgLm9obQk9IDMzODggfSwKKwl7IC50ZW1wX0MJPSAxMDAsIC5vaG0JPSAyOTAyIH0sCisJeyAudGVtcF9DCT0gMTA1LCAub2htCT0gMjQ5NCB9LAorCXsgLnRlbXBfQwk9IDExMCwgLm9obQk9IDIxNTAgfSwKKwl7IC50ZW1wX0MJPSAxMTUsIC5vaG0JPSAxODYwIH0sCisJeyAudGVtcF9DCT0gMTIwLCAub2htCT0gMTYxNSB9LAorCXsgLnRlbXBfQwk9IDEyNSwgLm9obQk9IDE0MDYgfSwKK307Citjb25zdCBzdHJ1Y3QgbnRjX2NvbXBlbnNhdGlvbiBuY3BYWHdsMzMzW10gPSB7CisJeyAudGVtcF9DCT0gLTQwLCAub2htCT0gMTYxMDE1NCB9LAorCXsgLnRlbXBfQwk9IC0zNSwgLm9obQk9IDExMzA4NTAgfSwKKwl7IC50ZW1wX0MJPSAtMzAsIC5vaG0JPSA4MDI2MDkgfSwKKwl7IC50ZW1wX0MJPSAtMjUsIC5vaG0JPSA1NzUzODUgfSwKKwl7IC50ZW1wX0MJPSAtMjAsIC5vaG0JPSA0MTY0NjQgfSwKKwl7IC50ZW1wX0MJPSAtMTUsIC5vaG0JPSAzMDQyMTkgfSwKKwl7IC50ZW1wX0MJPSAtMTAsIC5vaG0JPSAyMjQxOTMgfSwKKwl7IC50ZW1wX0MJPSAtNSwgLm9obQk9IDE2NjYyMyB9LAorCXsgLnRlbXBfQwk9IDAsIC5vaG0JPSAxMjQ4NTAgfSwKKwl7IC50ZW1wX0MJPSA1LCAub2htCT0gOTQyODcgfSwKKwl7IC50ZW1wX0MJPSAxMCwgLm9obQk9IDcxNzQ3IH0sCisJeyAudGVtcF9DCT0gMTUsIC5vaG0JPSA1NDk5NiB9LAorCXsgLnRlbXBfQwk9IDIwLCAub2htCT0gNDI0NTUgfSwKKwl7IC50ZW1wX0MJPSAyNSwgLm9obQk9IDMzMDAwIH0sCisJeyAudGVtcF9DCT0gMzAsIC5vaG0JPSAyNTgyMiB9LAorCXsgLnRlbXBfQwk9IDM1LCAub2htCT0gMjAzMzUgfSwKKwl7IC50ZW1wX0MJPSA0MCwgLm9obQk9IDE2MTE1IH0sCisJeyAudGVtcF9DCT0gNDUsIC5vaG0JPSAxMjg0OSB9LAorCXsgLnRlbXBfQwk9IDUwLCAub2htCT0gMTAzMDYgfSwKKwl7IC50ZW1wX0MJPSA1NSwgLm9obQk9IDgzMTQgfSwKKwl7IC50ZW1wX0MJPSA2MCwgLm9obQk9IDY3NDYgfSwKKwl7IC50ZW1wX0MJPSA2NSwgLm9obQk9IDU1MDMgfSwKKwl7IC50ZW1wX0MJPSA3MCwgLm9obQk9IDQ1MTMgfSwKKwl7IC50ZW1wX0MJPSA3NSwgLm9obQk9IDM3MjEgfSwKKwl7IC50ZW1wX0MJPSA4MCwgLm9obQk9IDMwODQgfSwKKwl7IC50ZW1wX0MJPSA4NSwgLm9obQk9IDI1NjkgfSwKKwl7IC50ZW1wX0MJPSA5MCwgLm9obQk9IDIxNTEgfSwKKwl7IC50ZW1wX0MJPSA5NSwgLm9obQk9IDE4MDkgfSwKKwl7IC50ZW1wX0MJPSAxMDAsIC5vaG0JPSAxNTI5IH0sCisJeyAudGVtcF9DCT0gMTA1LCAub2htCT0gMTI5OSB9LAorCXsgLnRlbXBfQwk9IDExMCwgLm9obQk9IDExMDggfSwKKwl7IC50ZW1wX0MJPSAxMTUsIC5vaG0JPSA5NDkgfSwKKwl7IC50ZW1wX0MJPSAxMjAsIC5vaG0JPSA4MTcgfSwKKwl7IC50ZW1wX0MJPSAxMjUsIC5vaG0JPSA3MDcgfSwKK307CisKK3N0cnVjdCBudGNfZGF0YSB7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCXN0cnVjdCBudGNfdGhlcm1pc3Rvcl9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwljb25zdCBzdHJ1Y3QgbnRjX2NvbXBlbnNhdGlvbiAqY29tcDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IG5fY29tcDsKKwljaGFyIG5hbWVbUExBVEZPUk1fTkFNRV9TSVpFXTsKK307CisKK3N0YXRpYyBpbmxpbmUgdTY0IGRpdjY0X3U2NF9zYWZlKHU2NCBkaXZpZGVuZCwgdTY0IGRpdmlzb3IpCit7CisJaWYgKGRpdmlzb3IgPT0gMCAmJiBkaXZpZGVuZCA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoZGl2aXNvciA9PSAwKQorCQlyZXR1cm4gVUlOVF9NQVg7CisJcmV0dXJuIGRpdjY0X3U2NChkaXZpZGVuZCwgZGl2aXNvcik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X29obV9vZl90aGVybWlzdG9yKHN0cnVjdCBudGNfZGF0YSAqZGF0YSwKKwkJdW5zaWduZWQgaW50IHVWKQoreworCXN0cnVjdCBudGNfdGhlcm1pc3Rvcl9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRhdGEtPnBkYXRhOworCXU2NCBtViA9IHVWIC8gMTAwMDsKKwl1NjQgcG1WID0gcGRhdGEtPnB1bGx1cF91ViAvIDEwMDA7CisJdTY0IE4sIHB1TywgcGRPOworCXB1TyA9IHBkYXRhLT5wdWxsdXBfb2htOworCXBkTyA9IHBkYXRhLT5wdWxsZG93bl9vaG07CisKKwlpZiAobVYgPT0gMCkgeworCQlpZiAocGRhdGEtPmNvbm5lY3QgPT0gTlRDX0NPTk5FQ1RFRF9QT1NJVElWRSkKKwkJCXJldHVybiBVSU5UX01BWDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChtViA+PSBwbVYpCisJCXJldHVybiAocGRhdGEtPmNvbm5lY3QgPT0gTlRDX0NPTk5FQ1RFRF9QT1NJVElWRSkgPworCQkJMCA6IFVJTlRfTUFYOworCisJaWYgKHBkYXRhLT5jb25uZWN0ID09IE5UQ19DT05ORUNURURfUE9TSVRJVkUgJiYgcHVPID09IDApCisJCU4gPSBkaXY2NF91NjRfc2FmZShwZE8gKiAocG1WIC0gbVYpLCBtVik7CisJZWxzZSBpZiAocGRhdGEtPmNvbm5lY3QgPT0gTlRDX0NPTk5FQ1RFRF9HUk9VTkQgJiYgcGRPID09IDApCisJCU4gPSBkaXY2NF91NjRfc2FmZShwdU8gKiBtViwgcG1WIC0gbVYpOworCWVsc2UgaWYgKHBkYXRhLT5jb25uZWN0ID09IE5UQ19DT05ORUNURURfUE9TSVRJVkUpCisJCU4gPSBkaXY2NF91NjRfc2FmZShwZE8gKiBwdU8gKiAocG1WIC0gbVYpLAorCQkJCXB1TyAqIG1WIC0gcGRPICogKHBtViAtIG1WKSk7CisJZWxzZQorCQlOID0gZGl2NjRfdTY0X3NhZmUocGRPICogcHVPICogbVYsIHBkTyAqIChwbVYgLSBtVikgLSBwdU8gKiBtVik7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGludCkgTjsKK30KKworc3RhdGljIGludCBsb29rdXBfY29tcChzdHJ1Y3QgbnRjX2RhdGEgKmRhdGEsCisJCXVuc2lnbmVkIGludCBvaG0sIGludCAqaV9sb3csIGludCAqaV9oaWdoKQoreworCWludCBzdGFydCwgZW5kLCBtaWQgPSAtMTsKKworCS8qIERvIGEgYmluYXJ5IHNlYXJjaCBvbiBjb21wZW5zYXRpb24gdGFibGUgKi8KKwlzdGFydCA9IDA7CisJZW5kID0gZGF0YS0+bl9jb21wOworCisJd2hpbGUgKGVuZCA+IHN0YXJ0KSB7CisJCW1pZCA9IHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAvIDI7CisJCWlmIChkYXRhLT5jb21wW21pZF0ub2htIDwgb2htKQorCQkJZW5kID0gbWlkOworCQllbHNlIGlmIChkYXRhLT5jb21wW21pZF0ub2htID4gb2htKQorCQkJc3RhcnQgPSBtaWQgKyAxOworCQllbHNlCisJCQlicmVhazsKKwl9CisKKwlpZiAobWlkID09IDApIHsKKwkJaWYgKGRhdGEtPmNvbXBbbWlkXS5vaG0gPiBvaG0pIHsKKwkJCSppX2hpZ2ggPSBtaWQ7CisJCQkqaV9sb3cgPSBtaWQgKyAxOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQkqaV9sb3cgPSBtaWQ7CisJCQkqaV9oaWdoID0gLTE7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlpZiAobWlkID09IChkYXRhLT5uX2NvbXAgLSAxKSkgeworCQlpZiAoZGF0YS0+Y29tcFttaWRdLm9obSA8PSBvaG0pIHsKKwkJCSppX2xvdyA9IG1pZDsKKwkJCSppX2hpZ2ggPSBtaWQgLSAxOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQkqaV9sb3cgPSAtMTsKKwkJCSppX2hpZ2ggPSBtaWQ7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmIChkYXRhLT5jb21wW21pZF0ub2htIDw9IG9obSkgeworCQkqaV9sb3cgPSBtaWQ7CisJCSppX2hpZ2ggPSBtaWQgLSAxOworCX0KKwlpZiAoZGF0YS0+Y29tcFttaWRdLm9obSA+IG9obSkgeworCQkqaV9sb3cgPSBtaWQgKyAxOworCQkqaV9oaWdoID0gbWlkOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF90ZW1wX21DKHN0cnVjdCBudGNfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IG9obSwgaW50ICp0ZW1wKQoreworCWludCBsb3csIGhpZ2g7CisJaW50IHJldDsKKworCXJldCA9IGxvb2t1cF9jb21wKGRhdGEsIG9obSwgJmxvdywgJmhpZ2gpOworCWlmIChyZXQpIHsKKwkJLyogVW5hYmxlIHRvIHVzZSBsaW5lYXIgYXBwcm94aW1hdGlvbiAqLworCQlpZiAobG93ICE9IC0xKQorCQkJKnRlbXAgPSBkYXRhLT5jb21wW2xvd10udGVtcF9DICogMTAwMDsKKwkJZWxzZSBpZiAoaGlnaCAhPSAtMSkKKwkJCSp0ZW1wID0gZGF0YS0+Y29tcFtoaWdoXS50ZW1wX0MgKiAxMDAwOworCQllbHNlCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCSp0ZW1wID0gZGF0YS0+Y29tcFtsb3ddLnRlbXBfQyAqIDEwMDAgKworCQkJKChkYXRhLT5jb21wW2hpZ2hdLnRlbXBfQyAtIGRhdGEtPmNvbXBbbG93XS50ZW1wX0MpICoKKwkJCSAxMDAwICogKChpbnQpb2htIC0gKGludClkYXRhLT5jb21wW2xvd10ub2htKSkgLworCQkJKChpbnQpZGF0YS0+Y29tcFtoaWdoXS5vaG0gLSAoaW50KWRhdGEtPmNvbXBbbG93XS5vaG0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG50Y190aGVybWlzdG9yX3JlYWQoc3RydWN0IG50Y19kYXRhICpkYXRhLCBpbnQgKnRlbXApCit7CisJaW50IHJldDsKKwlpbnQgcmVhZF9vaG0sIHJlYWRfdVY7CisJdW5zaWduZWQgaW50IG9obSA9IDA7CisKKwlpZiAoZGF0YS0+cGRhdGEtPnJlYWRfb2htKSB7CisJCXJlYWRfb2htID0gZGF0YS0+cGRhdGEtPnJlYWRfb2htKCk7CisJCWlmIChyZWFkX29obSA8IDApCisJCQlyZXR1cm4gcmVhZF9vaG07CisJCW9obSA9ICh1bnNpZ25lZCBpbnQpcmVhZF9vaG07CisJfQorCisJaWYgKGRhdGEtPnBkYXRhLT5yZWFkX3VWKSB7CisJCXJlYWRfdVYgPSBkYXRhLT5wZGF0YS0+cmVhZF91VigpOworCQlpZiAocmVhZF91ViA8IDApCisJCQlyZXR1cm4gcmVhZF91VjsKKwkJb2htID0gZ2V0X29obV9vZl90aGVybWlzdG9yKGRhdGEsICh1bnNpZ25lZCBpbnQpcmVhZF91Vik7CisJfQorCisJcmV0ID0gZ2V0X3RlbXBfbUMoZGF0YSwgb2htLCB0ZW1wKTsKKwlpZiAocmV0KSB7CisJCWRldl9kYmcoZGF0YS0+ZGV2LCAiU2Vuc29yIHJlYWRpbmcgZnVuY3Rpb24gbm90IGF2YWlsYWJsZS5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBudGNfc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbnRjX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBkYXRhLT5uYW1lKTsKK30KKworc3RhdGljIHNzaXplX3QgbnRjX3Nob3dfdHlwZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiNFxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG50Y19zaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBudGNfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCB0ZW1wLCByZXQ7CisKKwlyZXQgPSBudGNfdGhlcm1pc3Rvcl9yZWFkKGRhdGEsICZ0ZW1wKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ZW1wKTsKK30KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV90eXBlLCBTX0lSVUdPLCBudGNfc2hvd190eXBlLCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIG50Y19zaG93X3RlbXAsIE5VTEwsIDApOworc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIG50Y19zaG93X25hbWUsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbnRjX2F0dHJpYnV0ZXNbXSA9IHsKKwkmZGV2X2F0dHJfbmFtZS5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbnRjX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gbnRjX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBudGNfdGhlcm1pc3Rvcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBudGNfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgbnRjX3RoZXJtaXN0b3JfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghcGRhdGEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gcGxhdGZvcm0gaW5pdCBkYXRhIHN1cHBsaWVkLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEVpdGhlciBvbmUgb2YgdGhlIHR3byBpcyByZXF1aXJlZC4gKi8KKwlpZiAoIXBkYXRhLT5yZWFkX3VWICYmICFwZGF0YS0+cmVhZF9vaG0pIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQm90aCByZWFkX3VWIGFuZCByZWFkX29obSBtaXNzaW5nLiIKKwkJCQkiTmVlZCBlaXRoZXIgb25lIG9mIHRoZSB0d28uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBkYXRhLT5yZWFkX3VWICYmIHBkYXRhLT5yZWFkX29obSkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiT25seSBvbmUgb2YgcmVhZF91ViBhbmQgcmVhZF9vaG0gIgorCQkJCSJpcyBuZWVkZWQ7IGlnbm9yaW5nIHJlYWRfdVYuXG4iKTsKKwkJcGRhdGEtPnJlYWRfdVYgPSBOVUxMOworCX0KKworCWlmIChwZGF0YS0+cmVhZF91ViAmJiAocGRhdGEtPnB1bGx1cF91ViA9PSAwIHx8CisJCQkJKHBkYXRhLT5wdWxsdXBfb2htID09IDAgJiYgcGRhdGEtPmNvbm5lY3QgPT0KKwkJCQkgTlRDX0NPTk5FQ1RFRF9HUk9VTkQpIHx8CisJCQkJKHBkYXRhLT5wdWxsZG93bl9vaG0gPT0gMCAmJiBwZGF0YS0+Y29ubmVjdCA9PQorCQkJCSBOVENfQ09OTkVDVEVEX1BPU0lUSVZFKSB8fAorCQkJCShwZGF0YS0+Y29ubmVjdCAhPSBOVENfQ09OTkVDVEVEX1BPU0lUSVZFICYmCisJCQkJIHBkYXRhLT5jb25uZWN0ICE9IE5UQ19DT05ORUNURURfR1JPVU5EKSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiUmVxdWlyZWQgZGF0YSB0byB1c2UgcmVhZF91ViBub3QgIgorCQkJCSJzdXBwbGllZC5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG50Y19kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRhdGEtPmRldiA9ICZwZGV2LT5kZXY7CisJZGF0YS0+cGRhdGEgPSBwZGF0YTsKKwlzdHJuY3B5KGRhdGEtPm5hbWUsIHBkZXYtPmlkX2VudHJ5LT5uYW1lLCBQTEFURk9STV9OQU1FX1NJWkUpOworCisJc3dpdGNoIChwZGV2LT5pZF9lbnRyeS0+ZHJpdmVyX2RhdGEpIHsKKwljYXNlIFRZUEVfTkNQWFhXQjQ3MzoKKwkJZGF0YS0+Y29tcCA9IG5jcFhYd2I0NzM7CisJCWRhdGEtPm5fY29tcCA9IEFSUkFZX1NJWkUobmNwWFh3YjQ3Myk7CisJCWJyZWFrOworCWNhc2UgVFlQRV9OQ1BYWFdMMzMzOgorCQlkYXRhLT5jb21wID0gbmNwWFh3bDMzMzsKKwkJZGF0YS0+bl9jb21wID0gQVJSQVlfU0laRShuY3BYWHdsMzMzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5rbm93biBkZXZpY2UgdHlwZTogJWx1KCVzKVxuIiwKKwkJCQlwZGV2LT5pZF9lbnRyeS0+ZHJpdmVyX2RhdGEsCisJCQkJcGRldi0+aWRfZW50cnktPm5hbWUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkYXRhKTsKKworCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGF0YS0+ZGV2LT5rb2JqLCAmbnRjX2F0dHJfZ3JvdXApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkYXRhLT5kZXYsICJ1bmFibGUgdG8gY3JlYXRlIHN5c2ZzIGZpbGVzXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKGRhdGEtPmRldik7CisJaWYgKElTX0VSUl9PUl9OVUxMKGRhdGEtPmh3bW9uX2RldikpIHsKKwkJZGV2X2VycihkYXRhLT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgYXMgaHdtb24gZGV2aWNlLlxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2FmdGVyX3N5c2ZzOworCX0KKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJUaGVybWlzdG9yICVzOiVkICh0eXBlOiAlcy8lbHUpIHN1Y2Nlc3NmdWxseSBwcm9iZWQuXG4iLAorCQkJcGRldi0+bmFtZSwgcGRldi0+aWQsIHBkZXYtPmlkX2VudHJ5LT5uYW1lLAorCQkJcGRldi0+aWRfZW50cnktPmRyaXZlcl9kYXRhKTsKKwlyZXR1cm4gMDsKK2Vycl9hZnRlcl9zeXNmczoKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmRhdGEtPmRldi0+a29iaiwgJm50Y19hdHRyX2dyb3VwKTsKK2VycjoKKwlrZnJlZShkYXRhKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBudGNfdGhlcm1pc3Rvcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbnRjX2RhdGEgKmRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkYXRhLT5kZXYtPmtvYmosICZudGNfYXR0cl9ncm91cCk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlrZnJlZShkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBudGNfdGhlcm1pc3Rvcl9pZFtdID0geworCXsgIm5jcDE1d2I0NzMiLCBUWVBFX05DUFhYV0I0NzMgfSwKKwl7ICJuY3AxOHdiNDczIiwgVFlQRV9OQ1BYWFdCNDczIH0sCisJeyAibmNwMjF3YjQ3MyIsIFRZUEVfTkNQWFhXQjQ3MyB9LAorCXsgIm5jcDAzd2I0NzMiLCBUWVBFX05DUFhYV0I0NzMgfSwKKwl7ICJuY3AxNXdsMzMzIiwgVFlQRV9OQ1BYWFdMMzMzIH0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbnRjX3RoZXJtaXN0b3JfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm50Yy10aGVybWlzdG9yIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBudGNfdGhlcm1pc3Rvcl9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AobnRjX3RoZXJtaXN0b3JfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBudGNfdGhlcm1pc3Rvcl9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG50Y190aGVybWlzdG9yX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZudGNfdGhlcm1pc3Rvcl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChudGNfdGhlcm1pc3Rvcl9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG50Y190aGVybWlzdG9yX2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbnRjX3RoZXJtaXN0b3JfZHJpdmVyKTsKK30KKworbW9kdWxlX2V4aXQobnRjX3RoZXJtaXN0b3JfY2xlYW51cCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiTlRDIFRoZXJtaXN0b3IgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJNeXVuZ0pvbyBIYW0gPG15dW5nam9vLmhhbUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06bnRjLXRoZXJtaXN0b3IiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcG1idXMvS2NvbmZpZyBiL2RyaXZlcnMvaHdtb24vcG1idXMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTIzN2I5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9wbWJ1cy9LY29uZmlnCkBAIC0wLDAgKzEsMTAwIEBACisjCisjIFBNQnVzIGNoaXAgZHJpdmVycyBjb25maWd1cmF0aW9uCisjCisKK21lbnVjb25maWcgUE1CVVMKKwl0cmlzdGF0ZSAiUE1CdXMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlkZWZhdWx0IG4KKwloZWxwCisJICBTYXkgeWVzIGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIFBNQnVzIHN1cHBvcnQuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgcG1idXNfY29yZS4KKworaWYgUE1CVVMKKworY29uZmlnIFNFTlNPUlNfUE1CVVMKKwl0cmlzdGF0ZSAiR2VuZXJpYyBQTUJ1cyBkZXZpY2VzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBoYXJkd2FyZSBtb25pdG9yaW5nIHN1cHBvcnQgZm9yIGdlbmVyaWMKKwkgIFBNQnVzIGRldmljZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gQURQNDAwMCwgQk1SNDUwLCBCTVI0NTEsCisJICBCTVI0NTMsIEJNUjQ1NCwgTFRDMjk3OCwgTkNQNDIwMCwgYW5kIE5DUDQyMDguCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgcG1idXMuCisKK2NvbmZpZyBTRU5TT1JTX0FETTEyNzUKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURNMTI3NSIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgaGFyZHdhcmUgbW9uaXRvcmluZyBzdXBwb3J0IGZvciBBbmFsb2cKKwkgIERldmljZXMgQURNMTI3NSBIb3QtU3dhcCBDb250cm9sbGVyIGFuZCBEaWdpdGFsIFBvd2VyIE1vbml0b3IuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgYWRtMTI3NS4KKworY29uZmlnIFNFTlNPUlNfTE0yNTA2NgorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNMjUwNjYgYW5kIGNvbXBhdGlibGVzIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBoYXJkd2FyZSBtb25pdG9yaW5nIHN1cHBvcnQgZm9yIE5hdGlvbmFsCisJICBTZW1pY29uZHVjdG9yIExNMjUwNjYsIExNNTA2NCwgYW5kIExNNTA2Ni4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBsbTI1MDY2LgorCitjb25maWcgU0VOU09SU19NQVgxNjA2NAorCXRyaXN0YXRlICJNYXhpbSBNQVgxNjA2NCIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgaGFyZHdhcmUgbW9uaXRvcmluZyBzdXBwb3J0IGZvciBNYXhpbQorCSAgTUFYMTYwNjQuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbWF4MTYwNjQuCisKK2NvbmZpZyBTRU5TT1JTX01BWDM0NDQwCisJdHJpc3RhdGUgIk1heGltIE1BWDM0NDQwL01BWDM0NDQxIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBoYXJkd2FyZSBtb25pdG9yaW5nIHN1cHBvcnQgZm9yIE1heGltCisJICBNQVgzNDQ0MCBhbmQgTUFYMzQ0NDEuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbWF4MzQ0NDAuCisKK2NvbmZpZyBTRU5TT1JTX01BWDg2ODgKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYODY4OCIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgaGFyZHdhcmUgbW9uaXRvcmluZyBzdXBwb3J0IGZvciBNYXhpbQorCSAgTUFYODY4OC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBtYXg4Njg4LgorCitjb25maWcgU0VOU09SU19VQ0Q5MDAwCisJdHJpc3RhdGUgIlRJIFVDRDkwMTIwLCBVQ0Q5MDEyNCwgVUNEOTA5MCwgVUNEOTA5MTAiCisJZGVmYXVsdCBuCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IGhhcmR3YXJlIG1vbml0b3Jpbmcgc3VwcG9ydCBmb3IgVEkKKwkgIFVDRDkwMTIwLCBVQ0Q5MDEyNCwgVUNEOTA5MCwgVUNEOTA5MTAgU2VxdWVuY2VyIGFuZCBTeXN0ZW0gSGVhbHRoCisJICBDb250cm9sbGVycy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCB1Y2Q5MDAwLgorCitjb25maWcgU0VOU09SU19VQ0Q5MjAwCisJdHJpc3RhdGUgIlRJIFVDRDkyMjAsIFVDRDkyMjIsIFVDRDkyMjQsIFVDRDkyNDAsIFVDRDkyNDQsIFVDRDkyNDYsIFVDRDkyNDgiCisJZGVmYXVsdCBuCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IGhhcmR3YXJlIG1vbml0b3Jpbmcgc3VwcG9ydCBmb3IgVEkKKwkgIFVDRDkyMjAsIFVDRDkyMjIsIFVDRDkyMjQsIFVDRDkyNDAsIFVDRDkyNDQsIFVDRDkyNDYsIGFuZCBVQ0Q5MjQ4CisJICBEaWdpdGFsIFBXTSBTeXN0ZW0gQ29udHJvbGxlcnMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgdWNkOTIwMC4KKworZW5kaWYgIyBQTUJVUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9wbWJ1cy9NYWtlZmlsZSBiL2RyaXZlcnMvaHdtb24vcG1idXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzZWVkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vcG1idXMvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorIworIyBNYWtlZmlsZSBmb3IgUE1CdXMgY2hpcCBkcml2ZXJzLgorIworCitvYmotJChDT05GSUdfUE1CVVMpCQkrPSBwbWJ1c19jb3JlLm8KK29iai0kKENPTkZJR19TRU5TT1JTX1BNQlVTKQkrPSBwbWJ1cy5vCitvYmotJChDT05GSUdfU0VOU09SU19BRE0xMjc1KQkrPSBhZG0xMjc1Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xNMjUwNjYpCSs9IGxtMjUwNjYubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMTYwNjQpCSs9IG1heDE2MDY0Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX01BWDM0NDQwKQkrPSBtYXgzNDQ0MC5vCitvYmotJChDT05GSUdfU0VOU09SU19NQVg4Njg4KQkrPSBtYXg4Njg4Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX1VDRDkwMDApCSs9IHVjZDkwMDAubworb2JqLSQoQ09ORklHX1NFTlNPUlNfVUNEOTIwMCkJKz0gdWNkOTIwMC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkbTEyNzUuYyBiL2RyaXZlcnMvaHdtb24vcG1idXMvYWRtMTI3NS5jCnNpbWlsYXJpdHkgaW5kZXggNjclCnJlbmFtZSBmcm9tIGRyaXZlcnMvaHdtb24vYWRtMTI3NS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3BtYnVzL2FkbTEyNzUuYwppbmRleCA4YmMxYmQ2Li5jOTM2ZTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkbTEyNzUuYworKysgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL2FkbTEyNzUuYwpAQCAtMjMsMTEgKzIzLDY4IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSAicG1idXMuaCIKIAorI2RlZmluZSBBRE0xMjc1X1BFQUtfSU9VVAkJMHhkMAorI2RlZmluZSBBRE0xMjc1X1BFQUtfVklOCQkweGQxCisjZGVmaW5lIEFETTEyNzVfUEVBS19WT1VUCQkweGQyCiAjZGVmaW5lIEFETTEyNzVfUE1PTl9DT05GSUcJCTB4ZDQKIAogI2RlZmluZSBBRE0xMjc1X1ZJTl9WT1VUX1NFTEVDVAkJKDEgPDwgNikKICNkZWZpbmUgQURNMTI3NV9WUkFOR0UJCQkoMSA8PCA1KQogCitzdGF0aWMgaW50IGFkbTEyNzVfcmVhZF93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIGludCByZWcpCit7CisJaW50IHJldDsKKworCWlmIChwYWdlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBQTUJVU19WSVJUX1JFQURfSU9VVF9NQVg6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwgQURNMTI3NV9QRUFLX0lPVVQpOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVBRF9WT1VUX01BWDoKKwkJcmV0ID0gcG1idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCAwLCBBRE0xMjc1X1BFQUtfVk9VVCk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRUFEX1ZJTl9NQVg6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwgQURNMTI3NV9QRUFLX1ZJTik7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9JT1VUX0hJU1RPUlk6CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX1ZPVVRfSElTVE9SWToKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfVklOX0hJU1RPUlk6CisJCXJldCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9EQVRBOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZG0xMjc1X3dyaXRlX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwgaW50IHJlZywKKwkJCQkgICB1MTYgd29yZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKHBhZ2UpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfSU9VVF9ISVNUT1JZOgorCQlyZXQgPSBwbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCAwLCBBRE0xMjc1X1BFQUtfSU9VVCwgMCk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9WT1VUX0hJU1RPUlk6CisJCXJldCA9IHBtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIDAsIEFETTEyNzVfUEVBS19WT1VULCAwKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX1ZJTl9ISVNUT1JZOgorCQlyZXQgPSBwbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCAwLCBBRE0xMjc1X1BFQUtfVklOLCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0RBVEE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IGFkbTEyNzVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CkBAIC01MCwxNCArMTA3LDE3IEBACiAJfQogCiAJaW5mby0+cGFnZXMgPSAxOwotCWluZm8tPmRpcmVjdFtQU0NfVk9MVEFHRV9JTl0gPSB0cnVlOwotCWluZm8tPmRpcmVjdFtQU0NfVk9MVEFHRV9PVVRdID0gdHJ1ZTsKLQlpbmZvLT5kaXJlY3RbUFNDX0NVUlJFTlRfT1VUXSA9IHRydWU7CisJaW5mby0+Zm9ybWF0W1BTQ19WT0xUQUdFX0lOXSA9IGRpcmVjdDsKKwlpbmZvLT5mb3JtYXRbUFNDX1ZPTFRBR0VfT1VUXSA9IGRpcmVjdDsKKwlpbmZvLT5mb3JtYXRbUFNDX0NVUlJFTlRfT1VUXSA9IGRpcmVjdDsKIAlpbmZvLT5tW1BTQ19DVVJSRU5UX09VVF0gPSA4MDc7CiAJaW5mby0+YltQU0NfQ1VSUkVOVF9PVVRdID0gMjA0NzU7CiAJaW5mby0+UltQU0NfQ1VSUkVOVF9PVVRdID0gLTE7CiAJaW5mby0+ZnVuY1swXSA9IFBNQlVTX0hBVkVfSU9VVCB8IFBNQlVTX0hBVkVfU1RBVFVTX0lPVVQ7CiAKKwlpbmZvLT5yZWFkX3dvcmRfZGF0YSA9IGFkbTEyNzVfcmVhZF93b3JkX2RhdGE7CisJaW5mby0+d3JpdGVfd29yZF9kYXRhID0gYWRtMTI3NV93cml0ZV93b3JkX2RhdGE7CisKIAlpZiAoY29uZmlnICYgQURNMTI3NV9WUkFOR0UpIHsKIAkJaW5mby0+bVtQU0NfVk9MVEFHRV9JTl0gPSAxOTE5OTsKIAkJaW5mby0+YltQU0NfVk9MVEFHRV9JTl0gPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9wbWJ1cy9sbTI1MDY2LmMgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL2xtMjUwNjYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGJjMTE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9wbWJ1cy9sbTI1MDY2LmMKQEAgLTAsMCArMSwzNDAgQEAKKy8qCisgKiBIYXJkd2FyZSBtb25pdG9yaW5nIGRyaXZlciBmb3IgTE0yNTA2NiAvIExNNTA2NCAvIExNNTA2NgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBFcmljc3NvbiBBQi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgInBtYnVzLmgiCisKK2VudW0gY2hpcHMgeyBsbTI1MDY2LCBsbTUwNjQsIGxtNTA2NiB9OworCisjZGVmaW5lIExNMjUwNjZfUkVBRF9WQVVYCQkweGQwCisjZGVmaW5lIExNMjUwNjZfTUZSX1JFQURfSUlOCQkweGQxCisjZGVmaW5lIExNMjUwNjZfTUZSX1JFQURfUElOCQkweGQyCisjZGVmaW5lIExNMjUwNjZfTUZSX0lJTl9PQ19XQVJOX0xJTUlUCTB4ZDMKKyNkZWZpbmUgTE0yNTA2Nl9NRlJfUElOX09QX1dBUk5fTElNSVQJMHhkNAorI2RlZmluZSBMTTI1MDY2X1JFQURfUElOX1BFQUsJCTB4ZDUKKyNkZWZpbmUgTE0yNTA2Nl9DTEVBUl9QSU5fUEVBSwkJMHhkNgorI2RlZmluZSBMTTI1MDY2X0RFVklDRV9TRVRVUAkJMHhkOQorI2RlZmluZSBMTTI1MDY2X1JFQURfQVZHX1ZJTgkJMHhkYworI2RlZmluZSBMTTI1MDY2X1JFQURfQVZHX1ZPVVQJCTB4ZGQKKyNkZWZpbmUgTE0yNTA2Nl9SRUFEX0FWR19JSU4JCTB4ZGUKKyNkZWZpbmUgTE0yNTA2Nl9SRUFEX0FWR19QSU4JCTB4ZGYKKworI2RlZmluZSBMTTI1MDY2X0RFVl9TRVRVUF9DTAkJKDEgPDwgNCkJLyogQ3VycmVudCBsaW1pdCAqLworCitzdHJ1Y3QgbG0yNTA2Nl9kYXRhIHsKKwlpbnQgaWQ7CisJc3RydWN0IHBtYnVzX2RyaXZlcl9pbmZvIGluZm87Cit9OworCisjZGVmaW5lIHRvX2xtMjUwNjZfZGF0YSh4KSAgY29udGFpbmVyX29mKHgsIHN0cnVjdCBsbTI1MDY2X2RhdGEsIGluZm8pCisKK3N0YXRpYyBpbnQgbG0yNTA2Nl9yZWFkX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwgaW50IHJlZykKK3sKKwljb25zdCBzdHJ1Y3QgcG1idXNfZHJpdmVyX2luZm8gKmluZm8gPSBwbWJ1c19nZXRfZHJpdmVyX2luZm8oY2xpZW50KTsKKwljb25zdCBzdHJ1Y3QgbG0yNTA2Nl9kYXRhICpkYXRhID0gdG9fbG0yNTA2Nl9kYXRhKGluZm8pOworCWludCByZXQ7CisKKwlpZiAocGFnZSA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogTWFwIFJFQURfVkFVWCBpbnRvIFJFQURfVk9VVCByZWdpc3RlciBvbiBwYWdlIDEgKi8KKwlpZiAocGFnZSA9PSAxKSB7CisJCXN3aXRjaCAocmVnKSB7CisJCWNhc2UgUE1CVVNfUkVBRF9WT1VUOgorCQkJcmV0ID0gcG1idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCAwLAorCQkJCQkJICAgTE0yNTA2Nl9SRUFEX1ZBVVgpOworCQkJaWYgKHJldCA8IDApCisJCQkJYnJlYWs7CisJCQkvKiBBZGp1c3QgcmV0dXJuZWQgdmFsdWUgdG8gbWF0Y2ggVk9VVCBjb2VmZmljaWVudHMgKi8KKwkJCXN3aXRjaCAoZGF0YS0+aWQpIHsKKwkJCWNhc2UgbG0yNTA2NjoKKwkJCQkvKiBWT1VUOiA0LjU0IG1WIFZBVVg6IDI4My4yIHVWIExTQiAqLworCQkJCXJldCA9IERJVl9ST1VORF9DTE9TRVNUKHJldCAqIDI4MzIsIDQ1NDAwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgbG01MDY0OgorCQkJCS8qIFZPVVQ6IDQuNTMgbVYgVkFVWDogNzAwIHVWIExTQiAqLworCQkJCXJldCA9IERJVl9ST1VORF9DTE9TRVNUKHJldCAqIDcwLCA0NTMpOworCQkJCWJyZWFrOworCQkJY2FzZSBsbTUwNjY6CisJCQkJLyogVk9VVDogMi4xOCBtViBWQVVYOiA3MjUgdVYgTFNCICovCisJCQkJcmV0ID0gRElWX1JPVU5EX0NMT1NFU1QocmV0ICogNzI1LCAyMTgwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogTm8gb3RoZXIgdmFsaWQgcmVnaXN0ZXJzIG9uIHBhZ2UgMSAqLworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUE1CVVNfUkVBRF9JSU46CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwgTE0yNTA2Nl9NRlJfUkVBRF9JSU4pOworCQlicmVhazsKKwljYXNlIFBNQlVTX1JFQURfUElOOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIDAsIExNMjUwNjZfTUZSX1JFQURfUElOKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19JSU5fT0NfV0FSTl9MSU1JVDoKKwkJcmV0ID0gcG1idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCAwLAorCQkJCQkgICBMTTI1MDY2X01GUl9JSU5fT0NfV0FSTl9MSU1JVCk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfUElOX09QX1dBUk5fTElNSVQ6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwKKwkJCQkJICAgTE0yNTA2Nl9NRlJfUElOX09QX1dBUk5fTElNSVQpOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVBRF9WSU5fQVZHOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIDAsIExNMjUwNjZfUkVBRF9BVkdfVklOKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19WSVJUX1JFQURfVk9VVF9BVkc6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwgTE0yNTA2Nl9SRUFEX0FWR19WT1VUKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19WSVJUX1JFQURfSUlOX0FWRzoKKwkJcmV0ID0gcG1idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCAwLCBMTTI1MDY2X1JFQURfQVZHX0lJTik7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRUFEX1BJTl9BVkc6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwgTE0yNTA2Nl9SRUFEX0FWR19QSU4pOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVBRF9QSU5fTUFYOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIDAsIExNMjUwNjZfUkVBRF9QSU5fUEVBSyk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9QSU5fSElTVE9SWToKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0RBVEE7CisJCWJyZWFrOworCX0KK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsbTI1MDY2X3dyaXRlX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwgaW50IHJlZywKKwkJCQkgICB1MTYgd29yZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKHBhZ2UgPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBQTUJVU19JSU5fT0NfV0FSTl9MSU1JVDoKKwkJcmV0ID0gcG1idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgMCwKKwkJCQkJICAgIExNMjUwNjZfTUZSX0lJTl9PQ19XQVJOX0xJTUlULAorCQkJCQkgICAgd29yZCk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfUElOX09QX1dBUk5fTElNSVQ6CisJCXJldCA9IHBtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIDAsCisJCQkJCSAgICBMTTI1MDY2X01GUl9QSU5fT1BfV0FSTl9MSU1JVCwKKwkJCQkJICAgIHdvcmQpOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfUElOX0hJU1RPUlk6CisJCXJldCA9IHBtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCAwLCBMTTI1MDY2X0NMRUFSX1BJTl9QRUFLKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0RBVEE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGxtMjUwNjZfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWludCBjb25maWc7CisJaW50IHJldDsKKwlzdHJ1Y3QgbG0yNTA2Nl9kYXRhICpkYXRhOworCXN0cnVjdCBwbWJ1c19kcml2ZXJfaW5mbyAqaW5mbzsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAorCQkJCSAgICAgSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFX0RBVEEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbG0yNTA2Nl9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIExNMjUwNjZfREVWSUNFX1NFVFVQKTsKKwlpZiAoY29uZmlnIDwgMCkgeworCQlyZXQgPSBjb25maWc7CisJCWdvdG8gZXJyX21lbTsKKwl9CisKKwlkYXRhLT5pZCA9IGlkLT5kcml2ZXJfZGF0YTsKKwlpbmZvID0gJmRhdGEtPmluZm87CisKKwlpbmZvLT5wYWdlcyA9IDI7CisJaW5mby0+Zm9ybWF0W1BTQ19WT0xUQUdFX0lOXSA9IGRpcmVjdDsKKwlpbmZvLT5mb3JtYXRbUFNDX1ZPTFRBR0VfT1VUXSA9IGRpcmVjdDsKKwlpbmZvLT5mb3JtYXRbUFNDX0NVUlJFTlRfSU5dID0gZGlyZWN0OworCWluZm8tPmZvcm1hdFtQU0NfVEVNUEVSQVRVUkVdID0gZGlyZWN0OworCWluZm8tPmZvcm1hdFtQU0NfUE9XRVJdID0gZGlyZWN0OworCisJaW5mby0+bVtQU0NfVEVNUEVSQVRVUkVdID0gMTY7CisJaW5mby0+YltQU0NfVEVNUEVSQVRVUkVdID0gMDsKKwlpbmZvLT5SW1BTQ19URU1QRVJBVFVSRV0gPSAwOworCisJaW5mby0+ZnVuY1swXSA9IFBNQlVTX0hBVkVfVklOIHwgUE1CVVNfSEFWRV9WT1VUCisJICB8IFBNQlVTX0hBVkVfU1RBVFVTX1ZPVVQgfCBQTUJVU19IQVZFX1BJTiB8IFBNQlVTX0hBVkVfSUlOCisJICB8IFBNQlVTX0hBVkVfU1RBVFVTX0lOUFVUIHwgUE1CVVNfSEFWRV9URU1QIHwgUE1CVVNfSEFWRV9TVEFUVVNfVEVNUDsKKwlpbmZvLT5mdW5jWzFdID0gUE1CVVNfSEFWRV9WT1VUOworCisJaW5mby0+cmVhZF93b3JkX2RhdGEgPSBsbTI1MDY2X3JlYWRfd29yZF9kYXRhOworCWluZm8tPndyaXRlX3dvcmRfZGF0YSA9IGxtMjUwNjZfd3JpdGVfd29yZF9kYXRhOworCisJc3dpdGNoIChpZC0+ZHJpdmVyX2RhdGEpIHsKKwljYXNlIGxtMjUwNjY6CisJCWluZm8tPm1bUFNDX1ZPTFRBR0VfSU5dID0gMjIwNzA7CisJCWluZm8tPmJbUFNDX1ZPTFRBR0VfSU5dID0gMDsKKwkJaW5mby0+UltQU0NfVk9MVEFHRV9JTl0gPSAtMjsKKwkJaW5mby0+bVtQU0NfVk9MVEFHRV9PVVRdID0gMjIwNzA7CisJCWluZm8tPmJbUFNDX1ZPTFRBR0VfT1VUXSA9IDA7CisJCWluZm8tPlJbUFNDX1ZPTFRBR0VfT1VUXSA9IC0yOworCisJCWlmIChjb25maWcgJiBMTTI1MDY2X0RFVl9TRVRVUF9DTCkgeworCQkJaW5mby0+bVtQU0NfQ1VSUkVOVF9JTl0gPSA2ODUyOworCQkJaW5mby0+YltQU0NfQ1VSUkVOVF9JTl0gPSAwOworCQkJaW5mby0+UltQU0NfQ1VSUkVOVF9JTl0gPSAtMjsKKwkJCWluZm8tPm1bUFNDX1BPV0VSXSA9IDM2OTsKKwkJCWluZm8tPmJbUFNDX1BPV0VSXSA9IDA7CisJCQlpbmZvLT5SW1BTQ19QT1dFUl0gPSAtMjsKKwkJfSBlbHNlIHsKKwkJCWluZm8tPm1bUFNDX0NVUlJFTlRfSU5dID0gMTM2NjE7CisJCQlpbmZvLT5iW1BTQ19DVVJSRU5UX0lOXSA9IDA7CisJCQlpbmZvLT5SW1BTQ19DVVJSRU5UX0lOXSA9IC0yOworCQkJaW5mby0+bVtQU0NfUE9XRVJdID0gNzM2OworCQkJaW5mby0+YltQU0NfUE9XRVJdID0gMDsKKwkJCWluZm8tPlJbUFNDX1BPV0VSXSA9IC0yOworCQl9CisJCWJyZWFrOworCWNhc2UgbG01MDY0OgorCQlpbmZvLT5tW1BTQ19WT0xUQUdFX0lOXSA9IDIyMDc1OworCQlpbmZvLT5iW1BTQ19WT0xUQUdFX0lOXSA9IDA7CisJCWluZm8tPlJbUFNDX1ZPTFRBR0VfSU5dID0gLTI7CisJCWluZm8tPm1bUFNDX1ZPTFRBR0VfT1VUXSA9IDIyMDc1OworCQlpbmZvLT5iW1BTQ19WT0xUQUdFX09VVF0gPSAwOworCQlpbmZvLT5SW1BTQ19WT0xUQUdFX09VVF0gPSAtMjsKKworCQlpZiAoY29uZmlnICYgTE0yNTA2Nl9ERVZfU0VUVVBfQ0wpIHsKKwkJCWluZm8tPm1bUFNDX0NVUlJFTlRfSU5dID0gNjcxMzsKKwkJCWluZm8tPmJbUFNDX0NVUlJFTlRfSU5dID0gMDsKKwkJCWluZm8tPlJbUFNDX0NVUlJFTlRfSU5dID0gLTI7CisJCQlpbmZvLT5tW1BTQ19QT1dFUl0gPSAzNjE5OworCQkJaW5mby0+YltQU0NfUE9XRVJdID0gMDsKKwkJCWluZm8tPlJbUFNDX1BPV0VSXSA9IC0zOworCQl9IGVsc2UgeworCQkJaW5mby0+bVtQU0NfQ1VSUkVOVF9JTl0gPSAxMzQyNjsKKwkJCWluZm8tPmJbUFNDX0NVUlJFTlRfSU5dID0gMDsKKwkJCWluZm8tPlJbUFNDX0NVUlJFTlRfSU5dID0gLTI7CisJCQlpbmZvLT5tW1BTQ19QT1dFUl0gPSA3MjM4OworCQkJaW5mby0+YltQU0NfUE9XRVJdID0gMDsKKwkJCWluZm8tPlJbUFNDX1BPV0VSXSA9IC0zOworCQl9CisJCWJyZWFrOworCWNhc2UgbG01MDY2OgorCQlpbmZvLT5tW1BTQ19WT0xUQUdFX0lOXSA9IDQ1ODc7CisJCWluZm8tPmJbUFNDX1ZPTFRBR0VfSU5dID0gMDsKKwkJaW5mby0+UltQU0NfVk9MVEFHRV9JTl0gPSAtMjsKKwkJaW5mby0+bVtQU0NfVk9MVEFHRV9PVVRdID0gNDU4NzsKKwkJaW5mby0+YltQU0NfVk9MVEFHRV9PVVRdID0gMDsKKwkJaW5mby0+UltQU0NfVk9MVEFHRV9PVVRdID0gLTI7CisKKwkJaWYgKGNvbmZpZyAmIExNMjUwNjZfREVWX1NFVFVQX0NMKSB7CisJCQlpbmZvLT5tW1BTQ19DVVJSRU5UX0lOXSA9IDEwNzUzOworCQkJaW5mby0+YltQU0NfQ1VSUkVOVF9JTl0gPSAwOworCQkJaW5mby0+UltQU0NfQ1VSUkVOVF9JTl0gPSAtMjsKKwkJCWluZm8tPm1bUFNDX1BPV0VSXSA9IDEyMDQ7CisJCQlpbmZvLT5iW1BTQ19QT1dFUl0gPSAwOworCQkJaW5mby0+UltQU0NfUE9XRVJdID0gLTM7CisJCX0gZWxzZSB7CisJCQlpbmZvLT5tW1BTQ19DVVJSRU5UX0lOXSA9IDU0MDU7CisJCQlpbmZvLT5iW1BTQ19DVVJSRU5UX0lOXSA9IDA7CisJCQlpbmZvLT5SW1BTQ19DVVJSRU5UX0lOXSA9IC0yOworCQkJaW5mby0+bVtQU0NfUE9XRVJdID0gNjA1OworCQkJaW5mby0+YltQU0NfUE9XRVJdID0gMDsKKwkJCWluZm8tPlJbUFNDX1BPV0VSXSA9IC0zOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX21lbTsKKwl9CisKKwlyZXQgPSBwbWJ1c19kb19wcm9iZShjbGllbnQsIGlkLCBpbmZvKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9tZW07CisJcmV0dXJuIDA7CisKK2Vycl9tZW06CisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsbTI1MDY2X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWNvbnN0IHN0cnVjdCBwbWJ1c19kcml2ZXJfaW5mbyAqaW5mbyA9IHBtYnVzX2dldF9kcml2ZXJfaW5mbyhjbGllbnQpOworCWNvbnN0IHN0cnVjdCBsbTI1MDY2X2RhdGEgKmRhdGEgPSB0b19sbTI1MDY2X2RhdGEoaW5mbyk7CisJaW50IHJldDsKKworCXJldCA9IHBtYnVzX2RvX3JlbW92ZShjbGllbnQpOworCWtmcmVlKGRhdGEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsbTI1MDY2X2lkW10gPSB7CisJeyJsbTI1MDY2IiwgbG0yNTA2Nn0sCisJeyJsbTUwNjQiLCBsbTUwNjR9LAorCXsibG01MDY2IiwgbG01MDY2fSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBsbTI1MDY2X2lkKTsKKworLyogVGhpcyBpcyB0aGUgZHJpdmVyIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCAqLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGxtMjUwNjZfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gImxtMjUwNjYiLAorCQkgICB9LAorCS5wcm9iZSA9IGxtMjUwNjZfcHJvYmUsCisJLnJlbW92ZSA9IGxtMjUwNjZfcmVtb3ZlLAorCS5pZF90YWJsZSA9IGxtMjUwNjZfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBsbTI1MDY2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmxtMjUwNjZfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGxtMjUwNjZfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZsbTI1MDY2X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkd1ZW50ZXIgUm9lY2siKTsKK01PRFVMRV9ERVNDUklQVElPTigiUE1CdXMgZHJpdmVyIGZvciBMTTI1MDY2L0xNNTA2NC9MTTUwNjYiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9pbml0KGxtMjUwNjZfaW5pdCk7Cittb2R1bGVfZXhpdChsbTI1MDY2X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9tYXgxNjA2NC5jIGIvZHJpdmVycy9od21vbi9wbWJ1cy9tYXgxNjA2NC5jCnNpbWlsYXJpdHkgaW5kZXggNjYlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaHdtb24vbWF4MTYwNjQuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9wbWJ1cy9tYXgxNjA2NC5jCmluZGV4IDFkNmQ3MTcuLmU1MGIyOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbWF4MTYwNjQuYworKysgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL21heDE2MDY0LmMKQEAgLTI1LDExICsyNSw2MCBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgInBtYnVzLmgiCiAKKyNkZWZpbmUgTUFYMTYwNjRfTUZSX1ZPVVRfUEVBSwkJMHhkNAorI2RlZmluZSBNQVgxNjA2NF9NRlJfVEVNUEVSQVRVUkVfUEVBSwkweGQ2CisKK3N0YXRpYyBpbnQgbWF4MTYwNjRfcmVhZF93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIGludCByZWcpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBQTUJVU19WSVJUX1JFQURfVk9VVF9NQVg6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcGFnZSwKKwkJCQkJICAgTUFYMTYwNjRfTUZSX1ZPVVRfUEVBSyk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRUFEX1RFTVBfTUFYOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHBhZ2UsCisJCQkJCSAgIE1BWDE2MDY0X01GUl9URU1QRVJBVFVSRV9QRUFLKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX1ZPVVRfSElTVE9SWToKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfVEVNUF9ISVNUT1JZOgorCQlyZXQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PREFUQTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWF4MTYwNjRfd3JpdGVfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLAorCQkJCSAgICBpbnQgcmVnLCB1MTYgd29yZCkKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfVk9VVF9ISVNUT1JZOgorCQlyZXQgPSBwbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCBwYWdlLAorCQkJCQkgICAgTUFYMTYwNjRfTUZSX1ZPVVRfUEVBSywgMCk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9URU1QX0hJU1RPUlk6CisJCXJldCA9IHBtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHBhZ2UsCisJCQkJCSAgICBNQVgxNjA2NF9NRlJfVEVNUEVSQVRVUkVfUEVBSywKKwkJCQkJICAgIDB4ZmZmZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9EQVRBOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHN0cnVjdCBwbWJ1c19kcml2ZXJfaW5mbyBtYXgxNjA2NF9pbmZvID0gewogCS5wYWdlcyA9IDQsCi0JLmRpcmVjdFtQU0NfVk9MVEFHRV9JTl0gPSB0cnVlLAotCS5kaXJlY3RbUFNDX1ZPTFRBR0VfT1VUXSA9IHRydWUsCi0JLmRpcmVjdFtQU0NfVEVNUEVSQVRVUkVdID0gdHJ1ZSwKKwkuZm9ybWF0W1BTQ19WT0xUQUdFX0lOXSA9IGRpcmVjdCwKKwkuZm9ybWF0W1BTQ19WT0xUQUdFX09VVF0gPSBkaXJlY3QsCisJLmZvcm1hdFtQU0NfVEVNUEVSQVRVUkVdID0gZGlyZWN0LAogCS5tW1BTQ19WT0xUQUdFX0lOXSA9IDE5OTk1LAogCS5iW1BTQ19WT0xUQUdFX0lOXSA9IDAsCiAJLlJbUFNDX1ZPTFRBR0VfSU5dID0gLTEsCkBAIC00NCw2ICs5Myw4IEBACiAJLmZ1bmNbMV0gPSBQTUJVU19IQVZFX1ZPVVQgfCBQTUJVU19IQVZFX1NUQVRVU19WT1VULAogCS5mdW5jWzJdID0gUE1CVVNfSEFWRV9WT1VUIHwgUE1CVVNfSEFWRV9TVEFUVVNfVk9VVCwKIAkuZnVuY1szXSA9IFBNQlVTX0hBVkVfVk9VVCB8IFBNQlVTX0hBVkVfU1RBVFVTX1ZPVVQsCisJLnJlYWRfd29yZF9kYXRhID0gbWF4MTYwNjRfcmVhZF93b3JkX2RhdGEsCisJLndyaXRlX3dvcmRfZGF0YSA9IG1heDE2MDY0X3dyaXRlX3dvcmRfZGF0YSwKIH07CiAKIHN0YXRpYyBpbnQgbWF4MTYwNjRfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbWF4MzQ0NDAuYyBiL2RyaXZlcnMvaHdtb24vcG1idXMvbWF4MzQ0NDAuYwpzaW1pbGFyaXR5IGluZGV4IDc2JQpyZW5hbWUgZnJvbSBkcml2ZXJzL2h3bW9uL21heDM0NDQwLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vcG1idXMvbWF4MzQ0NDAuYwppbmRleCBkYjExZTFhLi5mZGE2MjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL21heDM0NDQwLmMKKysrIGIvZHJpdmVycy9od21vbi9wbWJ1cy9tYXgzNDQ0MC5jCkBAIC0yNywxMSArMjcsNzAgQEAKIAogZW51bSBjaGlwcyB7IG1heDM0NDQwLCBtYXgzNDQ0MSB9OwogCisjZGVmaW5lIE1BWDM0NDQwX01GUl9WT1VUX1BFQUsJCTB4ZDQKKyNkZWZpbmUgTUFYMzQ0NDBfTUZSX0lPVVRfUEVBSwkJMHhkNQorI2RlZmluZSBNQVgzNDQ0MF9NRlJfVEVNUEVSQVRVUkVfUEVBSwkweGQ2CisKICNkZWZpbmUgTUFYMzQ0NDBfU1RBVFVTX09DX1dBUk4JCSgxIDw8IDApCiAjZGVmaW5lIE1BWDM0NDQwX1NUQVRVU19PQ19GQVVMVAkoMSA8PCAxKQogI2RlZmluZSBNQVgzNDQ0MF9TVEFUVVNfT1RfRkFVTFQJKDEgPDwgNSkKICNkZWZpbmUgTUFYMzQ0NDBfU1RBVFVTX09UX1dBUk4JCSgxIDw8IDYpCiAKK3N0YXRpYyBpbnQgbWF4MzQ0NDBfcmVhZF93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIGludCByZWcpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBQTUJVU19WSVJUX1JFQURfVk9VVF9NQVg6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcGFnZSwKKwkJCQkJICAgTUFYMzQ0NDBfTUZSX1ZPVVRfUEVBSyk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRUFEX0lPVVRfTUFYOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHBhZ2UsCisJCQkJCSAgIE1BWDM0NDQwX01GUl9JT1VUX1BFQUspOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVBRF9URU1QX01BWDoKKwkJcmV0ID0gcG1idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBwYWdlLAorCQkJCQkgICBNQVgzNDQ0MF9NRlJfVEVNUEVSQVRVUkVfUEVBSyk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9WT1VUX0hJU1RPUlk6CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX0lPVVRfSElTVE9SWToKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfVEVNUF9ISVNUT1JZOgorCQlyZXQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PREFUQTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWF4MzQ0NDBfd3JpdGVfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLAorCQkJCSAgICBpbnQgcmVnLCB1MTYgd29yZCkKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfVk9VVF9ISVNUT1JZOgorCQlyZXQgPSBwbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCBwYWdlLAorCQkJCQkgICAgTUFYMzQ0NDBfTUZSX1ZPVVRfUEVBSywgMCk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9JT1VUX0hJU1RPUlk6CisJCXJldCA9IHBtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHBhZ2UsCisJCQkJCSAgICBNQVgzNDQ0MF9NRlJfSU9VVF9QRUFLLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX1RFTVBfSElTVE9SWToKKwkJcmV0ID0gcG1idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcGFnZSwKKwkJCQkJICAgIE1BWDM0NDQwX01GUl9URU1QRVJBVFVSRV9QRUFLLAorCQkJCQkgICAgMHhmZmZmKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0RBVEE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IG1heDM0NDQwX3JlYWRfYnl0ZV9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnKQogewogCWludCByZXQ7CkBAIC03MiwxMCArMTMxLDEwIEBACiBzdGF0aWMgc3RydWN0IHBtYnVzX2RyaXZlcl9pbmZvIG1heDM0NDQwX2luZm9bXSA9IHsKIAlbbWF4MzQ0NDBdID0gewogCQkucGFnZXMgPSAxNCwKLQkJLmRpcmVjdFtQU0NfVk9MVEFHRV9JTl0gPSB0cnVlLAotCQkuZGlyZWN0W1BTQ19WT0xUQUdFX09VVF0gPSB0cnVlLAotCQkuZGlyZWN0W1BTQ19URU1QRVJBVFVSRV0gPSB0cnVlLAotCQkuZGlyZWN0W1BTQ19DVVJSRU5UX09VVF0gPSB0cnVlLAorCQkuZm9ybWF0W1BTQ19WT0xUQUdFX0lOXSA9IGRpcmVjdCwKKwkJLmZvcm1hdFtQU0NfVk9MVEFHRV9PVVRdID0gZGlyZWN0LAorCQkuZm9ybWF0W1BTQ19URU1QRVJBVFVSRV0gPSBkaXJlY3QsCisJCS5mb3JtYXRbUFNDX0NVUlJFTlRfT1VUXSA9IGRpcmVjdCwKIAkJLm1bUFNDX1ZPTFRBR0VfSU5dID0gMSwKIAkJLmJbUFNDX1ZPTFRBR0VfSU5dID0gMCwKIAkJLlJbUFNDX1ZPTFRBR0VfSU5dID0gMywJICAgIC8qIFIgPSAwIGluIGRhdGFzaGVldCByZWZsZWN0cyBtViAqLwpAQCAtMTA5LDE0ICsxNjgsMTYgQEAKIAkJLmZ1bmNbMTJdID0gUE1CVVNfSEFWRV9URU1QIHwgUE1CVVNfSEFWRV9TVEFUVVNfVEVNUCwKIAkJLmZ1bmNbMTNdID0gUE1CVVNfSEFWRV9URU1QIHwgUE1CVVNfSEFWRV9TVEFUVVNfVEVNUCwKIAkJLnJlYWRfYnl0ZV9kYXRhID0gbWF4MzQ0NDBfcmVhZF9ieXRlX2RhdGEsCisJCS5yZWFkX3dvcmRfZGF0YSA9IG1heDM0NDQwX3JlYWRfd29yZF9kYXRhLAorCQkud3JpdGVfd29yZF9kYXRhID0gbWF4MzQ0NDBfd3JpdGVfd29yZF9kYXRhLAogCX0sCiAJW21heDM0NDQxXSA9IHsKIAkJLnBhZ2VzID0gMTIsCi0JCS5kaXJlY3RbUFNDX1ZPTFRBR0VfSU5dID0gdHJ1ZSwKLQkJLmRpcmVjdFtQU0NfVk9MVEFHRV9PVVRdID0gdHJ1ZSwKLQkJLmRpcmVjdFtQU0NfVEVNUEVSQVRVUkVdID0gdHJ1ZSwKLQkJLmRpcmVjdFtQU0NfQ1VSUkVOVF9PVVRdID0gdHJ1ZSwKLQkJLmRpcmVjdFtQU0NfRkFOXSA9IHRydWUsCisJCS5mb3JtYXRbUFNDX1ZPTFRBR0VfSU5dID0gZGlyZWN0LAorCQkuZm9ybWF0W1BTQ19WT0xUQUdFX09VVF0gPSBkaXJlY3QsCisJCS5mb3JtYXRbUFNDX1RFTVBFUkFUVVJFXSA9IGRpcmVjdCwKKwkJLmZvcm1hdFtQU0NfQ1VSUkVOVF9PVVRdID0gZGlyZWN0LAorCQkuZm9ybWF0W1BTQ19GQU5dID0gZGlyZWN0LAogCQkubVtQU0NfVk9MVEFHRV9JTl0gPSAxLAogCQkuYltQU0NfVk9MVEFHRV9JTl0gPSAwLAogCQkuUltQU0NfVk9MVEFHRV9JTl0gPSAzLApAQCAtMTUwLDYgKzIxMSw4IEBACiAJCS5mdW5jWzEwXSA9IFBNQlVTX0hBVkVfVEVNUCB8IFBNQlVTX0hBVkVfU1RBVFVTX1RFTVAsCiAJCS5mdW5jWzExXSA9IFBNQlVTX0hBVkVfVEVNUCB8IFBNQlVTX0hBVkVfU1RBVFVTX1RFTVAsCiAJCS5yZWFkX2J5dGVfZGF0YSA9IG1heDM0NDQwX3JlYWRfYnl0ZV9kYXRhLAorCQkucmVhZF93b3JkX2RhdGEgPSBtYXgzNDQ0MF9yZWFkX3dvcmRfZGF0YSwKKwkJLndyaXRlX3dvcmRfZGF0YSA9IG1heDM0NDQwX3dyaXRlX3dvcmRfZGF0YSwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9tYXg4Njg4LmMgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL21heDg2ODguYwpzaW1pbGFyaXR5IGluZGV4IDcyJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2h3bW9uL21heDg2ODguYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9wbWJ1cy9tYXg4Njg4LmMKaW5kZXggN2ZiOTNmNC4uYzNlNzJmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9tYXg4Njg4LmMKKysrIGIvZHJpdmVycy9od21vbi9wbWJ1cy9tYXg4Njg4LmMKQEAgLTI1LDYgKzI1LDkgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlICJwbWJ1cy5oIgogCisjZGVmaW5lIE1BWDg2ODhfTUZSX1ZPVVRfUEVBSwkJMHhkNAorI2RlZmluZSBNQVg4Njg4X01GUl9JT1VUX1BFQUsJCTB4ZDUKKyNkZWZpbmUgTUFYODY4OF9NRlJfVEVNUEVSQVRVUkVfUEVBSwkweGQ2CiAjZGVmaW5lIE1BWDg2ODhfTUZHX1NUQVRVUwkJMHhkOAogCiAjZGVmaW5lIE1BWDg2ODhfU1RBVFVTX09DX0ZBVUxUCQkoMSA8PCA0KQpAQCAtMzcsNiArNDAsNjIgQEAKICNkZWZpbmUgTUFYODY4OF9TVEFUVVNfT1RfRkFVTFQJCSgxIDw8IDEzKQogI2RlZmluZSBNQVg4Njg4X1NUQVRVU19PVF9XQVJOSU5HCSgxIDw8IDE0KQogCitzdGF0aWMgaW50IG1heDg2ODhfcmVhZF93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIGludCByZWcpCit7CisJaW50IHJldDsKKworCWlmIChwYWdlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBQTUJVU19WSVJUX1JFQURfVk9VVF9NQVg6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwgTUFYODY4OF9NRlJfVk9VVF9QRUFLKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19WSVJUX1JFQURfSU9VVF9NQVg6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwgTUFYODY4OF9NRlJfSU9VVF9QRUFLKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19WSVJUX1JFQURfVEVNUF9NQVg6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwKKwkJCQkJICAgTUFYODY4OF9NRlJfVEVNUEVSQVRVUkVfUEVBSyk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9WT1VUX0hJU1RPUlk6CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX0lPVVRfSElTVE9SWToKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfVEVNUF9ISVNUT1JZOgorCQlyZXQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PREFUQTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWF4ODY4OF93cml0ZV93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIGludCByZWcsCisJCQkJICAgdTE2IHdvcmQpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX1ZPVVRfSElTVE9SWToKKwkJcmV0ID0gcG1idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgMCwgTUFYODY4OF9NRlJfVk9VVF9QRUFLLAorCQkJCQkgICAgMCk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9JT1VUX0hJU1RPUlk6CisJCXJldCA9IHBtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIDAsIE1BWDg2ODhfTUZSX0lPVVRfUEVBSywKKwkJCQkJICAgIDApOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfVEVNUF9ISVNUT1JZOgorCQlyZXQgPSBwbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCAwLAorCQkJCQkgICAgTUFYODY4OF9NRlJfVEVNUEVSQVRVUkVfUEVBSywKKwkJCQkJICAgIDB4ZmZmZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9EQVRBOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBtYXg4Njg4X3JlYWRfYnl0ZV9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnKQogewogCWludCByZXQgPSAwOwpAQCAtOTEsMTAgKzE1MCwxMCBAQAogCiBzdGF0aWMgc3RydWN0IHBtYnVzX2RyaXZlcl9pbmZvIG1heDg2ODhfaW5mbyA9IHsKIAkucGFnZXMgPSAxLAotCS5kaXJlY3RbUFNDX1ZPTFRBR0VfSU5dID0gdHJ1ZSwKLQkuZGlyZWN0W1BTQ19WT0xUQUdFX09VVF0gPSB0cnVlLAotCS5kaXJlY3RbUFNDX1RFTVBFUkFUVVJFXSA9IHRydWUsCi0JLmRpcmVjdFtQU0NfQ1VSUkVOVF9PVVRdID0gdHJ1ZSwKKwkuZm9ybWF0W1BTQ19WT0xUQUdFX0lOXSA9IGRpcmVjdCwKKwkuZm9ybWF0W1BTQ19WT0xUQUdFX09VVF0gPSBkaXJlY3QsCisJLmZvcm1hdFtQU0NfVEVNUEVSQVRVUkVdID0gZGlyZWN0LAorCS5mb3JtYXRbUFNDX0NVUlJFTlRfT1VUXSA9IGRpcmVjdCwKIAkubVtQU0NfVk9MVEFHRV9JTl0gPSAxOTk5NSwKIAkuYltQU0NfVk9MVEFHRV9JTl0gPSAwLAogCS5SW1BTQ19WT0xUQUdFX0lOXSA9IC0xLApAQCAtMTExLDYgKzE3MCw4IEBACiAJCXwgUE1CVVNfSEFWRV9TVEFUVVNfVk9VVCB8IFBNQlVTX0hBVkVfU1RBVFVTX0lPVVQKIAkJfCBQTUJVU19IQVZFX1NUQVRVU19URU1QLAogCS5yZWFkX2J5dGVfZGF0YSA9IG1heDg2ODhfcmVhZF9ieXRlX2RhdGEsCisJLnJlYWRfd29yZF9kYXRhID0gbWF4ODY4OF9yZWFkX3dvcmRfZGF0YSwKKwkud3JpdGVfd29yZF9kYXRhID0gbWF4ODY4OF93cml0ZV93b3JkX2RhdGEsCiB9OwogCiBzdGF0aWMgaW50IG1heDg2ODhfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcG1idXMuYyBiL2RyaXZlcnMvaHdtb24vcG1idXMvcG1idXMuYwpzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSBkcml2ZXJzL2h3bW9uL3BtYnVzLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vcG1idXMvcG1idXMuYwppbmRleCA5YjFmMGMzLi43M2RlOWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3BtYnVzLmMKKysrIGIvZHJpdmVycy9od21vbi9wbWJ1cy9wbWJ1cy5jCkBAIC05Niw2ICs5Niw4IEBACiBzdGF0aWMgaW50IHBtYnVzX2lkZW50aWZ5KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkgIHN0cnVjdCBwbWJ1c19kcml2ZXJfaW5mbyAqaW5mbykKIHsKKwlpbnQgcmV0ID0gMDsKKwogCWlmICghaW5mby0+cGFnZXMpIHsKIAkJLyoKIAkJICogQ2hlY2sgaWYgdGhlIFBBR0UgY29tbWFuZCBpcyBzdXBwb3J0ZWQuIElmIGl0IGlzLApAQCAtMTE3LDYgKzExOSwyNyBAQAogCQl9CiAJfQogCisJaWYgKHBtYnVzX2NoZWNrX2J5dGVfcmVnaXN0ZXIoY2xpZW50LCAwLCBQTUJVU19WT1VUX01PREUpKSB7CisJCWludCB2b3V0X21vZGU7CisKKwkJdm91dF9tb2RlID0gcG1idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCAwLCBQTUJVU19WT1VUX01PREUpOworCQlpZiAodm91dF9tb2RlID49IDAgJiYgdm91dF9tb2RlICE9IDB4ZmYpIHsKKwkJCXN3aXRjaCAodm91dF9tb2RlID4+IDUpIHsKKwkJCWNhc2UgMDoKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlpbmZvLT5mb3JtYXRbUFNDX1ZPTFRBR0VfT1VUXSA9IHZpZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlpbmZvLT5mb3JtYXRbUFNDX1ZPTFRBR0VfT1VUXSA9IGRpcmVjdDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0ID0gLUVOT0RFVjsKKwkJCQlnb3RvIGFib3J0OworCQkJfQorCQl9CisJfQorCiAJLyoKIAkgKiBXZSBzaG91bGQgY2hlY2sgaWYgdGhlIENPRUZGSUNJRU5UUyByZWdpc3RlciBpcyBzdXBwb3J0ZWQuCiAJICogSWYgaXQgaXMsIGFuZCB0aGUgY2hpcCBpcyBjb25maWd1cmVkIGZvciBkaXJlY3QgbW9kZSwgd2UgY2FuIHJlYWQKQEAgLTEyNSwxMyArMTQ4LDE4IEBACiAJICoKIAkgKiBUbyBkbyB0aGlzLCB3ZSB3aWxsIG5lZWQgYWNjZXNzIHRvIGEgY2hpcCB3aGljaCBhY3R1YWxseSBzdXBwb3J0cyB0aGUKIAkgKiBDT0VGRklDSUVOVFMgY29tbWFuZCwgc2luY2UgdGhlIGNvbW1hbmQgaXMgdG9vIGNvbXBsZXggdG8gaW1wbGVtZW50Ci0JICogd2l0aG91dCB0ZXN0aW5nIGl0LgorCSAqIHdpdGhvdXQgdGVzdGluZyBpdC4gVW50aWwgdGhlbiwgYWJvcnQgaWYgYSBjaGlwIGNvbmZpZ3VyZWQgZm9yIGRpcmVjdAorCSAqIG1vZGUgd2FzIGRldGVjdGVkLgogCSAqLworCWlmIChpbmZvLT5mb3JtYXRbUFNDX1ZPTFRBR0VfT1VUXSA9PSBkaXJlY3QpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBhYm9ydDsKKwl9CiAKIAkvKiBUcnkgdG8gZmluZCBzZW5zb3IgZ3JvdXBzICAqLwogCXBtYnVzX2ZpbmRfc2Vuc29yX2dyb3VwcyhjbGllbnQsIGluZm8pOwotCi0JcmV0dXJuIDA7CithYm9ydDoKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHBtYnVzX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCkBAIC0xNzIsMTEgKzIwMCwxNCBAQAogICogVXNlIGRyaXZlcl9kYXRhIHRvIHNldCB0aGUgbnVtYmVyIG9mIHBhZ2VzIHN1cHBvcnRlZCBieSB0aGUgY2hpcC4KICAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHBtYnVzX2lkW10gPSB7CisJeyJhZHA0MDAwIiwgMX0sCiAJeyJibXI0NTAiLCAxfSwKIAl7ImJtcjQ1MSIsIDF9LAogCXsiYm1yNDUzIiwgMX0sCiAJeyJibXI0NTQiLCAxfSwKIAl7Imx0YzI5NzgiLCA4fSwKKwl7Im5jcDQyMDAiLCAxfSwKKwl7Im5jcDQyMDgiLCAxfSwKIAl7InBtYnVzIiwgMH0sCiAJe30KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BtYnVzLmggYi9kcml2ZXJzL2h3bW9uL3BtYnVzL3BtYnVzLmgKc2ltaWxhcml0eSBpbmRleCA3OSUKcmVuYW1lIGZyb20gZHJpdmVycy9od21vbi9wbWJ1cy5oCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3BtYnVzL3BtYnVzLmgKaW5kZXggNTA2NDdhYi4uMDgwOGQ5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wbWJ1cy5oCisrKyBiL2RyaXZlcnMvaHdtb24vcG1idXMvcG1idXMuaApAQCAtMTI2LDYgKzEyNiw0MiBAQAogI2RlZmluZSBQTUJVU19NRlJfU0VSSUFMCQkweDlFCiAKIC8qCisgKiBWaXJ0dWFsIHJlZ2lzdGVycy4KKyAqIFVzZWZ1bCB0byBzdXBwb3J0IGF0dHJpYnV0ZXMgd2hpY2ggYXJlIG5vdCBzdXBwb3J0ZWQgYnkgc3RhbmRhcmQgUE1CdXMKKyAqIHJlZ2lzdGVycyBidXQgZXhpc3QgYXMgbWFudWZhY3R1cmVyIHNwZWNpZmljIHJlZ2lzdGVycyBvbiBpbmRpdmlkdWFsIGNoaXBzLgorICogTXVzdCBiZSBtYXBwZWQgdG8gcmVhbCByZWdpc3RlcnMgaW4gZGV2aWNlIHNwZWNpZmljIGNvZGUuCisgKgorICogU2VtYW50aWNzOgorICogVmlydHVhbCByZWdpc3RlcnMgYXJlIGFsbCB3b3JkIHNpemUuCisgKiBSRUFEIHJlZ2lzdGVycyBhcmUgcmVhZC1vbmx5OyB3cml0ZXMgYXJlIGVpdGhlciBpZ25vcmVkIG9yIHJldHVybiBhbiBlcnJvci4KKyAqIFJFU0VUIHJlZ2lzdGVycyBhcmUgcmVhZC93cml0ZS4gUmVhZGluZyByZXR1cm5zIHplcm8gKHVzZWQgZm9yIGRldGVjdGlvbiksCisgKiB3cml0aW5nIGFueSB2YWx1ZSBjYXVzZXMgdGhlIGFzc29jaWF0ZWQgaGlzdG9yeSB0byBiZSByZXNldC4KKyAqLworI2RlZmluZSBQTUJVU19WSVJUX0JBU0UJCQkweDEwMAorI2RlZmluZSBQTUJVU19WSVJUX1JFQURfVEVNUF9NSU4JKFBNQlVTX1ZJUlRfQkFTRSArIDApCisjZGVmaW5lIFBNQlVTX1ZJUlRfUkVBRF9URU1QX01BWAkoUE1CVVNfVklSVF9CQVNFICsgMSkKKyNkZWZpbmUgUE1CVVNfVklSVF9SRVNFVF9URU1QX0hJU1RPUlkJKFBNQlVTX1ZJUlRfQkFTRSArIDIpCisjZGVmaW5lIFBNQlVTX1ZJUlRfUkVBRF9WSU5fQVZHCQkoUE1CVVNfVklSVF9CQVNFICsgMykKKyNkZWZpbmUgUE1CVVNfVklSVF9SRUFEX1ZJTl9NSU4JCShQTUJVU19WSVJUX0JBU0UgKyA0KQorI2RlZmluZSBQTUJVU19WSVJUX1JFQURfVklOX01BWAkJKFBNQlVTX1ZJUlRfQkFTRSArIDUpCisjZGVmaW5lIFBNQlVTX1ZJUlRfUkVTRVRfVklOX0hJU1RPUlkJKFBNQlVTX1ZJUlRfQkFTRSArIDYpCisjZGVmaW5lIFBNQlVTX1ZJUlRfUkVBRF9JSU5fQVZHCQkoUE1CVVNfVklSVF9CQVNFICsgNykKKyNkZWZpbmUgUE1CVVNfVklSVF9SRUFEX0lJTl9NSU4JCShQTUJVU19WSVJUX0JBU0UgKyA4KQorI2RlZmluZSBQTUJVU19WSVJUX1JFQURfSUlOX01BWAkJKFBNQlVTX1ZJUlRfQkFTRSArIDkpCisjZGVmaW5lIFBNQlVTX1ZJUlRfUkVTRVRfSUlOX0hJU1RPUlkJKFBNQlVTX1ZJUlRfQkFTRSArIDEwKQorI2RlZmluZSBQTUJVU19WSVJUX1JFQURfUElOX0FWRwkJKFBNQlVTX1ZJUlRfQkFTRSArIDExKQorI2RlZmluZSBQTUJVU19WSVJUX1JFQURfUElOX01BWAkJKFBNQlVTX1ZJUlRfQkFTRSArIDEyKQorI2RlZmluZSBQTUJVU19WSVJUX1JFU0VUX1BJTl9ISVNUT1JZCShQTUJVU19WSVJUX0JBU0UgKyAxMykKKyNkZWZpbmUgUE1CVVNfVklSVF9SRUFEX1ZPVVRfQVZHCShQTUJVU19WSVJUX0JBU0UgKyAxNCkKKyNkZWZpbmUgUE1CVVNfVklSVF9SRUFEX1ZPVVRfTUlOCShQTUJVU19WSVJUX0JBU0UgKyAxNSkKKyNkZWZpbmUgUE1CVVNfVklSVF9SRUFEX1ZPVVRfTUFYCShQTUJVU19WSVJUX0JBU0UgKyAxNikKKyNkZWZpbmUgUE1CVVNfVklSVF9SRVNFVF9WT1VUX0hJU1RPUlkJKFBNQlVTX1ZJUlRfQkFTRSArIDE3KQorI2RlZmluZSBQTUJVU19WSVJUX1JFQURfSU9VVF9BVkcJKFBNQlVTX1ZJUlRfQkFTRSArIDE4KQorI2RlZmluZSBQTUJVU19WSVJUX1JFQURfSU9VVF9NSU4JKFBNQlVTX1ZJUlRfQkFTRSArIDE5KQorI2RlZmluZSBQTUJVU19WSVJUX1JFQURfSU9VVF9NQVgJKFBNQlVTX1ZJUlRfQkFTRSArIDIwKQorI2RlZmluZSBQTUJVU19WSVJUX1JFU0VUX0lPVVRfSElTVE9SWQkoUE1CVVNfVklSVF9CQVNFICsgMjEpCisKKy8qCiAgKiBDQVBBQklMSVRZCiAgKi8KICNkZWZpbmUgUEJfQ0FQQUJJTElUWV9TTUJBTEVSVAkJKDE8PDQpCkBAIC0yNjYsMTEgKzMwMiwxMSBAQAogI2RlZmluZSBQTUJVU19IQVZFX1NUQVRVU19GQU4xMgkoMSA8PCAxNikKICNkZWZpbmUgUE1CVVNfSEFWRV9TVEFUVVNfRkFOMzQJKDEgPDwgMTcpCiAKK2VudW0gcG1idXNfZGF0YV9mb3JtYXQgeyBsaW5lYXIgPSAwLCBkaXJlY3QsIHZpZCB9OworCiBzdHJ1Y3QgcG1idXNfZHJpdmVyX2luZm8gewogCWludCBwYWdlczsJCS8qIFRvdGFsIG51bWJlciBvZiBwYWdlcyAqLwotCWJvb2wgZGlyZWN0W1BTQ19OVU1fQ0xBU1NFU107Ci0JCQkJLyogdHJ1ZSBpZiBkZXZpY2UgdXNlcyBkaXJlY3QgZGF0YSBmb3JtYXQKLQkJCQkgICBmb3IgdGhlIGdpdmVuIHNlbnNvciBjbGFzcyAqLworCWVudW0gcG1idXNfZGF0YV9mb3JtYXQgZm9ybWF0W1BTQ19OVU1fQ0xBU1NFU107CiAJLyoKIAkgKiBTdXBwb3J0IG9uZSBzZXQgb2YgY29lZmZpY2llbnRzIGZvciBlYWNoIHNlbnNvciB0eXBlCiAJICogVXNlZCBmb3IgY2hpcHMgcHJvdmlkaW5nIGRhdGEgaW4gZGlyZWN0IG1vZGUuCkBAIC0yODYsNiArMzIyLDkgQEAKIAkgKiBuZWNlc3NhcnkuCiAJICovCiAJaW50ICgqcmVhZF9ieXRlX2RhdGEpKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnKTsKKwlpbnQgKCpyZWFkX3dvcmRfZGF0YSkoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIGludCByZWcpOworCWludCAoKndyaXRlX3dvcmRfZGF0YSkoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIGludCByZWcsCisJCQkgICAgICAgdTE2IHdvcmQpOwogCS8qCiAJICogVGhlIGlkZW50aWZ5IGZ1bmN0aW9uIGRldGVybWluZXMgc3VwcG9ydGVkIFBNQnVzIGZ1bmN0aW9uYWxpdHkuCiAJICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBhIGNoaXAgZHJpdmVyIHN1cHBvcnRzIG11bHRpcGxlCkBAIC0yOTksNiArMzM4LDkgQEAKIAogaW50IHBtYnVzX3NldF9wYWdlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHBhZ2UpOwogaW50IHBtYnVzX3JlYWRfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHBhZ2UsIHU4IHJlZyk7CitpbnQgcG1idXNfd3JpdGVfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHBhZ2UsIHU4IHJlZywgdTE2IHdvcmQpOworaW50IHBtYnVzX3JlYWRfYnl0ZV9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCB1OCByZWcpOworaW50IHBtYnVzX3dyaXRlX2J5dGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIHU4IHZhbHVlKTsKIHZvaWQgcG1idXNfY2xlYXJfZmF1bHRzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwogYm9vbCBwbWJ1c19jaGVja19ieXRlX3JlZ2lzdGVyKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnKTsKIGJvb2wgcG1idXNfY2hlY2tfd29yZF9yZWdpc3RlcihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwgaW50IHJlZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BtYnVzX2NvcmUuYyBiL2RyaXZlcnMvaHdtb24vcG1idXMvcG1idXNfY29yZS5jCnNpbWlsYXJpdHkgaW5kZXggODQlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaHdtb24vcG1idXNfY29yZS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3BtYnVzL3BtYnVzX2NvcmUuYwppbmRleCA4ZTMxYThlLi41YzFiNmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3BtYnVzX2NvcmUuYworKysgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL3BtYnVzX2NvcmUuYwpAQCAtMzMsMTQgKzMzLDE4IEBACiAvKgogICogQ29uc3RhbnRzIG5lZWRlZCB0byBkZXRlcm1pbmUgbnVtYmVyIG9mIHNlbnNvcnMsIGJvb2xlYW5zLCBhbmQgbGFiZWxzLgogICovCi0jZGVmaW5lIFBNQlVTX01BWF9JTlBVVF9TRU5TT1JTCQkxMQkvKiA2KnZvbHQsIDMqY3VyciwgMipwb3dlciAqLwotI2RlZmluZSBQTUJVU19WT1VUX1NFTlNPUlNfUEVSX1BBR0UJNQkvKiBpbnB1dCwgbWluLCBtYXgsIGxjcml0LAotCQkJCQkJICAgY3JpdCAqLwotI2RlZmluZSBQTUJVU19JT1VUX1NFTlNPUlNfUEVSX1BBR0UJNAkvKiBpbnB1dCwgbWluLCBtYXgsIGNyaXQgKi8KKyNkZWZpbmUgUE1CVVNfTUFYX0lOUFVUX1NFTlNPUlMJCTIyCS8qIDEwKnZvbHQsIDcqY3VyciwgNSpwb3dlciAqLworI2RlZmluZSBQTUJVU19WT1VUX1NFTlNPUlNfUEVSX1BBR0UJOQkvKiBpbnB1dCwgbWluLCBtYXgsIGxjcml0LAorCQkJCQkJICAgY3JpdCwgbG93ZXN0LCBoaWdoZXN0LCBhdmcsCisJCQkJCQkgICByZXNldCAqLworI2RlZmluZSBQTUJVU19JT1VUX1NFTlNPUlNfUEVSX1BBR0UJOAkvKiBpbnB1dCwgbWluLCBtYXgsIGNyaXQsCisJCQkJCQkgICBsb3dlc3QsIGhpZ2hlc3QsIGF2ZywKKwkJCQkJCSAgIHJlc2V0ICovCiAjZGVmaW5lIFBNQlVTX1BPVVRfU0VOU09SU19QRVJfUEFHRQk0CS8qIGlucHV0LCBjYXAsIG1heCwgY3JpdCAqLwogI2RlZmluZSBQTUJVU19NQVhfU0VOU09SU19QRVJfRkFOCTEJLyogaW5wdXQgKi8KLSNkZWZpbmUgUE1CVVNfTUFYX1NFTlNPUlNfUEVSX1RFTVAJNQkvKiBpbnB1dCwgbWluLCBtYXgsIGxjcml0LAotCQkJCQkJICAgY3JpdCAqLworI2RlZmluZSBQTUJVU19NQVhfU0VOU09SU19QRVJfVEVNUAk4CS8qIGlucHV0LCBtaW4sIG1heCwgbGNyaXQsCisJCQkJCQkgICBjcml0LCBsb3dlc3QsIGhpZ2hlc3QsCisJCQkJCQkgICByZXNldCAqLwogCiAjZGVmaW5lIFBNQlVTX01BWF9JTlBVVF9CT09MRUFOUwk3CS8qIHY6IG1pbl9hbGFybSwgbWF4X2FsYXJtLAogCQkJCQkJICAgbGNyaXRfYWxhcm0sIGNyaXRfYWxhcm07CkBAIC03NCwxMSArNzgsMTMgQEAKICNkZWZpbmUgUEJfU1RBVFVTX0lOUFVUX0JBU0UJKFBCX1NUQVRVU19GQU4zNF9CQVNFICsgUE1CVVNfUEFHRVMpCiAjZGVmaW5lIFBCX1NUQVRVU19URU1QX0JBU0UJKFBCX1NUQVRVU19JTlBVVF9CQVNFICsgMSkKIAorI2RlZmluZSBQTUJVU19OQU1FX1NJWkUJCTI0CisKIHN0cnVjdCBwbWJ1c19zZW5zb3IgewotCWNoYXIgbmFtZVtJMkNfTkFNRV9TSVpFXTsJLyogc3lzZnMgc2Vuc29yIG5hbWUgKi8KKwljaGFyIG5hbWVbUE1CVVNfTkFNRV9TSVpFXTsJLyogc3lzZnMgc2Vuc29yIG5hbWUgKi8KIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgYXR0cmlidXRlOwogCXU4IHBhZ2U7CQkvKiBwYWdlIG51bWJlciAqLwotCXU4IHJlZzsJCQkvKiByZWdpc3RlciAqLworCXUxNiByZWc7CQkvKiByZWdpc3RlciAqLwogCWVudW0gcG1idXNfc2Vuc29yX2NsYXNzZXMgY2xhc3M7CS8qIHNlbnNvciBjbGFzcyAqLwogCWJvb2wgdXBkYXRlOwkJLyogcnVudGltZSBzZW5zb3IgdXBkYXRlIG5lZWRlZCAqLwogCWludCBkYXRhOwkJLyogU2Vuc29yIGRhdGEuCkBAIC04NiwxNCArOTIsMTQgQEAKIH07CiAKIHN0cnVjdCBwbWJ1c19ib29sZWFuIHsKLQljaGFyIG5hbWVbSTJDX05BTUVfU0laRV07CS8qIHN5c2ZzIGJvb2xlYW4gbmFtZSAqLworCWNoYXIgbmFtZVtQTUJVU19OQU1FX1NJWkVdOwkvKiBzeXNmcyBib29sZWFuIG5hbWUgKi8KIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgYXR0cmlidXRlOwogfTsKIAogc3RydWN0IHBtYnVzX2xhYmVsIHsKLQljaGFyIG5hbWVbSTJDX05BTUVfU0laRV07CS8qIHN5c2ZzIGxhYmVsIG5hbWUgKi8KKwljaGFyIG5hbWVbUE1CVVNfTkFNRV9TSVpFXTsJLyogc3lzZnMgbGFiZWwgbmFtZSAqLwogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBhdHRyaWJ1dGU7Ci0JY2hhciBsYWJlbFtJMkNfTkFNRV9TSVpFXTsJLyogbGFiZWwgKi8KKwljaGFyIGxhYmVsW1BNQlVTX05BTUVfU0laRV07CS8qIGxhYmVsICovCiB9OwogCiBzdHJ1Y3QgcG1idXNfZGF0YSB7CkBAIC0xNjIsMTkgKzE2OCwyMSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocG1idXNfc2V0X3BhZ2UpOwogCi1zdGF0aWMgaW50IHBtYnVzX3dyaXRlX2J5dGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcGFnZSwgdTggdmFsdWUpCitpbnQgcG1idXNfd3JpdGVfYnl0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwgdTggdmFsdWUpCiB7CiAJaW50IHJ2OwogCi0JcnYgPSBwbWJ1c19zZXRfcGFnZShjbGllbnQsIHBhZ2UpOwotCWlmIChydiA8IDApCi0JCXJldHVybiBydjsKKwlpZiAocGFnZSA+PSAwKSB7CisJCXJ2ID0gcG1idXNfc2V0X3BhZ2UoY2xpZW50LCBwYWdlKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCXJldHVybiBydjsKKwl9CiAKIAlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCB2YWx1ZSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwbWJ1c193cml0ZV9ieXRlKTsKIAotc3RhdGljIGludCBwbWJ1c193cml0ZV93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcGFnZSwgdTggcmVnLAotCQkJCSB1MTYgd29yZCkKK2ludCBwbWJ1c193cml0ZV93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcGFnZSwgdTggcmVnLCB1MTYgd29yZCkKIHsKIAlpbnQgcnY7CiAKQEAgLTE4NCw2ICsxOTIsMjggQEAKIAogCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCB3b3JkKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBtYnVzX3dyaXRlX3dvcmRfZGF0YSk7CisKKy8qCisgKiBfcG1idXNfd3JpdGVfd29yZF9kYXRhKCkgaXMgc2ltaWxhciB0byBwbWJ1c193cml0ZV93b3JkX2RhdGEoKSwgYnV0IGNoZWNrcyBpZgorICogYSBkZXZpY2Ugc3BlY2lmaWMgbWFwcGluZyBmdW5jdGlvbiBleGlzdHMgYW5kIGNhbGxzIGl0IGlmIG5lY2Vzc2FyeS4KKyAqLworc3RhdGljIGludCBfcG1idXNfd3JpdGVfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnLAorCQkJCSAgdTE2IHdvcmQpCit7CisJc3RydWN0IHBtYnVzX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwljb25zdCBzdHJ1Y3QgcG1idXNfZHJpdmVyX2luZm8gKmluZm8gPSBkYXRhLT5pbmZvOworCWludCBzdGF0dXM7CisKKwlpZiAoaW5mby0+d3JpdGVfd29yZF9kYXRhKSB7CisJCXN0YXR1cyA9IGluZm8tPndyaXRlX3dvcmRfZGF0YShjbGllbnQsIHBhZ2UsIHJlZywgd29yZCk7CisJCWlmIChzdGF0dXMgIT0gLUVOT0RBVEEpCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKwlpZiAocmVnID49IFBNQlVTX1ZJUlRfQkFTRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHBtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHBhZ2UsIHJlZywgd29yZCk7Cit9CiAKIGludCBwbWJ1c19yZWFkX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBwYWdlLCB1OCByZWcpCiB7CkBAIC0xOTcsMTYgKzIyNyw1NyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocG1idXNfcmVhZF93b3JkX2RhdGEpOwogCi1zdGF0aWMgaW50IHBtYnVzX3JlYWRfYnl0ZV9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHBhZ2UsIHU4IHJlZykKKy8qCisgKiBfcG1idXNfcmVhZF93b3JkX2RhdGEoKSBpcyBzaW1pbGFyIHRvIHBtYnVzX3JlYWRfd29yZF9kYXRhKCksIGJ1dCBjaGVja3MgaWYKKyAqIGEgZGV2aWNlIHNwZWNpZmljIG1hcHBpbmcgZnVuY3Rpb24gZXhpc3RzIGFuZCBjYWxscyBpdCBpZiBuZWNlc3NhcnkuCisgKi8KK3N0YXRpYyBpbnQgX3BtYnVzX3JlYWRfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnKQoreworCXN0cnVjdCBwbWJ1c19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJY29uc3Qgc3RydWN0IHBtYnVzX2RyaXZlcl9pbmZvICppbmZvID0gZGF0YS0+aW5mbzsKKwlpbnQgc3RhdHVzOworCisJaWYgKGluZm8tPnJlYWRfd29yZF9kYXRhKSB7CisJCXN0YXR1cyA9IGluZm8tPnJlYWRfd29yZF9kYXRhKGNsaWVudCwgcGFnZSwgcmVnKTsKKwkJaWYgKHN0YXR1cyAhPSAtRU5PREFUQSkKKwkJCXJldHVybiBzdGF0dXM7CisJfQorCWlmIChyZWcgPj0gUE1CVVNfVklSVF9CQVNFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gcG1idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBwYWdlLCByZWcpOworfQorCitpbnQgcG1idXNfcmVhZF9ieXRlX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIHU4IHJlZykKIHsKIAlpbnQgcnY7CiAKLQlydiA9IHBtYnVzX3NldF9wYWdlKGNsaWVudCwgcGFnZSk7Ci0JaWYgKHJ2IDwgMCkKLQkJcmV0dXJuIHJ2OworCWlmIChwYWdlID49IDApIHsKKwkJcnYgPSBwbWJ1c19zZXRfcGFnZShjbGllbnQsIHBhZ2UpOworCQlpZiAocnYgPCAwKQorCQkJcmV0dXJuIHJ2OworCX0KIAogCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocG1idXNfcmVhZF9ieXRlX2RhdGEpOworCisvKgorICogX3BtYnVzX3JlYWRfYnl0ZV9kYXRhKCkgaXMgc2ltaWxhciB0byBwbWJ1c19yZWFkX2J5dGVfZGF0YSgpLCBidXQgY2hlY2tzIGlmCisgKiBhIGRldmljZSBzcGVjaWZpYyBtYXBwaW5nIGZ1bmN0aW9uIGV4aXN0cyBhbmQgY2FsbHMgaXQgaWYgbmVjZXNzYXJ5LgorICovCitzdGF0aWMgaW50IF9wbWJ1c19yZWFkX2J5dGVfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwgaW50IHJlZykKK3sKKwlzdHJ1Y3QgcG1idXNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWNvbnN0IHN0cnVjdCBwbWJ1c19kcml2ZXJfaW5mbyAqaW5mbyA9IGRhdGEtPmluZm87CisJaW50IHN0YXR1czsKKworCWlmIChpbmZvLT5yZWFkX2J5dGVfZGF0YSkgeworCQlzdGF0dXMgPSBpbmZvLT5yZWFkX2J5dGVfZGF0YShjbGllbnQsIHBhZ2UsIHJlZyk7CisJCWlmIChzdGF0dXMgIT0gLUVOT0RBVEEpCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKwlyZXR1cm4gcG1idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBwYWdlLCByZWcpOworfQogCiBzdGF0aWMgdm9pZCBwbWJ1c19jbGVhcl9mYXVsdF9wYWdlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlKQogewpAQCAtMjIzLDEzICsyOTQsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBtYnVzX2NsZWFyX2ZhdWx0cyk7CiAKLXN0YXRpYyBpbnQgcG1idXNfY2hlY2tfc3RhdHVzX2NtbChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSkKK3N0YXRpYyBpbnQgcG1idXNfY2hlY2tfc3RhdHVzX2NtbChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCWludCBzdGF0dXMsIHN0YXR1czI7CiAKLQlzdGF0dXMgPSBwbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHBhZ2UsIFBNQlVTX1NUQVRVU19CWVRFKTsKKwlzdGF0dXMgPSBwbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIC0xLCBQTUJVU19TVEFUVVNfQllURSk7CiAJaWYgKHN0YXR1cyA8IDAgfHwgKHN0YXR1cyAmIFBCX1NUQVRVU19DTUwpKSB7Ci0JCXN0YXR1czIgPSBwbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHBhZ2UsIFBNQlVTX1NUQVRVU19DTUwpOworCQlzdGF0dXMyID0gcG1idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCAtMSwgUE1CVVNfU1RBVFVTX0NNTCk7CiAJCWlmIChzdGF0dXMyIDwgMCB8fCAoc3RhdHVzMiAmIFBCX0NNTF9GQVVMVF9JTlZBTElEX0NPTU1BTkQpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjQxLDEwICszMTIsMTAgQEAKIAlpbnQgcnY7CiAJc3RydWN0IHBtYnVzX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAotCXJ2ID0gcG1idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBwYWdlLCByZWcpOworCXJ2ID0gX3BtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcGFnZSwgcmVnKTsKIAlpZiAocnYgPj0gMCAmJiAhKGRhdGEtPmZsYWdzICYgUE1CVVNfU0tJUF9TVEFUVVNfQ0hFQ0spKQotCQlydiA9IHBtYnVzX2NoZWNrX3N0YXR1c19jbWwoY2xpZW50LCBwYWdlKTsKLQlwbWJ1c19jbGVhcl9mYXVsdF9wYWdlKGNsaWVudCwgcGFnZSk7CisJCXJ2ID0gcG1idXNfY2hlY2tfc3RhdHVzX2NtbChjbGllbnQpOworCXBtYnVzX2NsZWFyX2ZhdWx0X3BhZ2UoY2xpZW50LCAtMSk7CiAJcmV0dXJuIHJ2ID49IDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbWJ1c19jaGVja19ieXRlX3JlZ2lzdGVyKTsKQEAgLTI1NCwxMCArMzI1LDEwIEBACiAJaW50IHJ2OwogCXN0cnVjdCBwbWJ1c19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKLQlydiA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcGFnZSwgcmVnKTsKKwlydiA9IF9wbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHBhZ2UsIHJlZyk7CiAJaWYgKHJ2ID49IDAgJiYgIShkYXRhLT5mbGFncyAmIFBNQlVTX1NLSVBfU1RBVFVTX0NIRUNLKSkKLQkJcnYgPSBwbWJ1c19jaGVja19zdGF0dXNfY21sKGNsaWVudCwgcGFnZSk7Ci0JcG1idXNfY2xlYXJfZmF1bHRfcGFnZShjbGllbnQsIHBhZ2UpOworCQlydiA9IHBtYnVzX2NoZWNrX3N0YXR1c19jbWwoY2xpZW50KTsKKwlwbWJ1c19jbGVhcl9mYXVsdF9wYWdlKGNsaWVudCwgLTEpOwogCXJldHVybiBydiA+PSAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocG1idXNfY2hlY2tfd29yZF9yZWdpc3Rlcik7CkBAIC0yNzAsMjQgKzM0MSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbWJ1c19nZXRfZHJpdmVyX2luZm8pOwogCi0vKgotICogX3BtYnVzX3JlYWRfYnl0ZV9kYXRhKCkgaXMgc2ltaWxhciB0byBwbWJ1c19yZWFkX2J5dGVfZGF0YSgpLCBidXQgY2hlY2tzIGlmCi0gKiBhIGRldmljZSBzcGVjaWZpYyBtYXBwaW5nIGZ1bmNpb24gZXhpc3RzIGFuZCBjYWxscyBpdCBpZiBuZWNlc3NhcnkuCi0gKi8KLXN0YXRpYyBpbnQgX3BtYnVzX3JlYWRfYnl0ZV9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnKQotewotCXN0cnVjdCBwbWJ1c19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JY29uc3Qgc3RydWN0IHBtYnVzX2RyaXZlcl9pbmZvICppbmZvID0gZGF0YS0+aW5mbzsKLQlpbnQgc3RhdHVzOwotCi0JaWYgKGluZm8tPnJlYWRfYnl0ZV9kYXRhKSB7Ci0JCXN0YXR1cyA9IGluZm8tPnJlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcGFnZSwgcmVnKTsKLQkJaWYgKHN0YXR1cyAhPSAtRU5PREFUQSkKLQkJCXJldHVybiBzdGF0dXM7Ci0JfQotCXJldHVybiBwbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHBhZ2UsIHJlZyk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcG1idXNfZGF0YSAqcG1idXNfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKQEAgLTM0Nyw4ICs0MDAsOSBAQAogCiAJCQlpZiAoIWRhdGEtPnZhbGlkIHx8IHNlbnNvci0+dXBkYXRlKQogCQkJCXNlbnNvci0+ZGF0YQotCQkJCSAgICA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgc2Vuc29yLT5wYWdlLAotCQkJCQkJCSAgIHNlbnNvci0+cmVnKTsKKwkJCQkgICAgPSBfcG1idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LAorCQkJCQkJCSAgICBzZW5zb3ItPnBhZ2UsCisJCQkJCQkJICAgIHNlbnNvci0+cmVnKTsKIAkJfQogCQlwbWJ1c19jbGVhcl9mYXVsdHMoY2xpZW50KTsKIAkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKQEAgLTQ0MywxNSArNDk3LDM3IEBACiAJcmV0dXJuICh2YWwgLSBiKSAvIG07CiB9CiAKKy8qCisgKiBDb252ZXJ0IFZJRCBzZW5zb3IgdmFsdWVzIHRvIG1pbGxpLSBvciBtaWNyby11bml0cworICogZGVwZW5kaW5nIG9uIHNlbnNvciB0eXBlLgorICogV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBWUjExLgorICovCitzdGF0aWMgbG9uZyBwbWJ1c19yZWcyZGF0YV92aWQoc3RydWN0IHBtYnVzX2RhdGEgKmRhdGEsCisJCQkgICAgICAgc3RydWN0IHBtYnVzX3NlbnNvciAqc2Vuc29yKQoreworCWxvbmcgdmFsID0gc2Vuc29yLT5kYXRhOworCisJaWYgKHZhbCA8IDB4MDIgfHwgdmFsID4gMHhiMikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIERJVl9ST1VORF9DTE9TRVNUKDE2MDAwMCAtICh2YWwgLSAyKSAqIDYyNSwgMTAwKTsKK30KKwogc3RhdGljIGxvbmcgcG1idXNfcmVnMmRhdGEoc3RydWN0IHBtYnVzX2RhdGEgKmRhdGEsIHN0cnVjdCBwbWJ1c19zZW5zb3IgKnNlbnNvcikKIHsKIAlsb25nIHZhbDsKIAotCWlmIChkYXRhLT5pbmZvLT5kaXJlY3Rbc2Vuc29yLT5jbGFzc10pCisJc3dpdGNoIChkYXRhLT5pbmZvLT5mb3JtYXRbc2Vuc29yLT5jbGFzc10pIHsKKwljYXNlIGRpcmVjdDoKIAkJdmFsID0gcG1idXNfcmVnMmRhdGFfZGlyZWN0KGRhdGEsIHNlbnNvcik7Ci0JZWxzZQorCQlicmVhazsKKwljYXNlIHZpZDoKKwkJdmFsID0gcG1idXNfcmVnMmRhdGFfdmlkKGRhdGEsIHNlbnNvcik7CisJCWJyZWFrOworCWNhc2UgbGluZWFyOgorCWRlZmF1bHQ6CiAJCXZhbCA9IHBtYnVzX3JlZzJkYXRhX2xpbmVhcihkYXRhLCBzZW5zb3IpOwotCisJCWJyZWFrOworCX0KIAlyZXR1cm4gdmFsOwogfQogCkBAIC01NjEsMTYgKzYzNywzMSBAQAogCXJldHVybiB2YWw7CiB9CiAKK3N0YXRpYyB1MTYgcG1idXNfZGF0YTJyZWdfdmlkKHN0cnVjdCBwbWJ1c19kYXRhICpkYXRhLAorCQkJICAgICAgZW51bSBwbWJ1c19zZW5zb3JfY2xhc3NlcyBjbGFzcywgbG9uZyB2YWwpCit7CisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIDUwMCwgMTYwMCk7CisKKwlyZXR1cm4gMiArIERJVl9ST1VORF9DTE9TRVNUKCgxNjAwIC0gdmFsKSAqIDEwMCwgNjI1KTsKK30KKwogc3RhdGljIHUxNiBwbWJ1c19kYXRhMnJlZyhzdHJ1Y3QgcG1idXNfZGF0YSAqZGF0YSwKIAkJCSAgZW51bSBwbWJ1c19zZW5zb3JfY2xhc3NlcyBjbGFzcywgbG9uZyB2YWwpCiB7CiAJdTE2IHJlZ3ZhbDsKIAotCWlmIChkYXRhLT5pbmZvLT5kaXJlY3RbY2xhc3NdKQorCXN3aXRjaCAoZGF0YS0+aW5mby0+Zm9ybWF0W2NsYXNzXSkgeworCWNhc2UgZGlyZWN0OgogCQlyZWd2YWwgPSBwbWJ1c19kYXRhMnJlZ19kaXJlY3QoZGF0YSwgY2xhc3MsIHZhbCk7Ci0JZWxzZQorCQlicmVhazsKKwljYXNlIHZpZDoKKwkJcmVndmFsID0gcG1idXNfZGF0YTJyZWdfdmlkKGRhdGEsIGNsYXNzLCB2YWwpOworCQlicmVhazsKKwljYXNlIGxpbmVhcjoKKwlkZWZhdWx0OgogCQlyZWd2YWwgPSBwbWJ1c19kYXRhMnJlZ19saW5lYXIoZGF0YSwgY2xhc3MsIHZhbCk7Ci0KKwkJYnJlYWs7CisJfQogCXJldHVybiByZWd2YWw7CiB9CiAKQEAgLTY4Miw3ICs3NzMsNyBAQAogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCXJlZ3ZhbCA9IHBtYnVzX2RhdGEycmVnKGRhdGEsIHNlbnNvci0+Y2xhc3MsIHZhbCk7Ci0JcmV0ID0gcG1idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgc2Vuc29yLT5wYWdlLCBzZW5zb3ItPnJlZywgcmVndmFsKTsKKwlyZXQgPSBfcG1idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgc2Vuc29yLT5wYWdlLCBzZW5zb3ItPnJlZywgcmVndmFsKTsKIAlpZiAocmV0IDwgMCkKIAkJcnYgPSByZXQ7CiAJZWxzZQpAQCAtODY3LDcgKzk1OCw4IEBACiAgKiBhbmQgaXRzIGFzc29jaWF0ZWQgYWxhcm0gYXR0cmlidXRlLgogICovCiBzdHJ1Y3QgcG1idXNfbGltaXRfYXR0ciB7Ci0JdTggcmVnOwkJCS8qIExpbWl0IHJlZ2lzdGVyICovCisJdTE2IHJlZzsJCS8qIExpbWl0IHJlZ2lzdGVyICovCisJYm9vbCB1cGRhdGU7CQkvKiBUcnVlIGlmIHJlZ2lzdGVyIG5lZWRzIHVwZGF0ZXMgKi8KIAljb25zdCBjaGFyICphdHRyOwkvKiBBdHRyaWJ1dGUgbmFtZSAqLwogCWNvbnN0IGNoYXIgKmFsYXJtOwkvKiBBbGFybSBhdHRyaWJ1dGUgbmFtZSAqLwogCXUzMiBzYml0OwkJLyogQWxhcm0gYXR0cmlidXRlIHN0YXR1cyBiaXQgKi8KQEAgLTkxMiw5ICsxMDA0LDEwIEBACiAJCWlmIChwbWJ1c19jaGVja193b3JkX3JlZ2lzdGVyKGNsaWVudCwgcGFnZSwgbC0+cmVnKSkgewogCQkJY2luZGV4ID0gZGF0YS0+bnVtX3NlbnNvcnM7CiAJCQlwbWJ1c19hZGRfc2Vuc29yKGRhdGEsIG5hbWUsIGwtPmF0dHIsIGluZGV4LCBwYWdlLAotCQkJCQkgbC0+cmVnLCBhdHRyLT5jbGFzcywgYXR0ci0+dXBkYXRlLAorCQkJCQkgbC0+cmVnLCBhdHRyLT5jbGFzcywKKwkJCQkJIGF0dHItPnVwZGF0ZSB8fCBsLT51cGRhdGUsCiAJCQkJCSBmYWxzZSk7Ci0JCQlpZiAoaW5mby0+ZnVuY1twYWdlXSAmIGF0dHItPnNmdW5jKSB7CisJCQlpZiAobC0+c2JpdCAmJiAoaW5mby0+ZnVuY1twYWdlXSAmIGF0dHItPnNmdW5jKSkgewogCQkJCWlmIChhdHRyLT5jb21wYXJlKSB7CiAJCQkJCXBtYnVzX2FkZF9ib29sZWFuX2NtcChkYXRhLCBuYW1lLAogCQkJCQkJbC0+YWxhcm0sIGluZGV4LApAQCAtOTUzLDkgKzEwNDYsMTEgQEAKIAkJCQkJCSAgIGluZGV4LCBwYWdlLCBjYmFzZSwgYXR0cik7CiAJCS8qCiAJCSAqIEFkZCBnZW5lcmljIGFsYXJtIGF0dHJpYnV0ZSBvbmx5IGlmIHRoZXJlIGFyZSBubyBpbmRpdmlkdWFsCi0JCSAqIGFsYXJtIGF0dHJpYnV0ZXMsIGFuZCBpZiB0aGVyZSBpcyBhIGdsb2JhbCBhbGFybSBiaXQuCisJCSAqIGFsYXJtIGF0dHJpYnV0ZXMsIGlmIHRoZXJlIGlzIGEgZ2xvYmFsIGFsYXJtIGJpdCwgYW5kIGlmCisJCSAqIHRoZSBnZW5lcmljIHN0YXR1cyByZWdpc3RlciBmb3IgdGhpcyBwYWdlIGlzIGFjY2Vzc2libGUuCiAJCSAqLwotCQlpZiAoIWhhdmVfYWxhcm0gJiYgYXR0ci0+Z2JpdCkKKwkJaWYgKCFoYXZlX2FsYXJtICYmIGF0dHItPmdiaXQgJiYKKwkJICAgIHBtYnVzX2NoZWNrX2J5dGVfcmVnaXN0ZXIoY2xpZW50LCBwYWdlLCBQTUJVU19TVEFUVVNfQllURSkpCiAJCQlwbWJ1c19hZGRfYm9vbGVhbl9yZWcoZGF0YSwgbmFtZSwgImFsYXJtIiwgaW5kZXgsCiAJCQkJCSAgICAgIFBCX1NUQVRVU19CQVNFICsgcGFnZSwKIAkJCQkJICAgICAgYXR0ci0+Z2JpdCk7CkBAIC0xMDA4LDYgKzExMDMsMjEgQEAKIAkJLmF0dHIgPSAiY3JpdCIsCiAJCS5hbGFybSA9ICJjcml0X2FsYXJtIiwKIAkJLnNiaXQgPSBQQl9WT0xUQUdFX09WX0ZBVUxULAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVBRF9WSU5fQVZHLAorCQkudXBkYXRlID0gdHJ1ZSwKKwkJLmF0dHIgPSAiYXZlcmFnZSIsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRUFEX1ZJTl9NSU4sCisJCS51cGRhdGUgPSB0cnVlLAorCQkuYXR0ciA9ICJsb3dlc3QiLAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVBRF9WSU5fTUFYLAorCQkudXBkYXRlID0gdHJ1ZSwKKwkJLmF0dHIgPSAiaGlnaGVzdCIsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRVNFVF9WSU5fSElTVE9SWSwKKwkJLmF0dHIgPSAicmVzZXRfaGlzdG9yeSIsCiAJfSwKIH07CiAKQEAgLTEwMzIsNiArMTE0MiwyMSBAQAogCQkuYXR0ciA9ICJjcml0IiwKIAkJLmFsYXJtID0gImNyaXRfYWxhcm0iLAogCQkuc2JpdCA9IFBCX1ZPTFRBR0VfT1ZfRkFVTFQsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRUFEX1ZPVVRfQVZHLAorCQkudXBkYXRlID0gdHJ1ZSwKKwkJLmF0dHIgPSAiYXZlcmFnZSIsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRUFEX1ZPVVRfTUlOLAorCQkudXBkYXRlID0gdHJ1ZSwKKwkJLmF0dHIgPSAibG93ZXN0IiwKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFQURfVk9VVF9NQVgsCisJCS51cGRhdGUgPSB0cnVlLAorCQkuYXR0ciA9ICJoaWdoZXN0IiwKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFU0VUX1ZPVVRfSElTVE9SWSwKKwkJLmF0dHIgPSAicmVzZXRfaGlzdG9yeSIsCiAJfQogfTsKIApAQCAtMTA3OCw2ICsxMjAzLDIxIEBACiAJCS5hdHRyID0gImNyaXQiLAogCQkuYWxhcm0gPSAiY3JpdF9hbGFybSIsCiAJCS5zYml0ID0gUEJfSUlOX09DX0ZBVUxULAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVBRF9JSU5fQVZHLAorCQkudXBkYXRlID0gdHJ1ZSwKKwkJLmF0dHIgPSAiYXZlcmFnZSIsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRUFEX0lJTl9NSU4sCisJCS51cGRhdGUgPSB0cnVlLAorCQkuYXR0ciA9ICJsb3dlc3QiLAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVBRF9JSU5fTUFYLAorCQkudXBkYXRlID0gdHJ1ZSwKKwkJLmF0dHIgPSAiaGlnaGVzdCIsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRVNFVF9JSU5fSElTVE9SWSwKKwkJLmF0dHIgPSAicmVzZXRfaGlzdG9yeSIsCiAJfQogfTsKIApAQCAtMTA5Nyw2ICsxMjM3LDIxIEBACiAJCS5hdHRyID0gImNyaXQiLAogCQkuYWxhcm0gPSAiY3JpdF9hbGFybSIsCiAJCS5zYml0ID0gUEJfSU9VVF9PQ19GQVVMVCwKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFQURfSU9VVF9BVkcsCisJCS51cGRhdGUgPSB0cnVlLAorCQkuYXR0ciA9ICJhdmVyYWdlIiwKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFQURfSU9VVF9NSU4sCisJCS51cGRhdGUgPSB0cnVlLAorCQkuYXR0ciA9ICJsb3dlc3QiLAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVBRF9JT1VUX01BWCwKKwkJLnVwZGF0ZSA9IHRydWUsCisJCS5hdHRyID0gImhpZ2hlc3QiLAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVTRVRfSU9VVF9ISVNUT1JZLAorCQkuYXR0ciA9ICJyZXNldF9oaXN0b3J5IiwKIAl9CiB9OwogCkBAIC0xMTMyLDYgKzEyODcsMTcgQEAKIAkJLmF0dHIgPSAibWF4IiwKIAkJLmFsYXJtID0gImFsYXJtIiwKIAkJLnNiaXQgPSBQQl9QSU5fT1BfV0FSTklORywKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFQURfUElOX0FWRywKKwkJLnVwZGF0ZSA9IHRydWUsCisJCS5hdHRyID0gImF2ZXJhZ2UiLAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVBRF9QSU5fTUFYLAorCQkudXBkYXRlID0gdHJ1ZSwKKwkJLmF0dHIgPSAiaW5wdXRfaGlnaGVzdCIsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRVNFVF9QSU5fSElTVE9SWSwKKwkJLmF0dHIgPSAicmVzZXRfaGlzdG9yeSIsCiAJfQogfTsKIApAQCAtMTIwMCw2ICsxMzY2LDM5IEBACiAJCS5hdHRyID0gImNyaXQiLAogCQkuYWxhcm0gPSAiY3JpdF9hbGFybSIsCiAJCS5zYml0ID0gUEJfVEVNUF9PVF9GQVVMVCwKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFQURfVEVNUF9NSU4sCisJCS5hdHRyID0gImxvd2VzdCIsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRUFEX1RFTVBfTUFYLAorCQkuYXR0ciA9ICJoaWdoZXN0IiwKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFU0VUX1RFTVBfSElTVE9SWSwKKwkJLmF0dHIgPSAicmVzZXRfaGlzdG9yeSIsCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbWJ1c19saW1pdF9hdHRyIHRlbXBfbGltaXRfYXR0cnMyM1tdID0geworCXsKKwkJLnJlZyA9IFBNQlVTX1VUX1dBUk5fTElNSVQsCisJCS5hdHRyID0gIm1pbiIsCisJCS5hbGFybSA9ICJtaW5fYWxhcm0iLAorCQkuc2JpdCA9IFBCX1RFTVBfVVRfV0FSTklORywKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19VVF9GQVVMVF9MSU1JVCwKKwkJLmF0dHIgPSAibGNyaXQiLAorCQkuYWxhcm0gPSAibGNyaXRfYWxhcm0iLAorCQkuc2JpdCA9IFBCX1RFTVBfVVRfRkFVTFQsCisJfSwgeworCQkucmVnID0gUE1CVVNfT1RfV0FSTl9MSU1JVCwKKwkJLmF0dHIgPSAibWF4IiwKKwkJLmFsYXJtID0gIm1heF9hbGFybSIsCisJCS5zYml0ID0gUEJfVEVNUF9PVF9XQVJOSU5HLAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX09UX0ZBVUxUX0xJTUlULAorCQkuYXR0ciA9ICJjcml0IiwKKwkJLmFsYXJtID0gImNyaXRfYWxhcm0iLAorCQkuc2JpdCA9IFBCX1RFTVBfT1RfRkFVTFQsCiAJfQogfTsKIApAQCAtMTIyNiw4ICsxNDI1LDggQEAKIAkJLnNmdW5jID0gUE1CVVNfSEFWRV9TVEFUVVNfVEVNUCwKIAkJLnNiYXNlID0gUEJfU1RBVFVTX1RFTVBfQkFTRSwKIAkJLmdiaXQgPSBQQl9TVEFUVVNfVEVNUEVSQVRVUkUsCi0JCS5saW1pdCA9IHRlbXBfbGltaXRfYXR0cnMsCi0JCS5ubGltaXQgPSBBUlJBWV9TSVpFKHRlbXBfbGltaXRfYXR0cnMpLAorCQkubGltaXQgPSB0ZW1wX2xpbWl0X2F0dHJzMjMsCisJCS5ubGltaXQgPSBBUlJBWV9TSVpFKHRlbXBfbGltaXRfYXR0cnMyMyksCiAJfSwgewogCQkucmVnID0gUE1CVVNfUkVBRF9URU1QRVJBVFVSRV8zLAogCQkuY2xhc3MgPSBQU0NfVEVNUEVSQVRVUkUsCkBAIC0xMjM4LDggKzE0MzcsOCBAQAogCQkuc2Z1bmMgPSBQTUJVU19IQVZFX1NUQVRVU19URU1QLAogCQkuc2Jhc2UgPSBQQl9TVEFUVVNfVEVNUF9CQVNFLAogCQkuZ2JpdCA9IFBCX1NUQVRVU19URU1QRVJBVFVSRSwKLQkJLmxpbWl0ID0gdGVtcF9saW1pdF9hdHRycywKLQkJLm5saW1pdCA9IEFSUkFZX1NJWkUodGVtcF9saW1pdF9hdHRycyksCisJCS5saW1pdCA9IHRlbXBfbGltaXRfYXR0cnMyMywKKwkJLm5saW1pdCA9IEFSUkFZX1NJWkUodGVtcF9saW1pdF9hdHRyczIzKSwKIAl9CiB9OwogCkBAIC0xMzgwLDcgKzE1NzksNyBAQAogCQkgKi8KIAkJc3dpdGNoICh2b3V0X21vZGUgPj4gNSkgewogCQljYXNlIDA6CS8qIGxpbmVhciBtb2RlICAgICAgKi8KLQkJCWlmIChkYXRhLT5pbmZvLT5kaXJlY3RbUFNDX1ZPTFRBR0VfT1VUXSkKKwkJCWlmIChkYXRhLT5pbmZvLT5mb3JtYXRbUFNDX1ZPTFRBR0VfT1VUXSAhPSBsaW5lYXIpCiAJCQkJcmV0dXJuIC1FTk9ERVY7CiAKIAkJCWV4cG9uZW50ID0gdm91dF9tb2RlICYgMHgxZjsKQEAgLTEzODksOCArMTU4OCwxMiBAQAogCQkJCWV4cG9uZW50IHw9IH4weDFmOwogCQkJZGF0YS0+ZXhwb25lbnQgPSBleHBvbmVudDsKIAkJCWJyZWFrOworCQljYXNlIDE6IC8qIFZJRCBtb2RlICAgICAgICAgKi8KKwkJCWlmIChkYXRhLT5pbmZvLT5mb3JtYXRbUFNDX1ZPTFRBR0VfT1VUXSAhPSB2aWQpCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlicmVhazsKIAkJY2FzZSAyOgkvKiBkaXJlY3QgbW9kZSAgICAgICovCi0JCQlpZiAoIWRhdGEtPmluZm8tPmRpcmVjdFtQU0NfVk9MVEFHRV9PVVRdKQorCQkJaWYgKGRhdGEtPmluZm8tPmZvcm1hdFtQU0NfVk9MVEFHRV9PVVRdICE9IGRpcmVjdCkKIAkJCQlyZXR1cm4gLUVOT0RFVjsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpAQCAtMTQ1NywxOCArMTY2MCw2IEBACiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0X2RhdGE7CiAJfQotCS8qCi0JICogQmFpbCBvdXQgaWYgbW9yZSB0aGFuIG9uZSBwYWdlIHdhcyBjb25maWd1cmVkLCBidXQgd2UgY2FuIG5vdAotCSAqIHNlbGVjdCB0aGUgaGlnaGVzdCBwYWdlLiBUaGlzIGlzIGFuIGluZGljYXRpb24gdGhhdCB0aGUgd3JvbmcKLQkgKiBjaGlwIHR5cGUgd2FzIHNlbGVjdGVkLiBCZXR0ZXIgYmFpbCBvdXQgbm93IHRoYW4ga2VlcAotCSAqIHJldHVybmluZyBlcnJvcnMgbGF0ZXIgb24uCi0JICovCi0JaWYgKGluZm8tPnBhZ2VzID4gMSAmJiBwbWJ1c19zZXRfcGFnZShjbGllbnQsIGluZm8tPnBhZ2VzIC0gMSkgPCAwKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIHNlbGVjdCBwYWdlICVkXG4iLAotCQkJaW5mby0+cGFnZXMgLSAxKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXRfZGF0YTsKLQl9CiAKIAlyZXQgPSBwbWJ1c19pZGVudGlmeV9jb21tb24oY2xpZW50LCBkYXRhKTsKIAlpZiAocmV0IDwgMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi91Y2Q5MDAwLmMgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL3VjZDkwMDAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9od21vbi91Y2Q5MDAwLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vcG1idXMvdWNkOTAwMC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3VjZDkyMDAuYyBiL2RyaXZlcnMvaHdtb24vcG1idXMvdWNkOTIwMC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2h3bW9uL3VjZDkyMDAuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9wbWJ1cy91Y2Q5MjAwLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2N5ODJjNjkzLmMgYi9kcml2ZXJzL2lkZS9jeTgyYzY5My5jCmluZGV4IDNiZTYwZGEuLjY3Y2JjZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2N5ODJjNjkzLmMKKysrIGIvZHJpdmVycy9pZGUvY3k4MmM2OTMuYwpAQCAtMTQxLDYgKzE0MSw4IEBACiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIENZODJfSURFX1NMQVZFX0lPVywgdGltZV8xNik7CiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIENZODJfSURFX1NMQVZFXzhCSVQsIHRpbWVfOCk7CiAJfQorCWlmIChod2lmLT5pbmRleCA+IDApCisJCXBjaV9kZXZfcHV0KGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2lvcHNfY3k4MmM2OTMoaWRlX2h3aWZfdCAqaHdpZikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZV9wbGF0Zm9ybS5jIGIvZHJpdmVycy9pZGUvaWRlX3BsYXRmb3JtLmMKaW5kZXggNTQyNjAzYi4uOTYyNjkzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlX3BsYXRmb3JtLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9hdGFfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgcGxhdF9pZGVfc2V0dXBfcG9ydHMoc3RydWN0IGlkZV9odyAqaHcsCkBAIC05NSw3ICs5NiwxMCBAQAogCXBsYXRfaWRlX3NldHVwX3BvcnRzKCZodywgYmFzZSwgYWx0X2Jhc2UsIHBkYXRhLCByZXNfaXJxLT5zdGFydCk7CiAJaHcuZGV2ID0gJnBkZXYtPmRldjsKIAotCWQuaXJxX2ZsYWdzID0gcmVzX2lycS0+ZmxhZ3M7CisJZC5pcnFfZmxhZ3MgPSByZXNfaXJxLT5mbGFncyAmIElSUUZfVFJJR0dFUl9NQVNLOworCWlmIChyZXNfaXJxLT5mbGFncyAmIElPUkVTT1VSQ0VfSVJRX1NIQVJFQUJMRSkKKwkJZC5pcnFfZmxhZ3MgfD0gSVJRRl9TSEFSRUQ7CisKIAlpZiAobW1pbykKIAkJZC5ob3N0X2ZsYWdzIHw9IElERV9IRkxBR19NTUlPOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2dwaW9fa2V5cy5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9ncGlvX2tleXMuYwppbmRleCBjZTI4MWQxLi42N2RmOTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2dwaW9fa2V5cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvZ3Bpb19rZXlzLmMKQEAgLTQ4Myw3ICs0ODMsNyBAQAogCiAJYnV0dG9ucyA9IGt6YWxsb2MocGRhdGEtPm5idXR0b25zICogKHNpemVvZiAqYnV0dG9ucyksIEdGUF9LRVJORUwpOwogCWlmICghYnV0dG9ucykKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybiAtRU5PTUVNOwogCiAJcHAgPSBOVUxMOwogCWkgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sbTgzMjMuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbG04MzIzLmMKaW5kZXggYWIwYWNhZi4uNzU2MzQ4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sbTgzMjMuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xtODMyMy5jCkBAIC03NTQsOCArNzU0LDExIEBACiAJZGV2aWNlX3JlbW92ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2Rpc2FibGVfa3ApOwogZmFpbDI6CiAJd2hpbGUgKC0tcHdtID49IDApCi0JCWlmIChsbS0+cHdtW3B3bV0uZW5hYmxlZCkKKwkJaWYgKGxtLT5wd21bcHdtXS5lbmFibGVkKSB7CisJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUobG0tPnB3bVtwd21dLmNkZXYuZGV2LAorCQkJCQkgICAmZGV2X2F0dHJfdGltZSk7CiAJCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmbG0tPnB3bVtwd21dLmNkZXYpOworCQl9CiBmYWlsMToKIAlpbnB1dF9mcmVlX2RldmljZShpZGV2KTsKIAlrZnJlZShsbSk7CkBAIC03NzUsOCArNzc4LDEwIEBACiAJZGV2aWNlX3JlbW92ZV9maWxlKCZsbS0+Y2xpZW50LT5kZXYsICZkZXZfYXR0cl9kaXNhYmxlX2twKTsKIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0JCWlmIChsbS0+cHdtW2ldLmVuYWJsZWQpCisJCWlmIChsbS0+cHdtW2ldLmVuYWJsZWQpIHsKKwkJCWRldmljZV9yZW1vdmVfZmlsZShsbS0+cHdtW2ldLmNkZXYuZGV2LCAmZGV2X2F0dHJfdGltZSk7CiAJCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmbG0tPnB3bVtpXS5jZGV2KTsKKwkJfQogCiAJa2ZyZWUobG0pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3RlZ3JhLWtiYy5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90ZWdyYS1rYmMuYwppbmRleCBkYTM4MjhmLi5mMjcwNDQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3RlZ3JhLWtiYy5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdGVncmEta2JjLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KICAqLwogCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTM3LDcgKzM4LDcgQEAKICNkZWZpbmUgS0JDX1JPV19TQ0FOX0RMWQk1CiAKIC8qIEtCQyB1c2VzIGEgMzJLSHogY2xvY2sgc28gYSBjeWNsZSA9IDEvMzJLaHogKi8KLSNkZWZpbmUgS0JDX0NZQ0xFX1VTRUMJMzIKKyNkZWZpbmUgS0JDX0NZQ0xFX01TCTMyCiAKIC8qIEtCQyBSZWdpc3RlcnMgKi8KIApAQCAtNjQ3LDcgKzY0OCw3IEBACiAJZGVib3VuY2VfY250ID0gbWluKHBkYXRhLT5kZWJvdW5jZV9jbnQsIEtCQ19NQVhfREVCT1VOQ0VfQ05UKTsKIAlzY2FuX3RpbWVfcm93cyA9IChLQkNfUk9XX1NDQU5fVElNRSArIGRlYm91bmNlX2NudCkgKiBudW1fcm93czsKIAlrYmMtPnJlcG9sbF9kbHkgPSBLQkNfUk9XX1NDQU5fRExZICsgc2Nhbl90aW1lX3Jvd3MgKyBwZGF0YS0+cmVwZWF0X2NudDsKLQlrYmMtPnJlcG9sbF9kbHkgPSAoKGtiYy0+cmVwb2xsX2RseSAqIEtCQ19DWUNMRV9VU0VDKSArIDk5OSkgLyAxMDAwOworCWtiYy0+cmVwb2xsX2RseSA9IERJVl9ST1VORF9VUChrYmMtPnJlcG9sbF9kbHksIEtCQ19DWUNMRV9NUyk7CiAKIAlpbnB1dF9kZXYtPm5hbWUgPSBwZGV2LT5uYW1lOwogCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2t4dGo5LmMgYi9kcml2ZXJzL2lucHV0L21pc2Mva3h0ajkuYwppbmRleCBjNDU2ZjYzLi43ODM1OTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2Mva3h0ajkuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2Mva3h0ajkuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0L2t4dGo5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQtcG9sbGRldi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL21tYTg0NTAuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9tbWE4NDUwLmMKaW5kZXggMjBmOGY5Mi4uNmM3NmNmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL21tYTg0NTAuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvbW1hODQ1MC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC1wb2xsZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAKICNkZWZpbmUgTU1BODQ1MF9EUlZfTkFNRQkibW1hODQ1MCIKIApAQCAtMjI5LDEwICsyMzAsMTcgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbW1hODQ1MF9pZCk7CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1tYTg0NTBfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbW1hODQ1MCIsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG1tYTg0NTBfZHRfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1tYTg0NTBfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gTU1BODQ1MF9EUlZfTkFNRSwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG1tYTg0NTBfZHRfaWRzLAogCX0sCiAJLnByb2JlCQk9IG1tYTg0NTBfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtbWE4NDUwX3JlbW92ZSksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2hncGsuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvaGdway5jCmluZGV4IDk1NTc3YzEuLjRkMTdkOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvaGdway5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvaGdway5jCkBAIC0zMiw2ICszMiw3IEBACiAjZGVmaW5lIERFQlVHCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaW8uaD4KICNpbmNsdWRlIDxsaW51eC9saWJwczIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby94aWxpbnhfcHMyLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3hpbGlueF9wczIuYwppbmRleCA4MGJhYTUzLi5kNjRjNWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL3hpbGlueF9wczIuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3hpbGlueF9wczIuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLQorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3OS5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzkuYwppbmRleCBiYzNiNTE4Li4xMzFmOWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3OS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWQ3ODc5LmMKQEAgLTI0OSwxMiArMjQ5LDE0IEBACiAKIHN0YXRpYyB2b2lkIF9fYWQ3ODc5X2Rpc2FibGUoc3RydWN0IGFkNzg3OSAqdHMpCiB7CisJdTE2IHJlZyA9ICh0cy0+Y21kX2NydGwyICYgfkFENzg3OV9QTSgtMSkpIHwKKwkJQUQ3ODc5X1BNKEFENzg3OV9QTV9TSFVURE9XTik7CiAJZGlzYWJsZV9pcnEodHMtPmlycSk7CiAKIAlpZiAoZGVsX3RpbWVyX3N5bmMoJnRzLT50aW1lcikpCiAJCWFkNzg3OV90c19ldmVudF9yZWxlYXNlKHRzKTsKIAotCWFkNzg3OV93cml0ZSh0cywgQUQ3ODc5X1JFR19DVFJMMiwgQUQ3ODc5X1BNKEFENzg3OV9QTV9TSFVURE9XTikpOworCWFkNzg3OV93cml0ZSh0cywgQUQ3ODc5X1JFR19DVFJMMiwgcmVnKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL0tjb25maWcgYi9kcml2ZXJzL21kL0tjb25maWcKaW5kZXggODQyMDEyOS4uZjc1YTY2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWQvS2NvbmZpZwpAQCAtMjQxLDEyICsyNDEsMTMgQEAKICAgICAgICAgIG5lZWRlZCBmb3IgbGl2ZSBkYXRhIG1pZ3JhdGlvbiB0b29scyBzdWNoIGFzICdwdm1vdmUnLgogCiBjb25maWcgRE1fUkFJRAotICAgICAgIHRyaXN0YXRlICJSQUlEIDQvNS82IHRhcmdldCAoRVhQRVJJTUVOVEFMKSIKKyAgICAgICB0cmlzdGF0ZSAiUkFJRCAxLzQvNS82IHRhcmdldCAoRVhQRVJJTUVOVEFMKSIKICAgICAgICBkZXBlbmRzIG9uIEJMS19ERVZfRE0gJiYgRVhQRVJJTUVOVEFMCisgICAgICAgc2VsZWN0IE1EX1JBSUQxCiAgICAgICAgc2VsZWN0IE1EX1JBSUQ0NTYKICAgICAgICBzZWxlY3QgQkxLX0RFVl9NRAogICAgICAgIC0tLWhlbHAtLS0KLQkgQSBkbSB0YXJnZXQgdGhhdCBzdXBwb3J0cyBSQUlENCwgUkFJRDUgYW5kIFJBSUQ2IG1hcHBpbmdzCisJIEEgZG0gdGFyZ2V0IHRoYXQgc3VwcG9ydHMgUkFJRDEsIFJBSUQ0LCBSQUlENSBhbmQgUkFJRDYgbWFwcGluZ3MKIAogCSBBIFJBSUQtNSBzZXQgb2YgTiBkcml2ZXMgd2l0aCBhIGNhcGFjaXR5IG9mIEMgTUIgcGVyIGRyaXZlIHByb3ZpZGVzCiAJIHRoZSBjYXBhY2l0eSBvZiBDICogKE4gLSAxKSBNQiwgYW5kIHByb3RlY3RzIGFnYWluc3QgYSBmYWlsdXJlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWNyeXB0LmMgYi9kcml2ZXJzL21kL2RtLWNyeXB0LmMKaW5kZXggYmFlNmM0ZS4uNDlkYTU1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1jcnlwdC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tY3J5cHQuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KIAogI2RlZmluZSBETV9NU0dfUFJFRklYICJjcnlwdCIKLSNkZWZpbmUgTUVTR19TVFIoeCkgeCwgc2l6ZW9mKHgpCiAKIC8qCiAgKiBjb250ZXh0IGhvbGRpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBtdWx0aS1wYXJ0IGNvbnZlcnNpb24KQEAgLTIzOSw3ICsyMzgsNyBAQAogCQkJICAgICAgc3RydWN0IGRtX2NyeXB0X3JlcXVlc3QgKmRtcmVxKQogewogCW1lbXNldChpdiwgMCwgY2MtPml2X3NpemUpOwotCSoodTMyICopaXYgPSBjcHVfdG9fbGUzMihkbXJlcS0+aXZfc2VjdG9yICYgMHhmZmZmZmZmZik7CisJKihfX2xlMzIgKilpdiA9IGNwdV90b19sZTMyKGRtcmVxLT5pdl9zZWN0b3IgJiAweGZmZmZmZmZmKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjQ4LDcgKzI0Nyw3IEBACiAJCQkJc3RydWN0IGRtX2NyeXB0X3JlcXVlc3QgKmRtcmVxKQogewogCW1lbXNldChpdiwgMCwgY2MtPml2X3NpemUpOwotCSoodTY0ICopaXYgPSBjcHVfdG9fbGU2NChkbXJlcS0+aXZfc2VjdG9yKTsKKwkqKF9fbGU2NCAqKWl2ID0gY3B1X3RvX2xlNjQoZG1yZXEtPml2X3NlY3Rvcik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQxNSw3ICs0MTQsNyBAQAogCXN0cnVjdCBjcnlwdG9fY2lwaGVyICplc3Npdl90Zm0gPSB0aGlzX2NyeXB0X2NvbmZpZyhjYyktPml2X3ByaXZhdGU7CiAKIAltZW1zZXQoaXYsIDAsIGNjLT5pdl9zaXplKTsKLQkqKHU2NCAqKWl2ID0gY3B1X3RvX2xlNjQoZG1yZXEtPml2X3NlY3Rvcik7CisJKihfX2xlNjQgKilpdiA9IGNwdV90b19sZTY0KGRtcmVxLT5pdl9zZWN0b3IpOwogCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUoZXNzaXZfdGZtLCBpdiwgaXYpOwogCiAJcmV0dXJuIDA7CkBAIC0xNTc1LDExICsxNTc0LDE3IEBACiBzdGF0aWMgaW50IGNyeXB0X2N0cihzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgdW5zaWduZWQgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogCXN0cnVjdCBjcnlwdF9jb25maWcgKmNjOwotCXVuc2lnbmVkIGludCBrZXlfc2l6ZTsKKwl1bnNpZ25lZCBpbnQga2V5X3NpemUsIG9wdF9wYXJhbXM7CiAJdW5zaWduZWQgbG9uZyBsb25nIHRtcGxsOwogCWludCByZXQ7CisJc3RydWN0IGRtX2FyZ19zZXQgYXM7CisJY29uc3QgY2hhciAqb3B0X3N0cmluZzsKIAotCWlmIChhcmdjICE9IDUpIHsKKwlzdGF0aWMgc3RydWN0IGRtX2FyZyBfYXJnc1tdID0geworCQl7MCwgMSwgIkludmFsaWQgbnVtYmVyIG9mIGZlYXR1cmUgYXJncyJ9LAorCX07CisKKwlpZiAoYXJnYyA8IDUpIHsKIAkJdGktPmVycm9yID0gIk5vdCBlbm91Z2ggYXJndW1lbnRzIjsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTY0OCw2ICsxNjUzLDMwIEBACiAJfQogCWNjLT5zdGFydCA9IHRtcGxsOwogCisJYXJndiArPSA1OworCWFyZ2MgLT0gNTsKKworCS8qIE9wdGlvbmFsIHBhcmFtZXRlcnMgKi8KKwlpZiAoYXJnYykgeworCQlhcy5hcmdjID0gYXJnYzsKKwkJYXMuYXJndiA9IGFyZ3Y7CisKKwkJcmV0ID0gZG1fcmVhZF9hcmdfZ3JvdXAoX2FyZ3MsICZhcywgJm9wdF9wYXJhbXMsICZ0aS0+ZXJyb3IpOworCQlpZiAocmV0KQorCQkJZ290byBiYWQ7CisKKwkJb3B0X3N0cmluZyA9IGRtX3NoaWZ0X2FyZygmYXMpOworCisJCWlmIChvcHRfcGFyYW1zID09IDEgJiYgb3B0X3N0cmluZyAmJgorCQkgICAgIXN0cmNhc2VjbXAob3B0X3N0cmluZywgImFsbG93X2Rpc2NhcmRzIikpCisJCQl0aS0+bnVtX2Rpc2NhcmRfcmVxdWVzdHMgPSAxOworCQllbHNlIGlmIChvcHRfcGFyYW1zKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJdGktPmVycm9yID0gIkludmFsaWQgZmVhdHVyZSBhcmd1bWVudHMiOworCQkJZ290byBiYWQ7CisJCX0KKwl9CisKIAlyZXQgPSAtRU5PTUVNOwogCWNjLT5pb19xdWV1ZSA9IGFsbG9jX3dvcmtxdWV1ZSgia2NyeXB0ZF9pbyIsCiAJCQkJICAgICAgIFdRX05PTl9SRUVOVFJBTlR8CkBAIC0xNjgyLDkgKzE3MTEsMTYgQEAKIAlzdHJ1Y3QgZG1fY3J5cHRfaW8gKmlvOwogCXN0cnVjdCBjcnlwdF9jb25maWcgKmNjOwogCi0JaWYgKGJpby0+YmlfcncgJiBSRVFfRkxVU0gpIHsKKwkvKgorCSAqIElmIGJpbyBpcyBSRVFfRkxVU0ggb3IgUkVRX0RJU0NBUkQsIGp1c3QgYnlwYXNzIGNyeXB0IHF1ZXVlcy4KKwkgKiAtIGZvciBSRVFfRkxVU0ggZGV2aWNlLW1hcHBlciBjb3JlIGVuc3VyZXMgdGhhdCBubyBJTyBpcyBpbi1mbGlnaHQKKwkgKiAtIGZvciBSRVFfRElTQ0FSRCBjYWxsZXIgbXVzdCB1c2UgZmx1c2ggaWYgSU8gb3JkZXJpbmcgbWF0dGVycworCSAqLworCWlmICh1bmxpa2VseShiaW8tPmJpX3J3ICYgKFJFUV9GTFVTSCB8IFJFUV9ESVNDQVJEKSkpIHsKIAkJY2MgPSB0aS0+cHJpdmF0ZTsKIAkJYmlvLT5iaV9iZGV2ID0gY2MtPmRldi0+YmRldjsKKwkJaWYgKGJpb19zZWN0b3JzKGJpbykpCisJCQliaW8tPmJpX3NlY3RvciA9IGNjLT5zdGFydCArIGRtX3RhcmdldF9vZmZzZXQodGksIGJpby0+Ymlfc2VjdG9yKTsKIAkJcmV0dXJuIERNX01BUElPX1JFTUFQUEVEOwogCX0KIApAQCAtMTcyNyw2ICsxNzYzLDEwIEBACiAKIAkJRE1FTUlUKCIgJWxsdSAlcyAlbGx1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZyljYy0+aXZfb2Zmc2V0LAogCQkJCWNjLT5kZXYtPm5hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcpY2MtPnN0YXJ0KTsKKworCQlpZiAodGktPm51bV9kaXNjYXJkX3JlcXVlc3RzKQorCQkJRE1FTUlUKCIgMSBhbGxvd19kaXNjYXJkcyIpOworCiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gMDsKQEAgLTE3NzAsMTIgKzE4MTAsMTIgQEAKIAlpZiAoYXJnYyA8IDIpCiAJCWdvdG8gZXJyb3I7CiAKLQlpZiAoIXN0cm5pY21wKGFyZ3ZbMF0sIE1FU0dfU1RSKCJrZXkiKSkpIHsKKwlpZiAoIXN0cmNhc2VjbXAoYXJndlswXSwgImtleSIpKSB7CiAJCWlmICghdGVzdF9iaXQoRE1fQ1JZUFRfU1VTUEVOREVELCAmY2MtPmZsYWdzKSkgewogCQkJRE1XQVJOKCJub3Qgc3VzcGVuZGVkIGR1cmluZyBrZXkgbWFuaXB1bGF0aW9uLiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJaWYgKGFyZ2MgPT0gMyAmJiAhc3RybmljbXAoYXJndlsxXSwgTUVTR19TVFIoInNldCIpKSkgeworCQlpZiAoYXJnYyA9PSAzICYmICFzdHJjYXNlY21wKGFyZ3ZbMV0sICJzZXQiKSkgewogCQkJcmV0ID0gY3J5cHRfc2V0X2tleShjYywgYXJndlsyXSk7CiAJCQlpZiAocmV0KQogCQkJCXJldHVybiByZXQ7CkBAIC0xNzgzLDcgKzE4MjMsNyBAQAogCQkJCXJldCA9IGNjLT5pdl9nZW5fb3BzLT5pbml0KGNjKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KLQkJaWYgKGFyZ2MgPT0gMiAmJiAhc3RybmljbXAoYXJndlsxXSwgTUVTR19TVFIoIndpcGUiKSkpIHsKKwkJaWYgKGFyZ2MgPT0gMiAmJiAhc3RyY2FzZWNtcChhcmd2WzFdLCAid2lwZSIpKSB7CiAJCQlpZiAoY2MtPml2X2dlbl9vcHMgJiYgY2MtPml2X2dlbl9vcHMtPndpcGUpIHsKIAkJCQlyZXQgPSBjYy0+aXZfZ2VuX29wcy0+d2lwZShjYyk7CiAJCQkJaWYgKHJldCkKQEAgLTE4MjMsNyArMTg2Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdGFyZ2V0X3R5cGUgY3J5cHRfdGFyZ2V0ID0gewogCS5uYW1lICAgPSAiY3J5cHQiLAotCS52ZXJzaW9uID0gezEsIDEwLCAwfSwKKwkudmVyc2lvbiA9IHsxLCAxMSwgMH0sCiAJLm1vZHVsZSA9IFRISVNfTU9EVUxFLAogCS5jdHIgICAgPSBjcnlwdF9jdHIsCiAJLmR0ciAgICA9IGNyeXB0X2R0ciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tZmxha2V5LmMgYi9kcml2ZXJzL21kL2RtLWZsYWtleS5jCmluZGV4IGVhNzkwNjIuLjg5ZjczY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tZmxha2V5LmMKKysrIGIvZHJpdmVycy9tZC9kbS1mbGFrZXkuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMgU2lzdGluYSBTb2Z0d2FyZSAoVUspIExpbWl0ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMTAgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDEwLTIwMTEgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgogICovCkBAIC0xNSw2ICsxNSw5IEBACiAKICNkZWZpbmUgRE1fTVNHX1BSRUZJWCAiZmxha2V5IgogCisjZGVmaW5lIGFsbF9jb3JydXB0X2Jpb19mbGFnc19tYXRjaChiaW8sIGZjKQlcCisJKCgoYmlvKS0+YmlfcncgJiAoZmMpLT5jb3JydXB0X2Jpb19mbGFncykgPT0gKGZjKS0+Y29ycnVwdF9iaW9fZmxhZ3MpCisKIC8qCiAgKiBGbGFrZXk6IFVzZWQgZm9yIHRlc3Rpbmcgb25seSwgc2ltdWxhdGVzIGludGVybWl0dGVudCwKICAqIGNhdGFzdHJvcGhpYyBkZXZpY2UgZmFpbHVyZS4KQEAgLTI1LDYwICsyOCwxODkgQEAKIAlzZWN0b3JfdCBzdGFydDsKIAl1bnNpZ25lZCB1cF9pbnRlcnZhbDsKIAl1bnNpZ25lZCBkb3duX2ludGVydmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY29ycnVwdF9iaW9fYnl0ZTsKKwl1bnNpZ25lZCBjb3JydXB0X2Jpb19ydzsKKwl1bnNpZ25lZCBjb3JydXB0X2Jpb192YWx1ZTsKKwl1bnNpZ25lZCBjb3JydXB0X2Jpb19mbGFnczsKIH07CiAKLS8qCi0gKiBDb25zdHJ1Y3QgYSBmbGFrZXkgbWFwcGluZzogPGRldl9wYXRoPiA8b2Zmc2V0PiA8dXAgaW50ZXJ2YWw+IDxkb3duIGludGVydmFsPgotICovCi1zdGF0aWMgaW50IGZsYWtleV9jdHIoc3RydWN0IGRtX3RhcmdldCAqdGksIHVuc2lnbmVkIGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLQlzdHJ1Y3QgZmxha2V5X2MgKmZjOwotCXVuc2lnbmVkIGxvbmcgbG9uZyB0bXA7CitlbnVtIGZlYXR1cmVfZmxhZ19iaXRzIHsKKwlEUk9QX1dSSVRFUworfTsKIAotCWlmIChhcmdjICE9IDQpIHsKLQkJdGktPmVycm9yID0gImRtLWZsYWtleTogSW52YWxpZCBhcmd1bWVudCBjb3VudCI7CitzdGF0aWMgaW50IHBhcnNlX2ZlYXR1cmVzKHN0cnVjdCBkbV9hcmdfc2V0ICphcywgc3RydWN0IGZsYWtleV9jICpmYywKKwkJCSAgc3RydWN0IGRtX3RhcmdldCAqdGkpCit7CisJaW50IHI7CisJdW5zaWduZWQgYXJnYzsKKwljb25zdCBjaGFyICphcmdfbmFtZTsKKworCXN0YXRpYyBzdHJ1Y3QgZG1fYXJnIF9hcmdzW10gPSB7CisJCXswLCA2LCAiSW52YWxpZCBudW1iZXIgb2YgZmVhdHVyZSBhcmdzIn0sCisJCXsxLCBVSU5UX01BWCwgIkludmFsaWQgY29ycnVwdCBiaW8gYnl0ZSJ9LAorCQl7MCwgMjU1LCAiSW52YWxpZCBjb3JydXB0IHZhbHVlIHRvIHdyaXRlIGludG8gYmlvIGJ5dGUgKDAtMjU1KSJ9LAorCQl7MCwgVUlOVF9NQVgsICJJbnZhbGlkIGNvcnJ1cHQgYmlvIGZsYWdzIG1hc2sifSwKKwl9OworCisJLyogTm8gZmVhdHVyZSBhcmd1bWVudHMgc3VwcGxpZWQuICovCisJaWYgKCFhcy0+YXJnYykKKwkJcmV0dXJuIDA7CisKKwlyID0gZG1fcmVhZF9hcmdfZ3JvdXAoX2FyZ3MsIGFzLCAmYXJnYywgJnRpLT5lcnJvcik7CisJaWYgKHIpCisJCXJldHVybiByOworCisJd2hpbGUgKGFyZ2MpIHsKKwkJYXJnX25hbWUgPSBkbV9zaGlmdF9hcmcoYXMpOworCQlhcmdjLS07CisKKwkJLyoKKwkJICogZHJvcF93cml0ZXMKKwkJICovCisJCWlmICghc3RyY2FzZWNtcChhcmdfbmFtZSwgImRyb3Bfd3JpdGVzIikpIHsKKwkJCWlmICh0ZXN0X2FuZF9zZXRfYml0KERST1BfV1JJVEVTLCAmZmMtPmZsYWdzKSkgeworCQkJCXRpLT5lcnJvciA9ICJGZWF0dXJlIGRyb3Bfd3JpdGVzIGR1cGxpY2F0ZWQiOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIGNvcnJ1cHRfYmlvX2J5dGUgPE50aF9ieXRlPiA8ZGlyZWN0aW9uPiA8dmFsdWU+IDxiaW9fZmxhZ3M+CisJCSAqLworCQlpZiAoIXN0cmNhc2VjbXAoYXJnX25hbWUsICJjb3JydXB0X2Jpb19ieXRlIikpIHsKKwkJCWlmICghYXJnYykKKwkJCQl0aS0+ZXJyb3IgPSAiRmVhdHVyZSBjb3JydXB0X2Jpb19ieXRlIHJlcXVpcmVzIHBhcmFtZXRlcnMiOworCisJCQlyID0gZG1fcmVhZF9hcmcoX2FyZ3MgKyAxLCBhcywgJmZjLT5jb3JydXB0X2Jpb19ieXRlLCAmdGktPmVycm9yKTsKKwkJCWlmIChyKQorCQkJCXJldHVybiByOworCQkJYXJnYy0tOworCisJCQkvKgorCQkJICogRGlyZWN0aW9uIHIgb3Igdz8KKwkJCSAqLworCQkJYXJnX25hbWUgPSBkbV9zaGlmdF9hcmcoYXMpOworCQkJaWYgKCFzdHJjYXNlY21wKGFyZ19uYW1lLCAidyIpKQorCQkJCWZjLT5jb3JydXB0X2Jpb19ydyA9IFdSSVRFOworCQkJZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnX25hbWUsICJyIikpCisJCQkJZmMtPmNvcnJ1cHRfYmlvX3J3ID0gUkVBRDsKKwkJCWVsc2UgeworCQkJCXRpLT5lcnJvciA9ICJJbnZhbGlkIGNvcnJ1cHQgYmlvIGRpcmVjdGlvbiAociBvciB3KSI7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlhcmdjLS07CisKKwkJCS8qCisJCQkgKiBWYWx1ZSBvZiBieXRlICgwLTI1NSkgdG8gd3JpdGUgaW4gcGxhY2Ugb2YgY29ycmVjdCBvbmUuCisJCQkgKi8KKwkJCXIgPSBkbV9yZWFkX2FyZyhfYXJncyArIDIsIGFzLCAmZmMtPmNvcnJ1cHRfYmlvX3ZhbHVlLCAmdGktPmVycm9yKTsKKwkJCWlmIChyKQorCQkJCXJldHVybiByOworCQkJYXJnYy0tOworCisJCQkvKgorCQkJICogT25seSBjb3JydXB0IGJpb3Mgd2l0aCB0aGVzZSBmbGFncyBzZXQuCisJCQkgKi8KKwkJCXIgPSBkbV9yZWFkX2FyZyhfYXJncyArIDMsIGFzLCAmZmMtPmNvcnJ1cHRfYmlvX2ZsYWdzLCAmdGktPmVycm9yKTsKKwkJCWlmIChyKQorCQkJCXJldHVybiByOworCQkJYXJnYy0tOworCisJCQljb250aW51ZTsKKwkJfQorCisJCXRpLT5lcnJvciA9ICJVbnJlY29nbmlzZWQgZmxha2V5IGZlYXR1cmUgcmVxdWVzdGVkIjsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZmMgPSBrbWFsbG9jKHNpemVvZigqZmMpLCBHRlBfS0VSTkVMKTsKKwlpZiAodGVzdF9iaXQoRFJPUF9XUklURVMsICZmYy0+ZmxhZ3MpICYmIChmYy0+Y29ycnVwdF9iaW9fcncgPT0gV1JJVEUpKSB7CisJCXRpLT5lcnJvciA9ICJkcm9wX3dyaXRlcyBpcyBpbmNvbXBhdGlibGUgd2l0aCBjb3JydXB0X2Jpb19ieXRlIHdpdGggdGhlIFdSSVRFIGZsYWcgc2V0IjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb25zdHJ1Y3QgYSBmbGFrZXkgbWFwcGluZzoKKyAqIDxkZXZfcGF0aD4gPG9mZnNldD4gPHVwIGludGVydmFsPiA8ZG93biBpbnRlcnZhbD4gWzwjZmVhdHVyZSBhcmdzPiBbPGFyZz5dKl0KKyAqCisgKiAgIEZlYXR1cmUgYXJnczoKKyAqICAgICBbZHJvcF93cml0ZXNdCisgKiAgICAgW2NvcnJ1cHRfYmlvX2J5dGUgPE50aF9ieXRlPiA8ZGlyZWN0aW9uPiA8dmFsdWU+IDxiaW9fZmxhZ3M+XQorICoKKyAqICAgTnRoX2J5dGUgc3RhcnRzIGZyb20gMSBmb3IgdGhlIGZpcnN0IGJ5dGUuCisgKiAgIERpcmVjdGlvbiBpcyByIGZvciBSRUFEIG9yIHcgZm9yIFdSSVRFLgorICogICBiaW9fZmxhZ3MgaXMgaWdub3JlZCBpZiAwLgorICovCitzdGF0aWMgaW50IGZsYWtleV9jdHIoc3RydWN0IGRtX3RhcmdldCAqdGksIHVuc2lnbmVkIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgc3RydWN0IGRtX2FyZyBfYXJnc1tdID0geworCQl7MCwgVUlOVF9NQVgsICJJbnZhbGlkIHVwIGludGVydmFsIn0sCisJCXswLCBVSU5UX01BWCwgIkludmFsaWQgZG93biBpbnRlcnZhbCJ9LAorCX07CisKKwlpbnQgcjsKKwlzdHJ1Y3QgZmxha2V5X2MgKmZjOworCXVuc2lnbmVkIGxvbmcgbG9uZyB0bXBsbDsKKwlzdHJ1Y3QgZG1fYXJnX3NldCBhczsKKwljb25zdCBjaGFyICpkZXZuYW1lOworCisJYXMuYXJnYyA9IGFyZ2M7CisJYXMuYXJndiA9IGFyZ3Y7CisKKwlpZiAoYXJnYyA8IDQpIHsKKwkJdGktPmVycm9yID0gIkludmFsaWQgYXJndW1lbnQgY291bnQiOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmYyA9IGt6YWxsb2Moc2l6ZW9mKCpmYyksIEdGUF9LRVJORUwpOwogCWlmICghZmMpIHsKLQkJdGktPmVycm9yID0gImRtLWZsYWtleTogQ2Fubm90IGFsbG9jYXRlIGxpbmVhciBjb250ZXh0IjsKKwkJdGktPmVycm9yID0gIkNhbm5vdCBhbGxvY2F0ZSBsaW5lYXIgY29udGV4dCI7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlmYy0+c3RhcnRfdGltZSA9IGppZmZpZXM7CiAKLQlpZiAoc3NjYW5mKGFyZ3ZbMV0sICIlbGx1IiwgJnRtcCkgIT0gMSkgewotCQl0aS0+ZXJyb3IgPSAiZG0tZmxha2V5OiBJbnZhbGlkIGRldmljZSBzZWN0b3IiOwotCQlnb3RvIGJhZDsKLQl9Ci0JZmMtPnN0YXJ0ID0gdG1wOworCWRldm5hbWUgPSBkbV9zaGlmdF9hcmcoJmFzKTsKIAotCWlmIChzc2NhbmYoYXJndlsyXSwgIiV1IiwgJmZjLT51cF9pbnRlcnZhbCkgIT0gMSkgewotCQl0aS0+ZXJyb3IgPSAiZG0tZmxha2V5OiBJbnZhbGlkIHVwIGludGVydmFsIjsKKwlpZiAoc3NjYW5mKGRtX3NoaWZ0X2FyZygmYXMpLCAiJWxsdSIsICZ0bXBsbCkgIT0gMSkgeworCQl0aS0+ZXJyb3IgPSAiSW52YWxpZCBkZXZpY2Ugc2VjdG9yIjsKIAkJZ290byBiYWQ7CiAJfQorCWZjLT5zdGFydCA9IHRtcGxsOwogCi0JaWYgKHNzY2FuZihhcmd2WzNdLCAiJXUiLCAmZmMtPmRvd25faW50ZXJ2YWwpICE9IDEpIHsKLQkJdGktPmVycm9yID0gImRtLWZsYWtleTogSW52YWxpZCBkb3duIGludGVydmFsIjsKKwlyID0gZG1fcmVhZF9hcmcoX2FyZ3MsICZhcywgJmZjLT51cF9pbnRlcnZhbCwgJnRpLT5lcnJvcik7CisJaWYgKHIpCiAJCWdvdG8gYmFkOwotCX0KKworCXIgPSBkbV9yZWFkX2FyZyhfYXJncywgJmFzLCAmZmMtPmRvd25faW50ZXJ2YWwsICZ0aS0+ZXJyb3IpOworCWlmIChyKQorCQlnb3RvIGJhZDsKIAogCWlmICghKGZjLT51cF9pbnRlcnZhbCArIGZjLT5kb3duX2ludGVydmFsKSkgewotCQl0aS0+ZXJyb3IgPSAiZG0tZmxha2V5OiBUb3RhbCAodXAgKyBkb3duKSBpbnRlcnZhbCBpcyB6ZXJvIjsKKwkJdGktPmVycm9yID0gIlRvdGFsICh1cCArIGRvd24pIGludGVydmFsIGlzIHplcm8iOwogCQlnb3RvIGJhZDsKIAl9CiAKIAlpZiAoZmMtPnVwX2ludGVydmFsICsgZmMtPmRvd25faW50ZXJ2YWwgPCBmYy0+dXBfaW50ZXJ2YWwpIHsKLQkJdGktPmVycm9yID0gImRtLWZsYWtleTogSW50ZXJ2YWwgb3ZlcmZsb3ciOworCQl0aS0+ZXJyb3IgPSAiSW50ZXJ2YWwgb3ZlcmZsb3ciOwogCQlnb3RvIGJhZDsKIAl9CiAKLQlpZiAoZG1fZ2V0X2RldmljZSh0aSwgYXJndlswXSwgZG1fdGFibGVfZ2V0X21vZGUodGktPnRhYmxlKSwgJmZjLT5kZXYpKSB7Ci0JCXRpLT5lcnJvciA9ICJkbS1mbGFrZXk6IERldmljZSBsb29rdXAgZmFpbGVkIjsKKwlyID0gcGFyc2VfZmVhdHVyZXMoJmFzLCBmYywgdGkpOworCWlmIChyKQorCQlnb3RvIGJhZDsKKworCWlmIChkbV9nZXRfZGV2aWNlKHRpLCBkZXZuYW1lLCBkbV90YWJsZV9nZXRfbW9kZSh0aS0+dGFibGUpLCAmZmMtPmRldikpIHsKKwkJdGktPmVycm9yID0gIkRldmljZSBsb29rdXAgZmFpbGVkIjsKIAkJZ290byBiYWQ7CiAJfQogCiAJdGktPm51bV9mbHVzaF9yZXF1ZXN0cyA9IDE7CisJdGktPm51bV9kaXNjYXJkX3JlcXVlc3RzID0gMTsKIAl0aS0+cHJpdmF0ZSA9IGZjOwogCXJldHVybiAwOwogCkBAIC05OSw3ICsyMzEsNyBAQAogewogCXN0cnVjdCBmbGFrZXlfYyAqZmMgPSB0aS0+cHJpdmF0ZTsKIAotCXJldHVybiBmYy0+c3RhcnQgKyAoYmlfc2VjdG9yIC0gdGktPmJlZ2luKTsKKwlyZXR1cm4gZmMtPnN0YXJ0ICsgZG1fdGFyZ2V0X29mZnNldCh0aSwgYmlfc2VjdG9yKTsKIH0KIAogc3RhdGljIHZvaWQgZmxha2V5X21hcF9iaW8oc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBiaW8gKmJpbykKQEAgLTExMSw2ICsyNDMsMjUgQEAKIAkJYmlvLT5iaV9zZWN0b3IgPSBmbGFrZXlfbWFwX3NlY3Rvcih0aSwgYmlvLT5iaV9zZWN0b3IpOwogfQogCitzdGF0aWMgdm9pZCBjb3JydXB0X2Jpb19kYXRhKHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGZsYWtleV9jICpmYykKK3sKKwl1bnNpZ25lZCBiaW9fYnl0ZXMgPSBiaW9fY3VyX2J5dGVzKGJpbyk7CisJY2hhciAqZGF0YSA9IGJpb19kYXRhKGJpbyk7CisKKwkvKgorCSAqIE92ZXJ3cml0ZSB0aGUgTnRoIGJ5dGUgb2YgdGhlIGRhdGEgcmV0dXJuZWQuCisJICovCisJaWYgKGRhdGEgJiYgYmlvX2J5dGVzID49IGZjLT5jb3JydXB0X2Jpb19ieXRlKSB7CisJCWRhdGFbZmMtPmNvcnJ1cHRfYmlvX2J5dGUgLSAxXSA9IGZjLT5jb3JydXB0X2Jpb192YWx1ZTsKKworCQlETURFQlVHKCJDb3JydXB0aW5nIGRhdGEgYmlvPSVwIGJ5IHdyaXRpbmcgJXUgdG8gYnl0ZSAldSAiCisJCQkiKHJ3PSVjIGJpX3J3PSVsdSBiaV9zZWN0b3I9JWxsdSBjdXJfYnl0ZXM9JXUpXG4iLAorCQkJYmlvLCBmYy0+Y29ycnVwdF9iaW9fdmFsdWUsIGZjLT5jb3JydXB0X2Jpb19ieXRlLAorCQkJKGJpb19kYXRhX2RpcihiaW8pID09IFdSSVRFKSA/ICd3JyA6ICdyJywKKwkJCWJpby0+YmlfcncsICh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9zZWN0b3IsIGJpb19ieXRlcyk7CisJfQorfQorCiBzdGF0aWMgaW50IGZsYWtleV9tYXAoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBiaW8gKmJpbywKIAkJICAgICAgdW5pb24gbWFwX2luZm8gKm1hcF9jb250ZXh0KQogewpAQCAtMTE5LDE4ICsyNzAsNzEgQEAKIAogCS8qIEFyZSB3ZSBhbGl2ZSA/ICovCiAJZWxhcHNlZCA9IChqaWZmaWVzIC0gZmMtPnN0YXJ0X3RpbWUpIC8gSFo7Ci0JaWYgKGVsYXBzZWQgJSAoZmMtPnVwX2ludGVydmFsICsgZmMtPmRvd25faW50ZXJ2YWwpID49IGZjLT51cF9pbnRlcnZhbCkKLQkJcmV0dXJuIC1FSU87CisJaWYgKGVsYXBzZWQgJSAoZmMtPnVwX2ludGVydmFsICsgZmMtPmRvd25faW50ZXJ2YWwpID49IGZjLT51cF9pbnRlcnZhbCkgeworCQkvKgorCQkgKiBGbGFnIHRoaXMgYmlvIGFzIHN1Ym1pdHRlZCB3aGlsZSBkb3duLgorCQkgKi8KKwkJbWFwX2NvbnRleHQtPmxsID0gMTsKIAorCQkvKgorCQkgKiBNYXAgcmVhZHMgYXMgbm9ybWFsLgorCQkgKi8KKwkJaWYgKGJpb19kYXRhX2RpcihiaW8pID09IFJFQUQpCisJCQlnb3RvIG1hcF9iaW87CisKKwkJLyoKKwkJICogRHJvcCB3cml0ZXM/CisJCSAqLworCQlpZiAodGVzdF9iaXQoRFJPUF9XUklURVMsICZmYy0+ZmxhZ3MpKSB7CisJCQliaW9fZW5kaW8oYmlvLCAwKTsKKwkJCXJldHVybiBETV9NQVBJT19TVUJNSVRURUQ7CisJCX0KKworCQkvKgorCQkgKiBDb3JydXB0IG1hdGNoaW5nIHdyaXRlcy4KKwkJICovCisJCWlmIChmYy0+Y29ycnVwdF9iaW9fYnl0ZSAmJiAoZmMtPmNvcnJ1cHRfYmlvX3J3ID09IFdSSVRFKSkgeworCQkJaWYgKGFsbF9jb3JydXB0X2Jpb19mbGFnc19tYXRjaChiaW8sIGZjKSkKKwkJCQljb3JydXB0X2Jpb19kYXRhKGJpbywgZmMpOworCQkJZ290byBtYXBfYmlvOworCQl9CisKKwkJLyoKKwkJICogQnkgZGVmYXVsdCwgZXJyb3IgYWxsIEkvTy4KKwkJICovCisJCXJldHVybiAtRUlPOworCX0KKworbWFwX2JpbzoKIAlmbGFrZXlfbWFwX2Jpbyh0aSwgYmlvKTsKIAogCXJldHVybiBETV9NQVBJT19SRU1BUFBFRDsKIH0KIAorc3RhdGljIGludCBmbGFrZXlfZW5kX2lvKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgYmlvICpiaW8sCisJCQkgaW50IGVycm9yLCB1bmlvbiBtYXBfaW5mbyAqbWFwX2NvbnRleHQpCit7CisJc3RydWN0IGZsYWtleV9jICpmYyA9IHRpLT5wcml2YXRlOworCXVuc2lnbmVkIGJpb19zdWJtaXR0ZWRfd2hpbGVfZG93biA9IG1hcF9jb250ZXh0LT5sbDsKKworCS8qCisJICogQ29ycnVwdCBzdWNjZXNzZnVsIFJFQURzIHdoaWxlIGluIGRvd24gc3RhdGUuCisJICogSWYgZmxhZ3Mgd2VyZSBzcGVjaWZpZWQsIG9ubHkgY29ycnVwdCB0aG9zZSB0aGF0IG1hdGNoLgorCSAqLworCWlmICghZXJyb3IgJiYgYmlvX3N1Ym1pdHRlZF93aGlsZV9kb3duICYmCisJICAgIChiaW9fZGF0YV9kaXIoYmlvKSA9PSBSRUFEKSAmJiAoZmMtPmNvcnJ1cHRfYmlvX3J3ID09IFJFQUQpICYmCisJICAgIGFsbF9jb3JydXB0X2Jpb19mbGFnc19tYXRjaChiaW8sIGZjKSkKKwkJY29ycnVwdF9iaW9fZGF0YShiaW8sIGZjKTsKKworCXJldHVybiBlcnJvcjsKK30KKwogc3RhdGljIGludCBmbGFrZXlfc3RhdHVzKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdGF0dXNfdHlwZV90IHR5cGUsCiAJCQkgY2hhciAqcmVzdWx0LCB1bnNpZ25lZCBpbnQgbWF4bGVuKQogeworCXVuc2lnbmVkIHN6ID0gMDsKIAlzdHJ1Y3QgZmxha2V5X2MgKmZjID0gdGktPnByaXZhdGU7CisJdW5zaWduZWQgZHJvcF93cml0ZXM7CiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIFNUQVRVU1RZUEVfSU5GTzoKQEAgLTEzOCw5ICszNDIsMjIgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNUQVRVU1RZUEVfVEFCTEU6Ci0JCXNucHJpbnRmKHJlc3VsdCwgbWF4bGVuLCAiJXMgJWxsdSAldSAldSIsIGZjLT5kZXYtPm5hbWUsCi0JCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylmYy0+c3RhcnQsIGZjLT51cF9pbnRlcnZhbCwKLQkJCSBmYy0+ZG93bl9pbnRlcnZhbCk7CisJCURNRU1JVCgiJXMgJWxsdSAldSAldSAiLCBmYy0+ZGV2LT5uYW1lLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmYy0+c3RhcnQsIGZjLT51cF9pbnRlcnZhbCwKKwkJICAgICAgIGZjLT5kb3duX2ludGVydmFsKTsKKworCQlkcm9wX3dyaXRlcyA9IHRlc3RfYml0KERST1BfV1JJVEVTLCAmZmMtPmZsYWdzKTsKKwkJRE1FTUlUKCIldSAiLCBkcm9wX3dyaXRlcyArIChmYy0+Y29ycnVwdF9iaW9fYnl0ZSA+IDApICogNSk7CisKKwkJaWYgKGRyb3Bfd3JpdGVzKQorCQkJRE1FTUlUKCJkcm9wX3dyaXRlcyAiKTsKKworCQlpZiAoZmMtPmNvcnJ1cHRfYmlvX2J5dGUpCisJCQlETUVNSVQoImNvcnJ1cHRfYmlvX2J5dGUgJXUgJWMgJXUgJXUgIiwKKwkJCSAgICAgICBmYy0+Y29ycnVwdF9iaW9fYnl0ZSwKKwkJCSAgICAgICAoZmMtPmNvcnJ1cHRfYmlvX3J3ID09IFdSSVRFKSA/ICd3JyA6ICdyJywKKwkJCSAgICAgICBmYy0+Y29ycnVwdF9iaW9fdmFsdWUsIGZjLT5jb3JydXB0X2Jpb19mbGFncyk7CisKIAkJYnJlYWs7CiAJfQogCXJldHVybiAwOwpAQCAtMTc3LDExICszOTQsMTIgQEAKIAogc3RhdGljIHN0cnVjdCB0YXJnZXRfdHlwZSBmbGFrZXlfdGFyZ2V0ID0gewogCS5uYW1lICAgPSAiZmxha2V5IiwKLQkudmVyc2lvbiA9IHsxLCAxLCAwfSwKKwkudmVyc2lvbiA9IHsxLCAyLCAwfSwKIAkubW9kdWxlID0gVEhJU19NT0RVTEUsCiAJLmN0ciAgICA9IGZsYWtleV9jdHIsCiAJLmR0ciAgICA9IGZsYWtleV9kdHIsCiAJLm1hcCAgICA9IGZsYWtleV9tYXAsCisJLmVuZF9pbyA9IGZsYWtleV9lbmRfaW8sCiAJLnN0YXR1cyA9IGZsYWtleV9zdGF0dXMsCiAJLmlvY3RsCT0gZmxha2V5X2lvY3RsLAogCS5tZXJnZQk9IGZsYWtleV9tZXJnZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0taW8uYyBiL2RyaXZlcnMvbWQvZG0taW8uYwppbmRleCAyMDY3Mjg4Li5hZDJlYmE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWlvLmMKKysrIGIvZHJpdmVycy9tZC9kbS1pby5jCkBAIC0zOCw2ICszOCw4IEBACiAJc3RydWN0IGRtX2lvX2NsaWVudCAqY2xpZW50OwogCWlvX25vdGlmeV9mbiBjYWxsYmFjazsKIAl2b2lkICpjb250ZXh0OworCXZvaWQgKnZtYV9pbnZhbGlkYXRlX2FkZHJlc3M7CisJdW5zaWduZWQgbG9uZyB2bWFfaW52YWxpZGF0ZV9zaXplOwogfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKERNX0lPX01BWF9SRUdJT05TKSkpOwogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKl9kbV9pb19jYWNoZTsKQEAgLTExNiw2ICsxMTgsMTAgQEAKIAkJc2V0X2JpdChyZWdpb24sICZpby0+ZXJyb3JfYml0cyk7CiAKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaW8tPmNvdW50KSkgeworCQlpZiAoaW8tPnZtYV9pbnZhbGlkYXRlX3NpemUpCisJCQlpbnZhbGlkYXRlX2tlcm5lbF92bWFwX3JhbmdlKGlvLT52bWFfaW52YWxpZGF0ZV9hZGRyZXNzLAorCQkJCQkJICAgICBpby0+dm1hX2ludmFsaWRhdGVfc2l6ZSk7CisKIAkJaWYgKGlvLT5zbGVlcGVyKQogCQkJd2FrZV91cF9wcm9jZXNzKGlvLT5zbGVlcGVyKTsKIApAQCAtMTU5LDYgKzE2NSw5IEBACiAKIAl1bnNpZ25lZCBjb250ZXh0X3U7CiAJdm9pZCAqY29udGV4dF9wdHI7CisKKwl2b2lkICp2bWFfaW52YWxpZGF0ZV9hZGRyZXNzOworCXVuc2lnbmVkIGxvbmcgdm1hX2ludmFsaWRhdGVfc2l6ZTsKIH07CiAKIC8qCkBAIC0zNzcsNiArMzg2LDkgQEAKIAlpby0+c2xlZXBlciA9IGN1cnJlbnQ7CiAJaW8tPmNsaWVudCA9IGNsaWVudDsKIAorCWlvLT52bWFfaW52YWxpZGF0ZV9hZGRyZXNzID0gZHAtPnZtYV9pbnZhbGlkYXRlX2FkZHJlc3M7CisJaW8tPnZtYV9pbnZhbGlkYXRlX3NpemUgPSBkcC0+dm1hX2ludmFsaWRhdGVfc2l6ZTsKKwogCWRpc3BhdGNoX2lvKHJ3LCBudW1fcmVnaW9ucywgd2hlcmUsIGRwLCBpbywgMSk7CiAKIAl3aGlsZSAoMSkgewpAQCAtNDE1LDEzICs0MjcsMjEgQEAKIAlpby0+Y2FsbGJhY2sgPSBmbjsKIAlpby0+Y29udGV4dCA9IGNvbnRleHQ7CiAKKwlpby0+dm1hX2ludmFsaWRhdGVfYWRkcmVzcyA9IGRwLT52bWFfaW52YWxpZGF0ZV9hZGRyZXNzOworCWlvLT52bWFfaW52YWxpZGF0ZV9zaXplID0gZHAtPnZtYV9pbnZhbGlkYXRlX3NpemU7CisKIAlkaXNwYXRjaF9pbyhydywgbnVtX3JlZ2lvbnMsIHdoZXJlLCBkcCwgaW8sIDApOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRwX2luaXQoc3RydWN0IGRtX2lvX3JlcXVlc3QgKmlvX3JlcSwgc3RydWN0IGRwYWdlcyAqZHApCitzdGF0aWMgaW50IGRwX2luaXQoc3RydWN0IGRtX2lvX3JlcXVlc3QgKmlvX3JlcSwgc3RydWN0IGRwYWdlcyAqZHAsCisJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAkvKiBTZXQgdXAgZHBhZ2VzIGJhc2VkIG9uIG1lbW9yeSB0eXBlICovCisKKwlkcC0+dm1hX2ludmFsaWRhdGVfYWRkcmVzcyA9IE5VTEw7CisJZHAtPnZtYV9pbnZhbGlkYXRlX3NpemUgPSAwOworCiAJc3dpdGNoIChpb19yZXEtPm1lbS50eXBlKSB7CiAJY2FzZSBETV9JT19QQUdFX0xJU1Q6CiAJCWxpc3RfZHBfaW5pdChkcCwgaW9fcmVxLT5tZW0ucHRyLnBsLCBpb19yZXEtPm1lbS5vZmZzZXQpOwpAQCAtNDMyLDYgKzQ1MiwxMSBAQAogCQlicmVhazsKIAogCWNhc2UgRE1fSU9fVk1BOgorCQlmbHVzaF9rZXJuZWxfdm1hcF9yYW5nZShpb19yZXEtPm1lbS5wdHIudm1hLCBzaXplKTsKKwkJaWYgKChpb19yZXEtPmJpX3J3ICYgUldfTUFTSykgPT0gUkVBRCkgeworCQkJZHAtPnZtYV9pbnZhbGlkYXRlX2FkZHJlc3MgPSBpb19yZXEtPm1lbS5wdHIudm1hOworCQkJZHAtPnZtYV9pbnZhbGlkYXRlX3NpemUgPSBzaXplOworCQl9CiAJCXZtX2RwX2luaXQoZHAsIGlvX3JlcS0+bWVtLnB0ci52bWEpOwogCQlicmVhazsKIApAQCAtNDYwLDcgKzQ4NSw3IEBACiAJaW50IHI7CiAJc3RydWN0IGRwYWdlcyBkcDsKIAotCXIgPSBkcF9pbml0KGlvX3JlcSwgJmRwKTsKKwlyID0gZHBfaW5pdChpb19yZXEsICZkcCwgKHVuc2lnbmVkIGxvbmcpd2hlcmUtPmNvdW50IDw8IFNFQ1RPUl9TSElGVCk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWlvY3RsLmMgYi9kcml2ZXJzL21kL2RtLWlvY3RsLmMKaW5kZXggNGNhY2RhZC4uMmU5YTNjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1pb2N0bC5jCisrKyBiL2RyaXZlcnMvbWQvZG0taW9jdGwuYwpAQCAtMTI4LDYgKzEyOCwyNCBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgc3RydWN0IGhhc2hfY2VsbCAqX19nZXRfZGV2X2NlbGwodWludDY0X3QgZGV2KQoreworCXN0cnVjdCBtYXBwZWRfZGV2aWNlICptZDsKKwlzdHJ1Y3QgaGFzaF9jZWxsICpoYzsKKworCW1kID0gZG1fZ2V0X21kKGh1Z2VfZGVjb2RlX2RldihkZXYpKTsKKwlpZiAoIW1kKQorCQlyZXR1cm4gTlVMTDsKKworCWhjID0gZG1fZ2V0X21kcHRyKG1kKTsKKwlpZiAoIWhjKSB7CisJCWRtX3B1dChtZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBoYzsKK30KKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogSW5zZXJ0aW5nLCByZW1vdmluZyBhbmQgcmVuYW1pbmcgYSBkZXZpY2UuCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC03MTgsMjUgKzczNiw0NSBAQAogICovCiBzdGF0aWMgc3RydWN0IGhhc2hfY2VsbCAqX19maW5kX2RldmljZV9oYXNoX2NlbGwoc3RydWN0IGRtX2lvY3RsICpwYXJhbSkKIHsKLQlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQ7Ci0Jdm9pZCAqbWRwdHIgPSBOVUxMOworCXN0cnVjdCBoYXNoX2NlbGwgKmhjID0gTlVMTDsKIAotCWlmICgqcGFyYW0tPnV1aWQpCi0JCXJldHVybiBfX2dldF91dWlkX2NlbGwocGFyYW0tPnV1aWQpOworCWlmICgqcGFyYW0tPnV1aWQpIHsKKwkJaWYgKCpwYXJhbS0+bmFtZSB8fCBwYXJhbS0+ZGV2KQorCQkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoKnBhcmFtLT5uYW1lKQotCQlyZXR1cm4gX19nZXRfbmFtZV9jZWxsKHBhcmFtLT5uYW1lKTsKKwkJaGMgPSBfX2dldF91dWlkX2NlbGwocGFyYW0tPnV1aWQpOworCQlpZiAoIWhjKQorCQkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmICgqcGFyYW0tPm5hbWUpIHsKKwkJaWYgKHBhcmFtLT5kZXYpCisJCQlyZXR1cm4gTlVMTDsKIAotCW1kID0gZG1fZ2V0X21kKGh1Z2VfZGVjb2RlX2RldihwYXJhbS0+ZGV2KSk7Ci0JaWYgKCFtZCkKLQkJZ290byBvdXQ7CisJCWhjID0gX19nZXRfbmFtZV9jZWxsKHBhcmFtLT5uYW1lKTsKKwkJaWYgKCFoYykKKwkJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAocGFyYW0tPmRldikgeworCQloYyA9IF9fZ2V0X2Rldl9jZWxsKHBhcmFtLT5kZXYpOworCQlpZiAoIWhjKQorCQkJcmV0dXJuIE5VTEw7CisJfSBlbHNlCisJCXJldHVybiBOVUxMOwogCi0JbWRwdHIgPSBkbV9nZXRfbWRwdHIobWQpOwotCWlmICghbWRwdHIpCi0JCWRtX3B1dChtZCk7CisJLyoKKwkgKiBTbmVha2lseSB3cml0ZSBpbiBib3RoIHRoZSBuYW1lIGFuZCB0aGUgdXVpZAorCSAqIHdoaWxlIHdlIGhhdmUgdGhlIGNlbGwuCisJICovCisJc3RybGNweShwYXJhbS0+bmFtZSwgaGMtPm5hbWUsIHNpemVvZihwYXJhbS0+bmFtZSkpOworCWlmIChoYy0+dXVpZCkKKwkJc3RybGNweShwYXJhbS0+dXVpZCwgaGMtPnV1aWQsIHNpemVvZihwYXJhbS0+dXVpZCkpOworCWVsc2UKKwkJcGFyYW0tPnV1aWRbMF0gPSAnXDAnOwogCi1vdXQ6Ci0JcmV0dXJuIG1kcHRyOworCWlmIChoYy0+bmV3X21hcCkKKwkJcGFyYW0tPmZsYWdzIHw9IERNX0lOQUNUSVZFX1BSRVNFTlRfRkxBRzsKKwllbHNlCisJCXBhcmFtLT5mbGFncyAmPSB+RE1fSU5BQ1RJVkVfUFJFU0VOVF9GTEFHOworCisJcmV0dXJuIGhjOwogfQogCiBzdGF0aWMgc3RydWN0IG1hcHBlZF9kZXZpY2UgKmZpbmRfZGV2aWNlKHN0cnVjdCBkbV9pb2N0bCAqcGFyYW0pCkBAIC03NDYsMjQgKzc4NCw4IEBACiAKIAlkb3duX3JlYWQoJl9oYXNoX2xvY2spOwogCWhjID0gX19maW5kX2RldmljZV9oYXNoX2NlbGwocGFyYW0pOwotCWlmIChoYykgeworCWlmIChoYykKIAkJbWQgPSBoYy0+bWQ7Ci0KLQkJLyoKLQkJICogU25lYWtpbHkgd3JpdGUgaW4gYm90aCB0aGUgbmFtZSBhbmQgdGhlIHV1aWQKLQkJICogd2hpbGUgd2UgaGF2ZSB0aGUgY2VsbC4KLQkJICovCi0JCXN0cmxjcHkocGFyYW0tPm5hbWUsIGhjLT5uYW1lLCBzaXplb2YocGFyYW0tPm5hbWUpKTsKLQkJaWYgKGhjLT51dWlkKQotCQkJc3RybGNweShwYXJhbS0+dXVpZCwgaGMtPnV1aWQsIHNpemVvZihwYXJhbS0+dXVpZCkpOwotCQllbHNlCi0JCQlwYXJhbS0+dXVpZFswXSA9ICdcMCc7Ci0KLQkJaWYgKGhjLT5uZXdfbWFwKQotCQkJcGFyYW0tPmZsYWdzIHw9IERNX0lOQUNUSVZFX1BSRVNFTlRfRkxBRzsKLQkJZWxzZQotCQkJcGFyYW0tPmZsYWdzICY9IH5ETV9JTkFDVElWRV9QUkVTRU5UX0ZMQUc7Ci0JfQogCXVwX3JlYWQoJl9oYXNoX2xvY2spOwogCiAJcmV0dXJuIG1kOwpAQCAtMTQwMiw2ICsxNDI0LDExIEBACiAJCWdvdG8gb3V0OwogCX0KIAorCWlmICghYXJnYykgeworCQlETVdBUk4oIkVtcHR5IG1lc3NhZ2UgcmVjZWl2ZWQuIik7CisJCWdvdG8gb3V0OworCX0KKwogCXRhYmxlID0gZG1fZ2V0X2xpdmVfdGFibGUobWQpOwogCWlmICghdGFibGUpCiAJCWdvdG8gb3V0X2FyZ3Y7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWtjb3B5ZC5jIGIvZHJpdmVycy9tZC9kbS1rY29weWQuYwppbmRleCAzMjA0MDFkLi5mODIxNDcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWtjb3B5ZC5jCisrKyBiL2RyaXZlcnMvbWQvZG0ta2NvcHlkLmMKQEAgLTIyNCw4ICsyMjQsNiBAQAogCXVuc2lnbmVkIGludCBudW1fZGVzdHM7CiAJc3RydWN0IGRtX2lvX3JlZ2lvbiBkZXN0c1tETV9LQ09QWURfTUFYX1JFR0lPTlNdOwogCi0Jc2VjdG9yX3Qgb2Zmc2V0OwotCXVuc2lnbmVkIGludCBucl9wYWdlczsKIAlzdHJ1Y3QgcGFnZV9saXN0ICpwYWdlczsKIAogCS8qCkBAIC0zODAsNyArMzc4LDcgQEAKIAkJLmJpX3J3ID0gam9iLT5ydywKIAkJLm1lbS50eXBlID0gRE1fSU9fUEFHRV9MSVNULAogCQkubWVtLnB0ci5wbCA9IGpvYi0+cGFnZXMsCi0JCS5tZW0ub2Zmc2V0ID0gam9iLT5vZmZzZXQsCisJCS5tZW0ub2Zmc2V0ID0gMCwKIAkJLm5vdGlmeS5mbiA9IGNvbXBsZXRlX2lvLAogCQkubm90aWZ5LmNvbnRleHQgPSBqb2IsCiAJCS5jbGllbnQgPSBqb2ItPmtjLT5pb19jbGllbnQsCkBAIC0zOTcsMTAgKzM5NSw5IEBACiBzdGF0aWMgaW50IHJ1bl9wYWdlc19qb2Ioc3RydWN0IGtjb3B5ZF9qb2IgKmpvYikKIHsKIAlpbnQgcjsKKwl1bnNpZ25lZCBucl9wYWdlcyA9IGRtX2Rpdl91cChqb2ItPmRlc3RzWzBdLmNvdW50LCBQQUdFX1NJWkUgPj4gOSk7CiAKLQlqb2ItPm5yX3BhZ2VzID0gZG1fZGl2X3VwKGpvYi0+ZGVzdHNbMF0uY291bnQgKyBqb2ItPm9mZnNldCwKLQkJCQkgIFBBR0VfU0laRSA+PiA5KTsKLQlyID0ga2NvcHlkX2dldF9wYWdlcyhqb2ItPmtjLCBqb2ItPm5yX3BhZ2VzLCAmam9iLT5wYWdlcyk7CisJciA9IGtjb3B5ZF9nZXRfcGFnZXMoam9iLT5rYywgbnJfcGFnZXMsICZqb2ItPnBhZ2VzKTsKIAlpZiAoIXIpIHsKIAkJLyogdGhpcyBqb2IgaXMgcmVhZHkgZm9yIGlvICovCiAJCXB1c2goJmpvYi0+a2MtPmlvX2pvYnMsIGpvYik7CkBAIC02MDIsOCArNTk5LDYgQEAKIAlqb2ItPm51bV9kZXN0cyA9IG51bV9kZXN0czsKIAltZW1jcHkoJmpvYi0+ZGVzdHMsIGRlc3RzLCBzaXplb2YoKmRlc3RzKSAqIG51bV9kZXN0cyk7CiAKLQlqb2ItPm9mZnNldCA9IDA7Ci0Jam9iLT5ucl9wYWdlcyA9IDA7CiAJam9iLT5wYWdlcyA9IE5VTEw7CiAKIAlqb2ItPmZuID0gZm47CkBAIC02MjIsNiArNjE3LDM3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRtX2tjb3B5ZF9jb3B5KTsKIAordm9pZCAqZG1fa2NvcHlkX3ByZXBhcmVfY2FsbGJhY2soc3RydWN0IGRtX2tjb3B5ZF9jbGllbnQgKmtjLAorCQkJCSBkbV9rY29weWRfbm90aWZ5X2ZuIGZuLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBrY29weWRfam9iICpqb2I7CisKKwlqb2IgPSBtZW1wb29sX2FsbG9jKGtjLT5qb2JfcG9vbCwgR0ZQX05PSU8pOworCisJbWVtc2V0KGpvYiwgMCwgc2l6ZW9mKHN0cnVjdCBrY29weWRfam9iKSk7CisJam9iLT5rYyA9IGtjOworCWpvYi0+Zm4gPSBmbjsKKwlqb2ItPmNvbnRleHQgPSBjb250ZXh0OworCisJYXRvbWljX2luYygma2MtPm5yX2pvYnMpOworCisJcmV0dXJuIGpvYjsKK30KK0VYUE9SVF9TWU1CT0woZG1fa2NvcHlkX3ByZXBhcmVfY2FsbGJhY2spOworCit2b2lkIGRtX2tjb3B5ZF9kb19jYWxsYmFjayh2b2lkICpqLCBpbnQgcmVhZF9lcnIsIHVuc2lnbmVkIGxvbmcgd3JpdGVfZXJyKQoreworCXN0cnVjdCBrY29weWRfam9iICpqb2IgPSBqOworCXN0cnVjdCBkbV9rY29weWRfY2xpZW50ICprYyA9IGpvYi0+a2M7CisKKwlqb2ItPnJlYWRfZXJyID0gcmVhZF9lcnI7CisJam9iLT53cml0ZV9lcnIgPSB3cml0ZV9lcnI7CisKKwlwdXNoKCZrYy0+Y29tcGxldGVfam9icywgam9iKTsKKwl3YWtlKGtjKTsKK30KK0VYUE9SVF9TWU1CT0woZG1fa2NvcHlkX2RvX2NhbGxiYWNrKTsKKwogLyoKICAqIENhbmNlbHMgYSBrY29weWQgam9iLCBlZy4gc29tZW9uZSBtaWdodCBiZSBkZWFjdGl2YXRpbmcgYQogICogbWlycm9yLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1sb2ctdXNlcnNwYWNlLWJhc2UuYyBiL2RyaXZlcnMvbWQvZG0tbG9nLXVzZXJzcGFjZS1iYXNlLmMKaW5kZXggYWEyZTBjMy4uMTAyMWM4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1sb2ctdXNlcnNwYWNlLWJhc2UuYworKysgYi9kcml2ZXJzL21kL2RtLWxvZy11c2Vyc3BhY2UtYmFzZS5jCkBAIC0zOTQsOCArMzk0LDcgQEAKIAkJCWdyb3VwW2NvdW50XSA9IGZlLT5yZWdpb247CiAJCQljb3VudCsrOwogCi0JCQlsaXN0X2RlbCgmZmUtPmxpc3QpOwotCQkJbGlzdF9hZGQoJmZlLT5saXN0LCAmdG1wX2xpc3QpOworCQkJbGlzdF9tb3ZlKCZmZS0+bGlzdCwgJnRtcF9saXN0KTsKIAogCQkJdHlwZSA9IGZlLT50eXBlOwogCQkJaWYgKGNvdW50ID49IE1BWF9GTFVTSF9HUk9VUF9DT1VOVCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tbG9nLmMgYi9kcml2ZXJzL21kL2RtLWxvZy5jCmluZGV4IDk0OGUzZjQuLjNiNTJiYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tbG9nLmMKKysrIGIvZHJpdmVycy9tZC9kbS1sb2cuYwpAQCAtMTk3LDE1ICsxOTcsMjEgQEAKICNkZWZpbmUgTUlSUk9SX0RJU0tfVkVSU0lPTiAyCiAjZGVmaW5lIExPR19PRkZTRVQgMgogCi1zdHJ1Y3QgbG9nX2hlYWRlciB7Ci0JdWludDMyX3QgbWFnaWM7CitzdHJ1Y3QgbG9nX2hlYWRlcl9kaXNrIHsKKwlfX2xlMzIgbWFnaWM7CiAKIAkvKgogCSAqIFNpbXBsZSwgaW5jcmVtZW50aW5nIHZlcnNpb24uIG5vIGJhY2t3YXJkCiAJICogY29tcGF0aWJpbGl0eS4KIAkgKi8KKwlfX2xlMzIgdmVyc2lvbjsKKwlfX2xlNjQgbnJfcmVnaW9uczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBsb2dfaGVhZGVyX2NvcmUgeworCXVpbnQzMl90IG1hZ2ljOwogCXVpbnQzMl90IHZlcnNpb247Ci0Jc2VjdG9yX3QgbnJfcmVnaW9uczsKKwl1aW50NjRfdCBucl9yZWdpb25zOwogfTsKIAogc3RydWN0IGxvZ19jIHsKQEAgLTIzOSwxMCArMjQ1LDEwIEBACiAJaW50IGxvZ19kZXZfZmFpbGVkOwogCWludCBsb2dfZGV2X2ZsdXNoX2ZhaWxlZDsKIAlzdHJ1Y3QgZG1fZGV2ICpsb2dfZGV2OwotCXN0cnVjdCBsb2dfaGVhZGVyIGhlYWRlcjsKKwlzdHJ1Y3QgbG9nX2hlYWRlcl9jb3JlIGhlYWRlcjsKIAogCXN0cnVjdCBkbV9pb19yZWdpb24gaGVhZGVyX2xvY2F0aW9uOwotCXN0cnVjdCBsb2dfaGVhZGVyICpkaXNrX2hlYWRlcjsKKwlzdHJ1Y3QgbG9nX2hlYWRlcl9kaXNrICpkaXNrX2hlYWRlcjsKIH07CiAKIC8qCkBAIC0yNTEsMzQgKzI1NywzNCBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBsb2dfdGVzdF9iaXQodWludDMyX3QgKmJzLCB1bnNpZ25lZCBiaXQpCiB7Ci0JcmV0dXJuIHRlc3RfYml0X2xlKGJpdCwgKHVuc2lnbmVkIGxvbmcgKikgYnMpID8gMSA6IDA7CisJcmV0dXJuIHRlc3RfYml0X2xlKGJpdCwgYnMpID8gMSA6IDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsb2dfc2V0X2JpdChzdHJ1Y3QgbG9nX2MgKmwsCiAJCQkgICAgICAgdWludDMyX3QgKmJzLCB1bnNpZ25lZCBiaXQpCiB7Ci0JX190ZXN0X2FuZF9zZXRfYml0X2xlKGJpdCwgKHVuc2lnbmVkIGxvbmcgKikgYnMpOworCV9fc2V0X2JpdF9sZShiaXQsIGJzKTsKIAlsLT50b3VjaGVkX2NsZWFuZWQgPSAxOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbG9nX2NsZWFyX2JpdChzdHJ1Y3QgbG9nX2MgKmwsCiAJCQkJIHVpbnQzMl90ICpicywgdW5zaWduZWQgYml0KQogewotCV9fdGVzdF9hbmRfY2xlYXJfYml0X2xlKGJpdCwgKHVuc2lnbmVkIGxvbmcgKikgYnMpOworCV9fY2xlYXJfYml0X2xlKGJpdCwgYnMpOwogCWwtPnRvdWNoZWRfZGlydGllZCA9IDE7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogSGVhZGVyIElPCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhlYWRlcl90b19kaXNrKHN0cnVjdCBsb2dfaGVhZGVyICpjb3JlLCBzdHJ1Y3QgbG9nX2hlYWRlciAqZGlzaykKK3N0YXRpYyB2b2lkIGhlYWRlcl90b19kaXNrKHN0cnVjdCBsb2dfaGVhZGVyX2NvcmUgKmNvcmUsIHN0cnVjdCBsb2dfaGVhZGVyX2Rpc2sgKmRpc2spCiB7CiAJZGlzay0+bWFnaWMgPSBjcHVfdG9fbGUzMihjb3JlLT5tYWdpYyk7CiAJZGlzay0+dmVyc2lvbiA9IGNwdV90b19sZTMyKGNvcmUtPnZlcnNpb24pOwogCWRpc2stPm5yX3JlZ2lvbnMgPSBjcHVfdG9fbGU2NChjb3JlLT5ucl9yZWdpb25zKTsKIH0KIAotc3RhdGljIHZvaWQgaGVhZGVyX2Zyb21fZGlzayhzdHJ1Y3QgbG9nX2hlYWRlciAqY29yZSwgc3RydWN0IGxvZ19oZWFkZXIgKmRpc2spCitzdGF0aWMgdm9pZCBoZWFkZXJfZnJvbV9kaXNrKHN0cnVjdCBsb2dfaGVhZGVyX2NvcmUgKmNvcmUsIHN0cnVjdCBsb2dfaGVhZGVyX2Rpc2sgKmRpc2spCiB7CiAJY29yZS0+bWFnaWMgPSBsZTMyX3RvX2NwdShkaXNrLT5tYWdpYyk7CiAJY29yZS0+dmVyc2lvbiA9IGxlMzJfdG9fY3B1KGRpc2stPnZlcnNpb24pOwpAQCAtNDg2LDcgKzQ5Miw3IEBACiAJbWVtc2V0KGxjLT5zeW5jX2JpdHMsIChzeW5jID09IE5PU1lOQykgPyAtMSA6IDAsIGJpdHNldF9zaXplKTsKIAlsYy0+c3luY19jb3VudCA9IChzeW5jID09IE5PU1lOQykgPyByZWdpb25fY291bnQgOiAwOwogCi0JbGMtPnJlY292ZXJpbmdfYml0cyA9IHZtYWxsb2MoYml0c2V0X3NpemUpOworCWxjLT5yZWNvdmVyaW5nX2JpdHMgPSB2emFsbG9jKGJpdHNldF9zaXplKTsKIAlpZiAoIWxjLT5yZWNvdmVyaW5nX2JpdHMpIHsKIAkJRE1XQVJOKCJjb3VsZG4ndCBhbGxvY2F0ZSBzeW5jIGJpdHNldCIpOwogCQl2ZnJlZShsYy0+c3luY19iaXRzKTsKQEAgLTQ5OCw3ICs1MDQsNiBAQAogCQlrZnJlZShsYyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQobGMtPnJlY292ZXJpbmdfYml0cywgMCwgYml0c2V0X3NpemUpOwogCWxjLT5zeW5jX3NlYXJjaCA9IDA7CiAJbG9nLT5jb250ZXh0ID0gbGM7CiAKQEAgLTczOSw4ICs3NDQsNyBAQAogCQlyZXR1cm4gMDsKIAogCWRvIHsKLQkJKnJlZ2lvbiA9IGZpbmRfbmV4dF96ZXJvX2JpdF9sZSgKLQkJCQkJICAgICAodW5zaWduZWQgbG9uZyAqKSBsYy0+c3luY19iaXRzLAorCQkqcmVnaW9uID0gZmluZF9uZXh0X3plcm9fYml0X2xlKGxjLT5zeW5jX2JpdHMsCiAJCQkJCSAgICAgbGMtPnJlZ2lvbl9jb3VudCwKIAkJCQkJICAgICBsYy0+c3luY19zZWFyY2gpOwogCQlsYy0+c3luY19zZWFyY2ggPSAqcmVnaW9uICsgMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tbXBhdGguYyBiL2RyaXZlcnMvbWQvZG0tbXBhdGguYwppbmRleCBjMzU0NzAxLi41ZTAwOTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLW1wYXRoLmMKKysrIGIvZHJpdmVycy9tZC9kbS1tcGF0aC5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAKICNkZWZpbmUgRE1fTVNHX1BSRUZJWCAibXVsdGlwYXRoIgotI2RlZmluZSBNRVNHX1NUUih4KSB4LCBzaXplb2YoeCkKICNkZWZpbmUgRE1fUEdfSU5JVF9ERUxBWV9NU0VDUyAyMDAwCiAjZGVmaW5lIERNX1BHX0lOSVRfREVMQVlfREVGQVVMVCAoKHVuc2lnbmVkKSAtMSkKIApAQCAtNTA1LDgwICs1MDQsMjkgQEAKICAqICAgICAgPCNwYXRocz4gPCNwZXItcGF0aCBzZWxlY3RvciBhcmdzPgogICogICAgICAgICBbPHBhdGg+IFs8YXJnPl0qIF0rIF0rCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdHJ1Y3QgcGFyYW0gewotCXVuc2lnbmVkIG1pbjsKLQl1bnNpZ25lZCBtYXg7Ci0JY2hhciAqZXJyb3I7Ci19OwotCi1zdGF0aWMgaW50IHJlYWRfcGFyYW0oc3RydWN0IHBhcmFtICpwYXJhbSwgY2hhciAqc3RyLCB1bnNpZ25lZCAqdiwgY2hhciAqKmVycm9yKQotewotCWlmICghc3RyIHx8Ci0JICAgIChzc2NhbmYoc3RyLCAiJXUiLCB2KSAhPSAxKSB8fAotCSAgICAoKnYgPCBwYXJhbS0+bWluKSB8fAotCSAgICAoKnYgPiBwYXJhbS0+bWF4KSkgewotCQkqZXJyb3IgPSBwYXJhbS0+ZXJyb3I7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgYXJnX3NldCB7Ci0JdW5zaWduZWQgYXJnYzsKLQljaGFyICoqYXJndjsKLX07Ci0KLXN0YXRpYyBjaGFyICpzaGlmdChzdHJ1Y3QgYXJnX3NldCAqYXMpCi17Ci0JY2hhciAqcjsKLQotCWlmIChhcy0+YXJnYykgewotCQlhcy0+YXJnYy0tOwotCQlyID0gKmFzLT5hcmd2OwotCQlhcy0+YXJndisrOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgY29uc3VtZShzdHJ1Y3QgYXJnX3NldCAqYXMsIHVuc2lnbmVkIG4pCi17Ci0JQlVHX09OIChhcy0+YXJnYyA8IG4pOwotCWFzLT5hcmdjIC09IG47Ci0JYXMtPmFyZ3YgKz0gbjsKLX0KLQotc3RhdGljIGludCBwYXJzZV9wYXRoX3NlbGVjdG9yKHN0cnVjdCBhcmdfc2V0ICphcywgc3RydWN0IHByaW9yaXR5X2dyb3VwICpwZywKK3N0YXRpYyBpbnQgcGFyc2VfcGF0aF9zZWxlY3RvcihzdHJ1Y3QgZG1fYXJnX3NldCAqYXMsIHN0cnVjdCBwcmlvcml0eV9ncm91cCAqcGcsCiAJCQkgICAgICAgc3RydWN0IGRtX3RhcmdldCAqdGkpCiB7CiAJaW50IHI7CiAJc3RydWN0IHBhdGhfc2VsZWN0b3JfdHlwZSAqcHN0OwogCXVuc2lnbmVkIHBzX2FyZ2M7CiAKLQlzdGF0aWMgc3RydWN0IHBhcmFtIF9wYXJhbXNbXSA9IHsKKwlzdGF0aWMgc3RydWN0IGRtX2FyZyBfYXJnc1tdID0gewogCQl7MCwgMTAyNCwgImludmFsaWQgbnVtYmVyIG9mIHBhdGggc2VsZWN0b3IgYXJncyJ9LAogCX07CiAKLQlwc3QgPSBkbV9nZXRfcGF0aF9zZWxlY3RvcihzaGlmdChhcykpOworCXBzdCA9IGRtX2dldF9wYXRoX3NlbGVjdG9yKGRtX3NoaWZ0X2FyZyhhcykpOwogCWlmICghcHN0KSB7CiAJCXRpLT5lcnJvciA9ICJ1bmtub3duIHBhdGggc2VsZWN0b3IgdHlwZSI7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXIgPSByZWFkX3BhcmFtKF9wYXJhbXMsIHNoaWZ0KGFzKSwgJnBzX2FyZ2MsICZ0aS0+ZXJyb3IpOworCXIgPSBkbV9yZWFkX2FyZ19ncm91cChfYXJncywgYXMsICZwc19hcmdjLCAmdGktPmVycm9yKTsKIAlpZiAocikgewogCQlkbV9wdXRfcGF0aF9zZWxlY3Rvcihwc3QpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAocHNfYXJnYyA+IGFzLT5hcmdjKSB7Ci0JCWRtX3B1dF9wYXRoX3NlbGVjdG9yKHBzdCk7Ci0JCXRpLT5lcnJvciA9ICJub3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgcGF0aCBzZWxlY3RvciI7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCXIgPSBwc3QtPmNyZWF0ZSgmcGctPnBzLCBwc19hcmdjLCBhcy0+YXJndik7CiAJaWYgKHIpIHsKIAkJZG1fcHV0X3BhdGhfc2VsZWN0b3IocHN0KTsKQEAgLTU4NywxMiArNTM1LDEyIEBACiAJfQogCiAJcGctPnBzLnR5cGUgPSBwc3Q7Ci0JY29uc3VtZShhcywgcHNfYXJnYyk7CisJZG1fY29uc3VtZV9hcmdzKGFzLCBwc19hcmdjKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBncGF0aCAqcGFyc2VfcGF0aChzdHJ1Y3QgYXJnX3NldCAqYXMsIHN0cnVjdCBwYXRoX3NlbGVjdG9yICpwcywKK3N0YXRpYyBzdHJ1Y3QgcGdwYXRoICpwYXJzZV9wYXRoKHN0cnVjdCBkbV9hcmdfc2V0ICphcywgc3RydWN0IHBhdGhfc2VsZWN0b3IgKnBzLAogCQkJICAgICAgIHN0cnVjdCBkbV90YXJnZXQgKnRpKQogewogCWludCByOwpAQCAtNjA5LDcgKzU1Nyw3IEBACiAJaWYgKCFwKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCXIgPSBkbV9nZXRfZGV2aWNlKHRpLCBzaGlmdChhcyksIGRtX3RhYmxlX2dldF9tb2RlKHRpLT50YWJsZSksCisJciA9IGRtX2dldF9kZXZpY2UodGksIGRtX3NoaWZ0X2FyZyhhcyksIGRtX3RhYmxlX2dldF9tb2RlKHRpLT50YWJsZSksCiAJCQkgICZwLT5wYXRoLmRldik7CiAJaWYgKHIpIHsKIAkJdGktPmVycm9yID0gImVycm9yIGdldHRpbmcgZGV2aWNlIjsKQEAgLTY2MCwxNiArNjA4LDE2IEBACiAJcmV0dXJuIEVSUl9QVFIocik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcHJpb3JpdHlfZ3JvdXAgKnBhcnNlX3ByaW9yaXR5X2dyb3VwKHN0cnVjdCBhcmdfc2V0ICphcywKK3N0YXRpYyBzdHJ1Y3QgcHJpb3JpdHlfZ3JvdXAgKnBhcnNlX3ByaW9yaXR5X2dyb3VwKHN0cnVjdCBkbV9hcmdfc2V0ICphcywKIAkJCQkJCSAgIHN0cnVjdCBtdWx0aXBhdGggKm0pCiB7Ci0Jc3RhdGljIHN0cnVjdCBwYXJhbSBfcGFyYW1zW10gPSB7CisJc3RhdGljIHN0cnVjdCBkbV9hcmcgX2FyZ3NbXSA9IHsKIAkJezEsIDEwMjQsICJpbnZhbGlkIG51bWJlciBvZiBwYXRocyJ9LAogCQl7MCwgMTAyNCwgImludmFsaWQgbnVtYmVyIG9mIHNlbGVjdG9yIGFyZ3MifQogCX07CiAKIAlpbnQgcjsKLQl1bnNpZ25lZCBpLCBucl9zZWxlY3Rvcl9hcmdzLCBucl9wYXJhbXM7CisJdW5zaWduZWQgaSwgbnJfc2VsZWN0b3JfYXJncywgbnJfYXJnczsKIAlzdHJ1Y3QgcHJpb3JpdHlfZ3JvdXAgKnBnOwogCXN0cnVjdCBkbV90YXJnZXQgKnRpID0gbS0+dGk7CiAKQEAgLTY5MywyNiArNjQxLDI2IEBACiAJLyoKIAkgKiByZWFkIHRoZSBwYXRocwogCSAqLwotCXIgPSByZWFkX3BhcmFtKF9wYXJhbXMsIHNoaWZ0KGFzKSwgJnBnLT5ucl9wZ3BhdGhzLCAmdGktPmVycm9yKTsKKwlyID0gZG1fcmVhZF9hcmcoX2FyZ3MsIGFzLCAmcGctPm5yX3BncGF0aHMsICZ0aS0+ZXJyb3IpOwogCWlmIChyKQogCQlnb3RvIGJhZDsKIAotCXIgPSByZWFkX3BhcmFtKF9wYXJhbXMgKyAxLCBzaGlmdChhcyksICZucl9zZWxlY3Rvcl9hcmdzLCAmdGktPmVycm9yKTsKKwlyID0gZG1fcmVhZF9hcmcoX2FyZ3MgKyAxLCBhcywgJm5yX3NlbGVjdG9yX2FyZ3MsICZ0aS0+ZXJyb3IpOwogCWlmIChyKQogCQlnb3RvIGJhZDsKIAotCW5yX3BhcmFtcyA9IDEgKyBucl9zZWxlY3Rvcl9hcmdzOworCW5yX2FyZ3MgPSAxICsgbnJfc2VsZWN0b3JfYXJnczsKIAlmb3IgKGkgPSAwOyBpIDwgcGctPm5yX3BncGF0aHM7IGkrKykgewogCQlzdHJ1Y3QgcGdwYXRoICpwZ3BhdGg7Ci0JCXN0cnVjdCBhcmdfc2V0IHBhdGhfYXJnczsKKwkJc3RydWN0IGRtX2FyZ19zZXQgcGF0aF9hcmdzOwogCi0JCWlmIChhcy0+YXJnYyA8IG5yX3BhcmFtcykgeworCQlpZiAoYXMtPmFyZ2MgPCBucl9hcmdzKSB7CiAJCQl0aS0+ZXJyb3IgPSAibm90IGVub3VnaCBwYXRoIHBhcmFtZXRlcnMiOwogCQkJciA9IC1FSU5WQUw7CiAJCQlnb3RvIGJhZDsKIAkJfQogCi0JCXBhdGhfYXJncy5hcmdjID0gbnJfcGFyYW1zOworCQlwYXRoX2FyZ3MuYXJnYyA9IG5yX2FyZ3M7CiAJCXBhdGhfYXJncy5hcmd2ID0gYXMtPmFyZ3Y7CiAKIAkJcGdwYXRoID0gcGFyc2VfcGF0aCgmcGF0aF9hcmdzLCAmcGctPnBzLCB0aSk7CkBAIC03MjMsNyArNjcxLDcgQEAKIAogCQlwZ3BhdGgtPnBnID0gcGc7CiAJCWxpc3RfYWRkX3RhaWwoJnBncGF0aC0+bGlzdCwgJnBnLT5wZ3BhdGhzKTsKLQkJY29uc3VtZShhcywgbnJfcGFyYW1zKTsKKwkJZG1fY29uc3VtZV9hcmdzKGFzLCBucl9hcmdzKTsKIAl9CiAKIAlyZXR1cm4gcGc7CkBAIC03MzMsMjggKzY4MSwyMyBAQAogCXJldHVybiBFUlJfUFRSKHIpOwogfQogCi1zdGF0aWMgaW50IHBhcnNlX2h3X2hhbmRsZXIoc3RydWN0IGFyZ19zZXQgKmFzLCBzdHJ1Y3QgbXVsdGlwYXRoICptKQorc3RhdGljIGludCBwYXJzZV9od19oYW5kbGVyKHN0cnVjdCBkbV9hcmdfc2V0ICphcywgc3RydWN0IG11bHRpcGF0aCAqbSkKIHsKIAl1bnNpZ25lZCBod19hcmdjOwogCWludCByZXQ7CiAJc3RydWN0IGRtX3RhcmdldCAqdGkgPSBtLT50aTsKIAotCXN0YXRpYyBzdHJ1Y3QgcGFyYW0gX3BhcmFtc1tdID0geworCXN0YXRpYyBzdHJ1Y3QgZG1fYXJnIF9hcmdzW10gPSB7CiAJCXswLCAxMDI0LCAiaW52YWxpZCBudW1iZXIgb2YgaGFyZHdhcmUgaGFuZGxlciBhcmdzIn0sCiAJfTsKIAotCWlmIChyZWFkX3BhcmFtKF9wYXJhbXMsIHNoaWZ0KGFzKSwgJmh3X2FyZ2MsICZ0aS0+ZXJyb3IpKQorCWlmIChkbV9yZWFkX2FyZ19ncm91cChfYXJncywgYXMsICZod19hcmdjLCAmdGktPmVycm9yKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIWh3X2FyZ2MpCiAJCXJldHVybiAwOwogCi0JaWYgKGh3X2FyZ2MgPiBhcy0+YXJnYykgewotCQl0aS0+ZXJyb3IgPSAibm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGhhcmR3YXJlIGhhbmRsZXIiOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltLT5od19oYW5kbGVyX25hbWUgPSBrc3RyZHVwKHNoaWZ0KGFzKSwgR0ZQX0tFUk5FTCk7CisJbS0+aHdfaGFuZGxlcl9uYW1lID0ga3N0cmR1cChkbV9zaGlmdF9hcmcoYXMpLCBHRlBfS0VSTkVMKTsKIAlyZXF1ZXN0X21vZHVsZSgic2NzaV9kaF8lcyIsIG0tPmh3X2hhbmRsZXJfbmFtZSk7CiAJaWYgKHNjc2lfZGhfaGFuZGxlcl9leGlzdChtLT5od19oYW5kbGVyX25hbWUpID09IDApIHsKIAkJdGktPmVycm9yID0gInVua25vd24gaGFyZHdhcmUgaGFuZGxlciB0eXBlIjsKQEAgLTc3OCw3ICs3MjEsNyBAQAogCQlmb3IgKGkgPSAwLCBwKz1qKzE7IGkgPD0gaHdfYXJnYyAtIDI7IGkrKywgcCs9aisxKQogCQkJaiA9IHNwcmludGYocCwgIiVzIiwgYXMtPmFyZ3ZbaV0pOwogCX0KLQljb25zdW1lKGFzLCBod19hcmdjIC0gMSk7CisJZG1fY29uc3VtZV9hcmdzKGFzLCBod19hcmdjIC0gMSk7CiAKIAlyZXR1cm4gMDsKIGZhaWw6CkBAIC03ODcsMjAgKzczMCwyMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcGFyc2VfZmVhdHVyZXMoc3RydWN0IGFyZ19zZXQgKmFzLCBzdHJ1Y3QgbXVsdGlwYXRoICptKQorc3RhdGljIGludCBwYXJzZV9mZWF0dXJlcyhzdHJ1Y3QgZG1fYXJnX3NldCAqYXMsIHN0cnVjdCBtdWx0aXBhdGggKm0pCiB7CiAJaW50IHI7CiAJdW5zaWduZWQgYXJnYzsKIAlzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSA9IG0tPnRpOwotCWNvbnN0IGNoYXIgKnBhcmFtX25hbWU7CisJY29uc3QgY2hhciAqYXJnX25hbWU7CiAKLQlzdGF0aWMgc3RydWN0IHBhcmFtIF9wYXJhbXNbXSA9IHsKKwlzdGF0aWMgc3RydWN0IGRtX2FyZyBfYXJnc1tdID0gewogCQl7MCwgNSwgImludmFsaWQgbnVtYmVyIG9mIGZlYXR1cmUgYXJncyJ9LAogCQl7MSwgNTAsICJwZ19pbml0X3JldHJpZXMgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDUwIn0sCiAJCXswLCA2MDAwMCwgInBnX2luaXRfZGVsYXlfbXNlY3MgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYwMDAwIn0sCiAJfTsKIAotCXIgPSByZWFkX3BhcmFtKF9wYXJhbXMsIHNoaWZ0KGFzKSwgJmFyZ2MsICZ0aS0+ZXJyb3IpOworCXIgPSBkbV9yZWFkX2FyZ19ncm91cChfYXJncywgYXMsICZhcmdjLCAmdGktPmVycm9yKTsKIAlpZiAocikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTgwOCwyNiArNzUxLDI0IEBACiAJCXJldHVybiAwOwogCiAJZG8gewotCQlwYXJhbV9uYW1lID0gc2hpZnQoYXMpOworCQlhcmdfbmFtZSA9IGRtX3NoaWZ0X2FyZyhhcyk7CiAJCWFyZ2MtLTsKIAotCQlpZiAoIXN0cm5pY21wKHBhcmFtX25hbWUsIE1FU0dfU1RSKCJxdWV1ZV9pZl9ub19wYXRoIikpKSB7CisJCWlmICghc3RyY2FzZWNtcChhcmdfbmFtZSwgInF1ZXVlX2lmX25vX3BhdGgiKSkgewogCQkJciA9IHF1ZXVlX2lmX25vX3BhdGgobSwgMSwgMCk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWlmICghc3RybmljbXAocGFyYW1fbmFtZSwgTUVTR19TVFIoInBnX2luaXRfcmV0cmllcyIpKSAmJgorCQlpZiAoIXN0cmNhc2VjbXAoYXJnX25hbWUsICJwZ19pbml0X3JldHJpZXMiKSAmJgogCQkgICAgKGFyZ2MgPj0gMSkpIHsKLQkJCXIgPSByZWFkX3BhcmFtKF9wYXJhbXMgKyAxLCBzaGlmdChhcyksCi0JCQkJICAgICAgICZtLT5wZ19pbml0X3JldHJpZXMsICZ0aS0+ZXJyb3IpOworCQkJciA9IGRtX3JlYWRfYXJnKF9hcmdzICsgMSwgYXMsICZtLT5wZ19pbml0X3JldHJpZXMsICZ0aS0+ZXJyb3IpOwogCQkJYXJnYy0tOwogCQkJY29udGludWU7CiAJCX0KIAotCQlpZiAoIXN0cm5pY21wKHBhcmFtX25hbWUsIE1FU0dfU1RSKCJwZ19pbml0X2RlbGF5X21zZWNzIikpICYmCisJCWlmICghc3RyY2FzZWNtcChhcmdfbmFtZSwgInBnX2luaXRfZGVsYXlfbXNlY3MiKSAmJgogCQkgICAgKGFyZ2MgPj0gMSkpIHsKLQkJCXIgPSByZWFkX3BhcmFtKF9wYXJhbXMgKyAyLCBzaGlmdChhcyksCi0JCQkJICAgICAgICZtLT5wZ19pbml0X2RlbGF5X21zZWNzLCAmdGktPmVycm9yKTsKKwkJCXIgPSBkbV9yZWFkX2FyZyhfYXJncyArIDIsIGFzLCAmbS0+cGdfaW5pdF9kZWxheV9tc2VjcywgJnRpLT5lcnJvcik7CiAJCQlhcmdjLS07CiAJCQljb250aW51ZTsKIAkJfQpAQCAtODQyLDE1ICs3ODMsMTUgQEAKIHN0YXRpYyBpbnQgbXVsdGlwYXRoX2N0cihzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgdW5zaWduZWQgaW50IGFyZ2MsCiAJCQkgY2hhciAqKmFyZ3YpCiB7Ci0JLyogdGFyZ2V0IHBhcmFtZXRlcnMgKi8KLQlzdGF0aWMgc3RydWN0IHBhcmFtIF9wYXJhbXNbXSA9IHsKKwkvKiB0YXJnZXQgYXJndW1lbnRzICovCisJc3RhdGljIHN0cnVjdCBkbV9hcmcgX2FyZ3NbXSA9IHsKIAkJezAsIDEwMjQsICJpbnZhbGlkIG51bWJlciBvZiBwcmlvcml0eSBncm91cHMifSwKIAkJezAsIDEwMjQsICJpbnZhbGlkIGluaXRpYWwgcHJpb3JpdHkgZ3JvdXAgbnVtYmVyIn0sCiAJfTsKIAogCWludCByOwogCXN0cnVjdCBtdWx0aXBhdGggKm07Ci0Jc3RydWN0IGFyZ19zZXQgYXM7CisJc3RydWN0IGRtX2FyZ19zZXQgYXM7CiAJdW5zaWduZWQgcGdfY291bnQgPSAwOwogCXVuc2lnbmVkIG5leHRfcGdfbnVtOwogCkBAIC04NzEsMTEgKzgxMiwxMSBAQAogCWlmIChyKQogCQlnb3RvIGJhZDsKIAotCXIgPSByZWFkX3BhcmFtKF9wYXJhbXMsIHNoaWZ0KCZhcyksICZtLT5ucl9wcmlvcml0eV9ncm91cHMsICZ0aS0+ZXJyb3IpOworCXIgPSBkbV9yZWFkX2FyZyhfYXJncywgJmFzLCAmbS0+bnJfcHJpb3JpdHlfZ3JvdXBzLCAmdGktPmVycm9yKTsKIAlpZiAocikKIAkJZ290byBiYWQ7CiAKLQlyID0gcmVhZF9wYXJhbShfcGFyYW1zICsgMSwgc2hpZnQoJmFzKSwgJm5leHRfcGdfbnVtLCAmdGktPmVycm9yKTsKKwlyID0gZG1fcmVhZF9hcmcoX2FyZ3MgKyAxLCAmYXMsICZuZXh0X3BnX251bSwgJnRpLT5lcnJvcik7CiAJaWYgKHIpCiAJCWdvdG8gYmFkOwogCkBAIC0xNTA1LDEwICsxNDQ2LDEwIEBACiAJfQogCiAJaWYgKGFyZ2MgPT0gMSkgewotCQlpZiAoIXN0cm5pY21wKGFyZ3ZbMF0sIE1FU0dfU1RSKCJxdWV1ZV9pZl9ub19wYXRoIikpKSB7CisJCWlmICghc3RyY2FzZWNtcChhcmd2WzBdLCAicXVldWVfaWZfbm9fcGF0aCIpKSB7CiAJCQlyID0gcXVldWVfaWZfbm9fcGF0aChtLCAxLCAwKTsKIAkJCWdvdG8gb3V0OwotCQl9IGVsc2UgaWYgKCFzdHJuaWNtcChhcmd2WzBdLCBNRVNHX1NUUigiZmFpbF9pZl9ub19wYXRoIikpKSB7CisJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJndlswXSwgImZhaWxfaWZfbm9fcGF0aCIpKSB7CiAJCQlyID0gcXVldWVfaWZfbm9fcGF0aChtLCAwLCAwKTsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0xNTE5LDE4ICsxNDYwLDE4IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWlmICghc3RybmljbXAoYXJndlswXSwgTUVTR19TVFIoImRpc2FibGVfZ3JvdXAiKSkpIHsKKwlpZiAoIXN0cmNhc2VjbXAoYXJndlswXSwgImRpc2FibGVfZ3JvdXAiKSkgewogCQlyID0gYnlwYXNzX3BnX251bShtLCBhcmd2WzFdLCAxKTsKIAkJZ290byBvdXQ7Ci0JfSBlbHNlIGlmICghc3RybmljbXAoYXJndlswXSwgTUVTR19TVFIoImVuYWJsZV9ncm91cCIpKSkgeworCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJndlswXSwgImVuYWJsZV9ncm91cCIpKSB7CiAJCXIgPSBieXBhc3NfcGdfbnVtKG0sIGFyZ3ZbMV0sIDApOwogCQlnb3RvIG91dDsKLQl9IGVsc2UgaWYgKCFzdHJuaWNtcChhcmd2WzBdLCBNRVNHX1NUUigic3dpdGNoX2dyb3VwIikpKSB7CisJfSBlbHNlIGlmICghc3RyY2FzZWNtcChhcmd2WzBdLCAic3dpdGNoX2dyb3VwIikpIHsKIAkJciA9IHN3aXRjaF9wZ19udW0obSwgYXJndlsxXSk7CiAJCWdvdG8gb3V0OwotCX0gZWxzZSBpZiAoIXN0cm5pY21wKGFyZ3ZbMF0sIE1FU0dfU1RSKCJyZWluc3RhdGVfcGF0aCIpKSkKKwl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZ3ZbMF0sICJyZWluc3RhdGVfcGF0aCIpKQogCQlhY3Rpb24gPSByZWluc3RhdGVfcGF0aDsKLQllbHNlIGlmICghc3RybmljbXAoYXJndlswXSwgTUVTR19TVFIoImZhaWxfcGF0aCIpKSkKKwllbHNlIGlmICghc3RyY2FzZWNtcChhcmd2WzBdLCAiZmFpbF9wYXRoIikpCiAJCWFjdGlvbiA9IGZhaWxfcGF0aDsKIAllbHNlIHsKIAkJRE1XQVJOKCJVbnJlY29nbmlzZWQgbXVsdGlwYXRoIG1lc3NhZ2UgcmVjZWl2ZWQuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXJhaWQuYyBiL2RyaXZlcnMvbWQvZG0tcmFpZC5jCmluZGV4IGU1ZDg5MDQuLmEwMDJkZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tcmFpZC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tcmFpZC5jCkBAIC04LDE5ICs4LDE5IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSAibWQuaCIKKyNpbmNsdWRlICJyYWlkMS5oIgogI2luY2x1ZGUgInJhaWQ1LmgiCi0jaW5jbHVkZSAiZG0uaCIKICNpbmNsdWRlICJiaXRtYXAuaCIKIAorI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KKwogI2RlZmluZSBETV9NU0dfUFJFRklYICJyYWlkIgogCiAvKgotICogSWYgdGhlIE1EIGRvZXNuJ3Qgc3VwcG9ydCBNRF9TWU5DX1NUQVRFX0ZPUkNFRCB5ZXQsIHRoZW4KLSAqIG1ha2UgaXQgc28gdGhlIGZsYWcgZG9lc24ndCBzZXQgYW55dGhpbmcuCisgKiBUaGUgZm9sbG93aW5nIGZsYWdzIGFyZSB1c2VkIGJ5IGRtLXJhaWQuYyB0byBzZXQgdXAgdGhlIGFycmF5IHN0YXRlLgorICogVGhleSBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIG1kX3J1biBpcyBjYWxsZWQuCiAgKi8KLSNpZm5kZWYgTURfU1lOQ19TVEFURV9GT1JDRUQKLSNkZWZpbmUgTURfU1lOQ19TVEFURV9GT1JDRUQgMAotI2VuZGlmCisjZGVmaW5lIEZpcnN0VXNlIDEwICAgICAgICAgICAgIC8qIHJkZXYgZmxhZyAqLwogCiBzdHJ1Y3QgcmFpZF9kZXYgewogCS8qCkBAIC00MywxNCArNDMsMTUgQEAKIC8qCiAgKiBGbGFncyBmb3IgcnMtPnByaW50X2ZsYWdzIGZpZWxkLgogICovCi0jZGVmaW5lIERNUEZfREFFTU9OX1NMRUVQICAgICAgMHgxCi0jZGVmaW5lIERNUEZfTUFYX1dSSVRFX0JFSElORCAgMHgyCi0jZGVmaW5lIERNUEZfU1lOQyAgICAgICAgICAgICAgMHg0Ci0jZGVmaW5lIERNUEZfTk9TWU5DICAgICAgICAgICAgMHg4Ci0jZGVmaW5lIERNUEZfU1RSSVBFX0NBQ0hFICAgICAgMHgxMAotI2RlZmluZSBETVBGX01JTl9SRUNPVkVSWV9SQVRFIDB4MjAKLSNkZWZpbmUgRE1QRl9NQVhfUkVDT1ZFUllfUkFURSAweDQwCi0KKyNkZWZpbmUgRE1QRl9TWU5DICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgRE1QRl9OT1NZTkMgICAgICAgICAgICAweDIKKyNkZWZpbmUgRE1QRl9SRUJVSUxEICAgICAgICAgICAweDQKKyNkZWZpbmUgRE1QRl9EQUVNT05fU0xFRVAgICAgICAweDgKKyNkZWZpbmUgRE1QRl9NSU5fUkVDT1ZFUllfUkFURSAweDEwCisjZGVmaW5lIERNUEZfTUFYX1JFQ09WRVJZX1JBVEUgMHgyMAorI2RlZmluZSBETVBGX01BWF9XUklURV9CRUhJTkQgIDB4NDAKKyNkZWZpbmUgRE1QRl9TVFJJUEVfQ0FDSEUgICAgICAweDgwCisjZGVmaW5lIERNUEZfUkVHSU9OX1NJWkUgICAgICAgMFgxMDAKIHN0cnVjdCByYWlkX3NldCB7CiAJc3RydWN0IGRtX3RhcmdldCAqdGk7CiAKQEAgLTcyLDYgKzczLDcgQEAKIAljb25zdCB1bnNpZ25lZCBsZXZlbDsJCS8qIFJBSUQgbGV2ZWwuICovCiAJY29uc3QgdW5zaWduZWQgYWxnb3JpdGhtOwkvKiBSQUlEIGFsZ29yaXRobS4gKi8KIH0gcmFpZF90eXBlc1tdID0geworCXsicmFpZDEiLCAgICAiUkFJRDEgKG1pcnJvcmluZykiLCAgICAgICAgICAgICAgIDAsIDIsIDEsIDAgLyogTk9ORSAqL30sCiAJeyJyYWlkNCIsICAgICJSQUlENCAoZGVkaWNhdGVkIHBhcml0eSBkaXNrKSIsCTEsIDIsIDUsIEFMR09SSVRITV9QQVJJVFlfMH0sCiAJeyJyYWlkNV9sYSIsICJSQUlENSAobGVmdCBhc3ltbWV0cmljKSIsCQkxLCAyLCA1LCBBTEdPUklUSE1fTEVGVF9BU1lNTUVUUklDfSwKIAl7InJhaWQ1X3JhIiwgIlJBSUQ1IChyaWdodCBhc3ltbWV0cmljKSIsCTEsIDIsIDUsIEFMR09SSVRITV9SSUdIVF9BU1lNTUVUUklDfSwKQEAgLTEwNSw3ICsxMDcsOCBAQAogCX0KIAogCXNlY3RvcnNfcGVyX2RldiA9IHRpLT5sZW47Ci0JaWYgKHNlY3Rvcl9kaXYoc2VjdG9yc19wZXJfZGV2LCAocmFpZF9kZXZzIC0gcmFpZF90eXBlLT5wYXJpdHlfZGV2cykpKSB7CisJaWYgKChyYWlkX3R5cGUtPmxldmVsID4gMSkgJiYKKwkgICAgc2VjdG9yX2RpdihzZWN0b3JzX3Blcl9kZXYsIChyYWlkX2RldnMgLSByYWlkX3R5cGUtPnBhcml0eV9kZXZzKSkpIHsKIAkJdGktPmVycm9yID0gIlRhcmdldCBsZW5ndGggbm90IGRpdmlzaWJsZSBieSBudW1iZXIgb2YgZGF0YSBkZXZpY2VzIjsKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJfQpAQCAtMTQ3LDkgKzE1MCwxNiBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IHJzLT5tZC5yYWlkX2Rpc2tzOyBpKyspCisJZm9yIChpID0gMDsgaSA8IHJzLT5tZC5yYWlkX2Rpc2tzOyBpKyspIHsKKwkJaWYgKHJzLT5kZXZbaV0ubWV0YV9kZXYpCisJCQlkbV9wdXRfZGV2aWNlKHJzLT50aSwgcnMtPmRldltpXS5tZXRhX2Rldik7CisJCWlmIChycy0+ZGV2W2ldLnJkZXYuc2JfcGFnZSkKKwkJCXB1dF9wYWdlKHJzLT5kZXZbaV0ucmRldi5zYl9wYWdlKTsKKwkJcnMtPmRldltpXS5yZGV2LnNiX3BhZ2UgPSBOVUxMOworCQlycy0+ZGV2W2ldLnJkZXYuc2JfbG9hZGVkID0gMDsKIAkJaWYgKHJzLT5kZXZbaV0uZGF0YV9kZXYpCiAJCQlkbV9wdXRfZGV2aWNlKHJzLT50aSwgcnMtPmRldltpXS5kYXRhX2Rldik7CisJfQogCiAJa2ZyZWUocnMpOwogfQpAQCAtMTU5LDcgKzE2OSwxNiBAQAogICogIDxtZXRhX2Rldj46IG1ldGEgZGV2aWNlIG5hbWUgb3IgJy0nIGlmIG1pc3NpbmcKICAqICA8ZGF0YV9kZXY+OiBkYXRhIGRldmljZSBuYW1lIG9yICctJyBpZiBtaXNzaW5nCiAgKgotICogVGhpcyBjb2RlIHBhcnNlcyB0aG9zZSB3b3Jkcy4KKyAqIFRoZSBmb2xsb3dpbmcgYXJlIHBlcm1pdHRlZDoKKyAqICAgIC0gLQorICogICAgLSA8ZGF0YV9kZXY+CisgKiAgICA8bWV0YV9kZXY+IDxkYXRhX2Rldj4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGlzIG5vdCBhbGxvd2VkOgorICogICAgPG1ldGFfZGV2PiAtCisgKgorICogVGhpcyBjb2RlIHBhcnNlcyB0aG9zZSB3b3Jkcy4gIElmIHRoZXJlIGlzIGEgZmFpbHVyZSwKKyAqIHRoZSBjYWxsZXIgbXVzdCB1c2UgY29udGV4dF9mcmVlIHRvIHVud2luZCB0aGUgb3BlcmF0aW9ucy4KICAqLwogc3RhdGljIGludCBkZXZfcGFybXMoc3RydWN0IHJhaWRfc2V0ICpycywgY2hhciAqKmFyZ3YpCiB7CkBAIC0xODIsOCArMjAxLDE2IEBACiAJCXJzLT5kZXZbaV0ucmRldi5tZGRldiA9ICZycy0+bWQ7CiAKIAkJaWYgKHN0cmNtcChhcmd2WzBdLCAiLSIpKSB7Ci0JCQlycy0+dGktPmVycm9yID0gIk1ldGFkYXRhIGRldmljZXMgbm90IHN1cHBvcnRlZCI7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldCA9IGRtX2dldF9kZXZpY2UocnMtPnRpLCBhcmd2WzBdLAorCQkJCQkgICAgZG1fdGFibGVfZ2V0X21vZGUocnMtPnRpLT50YWJsZSksCisJCQkJCSAgICAmcnMtPmRldltpXS5tZXRhX2Rldik7CisJCQlycy0+dGktPmVycm9yID0gIlJBSUQgbWV0YWRhdGEgZGV2aWNlIGxvb2t1cCBmYWlsdXJlIjsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKworCQkJcnMtPmRldltpXS5yZGV2LnNiX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCQkJaWYgKCFycy0+ZGV2W2ldLnJkZXYuc2JfcGFnZSkKKwkJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCiAJCWlmICghc3RyY21wKGFyZ3ZbMV0sICItIikpIHsKQEAgLTE5Myw2ICsyMjAsMTAgQEAKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAorCQkJcnMtPnRpLT5lcnJvciA9ICJObyBkYXRhIGRldmljZSBzdXBwbGllZCB3aXRoIG1ldGFkYXRhIGRldmljZSI7CisJCQlpZiAocnMtPmRldltpXS5tZXRhX2RldikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMjA0LDYgKzIzNSwxMCBAQAogCQkJcmV0dXJuIHJldDsKIAkJfQogCisJCWlmIChycy0+ZGV2W2ldLm1ldGFfZGV2KSB7CisJCQltZXRhZGF0YV9hdmFpbGFibGUgPSAxOworCQkJcnMtPmRldltpXS5yZGV2Lm1ldGFfYmRldiA9IHJzLT5kZXZbaV0ubWV0YV9kZXYtPmJkZXY7CisJCX0KIAkJcnMtPmRldltpXS5yZGV2LmJkZXYgPSBycy0+ZGV2W2ldLmRhdGFfZGV2LT5iZGV2OwogCQlsaXN0X2FkZCgmcnMtPmRldltpXS5yZGV2LnNhbWVfc2V0LCAmcnMtPm1kLmRpc2tzKTsKIAkJaWYgKCF0ZXN0X2JpdChJbl9zeW5jLCAmcnMtPmRldltpXS5yZGV2LmZsYWdzKSkKQEAgLTIzNSwzMyArMjcwLDEwOSBAQAogfQogCiAvKgorICogdmFsaWRhdGVfcmVnaW9uX3NpemUKKyAqIEBycworICogQHJlZ2lvbl9zaXplOiAgcmVnaW9uIHNpemUgaW4gc2VjdG9ycy4gIElmIDAsIHBpY2sgYSBzaXplICg0TWlCIGRlZmF1bHQpLgorICoKKyAqIFNldCBycy0+bWQuYml0bWFwX2luZm8uY2h1bmtzaXplICh3aGljaCByZWFsbHkgcmVmZXJzIHRvICdyZWdpb24gc2l6ZScpLgorICogRW5zdXJlIHRoYXQgKHRpLT5sZW4vcmVnaW9uX3NpemUgPCAyXjIxKSAtIHJlcXVpcmVkIGJ5IE1EIGJpdG1hcC4KKyAqCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCB2YWxpZGF0ZV9yZWdpb25fc2l6ZShzdHJ1Y3QgcmFpZF9zZXQgKnJzLCB1bnNpZ25lZCBsb25nIHJlZ2lvbl9zaXplKQoreworCXVuc2lnbmVkIGxvbmcgbWluX3JlZ2lvbl9zaXplID0gcnMtPnRpLT5sZW4gLyAoMSA8PCAyMSk7CisKKwlpZiAoIXJlZ2lvbl9zaXplKSB7CisJCS8qCisJCSAqIENob29zZSBhIHJlYXNvbmFibGUgZGVmYXVsdC4gIEFsbCBmaWd1cmVzIGluIHNlY3RvcnMuCisJCSAqLworCQlpZiAobWluX3JlZ2lvbl9zaXplID4gKDEgPDwgMTMpKSB7CisJCQlETUlORk8oIkNob29zaW5nIGRlZmF1bHQgcmVnaW9uIHNpemUgb2YgJWx1IHNlY3RvcnMiLAorCQkJICAgICAgIHJlZ2lvbl9zaXplKTsKKwkJCXJlZ2lvbl9zaXplID0gbWluX3JlZ2lvbl9zaXplOworCQl9IGVsc2UgeworCQkJRE1JTkZPKCJDaG9vc2luZyBkZWZhdWx0IHJlZ2lvbiBzaXplIG9mIDRNaUIiKTsKKwkJCXJlZ2lvbl9zaXplID0gMSA8PCAxMzsgLyogc2VjdG9ycyAqLworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVmFsaWRhdGUgdXNlci1zdXBwbGllZCB2YWx1ZS4KKwkJICovCisJCWlmIChyZWdpb25fc2l6ZSA+IHJzLT50aS0+bGVuKSB7CisJCQlycy0+dGktPmVycm9yID0gIlN1cHBsaWVkIHJlZ2lvbiBzaXplIGlzIHRvbyBsYXJnZSI7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChyZWdpb25fc2l6ZSA8IG1pbl9yZWdpb25fc2l6ZSkgeworCQkJRE1FUlIoIlN1cHBsaWVkIHJlZ2lvbl9zaXplICglbHUgc2VjdG9ycykgYmVsb3cgbWluaW11bSAoJWx1KSIsCisJCQkgICAgICByZWdpb25fc2l6ZSwgbWluX3JlZ2lvbl9zaXplKTsKKwkJCXJzLT50aS0+ZXJyb3IgPSAiU3VwcGxpZWQgcmVnaW9uIHNpemUgaXMgdG9vIHNtYWxsIjsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKCFpc19wb3dlcl9vZl8yKHJlZ2lvbl9zaXplKSkgeworCQkJcnMtPnRpLT5lcnJvciA9ICJSZWdpb24gc2l6ZSBpcyBub3QgYSBwb3dlciBvZiAyIjsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKHJlZ2lvbl9zaXplIDwgcnMtPm1kLmNodW5rX3NlY3RvcnMpIHsKKwkJCXJzLT50aS0+ZXJyb3IgPSAiUmVnaW9uIHNpemUgaXMgc21hbGxlciB0aGFuIHRoZSBjaHVuayBzaXplIjsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJLyoKKwkgKiBDb252ZXJ0IHNlY3RvcnMgdG8gYnl0ZXMuCisJICovCisJcnMtPm1kLmJpdG1hcF9pbmZvLmNodW5rc2l6ZSA9IChyZWdpb25fc2l6ZSA8PCA5KTsKKworCXJldHVybiAwOworfQorCisvKgogICogUG9zc2libGUgYXJndW1lbnRzIGFyZS4uLgotICogUkFJRDQ1NjoKICAqCTxjaHVua19zaXplPiBbb3B0aW9uYWxfYXJnc10KICAqCi0gKiBPcHRpb25hbCBhcmdzOgotICogICAgW1tub11zeW5jXQkJCUZvcmNlIG9yIHByZXZlbnQgcmVjb3Zlcnkgb2YgdGhlIGVudGlyZSBhcnJheQorICogQXJndW1lbnQgZGVmaW5pdGlvbnMKKyAqICAgIDxjaHVua19zaXplPgkJCVRoZSBudW1iZXIgb2Ygc2VjdG9ycyBwZXIgZGlzayB0aGF0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBmb3JtIHRoZSAic3RyaXBlIgorICogICAgW1tub11zeW5jXQkJCUZvcmNlIG9yIHByZXZlbnQgcmVjb3Zlcnkgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXJlIGFycmF5CiAgKiAgICBbcmVidWlsZCA8aWR4Pl0JCQlSZWJ1aWxkIHRoZSBkcml2ZSBpbmRpY2F0ZWQgYnkgdGhlIGluZGV4Ci0gKiAgICBbZGFlbW9uX3NsZWVwIDxtcz5dCQlUaW1lIGJldHdlZW4gYml0bWFwIGRhZW1vbiB3b3JrIHRvIGNsZWFyIGJpdHMKKyAqICAgIFtkYWVtb25fc2xlZXAgPG1zPl0JCVRpbWUgYmV0d2VlbiBiaXRtYXAgZGFlbW9uIHdvcmsgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhciBiaXRzCiAgKiAgICBbbWluX3JlY292ZXJ5X3JhdGUgPGtCL3NlYy9kaXNrPl0JVGhyb3R0bGUgUkFJRCBpbml0aWFsaXphdGlvbgogICogICAgW21heF9yZWNvdmVyeV9yYXRlIDxrQi9zZWMvZGlzaz5dCVRocm90dGxlIFJBSUQgaW5pdGlhbGl6YXRpb24KKyAqICAgIFt3cml0ZV9tb3N0bHkgPGlkeD5dCQlJbmRpY2F0ZSBhIHdyaXRlIG1vc3RseSBkcml2ZSB2aWEgaW5kZXgKICAqICAgIFttYXhfd3JpdGVfYmVoaW5kIDxzZWN0b3JzPl0JU2VlICctd3JpdGUtYmVoaW5kPScgKG1hbiBtZGFkbSkKICAqICAgIFtzdHJpcGVfY2FjaGUgPHNlY3RvcnM+XQkJU3RyaXBlIGNhY2hlIHNpemUgZm9yIGhpZ2hlciBSQUlEcworICogICAgW3JlZ2lvbl9zaXplIDxzZWN0b3JzPl0gICAgICAgICAgIERlZmluZXMgZ3JhbnVsYXJpdHkgb2YgYml0bWFwCiAgKi8KIHN0YXRpYyBpbnQgcGFyc2VfcmFpZF9wYXJhbXMoc3RydWN0IHJhaWRfc2V0ICpycywgY2hhciAqKmFyZ3YsCiAJCQkgICAgIHVuc2lnbmVkIG51bV9yYWlkX3BhcmFtcykKIHsKIAl1bnNpZ25lZCBpLCByZWJ1aWxkX2NudCA9IDA7Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlLCByZWdpb25fc2l6ZSA9IDA7CiAJY2hhciAqa2V5OwogCiAJLyoKIAkgKiBGaXJzdCwgcGFyc2UgdGhlIGluLW9yZGVyIHJlcXVpcmVkIGFyZ3VtZW50cworCSAqICJjaHVua19zaXplIiBpcyB0aGUgb25seSBhcmd1bWVudCBvZiB0aGlzIHR5cGUuCiAJICovCi0JaWYgKChzdHJpY3Rfc3RydG91bChhcmd2WzBdLCAxMCwgJnZhbHVlKSA8IDApIHx8Ci0JICAgICFpc19wb3dlcl9vZl8yKHZhbHVlKSB8fCAodmFsdWUgPCA4KSkgeworCWlmICgoc3RyaWN0X3N0cnRvdWwoYXJndlswXSwgMTAsICZ2YWx1ZSkgPCAwKSkgewogCQlycy0+dGktPmVycm9yID0gIkJhZCBjaHVuayBzaXplIjsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmIChycy0+cmFpZF90eXBlLT5sZXZlbCA9PSAxKSB7CisJCWlmICh2YWx1ZSkKKwkJCURNRVJSKCJJZ25vcmluZyBjaHVuayBzaXplIHBhcmFtZXRlciBmb3IgUkFJRCAxIik7CisJCXZhbHVlID0gMDsKKwl9IGVsc2UgaWYgKCFpc19wb3dlcl9vZl8yKHZhbHVlKSkgeworCQlycy0+dGktPmVycm9yID0gIkNodW5rIHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIDIiOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKHZhbHVlIDwgOCkgeworCQlycy0+dGktPmVycm9yID0gIkNodW5rIHNpemUgdmFsdWUgaXMgdG9vIHNtYWxsIjsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJcnMtPm1kLm5ld19jaHVua19zZWN0b3JzID0gcnMtPm1kLmNodW5rX3NlY3RvcnMgPSB2YWx1ZTsKQEAgLTI2OSwyMiArMzgwLDM5IEBACiAJbnVtX3JhaWRfcGFyYW1zLS07CiAKIAkvKgorCSAqIFdlIHNldCBlYWNoIGluZGl2aWR1YWwgZGV2aWNlIGFzIEluX3N5bmMgd2l0aCBhIGNvbXBsZXRlZAorCSAqICdyZWNvdmVyeV9vZmZzZXQnLiAgSWYgdGhlcmUgaGFzIGJlZW4gYSBkZXZpY2UgZmFpbHVyZSBvcgorCSAqIHJlcGxhY2VtZW50IHRoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgYXBwbGllczoKKwkgKgorCSAqICAgMSkgVXNlciBzcGVjaWZpZXMgJ3JlYnVpbGQnLgorCSAqICAgICAgLSBEZXZpY2UgaXMgcmVzZXQgd2hlbiBwYXJhbSBpcyByZWFkLgorCSAqICAgMikgQSBuZXcgZGV2aWNlIGlzIHN1cHBsaWVkLgorCSAqICAgICAgLSBObyBtYXRjaGluZyBzdXBlcmJsb2NrIGZvdW5kLCByZXNldHMgZGV2aWNlLgorCSAqICAgMykgRGV2aWNlIGZhaWx1cmUgd2FzIHRyYW5zaWVudCBhbmQgcmV0dXJucyBvbiByZWxvYWQuCisJICogICAgICAtIEZhaWx1cmUgbm90aWNlZCwgcmVzZXRzIGRldmljZSBmb3IgYml0bWFwIHJlcGxheS4KKwkgKiAgIDQpIERldmljZSBoYWRuJ3QgY29tcGxldGVkIHJlY292ZXJ5IGFmdGVyIHByZXZpb3VzIGZhaWx1cmUuCisJICogICAgICAtIFN1cGVyYmxvY2sgaXMgcmVhZCBhbmQgb3ZlcnJpZGVzIHJlY292ZXJ5X29mZnNldC4KKwkgKgorCSAqIFdoYXQgaXMgZm91bmQgaW4gdGhlIHN1cGVyYmxvY2tzIG9mIHRoZSBkZXZpY2VzIGlzIGFsd2F5cworCSAqIGF1dGhvcml0YXRpdmUsIHVubGVzcyAncmVidWlsZCcgb3IgJ1tub11zeW5jJyB3YXMgc3BlY2lmaWVkLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBycy0+bWQucmFpZF9kaXNrczsgaSsrKSB7CisJCXNldF9iaXQoSW5fc3luYywgJnJzLT5kZXZbaV0ucmRldi5mbGFncyk7CisJCXJzLT5kZXZbaV0ucmRldi5yZWNvdmVyeV9vZmZzZXQgPSBNYXhTZWN0b3I7CisJfQorCisJLyoKIAkgKiBTZWNvbmQsIHBhcnNlIHRoZSB1bm9yZGVyZWQgb3B0aW9uYWwgYXJndW1lbnRzCiAJICovCi0JZm9yIChpID0gMDsgaSA8IHJzLT5tZC5yYWlkX2Rpc2tzOyBpKyspCi0JCXNldF9iaXQoSW5fc3luYywgJnJzLT5kZXZbaV0ucmRldi5mbGFncyk7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgbnVtX3JhaWRfcGFyYW1zOyBpKyspIHsKLQkJaWYgKCFzdHJjbXAoYXJndltpXSwgIm5vc3luYyIpKSB7CisJCWlmICghc3RyY2FzZWNtcChhcmd2W2ldLCAibm9zeW5jIikpIHsKIAkJCXJzLT5tZC5yZWNvdmVyeV9jcCA9IE1heFNlY3RvcjsKIAkJCXJzLT5wcmludF9mbGFncyB8PSBETVBGX05PU1lOQzsKLQkJCXJzLT5tZC5mbGFncyB8PSBNRF9TWU5DX1NUQVRFX0ZPUkNFRDsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWlmICghc3RyY21wKGFyZ3ZbaV0sICJzeW5jIikpIHsKKwkJaWYgKCFzdHJjYXNlY21wKGFyZ3ZbaV0sICJzeW5jIikpIHsKIAkJCXJzLT5tZC5yZWNvdmVyeV9jcCA9IDA7CiAJCQlycy0+cHJpbnRfZmxhZ3MgfD0gRE1QRl9TWU5DOwotCQkJcnMtPm1kLmZsYWdzIHw9IE1EX1NZTkNfU1RBVEVfRk9SQ0VEOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMzAwLDkgKzQyOCwxMyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAotCQlpZiAoIXN0cmNtcChrZXksICJyZWJ1aWxkIikpIHsKLQkJCWlmICgrK3JlYnVpbGRfY250ID4gcnMtPnJhaWRfdHlwZS0+cGFyaXR5X2RldnMpIHsKLQkJCQlycy0+dGktPmVycm9yID0gIlRvbyBtYW55IHJlYnVpbGQgZHJpdmVzIGdpdmVuIjsKKwkJaWYgKCFzdHJjYXNlY21wKGtleSwgInJlYnVpbGQiKSkgeworCQkJcmVidWlsZF9jbnQrKzsKKwkJCWlmICgoKHJzLT5yYWlkX3R5cGUtPmxldmVsICE9IDEpICYmCisJCQkgICAgIChyZWJ1aWxkX2NudCA+IHJzLT5yYWlkX3R5cGUtPnBhcml0eV9kZXZzKSkgfHwKKwkJCSAgICAoKHJzLT5yYWlkX3R5cGUtPmxldmVsID09IDEpICYmCisJCQkgICAgIChyZWJ1aWxkX2NudCA+IChycy0+bWQucmFpZF9kaXNrcyAtIDEpKSkpIHsKKwkJCQlycy0+dGktPmVycm9yID0gIlRvbyBtYW55IHJlYnVpbGQgZGV2aWNlcyBzcGVjaWZpZWQgZm9yIGdpdmVuIFJBSUQgdHlwZSI7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlpZiAodmFsdWUgPiBycy0+bWQucmFpZF9kaXNrcykgewpAQCAtMzExLDcgKzQ0MywyMiBAQAogCQkJfQogCQkJY2xlYXJfYml0KEluX3N5bmMsICZycy0+ZGV2W3ZhbHVlXS5yZGV2LmZsYWdzKTsKIAkJCXJzLT5kZXZbdmFsdWVdLnJkZXYucmVjb3Zlcnlfb2Zmc2V0ID0gMDsKLQkJfSBlbHNlIGlmICghc3RyY21wKGtleSwgIm1heF93cml0ZV9iZWhpbmQiKSkgeworCQkJcnMtPnByaW50X2ZsYWdzIHw9IERNUEZfUkVCVUlMRDsKKwkJfSBlbHNlIGlmICghc3RyY2FzZWNtcChrZXksICJ3cml0ZV9tb3N0bHkiKSkgeworCQkJaWYgKHJzLT5yYWlkX3R5cGUtPmxldmVsICE9IDEpIHsKKwkJCQlycy0+dGktPmVycm9yID0gIndyaXRlX21vc3RseSBvcHRpb24gaXMgb25seSB2YWxpZCBmb3IgUkFJRDEiOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWYgKHZhbHVlID4gcnMtPm1kLnJhaWRfZGlza3MpIHsKKwkJCQlycy0+dGktPmVycm9yID0gIkludmFsaWQgd3JpdGVfbW9zdGx5IGRyaXZlIGluZGV4IGdpdmVuIjsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXNldF9iaXQoV3JpdGVNb3N0bHksICZycy0+ZGV2W3ZhbHVlXS5yZGV2LmZsYWdzKTsKKwkJfSBlbHNlIGlmICghc3RyY2FzZWNtcChrZXksICJtYXhfd3JpdGVfYmVoaW5kIikpIHsKKwkJCWlmIChycy0+cmFpZF90eXBlLT5sZXZlbCAhPSAxKSB7CisJCQkJcnMtPnRpLT5lcnJvciA9ICJtYXhfd3JpdGVfYmVoaW5kIG9wdGlvbiBpcyBvbmx5IHZhbGlkIGZvciBSQUlEMSI7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CiAJCQlycy0+cHJpbnRfZmxhZ3MgfD0gRE1QRl9NQVhfV1JJVEVfQkVISU5EOwogCiAJCQkvKgpAQCAtMzI0LDE0ICs0NzEsMTQgQEAKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCXJzLT5tZC5iaXRtYXBfaW5mby5tYXhfd3JpdGVfYmVoaW5kID0gdmFsdWU7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJkYWVtb25fc2xlZXAiKSkgeworCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGtleSwgImRhZW1vbl9zbGVlcCIpKSB7CiAJCQlycy0+cHJpbnRfZmxhZ3MgfD0gRE1QRl9EQUVNT05fU0xFRVA7CiAJCQlpZiAoIXZhbHVlIHx8ICh2YWx1ZSA+IE1BWF9TQ0hFRFVMRV9USU1FT1VUKSkgewogCQkJCXJzLT50aS0+ZXJyb3IgPSAiZGFlbW9uIHNsZWVwIHBlcmlvZCBvdXQgb2YgcmFuZ2UiOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJcnMtPm1kLmJpdG1hcF9pbmZvLmRhZW1vbl9zbGVlcCA9IHZhbHVlOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAic3RyaXBlX2NhY2hlIikpIHsKKwkJfSBlbHNlIGlmICghc3RyY2FzZWNtcChrZXksICJzdHJpcGVfY2FjaGUiKSkgewogCQkJcnMtPnByaW50X2ZsYWdzIHw9IERNUEZfU1RSSVBFX0NBQ0hFOwogCiAJCQkvKgpAQCAtMzQ4LDIwICs0OTUsMjMgQEAKIAkJCQlycy0+dGktPmVycm9yID0gIkJhZCBzdHJpcGVfY2FjaGUgc2l6ZSI7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJtaW5fcmVjb3ZlcnlfcmF0ZSIpKSB7CisJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoa2V5LCAibWluX3JlY292ZXJ5X3JhdGUiKSkgewogCQkJcnMtPnByaW50X2ZsYWdzIHw9IERNUEZfTUlOX1JFQ09WRVJZX1JBVEU7CiAJCQlpZiAodmFsdWUgPiBJTlRfTUFYKSB7CiAJCQkJcnMtPnRpLT5lcnJvciA9ICJtaW5fcmVjb3ZlcnlfcmF0ZSBvdXQgb2YgcmFuZ2UiOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJcnMtPm1kLnN5bmNfc3BlZWRfbWluID0gKGludCl2YWx1ZTsKLQkJfSBlbHNlIGlmICghc3RyY21wKGtleSwgIm1heF9yZWNvdmVyeV9yYXRlIikpIHsKKwkJfSBlbHNlIGlmICghc3RyY2FzZWNtcChrZXksICJtYXhfcmVjb3ZlcnlfcmF0ZSIpKSB7CiAJCQlycy0+cHJpbnRfZmxhZ3MgfD0gRE1QRl9NQVhfUkVDT1ZFUllfUkFURTsKIAkJCWlmICh2YWx1ZSA+IElOVF9NQVgpIHsKIAkJCQlycy0+dGktPmVycm9yID0gIm1heF9yZWNvdmVyeV9yYXRlIG91dCBvZiByYW5nZSI7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlycy0+bWQuc3luY19zcGVlZF9tYXggPSAoaW50KXZhbHVlOworCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGtleSwgInJlZ2lvbl9zaXplIikpIHsKKwkJCXJzLT5wcmludF9mbGFncyB8PSBETVBGX1JFR0lPTl9TSVpFOworCQkJcmVnaW9uX3NpemUgPSB2YWx1ZTsKIAkJfSBlbHNlIHsKIAkJCURNRVJSKCJVbmFibGUgdG8gcGFyc2UgUkFJRCBwYXJhbWV0ZXI6ICVzIiwga2V5KTsKIAkJCXJzLT50aS0+ZXJyb3IgPSAiVW5hYmxlIHRvIHBhcnNlIFJBSUQgcGFyYW1ldGVycyI7CkBAIC0zNjksNiArNTE5LDE5IEBACiAJCX0KIAl9CiAKKwlpZiAodmFsaWRhdGVfcmVnaW9uX3NpemUocnMsIHJlZ2lvbl9zaXplKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocnMtPm1kLmNodW5rX3NlY3RvcnMpCisJCXJzLT50aS0+c3BsaXRfaW8gPSBycy0+bWQuY2h1bmtfc2VjdG9yczsKKwllbHNlCisJCXJzLT50aS0+c3BsaXRfaW8gPSByZWdpb25fc2l6ZTsKKworCWlmIChycy0+bWQuY2h1bmtfc2VjdG9ycykKKwkJcnMtPnRpLT5zcGxpdF9pbyA9IHJzLT5tZC5jaHVua19zZWN0b3JzOworCWVsc2UKKwkJcnMtPnRpLT5zcGxpdF9pbyA9IHJlZ2lvbl9zaXplOworCiAJLyogQXNzdW1lIHRoZXJlIGFyZSBubyBtZXRhZGF0YSBkZXZpY2VzIHVudGlsIHRoZSBkcml2ZXMgYXJlIHBhcnNlZCAqLwogCXJzLT5tZC5wZXJzaXN0ZW50ID0gMDsKIAlycy0+bWQuZXh0ZXJuYWwgPSAxOwpAQCAtMzg3LDE3ICs1NTAsMzUxIEBACiB7CiAJc3RydWN0IHJhaWRfc2V0ICpycyA9IGNvbnRhaW5lcl9vZihjYiwgc3RydWN0IHJhaWRfc2V0LCBjYWxsYmFja3MpOwogCisJaWYgKHJzLT5yYWlkX3R5cGUtPmxldmVsID09IDEpCisJCXJldHVybiBtZF9yYWlkMV9jb25nZXN0ZWQoJnJzLT5tZCwgYml0cyk7CisKIAlyZXR1cm4gbWRfcmFpZDVfY29uZ2VzdGVkKCZycy0+bWQsIGJpdHMpOwogfQogCiAvKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgbmV2ZXIgcm91dGluZWx5IHVzZWQgYnkgdXNlcnNwYWNlLCB1bmxpa2UgbWQgc3VwZXJibG9ja3MuCisgKiBEZXZpY2VzIHdpdGggdGhpcyBzdXBlcmJsb2NrIHNob3VsZCBvbmx5IGV2ZXIgYmUgYWNjZXNzZWQgdmlhIGRldmljZS1tYXBwZXIuCisgKi8KKyNkZWZpbmUgRE1fUkFJRF9NQUdJQyAweDY0NTI2RDQ0CitzdHJ1Y3QgZG1fcmFpZF9zdXBlcmJsb2NrIHsKKwlfX2xlMzIgbWFnaWM7CQkvKiAiRG1SZCIgKi8KKwlfX2xlMzIgZmVhdHVyZXM7CS8qIFVzZWQgdG8gaW5kaWNhdGUgcG9zc2libGUgZnV0dXJlIGNoYW5nZXMgKi8KKworCV9fbGUzMiBudW1fZGV2aWNlczsJLyogTnVtYmVyIG9mIGRldmljZXMgaW4gdGhpcyBhcnJheS4gKE1heCA2NCkgKi8KKwlfX2xlMzIgYXJyYXlfcG9zaXRpb247CS8qIFRoZSBwb3NpdGlvbiBvZiB0aGlzIGRyaXZlIGluIHRoZSBhcnJheSAqLworCisJX19sZTY0IGV2ZW50czsJCS8qIEluY3JlbWVudGVkIGJ5IG1kIHdoZW4gc3VwZXJibG9jayB1cGRhdGVkICovCisJX19sZTY0IGZhaWxlZF9kZXZpY2VzOwkvKiBCaXQgZmllbGQgb2YgZGV2aWNlcyB0byBpbmRpY2F0ZSBmYWlsdXJlcyAqLworCisJLyoKKwkgKiBUaGlzIG9mZnNldCB0cmFja3MgdGhlIHByb2dyZXNzIG9mIHRoZSByZXBhaXIgb3IgcmVwbGFjZW1lbnQgb2YKKwkgKiBhbiBpbmRpdmlkdWFsIGRyaXZlLgorCSAqLworCV9fbGU2NCBkaXNrX3JlY292ZXJ5X29mZnNldDsKKworCS8qCisJICogVGhpcyBvZmZzZXQgdHJhY2tzIHRoZSBwcm9ncmVzcyBvZiB0aGUgaW5pdGlhbCBhcnJheQorCSAqIHN5bmNocm9uaXNhdGlvbi9wYXJpdHkgY2FsY3VsYXRpb24uCisJICovCisJX19sZTY0IGFycmF5X3Jlc3luY19vZmZzZXQ7CisKKwkvKgorCSAqIFJBSUQgY2hhcmFjdGVyaXN0aWNzCisJICovCisJX19sZTMyIGxldmVsOworCV9fbGUzMiBsYXlvdXQ7CisJX19sZTMyIHN0cmlwZV9zZWN0b3JzOworCisJX191OCBwYWRbNDUyXTsJCS8qIFJvdW5kIHN0cnVjdCB0byA1MTIgYnl0ZXMuICovCisJCQkJLyogQWx3YXlzIHNldCB0byAwIHdoZW4gd3JpdGluZy4gKi8KK30gX19wYWNrZWQ7CisKK3N0YXRpYyBpbnQgcmVhZF9kaXNrX3NiKG1ka19yZGV2X3QgKnJkZXYsIGludCBzaXplKQoreworCUJVR19PTighcmRldi0+c2JfcGFnZSk7CisKKwlpZiAocmRldi0+c2JfbG9hZGVkKQorCQlyZXR1cm4gMDsKKworCWlmICghc3luY19wYWdlX2lvKHJkZXYsIDAsIHNpemUsIHJkZXYtPnNiX3BhZ2UsIFJFQUQsIDEpKSB7CisJCURNRVJSKCJGYWlsZWQgdG8gcmVhZCBkZXZpY2Ugc3VwZXJibG9jayIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZGV2LT5zYl9sb2FkZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN1cGVyX3N5bmMobWRkZXZfdCAqbWRkZXYsIG1ka19yZGV2X3QgKnJkZXYpCit7CisJbWRrX3JkZXZfdCAqciwgKnQ7CisJdWludDY0X3QgZmFpbGVkX2RldmljZXM7CisJc3RydWN0IGRtX3JhaWRfc3VwZXJibG9jayAqc2I7CisKKwlzYiA9IHBhZ2VfYWRkcmVzcyhyZGV2LT5zYl9wYWdlKTsKKwlmYWlsZWRfZGV2aWNlcyA9IGxlNjRfdG9fY3B1KHNiLT5mYWlsZWRfZGV2aWNlcyk7CisKKwlyZGV2X2Zvcl9lYWNoKHIsIHQsIG1kZGV2KQorCQlpZiAoKHItPnJhaWRfZGlzayA+PSAwKSAmJiB0ZXN0X2JpdChGYXVsdHksICZyLT5mbGFncykpCisJCQlmYWlsZWRfZGV2aWNlcyB8PSAoMVVMTCA8PCByLT5yYWlkX2Rpc2spOworCisJbWVtc2V0KHNiLCAwLCBzaXplb2YoKnNiKSk7CisKKwlzYi0+bWFnaWMgPSBjcHVfdG9fbGUzMihETV9SQUlEX01BR0lDKTsKKwlzYi0+ZmVhdHVyZXMgPSBjcHVfdG9fbGUzMigwKTsJLyogTm8gZmVhdHVyZXMgeWV0ICovCisKKwlzYi0+bnVtX2RldmljZXMgPSBjcHVfdG9fbGUzMihtZGRldi0+cmFpZF9kaXNrcyk7CisJc2ItPmFycmF5X3Bvc2l0aW9uID0gY3B1X3RvX2xlMzIocmRldi0+cmFpZF9kaXNrKTsKKworCXNiLT5ldmVudHMgPSBjcHVfdG9fbGU2NChtZGRldi0+ZXZlbnRzKTsKKwlzYi0+ZmFpbGVkX2RldmljZXMgPSBjcHVfdG9fbGU2NChmYWlsZWRfZGV2aWNlcyk7CisKKwlzYi0+ZGlza19yZWNvdmVyeV9vZmZzZXQgPSBjcHVfdG9fbGU2NChyZGV2LT5yZWNvdmVyeV9vZmZzZXQpOworCXNiLT5hcnJheV9yZXN5bmNfb2Zmc2V0ID0gY3B1X3RvX2xlNjQobWRkZXYtPnJlY292ZXJ5X2NwKTsKKworCXNiLT5sZXZlbCA9IGNwdV90b19sZTMyKG1kZGV2LT5sZXZlbCk7CisJc2ItPmxheW91dCA9IGNwdV90b19sZTMyKG1kZGV2LT5sYXlvdXQpOworCXNiLT5zdHJpcGVfc2VjdG9ycyA9IGNwdV90b19sZTMyKG1kZGV2LT5jaHVua19zZWN0b3JzKTsKK30KKworLyoKKyAqIHN1cGVyX2xvYWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBzdXBlcmJsb2NrIGlmIG9uZSBpcyBub3QgZm91bmQgb24gdGhlIGRldmljZQorICogYW5kIHdpbGwgZGVjaWRlIHdoaWNoIHN1cGVyYmxvY2sgdG8gdXNlIGlmIHRoZXJlJ3MgYSBjaG9pY2UuCisgKgorICogUmV0dXJuOiAxIGlmIHVzZSByZGV2LCAwIGlmIHVzZSByZWZkZXYsIC1FeHh4IG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IHN1cGVyX2xvYWQobWRrX3JkZXZfdCAqcmRldiwgbWRrX3JkZXZfdCAqcmVmZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IGRtX3JhaWRfc3VwZXJibG9jayAqc2I7CisJc3RydWN0IGRtX3JhaWRfc3VwZXJibG9jayAqcmVmc2I7CisJdWludDY0X3QgZXZlbnRzX3NiLCBldmVudHNfcmVmc2I7CisKKwlyZGV2LT5zYl9zdGFydCA9IDA7CisJcmRldi0+c2Jfc2l6ZSA9IHNpemVvZigqc2IpOworCisJcmV0ID0gcmVhZF9kaXNrX3NiKHJkZXYsIHJkZXYtPnNiX3NpemUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzYiA9IHBhZ2VfYWRkcmVzcyhyZGV2LT5zYl9wYWdlKTsKKwlpZiAoc2ItPm1hZ2ljICE9IGNwdV90b19sZTMyKERNX1JBSURfTUFHSUMpKSB7CisJCXN1cGVyX3N5bmMocmRldi0+bWRkZXYsIHJkZXYpOworCisJCXNldF9iaXQoRmlyc3RVc2UsICZyZGV2LT5mbGFncyk7CisKKwkJLyogRm9yY2Ugd3JpdGluZyBvZiBzdXBlcmJsb2NrcyB0byBkaXNrICovCisJCXNldF9iaXQoTURfQ0hBTkdFX0RFVlMsICZyZGV2LT5tZGRldi0+ZmxhZ3MpOworCisJCS8qIEFueSBzdXBlcmJsb2NrIGlzIGJldHRlciB0aGFuIG5vbmUsIGNob29zZSB0aGF0IGlmIGdpdmVuICovCisJCXJldHVybiByZWZkZXYgPyAwIDogMTsKKwl9CisKKwlpZiAoIXJlZmRldikKKwkJcmV0dXJuIDE7CisKKwlldmVudHNfc2IgPSBsZTY0X3RvX2NwdShzYi0+ZXZlbnRzKTsKKworCXJlZnNiID0gcGFnZV9hZGRyZXNzKHJlZmRldi0+c2JfcGFnZSk7CisJZXZlbnRzX3JlZnNiID0gbGU2NF90b19jcHUocmVmc2ItPmV2ZW50cyk7CisKKwlyZXR1cm4gKGV2ZW50c19zYiA+IGV2ZW50c19yZWZzYikgPyAxIDogMDsKK30KKworc3RhdGljIGludCBzdXBlcl9pbml0X3ZhbGlkYXRpb24obWRkZXZfdCAqbWRkZXYsIG1ka19yZGV2X3QgKnJkZXYpCit7CisJaW50IHJvbGU7CisJc3RydWN0IHJhaWRfc2V0ICpycyA9IGNvbnRhaW5lcl9vZihtZGRldiwgc3RydWN0IHJhaWRfc2V0LCBtZCk7CisJdWludDY0X3QgZXZlbnRzX3NiOworCXVpbnQ2NF90IGZhaWxlZF9kZXZpY2VzOworCXN0cnVjdCBkbV9yYWlkX3N1cGVyYmxvY2sgKnNiOworCXVpbnQzMl90IG5ld19kZXZzID0gMDsKKwl1aW50MzJfdCByZWJ1aWxkcyA9IDA7CisJbWRrX3JkZXZfdCAqciwgKnQ7CisJc3RydWN0IGRtX3JhaWRfc3VwZXJibG9jayAqc2IyOworCisJc2IgPSBwYWdlX2FkZHJlc3MocmRldi0+c2JfcGFnZSk7CisJZXZlbnRzX3NiID0gbGU2NF90b19jcHUoc2ItPmV2ZW50cyk7CisJZmFpbGVkX2RldmljZXMgPSBsZTY0X3RvX2NwdShzYi0+ZmFpbGVkX2RldmljZXMpOworCisJLyoKKwkgKiBJbml0aWFsaXNlIHRvIDEgaWYgdGhpcyBpcyBhIG5ldyBzdXBlcmJsb2NrLgorCSAqLworCW1kZGV2LT5ldmVudHMgPSBldmVudHNfc2IgPyA6IDE7CisKKwkvKgorCSAqIFJlc2hhcGluZyBpcyBub3QgY3VycmVudGx5IGFsbG93ZWQKKwkgKi8KKwlpZiAoKGxlMzJfdG9fY3B1KHNiLT5sZXZlbCkgIT0gbWRkZXYtPmxldmVsKSB8fAorCSAgICAobGUzMl90b19jcHUoc2ItPmxheW91dCkgIT0gbWRkZXYtPmxheW91dCkgfHwKKwkgICAgKGxlMzJfdG9fY3B1KHNiLT5zdHJpcGVfc2VjdG9ycykgIT0gbWRkZXYtPmNodW5rX3NlY3RvcnMpKSB7CisJCURNRVJSKCJSZXNoYXBpbmcgYXJyYXlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBXZSBjYW4gb25seSBjaGFuZ2UgdGhlIG51bWJlciBvZiBkZXZpY2VzIGluIFJBSUQxIHJpZ2h0IG5vdyAqLworCWlmICgocnMtPnJhaWRfdHlwZS0+bGV2ZWwgIT0gMSkgJiYKKwkgICAgKGxlMzJfdG9fY3B1KHNiLT5udW1fZGV2aWNlcykgIT0gbWRkZXYtPnJhaWRfZGlza3MpKSB7CisJCURNRVJSKCJSZXNoYXBpbmcgYXJyYXlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIShycy0+cHJpbnRfZmxhZ3MgJiAoRE1QRl9TWU5DIHwgRE1QRl9OT1NZTkMpKSkKKwkJbWRkZXYtPnJlY292ZXJ5X2NwID0gbGU2NF90b19jcHUoc2ItPmFycmF5X3Jlc3luY19vZmZzZXQpOworCisJLyoKKwkgKiBEdXJpbmcgbG9hZCwgd2Ugc2V0IEZpcnN0VXNlIGlmIGEgbmV3IHN1cGVyYmxvY2sgd2FzIHdyaXR0ZW4uCisJICogVGhlcmUgYXJlIHR3byByZWFzb25zIHdlIG1pZ2h0IG5vdCBoYXZlIGEgc3VwZXJibG9jazoKKwkgKiAxKSBUaGUgYXJyYXkgaXMgYnJhbmQgbmV3IC0gaW4gd2hpY2ggY2FzZSwgYWxsIG9mIHRoZQorCSAqICAgIGRldmljZXMgbXVzdCBoYXZlIHRoZWlyIEluX3N5bmMgYml0IHNldC4gIEFsc28sCisJICogICAgcmVjb3ZlcnlfY3AgbXVzdCBiZSAwLCB1bmxlc3MgZm9yY2VkLgorCSAqIDIpIFRoaXMgaXMgYSBuZXcgZGV2aWNlIGJlaW5nIGFkZGVkIHRvIGFuIG9sZCBhcnJheQorCSAqICAgIGFuZCB0aGUgbmV3IGRldmljZSBuZWVkcyB0byBiZSByZWJ1aWx0IC0gaW4gd2hpY2gKKwkgKiAgICBjYXNlIHRoZSBJbl9zeW5jIGJpdCB3aWxsIC9ub3QvIGJlIHNldCBhbmQKKwkgKiAgICByZWNvdmVyeV9jcCBtdXN0IGJlIE1heFNlY3Rvci4KKwkgKi8KKwlyZGV2X2Zvcl9lYWNoKHIsIHQsIG1kZGV2KSB7CisJCWlmICghdGVzdF9iaXQoSW5fc3luYywgJnItPmZsYWdzKSkgeworCQkJaWYgKCF0ZXN0X2JpdChGaXJzdFVzZSwgJnItPmZsYWdzKSkKKwkJCQlETUVSUigiU3VwZXJibG9jayBhcmVhIG9mICIKKwkJCQkgICAgICAicmVidWlsZCBkZXZpY2UgJWQgc2hvdWxkIGhhdmUgYmVlbiAiCisJCQkJICAgICAgImNsZWFyZWQuIiwgci0+cmFpZF9kaXNrKTsKKwkJCXNldF9iaXQoRmlyc3RVc2UsICZyLT5mbGFncyk7CisJCQlyZWJ1aWxkcysrOworCQl9IGVsc2UgaWYgKHRlc3RfYml0KEZpcnN0VXNlLCAmci0+ZmxhZ3MpKQorCQkJbmV3X2RldnMrKzsKKwl9CisKKwlpZiAoIXJlYnVpbGRzKSB7CisJCWlmIChuZXdfZGV2cyA9PSBtZGRldi0+cmFpZF9kaXNrcykgeworCQkJRE1JTkZPKCJTdXBlcmJsb2NrcyBjcmVhdGVkIGZvciBuZXcgYXJyYXkiKTsKKwkJCXNldF9iaXQoTURfQVJSQVlfRklSU1RfVVNFLCAmbWRkZXYtPmZsYWdzKTsKKwkJfSBlbHNlIGlmIChuZXdfZGV2cykgeworCQkJRE1FUlIoIk5ldyBkZXZpY2UgaW5qZWN0ZWQgIgorCQkJICAgICAgImludG8gZXhpc3RpbmcgYXJyYXkgd2l0aG91dCAncmVidWlsZCcgIgorCQkJICAgICAgInBhcmFtZXRlciBzcGVjaWZpZWQiKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIGlmIChuZXdfZGV2cykgeworCQlETUVSUigiJ3JlYnVpbGQnIGRldmljZXMgY2Fubm90IGJlICIKKwkJICAgICAgImluamVjdGVkIGludG8gYW4gYXJyYXkgd2l0aCBvdGhlciBmaXJzdC10aW1lIGRldmljZXMiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmIChtZGRldi0+cmVjb3ZlcnlfY3AgIT0gTWF4U2VjdG9yKSB7CisJCURNRVJSKCIncmVidWlsZCcgc3BlY2lmaWVkIHdoaWxlIGFycmF5IGlzIG5vdCBpbi1zeW5jIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogTm93IHdlIHNldCB0aGUgRmF1bHR5IGJpdCBmb3IgdGhvc2UgZGV2aWNlcyB0aGF0IGFyZQorCSAqIHJlY29yZGVkIGluIHRoZSBzdXBlcmJsb2NrIGFzIGZhaWxlZC4KKwkgKi8KKwlyZGV2X2Zvcl9lYWNoKHIsIHQsIG1kZGV2KSB7CisJCWlmICghci0+c2JfcGFnZSkKKwkJCWNvbnRpbnVlOworCQlzYjIgPSBwYWdlX2FkZHJlc3Moci0+c2JfcGFnZSk7CisJCXNiMi0+ZmFpbGVkX2RldmljZXMgPSAwOworCisJCS8qCisJCSAqIENoZWNrIGZvciBhbnkgZGV2aWNlIHJlLW9yZGVyaW5nLgorCQkgKi8KKwkJaWYgKCF0ZXN0X2JpdChGaXJzdFVzZSwgJnItPmZsYWdzKSAmJiAoci0+cmFpZF9kaXNrID49IDApKSB7CisJCQlyb2xlID0gbGUzMl90b19jcHUoc2IyLT5hcnJheV9wb3NpdGlvbik7CisJCQlpZiAocm9sZSAhPSByLT5yYWlkX2Rpc2spIHsKKwkJCQlpZiAocnMtPnJhaWRfdHlwZS0+bGV2ZWwgIT0gMSkgeworCQkJCQlycy0+dGktPmVycm9yID0gIkNhbm5vdCBjaGFuZ2UgZGV2aWNlICIKKwkJCQkJCSJwb3NpdGlvbnMgaW4gUkFJRCBhcnJheSI7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKwkJCQlETUlORk8oIlJBSUQxIGRldmljZSAjJWQgbm93IGF0IHBvc2l0aW9uICMlZCIsCisJCQkJICAgICAgIHJvbGUsIHItPnJhaWRfZGlzayk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBQYXJ0aWFsIHJlY292ZXJ5IGlzIHBlcmZvcm1lZCBvbgorCQkJICogcmV0dXJuaW5nIGZhaWxlZCBkZXZpY2VzLgorCQkJICovCisJCQlpZiAoZmFpbGVkX2RldmljZXMgJiAoMSA8PCByb2xlKSkKKwkJCQlzZXRfYml0KEZhdWx0eSwgJnItPmZsYWdzKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN1cGVyX3ZhbGlkYXRlKG1kZGV2X3QgKm1kZGV2LCBtZGtfcmRldl90ICpyZGV2KQoreworCXN0cnVjdCBkbV9yYWlkX3N1cGVyYmxvY2sgKnNiID0gcGFnZV9hZGRyZXNzKHJkZXYtPnNiX3BhZ2UpOworCisJLyoKKwkgKiBJZiBtZGRldi0+ZXZlbnRzIGlzIG5vdCBzZXQsIHdlIGtub3cgd2UgaGF2ZSBub3QgeWV0IGluaXRpYWxpemVkCisJICogdGhlIGFycmF5LgorCSAqLworCWlmICghbWRkZXYtPmV2ZW50cyAmJiBzdXBlcl9pbml0X3ZhbGlkYXRpb24obWRkZXYsIHJkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1kZGV2LT5iaXRtYXBfaW5mby5vZmZzZXQgPSA0MDk2ID4+IDk7IC8qIEVuYWJsZSBiaXRtYXAgY3JlYXRpb24gKi8KKwlyZGV2LT5tZGRldi0+Yml0bWFwX2luZm8uZGVmYXVsdF9vZmZzZXQgPSA0MDk2ID4+IDk7CisJaWYgKCF0ZXN0X2JpdChGaXJzdFVzZSwgJnJkZXYtPmZsYWdzKSkgeworCQlyZGV2LT5yZWNvdmVyeV9vZmZzZXQgPSBsZTY0X3RvX2NwdShzYi0+ZGlza19yZWNvdmVyeV9vZmZzZXQpOworCQlpZiAocmRldi0+cmVjb3Zlcnlfb2Zmc2V0ICE9IE1heFNlY3RvcikKKwkJCWNsZWFyX2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpOworCX0KKworCS8qCisJICogSWYgYSBkZXZpY2UgY29tZXMgYmFjaywgc2V0IGl0IGFzIG5vdCBJbl9zeW5jIGFuZCBubyBsb25nZXIgZmF1bHR5LgorCSAqLworCWlmICh0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpIHsKKwkJY2xlYXJfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKTsKKwkJY2xlYXJfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncyk7CisJCXJkZXYtPnNhdmVkX3JhaWRfZGlzayA9IHJkZXYtPnJhaWRfZGlzazsKKwkJcmRldi0+cmVjb3Zlcnlfb2Zmc2V0ID0gMDsKKwl9CisKKwljbGVhcl9iaXQoRmlyc3RVc2UsICZyZGV2LT5mbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFuYWx5c2Ugc3VwZXJibG9ja3MgYW5kIHNlbGVjdCB0aGUgZnJlc2hlc3QuCisgKi8KK3N0YXRpYyBpbnQgYW5hbHlzZV9zdXBlcmJsb2NrcyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IHJhaWRfc2V0ICpycykKK3sKKwlpbnQgcmV0OworCW1ka19yZGV2X3QgKnJkZXYsICpmcmVzaGVzdCwgKnRtcDsKKwltZGRldl90ICptZGRldiA9ICZycy0+bWQ7CisKKwlmcmVzaGVzdCA9IE5VTEw7CisJcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KSB7CisJCWlmICghcmRldi0+bWV0YV9iZGV2KQorCQkJY29udGludWU7CisKKwkJcmV0ID0gc3VwZXJfbG9hZChyZGV2LCBmcmVzaGVzdCk7CisKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAxOgorCQkJZnJlc2hlc3QgPSByZGV2OworCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdGktPmVycm9yID0gIkZhaWxlZCB0byBsb2FkIHN1cGVyYmxvY2siOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWlmICghZnJlc2hlc3QpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBWYWxpZGF0aW9uIG9mIHRoZSBmcmVzaGVzdCBkZXZpY2UgcHJvdmlkZXMgdGhlIHNvdXJjZSBvZgorCSAqIHZhbGlkYXRpb24gZm9yIHRoZSByZW1haW5pbmcgZGV2aWNlcy4KKwkgKi8KKwl0aS0+ZXJyb3IgPSAiVW5hYmxlIHRvIGFzc2VtYmxlIGFycmF5OiBJbnZhbGlkIHN1cGVyYmxvY2tzIjsKKwlpZiAoc3VwZXJfdmFsaWRhdGUobWRkZXYsIGZyZXNoZXN0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpCisJCWlmICgocmRldiAhPSBmcmVzaGVzdCkgJiYgc3VwZXJfdmFsaWRhdGUobWRkZXYsIHJkZXYpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworLyoKICAqIENvbnN0cnVjdCBhIFJBSUQ0LzUvNiBtYXBwaW5nOgogICogQXJnczoKICAqCTxyYWlkX3R5cGU+IDwjcmFpZF9wYXJhbXM+IDxyYWlkX3BhcmFtcz4JCVwKICAqCTwjcmFpZF9kZXZzPiB7IDxtZXRhX2RldjE+IDxkZXYxPiAuLiA8bWV0YV9kZXZOPiA8ZGV2Tj4gfQogICoKLSAqICoqIG1ldGFkYXRhIGRldmljZXMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LCB1c2UgJy0nIGluc3RlYWQgKioKLSAqCiAgKiA8cmFpZF9wYXJhbXM+IHZhcmllcyBieSA8cmFpZF90eXBlPi4gIFNlZSAncGFyc2VfcmFpZF9wYXJhbXMnIGZvcgogICogZGV0YWlscyBvbiBwb3NzaWJsZSA8cmFpZF9wYXJhbXM+LgogICovCkBAIC00NjUsOCArOTYyLDEyIEBACiAJaWYgKHJldCkKIAkJZ290byBiYWQ7CiAKKwlycy0+bWQuc3luY19zdXBlciA9IHN1cGVyX3N5bmM7CisJcmV0ID0gYW5hbHlzZV9zdXBlcmJsb2Nrcyh0aSwgcnMpOworCWlmIChyZXQpCisJCWdvdG8gYmFkOworCiAJSU5JVF9XT1JLKCZycy0+bWQuZXZlbnRfd29yaywgZG9fdGFibGVfZXZlbnQpOwotCXRpLT5zcGxpdF9pbyA9IHJzLT5tZC5jaHVua19zZWN0b3JzOwogCXRpLT5wcml2YXRlID0gcnM7CiAKIAltdXRleF9sb2NrKCZycy0+bWQucmVjb25maWdfbXV0ZXgpOwpAQCAtNDgyLDYgKzk4Myw3IEBACiAJcnMtPmNhbGxiYWNrcy5jb25nZXN0ZWRfZm4gPSByYWlkX2lzX2Nvbmdlc3RlZDsKIAlkbV90YWJsZV9hZGRfdGFyZ2V0X2NhbGxiYWNrcyh0aS0+dGFibGUsICZycy0+Y2FsbGJhY2tzKTsKIAorCW1kZGV2X3N1c3BlbmQoJnJzLT5tZCk7CiAJcmV0dXJuIDA7CiAKIGJhZDoKQEAgLTU0NiwxMiArMTA0OCwxNyBAQAogCQlicmVhazsKIAljYXNlIFNUQVRVU1RZUEVfVEFCTEU6CiAJCS8qIFRoZSBzdHJpbmcgeW91IHdvdWxkIHVzZSB0byBjb25zdHJ1Y3QgdGhpcyBhcnJheSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgcnMtPm1kLnJhaWRfZGlza3M7IGkrKykKLQkJCWlmIChycy0+ZGV2W2ldLmRhdGFfZGV2ICYmCisJCWZvciAoaSA9IDA7IGkgPCBycy0+bWQucmFpZF9kaXNrczsgaSsrKSB7CisJCQlpZiAoKHJzLT5wcmludF9mbGFncyAmIERNUEZfUkVCVUlMRCkgJiYKKwkJCSAgICBycy0+ZGV2W2ldLmRhdGFfZGV2ICYmCiAJCQkgICAgIXRlc3RfYml0KEluX3N5bmMsICZycy0+ZGV2W2ldLnJkZXYuZmxhZ3MpKQotCQkJCXJhaWRfcGFyYW1fY250Kys7IC8qIGZvciByZWJ1aWxkcyAqLworCQkJCXJhaWRfcGFyYW1fY250ICs9IDI7IC8qIGZvciByZWJ1aWxkcyAqLworCQkJaWYgKHJzLT5kZXZbaV0uZGF0YV9kZXYgJiYKKwkJCSAgICB0ZXN0X2JpdChXcml0ZU1vc3RseSwgJnJzLT5kZXZbaV0ucmRldi5mbGFncykpCisJCQkJcmFpZF9wYXJhbV9jbnQgKz0gMjsKKwkJfQogCi0JCXJhaWRfcGFyYW1fY250ICs9IChod2VpZ2h0NjQocnMtPnByaW50X2ZsYWdzKSAqIDIpOworCQlyYWlkX3BhcmFtX2NudCArPSAoaHdlaWdodDY0KHJzLT5wcmludF9mbGFncyAmIH5ETVBGX1JFQlVJTEQpICogMik7CiAJCWlmIChycy0+cHJpbnRfZmxhZ3MgJiAoRE1QRl9TWU5DIHwgRE1QRl9OT1NZTkMpKQogCQkJcmFpZF9wYXJhbV9jbnQtLTsKIApAQCAtNTY1LDcgKzEwNzIsOCBAQAogCQkJRE1FTUlUKCIgbm9zeW5jIik7CiAKIAkJZm9yIChpID0gMDsgaSA8IHJzLT5tZC5yYWlkX2Rpc2tzOyBpKyspCi0JCQlpZiAocnMtPmRldltpXS5kYXRhX2RldiAmJgorCQkJaWYgKChycy0+cHJpbnRfZmxhZ3MgJiBETVBGX1JFQlVJTEQpICYmCisJCQkgICAgcnMtPmRldltpXS5kYXRhX2RldiAmJgogCQkJICAgICF0ZXN0X2JpdChJbl9zeW5jLCAmcnMtPmRldltpXS5yZGV2LmZsYWdzKSkKIAkJCQlETUVNSVQoIiByZWJ1aWxkICV1IiwgaSk7CiAKQEAgLTU3OSw2ICsxMDg3LDExIEBACiAJCWlmIChycy0+cHJpbnRfZmxhZ3MgJiBETVBGX01BWF9SRUNPVkVSWV9SQVRFKQogCQkJRE1FTUlUKCIgbWF4X3JlY292ZXJ5X3JhdGUgJWQiLCBycy0+bWQuc3luY19zcGVlZF9tYXgpOwogCisJCWZvciAoaSA9IDA7IGkgPCBycy0+bWQucmFpZF9kaXNrczsgaSsrKQorCQkJaWYgKHJzLT5kZXZbaV0uZGF0YV9kZXYgJiYKKwkJCSAgICB0ZXN0X2JpdChXcml0ZU1vc3RseSwgJnJzLT5kZXZbaV0ucmRldi5mbGFncykpCisJCQkJRE1FTUlUKCIgd3JpdGVfbW9zdGx5ICV1IiwgaSk7CisKIAkJaWYgKHJzLT5wcmludF9mbGFncyAmIERNUEZfTUFYX1dSSVRFX0JFSElORCkKIAkJCURNRU1JVCgiIG1heF93cml0ZV9iZWhpbmQgJWx1IiwKIAkJCSAgICAgICBycy0+bWQuYml0bWFwX2luZm8ubWF4X3dyaXRlX2JlaGluZCk7CkBAIC01OTEsOSArMTEwNCwxNiBAQAogCQkJICAgICAgIGNvbmYgPyBjb25mLT5tYXhfbnJfc3RyaXBlcyAqIDIgOiAwKTsKIAkJfQogCisJCWlmIChycy0+cHJpbnRfZmxhZ3MgJiBETVBGX1JFR0lPTl9TSVpFKQorCQkJRE1FTUlUKCIgcmVnaW9uX3NpemUgJWx1IiwKKwkJCSAgICAgICBycy0+bWQuYml0bWFwX2luZm8uY2h1bmtzaXplID4+IDkpOworCiAJCURNRU1JVCgiICVkIiwgcnMtPm1kLnJhaWRfZGlza3MpOwogCQlmb3IgKGkgPSAwOyBpIDwgcnMtPm1kLnJhaWRfZGlza3M7IGkrKykgewotCQkJRE1FTUlUKCIgLSIpOyAvKiBtZXRhZGF0YSBkZXZpY2UgKi8KKwkJCWlmIChycy0+ZGV2W2ldLm1ldGFfZGV2KQorCQkJCURNRU1JVCgiICVzIiwgcnMtPmRldltpXS5tZXRhX2Rldi0+bmFtZSk7CisJCQllbHNlCisJCQkJRE1FTUlUKCIgLSIpOwogCiAJCQlpZiAocnMtPmRldltpXS5kYXRhX2RldikKIAkJCQlETUVNSVQoIiAlcyIsIHJzLT5kZXZbaV0uZGF0YV9kZXYtPm5hbWUpOwpAQCAtNjUwLDEyICsxMTcwLDEzIEBACiB7CiAJc3RydWN0IHJhaWRfc2V0ICpycyA9IHRpLT5wcml2YXRlOwogCisJYml0bWFwX2xvYWQoJnJzLT5tZCk7CiAJbWRkZXZfcmVzdW1lKCZycy0+bWQpOwogfQogCiBzdGF0aWMgc3RydWN0IHRhcmdldF90eXBlIHJhaWRfdGFyZ2V0ID0gewogCS5uYW1lID0gInJhaWQiLAotCS52ZXJzaW9uID0gezEsIDAsIDB9LAorCS52ZXJzaW9uID0gezEsIDEsIDB9LAogCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKIAkuY3RyID0gcmFpZF9jdHIsCiAJLmR0ciA9IHJhaWRfZHRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1zbmFwLXBlcnNpc3RlbnQuYyBiL2RyaXZlcnMvbWQvZG0tc25hcC1wZXJzaXN0ZW50LmMKaW5kZXggMTM1YzJmMS4uZDFmMWQ3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1zbmFwLXBlcnNpc3RlbnQuYworKysgYi9kcml2ZXJzL21kL2RtLXNuYXAtcGVyc2lzdGVudC5jCkBAIC01OCwyNSArNTgsMzAgQEAKICNkZWZpbmUgTlVNX1NOQVBTSE9UX0hEUl9DSFVOS1MgMQogCiBzdHJ1Y3QgZGlza19oZWFkZXIgewotCXVpbnQzMl90IG1hZ2ljOworCV9fbGUzMiBtYWdpYzsKIAogCS8qCiAJICogSXMgdGhpcyBzbmFwc2hvdCB2YWxpZC4gIFRoZXJlIGlzIG5vIHdheSBvZiByZWNvdmVyaW5nCiAJICogYW4gaW52YWxpZCBzbmFwc2hvdC4KIAkgKi8KLQl1aW50MzJfdCB2YWxpZDsKKwlfX2xlMzIgdmFsaWQ7CiAKIAkvKgogCSAqIFNpbXBsZSwgaW5jcmVtZW50aW5nIHZlcnNpb24uIG5vIGJhY2t3YXJkCiAJICogY29tcGF0aWJpbGl0eS4KIAkgKi8KLQl1aW50MzJfdCB2ZXJzaW9uOworCV9fbGUzMiB2ZXJzaW9uOwogCiAJLyogSW4gc2VjdG9ycyAqLwotCXVpbnQzMl90IGNodW5rX3NpemU7Ci19OworCV9fbGUzMiBjaHVua19zaXplOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGRpc2tfZXhjZXB0aW9uIHsKKwlfX2xlNjQgb2xkX2NodW5rOworCV9fbGU2NCBuZXdfY2h1bms7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgY29yZV9leGNlcHRpb24gewogCXVpbnQ2NF90IG9sZF9jaHVuazsKIAl1aW50NjRfdCBuZXdfY2h1bms7CiB9OwpAQCAtMTY5LDEwICsxNzQsOSBAQAogCWlmICghcHMtPmFyZWEpCiAJCWdvdG8gZXJyX2FyZWE7CiAKLQlwcy0+emVyb19hcmVhID0gdm1hbGxvYyhsZW4pOworCXBzLT56ZXJvX2FyZWEgPSB2emFsbG9jKGxlbik7CiAJaWYgKCFwcy0+emVyb19hcmVhKQogCQlnb3RvIGVycl96ZXJvX2FyZWE7Ci0JbWVtc2V0KHBzLT56ZXJvX2FyZWEsIDAsIGxlbik7CiAKIAlwcy0+aGVhZGVyX2FyZWEgPSB2bWFsbG9jKGxlbik7CiAJaWYgKCFwcy0+aGVhZGVyX2FyZWEpCkBAIC0zOTYsMzIgKzQwMCwzMiBAQAogfQogCiBzdGF0aWMgdm9pZCByZWFkX2V4Y2VwdGlvbihzdHJ1Y3QgcHN0b3JlICpwcywKLQkJCSAgIHVpbnQzMl90IGluZGV4LCBzdHJ1Y3QgZGlza19leGNlcHRpb24gKnJlc3VsdCkKKwkJCSAgIHVpbnQzMl90IGluZGV4LCBzdHJ1Y3QgY29yZV9leGNlcHRpb24gKnJlc3VsdCkKIHsKLQlzdHJ1Y3QgZGlza19leGNlcHRpb24gKmUgPSBnZXRfZXhjZXB0aW9uKHBzLCBpbmRleCk7CisJc3RydWN0IGRpc2tfZXhjZXB0aW9uICpkZSA9IGdldF9leGNlcHRpb24ocHMsIGluZGV4KTsKIAogCS8qIGNvcHkgaXQgKi8KLQlyZXN1bHQtPm9sZF9jaHVuayA9IGxlNjRfdG9fY3B1KGUtPm9sZF9jaHVuayk7Ci0JcmVzdWx0LT5uZXdfY2h1bmsgPSBsZTY0X3RvX2NwdShlLT5uZXdfY2h1bmspOworCXJlc3VsdC0+b2xkX2NodW5rID0gbGU2NF90b19jcHUoZGUtPm9sZF9jaHVuayk7CisJcmVzdWx0LT5uZXdfY2h1bmsgPSBsZTY0X3RvX2NwdShkZS0+bmV3X2NodW5rKTsKIH0KIAogc3RhdGljIHZvaWQgd3JpdGVfZXhjZXB0aW9uKHN0cnVjdCBwc3RvcmUgKnBzLAotCQkJICAgIHVpbnQzMl90IGluZGV4LCBzdHJ1Y3QgZGlza19leGNlcHRpb24gKmRlKQorCQkJICAgIHVpbnQzMl90IGluZGV4LCBzdHJ1Y3QgY29yZV9leGNlcHRpb24gKmUpCiB7Ci0Jc3RydWN0IGRpc2tfZXhjZXB0aW9uICplID0gZ2V0X2V4Y2VwdGlvbihwcywgaW5kZXgpOworCXN0cnVjdCBkaXNrX2V4Y2VwdGlvbiAqZGUgPSBnZXRfZXhjZXB0aW9uKHBzLCBpbmRleCk7CiAKIAkvKiBjb3B5IGl0ICovCi0JZS0+b2xkX2NodW5rID0gY3B1X3RvX2xlNjQoZGUtPm9sZF9jaHVuayk7Ci0JZS0+bmV3X2NodW5rID0gY3B1X3RvX2xlNjQoZGUtPm5ld19jaHVuayk7CisJZGUtPm9sZF9jaHVuayA9IGNwdV90b19sZTY0KGUtPm9sZF9jaHVuayk7CisJZGUtPm5ld19jaHVuayA9IGNwdV90b19sZTY0KGUtPm5ld19jaHVuayk7CiB9CiAKIHN0YXRpYyB2b2lkIGNsZWFyX2V4Y2VwdGlvbihzdHJ1Y3QgcHN0b3JlICpwcywgdWludDMyX3QgaW5kZXgpCiB7Ci0Jc3RydWN0IGRpc2tfZXhjZXB0aW9uICplID0gZ2V0X2V4Y2VwdGlvbihwcywgaW5kZXgpOworCXN0cnVjdCBkaXNrX2V4Y2VwdGlvbiAqZGUgPSBnZXRfZXhjZXB0aW9uKHBzLCBpbmRleCk7CiAKIAkvKiBjbGVhciBpdCAqLwotCWUtPm9sZF9jaHVuayA9IDA7Ci0JZS0+bmV3X2NodW5rID0gMDsKKwlkZS0+b2xkX2NodW5rID0gMDsKKwlkZS0+bmV3X2NodW5rID0gMDsKIH0KIAogLyoKQEAgLTQzNywxMyArNDQxLDEzIEBACiB7CiAJaW50IHI7CiAJdW5zaWduZWQgaW50IGk7Ci0Jc3RydWN0IGRpc2tfZXhjZXB0aW9uIGRlOworCXN0cnVjdCBjb3JlX2V4Y2VwdGlvbiBlOwogCiAJLyogcHJlc3VtZSB0aGUgYXJlYSBpcyBmdWxsICovCiAJKmZ1bGwgPSAxOwogCiAJZm9yIChpID0gMDsgaSA8IHBzLT5leGNlcHRpb25zX3Blcl9hcmVhOyBpKyspIHsKLQkJcmVhZF9leGNlcHRpb24ocHMsIGksICZkZSk7CisJCXJlYWRfZXhjZXB0aW9uKHBzLCBpLCAmZSk7CiAKIAkJLyoKIAkJICogSWYgdGhlIG5ld19jaHVuayBpcyBwb2ludGluZyBhdCB0aGUgc3RhcnQgb2YKQEAgLTQ1MSw3ICs0NTUsNyBAQAogCQkgKiBpcyB3ZSBrbm93IHRoYXQgd2UndmUgaGl0IHRoZSBlbmQgb2YgdGhlCiAJCSAqIGV4Y2VwdGlvbnMuICBUaGVyZWZvcmUgdGhlIGFyZWEgaXMgbm90IGZ1bGwuCiAJCSAqLwotCQlpZiAoZGUubmV3X2NodW5rID09IDBMTCkgeworCQlpZiAoZS5uZXdfY2h1bmsgPT0gMExMKSB7CiAJCQlwcy0+Y3VycmVudF9jb21taXR0ZWQgPSBpOwogCQkJKmZ1bGwgPSAwOwogCQkJYnJlYWs7CkBAIC00NjAsMTMgKzQ2NCwxMyBAQAogCQkvKgogCQkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzdGFydCBvZiB0aGUgZnJlZSBjaHVua3MuCiAJCSAqLwotCQlpZiAocHMtPm5leHRfZnJlZSA8PSBkZS5uZXdfY2h1bmspCi0JCQlwcy0+bmV4dF9mcmVlID0gZGUubmV3X2NodW5rICsgMTsKKwkJaWYgKHBzLT5uZXh0X2ZyZWUgPD0gZS5uZXdfY2h1bmspCisJCQlwcy0+bmV4dF9mcmVlID0gZS5uZXdfY2h1bmsgKyAxOwogCiAJCS8qCiAJCSAqIE90aGVyd2lzZSB3ZSBhZGQgdGhlIGV4Y2VwdGlvbiB0byB0aGUgc25hcHNob3QuCiAJCSAqLwotCQlyID0gY2FsbGJhY2soY2FsbGJhY2tfY29udGV4dCwgZGUub2xkX2NodW5rLCBkZS5uZXdfY2h1bmspOworCQlyID0gY2FsbGJhY2soY2FsbGJhY2tfY29udGV4dCwgZS5vbGRfY2h1bmssIGUubmV3X2NodW5rKTsKIAkJaWYgKHIpCiAJCQlyZXR1cm4gcjsKIAl9CkBAIC01NjMsNyArNTY3LDcgQEAKIAlwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYSA9IChwcy0+c3RvcmUtPmNodW5rX3NpemUgPDwgU0VDVE9SX1NISUZUKSAvCiAJCQkJICBzaXplb2Yoc3RydWN0IGRpc2tfZXhjZXB0aW9uKTsKIAlwcy0+Y2FsbGJhY2tzID0gZG1fdmNhbGxvYyhwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYSwKLQkJCXNpemVvZigqcHMtPmNhbGxiYWNrcykpOworCQkJCSAgIHNpemVvZigqcHMtPmNhbGxiYWNrcykpOwogCWlmICghcHMtPmNhbGxiYWNrcykKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTY0MSwxMiArNjQ1LDEyIEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAJc3RydWN0IHBzdG9yZSAqcHMgPSBnZXRfaW5mbyhzdG9yZSk7Ci0Jc3RydWN0IGRpc2tfZXhjZXB0aW9uIGRlOworCXN0cnVjdCBjb3JlX2V4Y2VwdGlvbiBjZTsKIAlzdHJ1Y3QgY29tbWl0X2NhbGxiYWNrICpjYjsKIAotCWRlLm9sZF9jaHVuayA9IGUtPm9sZF9jaHVuazsKLQlkZS5uZXdfY2h1bmsgPSBlLT5uZXdfY2h1bms7Ci0Jd3JpdGVfZXhjZXB0aW9uKHBzLCBwcy0+Y3VycmVudF9jb21taXR0ZWQrKywgJmRlKTsKKwljZS5vbGRfY2h1bmsgPSBlLT5vbGRfY2h1bms7CisJY2UubmV3X2NodW5rID0gZS0+bmV3X2NodW5rOworCXdyaXRlX2V4Y2VwdGlvbihwcywgcHMtPmN1cnJlbnRfY29tbWl0dGVkKyssICZjZSk7CiAKIAkvKgogCSAqIEFkZCB0aGUgY2FsbGJhY2sgdG8gdGhlIGJhY2sgb2YgdGhlIGFycmF5LiAgVGhpcyBjb2RlCkBAIC02NzAsNyArNjc0LDcgQEAKIAkgKiBJZiB3ZSBjb21wbGV0ZWx5IGZpbGxlZCB0aGUgY3VycmVudCBhcmVhLCB0aGVuIHdpcGUgdGhlIG5leHQgb25lLgogCSAqLwogCWlmICgocHMtPmN1cnJlbnRfY29tbWl0dGVkID09IHBzLT5leGNlcHRpb25zX3Blcl9hcmVhKSAmJgotCSAgICAgemVyb19kaXNrX2FyZWEocHMsIHBzLT5jdXJyZW50X2FyZWEgKyAxKSkKKwkgICAgemVyb19kaXNrX2FyZWEocHMsIHBzLT5jdXJyZW50X2FyZWEgKyAxKSkKIAkJcHMtPnZhbGlkID0gMDsKIAogCS8qCkBAIC03MDEsNyArNzA1LDcgQEAKIAkJCQkgICAgY2h1bmtfdCAqbGFzdF9uZXdfY2h1bmspCiB7CiAJc3RydWN0IHBzdG9yZSAqcHMgPSBnZXRfaW5mbyhzdG9yZSk7Ci0Jc3RydWN0IGRpc2tfZXhjZXB0aW9uIGRlOworCXN0cnVjdCBjb3JlX2V4Y2VwdGlvbiBjZTsKIAlpbnQgbnJfY29uc2VjdXRpdmU7CiAJaW50IHI7CiAKQEAgLTcyMiw5ICs3MjYsOSBAQAogCQlwcy0+Y3VycmVudF9jb21taXR0ZWQgPSBwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYTsKIAl9CiAKLQlyZWFkX2V4Y2VwdGlvbihwcywgcHMtPmN1cnJlbnRfY29tbWl0dGVkIC0gMSwgJmRlKTsKLQkqbGFzdF9vbGRfY2h1bmsgPSBkZS5vbGRfY2h1bms7Ci0JKmxhc3RfbmV3X2NodW5rID0gZGUubmV3X2NodW5rOworCXJlYWRfZXhjZXB0aW9uKHBzLCBwcy0+Y3VycmVudF9jb21taXR0ZWQgLSAxLCAmY2UpOworCSpsYXN0X29sZF9jaHVuayA9IGNlLm9sZF9jaHVuazsKKwkqbGFzdF9uZXdfY2h1bmsgPSBjZS5uZXdfY2h1bms7CiAKIAkvKgogCSAqIEZpbmQgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGNodW5rcyB3aXRoaW4gdGhlIGN1cnJlbnQgYXJlYSwKQEAgLTczMyw5ICs3MzcsOSBAQAogCWZvciAobnJfY29uc2VjdXRpdmUgPSAxOyBucl9jb25zZWN1dGl2ZSA8IHBzLT5jdXJyZW50X2NvbW1pdHRlZDsKIAkgICAgIG5yX2NvbnNlY3V0aXZlKyspIHsKIAkJcmVhZF9leGNlcHRpb24ocHMsIHBzLT5jdXJyZW50X2NvbW1pdHRlZCAtIDEgLSBucl9jb25zZWN1dGl2ZSwKLQkJCSAgICAgICAmZGUpOwotCQlpZiAoZGUub2xkX2NodW5rICE9ICpsYXN0X29sZF9jaHVuayAtIG5yX2NvbnNlY3V0aXZlIHx8Ci0JCSAgICBkZS5uZXdfY2h1bmsgIT0gKmxhc3RfbmV3X2NodW5rIC0gbnJfY29uc2VjdXRpdmUpCisJCQkgICAgICAgJmNlKTsKKwkJaWYgKGNlLm9sZF9jaHVuayAhPSAqbGFzdF9vbGRfY2h1bmsgLSBucl9jb25zZWN1dGl2ZSB8fAorCQkgICAgY2UubmV3X2NodW5rICE9ICpsYXN0X25ld19jaHVuayAtIG5yX2NvbnNlY3V0aXZlKQogCQkJYnJlYWs7CiAJfQogCkBAIC03NTMsNyArNzU3LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbnJfbWVyZ2VkOyBpKyspCiAJCWNsZWFyX2V4Y2VwdGlvbihwcywgcHMtPmN1cnJlbnRfY29tbWl0dGVkIC0gMSAtIGkpOwogCi0JciA9IGFyZWFfaW8ocHMsIFdSSVRFKTsKKwlyID0gYXJlYV9pbyhwcywgV1JJVEVfRkxVU0hfRlVBKTsKIAlpZiAociA8IDApCiAJCXJldHVybiByOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXNuYXAuYyBiL2RyaXZlcnMvbWQvZG0tc25hcC5jCmluZGV4IDllY2ZmNWYuLjZmNzU4ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tc25hcC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tc25hcC5jCkBAIC0zMCwxNiArMzAsNiBAQAogCSgodGkpLT50eXBlLT5uYW1lID09IGRtX3NuYXBzaG90X21lcmdlX3RhcmdldF9uYW1lKQogCiAvKgotICogVGhlIHBlcmNlbnRhZ2UgaW5jcmVtZW50IHdlIHdpbGwgd2FrZSB1cCB1c2VycyBhdAotICovCi0jZGVmaW5lIFdBS0VfVVBfUEVSQ0VOVCA1Ci0KLS8qCi0gKiBrY29weWQgcHJpb3JpdHkgb2Ygc25hcHNob3Qgb3BlcmF0aW9ucwotICovCi0jZGVmaW5lIFNOQVBTSE9UX0NPUFlfUFJJT1JJVFkgMgotCi0vKgogICogVGhlIHNpemUgb2YgdGhlIG1lbXBvb2wgdXNlZCB0byB0cmFjayBjaHVua3MgaW4gdXNlLgogICovCiAjZGVmaW5lIE1JTl9JT1MgMjU2CkBAIC0xODAsNiArMTcwLDEzIEBACiAJICoga2NvcHlkLgogCSAqLwogCWludCBzdGFydGVkOworCisJLyoKKwkgKiBGb3Igd3JpdGluZyBhIGNvbXBsZXRlIGNodW5rLCBieXBhc3NpbmcgdGhlIGNvcHkuCisJICovCisJc3RydWN0IGJpbyAqZnVsbF9iaW87CisJYmlvX2VuZF9pb190ICpmdWxsX2Jpb19lbmRfaW87CisJdm9pZCAqZnVsbF9iaW9fcHJpdmF0ZTsKIH07CiAKIC8qCkBAIC0xMDU1LDggKzEwNTIsNyBAQAogCiAJcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzKSB7Ci0JCXRpLT5lcnJvciA9ICJDYW5ub3QgYWxsb2NhdGUgc25hcHNob3QgY29udGV4dCBwcml2YXRlICIKLQkJICAgICJzdHJ1Y3R1cmUiOworCQl0aS0+ZXJyb3IgPSAiQ2Fubm90IGFsbG9jYXRlIHByaXZhdGUgc25hcHNob3Qgc3RydWN0dXJlIjsKIAkJciA9IC1FTk9NRU07CiAJCWdvdG8gYmFkOwogCX0KQEAgLTEzODAsNiArMTM3Niw3IEBACiAJc3RydWN0IGRtX3NuYXBzaG90ICpzID0gcGUtPnNuYXA7CiAJc3RydWN0IGJpbyAqb3JpZ2luX2Jpb3MgPSBOVUxMOwogCXN0cnVjdCBiaW8gKnNuYXBzaG90X2Jpb3MgPSBOVUxMOworCXN0cnVjdCBiaW8gKmZ1bGxfYmlvID0gTlVMTDsKIAlpbnQgZXJyb3IgPSAwOwogCiAJaWYgKCFzdWNjZXNzKSB7CkBAIC0xNDE1LDEwICsxNDEyLDE1IEBACiAJICovCiAJZG1faW5zZXJ0X2V4Y2VwdGlvbigmcy0+Y29tcGxldGUsIGUpOwogCi0gb3V0Ogorb3V0OgogCWRtX3JlbW92ZV9leGNlcHRpb24oJnBlLT5lKTsKIAlzbmFwc2hvdF9iaW9zID0gYmlvX2xpc3RfZ2V0KCZwZS0+c25hcHNob3RfYmlvcyk7CiAJb3JpZ2luX2Jpb3MgPSBiaW9fbGlzdF9nZXQoJnBlLT5vcmlnaW5fYmlvcyk7CisJZnVsbF9iaW8gPSBwZS0+ZnVsbF9iaW87CisJaWYgKGZ1bGxfYmlvKSB7CisJCWZ1bGxfYmlvLT5iaV9lbmRfaW8gPSBwZS0+ZnVsbF9iaW9fZW5kX2lvOworCQlmdWxsX2Jpby0+YmlfcHJpdmF0ZSA9IHBlLT5mdWxsX2Jpb19wcml2YXRlOworCX0KIAlmcmVlX3BlbmRpbmdfZXhjZXB0aW9uKHBlKTsKIAogCWluY3JlbWVudF9wZW5kaW5nX2V4Y2VwdGlvbnNfZG9uZV9jb3VudCgpOwpAQCAtMTQyNiwxMCArMTQyOCwxNSBAQAogCXVwX3dyaXRlKCZzLT5sb2NrKTsKIAogCS8qIFN1Ym1pdCBhbnkgcGVuZGluZyB3cml0ZSBiaW9zICovCi0JaWYgKGVycm9yKQorCWlmIChlcnJvcikgeworCQlpZiAoZnVsbF9iaW8pCisJCQliaW9faW9fZXJyb3IoZnVsbF9iaW8pOwogCQllcnJvcl9iaW9zKHNuYXBzaG90X2Jpb3MpOwotCWVsc2UKKwl9IGVsc2UgeworCQlpZiAoZnVsbF9iaW8pCisJCQliaW9fZW5kaW8oZnVsbF9iaW8sIDApOwogCQlmbHVzaF9iaW9zKHNuYXBzaG90X2Jpb3MpOworCX0KIAogCXJldHJ5X29yaWdpbl9iaW9zKHMsIG9yaWdpbl9iaW9zKTsKIH0KQEAgLTE0ODAsOCArMTQ4NywzMyBAQAogCWRlc3QuY291bnQgPSBzcmMuY291bnQ7CiAKIAkvKiBIYW5kIG92ZXIgdG8ga2NvcHlkICovCi0JZG1fa2NvcHlkX2NvcHkocy0+a2NvcHlkX2NsaWVudCwKLQkJICAgICZzcmMsIDEsICZkZXN0LCAwLCBjb3B5X2NhbGxiYWNrLCBwZSk7CisJZG1fa2NvcHlkX2NvcHkocy0+a2NvcHlkX2NsaWVudCwgJnNyYywgMSwgJmRlc3QsIDAsIGNvcHlfY2FsbGJhY2ssIHBlKTsKK30KKworc3RhdGljIHZvaWQgZnVsbF9iaW9fZW5kX2lvKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycm9yKQoreworCXZvaWQgKmNhbGxiYWNrX2RhdGEgPSBiaW8tPmJpX3ByaXZhdGU7CisKKwlkbV9rY29weWRfZG9fY2FsbGJhY2soY2FsbGJhY2tfZGF0YSwgMCwgZXJyb3IgPyAxIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X2Z1bGxfYmlvKHN0cnVjdCBkbV9zbmFwX3BlbmRpbmdfZXhjZXB0aW9uICpwZSwKKwkJCSAgIHN0cnVjdCBiaW8gKmJpbykKK3sKKwlzdHJ1Y3QgZG1fc25hcHNob3QgKnMgPSBwZS0+c25hcDsKKwl2b2lkICpjYWxsYmFja19kYXRhOworCisJcGUtPmZ1bGxfYmlvID0gYmlvOworCXBlLT5mdWxsX2Jpb19lbmRfaW8gPSBiaW8tPmJpX2VuZF9pbzsKKwlwZS0+ZnVsbF9iaW9fcHJpdmF0ZSA9IGJpby0+YmlfcHJpdmF0ZTsKKworCWNhbGxiYWNrX2RhdGEgPSBkbV9rY29weWRfcHJlcGFyZV9jYWxsYmFjayhzLT5rY29weWRfY2xpZW50LAorCQkJCQkJICAgY29weV9jYWxsYmFjaywgcGUpOworCisJYmlvLT5iaV9lbmRfaW8gPSBmdWxsX2Jpb19lbmRfaW87CisJYmlvLT5iaV9wcml2YXRlID0gY2FsbGJhY2tfZGF0YTsKKworCWdlbmVyaWNfbWFrZV9yZXF1ZXN0KGJpbyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZG1fc25hcF9wZW5kaW5nX2V4Y2VwdGlvbiAqCkBAIC0xNTE5LDYgKzE1NTEsNyBAQAogCWJpb19saXN0X2luaXQoJnBlLT5vcmlnaW5fYmlvcyk7CiAJYmlvX2xpc3RfaW5pdCgmcGUtPnNuYXBzaG90X2Jpb3MpOwogCXBlLT5zdGFydGVkID0gMDsKKwlwZS0+ZnVsbF9iaW8gPSBOVUxMOwogCiAJaWYgKHMtPnN0b3JlLT50eXBlLT5wcmVwYXJlX2V4Y2VwdGlvbihzLT5zdG9yZSwgJnBlLT5lKSkgewogCQlmcmVlX3BlbmRpbmdfZXhjZXB0aW9uKHBlKTsKQEAgLTE2MTIsMTAgKzE2NDUsMTkgQEAKIAkJfQogCiAJCXJlbWFwX2V4Y2VwdGlvbihzLCAmcGUtPmUsIGJpbywgY2h1bmspOwotCQliaW9fbGlzdF9hZGQoJnBlLT5zbmFwc2hvdF9iaW9zLCBiaW8pOwogCiAJCXIgPSBETV9NQVBJT19TVUJNSVRURUQ7CiAKKwkJaWYgKCFwZS0+c3RhcnRlZCAmJgorCQkgICAgYmlvLT5iaV9zaXplID09IChzLT5zdG9yZS0+Y2h1bmtfc2l6ZSA8PCBTRUNUT1JfU0hJRlQpKSB7CisJCQlwZS0+c3RhcnRlZCA9IDE7CisJCQl1cF93cml0ZSgmcy0+bG9jayk7CisJCQlzdGFydF9mdWxsX2JpbyhwZSwgYmlvKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJYmlvX2xpc3RfYWRkKCZwZS0+c25hcHNob3RfYmlvcywgYmlvKTsKKwogCQlpZiAoIXBlLT5zdGFydGVkKSB7CiAJCQkvKiB0aGlzIGlzIHByb3RlY3RlZCBieSBzbmFwLT5sb2NrICovCiAJCQlwZS0+c3RhcnRlZCA9IDE7CkBAIC0xNjI4LDkgKzE2NzAsOSBAQAogCQltYXBfY29udGV4dC0+cHRyID0gdHJhY2tfY2h1bmsocywgY2h1bmspOwogCX0KIAotIG91dF91bmxvY2s6CitvdXRfdW5sb2NrOgogCXVwX3dyaXRlKCZzLT5sb2NrKTsKLSBvdXQ6CitvdXQ6CiAJcmV0dXJuIHI7CiB9CiAKQEAgLTE5NzQsNyArMjAxNiw3IEBACiAJCQlwZV90b19zdGFydF9ub3cgPSBwZTsKIAkJfQogCi0gbmV4dF9zbmFwc2hvdDoKK25leHRfc25hcHNob3Q6CiAJCXVwX3dyaXRlKCZzbmFwLT5sb2NrKTsKIAogCQlpZiAocGVfdG9fc3RhcnRfbm93KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXRhYmxlLmMgYi9kcml2ZXJzL21kL2RtLXRhYmxlLmMKaW5kZXggYmZlOWMyMy4uOTg2Yjg3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS10YWJsZS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tdGFibGUuYwpAQCAtNTQsNyArNTQsNiBAQAogCXNlY3Rvcl90ICpoaWdoczsKIAlzdHJ1Y3QgZG1fdGFyZ2V0ICp0YXJnZXRzOwogCi0JdW5zaWduZWQgZGlzY2FyZHNfc3VwcG9ydGVkOjE7CiAJdW5zaWduZWQgaW50ZWdyaXR5X3N1cHBvcnRlZDoxOwogCiAJLyoKQEAgLTE1NCwxMiArMTUzLDExIEBACiAJCXJldHVybiBOVUxMOwogCiAJc2l6ZSA9IG5tZW1iICogZWxlbV9zaXplOwotCWFkZHIgPSB2bWFsbG9jKHNpemUpOwotCWlmIChhZGRyKQotCQltZW1zZXQoYWRkciwgMCwgc2l6ZSk7CisJYWRkciA9IHZ6YWxsb2Moc2l6ZSk7CiAKIAlyZXR1cm4gYWRkcjsKIH0KK0VYUE9SVF9TWU1CT0woZG1fdmNhbGxvYyk7CiAKIC8qCiAgKiBoaWdocywgYW5kIHRhcmdldHMgYXJlIG1hbmFnZWQgYXMgZHluYW1pYyBhcnJheXMgZHVyaW5nIGEKQEAgLTIwOSw3ICsyMDcsNiBAQAogCUlOSVRfTElTVF9IRUFEKCZ0LT5kZXZpY2VzKTsKIAlJTklUX0xJU1RfSEVBRCgmdC0+dGFyZ2V0X2NhbGxiYWNrcyk7CiAJYXRvbWljX3NldCgmdC0+aG9sZGVycywgMCk7Ci0JdC0+ZGlzY2FyZHNfc3VwcG9ydGVkID0gMTsKIAogCWlmICghbnVtX3RhcmdldHMpCiAJCW51bV90YXJnZXRzID0gS0VZU19QRVJfTk9ERTsKQEAgLTI4MSw2ICsyNzgsNyBAQAogewogCWF0b21pY19pbmMoJnQtPmhvbGRlcnMpOwogfQorRVhQT1JUX1NZTUJPTChkbV90YWJsZV9nZXQpOwogCiB2b2lkIGRtX3RhYmxlX3B1dChzdHJ1Y3QgZG1fdGFibGUgKnQpCiB7CkBAIC0yOTAsNiArMjg4LDcgQEAKIAlzbXBfbWJfX2JlZm9yZV9hdG9taWNfZGVjKCk7CiAJYXRvbWljX2RlYygmdC0+aG9sZGVycyk7CiB9CitFWFBPUlRfU1lNQk9MKGRtX3RhYmxlX3B1dCk7CiAKIC8qCiAgKiBDaGVja3MgdG8gc2VlIGlmIHdlIG5lZWQgdG8gZXh0ZW5kIGhpZ2hzIG9yIHRhcmdldHMuCkBAIC00NTUsMTMgKzQ1NCwxNCBAQAogICogQWRkIGEgZGV2aWNlIHRvIHRoZSBsaXN0LCBvciBqdXN0IGluY3JlbWVudCB0aGUgdXNhZ2UgY291bnQgaWYKICAqIGl0J3MgYWxyZWFkeSBwcmVzZW50LgogICovCi1zdGF0aWMgaW50IF9fdGFibGVfZ2V0X2RldmljZShzdHJ1Y3QgZG1fdGFibGUgKnQsIHN0cnVjdCBkbV90YXJnZXQgKnRpLAotCQkgICAgICBjb25zdCBjaGFyICpwYXRoLCBmbW9kZV90IG1vZGUsIHN0cnVjdCBkbV9kZXYgKipyZXN1bHQpCitpbnQgZG1fZ2V0X2RldmljZShzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgY29uc3QgY2hhciAqcGF0aCwgZm1vZGVfdCBtb2RlLAorCQkgIHN0cnVjdCBkbV9kZXYgKipyZXN1bHQpCiB7CiAJaW50IHI7CiAJZGV2X3QgdW5pbml0aWFsaXplZF92YXIoZGV2KTsKIAlzdHJ1Y3QgZG1fZGV2X2ludGVybmFsICpkZDsKIAl1bnNpZ25lZCBpbnQgbWFqb3IsIG1pbm9yOworCXN0cnVjdCBkbV90YWJsZSAqdCA9IHRpLT50YWJsZTsKIAogCUJVR19PTighdCk7CiAKQEAgLTUwOSw2ICs1MDksNyBAQAogCSpyZXN1bHQgPSAmZGQtPmRtX2RldjsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woZG1fZ2V0X2RldmljZSk7CiAKIGludCBkbV9zZXRfZGV2aWNlX2xpbWl0cyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGRtX2RldiAqZGV2LAogCQkJIHNlY3Rvcl90IHN0YXJ0LCBzZWN0b3JfdCBsZW4sIHZvaWQgKmRhdGEpCkBAIC01MzksMjMgKzU0MCwxNSBAQAogCSAqIElmIG5vdCB3ZSdsbCBmb3JjZSBETSB0byB1c2UgUEFHRV9TSVpFIG9yCiAJICogc21hbGxlciBJL08sIGp1c3QgdG8gYmUgc2FmZS4KIAkgKi8KLQotCWlmIChxLT5tZXJnZV9idmVjX2ZuICYmICF0aS0+dHlwZS0+bWVyZ2UpCisJaWYgKGRtX3F1ZXVlX21lcmdlX2lzX2NvbXB1bHNvcnkocSkgJiYgIXRpLT50eXBlLT5tZXJnZSkKIAkJYmxrX2xpbWl0c19tYXhfaHdfc2VjdG9ycyhsaW1pdHMsCiAJCQkJCSAgKHVuc2lnbmVkIGludCkgKFBBR0VfU0laRSA+PiA5KSk7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkbV9zZXRfZGV2aWNlX2xpbWl0cyk7CiAKLWludCBkbV9nZXRfZGV2aWNlKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBjb25zdCBjaGFyICpwYXRoLCBmbW9kZV90IG1vZGUsCi0JCSAgc3RydWN0IGRtX2RldiAqKnJlc3VsdCkKLXsKLQlyZXR1cm4gX190YWJsZV9nZXRfZGV2aWNlKHRpLT50YWJsZSwgdGksIHBhdGgsIG1vZGUsIHJlc3VsdCk7Ci19Ci0KLQogLyoKLSAqIERlY3JlbWVudCBhIGRldmljZXMgdXNlIGNvdW50IGFuZCByZW1vdmUgaXQgaWYgbmVjZXNzYXJ5LgorICogRGVjcmVtZW50IGEgZGV2aWNlJ3MgdXNlIGNvdW50IGFuZCByZW1vdmUgaXQgaWYgbmVjZXNzYXJ5LgogICovCiB2b2lkIGRtX3B1dF9kZXZpY2Uoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBkbV9kZXYgKmQpCiB7CkBAIC01NjgsNiArNTYxLDcgQEAKIAkJa2ZyZWUoZGQpOwogCX0KIH0KK0VYUE9SVF9TWU1CT0woZG1fcHV0X2RldmljZSk7CiAKIC8qCiAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSB0YXJnZXQgam9pbnMgb250byB0aGUgZW5kIG9mIHRoZSB0YWJsZS4KQEAgLTc5MSw4ICs3ODUsOSBAQAogCiAJdC0+aGlnaHNbdC0+bnVtX3RhcmdldHMrK10gPSB0Z3QtPmJlZ2luICsgdGd0LT5sZW4gLSAxOwogCi0JaWYgKCF0Z3QtPm51bV9kaXNjYXJkX3JlcXVlc3RzKQotCQl0LT5kaXNjYXJkc19zdXBwb3J0ZWQgPSAwOworCWlmICghdGd0LT5udW1fZGlzY2FyZF9yZXF1ZXN0cyAmJiB0Z3QtPmRpc2NhcmRzX3N1cHBvcnRlZCkKKwkJRE1XQVJOKCIlczogJXM6IGlnbm9yaW5nIGRpc2NhcmRzX3N1cHBvcnRlZCBiZWNhdXNlIG51bV9kaXNjYXJkX3JlcXVlc3RzIGlzIHplcm8uIiwKKwkJICAgICAgIGRtX2RldmljZV9uYW1lKHQtPm1kKSwgdHlwZSk7CiAKIAlyZXR1cm4gMDsKIApAQCAtODAyLDYgKzc5Nyw2MyBAQAogCXJldHVybiByOwogfQogCisvKgorICogVGFyZ2V0IGFyZ3VtZW50IHBhcnNpbmcgaGVscGVycy4KKyAqLworc3RhdGljIGludCB2YWxpZGF0ZV9uZXh0X2FyZyhzdHJ1Y3QgZG1fYXJnICphcmcsIHN0cnVjdCBkbV9hcmdfc2V0ICphcmdfc2V0LAorCQkJICAgICB1bnNpZ25lZCAqdmFsdWUsIGNoYXIgKiplcnJvciwgdW5zaWduZWQgZ3JvdXBlZCkKK3sKKwljb25zdCBjaGFyICphcmdfc3RyID0gZG1fc2hpZnRfYXJnKGFyZ19zZXQpOworCisJaWYgKCFhcmdfc3RyIHx8CisJICAgIChzc2NhbmYoYXJnX3N0ciwgIiV1IiwgdmFsdWUpICE9IDEpIHx8CisJICAgICgqdmFsdWUgPCBhcmctPm1pbikgfHwKKwkgICAgKCp2YWx1ZSA+IGFyZy0+bWF4KSB8fAorCSAgICAoZ3JvdXBlZCAmJiBhcmdfc2V0LT5hcmdjIDwgKnZhbHVlKSkgeworCQkqZXJyb3IgPSBhcmctPmVycm9yOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRtX3JlYWRfYXJnKHN0cnVjdCBkbV9hcmcgKmFyZywgc3RydWN0IGRtX2FyZ19zZXQgKmFyZ19zZXQsCisJCXVuc2lnbmVkICp2YWx1ZSwgY2hhciAqKmVycm9yKQoreworCXJldHVybiB2YWxpZGF0ZV9uZXh0X2FyZyhhcmcsIGFyZ19zZXQsIHZhbHVlLCBlcnJvciwgMCk7Cit9CitFWFBPUlRfU1lNQk9MKGRtX3JlYWRfYXJnKTsKKworaW50IGRtX3JlYWRfYXJnX2dyb3VwKHN0cnVjdCBkbV9hcmcgKmFyZywgc3RydWN0IGRtX2FyZ19zZXQgKmFyZ19zZXQsCisJCSAgICAgIHVuc2lnbmVkICp2YWx1ZSwgY2hhciAqKmVycm9yKQoreworCXJldHVybiB2YWxpZGF0ZV9uZXh0X2FyZyhhcmcsIGFyZ19zZXQsIHZhbHVlLCBlcnJvciwgMSk7Cit9CitFWFBPUlRfU1lNQk9MKGRtX3JlYWRfYXJnX2dyb3VwKTsKKworY29uc3QgY2hhciAqZG1fc2hpZnRfYXJnKHN0cnVjdCBkbV9hcmdfc2V0ICphcykKK3sKKwljaGFyICpyOworCisJaWYgKGFzLT5hcmdjKSB7CisJCWFzLT5hcmdjLS07CisJCXIgPSAqYXMtPmFyZ3Y7CisJCWFzLT5hcmd2Kys7CisJCXJldHVybiByOworCX0KKworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChkbV9zaGlmdF9hcmcpOworCit2b2lkIGRtX2NvbnN1bWVfYXJncyhzdHJ1Y3QgZG1fYXJnX3NldCAqYXMsIHVuc2lnbmVkIG51bV9hcmdzKQoreworCUJVR19PTihhcy0+YXJnYyA8IG51bV9hcmdzKTsKKwlhcy0+YXJnYyAtPSBudW1fYXJnczsKKwlhcy0+YXJndiArPSBudW1fYXJnczsKK30KK0VYUE9SVF9TWU1CT0woZG1fY29uc3VtZV9hcmdzKTsKKwogc3RhdGljIGludCBkbV90YWJsZV9zZXRfdHlwZShzdHJ1Y3QgZG1fdGFibGUgKnQpCiB7CiAJdW5zaWduZWQgaTsKQEAgLTEwNzcsMTEgKzExMjksMTMgQEAKIAkJdC0+ZXZlbnRfZm4odC0+ZXZlbnRfY29udGV4dCk7CiAJbXV0ZXhfdW5sb2NrKCZfZXZlbnRfbG9jayk7CiB9CitFWFBPUlRfU1lNQk9MKGRtX3RhYmxlX2V2ZW50KTsKIAogc2VjdG9yX3QgZG1fdGFibGVfZ2V0X3NpemUoc3RydWN0IGRtX3RhYmxlICp0KQogewogCXJldHVybiB0LT5udW1fdGFyZ2V0cyA/ICh0LT5oaWdoc1t0LT5udW1fdGFyZ2V0cyAtIDFdICsgMSkgOiAwOwogfQorRVhQT1JUX1NZTUJPTChkbV90YWJsZV9nZXRfc2l6ZSk7CiAKIHN0cnVjdCBkbV90YXJnZXQgKmRtX3RhYmxlX2dldF90YXJnZXQoc3RydWN0IGRtX3RhYmxlICp0LCB1bnNpZ25lZCBpbnQgaW5kZXgpCiB7CkBAIC0xMTk0LDkgKzEyNDgsNDUgQEAKIAkJCSAgICAgICBibGtfZ2V0X2ludGVncml0eSh0ZW1wbGF0ZV9kaXNrKSk7CiB9CiAKK3N0YXRpYyBpbnQgZGV2aWNlX2ZsdXNoX2NhcGFibGUoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBkbV9kZXYgKmRldiwKKwkJCQlzZWN0b3JfdCBzdGFydCwgc2VjdG9yX3QgbGVuLCB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGZsdXNoID0gKCoodW5zaWduZWQgKilkYXRhKTsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGJkZXZfZ2V0X3F1ZXVlKGRldi0+YmRldik7CisKKwlyZXR1cm4gcSAmJiAocS0+Zmx1c2hfZmxhZ3MgJiBmbHVzaCk7Cit9CisKK3N0YXRpYyBib29sIGRtX3RhYmxlX3N1cHBvcnRzX2ZsdXNoKHN0cnVjdCBkbV90YWJsZSAqdCwgdW5zaWduZWQgZmx1c2gpCit7CisJc3RydWN0IGRtX3RhcmdldCAqdGk7CisJdW5zaWduZWQgaSA9IDA7CisKKwkvKgorCSAqIFJlcXVpcmUgYXQgbGVhc3Qgb25lIHVuZGVybHlpbmcgZGV2aWNlIHRvIHN1cHBvcnQgZmx1c2hlcy4KKwkgKiB0LT5kZXZpY2VzIGluY2x1ZGVzIGludGVybmFsIGRtIGRldmljZXMgc3VjaCBhcyBtaXJyb3IgbG9ncworCSAqIHNvIHdlIG5lZWQgdG8gdXNlIGl0ZXJhdGVfZGV2aWNlcyBoZXJlLCB3aGljaCB0YXJnZXRzCisJICogc3VwcG9ydGluZyBmbHVzaGVzIG11c3QgcHJvdmlkZS4KKwkgKi8KKwl3aGlsZSAoaSA8IGRtX3RhYmxlX2dldF9udW1fdGFyZ2V0cyh0KSkgeworCQl0aSA9IGRtX3RhYmxlX2dldF90YXJnZXQodCwgaSsrKTsKKworCQlpZiAoIXRpLT5udW1fZmx1c2hfcmVxdWVzdHMpCisJCQljb250aW51ZTsKKworCQlpZiAodGktPnR5cGUtPml0ZXJhdGVfZGV2aWNlcyAmJgorCQkgICAgdGktPnR5cGUtPml0ZXJhdGVfZGV2aWNlcyh0aSwgZGV2aWNlX2ZsdXNoX2NhcGFibGUsICZmbHVzaCkpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogdm9pZCBkbV90YWJsZV9zZXRfcmVzdHJpY3Rpb25zKHN0cnVjdCBkbV90YWJsZSAqdCwgc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCiAJCQkgICAgICAgc3RydWN0IHF1ZXVlX2xpbWl0cyAqbGltaXRzKQogeworCXVuc2lnbmVkIGZsdXNoID0gMDsKKwogCS8qCiAJICogQ29weSB0YWJsZSdzIGxpbWl0cyB0byB0aGUgRE0gZGV2aWNlJ3MgcmVxdWVzdF9xdWV1ZQogCSAqLwpAQCAtMTIwNyw2ICsxMjk3LDEzIEBACiAJZWxzZQogCQlxdWV1ZV9mbGFnX3NldF91bmxvY2tlZChRVUVVRV9GTEFHX0RJU0NBUkQsIHEpOwogCisJaWYgKGRtX3RhYmxlX3N1cHBvcnRzX2ZsdXNoKHQsIFJFUV9GTFVTSCkpIHsKKwkJZmx1c2ggfD0gUkVRX0ZMVVNIOworCQlpZiAoZG1fdGFibGVfc3VwcG9ydHNfZmx1c2godCwgUkVRX0ZVQSkpCisJCQlmbHVzaCB8PSBSRVFfRlVBOworCX0KKwlibGtfcXVldWVfZmx1c2gocSwgZmx1c2gpOworCiAJZG1fdGFibGVfc2V0X2ludGVncml0eSh0KTsKIAogCS8qCkBAIC0xMjM3LDYgKzEzMzQsNyBAQAogewogCXJldHVybiB0LT5tb2RlOwogfQorRVhQT1JUX1NZTUJPTChkbV90YWJsZV9nZXRfbW9kZSk7CiAKIHN0YXRpYyB2b2lkIHN1c3BlbmRfdGFyZ2V0cyhzdHJ1Y3QgZG1fdGFibGUgKnQsIHVuc2lnbmVkIHBvc3RzdXNwZW5kKQogewpAQCAtMTM0NSw2ICsxNDQzLDcgQEAKIHsKIAlyZXR1cm4gdC0+bWQ7CiB9CitFWFBPUlRfU1lNQk9MKGRtX3RhYmxlX2dldF9tZCk7CiAKIHN0YXRpYyBpbnQgZGV2aWNlX2Rpc2NhcmRfY2FwYWJsZShzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGRtX2RldiAqZGV2LAogCQkJCSAgc2VjdG9yX3Qgc3RhcnQsIHNlY3Rvcl90IGxlbiwgdm9pZCAqZGF0YSkKQEAgLTEzNTksMTkgKzE0NTgsMTkgQEAKIAlzdHJ1Y3QgZG1fdGFyZ2V0ICp0aTsKIAl1bnNpZ25lZCBpID0gMDsKIAotCWlmICghdC0+ZGlzY2FyZHNfc3VwcG9ydGVkKQotCQlyZXR1cm4gMDsKLQogCS8qCiAJICogVW5sZXNzIGFueSB0YXJnZXQgdXNlZCBieSB0aGUgdGFibGUgc2V0IGRpc2NhcmRzX3N1cHBvcnRlZCwKIAkgKiByZXF1aXJlIGF0IGxlYXN0IG9uZSB1bmRlcmx5aW5nIGRldmljZSB0byBzdXBwb3J0IGRpc2NhcmRzLgogCSAqIHQtPmRldmljZXMgaW5jbHVkZXMgaW50ZXJuYWwgZG0gZGV2aWNlcyBzdWNoIGFzIG1pcnJvciBsb2dzCiAJICogc28gd2UgbmVlZCB0byB1c2UgaXRlcmF0ZV9kZXZpY2VzIGhlcmUsIHdoaWNoIHRhcmdldHMKLQkgKiBzdXBwb3J0aW5nIGRpc2NhcmQgbXVzdCBwcm92aWRlLgorCSAqIHN1cHBvcnRpbmcgZGlzY2FyZCBzZWxlY3RpdmVseSBtdXN0IHByb3ZpZGUuCiAJICovCiAJd2hpbGUgKGkgPCBkbV90YWJsZV9nZXRfbnVtX3RhcmdldHModCkpIHsKIAkJdGkgPSBkbV90YWJsZV9nZXRfdGFyZ2V0KHQsIGkrKyk7CiAKKwkJaWYgKCF0aS0+bnVtX2Rpc2NhcmRfcmVxdWVzdHMpCisJCQljb250aW51ZTsKKwogCQlpZiAodGktPmRpc2NhcmRzX3N1cHBvcnRlZCkKIAkJCXJldHVybiAxOwogCkBAIC0xMzgyLDEzICsxNDgxLDMgQEAKIAogCXJldHVybiAwOwogfQotCi1FWFBPUlRfU1lNQk9MKGRtX3ZjYWxsb2MpOwotRVhQT1JUX1NZTUJPTChkbV9nZXRfZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0woZG1fcHV0X2RldmljZSk7Ci1FWFBPUlRfU1lNQk9MKGRtX3RhYmxlX2V2ZW50KTsKLUVYUE9SVF9TWU1CT0woZG1fdGFibGVfZ2V0X3NpemUpOwotRVhQT1JUX1NZTUJPTChkbV90YWJsZV9nZXRfbW9kZSk7Ci1FWFBPUlRfU1lNQk9MKGRtX3RhYmxlX2dldF9tZCk7Ci1FWFBPUlRfU1lNQk9MKGRtX3RhYmxlX3B1dCk7Ci1FWFBPUlRfU1lNQk9MKGRtX3RhYmxlX2dldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLmMgYi9kcml2ZXJzL21kL2RtLmMKaW5kZXggMGNmNjhiNC4uNTJiMzlmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS5jCisrKyBiL2RyaXZlcnMvbWQvZG0uYwpAQCAtMzcsNiArMzcsOCBAQAogc3RhdGljIHVuc2lnbmVkIGludCBtYWpvciA9IDA7CiBzdGF0aWMgdW5zaWduZWQgaW50IF9tYWpvciA9IDA7CiAKK3N0YXRpYyBERUZJTkVfSURSKF9taW5vcl9pZHIpOworCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKF9taW5vcl9sb2NrKTsKIC8qCiAgKiBGb3IgYmlvLWJhc2VkIGRtLgpAQCAtMTA5LDYgKzExMSw3IEBACiAjZGVmaW5lIERNRl9GUkVFSU5HIDMKICNkZWZpbmUgRE1GX0RFTEVUSU5HIDQKICNkZWZpbmUgRE1GX05PRkxVU0hfU1VTUEVORElORyA1CisjZGVmaW5lIERNRl9NRVJHRV9JU19PUFRJT05BTCA2CiAKIC8qCiAgKiBXb3JrIHByb2Nlc3NlZCBieSBwZXItZGV2aWNlIHdvcmtxdWV1ZS4KQEAgLTMxMyw2ICszMTYsMTIgQEAKIAogCXdoaWxlIChpLS0pCiAJCV9leGl0c1tpXSgpOworCisJLyoKKwkgKiBTaG91bGQgYmUgZW1wdHkgYnkgdGhpcyBwb2ludC4KKwkgKi8KKwlpZHJfcmVtb3ZlX2FsbCgmX21pbm9yX2lkcik7CisJaWRyX2Rlc3Ryb3koJl9taW5vcl9pZHIpOwogfQogCiAvKgpAQCAtMTE3MSw3ICsxMTgwLDggQEAKIAogCQkvKgogCQkgKiBFdmVuIHRob3VnaCB0aGUgZGV2aWNlIGFkdmVydGlzZWQgZGlzY2FyZCBzdXBwb3J0LAotCQkgKiByZWNvbmZpZ3VyYXRpb24gbWlnaHQgaGF2ZSBjaGFuZ2VkIHRoYXQgc2luY2UgdGhlCisJCSAqIHRoYXQgZG9lcyBub3QgbWVhbiBldmVyeSB0YXJnZXQgc3VwcG9ydHMgaXQsIGFuZAorCQkgKiByZWNvbmZpZ3VyYXRpb24gbWlnaHQgYWxzbyBoYXZlIGNoYW5nZWQgdGhhdCBzaW5jZSB0aGUKIAkJICogY2hlY2sgd2FzIHBlcmZvcm1lZC4KIAkJICovCiAJCWlmICghdGktPm51bV9kaXNjYXJkX3JlcXVlc3RzKQpAQCAtMTcwNSw4ICsxNzE1LDYgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEFuIElEUiBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgYWxsb2NhdGVkIG1pbm9yIG51bWJlcnMuCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgREVGSU5FX0lEUihfbWlub3JfaWRyKTsKLQogc3RhdGljIHZvaWQgZnJlZV9taW5vcihpbnQgbWlub3IpCiB7CiAJc3Bpbl9sb2NrKCZfbWlub3JfbG9jayk7CkBAIC0xODAwLDcgKzE4MDgsNiBAQAogCWJsa19xdWV1ZV9tYWtlX3JlcXVlc3QobWQtPnF1ZXVlLCBkbV9yZXF1ZXN0KTsKIAlibGtfcXVldWVfYm91bmNlX2xpbWl0KG1kLT5xdWV1ZSwgQkxLX0JPVU5DRV9BTlkpOwogCWJsa19xdWV1ZV9tZXJnZV9idmVjKG1kLT5xdWV1ZSwgZG1fbWVyZ2VfYnZlYyk7Ci0JYmxrX3F1ZXVlX2ZsdXNoKG1kLT5xdWV1ZSwgUkVRX0ZMVVNIIHwgUkVRX0ZVQSk7CiB9CiAKIC8qCkBAIC0xOTg2LDYgKzE5OTMsNTkgQEAKIH0KIAogLyoKKyAqIFJldHVybiAxIGlmIHRoZSBxdWV1ZSBoYXMgYSBjb21wdWxzb3J5IG1lcmdlX2J2ZWNfZm4gZnVuY3Rpb24uCisgKgorICogSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIDAsIHRoZW4gdGhlIGRldmljZSBpcyBlaXRoZXIgYSBub24tZG0KKyAqIGRldmljZSB3aXRob3V0IGEgbWVyZ2VfYnZlY19mbiwgb3IgaXQgaXMgYSBkbSBkZXZpY2UgdGhhdCBpcworICogYWJsZSB0byBzcGxpdCBhbnkgYmlvcyBpdCByZWNlaXZlcyB0aGF0IGFyZSB0b28gYmlnLgorICovCitpbnQgZG1fcXVldWVfbWVyZ2VfaXNfY29tcHVsc29yeShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqZGV2X21kOworCisJaWYgKCFxLT5tZXJnZV9idmVjX2ZuKQorCQlyZXR1cm4gMDsKKworCWlmIChxLT5tYWtlX3JlcXVlc3RfZm4gPT0gZG1fcmVxdWVzdCkgeworCQlkZXZfbWQgPSBxLT5xdWV1ZWRhdGE7CisJCWlmICh0ZXN0X2JpdChETUZfTUVSR0VfSVNfT1BUSU9OQUwsICZkZXZfbWQtPmZsYWdzKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGRtX2RldmljZV9tZXJnZV9pc19jb21wdWxzb3J5KHN0cnVjdCBkbV90YXJnZXQgKnRpLAorCQkJCQkgc3RydWN0IGRtX2RldiAqZGV2LCBzZWN0b3JfdCBzdGFydCwKKwkJCQkJIHNlY3Rvcl90IGxlbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gZGV2LT5iZGV2OworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9nZXRfcXVldWUoYmRldik7CisKKwlyZXR1cm4gZG1fcXVldWVfbWVyZ2VfaXNfY29tcHVsc29yeShxKTsKK30KKworLyoKKyAqIFJldHVybiAxIGlmIGl0IGlzIGFjY2VwdGFibGUgdG8gaWdub3JlIG1lcmdlX2J2ZWNfZm4gYmFzZWQKKyAqIG9uIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB1bmRlcmx5aW5nIGRldmljZXMuCisgKi8KK3N0YXRpYyBpbnQgZG1fdGFibGVfbWVyZ2VfaXNfb3B0aW9uYWwoc3RydWN0IGRtX3RhYmxlICp0YWJsZSkKK3sKKwl1bnNpZ25lZCBpID0gMDsKKwlzdHJ1Y3QgZG1fdGFyZ2V0ICp0aTsKKworCXdoaWxlIChpIDwgZG1fdGFibGVfZ2V0X251bV90YXJnZXRzKHRhYmxlKSkgeworCQl0aSA9IGRtX3RhYmxlX2dldF90YXJnZXQodGFibGUsIGkrKyk7CisKKwkJaWYgKHRpLT50eXBlLT5pdGVyYXRlX2RldmljZXMgJiYKKwkJICAgIHRpLT50eXBlLT5pdGVyYXRlX2RldmljZXModGksIGRtX2RldmljZV9tZXJnZV9pc19jb21wdWxzb3J5LCBOVUxMKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKgogICogUmV0dXJucyBvbGQgbWFwLCB3aGljaCBjYWxsZXIgbXVzdCBkZXN0cm95LgogICovCiBzdGF0aWMgc3RydWN0IGRtX3RhYmxlICpfX2JpbmQoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kLCBzdHJ1Y3QgZG1fdGFibGUgKnQsCkBAIC0xOTk1LDYgKzIwNTUsNyBAQAogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gbWQtPnF1ZXVlOwogCXNlY3Rvcl90IHNpemU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbWVyZ2VfaXNfb3B0aW9uYWw7CiAKIAlzaXplID0gZG1fdGFibGVfZ2V0X3NpemUodCk7CiAKQEAgLTIwMjAsMTAgKzIwODEsMTYgQEAKIAogCV9fYmluZF9tZW1wb29scyhtZCwgdCk7CiAKKwltZXJnZV9pc19vcHRpb25hbCA9IGRtX3RhYmxlX21lcmdlX2lzX29wdGlvbmFsKHQpOworCiAJd3JpdGVfbG9ja19pcnFzYXZlKCZtZC0+bWFwX2xvY2ssIGZsYWdzKTsKIAlvbGRfbWFwID0gbWQtPm1hcDsKIAltZC0+bWFwID0gdDsKIAlkbV90YWJsZV9zZXRfcmVzdHJpY3Rpb25zKHQsIHEsIGxpbWl0cyk7CisJaWYgKG1lcmdlX2lzX29wdGlvbmFsKQorCQlzZXRfYml0KERNRl9NRVJHRV9JU19PUFRJT05BTCwgJm1kLT5mbGFncyk7CisJZWxzZQorCQljbGVhcl9iaXQoRE1GX01FUkdFX0lTX09QVElPTkFMLCAmbWQtPmZsYWdzKTsKIAl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmbWQtPm1hcF9sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gb2xkX21hcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0uaCBiL2RyaXZlcnMvbWQvZG0uaAppbmRleCAxYWFmMTY3Li42NzQ1ZGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLmgKKysrIGIvZHJpdmVycy9tZC9kbS5oCkBAIC02Niw2ICs2Niw4IEBACiB2b2lkIGRtX3RhYmxlX2ZyZWVfbWRfbWVtcG9vbHMoc3RydWN0IGRtX3RhYmxlICp0KTsKIHN0cnVjdCBkbV9tZF9tZW1wb29scyAqZG1fdGFibGVfZ2V0X21kX21lbXBvb2xzKHN0cnVjdCBkbV90YWJsZSAqdCk7CiAKK2ludCBkbV9xdWV1ZV9tZXJnZV9pc19jb21wdWxzb3J5KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKKwogdm9pZCBkbV9sb2NrX21kX3R5cGUoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKIHZvaWQgZG1fdW5sb2NrX21kX3R5cGUoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKIHZvaWQgZG1fc2V0X21kX3R5cGUoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kLCB1bnNpZ25lZCB0eXBlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvS2NvbmZpZwppbmRleCA2OTk1OTQwLi45NTc1ZGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9LY29uZmlnCkBAIC02OCw3ICs2OCw2IEBACiAKIGNvbmZpZyBEVkJfQ09SRQogCXRyaXN0YXRlICJEVkIgZm9yIExpbnV4IgotCWRlcGVuZHMgb24gTkVUICYmIElORVQKIAlzZWxlY3QgQ1JDMzIKIAloZWxwCiAJICBEVkIgY29yZSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgZGV2aWNlIGhhbmRsaW5nLCBzb2Z0d2FyZSBmYWxsYmFja3MgZXRjLgpAQCAtODUsNiArODQsMTkgQEAKIAogCSAgSWYgdW5zdXJlIHNheSBOLgogCitjb25maWcgRFZCX05FVAorCWJvb2wgIkRWQiBOZXR3b3JrIFN1cHBvcnQiCisJZGVmYXVsdCAoTkVUICYmIElORVQpCisJZGVwZW5kcyBvbiBORVQgJiYgSU5FVCAmJiBEVkJfQ09SRQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgRFZCIE5ldHdvcmsgU3VwcG9ydCB3aGljaCBpcyBhIHBhcnQgb2YgdGhlIERWQgorCSAgc3RhbmRhcmQuIEl0IGlzIHVzZWQsIGZvciBleGFtcGxlLCBieSBhdXRvbWF0aWMgZmlybXdhcmUgdXBkYXRlcyB1c2VkCisJICBvbiBTZXQtVG9wLUJveGVzLiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgSW50ZXJuZXQgdmlhIHRoZQorCSAgRFZCIGNhcmQsIGlmIHRoZSBuZXR3b3JrIHByb3ZpZGVyIHN1cHBvcnRzIGl0LgorCisJICBZb3UgbWF5IHdhbnQgdG8gZGlzYWJsZSB0aGUgbmV0d29yayBzdXBwb3J0IG9uIGVtYmVkZGVkIGRldmljZXMuIElmCisJICB1bnN1cmUgc2F5IFkuCisKIGNvbmZpZyBWSURFT19NRURJQQogCXRyaXN0YXRlCiAJZGVmYXVsdCAoRFZCX0NPUkUgJiYgKFZJREVPX0RFViA9IG4pKSB8fCAoVklERU9fREVWICYmIChEVkJfQ09SRSA9IG4pKSB8fCAoRFZCX0NPUkUgJiYgVklERU9fREVWKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvS2NvbmZpZwppbmRleCAyMmQzY2EzLi45OTYzMDJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvS2NvbmZpZwpAQCAtMjMsNiArMjMsNyBAQAogCWRlcGVuZHMgb24gVklERU9fTUVESUEgJiYgSTJDCiAJc2VsZWN0IE1FRElBX1RVTkVSX1hDMjAyOCBpZiAhTUVESUFfVFVORVJfQ1VTVE9NSVNFCiAJc2VsZWN0IE1FRElBX1RVTkVSX1hDNTAwMCBpZiAhTUVESUFfVFVORVJfQ1VTVE9NSVNFCisJc2VsZWN0IE1FRElBX1RVTkVSX1hDNDAwMCBpZiAhTUVESUFfVFVORVJfQ1VTVE9NSVNFCiAJc2VsZWN0IE1FRElBX1RVTkVSX01UMjBYWCBpZiAhTUVESUFfVFVORVJfQ1VTVE9NSVNFCiAJc2VsZWN0IE1FRElBX1RVTkVSX1REQTgyOTAgaWYgIU1FRElBX1RVTkVSX0NVU1RPTUlTRQogCXNlbGVjdCBNRURJQV9UVU5FUl9URUE1NzYxIGlmICFNRURJQV9UVU5FUl9DVVNUT01JU0UKQEAgLTE1Miw2ICsxNTMsMTUgQEAKIAkgIFRoaXMgZGV2aWNlIGlzIG9ubHkgdXNlZCBpbnNpZGUgYSBTaVAgY2FsbGVkIHRvZ2V0aGVyIHdpdGggYQogCSAgZGVtb2R1bGF0b3IgZm9yIG5vdy4KIAorY29uZmlnIE1FRElBX1RVTkVSX1hDNDAwMAorCXRyaXN0YXRlICJYY2VpdmUgWEM0MDAwIHNpbGljb24gdHVuZXIiCisJZGVwZW5kcyBvbiBWSURFT19NRURJQSAmJiBJMkMKKwlkZWZhdWx0IG0gaWYgTUVESUFfVFVORVJfQ1VTVE9NSVNFCisJaGVscAorCSAgQSBkcml2ZXIgZm9yIHRoZSBzaWxpY29uIHR1bmVyIFhDNDAwMCBmcm9tIFhjZWl2ZS4KKwkgIFRoaXMgZGV2aWNlIGlzIG9ubHkgdXNlZCBpbnNpZGUgYSBTaVAgY2FsbGVkIHRvZ2V0aGVyIHdpdGggYQorCSAgZGVtb2R1bGF0b3IgZm9yIG5vdy4KKwogY29uZmlnIE1FRElBX1RVTkVSX01YTDUwMDVTCiAJdHJpc3RhdGUgIk1heExpbmVhciBNU0w1MDA1UyBzaWxpY29uIHR1bmVyIgogCWRlcGVuZHMgb24gVklERU9fTUVESUEgJiYgSTJDCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvTWFrZWZpbGUKaW5kZXggMmNiNGY1My4uMjBkMjRmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9NYWtlZmlsZQpAQCAtMTYsNiArMTYsNyBAQAogb2JqLSQoQ09ORklHX01FRElBX1RVTkVSX1REQTgyN1gpICs9IHRkYTgyN3gubwogb2JqLSQoQ09ORklHX01FRElBX1RVTkVSX1REQTE4MjcxKSArPSB0ZGExODI3MS5vCiBvYmotJChDT05GSUdfTUVESUFfVFVORVJfWEM1MDAwKSArPSB4YzUwMDAubworb2JqLSQoQ09ORklHX01FRElBX1RVTkVSX1hDNDAwMCkgKz0geGM0MDAwLm8KIG9iai0kKENPTkZJR19NRURJQV9UVU5FUl9NVDIwNjApICs9IG10MjA2MC5vCiBvYmotJChDT05GSUdfTUVESUFfVFVORVJfTVQyMjY2KSArPSBtdDIyNjYubwogb2JqLSQoQ09ORklHX01FRElBX1RVTkVSX1FUMTAxMCkgKz0gcXQxMDEwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci10eXBlcy5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3R1bmVyLXR5cGVzLmMKaW5kZXggYWZiYTZkYy4uOTRhNjAzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3R1bmVyLXR5cGVzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3R1bmVyLXR5cGVzLmMKQEAgLTE4MDUsNiArMTgwNSwxMCBAQAogCQkubmFtZSAgID0gIlhjZWl2ZSA1MDAwIHR1bmVyIiwKIAkJLyogc2VlIHhjNTAwMC5jIGZvciBkZXRhaWxzICovCiAJfSwKKwlbVFVORVJfWEM0MDAwXSA9IHsgLyogWGNlaXZlIDQwMDAgKi8KKwkJLm5hbWUgICA9ICJYY2VpdmUgNDAwMCB0dW5lciIsCisJCS8qIHNlZSB4YzQwMDAuYyBmb3IgZGV0YWlscyAqLworCX0sCiAJW1RVTkVSX1RDTF9NRjAyR0lQXzVOXSA9IHsgLyogVENMIHR1bmVyIE1GMDJHSVAtNU4tRSAqLwogCQkubmFtZSAgID0gIlRDTCB0dW5lciBNRjAyR0lQLTVOLUUiLAogCQkucGFyYW1zID0gdHVuZXJfdGNsX21mMDJnaXBfNW5fcGFyYW1zLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3hjNDAwMC5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3hjNDAwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNGY0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMveGM0MDAwLmMKQEAgLTAsMCArMSwxNjkxIEBACisvKgorICogIERyaXZlciBmb3IgWGNlaXZlIFhDNDAwMCAiUUFNLzhWU0Igc2luZ2xlIGNoaXAgdHVuZXIiCisgKgorICogIENvcHlyaWdodCAoYykgMjAwNyBYY2VpdmUgQ29ycG9yYXRpb24KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcgU3RldmVuIFRvdGggPHN0b3RoQGxpbnV4dHYub3JnPgorICogIENvcHlyaWdodCAoYykgMjAwOSBEZXZpbiBIZWl0bXVlbGxlciA8ZGhlaXRtdWVsbGVyQGtlcm5lbGxhYnMuY29tPgorICogIENvcHlyaWdodCAoYykgMjAwOSBEYXZpZGUgRmVycmkgPGQuZmVycmlAemVybzExLml0PgorICogIENvcHlyaWdodCAoYykgMjAxMCBJc3R2YW4gVmFyZ2EgPGlzdHZhbl92QG1haWxib3guaHU+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisKKyNpbmNsdWRlICJ4YzQwMDAuaCIKKyNpbmNsdWRlICJ0dW5lci1pMmMuaCIKKyNpbmNsdWRlICJ0dW5lci14YzIwMjgtdHlwZXMuaCIKKworc3RhdGljIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1Z2dpbmcgbGV2ZWwgKDAgdG8gMiwgZGVmYXVsdDogMCAob2ZmKSkuIik7CisKK3N0YXRpYyBpbnQgbm9fcG93ZXJvZmY7Cittb2R1bGVfcGFyYW0obm9fcG93ZXJvZmYsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vX3Bvd2Vyb2ZmLCAiUG93ZXIgbWFuYWdlbWVudCAoMTogZGlzYWJsZWQsIDI6IGVuYWJsZWQsICIKKwkiMCAoZGVmYXVsdCk6IHVzZSBkZXZpY2Utc3BlY2lmaWMgZGVmYXVsdCBtb2RlKS4iKTsKKworc3RhdGljIGludCBhdWRpb19zdGQ7Cittb2R1bGVfcGFyYW0oYXVkaW9fc3RkLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhhdWRpb19zdGQsICJBdWRpbyBzdGFuZGFyZC4gWEM0MDAwIGF1ZGlvIGRlY29kZXIgZXhwbGljaXRseSAiCisJIm5lZWRzIHRvIGtub3cgd2hhdCBhdWRpbyBzdGFuZGFyZCBpcyBuZWVkZWQgZm9yIHNvbWUgdmlkZW8gc3RhbmRhcmRzICIKKwkid2l0aCBhdWRpbyBBMiBvciBOSUNBTS4gVGhlIHZhbGlkIHNldHRpbmdzIGFyZSBhIHN1bSBvZjpcbiIKKwkiIDE6IHVzZSBOSUNBTS9CIG9yIEEyL0IgaW5zdGVhZCBvZiBOSUNBTS9BIG9yIEEyL0FcbiIKKwkiIDI6IHVzZSBBMiBpbnN0ZWFkIG9mIE5JQ0FNIG9yIEJUU0NcbiIKKwkiIDQ6IHVzZSBTRUNBTS9LMyBpbnN0ZWFkIG9mIEsxXG4iCisJIiA4OiB1c2UgUEFMLUQvSyBhdWRpbyBmb3IgU0VDQU0tRC9LXG4iCisJIjE2OiB1c2UgRk0gcmFkaW8gaW5wdXQgMSBpbnN0ZWFkIG9mIGlucHV0IDJcbiIKKwkiMzI6IHVzZSBtb25vIGF1ZGlvICh0aGUgbG93ZXIgdGhyZWUgYml0cyBhcmUgaWdub3JlZCkiKTsKKworc3RhdGljIGNoYXIgZmlybXdhcmVfbmFtZVszMF07Cittb2R1bGVfcGFyYW1fc3RyaW5nKGZpcm13YXJlX25hbWUsIGZpcm13YXJlX25hbWUsIHNpemVvZihmaXJtd2FyZV9uYW1lKSwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZpcm13YXJlX25hbWUsICJGaXJtd2FyZSBmaWxlIG5hbWUuIEFsbG93cyBvdmVycmlkaW5nIHRoZSAiCisJImRlZmF1bHQgZmlybXdhcmUgbmFtZS4iKTsKKworc3RhdGljIERFRklORV9NVVRFWCh4YzQwMDBfbGlzdF9tdXRleCk7CitzdGF0aWMgTElTVF9IRUFEKGh5YnJpZF90dW5lcl9pbnN0YW5jZV9saXN0KTsKKworI2RlZmluZSBkcHJpbnRrKGxldmVsLCBmbXQsIGFyZy4uLikgaWYgKGRlYnVnID49IGxldmVsKSBcCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICIgZm10LCAieGM0MDAwIiwgIyMgYXJnKQorCisvKiBzdHJ1Y3QgZm9yIHN0b3JpbmcgZmlybXdhcmUgdGFibGUgKi8KK3N0cnVjdCBmaXJtd2FyZV9kZXNjcmlwdGlvbiB7CisJdW5zaWduZWQgaW50ICB0eXBlOworCXY0bDJfc3RkX2lkICAgaWQ7CisJX191MTYgICAgICAgICBpbnRfZnJlcTsKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisJdW5zaWduZWQgaW50ICBzaXplOworfTsKKworc3RydWN0IGZpcm13YXJlX3Byb3BlcnRpZXMgeworCXVuc2lnbmVkIGludAl0eXBlOworCXY0bDJfc3RkX2lkCWlkOworCXY0bDJfc3RkX2lkCXN0ZF9yZXE7CisJX191MTYJCWludF9mcmVxOworCXVuc2lnbmVkIGludAlzY29kZV90YWJsZTsKKwlpbnQJCXNjb2RlX25yOworfTsKKworc3RydWN0IHhjNDAwMF9wcml2IHsKKwlzdHJ1Y3QgdHVuZXJfaTJjX3Byb3BzIGkyY19wcm9wczsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGh5YnJpZF90dW5lcl9pbnN0YW5jZV9saXN0OworCXN0cnVjdCBmaXJtd2FyZV9kZXNjcmlwdGlvbiAqZmlybTsKKwlpbnQJZmlybV9zaXplOworCXUzMglpZl9raHo7CisJdTMyCWZyZXFfaHo7CisJdTMyCWJhbmR3aWR0aDsKKwl1OAl2aWRlb19zdGFuZGFyZDsKKwl1OAlyZl9tb2RlOworCXU4CWRlZmF1bHRfcG07CisJdTgJZHZiX2FtcGxpdHVkZTsKKwl1OAlzZXRfc21vb3RoZWRjdmJzOworCXU4CWlnbm9yZV9pMmNfd3JpdGVfZXJyb3JzOworCV9fdTE2CWZpcm1fdmVyc2lvbjsKKwlzdHJ1Y3QgZmlybXdhcmVfcHJvcGVydGllcyBjdXJfZnc7CisJX191MTYJaHdtb2RlbDsKKwlfX3UxNglod3ZlcnM7CisJc3RydWN0IG11dGV4CWxvY2s7Cit9OworCisjZGVmaW5lIFhDNDAwMF9BVURJT19TVERfQgkJIDEKKyNkZWZpbmUgWEM0MDAwX0FVRElPX1NURF9BMgkJIDIKKyNkZWZpbmUgWEM0MDAwX0FVRElPX1NURF9LMwkJIDQKKyNkZWZpbmUgWEM0MDAwX0FVRElPX1NURF9MCQkgOAorI2RlZmluZSBYQzQwMDBfQVVESU9fU1REX0lOUFVUMQkJMTYKKyNkZWZpbmUgWEM0MDAwX0FVRElPX1NURF9NT05PCQkzMgorCisjZGVmaW5lIFhDNDAwMF9ERUZBVUxUX0ZJUk1XQVJFICJkdmItZmUteGM0MDAwLTEuNC5mdyIKKworLyogTWlzYyBEZWZpbmVzICovCisjZGVmaW5lIE1BWF9UVl9TVEFOREFSRAkJCTI0CisjZGVmaW5lIFhDX01BWF9JMkNfV1JJVEVfTEVOR1RICQk2NAorI2RlZmluZSBYQ19QT1dFUkVEX0RPV04JCQkweDgwMDAwMDAwVQorCisvKiBTaWduYWwgVHlwZXMgKi8KKyNkZWZpbmUgWENfUkZfTU9ERV9BSVIJCQkwCisjZGVmaW5lIFhDX1JGX01PREVfQ0FCTEUJCTEKKworLyogUHJvZHVjdCBpZCAqLworI2RlZmluZSBYQ19QUk9EVUNUX0lEX0ZXX05PVF9MT0FERUQJMHgyMDAwCisjZGVmaW5lIFhDX1BST0RVQ1RfSURfWEM0MDAwCQkweDBGQTAKKyNkZWZpbmUgWENfUFJPRFVDVF9JRF9YQzQxMDAJCTB4MTAwNAorCisvKiBSZWdpc3RlcnMgKFdyaXRlLW9ubHkpICovCisjZGVmaW5lIFhSRUdfSU5JVCAgICAgICAgIDB4MDAKKyNkZWZpbmUgWFJFR19WSURFT19NT0RFICAgMHgwMQorI2RlZmluZSBYUkVHX0FVRElPX01PREUgICAweDAyCisjZGVmaW5lIFhSRUdfUkZfRlJFUSAgICAgIDB4MDMKKyNkZWZpbmUgWFJFR19EX0NPREUgICAgICAgMHgwNAorI2RlZmluZSBYUkVHX0RJUkVDVFNJVFRJTkdfTU9ERSAweDA1CisjZGVmaW5lIFhSRUdfU0VFS19NT0RFICAgIDB4MDYKKyNkZWZpbmUgWFJFR19QT1dFUl9ET1dOICAgMHgwOAorI2RlZmluZSBYUkVHX1NJR05BTFNPVVJDRSAweDBBCisjZGVmaW5lIFhSRUdfU01PT1RIRURDVkJTIDB4MEUKKyNkZWZpbmUgWFJFR19BTVBMSVRVREUgICAgMHgxMAorCisvKiBSZWdpc3RlcnMgKFJlYWQtb25seSkgKi8KKyNkZWZpbmUgWFJFR19BRENfRU5WICAgICAgMHgwMAorI2RlZmluZSBYUkVHX1FVQUxJVFkgICAgICAweDAxCisjZGVmaW5lIFhSRUdfRlJBTUVfTElORVMgIDB4MDIKKyNkZWZpbmUgWFJFR19IU1lOQ19GUkVRICAgMHgwMworI2RlZmluZSBYUkVHX0xPQ0sgICAgICAgICAweDA0CisjZGVmaW5lIFhSRUdfRlJFUV9FUlJPUiAgIDB4MDUKKyNkZWZpbmUgWFJFR19TTlIgICAgICAgICAgMHgwNgorI2RlZmluZSBYUkVHX1ZFUlNJT04gICAgICAweDA3CisjZGVmaW5lIFhSRUdfUFJPRFVDVF9JRCAgIDB4MDgKKworLyoKKyAgIEJhc2ljIGZpcm13YXJlIGRlc2NyaXB0aW9uLiBUaGlzIHdpbGwgcmVtYWluIHdpdGgKKyAgIHRoZSBkcml2ZXIgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMuCisKKyAgIFRoaXMgcmVwcmVzZW50cyBhbiBJMkMgZmlybXdhcmUgZmlsZSBlbmNvZGVkIGFzIGEKKyAgIHN0cmluZyBvZiB1bnNpZ25lZCBjaGFyLiBGb3JtYXQgaXMgYXMgZm9sbG93czoKKworICAgY2hhclswICBdPWxlbjBfTVNCICAtPiBsZW4gPSBsZW5fTVNCICogMjU2ICsgbGVuX0xTQgorICAgY2hhclsxICBdPWxlbjBfTFNCICAtPiBsZW5ndGggb2YgZmlyc3Qgd3JpdGUgdHJhbnNhY3Rpb24KKyAgIGNoYXJbMiAgXT1kYXRhMCAtPiBmaXJzdCBieXRlIHRvIGJlIHNlbnQKKyAgIGNoYXJbMyAgXT1kYXRhMQorICAgY2hhcls0ICBdPWRhdGEyCisgICBjaGFyWyAgIF09Li4uCisgICBjaGFyW00gIF09ZGF0YU4gIC0+IGxhc3QgYnl0ZSB0byBiZSBzZW50CisgICBjaGFyW00rMV09bGVuMV9NU0IgIC0+IGxlbiA9IGxlbl9NU0IgKiAyNTYgKyBsZW5fTFNCCisgICBjaGFyW00rMl09bGVuMV9MU0IgIC0+IGxlbmd0aCBvZiBzZWNvbmQgd3JpdGUgdHJhbnNhY3Rpb24KKyAgIGNoYXJbTSszXT1kYXRhMAorICAgY2hhcltNKzRdPWRhdGExCisgICAuLi4KKyAgIGV0Yy4KKworICAgVGhlIFtsZW5dIHZhbHVlIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBmb2xsb3dzOgorCisgICBsZW49IGxlbl9NU0IgXyBsZW5fTFNCCisgICBsZW49MTExMV8xMTExXzExMTFfMTExMSAgIDogRW5kIG9mIEkyQ19TRVFVRU5DRQorICAgbGVuPTAwMDBfMDAwMF8wMDAwXzAwMDAgICA6IFJlc2V0IGNvbW1hbmQ6IERvIGhhcmR3YXJlIHJlc2V0CisgICBsZW49ME5OTl9OTk5OX05OTk5fTk5OTiAgIDogTm9ybWFsIHRyYW5zYWN0aW9uOiBudW1iZXIgb2YgYnl0ZXMgPSB7MTozMjc2NykKKyAgIGxlbj0xV1dXX1dXV1dfV1dXV19XV1dXICAgOiBXYWl0IGNvbW1hbmQ6IHdhaXQgZm9yIHsxOjMyNzY3fSBtcworCisgICBGb3IgdGhlIFJFU0VUIGFuZCBXQUlUIGNvbW1hbmRzLCB0aGUgdHdvIGZvbGxvd2luZyBieXRlcyB3aWxsIGNvbnRhaW4KKyAgIGltbWVkaWF0ZWx5IHRoZSBsZW5ndGggb2YgdGhlIGZvbGxvd2luZyB0cmFuc2FjdGlvbi4KKyovCisKK3N0cnVjdCBYQ19UVl9TVEFOREFSRCB7CisJY29uc3QgY2hhciAgKk5hbWU7CisJdTE2CSAgICBhdWRpb19tb2RlOworCXUxNgkgICAgdmlkZW9fbW9kZTsKKwl1MTYJICAgIGludF9mcmVxOworfTsKKworLyogVHVuZXIgc3RhbmRhcmRzICovCisjZGVmaW5lIFhDNDAwMF9NTl9OVFNDX1BBTF9CVFNDCQkwCisjZGVmaW5lIFhDNDAwMF9NTl9OVFNDX1BBTF9BMgkJMQorI2RlZmluZSBYQzQwMDBfTU5fTlRTQ19QQUxfRUlBSgkJMgorI2RlZmluZSBYQzQwMDBfTU5fTlRTQ19QQUxfTW9ubwkJMworI2RlZmluZSBYQzQwMDBfQkdfUEFMX0EyCQk0CisjZGVmaW5lIFhDNDAwMF9CR19QQUxfTklDQU0JCTUKKyNkZWZpbmUgWEM0MDAwX0JHX1BBTF9NT05PCQk2CisjZGVmaW5lIFhDNDAwMF9JX1BBTF9OSUNBTQkJNworI2RlZmluZSBYQzQwMDBfSV9QQUxfTklDQU1fTU9OTwkJOAorI2RlZmluZSBYQzQwMDBfREtfUEFMX0EyCQk5CisjZGVmaW5lIFhDNDAwMF9ES19QQUxfTklDQU0JCTEwCisjZGVmaW5lIFhDNDAwMF9ES19QQUxfTU9OTwkJMTEKKyNkZWZpbmUgWEM0MDAwX0RLX1NFQ0FNX0EyREsxCQkxMgorI2RlZmluZSBYQzQwMDBfREtfU0VDQU1fQTJMREszCQkxMworI2RlZmluZSBYQzQwMDBfREtfU0VDQU1fQTJNT05PCQkxNAorI2RlZmluZSBYQzQwMDBfREtfU0VDQU1fTklDQU0JCTE1CisjZGVmaW5lIFhDNDAwMF9MX1NFQ0FNX05JQ0FNCQkxNgorI2RlZmluZSBYQzQwMDBfTENfU0VDQU1fTklDQU0JCTE3CisjZGVmaW5lIFhDNDAwMF9EVFY2CQkJMTgKKyNkZWZpbmUgWEM0MDAwX0RUVjgJCQkxOQorI2RlZmluZSBYQzQwMDBfRFRWN184CQkJMjAKKyNkZWZpbmUgWEM0MDAwX0RUVjcJCQkyMQorI2RlZmluZSBYQzQwMDBfRk1fUmFkaW9fSU5QVVQyCQkyMgorI2RlZmluZSBYQzQwMDBfRk1fUmFkaW9fSU5QVVQxCQkyMworCitzdGF0aWMgc3RydWN0IFhDX1RWX1NUQU5EQVJEIHhjNDAwMF9zdGFuZGFyZFtNQVhfVFZfU1RBTkRBUkRdID0geworCXsiTS9OLU5UU0MvUEFMLUJUU0MiLAkweDAwMDAsIDB4ODBBMCwgNDUwMH0sCisJeyJNL04tTlRTQy9QQUwtQTIiLAkweDAwMDAsIDB4ODBBMCwgNDYwMH0sCisJeyJNL04tTlRTQy9QQUwtRUlBSiIsCTB4MDA0MCwgMHg4MEEwLCA0NTAwfSwKKwl7Ik0vTi1OVFNDL1BBTC1Nb25vIiwJMHgwMDc4LCAweDgwQTAsIDQ1MDB9LAorCXsiQi9HLVBBTC1BMiIsCQkweDAwMDAsIDB4ODE1OSwgNTY0MH0sCisJeyJCL0ctUEFMLU5JQ0FNIiwJMHgwMDA0LCAweDgxNTksIDU3NDB9LAorCXsiQi9HLVBBTC1NT05PIiwJMHgwMDc4LCAweDgxNTksIDU1MDB9LAorCXsiSS1QQUwtTklDQU0iLAkJMHgwMDgwLCAweDgwNDksIDYyNDB9LAorCXsiSS1QQUwtTklDQU0tTU9OTyIsCTB4MDA3OCwgMHg4MDQ5LCA2MDAwfSwKKwl7IkQvSy1QQUwtQTIiLAkJMHgwMDAwLCAweDgwNDksIDYzODB9LAorCXsiRC9LLVBBTC1OSUNBTSIsCTB4MDA4MCwgMHg4MDQ5LCA2MjAwfSwKKwl7IkQvSy1QQUwtTU9OTyIsCTB4MDA3OCwgMHg4MDQ5LCA2NTAwfSwKKwl7IkQvSy1TRUNBTS1BMiBESzEiLAkweDAwMDAsIDB4ODA0OSwgNjM0MH0sCisJeyJEL0stU0VDQU0tQTIgTC9ESzMiLAkweDAwMDAsIDB4ODA0OSwgNjAwMH0sCisJeyJEL0stU0VDQU0tQTIgTU9OTyIsCTB4MDA3OCwgMHg4MDQ5LCA2NTAwfSwKKwl7IkQvSy1TRUNBTS1OSUNBTSIsCTB4MDA4MCwgMHg4MDQ5LCA2MjAwfSwKKwl7IkwtU0VDQU0tTklDQU0iLAkweDgwODAsIDB4MDAwOSwgNjIwMH0sCisJeyJMJy1TRUNBTS1OSUNBTSIsCTB4ODA4MCwgMHg0MDA5LCA2MjAwfSwKKwl7IkRUVjYiLAkJMHgwMEMwLCAweDgwMDIsICAgIDB9LAorCXsiRFRWOCIsCQkweDAwQzAsIDB4ODAwQiwgICAgMH0sCisJeyJEVFY3LzgiLAkJMHgwMEMwLCAweDgwMUIsICAgIDB9LAorCXsiRFRWNyIsCQkweDAwQzAsIDB4ODAwNywgICAgMH0sCisJeyJGTSBSYWRpby1JTlBVVDIiLAkweDAwMDgsIDB4OTgwMCwgMTA3MDB9LAorCXsiRk0gUmFkaW8tSU5QVVQxIiwJMHgwMDA4LCAweDkwMDAsIDEwNzAwfQorfTsKKworc3RhdGljIGludCB4YzQwMDBfcmVhZHJlZyhzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYsIHUxNiByZWcsIHUxNiAqdmFsKTsKK3N0YXRpYyBpbnQgeGM0MDAwX3R1bmVyX3Jlc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKTsKK3N0YXRpYyB2b2lkIHhjX2RlYnVnX2R1bXAoc3RydWN0IHhjNDAwMF9wcml2ICpwcml2KTsKKworc3RhdGljIGludCB4Y19zZW5kX2kyY19kYXRhKHN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiwgdTggKmJ1ZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gcHJpdi0+aTJjX3Byb3BzLmFkZHIsCisJCQkgICAgICAgLmZsYWdzID0gMCwgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IGxlbiB9OworCWlmIChpMmNfdHJhbnNmZXIocHJpdi0+aTJjX3Byb3BzLmFkYXAsICZtc2csIDEpICE9IDEpIHsKKwkJaWYgKHByaXYtPmlnbm9yZV9pMmNfd3JpdGVfZXJyb3JzID09IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAieGM0MDAwOiBJMkMgd3JpdGUgZmFpbGVkIChsZW49JWkpXG4iLAorCQkJICAgICAgIGxlbik7CisJCQlpZiAobGVuID09IDQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImJ5dGVzICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIGJ1ZlswXSwKKwkJCQkgICAgICAgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSk7CisJCQl9CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4YzQwMDBfdHVuZXJfcmVzZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IHhjNDAwMF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJaW50IHJldDsKKworCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWlmIChmZS0+Y2FsbGJhY2spIHsKKwkJcmV0ID0gZmUtPmNhbGxiYWNrKCgoZmUtPmR2YikgJiYgKGZlLT5kdmItPnByaXYpKSA/CisJCQkJCSAgIGZlLT5kdmItPnByaXYgOgorCQkJCQkgICBwcml2LT5pMmNfcHJvcHMuYWRhcC0+YWxnb19kYXRhLAorCQkJCQkgICBEVkJfRlJPTlRFTkRfQ09NUE9ORU5UX1RVTkVSLAorCQkJCQkgICBYQzQwMDBfVFVORVJfUkVTRVQsIDApOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgInhjNDAwMDogcmVzZXQgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRVJFTU9URUlPOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ4YzQwMDA6IG5vIHR1bmVyIHJlc2V0IGNhbGxiYWNrIGZ1bmN0aW9uLCAiCisJCQkJImZhdGFsXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhjX3dyaXRlX3JlZyhzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYsIHUxNiByZWdBZGRyLCB1MTYgaTJjRGF0YSkKK3sKKwl1OCBidWZbNF07CisJaW50IHJlc3VsdDsKKworCWJ1ZlswXSA9IChyZWdBZGRyID4+IDgpICYgMHhGRjsKKwlidWZbMV0gPSByZWdBZGRyICYgMHhGRjsKKwlidWZbMl0gPSAoaTJjRGF0YSA+PiA4KSAmIDB4RkY7CisJYnVmWzNdID0gaTJjRGF0YSAmIDB4RkY7CisJcmVzdWx0ID0geGNfc2VuZF9pMmNfZGF0YShwcml2LCBidWYsIDQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCB4Y19sb2FkX2kyY19zZXF1ZW5jZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgY29uc3QgdTggKmkyY19zZXF1ZW5jZSkKK3sKKwlzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKworCWludCBpLCBuYnl0ZXNfdG9fc2VuZCwgcmVzdWx0OworCXVuc2lnbmVkIGludCBsZW4sIHBvcywgaW5kZXg7CisJdTggYnVmW1hDX01BWF9JMkNfV1JJVEVfTEVOR1RIXTsKKworCWluZGV4ID0gMDsKKwl3aGlsZSAoKGkyY19zZXF1ZW5jZVtpbmRleF0gIT0gMHhGRikgfHwKKwkJKGkyY19zZXF1ZW5jZVtpbmRleCArIDFdICE9IDB4RkYpKSB7CisJCWxlbiA9IGkyY19zZXF1ZW5jZVtpbmRleF0gKiAyNTYgKyBpMmNfc2VxdWVuY2VbaW5kZXgrMV07CisJCWlmIChsZW4gPT0gMHgwMDAwKSB7CisJCQkvKiBSRVNFVCBjb21tYW5kICovCisJCQkvKiBOT1RFOiB0aGlzIGlzIGlnbm9yZWQsIGFzIHRoZSByZXNldCBjYWxsYmFjayB3YXMgKi8KKwkJCS8qIGFscmVhZHkgY2FsbGVkIGJ5IGNoZWNrX2Zpcm13YXJlKCkgKi8KKwkJCWluZGV4ICs9IDI7CisJCX0gZWxzZSBpZiAobGVuICYgMHg4MDAwKSB7CisJCQkvKiBXQUlUIGNvbW1hbmQgKi8KKwkJCW1zbGVlcChsZW4gJiAweDdGRkYpOworCQkJaW5kZXggKz0gMjsKKwkJfSBlbHNlIHsKKwkJCS8qIFNlbmQgaTJjIGRhdGEgd2hpbHN0IGVuc3VyaW5nIGluZGl2aWR1YWwgdHJhbnNhY3Rpb25zCisJCQkgKiBkbyBub3QgZXhjZWVkIFhDX01BWF9JMkNfV1JJVEVfTEVOR1RIIGJ5dGVzLgorCQkJICovCisJCQlpbmRleCArPSAyOworCQkJYnVmWzBdID0gaTJjX3NlcXVlbmNlW2luZGV4XTsKKwkJCWJ1ZlsxXSA9IGkyY19zZXF1ZW5jZVtpbmRleCArIDFdOworCQkJcG9zID0gMjsKKwkJCXdoaWxlIChwb3MgPCBsZW4pIHsKKwkJCQlpZiAoKGxlbiAtIHBvcykgPiBYQ19NQVhfSTJDX1dSSVRFX0xFTkdUSCAtIDIpCisJCQkJCW5ieXRlc190b19zZW5kID0KKwkJCQkJCVhDX01BWF9JMkNfV1JJVEVfTEVOR1RIOworCQkJCWVsc2UKKwkJCQkJbmJ5dGVzX3RvX3NlbmQgPSAobGVuIC0gcG9zICsgMik7CisJCQkJZm9yIChpID0gMjsgaSA8IG5ieXRlc190b19zZW5kOyBpKyspIHsKKwkJCQkJYnVmW2ldID0gaTJjX3NlcXVlbmNlW2luZGV4ICsgcG9zICsKKwkJCQkJCWkgLSAyXTsKKwkJCQl9CisJCQkJcmVzdWx0ID0geGNfc2VuZF9pMmNfZGF0YShwcml2LCBidWYsCisJCQkJCW5ieXRlc190b19zZW5kKTsKKworCQkJCWlmIChyZXN1bHQgIT0gMCkKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKworCQkJCXBvcyArPSBuYnl0ZXNfdG9fc2VuZCAtIDI7CisJCQl9CisJCQlpbmRleCArPSBsZW47CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGNfc2V0X3R2X3N0YW5kYXJkKHN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiwKKwl1MTYgdmlkZW9fbW9kZSwgdTE2IGF1ZGlvX21vZGUpCit7CisJaW50IHJldDsKKwlkcHJpbnRrKDEsICIlcygweCUwNHgsMHglMDR4KVxuIiwgX19mdW5jX18sIHZpZGVvX21vZGUsIGF1ZGlvX21vZGUpOworCWRwcmludGsoMSwgIiVzKCkgU3RhbmRhcmQgPSAlc1xuIiwKKwkJX19mdW5jX18sCisJCXhjNDAwMF9zdGFuZGFyZFtwcml2LT52aWRlb19zdGFuZGFyZF0uTmFtZSk7CisKKwkvKiBEb24ndCBjb21wbGFpbiB3aGVuIHRoZSByZXF1ZXN0IGZhaWxzIGJlY2F1c2Ugb2YgaTJjIHN0cmV0Y2hpbmcgKi8KKwlwcml2LT5pZ25vcmVfaTJjX3dyaXRlX2Vycm9ycyA9IDE7CisKKwlyZXQgPSB4Y193cml0ZV9yZWcocHJpdiwgWFJFR19WSURFT19NT0RFLCB2aWRlb19tb2RlKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IHhjX3dyaXRlX3JlZyhwcml2LCBYUkVHX0FVRElPX01PREUsIGF1ZGlvX21vZGUpOworCisJcHJpdi0+aWdub3JlX2kyY193cml0ZV9lcnJvcnMgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB4Y19zZXRfc2lnbmFsX3NvdXJjZShzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYsIHUxNiByZl9tb2RlKQoreworCWRwcmludGsoMSwgIiVzKCVkKSBTb3VyY2UgPSAlc1xuIiwgX19mdW5jX18sIHJmX21vZGUsCisJCXJmX21vZGUgPT0gWENfUkZfTU9ERV9BSVIgPyAiQU5URU5OQSIgOiAiQ0FCTEUiKTsKKworCWlmICgocmZfbW9kZSAhPSBYQ19SRl9NT0RFX0FJUikgJiYgKHJmX21vZGUgIT0gWENfUkZfTU9ERV9DQUJMRSkpIHsKKwkJcmZfbW9kZSA9IFhDX1JGX01PREVfQ0FCTEU7CisJCXByaW50ayhLRVJOX0VSUgorCQkJIiVzKCksIEludmFsaWQgbW9kZSwgZGVmYXVsdGluZyB0byBDQUJMRSIsCisJCQlfX2Z1bmNfXyk7CisJfQorCXJldHVybiB4Y193cml0ZV9yZWcocHJpdiwgWFJFR19TSUdOQUxTT1VSQ0UsIHJmX21vZGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGR2Yl90dW5lcl9vcHMgeGM0MDAwX3R1bmVyX29wczsKKworc3RhdGljIGludCB4Y19zZXRfcmZfZnJlcXVlbmN5KHN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiwgdTMyIGZyZXFfaHopCit7CisJdTE2IGZyZXFfY29kZTsKKworCWRwcmludGsoMSwgIiVzKCV1KVxuIiwgX19mdW5jX18sIGZyZXFfaHopOworCisJaWYgKChmcmVxX2h6ID4geGM0MDAwX3R1bmVyX29wcy5pbmZvLmZyZXF1ZW5jeV9tYXgpIHx8CisJICAgIChmcmVxX2h6IDwgeGM0MDAwX3R1bmVyX29wcy5pbmZvLmZyZXF1ZW5jeV9taW4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZyZXFfY29kZSA9ICh1MTYpKGZyZXFfaHogLyAxNTYyNSk7CisKKwkvKiBXQVM6IFN0YXJ0aW5nIGluIGZpcm13YXJlIHZlcnNpb24gMS4xLjQ0LCBYY2VpdmUgcmVjb21tZW5kcyB1c2luZyB0aGUKKwkgICBGSU5FUkZSRVEgZm9yIGFsbCBub3JtYWwgdHVuaW5nICh0aGUgZG9jIGluZGljYXRlcyByZWcgMHgwMyBzaG91bGQKKwkgICBvbmx5IGJlIHVzZWQgZm9yIGZhc3Qgc2Nhbm5pbmcgZm9yIGNoYW5uZWwgbG9jaykgKi8KKwkvKiBXQVM6IFhSRUdfRklORVJGUkVRICovCisJcmV0dXJuIHhjX3dyaXRlX3JlZyhwcml2LCBYUkVHX1JGX0ZSRVEsIGZyZXFfY29kZSk7Cit9CisKK3N0YXRpYyBpbnQgeGNfZ2V0X2FkY19lbnZlbG9wZShzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYsIHUxNiAqYWRjX2VudmVsb3BlKQoreworCXJldHVybiB4YzQwMDBfcmVhZHJlZyhwcml2LCBYUkVHX0FEQ19FTlYsIGFkY19lbnZlbG9wZSk7Cit9CisKK3N0YXRpYyBpbnQgeGNfZ2V0X2ZyZXF1ZW5jeV9lcnJvcihzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYsIHUzMiAqZnJlcV9lcnJvcl9oeikKK3sKKwlpbnQgcmVzdWx0OworCXUxNiByZWdEYXRhOworCXUzMiB0bXA7CisKKwlyZXN1bHQgPSB4YzQwMDBfcmVhZHJlZyhwcml2LCBYUkVHX0ZSRVFfRVJST1IsICZyZWdEYXRhKTsKKwlpZiAocmVzdWx0ICE9IDApCisJCXJldHVybiByZXN1bHQ7CisKKwl0bXAgPSAodTMyKXJlZ0RhdGEgJiAweEZGRkZVOworCXRtcCA9ICh0bXAgPCAweDgwMDBVID8gdG1wIDogMHgxMDAwMFUgLSB0bXApOworCSgqZnJlcV9lcnJvcl9oeikgPSB0bXAgKiAxNTYyNTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHhjX2dldF9sb2NrX3N0YXR1cyhzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYsIHUxNiAqbG9ja19zdGF0dXMpCit7CisJcmV0dXJuIHhjNDAwMF9yZWFkcmVnKHByaXYsIFhSRUdfTE9DSywgbG9ja19zdGF0dXMpOworfQorCitzdGF0aWMgaW50IHhjX2dldF92ZXJzaW9uKHN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiwKKwl1OCAqaHdfbWFqb3J2ZXJzaW9uLCB1OCAqaHdfbWlub3J2ZXJzaW9uLAorCXU4ICpmd19tYWpvcnZlcnNpb24sIHU4ICpmd19taW5vcnZlcnNpb24pCit7CisJdTE2IGRhdGE7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IHhjNDAwMF9yZWFkcmVnKHByaXYsIFhSRUdfVkVSU0lPTiwgJmRhdGEpOworCWlmIChyZXN1bHQgIT0gMCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCSgqaHdfbWFqb3J2ZXJzaW9uKSA9IChkYXRhID4+IDEyKSAmIDB4MEY7CisJKCpod19taW5vcnZlcnNpb24pID0gKGRhdGEgPj4gIDgpICYgMHgwRjsKKwkoKmZ3X21ham9ydmVyc2lvbikgPSAoZGF0YSA+PiAgNCkgJiAweDBGOworCSgqZndfbWlub3J2ZXJzaW9uKSA9IGRhdGEgJiAweDBGOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGNfZ2V0X2hzeW5jX2ZyZXEoc3RydWN0IHhjNDAwMF9wcml2ICpwcml2LCB1MzIgKmhzeW5jX2ZyZXFfaHopCit7CisJdTE2IHJlZ0RhdGE7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IHhjNDAwMF9yZWFkcmVnKHByaXYsIFhSRUdfSFNZTkNfRlJFUSwgJnJlZ0RhdGEpOworCWlmIChyZXN1bHQgIT0gMCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCSgqaHN5bmNfZnJlcV9oeikgPSAoKHJlZ0RhdGEgJiAweDBmZmYpICogNzYzKS8xMDA7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCB4Y19nZXRfZnJhbWVfbGluZXMoc3RydWN0IHhjNDAwMF9wcml2ICpwcml2LCB1MTYgKmZyYW1lX2xpbmVzKQoreworCXJldHVybiB4YzQwMDBfcmVhZHJlZyhwcml2LCBYUkVHX0ZSQU1FX0xJTkVTLCBmcmFtZV9saW5lcyk7Cit9CisKK3N0YXRpYyBpbnQgeGNfZ2V0X3F1YWxpdHkoc3RydWN0IHhjNDAwMF9wcml2ICpwcml2LCB1MTYgKnF1YWxpdHkpCit7CisJcmV0dXJuIHhjNDAwMF9yZWFkcmVnKHByaXYsIFhSRUdfUVVBTElUWSwgcXVhbGl0eSk7Cit9CisKK3N0YXRpYyB1MTYgeGNfd2FpdF9mb3JfbG9jayhzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYpCit7CisJdTE2CWxvY2tfc3RhdGUgPSAwOworCWludAl3YXRjaGRvZ19jb3VudCA9IDQwOworCisJd2hpbGUgKChsb2NrX3N0YXRlID09IDApICYmICh3YXRjaGRvZ19jb3VudCA+IDApKSB7CisJCXhjX2dldF9sb2NrX3N0YXR1cyhwcml2LCAmbG9ja19zdGF0ZSk7CisJCWlmIChsb2NrX3N0YXRlICE9IDEpIHsKKwkJCW1zbGVlcCg1KTsKKwkJCXdhdGNoZG9nX2NvdW50LS07CisJCX0KKwl9CisJcmV0dXJuIGxvY2tfc3RhdGU7Cit9CisKK3N0YXRpYyBpbnQgeGNfdHVuZV9jaGFubmVsKHN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiwgdTMyIGZyZXFfaHopCit7CisJaW50CWZvdW5kID0gMTsKKwlpbnQJcmVzdWx0OworCisJZHByaW50aygxLCAiJXMoJXUpXG4iLCBfX2Z1bmNfXywgZnJlcV9oeik7CisKKwkvKiBEb24ndCBjb21wbGFpbiB3aGVuIHRoZSByZXF1ZXN0IGZhaWxzIGJlY2F1c2Ugb2YgaTJjIHN0cmV0Y2hpbmcgKi8KKwlwcml2LT5pZ25vcmVfaTJjX3dyaXRlX2Vycm9ycyA9IDE7CisJcmVzdWx0ID0geGNfc2V0X3JmX2ZyZXF1ZW5jeShwcml2LCBmcmVxX2h6KTsKKwlwcml2LT5pZ25vcmVfaTJjX3dyaXRlX2Vycm9ycyA9IDA7CisKKwlpZiAocmVzdWx0ICE9IDApCisJCXJldHVybiAwOworCisJLyogd2FpdCBmb3IgbG9jayBvbmx5IGluIGFuYWxvZyBUViBtb2RlICovCisJaWYgKChwcml2LT5jdXJfZncudHlwZSAmIChGTSB8IERUVjYgfCBEVFY3IHwgRFRWNzggfCBEVFY4KSkgPT0gMCkgeworCQlpZiAoeGNfd2FpdF9mb3JfbG9jayhwcml2KSAhPSAxKQorCQkJZm91bmQgPSAwOworCX0KKworCS8qIFdhaXQgZm9yIHN0YXRzIHRvIHN0YWJpbGl6ZS4KKwkgKiBGcmFtZSBMaW5lcyBuZWVkcyB0d28gZnJhbWUgdGltZXMgYWZ0ZXIgaW5pdGlhbCBsb2NrCisJICogYmVmb3JlIGl0IGlzIHZhbGlkLgorCSAqLworCW1zbGVlcChkZWJ1ZyA/IDEwMCA6IDEwKTsKKworCWlmIChkZWJ1ZykKKwkJeGNfZGVidWdfZHVtcChwcml2KTsKKworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIGludCB4YzQwMDBfcmVhZHJlZyhzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYsIHUxNiByZWcsIHUxNiAqdmFsKQoreworCXU4IGJ1ZlsyXSA9IHsgcmVnID4+IDgsIHJlZyAmIDB4ZmYgfTsKKwl1OCBidmFsWzJdID0geyAwLCAwIH07CisJc3RydWN0IGkyY19tc2cgbXNnWzJdID0geworCQl7IC5hZGRyID0gcHJpdi0+aTJjX3Byb3BzLmFkZHIsCisJCQkuZmxhZ3MgPSAwLCAuYnVmID0gJmJ1ZlswXSwgLmxlbiA9IDIgfSwKKwkJeyAuYWRkciA9IHByaXYtPmkyY19wcm9wcy5hZGRyLAorCQkJLmZsYWdzID0gSTJDX01fUkQsIC5idWYgPSAmYnZhbFswXSwgLmxlbiA9IDIgfSwKKwl9OworCisJaWYgKGkyY190cmFuc2Zlcihwcml2LT5pMmNfcHJvcHMuYWRhcCwgbXNnLCAyKSAhPSAyKSB7CisJCXByaW50ayhLRVJOX0VSUiAieGM0MDAwOiBJMkMgcmVhZCBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisKKwkqdmFsID0gKGJ2YWxbMF0gPDwgOCkgfCBidmFsWzFdOworCXJldHVybiAwOworfQorCisjZGVmaW5lIGR1bXBfZmlybV90eXBlKHQpCWR1bXBfZmlybV90eXBlX2FuZF9pbnRfZnJlcSh0LCAwKQorc3RhdGljIHZvaWQgZHVtcF9maXJtX3R5cGVfYW5kX2ludF9mcmVxKHVuc2lnbmVkIGludCB0eXBlLCB1MTYgaW50X2ZyZXEpCit7CisJIGlmICh0eXBlICYgQkFTRSkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiQkFTRSAiKTsKKwkgaWYgKHR5cGUgJiBJTklUMSkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiSU5JVDEgIik7CisJIGlmICh0eXBlICYgRjhNSFopCisJCXByaW50ayhLRVJOX0NPTlQgIkY4TUhaICIpOworCSBpZiAodHlwZSAmIE1UUykKKwkJcHJpbnRrKEtFUk5fQ09OVCAiTVRTICIpOworCSBpZiAodHlwZSAmIEQyNjIwKQorCQlwcmludGsoS0VSTl9DT05UICJEMjYyMCAiKTsKKwkgaWYgKHR5cGUgJiBEMjYzMykKKwkJcHJpbnRrKEtFUk5fQ09OVCAiRDI2MzMgIik7CisJIGlmICh0eXBlICYgRFRWNikKKwkJcHJpbnRrKEtFUk5fQ09OVCAiRFRWNiAiKTsKKwkgaWYgKHR5cGUgJiBRQU0pCisJCXByaW50ayhLRVJOX0NPTlQgIlFBTSAiKTsKKwkgaWYgKHR5cGUgJiBEVFY3KQorCQlwcmludGsoS0VSTl9DT05UICJEVFY3ICIpOworCSBpZiAodHlwZSAmIERUVjc4KQorCQlwcmludGsoS0VSTl9DT05UICJEVFY3OCAiKTsKKwkgaWYgKHR5cGUgJiBEVFY4KQorCQlwcmludGsoS0VSTl9DT05UICJEVFY4ICIpOworCSBpZiAodHlwZSAmIEZNKQorCQlwcmludGsoS0VSTl9DT05UICJGTSAiKTsKKwkgaWYgKHR5cGUgJiBJTlBVVDEpCisJCXByaW50ayhLRVJOX0NPTlQgIklOUFVUMSAiKTsKKwkgaWYgKHR5cGUgJiBMQ0QpCisJCXByaW50ayhLRVJOX0NPTlQgIkxDRCAiKTsKKwkgaWYgKHR5cGUgJiBOT0dEKQorCQlwcmludGsoS0VSTl9DT05UICJOT0dEICIpOworCSBpZiAodHlwZSAmIE1PTk8pCisJCXByaW50ayhLRVJOX0NPTlQgIk1PTk8gIik7CisJIGlmICh0eXBlICYgQVRTQykKKwkJcHJpbnRrKEtFUk5fQ09OVCAiQVRTQyAiKTsKKwkgaWYgKHR5cGUgJiBJRikKKwkJcHJpbnRrKEtFUk5fQ09OVCAiSUYgIik7CisJIGlmICh0eXBlICYgTEc2MCkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiTEc2MCAiKTsKKwkgaWYgKHR5cGUgJiBBVEk2MzgpCisJCXByaW50ayhLRVJOX0NPTlQgIkFUSTYzOCAiKTsKKwkgaWYgKHR5cGUgJiBPUkVONTM4KQorCQlwcmludGsoS0VSTl9DT05UICJPUkVONTM4ICIpOworCSBpZiAodHlwZSAmIE9SRU4zNikKKwkJcHJpbnRrKEtFUk5fQ09OVCAiT1JFTjM2ICIpOworCSBpZiAodHlwZSAmIFRPWU9UQTM4OCkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiVE9ZT1RBMzg4ICIpOworCSBpZiAodHlwZSAmIFRPWU9UQTc5NCkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiVE9ZT1RBNzk0ICIpOworCSBpZiAodHlwZSAmIERJQkNPTTUyKQorCQlwcmludGsoS0VSTl9DT05UICJESUJDT001MiAiKTsKKwkgaWYgKHR5cGUgJiBaQVJMSU5LNDU2KQorCQlwcmludGsoS0VSTl9DT05UICJaQVJMSU5LNDU2ICIpOworCSBpZiAodHlwZSAmIENISU5BKQorCQlwcmludGsoS0VSTl9DT05UICJDSElOQSAiKTsKKwkgaWYgKHR5cGUgJiBGNk1IWikKKwkJcHJpbnRrKEtFUk5fQ09OVCAiRjZNSFogIik7CisJIGlmICh0eXBlICYgSU5QVVQyKQorCQlwcmludGsoS0VSTl9DT05UICJJTlBVVDIgIik7CisJIGlmICh0eXBlICYgU0NPREUpCisJCXByaW50ayhLRVJOX0NPTlQgIlNDT0RFICIpOworCSBpZiAodHlwZSAmIEhBU19JRikKKwkJcHJpbnRrKEtFUk5fQ09OVCAiSEFTX0lGXyVkICIsIGludF9mcmVxKTsKK30KKworc3RhdGljIGludCBzZWVrX2Zpcm13YXJlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1bnNpZ25lZCBpbnQgdHlwZSwKKwkJCSB2NGwyX3N0ZF9pZCAqaWQpCit7CisJc3RydWN0IHhjNDAwMF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJaW50CQlpLCBiZXN0X2kgPSAtMTsKKwl1bnNpZ25lZCBpbnQJYmVzdF9ucl9kaWZmcyA9IDI1NVU7CisKKwlpZiAoIXByaXYtPmZpcm0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciEgZmlybXdhcmUgbm90IGxvYWRlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgoKHR5cGUgJiB+U0NPREUpID09IDApICYmICgqaWQgPT0gMCkpCisJCSppZCA9IFY0TDJfU1REX1BBTDsKKworCS8qIFNlZWsgZm9yIGdlbmVyaWMgdmlkZW8gc3RhbmRhcmQgbWF0Y2ggKi8KKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+ZmlybV9zaXplOyBpKyspIHsKKwkJdjRsMl9zdGRfaWQJaWRfZGlmZl9tYXNrID0KKwkJCShwcml2LT5maXJtW2ldLmlkIF4gKCppZCkpICYgKCppZCk7CisJCXVuc2lnbmVkIGludAl0eXBlX2RpZmZfbWFzayA9CisJCQkocHJpdi0+ZmlybVtpXS50eXBlIF4gdHlwZSkKKwkJCSYgKEJBU0VfVFlQRVMgfCBEVFZfVFlQRVMgfCBMQ0QgfCBOT0dEIHwgTU9OTyB8IFNDT0RFKTsKKwkJdW5zaWduZWQgaW50CW5yX2RpZmZzOworCisJCWlmICh0eXBlX2RpZmZfbWFzaworCQkgICAgJiAoQkFTRSB8IElOSVQxIHwgRk0gfCBEVFY2IHwgRFRWNyB8IERUVjc4IHwgRFRWOCB8IFNDT0RFKSkKKwkJCWNvbnRpbnVlOworCisJCW5yX2RpZmZzID0gaHdlaWdodDY0KGlkX2RpZmZfbWFzaykgKyBod2VpZ2h0MzIodHlwZV9kaWZmX21hc2spOworCQlpZiAoIW5yX2RpZmZzKQkvKiBTdXBwb3J0cyBhbGwgdGhlIHJlcXVlc3RlZCBzdGFuZGFyZHMgKi8KKwkJCWdvdG8gZm91bmQ7CisKKwkJaWYgKG5yX2RpZmZzIDwgYmVzdF9ucl9kaWZmcykgeworCQkJYmVzdF9ucl9kaWZmcyA9IG5yX2RpZmZzOworCQkJYmVzdF9pID0gaTsKKwkJfQorCX0KKworCS8qIEZJWE1FOiBXb3VsZCBtYWtlIHNlbnNlIHRvIHNlZWsgZm9yIHR5cGUgImhpbnQiIG1hdGNoID8gKi8KKwlpZiAoYmVzdF9pIDwgMCkgeworCQlpID0gLUVOT0VOVDsKKwkJZ290byByZXQ7CisJfQorCisJaWYgKGJlc3RfbnJfZGlmZnMgPiAwVSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiU2VsZWN0aW5nIGJlc3QgbWF0Y2hpbmcgZmlybXdhcmUgKCV1IGJpdHMgZGlmZmVyKSBmb3IgIgorCQkgICAgICAgInR5cGU9KCV4KSwgaWQgJTAxNmxseDpcbiIsCisJCSAgICAgICBiZXN0X25yX2RpZmZzLCB0eXBlLCAodW5zaWduZWQgbG9uZyBsb25nKSppZCk7CisJCWkgPSBiZXN0X2k7CisJfQorCitmb3VuZDoKKwkqaWQgPSBwcml2LT5maXJtW2ldLmlkOworCityZXQ6CisJaWYgKGRlYnVnKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlcyBmaXJtd2FyZSBmb3IgdHlwZT0iLAorCQkgICAgICAgKGkgPCAwKSA/ICJDYW4ndCBmaW5kIiA6ICJGb3VuZCIpOworCQlkdW1wX2Zpcm1fdHlwZSh0eXBlKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIigleCksIGlkICUwMTZsbHguXG4iLCB0eXBlLCAodW5zaWduZWQgbG9uZyBsb25nKSppZCk7CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGxvYWRfZmlybXdhcmUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHVuc2lnbmVkIGludCB0eXBlLAorCQkJIHY0bDJfc3RkX2lkICppZCkKK3sKKwlzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwlpbnQgICAgICAgICAgICAgICAgcG9zLCByYzsKKwl1bnNpZ25lZCBjaGFyICAgICAgKnA7CisKKwlwb3MgPSBzZWVrX2Zpcm13YXJlKGZlLCB0eXBlLCBpZCk7CisJaWYgKHBvcyA8IDApCisJCXJldHVybiBwb3M7CisKKwlwID0gcHJpdi0+ZmlybVtwb3NdLnB0cjsKKworCS8qIERvbid0IGNvbXBsYWluIHdoZW4gdGhlIHJlcXVlc3QgZmFpbHMgYmVjYXVzZSBvZiBpMmMgc3RyZXRjaGluZyAqLworCXByaXYtPmlnbm9yZV9pMmNfd3JpdGVfZXJyb3JzID0gMTsKKworCXJjID0geGNfbG9hZF9pMmNfc2VxdWVuY2UoZmUsIHApOworCisJcHJpdi0+aWdub3JlX2kyY193cml0ZV9lcnJvcnMgPSAwOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHhjNDAwMF9md3VwbG9hZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3ICAgPSBOVUxMOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgICAqcCwgKmVuZHA7CisJaW50ICAgICAgICAgICAgICAgICAgIHJjID0gMDsKKwlpbnQJCSAgICAgIG4sIG5fYXJyYXk7CisJY2hhcgkJICAgICAgbmFtZVszM107CisJY29uc3QgY2hhcgkgICAgICAqZm5hbWU7CisKKwlpZiAoZmlybXdhcmVfbmFtZVswXSAhPSAnXDAnKQorCQlmbmFtZSA9IGZpcm13YXJlX25hbWU7CisJZWxzZQorCQlmbmFtZSA9IFhDNDAwMF9ERUZBVUxUX0ZJUk1XQVJFOworCisJZHByaW50aygxLCAiUmVhZGluZyBmaXJtd2FyZSAlc1xuIiwgZm5hbWUpOworCXJjID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZuYW1lLCBwcml2LT5pMmNfcHJvcHMuYWRhcC0+ZGV2LnBhcmVudCk7CisJaWYgKHJjIDwgMCkgeworCQlpZiAocmMgPT0gLUVOT0VOVCkKKwkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3I6IGZpcm13YXJlICVzIG5vdCBmb3VuZC5cbiIsIGZuYW1lKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciAlZCB3aGlsZSByZXF1ZXN0aW5nIGZpcm13YXJlICVzXG4iLAorCQkJICAgICAgIHJjLCBmbmFtZSk7CisKKwkJcmV0dXJuIHJjOworCX0KKwlwID0gZnctPmRhdGE7CisJZW5kcCA9IHAgKyBmdy0+c2l6ZTsKKworCWlmIChmdy0+c2l6ZSA8IHNpemVvZihuYW1lKSAtIDEgKyAyICsgMikgeworCQlwcmludGsoS0VSTl9FUlIgIkVycm9yOiBmaXJtd2FyZSBmaWxlICVzIGhhcyBpbnZhbGlkIHNpemUhXG4iLAorCQkgICAgICAgZm5hbWUpOworCQlnb3RvIGNvcnJ1cHQ7CisJfQorCisJbWVtY3B5KG5hbWUsIHAsIHNpemVvZihuYW1lKSAtIDEpOworCW5hbWVbc2l6ZW9mKG5hbWUpIC0gMV0gPSAnXDAnOworCXAgKz0gc2l6ZW9mKG5hbWUpIC0gMTsKKworCXByaXYtPmZpcm1fdmVyc2lvbiA9IGdldF91bmFsaWduZWRfbGUxNihwKTsKKwlwICs9IDI7CisKKwluX2FycmF5ID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHApOworCXAgKz0gMjsKKworCWRwcmludGsoMSwgIkxvYWRpbmcgJWQgZmlybXdhcmUgaW1hZ2VzIGZyb20gJXMsIHR5cGU6ICVzLCB2ZXIgJWQuJWRcbiIsCisJCW5fYXJyYXksIGZuYW1lLCBuYW1lLAorCQlwcml2LT5maXJtX3ZlcnNpb24gPj4gOCwgcHJpdi0+ZmlybV92ZXJzaW9uICYgMHhmZik7CisKKwlwcml2LT5maXJtID0ga3phbGxvYyhzaXplb2YoKnByaXYtPmZpcm0pICogbl9hcnJheSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYtPmZpcm0gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGxvYWQgZmlybXdhcmUgZmlsZS5cbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisJcHJpdi0+ZmlybV9zaXplID0gbl9hcnJheTsKKworCW4gPSAtMTsKKwl3aGlsZSAocCA8IGVuZHApIHsKKwkJX191MzIgdHlwZSwgc2l6ZTsKKwkJdjRsMl9zdGRfaWQgaWQ7CisJCV9fdTE2IGludF9mcmVxID0gMDsKKworCQluKys7CisJCWlmIChuID49IG5fYXJyYXkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiTW9yZSBmaXJtd2FyZSBpbWFnZXMgaW4gZmlsZSB0aGFuICIKKwkJCSAgICAgICAid2VyZSBleHBlY3RlZCFcbiIpOworCQkJZ290byBjb3JydXB0OworCQl9CisKKwkJLyogQ2hlY2tzIGlmIHRoZXJlJ3MgZW5vdWdoIGJ5dGVzIHRvIHJlYWQgKi8KKwkJaWYgKGVuZHAgLSBwIDwgc2l6ZW9mKHR5cGUpICsgc2l6ZW9mKGlkKSArIHNpemVvZihzaXplKSkKKwkJCWdvdG8gaGVhZGVyOworCisJCXR5cGUgPSBnZXRfdW5hbGlnbmVkX2xlMzIocCk7CisJCXAgKz0gc2l6ZW9mKHR5cGUpOworCisJCWlkID0gZ2V0X3VuYWxpZ25lZF9sZTY0KHApOworCQlwICs9IHNpemVvZihpZCk7CisKKwkJaWYgKHR5cGUgJiBIQVNfSUYpIHsKKwkJCWludF9mcmVxID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHApOworCQkJcCArPSBzaXplb2YoaW50X2ZyZXEpOworCQkJaWYgKGVuZHAgLSBwIDwgc2l6ZW9mKHNpemUpKQorCQkJCWdvdG8gaGVhZGVyOworCQl9CisKKwkJc2l6ZSA9IGdldF91bmFsaWduZWRfbGUzMihwKTsKKwkJcCArPSBzaXplb2Yoc2l6ZSk7CisKKwkJaWYgKCFzaXplIHx8IHNpemUgPiBlbmRwIC0gcCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJGaXJtd2FyZSB0eXBlICgleCksIGlkICVsbHggaXMgY29ycnVwdGVkIChzaXplPSVkLCBleHBlY3RlZCAlZClcbiIsCisJCQkgICAgICAgdHlwZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylpZCwKKwkJCSAgICAgICAodW5zaWduZWQpKGVuZHAgLSBwKSwgc2l6ZSk7CisJCQlnb3RvIGNvcnJ1cHQ7CisJCX0KKworCQlwcml2LT5maXJtW25dLnB0ciA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmIChwcml2LT5maXJtW25dLnB0ciA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGxvYWQgZmlybXdhcmUgZmlsZS5cbiIpOworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBkb25lOworCQl9CisKKwkJaWYgKGRlYnVnKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiUmVhZGluZyBmaXJtd2FyZSB0eXBlICIpOworCQkJZHVtcF9maXJtX3R5cGVfYW5kX2ludF9mcmVxKHR5cGUsIGludF9mcmVxKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIoJXgpLCBpZCAlbGx4LCBzaXplPSVkLlxuIiwKKwkJCSAgICAgICB0eXBlLCAodW5zaWduZWQgbG9uZyBsb25nKWlkLCBzaXplKTsKKwkJfQorCisJCW1lbWNweShwcml2LT5maXJtW25dLnB0ciwgcCwgc2l6ZSk7CisJCXByaXYtPmZpcm1bbl0udHlwZSA9IHR5cGU7CisJCXByaXYtPmZpcm1bbl0uaWQgICA9IGlkOworCQlwcml2LT5maXJtW25dLnNpemUgPSBzaXplOworCQlwcml2LT5maXJtW25dLmludF9mcmVxID0gaW50X2ZyZXE7CisKKwkJcCArPSBzaXplOworCX0KKworCWlmIChuICsgMSAhPSBwcml2LT5maXJtX3NpemUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGaXJtd2FyZSBmaWxlIGlzIGluY29tcGxldGUhXG4iKTsKKwkJZ290byBjb3JydXB0OworCX0KKworCWdvdG8gZG9uZTsKKworaGVhZGVyOgorCXByaW50ayhLRVJOX0VSUiAiRmlybXdhcmUgaGVhZGVyIGlzIGluY29tcGxldGUhXG4iKTsKK2NvcnJ1cHQ6CisJcmMgPSAtRUlOVkFMOworCXByaW50ayhLRVJOX0VSUiAiRXJyb3I6IGZpcm13YXJlIGZpbGUgaXMgY29ycnVwdGVkIVxuIik7CisKK2RvbmU6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJaWYgKHJjID09IDApCisJCWRwcmludGsoMSwgIkZpcm13YXJlIGZpbGVzIGxvYWRlZC5cbiIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGxvYWRfc2NvZGUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHVuc2lnbmVkIGludCB0eXBlLAorCQkJIHY0bDJfc3RkX2lkICppZCwgX191MTYgaW50X2ZyZXEsIGludCBzY29kZSkKK3sKKwlzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwlpbnQJCXBvcywgcmM7CisJdW5zaWduZWQgY2hhcgkqcDsKKwl1OAkJc2NvZGVfYnVmWzEzXTsKKwl1OAkJaW5kaXJlY3RfbW9kZVs1XTsKKworCWRwcmludGsoMSwgIiVzIGNhbGxlZCBpbnRfZnJlcT0lZFxuIiwgX19mdW5jX18sIGludF9mcmVxKTsKKworCWlmICghaW50X2ZyZXEpIHsKKwkJcG9zID0gc2Vla19maXJtd2FyZShmZSwgdHlwZSwgaWQpOworCQlpZiAocG9zIDwgMCkKKwkJCXJldHVybiBwb3M7CisJfSBlbHNlIHsKKwkJZm9yIChwb3MgPSAwOyBwb3MgPCBwcml2LT5maXJtX3NpemU7IHBvcysrKSB7CisJCQlpZiAoKHByaXYtPmZpcm1bcG9zXS5pbnRfZnJlcSA9PSBpbnRfZnJlcSkgJiYKKwkJCSAgICAocHJpdi0+ZmlybVtwb3NdLnR5cGUgJiBIQVNfSUYpKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChwb3MgPT0gcHJpdi0+ZmlybV9zaXplKQorCQkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcCA9IHByaXYtPmZpcm1bcG9zXS5wdHI7CisKKwlpZiAocHJpdi0+ZmlybVtwb3NdLnNpemUgIT0gMTIgKiAxNiB8fCBzY29kZSA+PSAxNikKKwkJcmV0dXJuIC1FSU5WQUw7CisJcCArPSAxMiAqIHNjb2RlOworCisJaWYgKGRlYnVnKSB7CisJCXR1bmVyX2luZm8oIkxvYWRpbmcgU0NPREUgZm9yIHR5cGU9Iik7CisJCWR1bXBfZmlybV90eXBlX2FuZF9pbnRfZnJlcShwcml2LT5maXJtW3Bvc10udHlwZSwKKwkJCQkJICAgIHByaXYtPmZpcm1bcG9zXS5pbnRfZnJlcSk7CisJCXByaW50ayhLRVJOX0NPTlQgIigleCksIGlkICUwMTZsbHguXG4iLCBwcml2LT5maXJtW3Bvc10udHlwZSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKmlkKTsKKwl9CisKKwlzY29kZV9idWZbMF0gPSAweDAwOworCW1lbWNweSgmc2NvZGVfYnVmWzFdLCBwLCAxMik7CisKKwkvKiBFbnRlciBkaXJlY3QtbW9kZSAqLworCXJjID0geGNfd3JpdGVfcmVnKHByaXYsIFhSRUdfRElSRUNUU0lUVElOR19NT0RFLCAwKTsKKwlpZiAocmMgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIHB1dCBkZXZpY2UgaW50byBkaXJlY3QgbW9kZSFcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyYyA9IHhjX3NlbmRfaTJjX2RhdGEocHJpdiwgc2NvZGVfYnVmLCAxMyk7CisJaWYgKHJjICE9IDApIHsKKwkJLyogRXZlbiBpZiB0aGUgc2VuZCBmYWlsZWQsIG1ha2Ugc3VyZSB3ZSBzZXQgYmFjayB0byBpbmRpcmVjdAorCQkgICBtb2RlICovCisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHNldCBzY29kZSAlZFxuIiwgcmMpOworCX0KKworCS8qIFN3aXRjaCBiYWNrIHRvIGluZGlyZWN0LW1vZGUgKi8KKwltZW1zZXQoaW5kaXJlY3RfbW9kZSwgMCwgc2l6ZW9mKGluZGlyZWN0X21vZGUpKTsKKwlpbmRpcmVjdF9tb2RlWzRdID0gMHg4ODsKKwl4Y19zZW5kX2kyY19kYXRhKHByaXYsIGluZGlyZWN0X21vZGUsIHNpemVvZihpbmRpcmVjdF9tb2RlKSk7CisJbXNsZWVwKDEwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX2Zpcm13YXJlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1bnNpZ25lZCBpbnQgdHlwZSwKKwkJCSAgdjRsMl9zdGRfaWQgc3RkLCBfX3UxNiBpbnRfZnJlcSkKK3sKKwlzdHJ1Y3QgeGM0MDAwX3ByaXYgICAgICAgICAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCXN0cnVjdCBmaXJtd2FyZV9wcm9wZXJ0aWVzIG5ld19mdzsKKwlpbnQJCQkgICByYyA9IDAsIGlzX3JldHJ5ID0gMDsKKwl1MTYJCQkgICBod21vZGVsOworCXY0bDJfc3RkX2lkCQkgICBzdGQwOworCXU4CQkJICAgaHdfbWFqb3IsIGh3X21pbm9yLCBmd19tYWpvciwgZndfbWlub3I7CisKKwlkcHJpbnRrKDEsICIlcyBjYWxsZWRcbiIsIF9fZnVuY19fKTsKKworCWlmICghcHJpdi0+ZmlybSkgeworCQlyYyA9IHhjNDAwMF9md3VwbG9hZChmZSk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJfQorCityZXRyeToKKwluZXdfZncudHlwZSA9IHR5cGU7CisJbmV3X2Z3LmlkID0gc3RkOworCW5ld19mdy5zdGRfcmVxID0gc3RkOworCW5ld19mdy5zY29kZV90YWJsZSA9IFNDT0RFOworCW5ld19mdy5zY29kZV9uciA9IDA7CisJbmV3X2Z3LmludF9mcmVxID0gaW50X2ZyZXE7CisKKwlkcHJpbnRrKDEsICJjaGVja2luZyBmaXJtd2FyZSwgdXNlciByZXF1ZXN0ZWQgdHlwZT0iKTsKKwlpZiAoZGVidWcpIHsKKwkJZHVtcF9maXJtX3R5cGUobmV3X2Z3LnR5cGUpOworCQlwcmludGsoS0VSTl9DT05UICIoJXgpLCBpZCAlMDE2bGx4LCAiLCBuZXdfZncudHlwZSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbmV3X2Z3LnN0ZF9yZXEpOworCQlpZiAoIWludF9mcmVxKQorCQkJcHJpbnRrKEtFUk5fQ09OVCAic2NvZGVfdGJsICIpOworCQllbHNlCisJCQlwcmludGsoS0VSTl9DT05UICJpbnRfZnJlcSAlZCwgIiwgbmV3X2Z3LmludF9mcmVxKTsKKwkJcHJpbnRrKEtFUk5fQ09OVCAic2NvZGVfbnIgJWRcbiIsIG5ld19mdy5zY29kZV9ucik7CisJfQorCisJLyogTm8gbmVlZCB0byByZWxvYWQgYmFzZSBmaXJtd2FyZSBpZiBpdCBtYXRjaGVzICovCisJaWYgKHByaXYtPmN1cl9mdy50eXBlICYgQkFTRSkgeworCQlkcHJpbnRrKDEsICJCQVNFIGZpcm13YXJlIG5vdCBjaGFuZ2VkLlxuIik7CisJCWdvdG8gc2tpcF9iYXNlOworCX0KKworCS8qIFVwZGF0aW5nIEJBU0UgLSBmb3JnZXQgYWJvdXQgYWxsIGN1cnJlbnRseSBsb2FkZWQgZmlybXdhcmUgKi8KKwltZW1zZXQoJnByaXYtPmN1cl9mdywgMCwgc2l6ZW9mKHByaXYtPmN1cl9mdykpOworCisJLyogUmVzZXQgaXMgbmVlZGVkIGJlZm9yZSBsb2FkaW5nIGZpcm13YXJlICovCisJcmMgPSB4YzQwMDBfdHVuZXJfcmVzZXQoZmUpOworCWlmIChyYyA8IDApCisJCWdvdG8gZmFpbDsKKworCS8qIEJBU0UgZmlybXdhcmVzIGFyZSBhbGwgc3RkMCAqLworCXN0ZDAgPSAwOworCXJjID0gbG9hZF9maXJtd2FyZShmZSwgQkFTRSwgJnN0ZDApOworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciAlZCB3aGlsZSBsb2FkaW5nIGJhc2UgZmlybXdhcmVcbiIsIHJjKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIExvYWQgSU5JVDEsIGlmIG5lZWRlZCAqLworCWRwcmludGsoMSwgIkxvYWQgaW5pdDEgZmlybXdhcmUsIGlmIGV4aXN0c1xuIik7CisKKwlyYyA9IGxvYWRfZmlybXdhcmUoZmUsIEJBU0UgfCBJTklUMSwgJnN0ZDApOworCWlmIChyYyA9PSAtRU5PRU5UKQorCQlyYyA9IGxvYWRfZmlybXdhcmUoZmUsIEJBU0UgfCBJTklUMSwgJnN0ZDApOworCWlmIChyYyA8IDAgJiYgcmMgIT0gLUVOT0VOVCkgeworCQl0dW5lcl9lcnIoIkVycm9yICVkIHdoaWxlIGxvYWRpbmcgaW5pdDEgZmlybXdhcmVcbiIsCisJCQkgIHJjKTsKKwkJZ290byBmYWlsOworCX0KKworc2tpcF9iYXNlOgorCS8qCisJICogTm8gbmVlZCB0byByZWxvYWQgc3RhbmRhcmQgc3BlY2lmaWMgZmlybXdhcmUgaWYgYmFzZSBmaXJtd2FyZQorCSAqIHdhcyBub3QgcmVsb2FkZWQgYW5kIHJlcXVlc3RlZCB2aWRlbyBzdGFuZGFyZHMgaGF2ZSBub3QgY2hhbmdlZC4KKwkgKi8KKwlpZiAocHJpdi0+Y3VyX2Z3LnR5cGUgPT0gKEJBU0UgfCBuZXdfZncudHlwZSkgJiYKKwkgICAgcHJpdi0+Y3VyX2Z3LnN0ZF9yZXEgPT0gc3RkKSB7CisJCWRwcmludGsoMSwgIlN0ZC1zcGVjaWZpYyBmaXJtd2FyZSBhbHJlYWR5IGxvYWRlZC5cbiIpOworCQlnb3RvIHNraXBfc3RkX3NwZWNpZmljOworCX0KKworCS8qIFJlbG9hZGluZyBzdGQtc3BlY2lmaWMgZmlybXdhcmUgZm9yY2VzIGEgU0NPREUgdXBkYXRlICovCisJcHJpdi0+Y3VyX2Z3LnNjb2RlX3RhYmxlID0gMDsKKworCS8qIExvYWQgdGhlIHN0YW5kYXJkIGZpcm13YXJlICovCisJcmMgPSBsb2FkX2Zpcm13YXJlKGZlLCBuZXdfZncudHlwZSwgJm5ld19mdy5pZCk7CisKKwlpZiAocmMgPCAwKQorCQlnb3RvIGZhaWw7CisKK3NraXBfc3RkX3NwZWNpZmljOgorCWlmIChwcml2LT5jdXJfZncuc2NvZGVfdGFibGUgPT0gbmV3X2Z3LnNjb2RlX3RhYmxlICYmCisJICAgIHByaXYtPmN1cl9mdy5zY29kZV9uciA9PSBuZXdfZncuc2NvZGVfbnIpIHsKKwkJZHByaW50aygxLCAiU0NPREUgZmlybXdhcmUgYWxyZWFkeSBsb2FkZWQuXG4iKTsKKwkJZ290byBjaGVja19kZXZpY2U7CisJfQorCisJLyogTG9hZCBTQ09ERSBmaXJtd2FyZSwgaWYgZXhpc3RzICovCisJcmMgPSBsb2FkX3Njb2RlKGZlLCBuZXdfZncudHlwZSB8IG5ld19mdy5zY29kZV90YWJsZSwgJm5ld19mdy5pZCwKKwkJCW5ld19mdy5pbnRfZnJlcSwgbmV3X2Z3LnNjb2RlX25yKTsKKwlpZiAocmMgIT0gMCkKKwkJZHByaW50aygxLCAibG9hZCBzY29kZSBmYWlsZWQgJWRcbiIsIHJjKTsKKworY2hlY2tfZGV2aWNlOgorCXJjID0geGM0MDAwX3JlYWRyZWcocHJpdiwgWFJFR19QUk9EVUNUX0lELCAmaHdtb2RlbCk7CisKKwlpZiAoeGNfZ2V0X3ZlcnNpb24ocHJpdiwgJmh3X21ham9yLCAmaHdfbWlub3IsICZmd19tYWpvciwKKwkJCSAgICZmd19taW5vcikgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZWFkIHR1bmVyIHJlZ2lzdGVycy5cbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJZHByaW50aygxLCAiRGV2aWNlIGlzIFhjZWl2ZSAlZCB2ZXJzaW9uICVkLiVkLCAiCisJCSJmaXJtd2FyZSB2ZXJzaW9uICVkLiVkXG4iLAorCQlod21vZGVsLCBod19tYWpvciwgaHdfbWlub3IsIGZ3X21ham9yLCBmd19taW5vcik7CisKKwkvKiBDaGVjayBmaXJtd2FyZSB2ZXJzaW9uIGFnYWluc3Qgd2hhdCB3ZSBkb3dubG9hZGVkLiAqLworCWlmIChwcml2LT5maXJtX3ZlcnNpb24gIT0gKChmd19tYWpvciA8PCA4KSB8IGZ3X21pbm9yKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiSW5jb3JyZWN0IHJlYWRiYWNrIG9mIGZpcm13YXJlIHZlcnNpb24gJWQuJWQuXG4iLAorCQkgICAgICAgZndfbWFqb3IsIGZ3X21pbm9yKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIENoZWNrIHRoYXQgdGhlIHR1bmVyIGhhcmR3YXJlIG1vZGVsIHJlbWFpbnMgY29uc2lzdGVudCBvdmVyIHRpbWUuICovCisJaWYgKHByaXYtPmh3bW9kZWwgPT0gMCAmJgorCSAgICAoaHdtb2RlbCA9PSBYQ19QUk9EVUNUX0lEX1hDNDAwMCB8fAorCSAgICAgaHdtb2RlbCA9PSBYQ19QUk9EVUNUX0lEX1hDNDEwMCkpIHsKKwkJcHJpdi0+aHdtb2RlbCA9IGh3bW9kZWw7CisJCXByaXYtPmh3dmVycyA9IChod19tYWpvciA8PCA4KSB8IGh3X21pbm9yOworCX0gZWxzZSBpZiAocHJpdi0+aHdtb2RlbCA9PSAwIHx8IHByaXYtPmh3bW9kZWwgIT0gaHdtb2RlbCB8fAorCQkgICBwcml2LT5od3ZlcnMgIT0gKChod19tYWpvciA8PCA4KSB8IGh3X21pbm9yKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiUmVhZCBpbnZhbGlkIGRldmljZSBoYXJkd2FyZSBpbmZvcm1hdGlvbiAtIHR1bmVyICIKKwkJICAgICAgICJodW5nP1xuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwltZW1jcHkoJnByaXYtPmN1cl9mdywgJm5ld19mdywgc2l6ZW9mKHByaXYtPmN1cl9mdykpOworCisJLyoKKwkgKiBCeSBzZXR0aW5nIEJBU0UgaW4gY3VyX2Z3LnR5cGUgb25seSBhZnRlciBzdWNjZXNzZnVsbHkgbG9hZGluZyBhbGwKKwkgKiBmaXJtd2FyZXMsIHdlIGNhbjoKKwkgKiAxLiBJZGVudGlmeSB0aGF0IEJBU0UgZmlybXdhcmUgd2l0aCB0eXBlPTAgaGFzIGJlZW4gbG9hZGVkOworCSAqIDIuIFRlbGwgd2hldGhlciBCQVNFIGZpcm13YXJlIHdhcyBqdXN0IGNoYW5nZWQgdGhlIG5leHQgdGltZSB0aHJvdWdoLgorCSAqLworCXByaXYtPmN1cl9mdy50eXBlIHw9IEJBU0U7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwltZW1zZXQoJnByaXYtPmN1cl9mdywgMCwgc2l6ZW9mKHByaXYtPmN1cl9mdykpOworCWlmICghaXNfcmV0cnkpIHsKKwkJbXNsZWVwKDUwKTsKKwkJaXNfcmV0cnkgPSAxOworCQlkcHJpbnRrKDEsICJSZXRyeWluZyBmaXJtd2FyZSBsb2FkXG4iKTsKKwkJZ290byByZXRyeTsKKwl9CisKKwlpZiAocmMgPT0gLUVOT0VOVCkKKwkJcmMgPSAtRUlOVkFMOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgeGNfZGVidWdfZHVtcChzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYpCit7CisJdTE2CWFkY19lbnZlbG9wZTsKKwl1MzIJZnJlcV9lcnJvcl9oeiA9IDA7CisJdTE2CWxvY2tfc3RhdHVzOworCXUzMgloc3luY19mcmVxX2h6ID0gMDsKKwl1MTYJZnJhbWVfbGluZXM7CisJdTE2CXF1YWxpdHk7CisJdTgJaHdfbWFqb3J2ZXJzaW9uID0gMCwgaHdfbWlub3J2ZXJzaW9uID0gMDsKKwl1OAlmd19tYWpvcnZlcnNpb24gPSAwLCBmd19taW5vcnZlcnNpb24gPSAwOworCisJeGNfZ2V0X2FkY19lbnZlbG9wZShwcml2LCAmYWRjX2VudmVsb3BlKTsKKwlkcHJpbnRrKDEsICIqKiogQURDIGVudmVsb3BlICgwLTEwMjMpID0gJWRcbiIsIGFkY19lbnZlbG9wZSk7CisKKwl4Y19nZXRfZnJlcXVlbmN5X2Vycm9yKHByaXYsICZmcmVxX2Vycm9yX2h6KTsKKwlkcHJpbnRrKDEsICIqKiogRnJlcXVlbmN5IGVycm9yID0gJWQgSHpcbiIsIGZyZXFfZXJyb3JfaHopOworCisJeGNfZ2V0X2xvY2tfc3RhdHVzKHByaXYsICZsb2NrX3N0YXR1cyk7CisJZHByaW50aygxLCAiKioqIExvY2sgc3RhdHVzICgwLVdhaXQsIDEtTG9ja2VkLCAyLU5vLXNpZ25hbCkgPSAlZFxuIiwKKwkJbG9ja19zdGF0dXMpOworCisJeGNfZ2V0X3ZlcnNpb24ocHJpdiwgJmh3X21ham9ydmVyc2lvbiwgJmh3X21pbm9ydmVyc2lvbiwKKwkJICAgICAgICZmd19tYWpvcnZlcnNpb24sICZmd19taW5vcnZlcnNpb24pOworCWRwcmludGsoMSwgIioqKiBIVzogViUwMnguJTAyeCwgRlc6IFYlMDJ4LiUwMnhcbiIsCisJCWh3X21ham9ydmVyc2lvbiwgaHdfbWlub3J2ZXJzaW9uLAorCQlmd19tYWpvcnZlcnNpb24sIGZ3X21pbm9ydmVyc2lvbik7CisKKwlpZiAocHJpdi0+dmlkZW9fc3RhbmRhcmQgPCBYQzQwMDBfRFRWNikgeworCQl4Y19nZXRfaHN5bmNfZnJlcShwcml2LCAmaHN5bmNfZnJlcV9oeik7CisJCWRwcmludGsoMSwgIioqKiBIb3Jpem9udGFsIHN5bmMgZnJlcXVlbmN5ID0gJWQgSHpcbiIsCisJCQloc3luY19mcmVxX2h6KTsKKworCQl4Y19nZXRfZnJhbWVfbGluZXMocHJpdiwgJmZyYW1lX2xpbmVzKTsKKwkJZHByaW50aygxLCAiKioqIEZyYW1lIGxpbmVzID0gJWRcbiIsIGZyYW1lX2xpbmVzKTsKKwl9CisKKwl4Y19nZXRfcXVhbGl0eShwcml2LCAmcXVhbGl0eSk7CisJZHByaW50aygxLCAiKioqIFF1YWxpdHkgKDA6PDhkQiwgNzo+NTZkQikgPSAlZFxuIiwgcXVhbGl0eSk7Cit9CisKK3N0YXRpYyBpbnQgeGM0MDAwX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCit7CisJc3RydWN0IHhjNDAwMF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJdW5zaWduZWQgaW50IHR5cGU7CisJaW50CXJldCA9IC1FUkVNT1RFSU87CisKKwlkcHJpbnRrKDEsICIlcygpIGZyZXF1ZW5jeT0lZCAoSHopXG4iLCBfX2Z1bmNfXywgcGFyYW1zLT5mcmVxdWVuY3kpOworCisJbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7CisKKwlpZiAoZmUtPm9wcy5pbmZvLnR5cGUgPT0gRkVfQVRTQykgeworCQlkcHJpbnRrKDEsICIlcygpIEFUU0NcbiIsIF9fZnVuY19fKTsKKwkJc3dpdGNoIChwYXJhbXMtPnUudnNiLm1vZHVsYXRpb24pIHsKKwkJY2FzZSBWU0JfODoKKwkJY2FzZSBWU0JfMTY6CisJCQlkcHJpbnRrKDEsICIlcygpIFZTQiBtb2R1bGF0aW9uXG4iLCBfX2Z1bmNfXyk7CisJCQlwcml2LT5yZl9tb2RlID0gWENfUkZfTU9ERV9BSVI7CisJCQlwcml2LT5mcmVxX2h6ID0gcGFyYW1zLT5mcmVxdWVuY3kgLSAxNzUwMDAwOworCQkJcHJpdi0+YmFuZHdpZHRoID0gQkFORFdJRFRIXzZfTUhaOworCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfRFRWNjsKKwkJCXR5cGUgPSBEVFY2OworCQkJYnJlYWs7CisJCWNhc2UgUUFNXzY0OgorCQljYXNlIFFBTV8yNTY6CisJCWNhc2UgUUFNX0FVVE86CisJCQlkcHJpbnRrKDEsICIlcygpIFFBTSBtb2R1bGF0aW9uXG4iLCBfX2Z1bmNfXyk7CisJCQlwcml2LT5yZl9tb2RlID0gWENfUkZfTU9ERV9DQUJMRTsKKwkJCXByaXYtPmZyZXFfaHogPSBwYXJhbXMtPmZyZXF1ZW5jeSAtIDE3NTAwMDA7CisJCQlwcml2LT5iYW5kd2lkdGggPSBCQU5EV0lEVEhfNl9NSFo7CisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9EVFY2OworCQkJdHlwZSA9IERUVjY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9IGVsc2UgaWYgKGZlLT5vcHMuaW5mby50eXBlID09IEZFX09GRE0pIHsKKwkJZHByaW50aygxLCAiJXMoKSBPRkRNXG4iLCBfX2Z1bmNfXyk7CisJCXN3aXRjaCAocGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoKSB7CisJCWNhc2UgQkFORFdJRFRIXzZfTUhaOgorCQkJcHJpdi0+YmFuZHdpZHRoID0gQkFORFdJRFRIXzZfTUhaOworCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfRFRWNjsKKwkJCXByaXYtPmZyZXFfaHogPSBwYXJhbXMtPmZyZXF1ZW5jeSAtIDE3NTAwMDA7CisJCQl0eXBlID0gRFRWNjsKKwkJCWJyZWFrOworCQljYXNlIEJBTkRXSURUSF83X01IWjoKKwkJCXByaXYtPmJhbmR3aWR0aCA9IEJBTkRXSURUSF83X01IWjsKKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0RUVjc7CisJCQlwcml2LT5mcmVxX2h6ID0gcGFyYW1zLT5mcmVxdWVuY3kgLSAyMjUwMDAwOworCQkJdHlwZSA9IERUVjc7CisJCQlicmVhazsKKwkJY2FzZSBCQU5EV0lEVEhfOF9NSFo6CisJCQlwcml2LT5iYW5kd2lkdGggPSBCQU5EV0lEVEhfOF9NSFo7CisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9EVFY4OworCQkJcHJpdi0+ZnJlcV9oeiA9IHBhcmFtcy0+ZnJlcXVlbmN5IC0gMjc1MDAwMDsKKwkJCXR5cGUgPSBEVFY4OworCQkJYnJlYWs7CisJCWNhc2UgQkFORFdJRFRIX0FVVE86CisJCQlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA0MDAwMDAwMDApIHsKKwkJCQlwcml2LT5iYW5kd2lkdGggPSBCQU5EV0lEVEhfN19NSFo7CisJCQkJcHJpdi0+ZnJlcV9oeiA9IHBhcmFtcy0+ZnJlcXVlbmN5IC0gMjI1MDAwMDsKKwkJCX0gZWxzZSB7CisJCQkJcHJpdi0+YmFuZHdpZHRoID0gQkFORFdJRFRIXzhfTUhaOworCQkJCXByaXYtPmZyZXFfaHogPSBwYXJhbXMtPmZyZXF1ZW5jeSAtIDI3NTAwMDA7CisJCQl9CisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9EVFY3Xzg7CisJCQl0eXBlID0gRFRWNzg7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAieGM0MDAwIGJhbmR3aWR0aCBub3Qgc2V0IVxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBmYWlsOworCQl9CisJCXByaXYtPnJmX21vZGUgPSBYQ19SRl9NT0RFX0FJUjsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgInhjNDAwMCBtb2R1bGF0aW9uIHR5cGUgbm90IHN1cHBvcnRlZCFcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWw7CisJfQorCisJZHByaW50aygxLCAiJXMoKSBmcmVxdWVuY3k9JWQgKGNvbXBlbnNhdGVkKVxuIiwKKwkJX19mdW5jX18sIHByaXYtPmZyZXFfaHopOworCisJLyogTWFrZSBzdXJlIHRoZSBjb3JyZWN0IGZpcm13YXJlIHR5cGUgaXMgbG9hZGVkICovCisJaWYgKGNoZWNrX2Zpcm13YXJlKGZlLCB0eXBlLCAwLCBwcml2LT5pZl9raHopICE9IDApCisJCWdvdG8gZmFpbDsKKworCXJldCA9IHhjX3NldF9zaWduYWxfc291cmNlKHByaXYsIHByaXYtPnJmX21vZGUpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgInhjNDAwMDogeGNfc2V0X3NpZ25hbF9zb3VyY2UoJWQpIGZhaWxlZFxuIiwKKwkJICAgICAgIHByaXYtPnJmX21vZGUpOworCQlnb3RvIGZhaWw7CisJfSBlbHNlIHsKKwkJdTE2CXZpZGVvX21vZGUsIGF1ZGlvX21vZGU7CisJCXZpZGVvX21vZGUgPSB4YzQwMDBfc3RhbmRhcmRbcHJpdi0+dmlkZW9fc3RhbmRhcmRdLnZpZGVvX21vZGU7CisJCWF1ZGlvX21vZGUgPSB4YzQwMDBfc3RhbmRhcmRbcHJpdi0+dmlkZW9fc3RhbmRhcmRdLmF1ZGlvX21vZGU7CisJCWlmICh0eXBlID09IERUVjYgJiYgcHJpdi0+ZmlybV92ZXJzaW9uICE9IDB4MDEwMikKKwkJCXZpZGVvX21vZGUgfD0gMHgwMDAxOworCQlyZXQgPSB4Y19zZXRfdHZfc3RhbmRhcmQocHJpdiwgdmlkZW9fbW9kZSwgYXVkaW9fbW9kZSk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ4YzQwMDA6IHhjX3NldF90dl9zdGFuZGFyZCBmYWlsZWRcbiIpOworCQkJLyogREpIIC0gZG8gbm90IHJldHVybiB3aGVuIGl0IGZhaWxzLi4uICovCisJCQkvKiBnb3RvIGZhaWw7ICovCisJCX0KKwl9CisKKwlpZiAoeGNfd3JpdGVfcmVnKHByaXYsIFhSRUdfRF9DT0RFLCAwKSA9PSAwKQorCQlyZXQgPSAwOworCWlmIChwcml2LT5kdmJfYW1wbGl0dWRlICE9IDApIHsKKwkJaWYgKHhjX3dyaXRlX3JlZyhwcml2LCBYUkVHX0FNUExJVFVERSwKKwkJCQkgKHByaXYtPmZpcm1fdmVyc2lvbiAhPSAweDAxMDIgfHwKKwkJCQkgIHByaXYtPmR2Yl9hbXBsaXR1ZGUgIT0gMTM0ID8KKwkJCQkgIHByaXYtPmR2Yl9hbXBsaXR1ZGUgOiAxMzIpKSAhPSAwKQorCQkJcmV0ID0gLUVSRU1PVEVJTzsKKwl9CisJaWYgKHByaXYtPnNldF9zbW9vdGhlZGN2YnMgIT0gMCkgeworCQlpZiAoeGNfd3JpdGVfcmVnKHByaXYsIFhSRUdfU01PT1RIRURDVkJTLCAxKSAhPSAwKQorCQkJcmV0ID0gLUVSRU1PVEVJTzsKKwl9CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAieGM0MDAwOiBzZXR0aW5nIHJlZ2lzdGVycyBmYWlsZWRcbiIpOworCQkvKiBnb3RvIGZhaWw7ICovCisJfQorCisJeGNfdHVuZV9jaGFubmVsKHByaXYsIHByaXYtPmZyZXFfaHopOworCisJcmV0ID0gMDsKKworZmFpbDoKKwltdXRleF91bmxvY2soJnByaXYtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB4YzQwMDBfc2V0X2FuYWxvZ19wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJc3RydWN0IGFuYWxvZ19wYXJhbWV0ZXJzICpwYXJhbXMpCit7CisJc3RydWN0IHhjNDAwMF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJdW5zaWduZWQgaW50IHR5cGUgPSAwOworCWludAlyZXQgPSAtRVJFTU9URUlPOworCisJaWYgKHBhcmFtcy0+bW9kZSA9PSBWNEwyX1RVTkVSX1JBRElPKSB7CisJCWRwcmludGsoMSwgIiVzKCkgZnJlcXVlbmN5PSVkIChpbiB1bml0cyBvZiA2Mi41SHopXG4iLAorCQkJX19mdW5jX18sIHBhcmFtcy0+ZnJlcXVlbmN5KTsKKworCQltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKKworCQlwYXJhbXMtPnN0ZCA9IDA7CisJCXByaXYtPmZyZXFfaHogPSBwYXJhbXMtPmZyZXF1ZW5jeSAqIDEyNUwgLyAyOworCisJCWlmIChhdWRpb19zdGQgJiBYQzQwMDBfQVVESU9fU1REX0lOUFVUMSkgeworCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfRk1fUmFkaW9fSU5QVVQxOworCQkJdHlwZSA9IEZNIHwgSU5QVVQxOworCQl9IGVsc2UgeworCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfRk1fUmFkaW9fSU5QVVQyOworCQkJdHlwZSA9IEZNIHwgSU5QVVQyOworCQl9CisKKwkJZ290byB0dW5lX2NoYW5uZWw7CisJfQorCisJZHByaW50aygxLCAiJXMoKSBmcmVxdWVuY3k9JWQgKGluIHVuaXRzIG9mIDYyLjVraHopXG4iLAorCQlfX2Z1bmNfXywgcGFyYW1zLT5mcmVxdWVuY3kpOworCisJbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7CisKKwkvKiBwYXJhbXMtPmZyZXF1ZW5jeSBpcyBpbiB1bml0cyBvZiA2Mi41a2h6ICovCisJcHJpdi0+ZnJlcV9oeiA9IHBhcmFtcy0+ZnJlcXVlbmN5ICogNjI1MDA7CisKKwlwYXJhbXMtPnN0ZCAmPSBWNEwyX1NURF9BTEw7CisJLyogaWYgc3RkIGlzIG5vdCBkZWZpbmVkLCBjaG9vc2Ugb25lICovCisJaWYgKCFwYXJhbXMtPnN0ZCkKKwkJcGFyYW1zLT5zdGQgPSBWNEwyX1NURF9QQUxfQkc7CisKKwlpZiAoYXVkaW9fc3RkICYgWEM0MDAwX0FVRElPX1NURF9NT05PKQorCQl0eXBlID0gTU9OTzsKKworCWlmIChwYXJhbXMtPnN0ZCAmIFY0TDJfU1REX01OKSB7CisJCXBhcmFtcy0+c3RkID0gVjRMMl9TVERfTU47CisJCWlmIChhdWRpb19zdGQgJiBYQzQwMDBfQVVESU9fU1REX01PTk8pIHsKKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX01OX05UU0NfUEFMX01vbm87CisJCX0gZWxzZSBpZiAoYXVkaW9fc3RkICYgWEM0MDAwX0FVRElPX1NURF9BMikgeworCQkJcGFyYW1zLT5zdGQgfD0gVjRMMl9TVERfQTI7CisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9NTl9OVFNDX1BBTF9BMjsKKwkJfSBlbHNlIHsKKwkJCXBhcmFtcy0+c3RkIHw9IFY0TDJfU1REX0JUU0M7CisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9NTl9OVFNDX1BBTF9CVFNDOworCQl9CisJCWdvdG8gdHVuZV9jaGFubmVsOworCX0KKworCWlmIChwYXJhbXMtPnN0ZCAmIFY0TDJfU1REX1BBTF9CRykgeworCQlwYXJhbXMtPnN0ZCA9IFY0TDJfU1REX1BBTF9CRzsKKwkJaWYgKGF1ZGlvX3N0ZCAmIFhDNDAwMF9BVURJT19TVERfTU9OTykgeworCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfQkdfUEFMX01PTk87CisJCX0gZWxzZSBpZiAoIShhdWRpb19zdGQgJiBYQzQwMDBfQVVESU9fU1REX0EyKSkgeworCQkJaWYgKCEoYXVkaW9fc3RkICYgWEM0MDAwX0FVRElPX1NURF9CKSkgeworCQkJCXBhcmFtcy0+c3RkIHw9IFY0TDJfU1REX05JQ0FNX0E7CisJCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfQkdfUEFMX05JQ0FNOworCQkJfSBlbHNlIHsKKwkJCQlwYXJhbXMtPnN0ZCB8PSBWNEwyX1NURF9OSUNBTV9COworCQkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0JHX1BBTF9OSUNBTTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghKGF1ZGlvX3N0ZCAmIFhDNDAwMF9BVURJT19TVERfQikpIHsKKwkJCQlwYXJhbXMtPnN0ZCB8PSBWNEwyX1NURF9BMl9BOworCQkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0JHX1BBTF9BMjsKKwkJCX0gZWxzZSB7CisJCQkJcGFyYW1zLT5zdGQgfD0gVjRMMl9TVERfQTJfQjsKKwkJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9CR19QQUxfQTI7CisJCQl9CisJCX0KKwkJZ290byB0dW5lX2NoYW5uZWw7CisJfQorCisJaWYgKHBhcmFtcy0+c3RkICYgVjRMMl9TVERfUEFMX0kpIHsKKwkJLyogZGVmYXVsdCB0byBOSUNBTSBhdWRpbyBzdGFuZGFyZCAqLworCQlwYXJhbXMtPnN0ZCA9IFY0TDJfU1REX1BBTF9JIHwgVjRMMl9TVERfTklDQU07CisJCWlmIChhdWRpb19zdGQgJiBYQzQwMDBfQVVESU9fU1REX01PTk8pCisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9JX1BBTF9OSUNBTV9NT05POworCQllbHNlCisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9JX1BBTF9OSUNBTTsKKwkJZ290byB0dW5lX2NoYW5uZWw7CisJfQorCisJaWYgKHBhcmFtcy0+c3RkICYgVjRMMl9TVERfUEFMX0RLKSB7CisJCXBhcmFtcy0+c3RkID0gVjRMMl9TVERfUEFMX0RLOworCQlpZiAoYXVkaW9fc3RkICYgWEM0MDAwX0FVRElPX1NURF9NT05PKSB7CisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9ES19QQUxfTU9OTzsKKwkJfSBlbHNlIGlmIChhdWRpb19zdGQgJiBYQzQwMDBfQVVESU9fU1REX0EyKSB7CisJCQlwYXJhbXMtPnN0ZCB8PSBWNEwyX1NURF9BMjsKKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0RLX1BBTF9BMjsKKwkJfSBlbHNlIHsKKwkJCXBhcmFtcy0+c3RkIHw9IFY0TDJfU1REX05JQ0FNOworCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfREtfUEFMX05JQ0FNOworCQl9CisJCWdvdG8gdHVuZV9jaGFubmVsOworCX0KKworCWlmIChwYXJhbXMtPnN0ZCAmIFY0TDJfU1REX1NFQ0FNX0RLKSB7CisJCS8qIGRlZmF1bHQgdG8gQTIgYXVkaW8gc3RhbmRhcmQgKi8KKwkJcGFyYW1zLT5zdGQgPSBWNEwyX1NURF9TRUNBTV9ESyB8IFY0TDJfU1REX0EyOworCQlpZiAoYXVkaW9fc3RkICYgWEM0MDAwX0FVRElPX1NURF9MKSB7CisJCQl0eXBlID0gMDsKKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0RLX1NFQ0FNX05JQ0FNOworCQl9IGVsc2UgaWYgKGF1ZGlvX3N0ZCAmIFhDNDAwMF9BVURJT19TVERfTU9OTykgeworCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfREtfU0VDQU1fQTJNT05POworCQl9IGVsc2UgaWYgKGF1ZGlvX3N0ZCAmIFhDNDAwMF9BVURJT19TVERfSzMpIHsKKwkJCXBhcmFtcy0+c3RkIHw9IFY0TDJfU1REX1NFQ0FNX0szOworCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfREtfU0VDQU1fQTJMREszOworCQl9IGVsc2UgeworCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfREtfU0VDQU1fQTJESzE7CisJCX0KKwkJZ290byB0dW5lX2NoYW5uZWw7CisJfQorCisJaWYgKHBhcmFtcy0+c3RkICYgVjRMMl9TVERfU0VDQU1fTCkgeworCQkvKiBkZWZhdWx0IHRvIE5JQ0FNIGF1ZGlvIHN0YW5kYXJkICovCisJCXR5cGUgPSAwOworCQlwYXJhbXMtPnN0ZCA9IFY0TDJfU1REX1NFQ0FNX0wgfCBWNEwyX1NURF9OSUNBTTsKKwkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfTF9TRUNBTV9OSUNBTTsKKwkJZ290byB0dW5lX2NoYW5uZWw7CisJfQorCisJaWYgKHBhcmFtcy0+c3RkICYgVjRMMl9TVERfU0VDQU1fTEMpIHsKKwkJLyogZGVmYXVsdCB0byBOSUNBTSBhdWRpbyBzdGFuZGFyZCAqLworCQl0eXBlID0gMDsKKwkJcGFyYW1zLT5zdGQgPSBWNEwyX1NURF9TRUNBTV9MQyB8IFY0TDJfU1REX05JQ0FNOworCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9MQ19TRUNBTV9OSUNBTTsKKwkJZ290byB0dW5lX2NoYW5uZWw7CisJfQorCit0dW5lX2NoYW5uZWw6CisJLyogRklYTUU6IGl0IGNvdWxkIGJlIGFpci4gKi8KKwlwcml2LT5yZl9tb2RlID0gWENfUkZfTU9ERV9DQUJMRTsKKworCWlmIChjaGVja19maXJtd2FyZShmZSwgdHlwZSwgcGFyYW1zLT5zdGQsCisJCQkgICB4YzQwMDBfc3RhbmRhcmRbcHJpdi0+dmlkZW9fc3RhbmRhcmRdLmludF9mcmVxKSAhPSAwKQorCQlnb3RvIGZhaWw7CisKKwlyZXQgPSB4Y19zZXRfc2lnbmFsX3NvdXJjZShwcml2LCBwcml2LT5yZl9tb2RlKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAieGM0MDAwOiB4Y19zZXRfc2lnbmFsX3NvdXJjZSglZCkgZmFpbGVkXG4iLAorCQkgICAgICAgcHJpdi0+cmZfbW9kZSk7CisJCWdvdG8gZmFpbDsKKwl9IGVsc2UgeworCQl1MTYJdmlkZW9fbW9kZSwgYXVkaW9fbW9kZTsKKwkJdmlkZW9fbW9kZSA9IHhjNDAwMF9zdGFuZGFyZFtwcml2LT52aWRlb19zdGFuZGFyZF0udmlkZW9fbW9kZTsKKwkJYXVkaW9fbW9kZSA9IHhjNDAwMF9zdGFuZGFyZFtwcml2LT52aWRlb19zdGFuZGFyZF0uYXVkaW9fbW9kZTsKKwkJaWYgKHByaXYtPnZpZGVvX3N0YW5kYXJkIDwgWEM0MDAwX0JHX1BBTF9BMikgeworCQkJaWYgKHR5cGUgJiBOT0dEKQorCQkJCXZpZGVvX21vZGUgJj0gMHhGRjdGOworCQl9IGVsc2UgaWYgKHByaXYtPnZpZGVvX3N0YW5kYXJkIDwgWEM0MDAwX0lfUEFMX05JQ0FNKSB7CisJCQlpZiAocHJpdi0+ZmlybV92ZXJzaW9uID09IDB4MDEwMikKKwkJCQl2aWRlb19tb2RlICY9IDB4RkVGRjsKKwkJCWlmIChhdWRpb19zdGQgJiBYQzQwMDBfQVVESU9fU1REX0IpCisJCQkJdmlkZW9fbW9kZSB8PSAweDAwODA7CisJCX0KKwkJcmV0ID0geGNfc2V0X3R2X3N0YW5kYXJkKHByaXYsIHZpZGVvX21vZGUsIGF1ZGlvX21vZGUpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAieGM0MDAwOiB4Y19zZXRfdHZfc3RhbmRhcmQgZmFpbGVkXG4iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCWlmICh4Y193cml0ZV9yZWcocHJpdiwgWFJFR19EX0NPREUsIDApID09IDApCisJCXJldCA9IDA7CisJaWYgKHhjX3dyaXRlX3JlZyhwcml2LCBYUkVHX0FNUExJVFVERSwgMSkgIT0gMCkKKwkJcmV0ID0gLUVSRU1PVEVJTzsKKwlpZiAocHJpdi0+c2V0X3Ntb290aGVkY3ZicyAhPSAwKSB7CisJCWlmICh4Y193cml0ZV9yZWcocHJpdiwgWFJFR19TTU9PVEhFRENWQlMsIDEpICE9IDApCisJCQlyZXQgPSAtRVJFTU9URUlPOworCX0KKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ4YzQwMDA6IHNldHRpbmcgcmVnaXN0ZXJzIGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwl4Y190dW5lX2NoYW5uZWwocHJpdiwgcHJpdi0+ZnJlcV9oeik7CisKKwlyZXQgPSAwOworCitmYWlsOgorCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHhjNDAwMF9nZXRfZnJlcXVlbmN5KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmZyZXEpCit7CisJc3RydWN0IHhjNDAwMF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisKKwkqZnJlcSA9IHByaXYtPmZyZXFfaHo7CisKKwlpZiAoZGVidWcpIHsKKwkJbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7CisJCWlmICgocHJpdi0+Y3VyX2Z3LnR5cGUKKwkJICAgICAmIChCQVNFIHwgRk0gfCBEVFY2IHwgRFRWNyB8IERUVjc4IHwgRFRWOCkpID09IEJBU0UpIHsKKwkJCXUxNglzbnIgPSAwOworCQkJaWYgKHhjNDAwMF9yZWFkcmVnKHByaXYsIFhSRUdfU05SLCAmc25yKSA9PSAwKSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKKwkJCQlkcHJpbnRrKDEsICIlcygpIGZyZXEgPSAldSwgU05SID0gJWRcbiIsCisJCQkJCV9fZnVuY19fLCAqZnJlcSwgc25yKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQltdXRleF91bmxvY2soJnByaXYtPmxvY2spOworCX0KKworCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhjNDAwMF9nZXRfYmFuZHdpZHRoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmJ3KQoreworCXN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCSpidyA9IHByaXYtPmJhbmR3aWR0aDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4YzQwMDBfZ2V0X3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpzdGF0dXMpCit7CisJc3RydWN0IHhjNDAwMF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJdTE2CWxvY2tfc3RhdHVzID0gMDsKKworCW11dGV4X2xvY2soJnByaXYtPmxvY2spOworCisJaWYgKHByaXYtPmN1cl9mdy50eXBlICYgQkFTRSkKKwkJeGNfZ2V0X2xvY2tfc3RhdHVzKHByaXYsICZsb2NrX3N0YXR1cyk7CisKKwkqc3RhdHVzID0gKGxvY2tfc3RhdHVzID09IDEgPworCQkgICBUVU5FUl9TVEFUVVNfTE9DS0VEIHwgVFVORVJfU1RBVFVTX1NURVJFTyA6IDApOworCWlmIChwcml2LT5jdXJfZncudHlwZSAmIChEVFY2IHwgRFRWNyB8IERUVjc4IHwgRFRWOCkpCisJCSpzdGF0dXMgJj0gKH5UVU5FUl9TVEFUVVNfU1RFUkVPKTsKKworCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7CisKKwlkcHJpbnRrKDIsICIlcygpIGxvY2tfc3RhdHVzID0gJWRcbiIsIF9fZnVuY19fLCBsb2NrX3N0YXR1cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4YzQwMDBfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IHhjNDAwMF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJaW50CXJldCA9IDA7CisKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKKworCS8qIEF2b2lkIGZpcm13YXJlIHJlbG9hZCBvbiBzbG93IGRldmljZXMgKi8KKwlpZiAoKG5vX3Bvd2Vyb2ZmID09IDIgfHwKKwkgICAgIChub19wb3dlcm9mZiA9PSAwICYmIHByaXYtPmRlZmF1bHRfcG0gIT0gMCkpICYmCisJICAgIChwcml2LT5jdXJfZncudHlwZSAmIEJBU0UpICE9IDApIHsKKwkJLyogZm9yY2UgcmVzZXQgYW5kIGZpcm13YXJlIHJlbG9hZCAqLworCQlwcml2LT5jdXJfZncudHlwZSA9IFhDX1BPV0VSRURfRE9XTjsKKworCQlpZiAoeGNfd3JpdGVfcmVnKHByaXYsIFhSRUdfUE9XRVJfRE9XTiwgMCkgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgInhjNDAwMDogJXMoKSB1bmFibGUgdG8gc2h1dGRvd24gdHVuZXJcbiIsCisJCQkgICAgICAgX19mdW5jX18pOworCQkJcmV0ID0gLUVSRU1PVEVJTzsKKwkJfQorCQltc2xlZXAoMjApOworCX0KKworCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHhjNDAwMF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhjNDAwMF9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCisJZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJbXV0ZXhfbG9jaygmeGM0MDAwX2xpc3RfbXV0ZXgpOworCisJaWYgKHByaXYpCisJCWh5YnJpZF90dW5lcl9yZWxlYXNlX3N0YXRlKHByaXYpOworCisJbXV0ZXhfdW5sb2NrKCZ4YzQwMDBfbGlzdF9tdXRleCk7CisKKwlmZS0+dHVuZXJfcHJpdiA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkdmJfdHVuZXJfb3BzIHhjNDAwMF90dW5lcl9vcHMgPSB7CisJLmluZm8gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJYY2VpdmUgWEM0MDAwIiwKKwkJLmZyZXF1ZW5jeV9taW4gID0gICAgMTAwMDAwMCwKKwkJLmZyZXF1ZW5jeV9tYXggID0gMTAyMzAwMDAwMCwKKwkJLmZyZXF1ZW5jeV9zdGVwID0gICAgICA1MDAwMCwKKwl9LAorCisJLnJlbGVhc2UJICAgPSB4YzQwMDBfcmVsZWFzZSwKKwkuaW5pdAkJICAgPSB4YzQwMDBfaW5pdCwKKwkuc2xlZXAJCSAgID0geGM0MDAwX3NsZWVwLAorCisJLnNldF9wYXJhbXMJICAgPSB4YzQwMDBfc2V0X3BhcmFtcywKKwkuc2V0X2FuYWxvZ19wYXJhbXMgPSB4YzQwMDBfc2V0X2FuYWxvZ19wYXJhbXMsCisJLmdldF9mcmVxdWVuY3kJICAgPSB4YzQwMDBfZ2V0X2ZyZXF1ZW5jeSwKKwkuZ2V0X2JhbmR3aWR0aAkgICA9IHhjNDAwMF9nZXRfYmFuZHdpZHRoLAorCS5nZXRfc3RhdHVzCSAgID0geGM0MDAwX2dldF9zdGF0dXMKK307CisKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKnhjNDAwMF9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyICppMmMsCisJCQkJICAgc3RydWN0IHhjNDAwMF9jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYgPSBOVUxMOworCWludAlpbnN0YW5jZTsKKwl1MTYJaWQgPSAwOworCisJZHByaW50aygxLCAiJXMoJWQtJTA0eClcbiIsIF9fZnVuY19fLAorCQlpMmMgPyBpMmNfYWRhcHRlcl9pZChpMmMpIDogLTEsCisJCWNmZyA/IGNmZy0+aTJjX2FkZHJlc3MgOiAtMSk7CisKKwltdXRleF9sb2NrKCZ4YzQwMDBfbGlzdF9tdXRleCk7CisKKwlpbnN0YW5jZSA9IGh5YnJpZF90dW5lcl9yZXF1ZXN0X3N0YXRlKHN0cnVjdCB4YzQwMDBfcHJpdiwgcHJpdiwKKwkJCQkJICAgICAgaHlicmlkX3R1bmVyX2luc3RhbmNlX2xpc3QsCisJCQkJCSAgICAgIGkyYywgY2ZnLT5pMmNfYWRkcmVzcywgInhjNDAwMCIpOworCXN3aXRjaCAoaW5zdGFuY2UpIHsKKwljYXNlIDA6CisJCWdvdG8gZmFpbDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkvKiBuZXcgdHVuZXIgaW5zdGFuY2UgKi8KKwkJcHJpdi0+YmFuZHdpZHRoID0gQkFORFdJRFRIXzZfTUhaOworCQkvKiBzZXQgZGVmYXVsdCBjb25maWd1cmF0aW9uICovCisJCXByaXYtPmlmX2toeiA9IDQ1NjA7CisJCXByaXYtPmRlZmF1bHRfcG0gPSAwOworCQlwcml2LT5kdmJfYW1wbGl0dWRlID0gMTM0OworCQlwcml2LT5zZXRfc21vb3RoZWRjdmJzID0gMTsKKwkJbXV0ZXhfaW5pdCgmcHJpdi0+bG9jayk7CisJCWZlLT50dW5lcl9wcml2ID0gcHJpdjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogZXhpc3RpbmcgdHVuZXIgaW5zdGFuY2UgKi8KKwkJZmUtPnR1bmVyX3ByaXYgPSBwcml2OworCQlicmVhazsKKwl9CisKKwlpZiAoY2ZnLT5pZl9raHogIT0gMCkgeworCQkvKiBjb3B5IGNvbmZpZ3VyYXRpb24gaWYgcHJvdmlkZWQgYnkgdGhlIGNhbGxlciAqLworCQlwcml2LT5pZl9raHogPSBjZmctPmlmX2toejsKKwkJcHJpdi0+ZGVmYXVsdF9wbSA9IGNmZy0+ZGVmYXVsdF9wbTsKKwkJcHJpdi0+ZHZiX2FtcGxpdHVkZSA9IGNmZy0+ZHZiX2FtcGxpdHVkZTsKKwkJcHJpdi0+c2V0X3Ntb290aGVkY3ZicyA9IGNmZy0+c2V0X3Ntb290aGVkY3ZiczsKKwl9CisKKwkvKiBDaGVjayBpZiBmaXJtd2FyZSBoYXMgYmVlbiBsb2FkZWQuIEl0IGlzIHBvc3NpYmxlIHRoYXQgYW5vdGhlcgorCSAgIGluc3RhbmNlIG9mIHRoZSBkcml2ZXIgaGFzIGxvYWRlZCB0aGUgZmlybXdhcmUuCisJICovCisKKwlpZiAoaW5zdGFuY2UgPT0gMSkgeworCQlpZiAoeGM0MDAwX3JlYWRyZWcocHJpdiwgWFJFR19QUk9EVUNUX0lELCAmaWQpICE9IDApCisJCQlnb3RvIGZhaWw7CisJfSBlbHNlIHsKKwkJaWQgPSAoKHByaXYtPmN1cl9mdy50eXBlICYgQkFTRSkgIT0gMCA/CisJCSAgICAgIHByaXYtPmh3bW9kZWwgOiBYQ19QUk9EVUNUX0lEX0ZXX05PVF9MT0FERUQpOworCX0KKworCXN3aXRjaCAoaWQpIHsKKwljYXNlIFhDX1BST0RVQ1RfSURfWEM0MDAwOgorCWNhc2UgWENfUFJPRFVDVF9JRF9YQzQxMDA6CisJCXByaW50ayhLRVJOX0lORk8KKwkJCSJ4YzQwMDA6IFN1Y2Nlc3NmdWxseSBpZGVudGlmaWVkIGF0IGFkZHJlc3MgMHglMDJ4XG4iLAorCQkJY2ZnLT5pMmNfYWRkcmVzcyk7CisJCXByaW50ayhLRVJOX0lORk8KKwkJCSJ4YzQwMDA6IEZpcm13YXJlIGhhcyBiZWVuIGxvYWRlZCBwcmV2aW91c2x5XG4iKTsKKwkJYnJlYWs7CisJY2FzZSBYQ19QUk9EVUNUX0lEX0ZXX05PVF9MT0FERUQ6CisJCXByaW50ayhLRVJOX0lORk8KKwkJCSJ4YzQwMDA6IFN1Y2Nlc3NmdWxseSBpZGVudGlmaWVkIGF0IGFkZHJlc3MgMHglMDJ4XG4iLAorCQkJY2ZnLT5pMmNfYWRkcmVzcyk7CisJCXByaW50ayhLRVJOX0lORk8KKwkJCSJ4YzQwMDA6IEZpcm13YXJlIGhhcyBub3QgYmVlbiBsb2FkZWQgcHJldmlvdXNseVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUgorCQkJInhjNDAwMDogRGV2aWNlIG5vdCBmb3VuZCBhdCBhZGRyIDB4JTAyeCAoMHgleClcbiIsCisJCQljZmctPmkyY19hZGRyZXNzLCBpZCk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwltdXRleF91bmxvY2soJnhjNDAwMF9saXN0X211dGV4KTsKKworCW1lbWNweSgmZmUtPm9wcy50dW5lcl9vcHMsICZ4YzQwMDBfdHVuZXJfb3BzLAorCQlzaXplb2Yoc3RydWN0IGR2Yl90dW5lcl9vcHMpKTsKKworCWlmIChpbnN0YW5jZSA9PSAxKSB7CisJCWludAlyZXQ7CisJCW11dGV4X2xvY2soJnByaXYtPmxvY2spOworCQlyZXQgPSB4YzQwMDBfZnd1cGxvYWQoZmUpOworCQltdXRleF91bmxvY2soJnByaXYtPmxvY2spOworCQlpZiAocmV0ICE9IDApCisJCQlnb3RvIGZhaWwyOworCX0KKworCXJldHVybiBmZTsKK2ZhaWw6CisJbXV0ZXhfdW5sb2NrKCZ4YzQwMDBfbGlzdF9tdXRleCk7CitmYWlsMjoKKwl4YzQwMDBfcmVsZWFzZShmZSk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKHhjNDAwMF9hdHRhY2gpOworCitNT0RVTEVfQVVUSE9SKCJTdGV2ZW4gVG90aCwgRGF2aWRlIEZlcnJpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlhjZWl2ZSB4YzQwMDAgc2lsaWNvbiB0dW5lciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy94YzQwMDAuaCBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy94YzQwMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmE0NGQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3hjNDAwMC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiAgRHJpdmVyIGZvciBYY2VpdmUgWEM0MDAwICJRQU0vOFZTQiBzaW5nbGUgY2hpcCB0dW5lciIKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3IFN0ZXZlbiBUb3RoIDxzdG90aEBsaW51eHR2Lm9yZz4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKgorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fWEM0MDAwX0hfXworI2RlZmluZSBfX1hDNDAwMF9IX18KKworI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisKK3N0cnVjdCBkdmJfZnJvbnRlbmQ7CitzdHJ1Y3QgaTJjX2FkYXB0ZXI7CisKK3N0cnVjdCB4YzQwMDBfY29uZmlnIHsKKwl1OAlpMmNfYWRkcmVzczsKKwkvKiBpZiBub24temVybywgcG93ZXIgbWFuYWdlbWVudCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgKi8KKwl1OAlkZWZhdWx0X3BtOworCS8qIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gWFJFR19BTVBMSVRVREUgaW4gRFZCLVQgbW9kZSAoMDogbm8gd3JpdGUpICovCisJdTgJZHZiX2FtcGxpdHVkZTsKKwkvKiBpZiBub24temVybywgcmVnaXN0ZXIgMHgwRSBpcyBzZXQgdG8gZmlsdGVyIGFuYWxvZyBUViB2aWRlbyBvdXRwdXQgKi8KKwl1OAlzZXRfc21vb3RoZWRjdmJzOworCS8qIElGIGZvciBEVkItVCAqLworCXUzMglpZl9raHo7Cit9OworCisvKiB4YzQwMDAgY2FsbGJhY2sgY29tbWFuZCAqLworI2RlZmluZSBYQzQwMDBfVFVORVJfUkVTRVQJCTAKKworLyogRm9yIGVhY2ggYnJpZGdlIGZyYW1ld29yaywgd2hlbiBpdCBhdHRhY2hlcyBlaXRoZXIgYW5hbG9nIG9yIGRpZ2l0YWwsCisgKiBpdCBoYXMgdG8gc3RvcmUgYSByZWZlcmVuY2UgYmFjayB0byBpdHMgX2NvcmUgZXF1aXZhbGVudCBzdHJ1Y3R1cmUsCisgKiBzbyB0aGF0IGl0IGNhbiBzZXJ2aWNlIHRoZSBoYXJkd2FyZSBieSBzdGVlcmluZyBncGlvJ3MgZXRjLgorICogRWFjaCBicmlkZ2UgaW1wbGVtZW50YXRpb24gaXMgZGlmZmVyZW50IHNvIGNhc3QgZGV2cHRyIGFjY29yZGluZ2x5LgorICogVGhlIHhjNDAwMCBkcml2ZXIgY2FyZXMgbm90IGZvciB0aGlzIHZhbHVlLCBvdGhlciB0aGFuIGVuc3VyaW5nCisgKiBpdCdzIHBhc3NlZCBiYWNrIHRvIGEgYnJpZGdlIGR1cmluZyB0dW5lcl9jYWxsYmFjaygpLgorICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19NRURJQV9UVU5FUl9YQzQwMDApIHx8IChkZWZpbmVkKENPTkZJR19NRURJQV9UVU5FUl9YQzQwMDBfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCitleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCAqeGM0MDAwX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywKKwkJCQkJICBzdHJ1Y3QgeGM0MDAwX2NvbmZpZyAqY2ZnKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkdmJfZnJvbnRlbmQgKnhjNDAwMF9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCQkgc3RydWN0IGkyY19hZGFwdGVyICppMmMsCisJCQkJCQkgc3RydWN0IHhjNDAwMF9jb25maWcgKmNmZykKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9LY29uZmlnCmluZGV4IGVlMjE0YzMuLmY2ZTQwYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvS2NvbmZpZwpAQCAtODAsNiArODAsMTAgQEAKIAlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFBDSSAmJiBJMkMKIAlzb3VyY2UgImRyaXZlcnMvbWVkaWEvZHZiL25nZW5lL0tjb25maWciCiAKK2NvbW1lbnQgIlN1cHBvcnRlZCBkZGJyaWRnZSAoJ09jdG9wdXMnKSBBZGFwdGVycyIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFBDSSAmJiBJMkMKKwlzb3VyY2UgImRyaXZlcnMvbWVkaWEvZHZiL2RkYnJpZGdlL0tjb25maWciCisKIGNvbW1lbnQgIlN1cHBvcnRlZCBEVkIgRnJvbnRlbmRzIgogCWRlcGVuZHMgb24gRFZCX0NPUkUKIHNvdXJjZSAiZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL01ha2VmaWxlCmluZGV4IGExYTA4NzUuLmIyY2VmZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL01ha2VmaWxlCkBAIC0xNSw2ICsxNSw3IEBACiAJCWRtMTEwNS8JCVwKIAkJcHQxLwkJXAogCQltYW50aXMvCQlcCi0JCW5nZW5lLworCQluZ2VuZS8JCVwKKwkJZGRicmlkZ2UvCiAKIG9iai0kKENPTkZJR19EVkJfRklSRURUVikJKz0gZmlyZXdpcmUvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCmluZGV4IDFlMTEwNmQuLjUyMWQ2OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCkBAIC04OTIsNyArODkyLDcgQEAKIAlpZiAoIShidHR2X3BjaV9kZXYgPSBidHR2X2dldF9wY2lkZXYoY2FyZC0+YnR0dl9ucikpKSB7CiAJCXByaW50aygiZHZiX2J0OHh4OiBubyBwY2kgZGV2aWNlIGZvciBjYXJkICVkXG4iLCBjYXJkLT5idHR2X25yKTsKIAkJa2ZyZWUoY2FyZCk7Ci0JCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlpZiAoIShjYXJkLT5idCA9IGR2Yl9idDh4eF84NzhfbWF0Y2goY2FyZC0+YnR0dl9uciwgYnR0dl9wY2lfZGV2KSkpIHsKQEAgLTkwMiw3ICs5MDIsNyBAQAogCQkgICAgICAgImluc3RhbGxlZCwgdHJ5IHJlbW92aW5nIGl0LlxuIik7CiAKIAkJa2ZyZWUoY2FyZCk7Ci0JCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAltdXRleF9pbml0KCZjYXJkLT5idC0+Z3Bpb19sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2RkYnJpZGdlL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOTllMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9LY29uZmlnCkBAIC0wLDAgKzEsMTggQEAKK2NvbmZpZyBEVkJfRERCUklER0UKKwl0cmlzdGF0ZSAiRGlnaXRhbCBEZXZpY2VzIGJyaWRnZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgUENJICYmIEkyQworCXNlbGVjdCBEVkJfTE5CUDIxIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9TVFY2MTEweCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfU1RWMDkweCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfRFJYSyBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfVERBMTgyNzFDMkREIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJLS0taGVscC0tLQorCSAgU3VwcG9ydCBmb3IgY2FyZHMgd2l0aCB0aGUgRGlnaXRhbCBEZXZpY2VzIFBDSSBleHByZXNzIGJyaWRnZToKKwkgIC0gT2N0b3B1cyBQQ0llIEJyaWRnZQorCSAgLSBPY3RvcHVzIG1pbmkgUENJZSBCcmlkZ2UKKwkgIC0gT2N0b3B1cyBMRQorCSAgLSBEdW9GbGV4IFMyIE9jdG9wdXMKKwkgIC0gRHVvRmxleCBDVCBPY3RvcHVzCisJICAtIGNpbmVTMih2NikKKworCSAgU2F5IFkgaWYgeW91IG93biBzdWNoIGEgY2FyZCBhbmQgd2FudCB0byB1c2UgaXQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL2RkYnJpZGdlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNGZlMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9NYWtlZmlsZQpAQCAtMCwwICsxLDE0IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgZGRicmlkZ2UgZGV2aWNlIGRyaXZlcgorIworCitkZGJyaWRnZS1vYmpzIDo9IGRkYnJpZGdlLWNvcmUubworCitvYmotJChDT05GSUdfRFZCX0REQlJJREdFKSArPSBkZGJyaWRnZS5vCisKK0VYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLworRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzLworRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzLworCisjIEZvciB0aGUgc3RhZ2luZyBDSSBkcml2ZXIgY3hkMjA5OQorRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9kZGJyaWRnZS1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9kZGJyaWRnZS1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTczZDU0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2RkYnJpZGdlL2RkYnJpZGdlLWNvcmUuYwpAQCAtMCwwICsxLDE3MTkgQEAKKy8qCisgKiBkZGJyaWRnZS5jOiBEaWdpdGFsIERldmljZXMgUENJZSBicmlkZ2UgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgRGlnaXRhbCBEZXZpY2VzIEdtYkgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICogT3IsIHBvaW50IHlvdXIgYnJvd3NlciB0byBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgImRkYnJpZGdlLmgiCisKKyNpbmNsdWRlICJkZGJyaWRnZS1yZWdzLmgiCisKKyNpbmNsdWRlICJ0ZGExODI3MWMyZGQuaCIKKyNpbmNsdWRlICJzdHY2MTEweC5oIgorI2luY2x1ZGUgInN0djA5MHguaCIKKyNpbmNsdWRlICJsbmJoMjQuaCIKKyNpbmNsdWRlICJkcnhrLmgiCisKK0RWQl9ERUZJTkVfTU9EX09QVF9BREFQVEVSX05SKGFkYXB0ZXJfbnIpOworCisvKiBNU0kgaGFkIHByb2JsZW1zIHdpdGggbG9zdCBpbnRlcnJ1cHRzLCBmaXhlZCBidXQgbmVlZHMgdGVzdGluZyAqLworI3VuZGVmIENPTkZJR19QQ0lfTVNJCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgaTJjX3JlYWQoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCB1OCBhZHIsIHU4ICp2YWwpCit7CisJc3RydWN0IGkyY19tc2cgbXNnc1sxXSA9IHt7LmFkZHIgPSBhZHIsICAuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCQkgICAuYnVmICA9IHZhbCwgIC5sZW4gICA9IDEgfSB9OworCXJldHVybiAoaTJjX3RyYW5zZmVyKGFkYXB0ZXIsIG1zZ3MsIDEpID09IDEpID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IGkyY19yZWFkX3JlZyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IGFkciwgdTggcmVnLCB1OCAqdmFsKQoreworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbMl0gPSB7ey5hZGRyID0gYWRyLCAgLmZsYWdzID0gMCwKKwkJCQkgICAuYnVmICA9ICZyZWcsIC5sZW4gICA9IDEgfSwKKwkJCQkgIHsuYWRkciA9IGFkciwgIC5mbGFncyA9IEkyQ19NX1JELAorCQkJCSAgIC5idWYgID0gdmFsLCAgLmxlbiAgID0gMSB9IH07CisJcmV0dXJuIChpMmNfdHJhbnNmZXIoYWRhcHRlciwgbXNncywgMikgPT0gMikgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQgaTJjX3JlYWRfcmVnMTYoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCB1OCBhZHIsCisJCQkgIHUxNiByZWcsIHU4ICp2YWwpCit7CisJdTggbXNnWzJdID0ge3JlZz4+OCwgcmVnJjB4ZmZ9OworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbMl0gPSB7ey5hZGRyID0gYWRyLCAuZmxhZ3MgPSAwLAorCQkJCSAgIC5idWYgID0gbXNnLCAubGVuICAgPSAyfSwKKwkJCQkgIHsuYWRkciA9IGFkciwgLmZsYWdzID0gSTJDX01fUkQsCisJCQkJICAgLmJ1ZiAgPSB2YWwsIC5sZW4gICA9IDF9IH07CisJcmV0dXJuIChpMmNfdHJhbnNmZXIoYWRhcHRlciwgbXNncywgMikgPT0gMikgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQgZGRiX2kyY19jbWQoc3RydWN0IGRkYl9pMmMgKmkyYywgdTMyIGFkciwgdTMyIGNtZCkKK3sKKwlzdHJ1Y3QgZGRiICpkZXYgPSBpMmMtPmRldjsKKwlpbnQgc3RhdDsKKwl1MzIgdmFsOworCisJaTJjLT5kb25lID0gMDsKKwlkZGJ3cml0ZWwoKGFkciA8PCA5KSB8IGNtZCwgaTJjLT5yZWdzICsgSTJDX0NPTU1BTkQpOworCXN0YXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoaTJjLT53cSwgaTJjLT5kb25lID09IDEsIEhaKTsKKwlpZiAoc3RhdCA8PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSTJDIHRpbWVvdXRcbiIpOworCQl7IC8qIE1TSSBkZWJ1Z2dpbmcqLworCQkJdTMyIGlzdGF0ID0gZGRicmVhZGwoSU5URVJSVVBUX1NUQVRVUyk7CisJCQlwcmludGsoS0VSTl9FUlIgIklSUyAlMDh4XG4iLCBpc3RhdCk7CisJCQlkZGJ3cml0ZWwoaXN0YXQsIElOVEVSUlVQVF9BQ0spOworCQl9CisJCXJldHVybiAtRUlPOworCX0KKwl2YWwgPSBkZGJyZWFkbChpMmMtPnJlZ3MrSTJDX0NPTU1BTkQpOworCWlmICh2YWwgJiAweDcwMDAwKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZGJfaTJjX21hc3Rlcl94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKKwkJCSAgICAgICBzdHJ1Y3QgaTJjX21zZyBtc2dbXSwgaW50IG51bSkKK3sKKwlzdHJ1Y3QgZGRiX2kyYyAqaTJjID0gKHN0cnVjdCBkZGJfaTJjICopaTJjX2dldF9hZGFwZGF0YShhZGFwdGVyKTsKKwlzdHJ1Y3QgZGRiICpkZXYgPSBpMmMtPmRldjsKKwl1OCBhZGRyID0gMDsKKworCWlmIChudW0pCisJCWFkZHIgPSBtc2dbMF0uYWRkcjsKKworCWlmIChudW0gPT0gMiAmJiBtc2dbMV0uZmxhZ3MgJiBJMkNfTV9SRCAmJgorCSAgICAhKG1zZ1swXS5mbGFncyAmIEkyQ19NX1JEKSkgeworCQltZW1jcHlfdG9pbyhkZXYtPnJlZ3MgKyBJMkNfVEFTS01FTV9CQVNFICsgaTJjLT53YnVmLAorCQkJICAgIG1zZ1swXS5idWYsIG1zZ1swXS5sZW4pOworCQlkZGJ3cml0ZWwobXNnWzBdLmxlbnwobXNnWzFdLmxlbiA8PCAxNiksCisJCQkgIGkyYy0+cmVncytJMkNfVEFTS0xFTkdUSCk7CisJCWlmICghZGRiX2kyY19jbWQoaTJjLCBhZGRyLCAxKSkgeworCQkJbWVtY3B5X2Zyb21pbyhtc2dbMV0uYnVmLAorCQkJCSAgICAgIGRldi0+cmVncyArIEkyQ19UQVNLTUVNX0JBU0UgKyBpMmMtPnJidWYsCisJCQkJICAgICAgbXNnWzFdLmxlbik7CisJCQlyZXR1cm4gbnVtOworCQl9CisJfQorCisJaWYgKG51bSA9PSAxICYmICEobXNnWzBdLmZsYWdzICYgSTJDX01fUkQpKSB7CisJCWRkYmNweXRvKEkyQ19UQVNLTUVNX0JBU0UgKyBpMmMtPndidWYsIG1zZ1swXS5idWYsIG1zZ1swXS5sZW4pOworCQlkZGJ3cml0ZWwobXNnWzBdLmxlbiwgaTJjLT5yZWdzICsgSTJDX1RBU0tMRU5HVEgpOworCQlpZiAoIWRkYl9pMmNfY21kKGkyYywgYWRkciwgMikpCisJCQlyZXR1cm4gbnVtOworCX0KKwlpZiAobnVtID09IDEgJiYgKG1zZ1swXS5mbGFncyAmIEkyQ19NX1JEKSkgeworCQlkZGJ3cml0ZWwobXNnWzBdLmxlbiA8PCAxNiwgaTJjLT5yZWdzICsgSTJDX1RBU0tMRU5HVEgpOworCQlpZiAoIWRkYl9pMmNfY21kKGkyYywgYWRkciwgMykpIHsKKwkJCWRkYmNweWZyb20obXNnWzBdLmJ1ZiwKKwkJCQkgICBJMkNfVEFTS01FTV9CQVNFICsgaTJjLT5yYnVmLCBtc2dbMF0ubGVuKTsKKwkJCXJldHVybiBudW07CisJCX0KKwl9CisJcmV0dXJuIC1FSU87Cit9CisKKworc3RhdGljIHUzMiBkZGJfaTJjX2Z1bmN0aW9uYWxpdHkoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXJldHVybiBJMkNfRlVOQ19TTUJVU19FTVVMOworfQorCitzdHJ1Y3QgaTJjX2FsZ29yaXRobSBkZGJfaTJjX2FsZ28gPSB7CisJLm1hc3Rlcl94ZmVyICAgPSBkZGJfaTJjX21hc3Rlcl94ZmVyLAorCS5mdW5jdGlvbmFsaXR5ID0gZGRiX2kyY19mdW5jdGlvbmFsaXR5LAorfTsKKworc3RhdGljIHZvaWQgZGRiX2kyY19yZWxlYXNlKHN0cnVjdCBkZGIgKmRldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZGRiX2kyYyAqaTJjOworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcDsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPmluZm8tPnBvcnRfbnVtOyBpKyspIHsKKwkJaTJjID0gJmRldi0+aTJjW2ldOworCQlhZGFwID0gJmkyYy0+YWRhcDsKKwkJaTJjX2RlbF9hZGFwdGVyKGFkYXApOworCX0KK30KKworc3RhdGljIGludCBkZGJfaTJjX2luaXQoc3RydWN0IGRkYiAqZGV2KQoreworCWludCBpLCBqLCBzdGF0ID0gMDsKKwlzdHJ1Y3QgZGRiX2kyYyAqaTJjOworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcDsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPmluZm8tPnBvcnRfbnVtOyBpKyspIHsKKwkJaTJjID0gJmRldi0+aTJjW2ldOworCQlpMmMtPmRldiA9IGRldjsKKwkJaTJjLT5uciA9IGk7CisJCWkyYy0+d2J1ZiA9IGkgKiAoSTJDX1RBU0tNRU1fU0laRSAvIDQpOworCQlpMmMtPnJidWYgPSBpMmMtPndidWYgKyAoSTJDX1RBU0tNRU1fU0laRSAvIDgpOworCQlpMmMtPnJlZ3MgPSAweDgwICsgaSAqIDB4MjA7CisJCWRkYndyaXRlbChJMkNfU1BFRURfMTAwLCBpMmMtPnJlZ3MgKyBJMkNfVElNSU5HKTsKKwkJZGRid3JpdGVsKChpMmMtPnJidWYgPDwgMTYpIHwgaTJjLT53YnVmLAorCQkJICBpMmMtPnJlZ3MgKyBJMkNfVEFTS0FERFJFU1MpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpMmMtPndxKTsKKworCQlhZGFwID0gJmkyYy0+YWRhcDsKKwkJaTJjX3NldF9hZGFwZGF0YShhZGFwLCBpMmMpOworI2lmZGVmIEkyQ19BREFQX0NMQVNTX1RWX0RJR0lUQUwKKwkJYWRhcC0+Y2xhc3MgPSBJMkNfQURBUF9DTEFTU19UVl9ESUdJVEFMfEkyQ19DTEFTU19UVl9BTkFMT0c7CisjZWxzZQorI2lmZGVmIEkyQ19DTEFTU19UVl9BTkFMT0cKKwkJYWRhcC0+Y2xhc3MgPSBJMkNfQ0xBU1NfVFZfQU5BTE9HOworI2VuZGlmCisjZW5kaWYKKwkJc3RyY3B5KGFkYXAtPm5hbWUsICJkZGJyaWRnZSIpOworCQlhZGFwLT5hbGdvID0gJmRkYl9pMmNfYWxnbzsKKwkJYWRhcC0+YWxnb19kYXRhID0gKHZvaWQgKilpMmM7CisJCWFkYXAtPmRldi5wYXJlbnQgPSAmZGV2LT5wZGV2LT5kZXY7CisJCXN0YXQgPSBpMmNfYWRkX2FkYXB0ZXIoYWRhcCk7CisJCWlmIChzdGF0KQorCQkJYnJlYWs7CisJfQorCWlmIChzdGF0KQorCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisJCQlpMmMgPSAmZGV2LT5pMmNbal07CisJCQlhZGFwID0gJmkyYy0+YWRhcDsKKwkJCWkyY19kZWxfYWRhcHRlcihhZGFwKTsKKwkJfQorCXJldHVybiBzdGF0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIDAKK3N0YXRpYyB2b2lkIHNldF90YWJsZShzdHJ1Y3QgZGRiICpkZXYsIHUzMiBvZmYsCisJCSAgICAgIGRtYV9hZGRyX3QgKnBidWYsIHUzMiBudW0pCit7CisJdTMyIGksIGJhc2U7CisJdTY0IG1lbTsKKworCWJhc2UgPSBETUFfQkFTRV9BRERSRVNTX1RBQkxFICsgb2ZmOworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQltZW0gPSBwYnVmW2ldOworCQlkZGJ3cml0ZWwobWVtICYgMHhmZmZmZmZmZiwgYmFzZSArIGkgKiA4KTsKKwkJZGRid3JpdGVsKG1lbSA+PiAzMiwgYmFzZSArIGkgKiA4ICsgNCk7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGRkYl9hZGRyZXNzX3RhYmxlKHN0cnVjdCBkZGIgKmRldikKK3sKKwl1MzIgaSwgaiwgYmFzZTsKKwl1NjQgbWVtOworCWRtYV9hZGRyX3QgKnBidWY7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5pbmZvLT5wb3J0X251bSAqIDI7IGkrKykgeworCQliYXNlID0gRE1BX0JBU0VfQUREUkVTU19UQUJMRSArIGkgKiAweDEwMDsKKwkJcGJ1ZiA9IGRldi0+aW5wdXRbaV0ucGJ1ZjsKKwkJZm9yIChqID0gMDsgaiA8IGRldi0+aW5wdXRbaV0uZG1hX2J1Zl9udW07IGorKykgeworCQkJbWVtID0gcGJ1ZltqXTsKKwkJCWRkYndyaXRlbChtZW0gJiAweGZmZmZmZmZmLCBiYXNlICsgaiAqIDgpOworCQkJZGRid3JpdGVsKG1lbSA+PiAzMiwgYmFzZSArIGogKiA4ICsgNCk7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IGRldi0+aW5mby0+cG9ydF9udW07IGkrKykgeworCQliYXNlID0gRE1BX0JBU0VfQUREUkVTU19UQUJMRSArIDB4ODAwICsgaSAqIDB4MTAwOworCQlwYnVmID0gZGV2LT5vdXRwdXRbaV0ucGJ1ZjsKKwkJZm9yIChqID0gMDsgaiA8IGRldi0+b3V0cHV0W2ldLmRtYV9idWZfbnVtOyBqKyspIHsKKwkJCW1lbSA9IHBidWZbal07CisJCQlkZGJ3cml0ZWwobWVtICYgMHhmZmZmZmZmZiwgYmFzZSArIGogKiA4KTsKKwkJCWRkYndyaXRlbChtZW0gPj4gMzIsIGJhc2UgKyBqICogOCArIDQpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBpb19mcmVlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCAqKnZidWYsCisJCSAgICBkbWFfYWRkcl90ICpwYnVmLCB1MzIgc2l6ZSwgaW50IG51bSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlpZiAodmJ1ZltpXSkgeworCQkJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplLCB2YnVmW2ldLCBwYnVmW2ldKTsKKwkJCXZidWZbaV0gPSAwOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGlvX2FsbG9jKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCAqKnZidWYsCisJCSAgICBkbWFfYWRkcl90ICpwYnVmLCB1MzIgc2l6ZSwgaW50IG51bSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQl2YnVmW2ldID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGRldiwgc2l6ZSwgJnBidWZbaV0pOworCQlpZiAoIXZidWZbaV0pCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGRiX2J1ZmZlcnNfYWxsb2Moc3RydWN0IGRkYiAqZGV2KQoreworCWludCBpOworCXN0cnVjdCBkZGJfcG9ydCAqcG9ydDsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPmluZm8tPnBvcnRfbnVtOyBpKyspIHsKKwkJcG9ydCA9ICZkZXYtPnBvcnRbaV07CisJCXN3aXRjaCAocG9ydC0+Y2xhc3MpIHsKKwkJY2FzZSBEREJfUE9SVF9UVU5FUjoKKwkJCWlmIChpb19hbGxvYyhkZXYtPnBkZXYsIHBvcnQtPmlucHV0WzBdLT52YnVmLAorCQkJCSAgICAgcG9ydC0+aW5wdXRbMF0tPnBidWYsCisJCQkJICAgICBwb3J0LT5pbnB1dFswXS0+ZG1hX2J1Zl9zaXplLAorCQkJCSAgICAgcG9ydC0+aW5wdXRbMF0tPmRtYV9idWZfbnVtKSA8IDApCisJCQkJcmV0dXJuIC0xOworCQkJaWYgKGlvX2FsbG9jKGRldi0+cGRldiwgcG9ydC0+aW5wdXRbMV0tPnZidWYsCisJCQkJICAgICBwb3J0LT5pbnB1dFsxXS0+cGJ1ZiwKKwkJCQkgICAgIHBvcnQtPmlucHV0WzFdLT5kbWFfYnVmX3NpemUsCisJCQkJICAgICBwb3J0LT5pbnB1dFsxXS0+ZG1hX2J1Zl9udW0pIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCQlicmVhazsKKwkJY2FzZSBEREJfUE9SVF9DSToKKwkJCWlmIChpb19hbGxvYyhkZXYtPnBkZXYsIHBvcnQtPmlucHV0WzBdLT52YnVmLAorCQkJCSAgICAgcG9ydC0+aW5wdXRbMF0tPnBidWYsCisJCQkJICAgICBwb3J0LT5pbnB1dFswXS0+ZG1hX2J1Zl9zaXplLAorCQkJCSAgICAgcG9ydC0+aW5wdXRbMF0tPmRtYV9idWZfbnVtKSA8IDApCisJCQkJcmV0dXJuIC0xOworCQkJaWYgKGlvX2FsbG9jKGRldi0+cGRldiwgcG9ydC0+b3V0cHV0LT52YnVmLAorCQkJCSAgICAgcG9ydC0+b3V0cHV0LT5wYnVmLAorCQkJCSAgICAgcG9ydC0+b3V0cHV0LT5kbWFfYnVmX3NpemUsCisJCQkJICAgICBwb3J0LT5vdXRwdXQtPmRtYV9idWZfbnVtKSA8IDApCisJCQkJcmV0dXJuIC0xOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlkZGJfYWRkcmVzc190YWJsZShkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZGJfYnVmZmVyc19mcmVlKHN0cnVjdCBkZGIgKmRldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZGRiX3BvcnQgKnBvcnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5pbmZvLT5wb3J0X251bTsgaSsrKSB7CisJCXBvcnQgPSAmZGV2LT5wb3J0W2ldOworCQlpb19mcmVlKGRldi0+cGRldiwgcG9ydC0+aW5wdXRbMF0tPnZidWYsCisJCQlwb3J0LT5pbnB1dFswXS0+cGJ1ZiwKKwkJCXBvcnQtPmlucHV0WzBdLT5kbWFfYnVmX3NpemUsCisJCQlwb3J0LT5pbnB1dFswXS0+ZG1hX2J1Zl9udW0pOworCQlpb19mcmVlKGRldi0+cGRldiwgcG9ydC0+aW5wdXRbMV0tPnZidWYsCisJCQlwb3J0LT5pbnB1dFsxXS0+cGJ1ZiwKKwkJCXBvcnQtPmlucHV0WzFdLT5kbWFfYnVmX3NpemUsCisJCQlwb3J0LT5pbnB1dFsxXS0+ZG1hX2J1Zl9udW0pOworCQlpb19mcmVlKGRldi0+cGRldiwgcG9ydC0+b3V0cHV0LT52YnVmLAorCQkJcG9ydC0+b3V0cHV0LT5wYnVmLAorCQkJcG9ydC0+b3V0cHV0LT5kbWFfYnVmX3NpemUsCisJCQlwb3J0LT5vdXRwdXQtPmRtYV9idWZfbnVtKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRkYl9pbnB1dF9zdGFydChzdHJ1Y3QgZGRiX2lucHV0ICppbnB1dCkKK3sKKwlzdHJ1Y3QgZGRiICpkZXYgPSBpbnB1dC0+cG9ydC0+ZGV2OworCisJc3Bpbl9sb2NrX2lycSgmaW5wdXQtPmxvY2spOworCWlucHV0LT5jYnVmID0gMDsKKwlpbnB1dC0+Y29mZiA9IDA7CisKKwkvKiByZXNldCAqLworCWRkYndyaXRlbCgwLCBUU19JTlBVVF9DT05UUk9MKGlucHV0LT5ucikpOworCWRkYndyaXRlbCgyLCBUU19JTlBVVF9DT05UUk9MKGlucHV0LT5ucikpOworCWRkYndyaXRlbCgwLCBUU19JTlBVVF9DT05UUk9MKGlucHV0LT5ucikpOworCisJZGRid3JpdGVsKCgxIDw8IDE2KSB8CisJCSAgKGlucHV0LT5kbWFfYnVmX251bSA8PCAxMSkgfAorCQkgIChpbnB1dC0+ZG1hX2J1Zl9zaXplID4+IDcpLAorCQkgIERNQV9CVUZGRVJfU0laRShpbnB1dC0+bnIpKTsKKwlkZGJ3cml0ZWwoMCwgRE1BX0JVRkZFUl9BQ0soaW5wdXQtPm5yKSk7CisKKwlkZGJ3cml0ZWwoMSwgRE1BX0JBU0VfV1JJVEUpOworCWRkYndyaXRlbCgzLCBETUFfQlVGRkVSX0NPTlRST0woaW5wdXQtPm5yKSk7CisJZGRid3JpdGVsKDksIFRTX0lOUFVUX0NPTlRST0woaW5wdXQtPm5yKSk7CisJaW5wdXQtPnJ1bm5pbmcgPSAxOworCXNwaW5fdW5sb2NrX2lycSgmaW5wdXQtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBkZGJfaW5wdXRfc3RvcChzdHJ1Y3QgZGRiX2lucHV0ICppbnB1dCkKK3sKKwlzdHJ1Y3QgZGRiICpkZXYgPSBpbnB1dC0+cG9ydC0+ZGV2OworCisJc3Bpbl9sb2NrX2lycSgmaW5wdXQtPmxvY2spOworCWRkYndyaXRlbCgwLCBUU19JTlBVVF9DT05UUk9MKGlucHV0LT5ucikpOworCWRkYndyaXRlbCgwLCBETUFfQlVGRkVSX0NPTlRST0woaW5wdXQtPm5yKSk7CisJaW5wdXQtPnJ1bm5pbmcgPSAwOworCXNwaW5fdW5sb2NrX2lycSgmaW5wdXQtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBkZGJfb3V0cHV0X3N0YXJ0KHN0cnVjdCBkZGJfb3V0cHV0ICpvdXRwdXQpCit7CisJc3RydWN0IGRkYiAqZGV2ID0gb3V0cHV0LT5wb3J0LT5kZXY7CisKKwlzcGluX2xvY2tfaXJxKCZvdXRwdXQtPmxvY2spOworCW91dHB1dC0+Y2J1ZiA9IDA7CisJb3V0cHV0LT5jb2ZmID0gMDsKKwlkZGJ3cml0ZWwoMCwgVFNfT1VUUFVUX0NPTlRST0wob3V0cHV0LT5ucikpOworCWRkYndyaXRlbCgyLCBUU19PVVRQVVRfQ09OVFJPTChvdXRwdXQtPm5yKSk7CisJZGRid3JpdGVsKDAsIFRTX09VVFBVVF9DT05UUk9MKG91dHB1dC0+bnIpKTsKKwlkZGJ3cml0ZWwoMHgzYywgVFNfT1VUUFVUX0NPTlRST0wob3V0cHV0LT5ucikpOworCWRkYndyaXRlbCgoMSA8PCAxNikgfAorCQkgIChvdXRwdXQtPmRtYV9idWZfbnVtIDw8IDExKSB8CisJCSAgKG91dHB1dC0+ZG1hX2J1Zl9zaXplID4+IDcpLAorCQkgIERNQV9CVUZGRVJfU0laRShvdXRwdXQtPm5yICsgOCkpOworCWRkYndyaXRlbCgwLCBETUFfQlVGRkVSX0FDSyhvdXRwdXQtPm5yICsgOCkpOworCisJZGRid3JpdGVsKDEsIERNQV9CQVNFX1JFQUQpOworCWRkYndyaXRlbCgzLCBETUFfQlVGRkVSX0NPTlRST0wob3V0cHV0LT5uciArIDgpKTsKKwkvKiBkZGJ3cml0ZWwoMHhiZCwgVFNfT1VUUFVUX0NPTlRST0wob3V0cHV0LT5ucikpOyAqLworCWRkYndyaXRlbCgweDFkLCBUU19PVVRQVVRfQ09OVFJPTChvdXRwdXQtPm5yKSk7CisJb3V0cHV0LT5ydW5uaW5nID0gMTsKKwlzcGluX3VubG9ja19pcnEoJm91dHB1dC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGRkYl9vdXRwdXRfc3RvcChzdHJ1Y3QgZGRiX291dHB1dCAqb3V0cHV0KQoreworCXN0cnVjdCBkZGIgKmRldiA9IG91dHB1dC0+cG9ydC0+ZGV2OworCisJc3Bpbl9sb2NrX2lycSgmb3V0cHV0LT5sb2NrKTsKKwlkZGJ3cml0ZWwoMCwgVFNfT1VUUFVUX0NPTlRST0wob3V0cHV0LT5ucikpOworCWRkYndyaXRlbCgwLCBETUFfQlVGRkVSX0NPTlRST0wob3V0cHV0LT5uciArIDgpKTsKKwlvdXRwdXQtPnJ1bm5pbmcgPSAwOworCXNwaW5fdW5sb2NrX2lycSgmb3V0cHV0LT5sb2NrKTsKK30KKworc3RhdGljIHUzMiBkZGJfb3V0cHV0X2ZyZWUoc3RydWN0IGRkYl9vdXRwdXQgKm91dHB1dCkKK3sKKwl1MzIgaWR4LCBvZmYsIHN0YXQgPSBvdXRwdXQtPnN0YXQ7CisJczMyIGRpZmY7CisKKwlpZHggPSAoc3RhdCA+PiAxMSkgJiAweDFmOworCW9mZiA9IChzdGF0ICYgMHg3ZmYpIDw8IDc7CisKKwlpZiAob3V0cHV0LT5jYnVmICE9IGlkeCkgeworCQlpZiAoKCgob3V0cHV0LT5jYnVmICsgMSkgJSBvdXRwdXQtPmRtYV9idWZfbnVtKSA9PSBpZHgpICYmCisJCSAgICAob3V0cHV0LT5kbWFfYnVmX3NpemUgLSBvdXRwdXQtPmNvZmYgPD0gMTg4KSkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gMTg4OworCX0KKwlkaWZmID0gb2ZmIC0gb3V0cHV0LT5jb2ZmOworCWlmIChkaWZmIDw9IDAgfHwgZGlmZiA+IDE4OCkKKwkJcmV0dXJuIDE4ODsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgZGRiX291dHB1dF93cml0ZShzdHJ1Y3QgZGRiX291dHB1dCAqb3V0cHV0LAorCQkJCWNvbnN0IHU4ICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGRiICpkZXYgPSBvdXRwdXQtPnBvcnQtPmRldjsKKwl1MzIgaWR4LCBvZmYsIHN0YXQgPSBvdXRwdXQtPnN0YXQ7CisJdTMyIGxlZnQgPSBjb3VudCwgbGVuOworCisJaWR4ID0gKHN0YXQgPj4gMTEpICYgMHgxZjsKKwlvZmYgPSAoc3RhdCAmIDB4N2ZmKSA8PCA3OworCisJd2hpbGUgKGxlZnQpIHsKKwkJbGVuID0gb3V0cHV0LT5kbWFfYnVmX3NpemUgLSBvdXRwdXQtPmNvZmY7CisJCWlmICgoKChvdXRwdXQtPmNidWYgKyAxKSAlIG91dHB1dC0+ZG1hX2J1Zl9udW0pID09IGlkeCkgJiYKKwkJICAgIChvZmYgPT0gMCkpIHsKKwkJCWlmIChsZW4gPD0gMTg4KQorCQkJCWJyZWFrOworCQkJbGVuIC09IDE4ODsKKwkJfQorCQlpZiAob3V0cHV0LT5jYnVmID09IGlkeCkgeworCQkJaWYgKG9mZiA+IG91dHB1dC0+Y29mZikgeworI2lmIDEKKwkJCQlsZW4gPSBvZmYgLSBvdXRwdXQtPmNvZmY7CisJCQkJbGVuIC09IChsZW4gJSAxODgpOworCQkJCWlmIChsZW4gPD0gMTg4KQorCisjZW5kaWYKKwkJCQkJYnJlYWs7CisJCQkJbGVuIC09IDE4ODsKKwkJCX0KKwkJfQorCQlpZiAobGVuID4gbGVmdCkKKwkJCWxlbiA9IGxlZnQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcihvdXRwdXQtPnZidWZbb3V0cHV0LT5jYnVmXSArIG91dHB1dC0+Y29mZiwKKwkJCQkgICBidWYsIGxlbikpCisJCQlyZXR1cm4gLUVJTzsKKwkJbGVmdCAtPSBsZW47CisJCWJ1ZiArPSBsZW47CisJCW91dHB1dC0+Y29mZiArPSBsZW47CisJCWlmIChvdXRwdXQtPmNvZmYgPT0gb3V0cHV0LT5kbWFfYnVmX3NpemUpIHsKKwkJCW91dHB1dC0+Y29mZiA9IDA7CisJCQlvdXRwdXQtPmNidWYgPSAoKG91dHB1dC0+Y2J1ZiArIDEpICUgb3V0cHV0LT5kbWFfYnVmX251bSk7CisJCX0KKwkJZGRid3JpdGVsKChvdXRwdXQtPmNidWYgPDwgMTEpIHwgKG91dHB1dC0+Y29mZiA+PiA3KSwKKwkJCSAgRE1BX0JVRkZFUl9BQ0sob3V0cHV0LT5uciArIDgpKTsKKwl9CisJcmV0dXJuIGNvdW50IC0gbGVmdDsKK30KKworc3RhdGljIHUzMiBkZGJfaW5wdXRfYXZhaWwoc3RydWN0IGRkYl9pbnB1dCAqaW5wdXQpCit7CisJc3RydWN0IGRkYiAqZGV2ID0gaW5wdXQtPnBvcnQtPmRldjsKKwl1MzIgaWR4LCBvZmYsIHN0YXQgPSBpbnB1dC0+c3RhdDsKKwl1MzIgY3RybCA9IGRkYnJlYWRsKERNQV9CVUZGRVJfQ09OVFJPTChpbnB1dC0+bnIpKTsKKworCWlkeCA9IChzdGF0ID4+IDExKSAmIDB4MWY7CisJb2ZmID0gKHN0YXQgJiAweDdmZikgPDwgNzsKKworCWlmIChjdHJsICYgNCkgeworCQlwcmludGsoS0VSTl9FUlIgIklBICVkICVkICUwOHhcbiIsIGlkeCwgb2ZmLCBjdHJsKTsKKwkJZGRid3JpdGVsKGlucHV0LT5zdGF0LCBETUFfQlVGRkVSX0FDSyhpbnB1dC0+bnIpKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChpbnB1dC0+Y2J1ZiAhPSBpZHgpCisJCXJldHVybiAxODg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzaXplX3QgZGRiX2lucHV0X3JlYWQoc3RydWN0IGRkYl9pbnB1dCAqaW5wdXQsIHU4ICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGRiICpkZXYgPSBpbnB1dC0+cG9ydC0+ZGV2OworCXUzMiBsZWZ0ID0gY291bnQ7CisJdTMyIGlkeCwgb2ZmLCBmcmVlLCBzdGF0ID0gaW5wdXQtPnN0YXQ7CisJaW50IHJldDsKKworCWlkeCA9IChzdGF0ID4+IDExKSAmIDB4MWY7CisJb2ZmID0gKHN0YXQgJiAweDdmZikgPDwgNzsKKworCXdoaWxlIChsZWZ0KSB7CisJCWlmIChpbnB1dC0+Y2J1ZiA9PSBpZHgpCisJCQlyZXR1cm4gY291bnQgLSBsZWZ0OworCQlmcmVlID0gaW5wdXQtPmRtYV9idWZfc2l6ZSAtIGlucHV0LT5jb2ZmOworCQlpZiAoZnJlZSA+IGxlZnQpCisJCQlmcmVlID0gbGVmdDsKKwkJcmV0ID0gY29weV90b191c2VyKGJ1ZiwgaW5wdXQtPnZidWZbaW5wdXQtPmNidWZdICsKKwkJCQkgICBpbnB1dC0+Y29mZiwgZnJlZSk7CisJCWlucHV0LT5jb2ZmICs9IGZyZWU7CisJCWlmIChpbnB1dC0+Y29mZiA9PSBpbnB1dC0+ZG1hX2J1Zl9zaXplKSB7CisJCQlpbnB1dC0+Y29mZiA9IDA7CisJCQlpbnB1dC0+Y2J1ZiA9IChpbnB1dC0+Y2J1ZisxKSAlIGlucHV0LT5kbWFfYnVmX251bTsKKwkJfQorCQlsZWZ0IC09IGZyZWU7CisJCWRkYndyaXRlbCgoaW5wdXQtPmNidWYgPDwgMTEpIHwgKGlucHV0LT5jb2ZmID4+IDcpLAorCQkJICBETUFfQlVGRkVSX0FDSyhpbnB1dC0+bnIpKTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAwCitzdGF0aWMgc3RydWN0IGRkYl9pbnB1dCAqZmUyaW5wdXQoc3RydWN0IGRkYiAqZGV2LCBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPmluZm8tPnBvcnRfbnVtICogMjsgaSsrKSB7CisJCWlmIChkZXYtPmlucHV0W2ldLmZlID09IGZlKQorCQkJcmV0dXJuICZkZXYtPmlucHV0W2ldOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGRyeGtfZ2F0ZV9jdHJsKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBkZGJfaW5wdXQgKmlucHV0ID0gZmUtPnNlY19wcml2OworCXN0cnVjdCBkZGJfcG9ydCAqcG9ydCA9IGlucHV0LT5wb3J0OworCWludCBzdGF0dXM7CisKKwlpZiAoZW5hYmxlKSB7CisJCW11dGV4X2xvY2soJnBvcnQtPmkyY19nYXRlX2xvY2spOworCQlzdGF0dXMgPSBpbnB1dC0+Z2F0ZV9jdHJsKGZlLCAxKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSBpbnB1dC0+Z2F0ZV9jdHJsKGZlLCAwKTsKKwkJbXV0ZXhfdW5sb2NrKCZwb3J0LT5pMmNfZ2F0ZV9sb2NrKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkZW1vZF9hdHRhY2hfZHJ4ayhzdHJ1Y3QgZGRiX2lucHV0ICppbnB1dCkKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYyA9ICZpbnB1dC0+cG9ydC0+aTJjLT5hZGFwOworCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlOworCXN0cnVjdCBkcnhrX2NvbmZpZyBjb25maWc7CisKKwltZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZykpOworCWNvbmZpZy5hZHIgPSAweDI5ICsgKGlucHV0LT5uciAmIDEpOworCisJZmUgPSBpbnB1dC0+ZmUgPSBkdmJfYXR0YWNoKGRyeGtfYXR0YWNoLCAmY29uZmlnLCBpMmMsICZpbnB1dC0+ZmUyKTsKKwlpZiAoIWlucHV0LT5mZSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5vIERSWEsgZm91bmQhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWZlLT5zZWNfcHJpdiA9IGlucHV0OworCWlucHV0LT5nYXRlX2N0cmwgPSBmZS0+b3BzLmkyY19nYXRlX2N0cmw7CisJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsID0gZHJ4a19nYXRlX2N0cmw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHVuZXJfYXR0YWNoX3RkYTE4MjcxKHN0cnVjdCBkZGJfaW5wdXQgKmlucHV0KQoreworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjID0gJmlucHV0LT5wb3J0LT5pMmMtPmFkYXA7CisJc3RydWN0IGR2Yl9mcm9udGVuZCAqZmU7CisKKwlpZiAoaW5wdXQtPmZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJaW5wdXQtPmZlLT5vcHMuaTJjX2dhdGVfY3RybChpbnB1dC0+ZmUsIDEpOworCWZlID0gZHZiX2F0dGFjaCh0ZGExODI3MWMyZGRfYXR0YWNoLCBpbnB1dC0+ZmUsIGkyYywgMHg2MCk7CisJaWYgKCFmZSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5vIFREQTE4MjcxIGZvdW5kIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoaW5wdXQtPmZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJaW5wdXQtPmZlLT5vcHMuaTJjX2dhdGVfY3RybChpbnB1dC0+ZmUsIDApOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3Qgc3R2MDkweF9jb25maWcgc3R2MDkwMCA9IHsKKwkuZGV2aWNlICAgICAgICAgPSBTVFYwOTAwLAorCS5kZW1vZF9tb2RlICAgICA9IFNUVjA5MHhfRFVBTCwKKwkuY2xrX21vZGUgICAgICAgPSBTVFYwOTB4X0NMS19FWFQsCisKKwkueHRhbCAgICAgICAgICAgPSAyNzAwMDAwMCwKKwkuYWRkcmVzcyAgICAgICAgPSAweDY5LAorCisJLnRzMV9tb2RlICAgICAgID0gU1RWMDkweF9UU01PREVfU0VSSUFMX1BVTkNUVVJFRCwKKwkudHMyX21vZGUgICAgICAgPSBTVFYwOTB4X1RTTU9ERV9TRVJJQUxfUFVOQ1RVUkVELAorCisJLnJlcGVhdGVyX2xldmVsID0gU1RWMDkweF9SUFRMRVZFTF8xNiwKKworCS5hZGMxX3JhbmdlCT0gU1RWMDkweF9BRENfMVZwcCwKKwkuYWRjMl9yYW5nZQk9IFNUVjA5MHhfQURDXzFWcHAsCisKKwkuZGlzZXFjX2VudmVsb3BlX21vZGUgPSB0cnVlLAorfTsKKworc3RhdGljIHN0cnVjdCBzdHYwOTB4X2NvbmZpZyBzdHYwOTAwX2FhID0geworCS5kZXZpY2UgICAgICAgICA9IFNUVjA5MDAsCisJLmRlbW9kX21vZGUgICAgID0gU1RWMDkweF9EVUFMLAorCS5jbGtfbW9kZSAgICAgICA9IFNUVjA5MHhfQ0xLX0VYVCwKKworCS54dGFsICAgICAgICAgICA9IDI3MDAwMDAwLAorCS5hZGRyZXNzICAgICAgICA9IDB4NjgsCisKKwkudHMxX21vZGUgICAgICAgPSBTVFYwOTB4X1RTTU9ERV9TRVJJQUxfUFVOQ1RVUkVELAorCS50czJfbW9kZSAgICAgICA9IFNUVjA5MHhfVFNNT0RFX1NFUklBTF9QVU5DVFVSRUQsCisKKwkucmVwZWF0ZXJfbGV2ZWwgPSBTVFYwOTB4X1JQVExFVkVMXzE2LAorCisJLmFkYzFfcmFuZ2UJPSBTVFYwOTB4X0FEQ18xVnBwLAorCS5hZGMyX3JhbmdlCT0gU1RWMDkweF9BRENfMVZwcCwKKworCS5kaXNlcWNfZW52ZWxvcGVfbW9kZSA9IHRydWUsCit9OworCitzdGF0aWMgc3RydWN0IHN0djYxMTB4X2NvbmZpZyBzdHY2MTEwYSA9IHsKKwkuYWRkciAgICA9IDB4NjAsCisJLnJlZmNsawkgPSAyNzAwMDAwMCwKKwkuY2xrX2RpdiA9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHN0djYxMTB4X2NvbmZpZyBzdHY2MTEwYiA9IHsKKwkuYWRkciAgICA9IDB4NjMsCisJLnJlZmNsawkgPSAyNzAwMDAwMCwKKwkuY2xrX2RpdiA9IDEsCit9OworCitzdGF0aWMgaW50IGRlbW9kX2F0dGFjaF9zdHYwOTAwKHN0cnVjdCBkZGJfaW5wdXQgKmlucHV0LCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYyA9ICZpbnB1dC0+cG9ydC0+aTJjLT5hZGFwOworCXN0cnVjdCBzdHYwOTB4X2NvbmZpZyAqZmVjb25mID0gdHlwZSA/ICZzdHYwOTAwX2FhIDogJnN0djA5MDA7CisKKwlpbnB1dC0+ZmUgPSBkdmJfYXR0YWNoKHN0djA5MHhfYXR0YWNoLCBmZWNvbmYsIGkyYywKKwkJCSAgICAgICAoaW5wdXQtPm5yICYgMSkgPyBTVFYwOTB4X0RFTU9EVUxBVE9SXzEKKwkJCSAgICAgICA6IFNUVjA5MHhfREVNT0RVTEFUT1JfMCk7CisJaWYgKCFpbnB1dC0+ZmUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJObyBTVFYwOTAwIGZvdW5kIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoIWR2Yl9hdHRhY2gobG5iaDI0X2F0dGFjaCwgaW5wdXQtPmZlLCBpMmMsIDAsCisJCQkwLCAoaW5wdXQtPm5yICYgMSkgPworCQkJKDB4MDkgLSB0eXBlKSA6ICgweDBiIC0gdHlwZSkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTm8gTE5CSDI0IGZvdW5kIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dW5lcl9hdHRhY2hfc3R2NjExMChzdHJ1Y3QgZGRiX2lucHV0ICppbnB1dCwgaW50IHR5cGUpCit7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmMgPSAmaW5wdXQtPnBvcnQtPmkyYy0+YWRhcDsKKwlzdHJ1Y3Qgc3R2MDkweF9jb25maWcgKmZlY29uZiA9IHR5cGUgPyAmc3R2MDkwMF9hYSA6ICZzdHYwOTAwOworCXN0cnVjdCBzdHY2MTEweF9jb25maWcgKnR1bmVyY29uZiA9IChpbnB1dC0+bnIgJiAxKSA/CisJCSZzdHY2MTEwYiA6ICZzdHY2MTEwYTsKKwlzdHJ1Y3Qgc3R2NjExMHhfZGV2Y3RsICpjdGw7CisKKwljdGwgPSBkdmJfYXR0YWNoKHN0djYxMTB4X2F0dGFjaCwgaW5wdXQtPmZlLCB0dW5lcmNvbmYsIGkyYyk7CisJaWYgKCFjdGwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJObyBTVFY2MTEwWCBmb3VuZCFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiYXR0YWNoIHR1bmVyIGlucHV0ICVkIGFkciAlMDJ4XG4iLAorCQkJIGlucHV0LT5uciwgdHVuZXJjb25mLT5hZGRyKTsKKworCWZlY29uZi0+dHVuZXJfaW5pdCAgICAgICAgICA9IGN0bC0+dHVuZXJfaW5pdDsKKwlmZWNvbmYtPnR1bmVyX3NsZWVwICAgICAgICAgPSBjdGwtPnR1bmVyX3NsZWVwOworCWZlY29uZi0+dHVuZXJfc2V0X21vZGUgICAgICA9IGN0bC0+dHVuZXJfc2V0X21vZGU7CisJZmVjb25mLT50dW5lcl9zZXRfZnJlcXVlbmN5ID0gY3RsLT50dW5lcl9zZXRfZnJlcXVlbmN5OworCWZlY29uZi0+dHVuZXJfZ2V0X2ZyZXF1ZW5jeSA9IGN0bC0+dHVuZXJfZ2V0X2ZyZXF1ZW5jeTsKKwlmZWNvbmYtPnR1bmVyX3NldF9iYW5kd2lkdGggPSBjdGwtPnR1bmVyX3NldF9iYW5kd2lkdGg7CisJZmVjb25mLT50dW5lcl9nZXRfYmFuZHdpZHRoID0gY3RsLT50dW5lcl9nZXRfYmFuZHdpZHRoOworCWZlY29uZi0+dHVuZXJfc2V0X2JiZ2FpbiAgICA9IGN0bC0+dHVuZXJfc2V0X2JiZ2FpbjsKKwlmZWNvbmYtPnR1bmVyX2dldF9iYmdhaW4gICAgPSBjdGwtPnR1bmVyX2dldF9iYmdhaW47CisJZmVjb25mLT50dW5lcl9zZXRfcmVmY2xrICAgID0gY3RsLT50dW5lcl9zZXRfcmVmY2xrOworCWZlY29uZi0+dHVuZXJfZ2V0X3N0YXR1cyAgICA9IGN0bC0+dHVuZXJfZ2V0X3N0YXR1czsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG15X2R2Yl9kbXhfdHNfY2FyZF9pbml0KHN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4LCBjaGFyICppZCwKKwkJCSAgICBpbnQgKCpzdGFydF9mZWVkKShzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKiksCisJCQkgICAgaW50ICgqc3RvcF9mZWVkKShzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKiksCisJCQkgICAgdm9pZCAqcHJpdikKK3sKKwlkdmJkZW11eC0+cHJpdiA9IHByaXY7CisKKwlkdmJkZW11eC0+ZmlsdGVybnVtID0gMjU2OworCWR2YmRlbXV4LT5mZWVkbnVtID0gMjU2OworCWR2YmRlbXV4LT5zdGFydF9mZWVkID0gc3RhcnRfZmVlZDsKKwlkdmJkZW11eC0+c3RvcF9mZWVkID0gc3RvcF9mZWVkOworCWR2YmRlbXV4LT53cml0ZV90b19kZWNvZGVyID0gTlVMTDsKKwlkdmJkZW11eC0+ZG14LmNhcGFiaWxpdGllcyA9IChETVhfVFNfRklMVEVSSU5HIHwKKwkJCQkgICAgICBETVhfU0VDVElPTl9GSUxURVJJTkcgfAorCQkJCSAgICAgIERNWF9NRU1PUllfQkFTRURfRklMVEVSSU5HKTsKKwlyZXR1cm4gZHZiX2RteF9pbml0KGR2YmRlbXV4KTsKK30KKworc3RhdGljIGludCBteV9kdmJfZG14ZGV2X3RzX2NhcmRfaW5pdChzdHJ1Y3QgZG14ZGV2ICpkbXhkZXYsCisJCQkgICAgICAgc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXgsCisJCQkgICAgICAgc3RydWN0IGRteF9mcm9udGVuZCAqaHdfZnJvbnRlbmQsCisJCQkgICAgICAgc3RydWN0IGRteF9mcm9udGVuZCAqbWVtX2Zyb250ZW5kLAorCQkJICAgICAgIHN0cnVjdCBkdmJfYWRhcHRlciAqZHZiX2FkYXB0ZXIpCit7CisJaW50IHJldDsKKworCWRteGRldi0+ZmlsdGVybnVtID0gMjU2OworCWRteGRldi0+ZGVtdXggPSAmZHZiZGVtdXgtPmRteDsKKwlkbXhkZXYtPmNhcGFiaWxpdGllcyA9IDA7CisJcmV0ID0gZHZiX2RteGRldl9pbml0KGRteGRldiwgZHZiX2FkYXB0ZXIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaHdfZnJvbnRlbmQtPnNvdXJjZSA9IERNWF9GUk9OVEVORF8wOworCWR2YmRlbXV4LT5kbXguYWRkX2Zyb250ZW5kKCZkdmJkZW11eC0+ZG14LCBod19mcm9udGVuZCk7CisJbWVtX2Zyb250ZW5kLT5zb3VyY2UgPSBETVhfTUVNT1JZX0ZFOworCWR2YmRlbXV4LT5kbXguYWRkX2Zyb250ZW5kKCZkdmJkZW11eC0+ZG14LCBtZW1fZnJvbnRlbmQpOworCXJldHVybiBkdmJkZW11eC0+ZG14LmNvbm5lY3RfZnJvbnRlbmQoJmR2YmRlbXV4LT5kbXgsIGh3X2Zyb250ZW5kKTsKK30KKworc3RhdGljIGludCBzdGFydF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKK3sKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkbXggPSBkdmJkbXhmZWVkLT5kZW11eDsKKwlzdHJ1Y3QgZGRiX2lucHV0ICppbnB1dCA9IGR2YmRteC0+cHJpdjsKKworCWlmICghaW5wdXQtPnVzZXJzKQorCQlkZGJfaW5wdXRfc3RhcnQoaW5wdXQpOworCisJcmV0dXJuICsraW5wdXQtPnVzZXJzOworfQorCitzdGF0aWMgaW50IHN0b3BfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQpCit7CisJc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14ID0gZHZiZG14ZmVlZC0+ZGVtdXg7CisJc3RydWN0IGRkYl9pbnB1dCAqaW5wdXQgPSBkdmJkbXgtPnByaXY7CisKKwlpZiAoLS1pbnB1dC0+dXNlcnMpCisJCXJldHVybiBpbnB1dC0+dXNlcnM7CisKKwlkZGJfaW5wdXRfc3RvcChpbnB1dCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgZHZiX2lucHV0X2RldGFjaChzdHJ1Y3QgZGRiX2lucHV0ICppbnB1dCkKK3sKKwlzdHJ1Y3QgZHZiX2FkYXB0ZXIgKmFkYXAgPSAmaW5wdXQtPmFkYXA7CisJc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXggPSAmaW5wdXQtPmRlbXV4OworCisJc3dpdGNoIChpbnB1dC0+YXR0YWNoZWQpIHsKKwljYXNlIDU6CisJCWlmIChpbnB1dC0+ZmUyKQorCQkJZHZiX3VucmVnaXN0ZXJfZnJvbnRlbmQoaW5wdXQtPmZlMik7CisJCWlmIChpbnB1dC0+ZmUpIHsKKwkJCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGlucHV0LT5mZSk7CisJCQlkdmJfZnJvbnRlbmRfZGV0YWNoKGlucHV0LT5mZSk7CisJCQlpbnB1dC0+ZmUgPSBOVUxMOworCQl9CisJY2FzZSA0OgorCQlkdmJfbmV0X3JlbGVhc2UoJmlucHV0LT5kdmJuZXQpOworCisJY2FzZSAzOgorCQlkdmJkZW11eC0+ZG14LmNsb3NlKCZkdmJkZW11eC0+ZG14KTsKKwkJZHZiZGVtdXgtPmRteC5yZW1vdmVfZnJvbnRlbmQoJmR2YmRlbXV4LT5kbXgsCisJCQkJCSAgICAgICZpbnB1dC0+aHdfZnJvbnRlbmQpOworCQlkdmJkZW11eC0+ZG14LnJlbW92ZV9mcm9udGVuZCgmZHZiZGVtdXgtPmRteCwKKwkJCQkJICAgICAgJmlucHV0LT5tZW1fZnJvbnRlbmQpOworCQlkdmJfZG14ZGV2X3JlbGVhc2UoJmlucHV0LT5kbXhkZXYpOworCisJY2FzZSAyOgorCQlkdmJfZG14X3JlbGVhc2UoJmlucHV0LT5kZW11eCk7CisKKwljYXNlIDE6CisJCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoYWRhcCk7CisJfQorCWlucHV0LT5hdHRhY2hlZCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgZHZiX2lucHV0X2F0dGFjaChzdHJ1Y3QgZGRiX2lucHV0ICppbnB1dCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkZGJfcG9ydCAqcG9ydCA9IGlucHV0LT5wb3J0OworCXN0cnVjdCBkdmJfYWRhcHRlciAqYWRhcCA9ICZpbnB1dC0+YWRhcDsKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCA9ICZpbnB1dC0+ZGVtdXg7CisKKwlyZXQgPSBkdmJfcmVnaXN0ZXJfYWRhcHRlcihhZGFwLCAiRERCcmlkZ2UiLCBUSElTX01PRFVMRSwKKwkJCQkgICAmaW5wdXQtPnBvcnQtPmRldi0+cGRldi0+ZGV2LAorCQkJCSAgIGFkYXB0ZXJfbnIpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZGRicmlkZ2U6IENvdWxkIG5vdCByZWdpc3RlciBhZGFwdGVyLiIKKwkJICAgICAgICJDaGVjayBpZiB5b3UgZW5hYmxlZCBlbm91Z2ggYWRhcHRlcnMgaW4gZHZiLWNvcmUhXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaW5wdXQtPmF0dGFjaGVkID0gMTsKKworCXJldCA9IG15X2R2Yl9kbXhfdHNfY2FyZF9pbml0KGR2YmRlbXV4LCAiU1cgZGVtdXgiLAorCQkJCSAgICAgIHN0YXJ0X2ZlZWQsCisJCQkJICAgICAgc3RvcF9mZWVkLCBpbnB1dCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaW5wdXQtPmF0dGFjaGVkID0gMjsKKworCXJldCA9IG15X2R2Yl9kbXhkZXZfdHNfY2FyZF9pbml0KCZpbnB1dC0+ZG14ZGV2LCAmaW5wdXQtPmRlbXV4LAorCQkJCQkgJmlucHV0LT5od19mcm9udGVuZCwKKwkJCQkJICZpbnB1dC0+bWVtX2Zyb250ZW5kLCBhZGFwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpbnB1dC0+YXR0YWNoZWQgPSAzOworCisJcmV0ID0gZHZiX25ldF9pbml0KGFkYXAsICZpbnB1dC0+ZHZibmV0LCBpbnB1dC0+ZG14ZGV2LmRlbXV4KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpbnB1dC0+YXR0YWNoZWQgPSA0OworCisJaW5wdXQtPmZlID0gMDsKKwlzd2l0Y2ggKHBvcnQtPnR5cGUpIHsKKwljYXNlIEREQl9UVU5FUl9EVkJTX1NUOgorCQlpZiAoZGVtb2RfYXR0YWNoX3N0djA5MDAoaW5wdXQsIDApIDwgMCkKKwkJCXJldHVybiAtRU5PREVWOworCQlpZiAodHVuZXJfYXR0YWNoX3N0djYxMTAoaW5wdXQsIDApIDwgMCkKKwkJCXJldHVybiAtRU5PREVWOworCQlpZiAoaW5wdXQtPmZlKSB7CisJCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKGFkYXAsIGlucHV0LT5mZSkgPCAwKQorCQkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWJyZWFrOworCWNhc2UgRERCX1RVTkVSX0RWQlNfU1RfQUE6CisJCWlmIChkZW1vZF9hdHRhY2hfc3R2MDkwMChpbnB1dCwgMSkgPCAwKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWlmICh0dW5lcl9hdHRhY2hfc3R2NjExMChpbnB1dCwgMSkgPCAwKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWlmIChpbnB1dC0+ZmUpIHsKKwkJCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoYWRhcCwgaW5wdXQtPmZlKSA8IDApCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBEREJfVFVORVJfRFZCQ1RfVFI6CisJCWlmIChkZW1vZF9hdHRhY2hfZHJ4ayhpbnB1dCkgPCAwKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWlmICh0dW5lcl9hdHRhY2hfdGRhMTgyNzEoaW5wdXQpIDwgMCkKKwkJCXJldHVybiAtRU5PREVWOworCQlpZiAoaW5wdXQtPmZlKSB7CisJCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKGFkYXAsIGlucHV0LT5mZSkgPCAwKQorCQkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWlmIChpbnB1dC0+ZmUyKSB7CisJCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKGFkYXAsIGlucHV0LT5mZTIpIDwgMCkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCWlucHV0LT5mZTItPnR1bmVyX3ByaXYgPSBpbnB1dC0+ZmUtPnR1bmVyX3ByaXY7CisJCQltZW1jcHkoJmlucHV0LT5mZTItPm9wcy50dW5lcl9vcHMsCisJCQkgICAgICAgJmlucHV0LT5mZS0+b3BzLnR1bmVyX29wcywKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGR2Yl90dW5lcl9vcHMpKTsKKwkJfQorCQlicmVhazsKKwl9CisJaW5wdXQtPmF0dGFjaGVkID0gNTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHNzaXplX3QgdHNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRkYl9vdXRwdXQgKm91dHB1dCA9IGR2YmRldi0+cHJpdjsKKwlzaXplX3QgbGVmdCA9IGNvdW50OworCWludCBzdGF0OworCisJd2hpbGUgKGxlZnQpIHsKKwkJaWYgKGRkYl9vdXRwdXRfZnJlZShvdXRwdXQpIDwgMTg4KSB7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQkJYnJlYWs7CisJCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAorCQkJCSAgICBvdXRwdXQtPndxLCBkZGJfb3V0cHV0X2ZyZWUob3V0cHV0KSA+PSAxODgpIDwgMCkKKwkJCQlicmVhazsKKwkJfQorCQlzdGF0ID0gZGRiX291dHB1dF93cml0ZShvdXRwdXQsIGJ1ZiwgbGVmdCk7CisJCWlmIChzdGF0IDwgMCkKKwkJCWJyZWFrOworCQlidWYgKz0gc3RhdDsKKwkJbGVmdCAtPSBzdGF0OworCX0KKwlyZXR1cm4gKGxlZnQgPT0gY291bnQpID8gLUVBR0FJTiA6IChjb3VudCAtIGxlZnQpOworfQorCitzdGF0aWMgc3NpemVfdCB0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsCisJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZGJfb3V0cHV0ICpvdXRwdXQgPSBkdmJkZXYtPnByaXY7CisJc3RydWN0IGRkYl9pbnB1dCAqaW5wdXQgPSBvdXRwdXQtPnBvcnQtPmlucHV0WzBdOworCWludCBsZWZ0LCByZWFkOworCisJY291bnQgLT0gY291bnQgJSAxODg7CisJbGVmdCA9IGNvdW50OworCXdoaWxlIChsZWZ0KSB7CisJCWlmIChkZGJfaW5wdXRfYXZhaWwoaW5wdXQpIDwgMTg4KSB7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQkJYnJlYWs7CisJCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAorCQkJCSAgICBpbnB1dC0+d3EsIGRkYl9pbnB1dF9hdmFpbChpbnB1dCkgPj0gMTg4KSA8IDApCisJCQkJYnJlYWs7CisJCX0KKwkJcmVhZCA9IGRkYl9pbnB1dF9yZWFkKGlucHV0LCBidWYsIGxlZnQpOworCQlsZWZ0IC09IHJlYWQ7CisJCWJ1ZiArPSByZWFkOworCX0KKwlyZXR1cm4gKGxlZnQgPT0gY291bnQpID8gLUVBR0FJTiA6IChjb3VudCAtIGxlZnQpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHRzX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJLyoKKwlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZGJfb3V0cHV0ICpvdXRwdXQgPSBkdmJkZXYtPnByaXY7CisJc3RydWN0IGRkYl9pbnB1dCAqaW5wdXQgPSBvdXRwdXQtPnBvcnQtPmlucHV0WzBdOworCSovCisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisjaWYgMAorCWlmIChkYXRhX2F2YWlsX3RvX3JlYWQpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwlpZiAoZGF0YV9hdmFpbF90b193cml0ZSkKKwkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKworCXBvbGxfd2FpdChmaWxlLCAmcmVhZF9xdWV1ZSwgd2FpdCk7CisJcG9sbF93YWl0KGZpbGUsICZ3cml0ZV9xdWV1ZSwgd2FpdCk7CisjZW5kaWYKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2lfZm9wcyA9IHsKKwkub3duZXIgICA9IFRISVNfTU9EVUxFLAorCS5yZWFkICAgID0gdHNfcmVhZCwKKwkud3JpdGUgICA9IHRzX3dyaXRlLAorCS5vcGVuICAgID0gZHZiX2dlbmVyaWNfb3BlbiwKKwkucmVsZWFzZSA9IGR2Yl9nZW5lcmljX3JlbGVhc2UsCisJLnBvbGwgICAgPSB0c19wb2xsLAorCS5tbWFwICAgID0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2RldmljZSBkdmJkZXZfY2kgPSB7CisJLnByaXYgICAgPSAwLAorCS5yZWFkZXJzID0gLTEsCisJLndyaXRlcnMgPSAtMSwKKwkudXNlcnMgICA9IC0xLAorCS5mb3BzICAgID0gJmNpX2ZvcHMsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGlucHV0X3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBkZGJfaW5wdXQgKmlucHV0ID0gKHN0cnVjdCBkZGJfaW5wdXQgKikgZGF0YTsKKwlzdHJ1Y3QgZGRiICpkZXYgPSBpbnB1dC0+cG9ydC0+ZGV2OworCisJc3Bpbl9sb2NrKCZpbnB1dC0+bG9jayk7CisJaWYgKCFpbnB1dC0+cnVubmluZykgeworCQlzcGluX3VubG9jaygmaW5wdXQtPmxvY2spOworCQlyZXR1cm47CisJfQorCWlucHV0LT5zdGF0ID0gZGRicmVhZGwoRE1BX0JVRkZFUl9DVVJSRU5UKGlucHV0LT5ucikpOworCisJaWYgKGlucHV0LT5wb3J0LT5jbGFzcyA9PSBEREJfUE9SVF9UVU5FUikgeworCQlpZiAoNCZkZGJyZWFkbChETUFfQlVGRkVSX0NPTlRST0woaW5wdXQtPm5yKSkpCisJCQlwcmludGsoS0VSTl9FUlIgIk92ZXJmbG93IGlucHV0ICVkXG4iLCBpbnB1dC0+bnIpOworCQl3aGlsZSAoaW5wdXQtPmNidWYgIT0gKChpbnB1dC0+c3RhdCA+PiAxMSkgJiAweDFmKQorCQkgICAgICAgfHwgKDQmZGRicmVhZGwoRE1BX0JVRkZFUl9DT05UUk9MKGlucHV0LT5ucikpKSkgeworCQkJZHZiX2RteF9zd2ZpbHRlcl9wYWNrZXRzKCZpbnB1dC0+ZGVtdXgsCisJCQkJCQkgaW5wdXQtPnZidWZbaW5wdXQtPmNidWZdLAorCQkJCQkJIGlucHV0LT5kbWFfYnVmX3NpemUgLyAxODgpOworCisJCQlpbnB1dC0+Y2J1ZiA9IChpbnB1dC0+Y2J1ZiArIDEpICUgaW5wdXQtPmRtYV9idWZfbnVtOworCQkJZGRid3JpdGVsKChpbnB1dC0+Y2J1ZiA8PCAxMSksCisJCQkJICBETUFfQlVGRkVSX0FDSyhpbnB1dC0+bnIpKTsKKwkJCWlucHV0LT5zdGF0ID0gZGRicmVhZGwoRE1BX0JVRkZFUl9DVVJSRU5UKGlucHV0LT5ucikpOworCQkgICAgICAgfQorCX0KKwlpZiAoaW5wdXQtPnBvcnQtPmNsYXNzID09IEREQl9QT1JUX0NJKQorCQl3YWtlX3VwKCZpbnB1dC0+d3EpOworCXNwaW5fdW5sb2NrKCZpbnB1dC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIG91dHB1dF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZGRiX291dHB1dCAqb3V0cHV0ID0gKHN0cnVjdCBkZGJfb3V0cHV0ICopIGRhdGE7CisJc3RydWN0IGRkYiAqZGV2ID0gb3V0cHV0LT5wb3J0LT5kZXY7CisKKwlzcGluX2xvY2soJm91dHB1dC0+bG9jayk7CisJaWYgKCFvdXRwdXQtPnJ1bm5pbmcpIHsKKwkJc3Bpbl91bmxvY2soJm91dHB1dC0+bG9jayk7CisJCXJldHVybjsKKwl9CisJb3V0cHV0LT5zdGF0ID0gZGRicmVhZGwoRE1BX0JVRkZFUl9DVVJSRU5UKG91dHB1dC0+bnIgKyA4KSk7CisJd2FrZV91cCgmb3V0cHV0LT53cSk7CisJc3Bpbl91bmxvY2soJm91dHB1dC0+bG9jayk7Cit9CisKKworc3RydWN0IGN4ZDIwOTlfY2ZnIGN4ZF9jZmcgPSB7CisJLmJpdHJhdGUgPSAgNjIwMDAsCisJLmFkciAgICAgPSAgMHg0MCwKKwkucG9sYXJpdHkgPSAxLAorCS5jbG9ja19tb2RlID0gMSwKK307CisKK3N0YXRpYyBpbnQgZGRiX2NpX2F0dGFjaChzdHJ1Y3QgZGRiX3BvcnQgKnBvcnQpCit7CisJaW50IHJldDsKKworCXJldCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZwb3J0LT5vdXRwdXQtPmFkYXAsCisJCQkJICAgIkREQnJpZGdlIiwKKwkJCQkgICBUSElTX01PRFVMRSwKKwkJCQkgICAmcG9ydC0+ZGV2LT5wZGV2LT5kZXYsCisJCQkJICAgYWRhcHRlcl9ucik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcG9ydC0+ZW4gPSBjeGQyMDk5X2F0dGFjaCgmY3hkX2NmZywgcG9ydCwgJnBvcnQtPmkyYy0+YWRhcCk7CisJaWYgKCFwb3J0LT5lbikgeworCQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZwb3J0LT5vdXRwdXQtPmFkYXApOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZGRiX2lucHV0X3N0YXJ0KHBvcnQtPmlucHV0WzBdKTsKKwlkZGJfb3V0cHV0X3N0YXJ0KHBvcnQtPm91dHB1dCk7CisJZHZiX2NhX2VuNTAyMjFfaW5pdCgmcG9ydC0+b3V0cHV0LT5hZGFwLAorCQkJICAgIHBvcnQtPmVuLCAwLCAxKTsKKwlyZXQgPSBkdmJfcmVnaXN0ZXJfZGV2aWNlKCZwb3J0LT5vdXRwdXQtPmFkYXAsICZwb3J0LT5vdXRwdXQtPmRldiwKKwkJCQkgICZkdmJkZXZfY2ksICh2b2lkICopIHBvcnQtPm91dHB1dCwKKwkJCQkgIERWQl9ERVZJQ0VfU0VDKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRkYl9wb3J0X2F0dGFjaChzdHJ1Y3QgZGRiX3BvcnQgKnBvcnQpCit7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKHBvcnQtPmNsYXNzKSB7CisJY2FzZSBEREJfUE9SVF9UVU5FUjoKKwkJcmV0ID0gZHZiX2lucHV0X2F0dGFjaChwb3J0LT5pbnB1dFswXSk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisJCXJldCA9IGR2Yl9pbnB1dF9hdHRhY2gocG9ydC0+aW5wdXRbMV0pOworCQlicmVhazsKKwljYXNlIEREQl9QT1JUX0NJOgorCQlyZXQgPSBkZGJfY2lfYXR0YWNoKHBvcnQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJaWYgKHJldCA8IDApCisJCXByaW50ayhLRVJOX0VSUiAicG9ydF9hdHRhY2ggb24gcG9ydCAlZCBmYWlsZWRcbiIsIHBvcnQtPm5yKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRkYl9wb3J0c19hdHRhY2goc3RydWN0IGRkYiAqZGV2KQoreworCWludCBpLCByZXQgPSAwOworCXN0cnVjdCBkZGJfcG9ydCAqcG9ydDsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPmluZm8tPnBvcnRfbnVtOyBpKyspIHsKKwkJcG9ydCA9ICZkZXYtPnBvcnRbaV07CisJCXJldCA9IGRkYl9wb3J0X2F0dGFjaChwb3J0KTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZGRiX3BvcnRzX2RldGFjaChzdHJ1Y3QgZGRiICpkZXYpCit7CisJaW50IGk7CisJc3RydWN0IGRkYl9wb3J0ICpwb3J0OworCisJZm9yIChpID0gMDsgaSA8IGRldi0+aW5mby0+cG9ydF9udW07IGkrKykgeworCQlwb3J0ID0gJmRldi0+cG9ydFtpXTsKKwkJc3dpdGNoIChwb3J0LT5jbGFzcykgeworCQljYXNlIEREQl9QT1JUX1RVTkVSOgorCQkJZHZiX2lucHV0X2RldGFjaChwb3J0LT5pbnB1dFswXSk7CisJCQlkdmJfaW5wdXRfZGV0YWNoKHBvcnQtPmlucHV0WzFdKTsKKwkJCWJyZWFrOworCQljYXNlIEREQl9QT1JUX0NJOgorCQkJaWYgKHBvcnQtPm91dHB1dC0+ZGV2KQorCQkJCWR2Yl91bnJlZ2lzdGVyX2RldmljZShwb3J0LT5vdXRwdXQtPmRldik7CisJCQlpZiAocG9ydC0+ZW4pIHsKKwkJCQlkZGJfaW5wdXRfc3RvcChwb3J0LT5pbnB1dFswXSk7CisJCQkJZGRiX291dHB1dF9zdG9wKHBvcnQtPm91dHB1dCk7CisJCQkJZHZiX2NhX2VuNTAyMjFfcmVsZWFzZShwb3J0LT5lbik7CisJCQkJa2ZyZWUocG9ydC0+ZW4pOworCQkJCXBvcnQtPmVuID0gMDsKKwkJCQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZwb3J0LT5vdXRwdXQtPmFkYXApOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgcG9ydF9oYXNfY2koc3RydWN0IGRkYl9wb3J0ICpwb3J0KQoreworCXU4IHZhbDsKKwlyZXR1cm4gaTJjX3JlYWRfcmVnKCZwb3J0LT5pMmMtPmFkYXAsIDB4NDAsIDAsICZ2YWwpID8gMCA6IDE7Cit9CisKK3N0YXRpYyBpbnQgcG9ydF9oYXNfc3R2MDkwMChzdHJ1Y3QgZGRiX3BvcnQgKnBvcnQpCit7CisJdTggdmFsOworCWlmIChpMmNfcmVhZF9yZWcxNigmcG9ydC0+aTJjLT5hZGFwLCAweDY5LCAweGYxMDAsICZ2YWwpIDwgMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcG9ydF9oYXNfc3R2MDkwMF9hYShzdHJ1Y3QgZGRiX3BvcnQgKnBvcnQpCit7CisJdTggdmFsOworCWlmIChpMmNfcmVhZF9yZWcxNigmcG9ydC0+aTJjLT5hZGFwLCAweDY4LCAweGYxMDAsICZ2YWwpIDwgMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcG9ydF9oYXNfZHJ4a3Moc3RydWN0IGRkYl9wb3J0ICpwb3J0KQoreworCXU4IHZhbDsKKwlpZiAoaTJjX3JlYWQoJnBvcnQtPmkyYy0+YWRhcCwgMHgyOSwgJnZhbCkgPCAwKQorCQlyZXR1cm4gMDsKKwlpZiAoaTJjX3JlYWQoJnBvcnQtPmkyYy0+YWRhcCwgMHgyYSwgJnZhbCkgPCAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZGRiX3BvcnRfcHJvYmUoc3RydWN0IGRkYl9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBkZGIgKmRldiA9IHBvcnQtPmRldjsKKwljaGFyICptb2RuYW1lID0gIk5PIE1PRFVMRSI7CisKKwlwb3J0LT5jbGFzcyA9IEREQl9QT1JUX05PTkU7CisKKwlpZiAocG9ydF9oYXNfY2kocG9ydCkpIHsKKwkJbW9kbmFtZSA9ICJDSSI7CisJCXBvcnQtPmNsYXNzID0gRERCX1BPUlRfQ0k7CisJCWRkYndyaXRlbChJMkNfU1BFRURfNDAwLCBwb3J0LT5pMmMtPnJlZ3MgKyBJMkNfVElNSU5HKTsKKwl9IGVsc2UgaWYgKHBvcnRfaGFzX3N0djA5MDAocG9ydCkpIHsKKwkJbW9kbmFtZSA9ICJEVUFMIERWQi1TMiI7CisJCXBvcnQtPmNsYXNzID0gRERCX1BPUlRfVFVORVI7CisJCXBvcnQtPnR5cGUgPSBEREJfVFVORVJfRFZCU19TVDsKKwkJZGRid3JpdGVsKEkyQ19TUEVFRF8xMDAsIHBvcnQtPmkyYy0+cmVncyArIEkyQ19USU1JTkcpOworCX0gZWxzZSBpZiAocG9ydF9oYXNfc3R2MDkwMF9hYShwb3J0KSkgeworCQltb2RuYW1lID0gIkRVQUwgRFZCLVMyIjsKKwkJcG9ydC0+Y2xhc3MgPSBEREJfUE9SVF9UVU5FUjsKKwkJcG9ydC0+dHlwZSA9IEREQl9UVU5FUl9EVkJTX1NUX0FBOworCQlkZGJ3cml0ZWwoSTJDX1NQRUVEXzEwMCwgcG9ydC0+aTJjLT5yZWdzICsgSTJDX1RJTUlORyk7CisJfSBlbHNlIGlmIChwb3J0X2hhc19kcnhrcyhwb3J0KSkgeworCQltb2RuYW1lID0gIkRVQUwgRFZCLUMvVCI7CisJCXBvcnQtPmNsYXNzID0gRERCX1BPUlRfVFVORVI7CisJCXBvcnQtPnR5cGUgPSBEREJfVFVORVJfRFZCQ1RfVFI7CisJCWRkYndyaXRlbChJMkNfU1BFRURfNDAwLCBwb3J0LT5pMmMtPnJlZ3MgKyBJMkNfVElNSU5HKTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiUG9ydCAlZCAoVEFCICVkKTogJXNcbiIsCisJCQkgcG9ydC0+bnIsIHBvcnQtPm5yKzEsIG1vZG5hbWUpOworfQorCitzdGF0aWMgdm9pZCBkZGJfaW5wdXRfaW5pdChzdHJ1Y3QgZGRiX3BvcnQgKnBvcnQsIGludCBucikKK3sKKwlzdHJ1Y3QgZGRiICpkZXYgPSBwb3J0LT5kZXY7CisJc3RydWN0IGRkYl9pbnB1dCAqaW5wdXQgPSAmZGV2LT5pbnB1dFtucl07CisKKwlpbnB1dC0+bnIgPSBucjsKKwlpbnB1dC0+cG9ydCA9IHBvcnQ7CisJaW5wdXQtPmRtYV9idWZfbnVtID0gSU5QVVRfRE1BX0JVRlM7CisJaW5wdXQtPmRtYV9idWZfc2l6ZSA9IElOUFVUX0RNQV9TSVpFOworCWRkYndyaXRlbCgwLCBUU19JTlBVVF9DT05UUk9MKG5yKSk7CisJZGRid3JpdGVsKDIsIFRTX0lOUFVUX0NPTlRST0wobnIpKTsKKwlkZGJ3cml0ZWwoMCwgVFNfSU5QVVRfQ09OVFJPTChucikpOworCWRkYndyaXRlbCgwLCBETUFfQlVGRkVSX0FDSyhucikpOworCXRhc2tsZXRfaW5pdCgmaW5wdXQtPnRhc2tsZXQsIGlucHV0X3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKSBpbnB1dCk7CisJc3Bpbl9sb2NrX2luaXQoJmlucHV0LT5sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbnB1dC0+d3EpOworfQorCitzdGF0aWMgdm9pZCBkZGJfb3V0cHV0X2luaXQoc3RydWN0IGRkYl9wb3J0ICpwb3J0LCBpbnQgbnIpCit7CisJc3RydWN0IGRkYiAqZGV2ID0gcG9ydC0+ZGV2OworCXN0cnVjdCBkZGJfb3V0cHV0ICpvdXRwdXQgPSAmZGV2LT5vdXRwdXRbbnJdOworCW91dHB1dC0+bnIgPSBucjsKKwlvdXRwdXQtPnBvcnQgPSBwb3J0OworCW91dHB1dC0+ZG1hX2J1Zl9udW0gPSBPVVRQVVRfRE1BX0JVRlM7CisJb3V0cHV0LT5kbWFfYnVmX3NpemUgPSBPVVRQVVRfRE1BX1NJWkU7CisKKwlkZGJ3cml0ZWwoMCwgVFNfT1VUUFVUX0NPTlRST0wobnIpKTsKKwlkZGJ3cml0ZWwoMiwgVFNfT1VUUFVUX0NPTlRST0wobnIpKTsKKwlkZGJ3cml0ZWwoMCwgVFNfT1VUUFVUX0NPTlRST0wobnIpKTsKKwl0YXNrbGV0X2luaXQoJm91dHB1dC0+dGFza2xldCwgb3V0cHV0X3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKSBvdXRwdXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm91dHB1dC0+d3EpOworfQorCitzdGF0aWMgdm9pZCBkZGJfcG9ydHNfaW5pdChzdHJ1Y3QgZGRiICpkZXYpCit7CisJaW50IGk7CisJc3RydWN0IGRkYl9wb3J0ICpwb3J0OworCisJZm9yIChpID0gMDsgaSA8IGRldi0+aW5mby0+cG9ydF9udW07IGkrKykgeworCQlwb3J0ID0gJmRldi0+cG9ydFtpXTsKKwkJcG9ydC0+ZGV2ID0gZGV2OworCQlwb3J0LT5uciA9IGk7CisJCXBvcnQtPmkyYyA9ICZkZXYtPmkyY1tpXTsKKwkJcG9ydC0+aW5wdXRbMF0gPSAmZGV2LT5pbnB1dFsyICogaV07CisJCXBvcnQtPmlucHV0WzFdID0gJmRldi0+aW5wdXRbMiAqIGkgKyAxXTsKKwkJcG9ydC0+b3V0cHV0ID0gJmRldi0+b3V0cHV0W2ldOworCisJCW11dGV4X2luaXQoJnBvcnQtPmkyY19nYXRlX2xvY2spOworCQlkZGJfcG9ydF9wcm9iZShwb3J0KTsKKwkJZGRiX2lucHV0X2luaXQocG9ydCwgMiAqIGkpOworCQlkZGJfaW5wdXRfaW5pdChwb3J0LCAyICogaSArIDEpOworCQlkZGJfb3V0cHV0X2luaXQocG9ydCwgaSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkZGJfcG9ydHNfcmVsZWFzZShzdHJ1Y3QgZGRiICpkZXYpCit7CisJaW50IGk7CisJc3RydWN0IGRkYl9wb3J0ICpwb3J0OworCisJZm9yIChpID0gMDsgaSA8IGRldi0+aW5mby0+cG9ydF9udW07IGkrKykgeworCQlwb3J0ID0gJmRldi0+cG9ydFtpXTsKKwkJcG9ydC0+ZGV2ID0gZGV2OworCQl0YXNrbGV0X2tpbGwoJnBvcnQtPmlucHV0WzBdLT50YXNrbGV0KTsKKwkJdGFza2xldF9raWxsKCZwb3J0LT5pbnB1dFsxXS0+dGFza2xldCk7CisJCXRhc2tsZXRfa2lsbCgmcG9ydC0+b3V0cHV0LT50YXNrbGV0KTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgaXJxX2hhbmRsZV9pMmMoc3RydWN0IGRkYiAqZGV2LCBpbnQgbikKK3sKKwlzdHJ1Y3QgZGRiX2kyYyAqaTJjID0gJmRldi0+aTJjW25dOworCisJaTJjLT5kb25lID0gMTsKKwl3YWtlX3VwKCZpMmMtPndxKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGlycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgZGRiICpkZXYgPSAoc3RydWN0IGRkYiAqKSBkZXZfaWQ7CisJdTMyIHMgPSBkZGJyZWFkbChJTlRFUlJVUFRfU1RBVFVTKTsKKworCWlmICghcykKKwkJcmV0dXJuIElSUV9OT05FOworCisJZG8geworCQlkZGJ3cml0ZWwocywgSU5URVJSVVBUX0FDSyk7CisKKwkJaWYgKHMgJiAweDAwMDAwMDAxKQorCQkJaXJxX2hhbmRsZV9pMmMoZGV2LCAwKTsKKwkJaWYgKHMgJiAweDAwMDAwMDAyKQorCQkJaXJxX2hhbmRsZV9pMmMoZGV2LCAxKTsKKwkJaWYgKHMgJiAweDAwMDAwMDA0KQorCQkJaXJxX2hhbmRsZV9pMmMoZGV2LCAyKTsKKwkJaWYgKHMgJiAweDAwMDAwMDA4KQorCQkJaXJxX2hhbmRsZV9pMmMoZGV2LCAzKTsKKworCQlpZiAocyAmIDB4MDAwMDAxMDApCisJCQl0YXNrbGV0X3NjaGVkdWxlKCZkZXYtPmlucHV0WzBdLnRhc2tsZXQpOworCQlpZiAocyAmIDB4MDAwMDAyMDApCisJCQl0YXNrbGV0X3NjaGVkdWxlKCZkZXYtPmlucHV0WzFdLnRhc2tsZXQpOworCQlpZiAocyAmIDB4MDAwMDA0MDApCisJCQl0YXNrbGV0X3NjaGVkdWxlKCZkZXYtPmlucHV0WzJdLnRhc2tsZXQpOworCQlpZiAocyAmIDB4MDAwMDA4MDApCisJCQl0YXNrbGV0X3NjaGVkdWxlKCZkZXYtPmlucHV0WzNdLnRhc2tsZXQpOworCQlpZiAocyAmIDB4MDAwMDEwMDApCisJCQl0YXNrbGV0X3NjaGVkdWxlKCZkZXYtPmlucHV0WzRdLnRhc2tsZXQpOworCQlpZiAocyAmIDB4MDAwMDIwMDApCisJCQl0YXNrbGV0X3NjaGVkdWxlKCZkZXYtPmlucHV0WzVdLnRhc2tsZXQpOworCQlpZiAocyAmIDB4MDAwMDQwMDApCisJCQl0YXNrbGV0X3NjaGVkdWxlKCZkZXYtPmlucHV0WzZdLnRhc2tsZXQpOworCQlpZiAocyAmIDB4MDAwMDgwMDApCisJCQl0YXNrbGV0X3NjaGVkdWxlKCZkZXYtPmlucHV0WzddLnRhc2tsZXQpOworCisJCWlmIChzICYgMHgwMDAxMDAwMCkKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmRldi0+b3V0cHV0WzBdLnRhc2tsZXQpOworCQlpZiAocyAmIDB4MDAwMjAwMDApCisJCQl0YXNrbGV0X3NjaGVkdWxlKCZkZXYtPm91dHB1dFsxXS50YXNrbGV0KTsKKwkJaWYgKHMgJiAweDAwMDQwMDAwKQorCQkJdGFza2xldF9zY2hlZHVsZSgmZGV2LT5vdXRwdXRbMl0udGFza2xldCk7CisJCWlmIChzICYgMHgwMDA4MDAwMCkKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmRldi0+b3V0cHV0WzNdLnRhc2tsZXQpOworCisJCS8qIGlmIChzICYgMHgwMDBmMDAwMCkJcHJpbnRrKEtFUk5fREVCVUcgIiUwOHhcbiIsIGlzdGF0KTsgKi8KKwl9IHdoaWxlICgocyA9IGRkYnJlYWRsKElOVEVSUlVQVF9TVEFUVVMpKSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBmbGFzaGlvKHN0cnVjdCBkZGIgKmRldiwgdTggKndidWYsIHUzMiB3bGVuLCB1OCAqcmJ1ZiwgdTMyIHJsZW4pCit7CisJdTMyIGRhdGEsIHNoaWZ0OworCisJaWYgKHdsZW4gPiA0KQorCQlkZGJ3cml0ZWwoMSwgU1BJX0NPTlRST0wpOworCXdoaWxlICh3bGVuID4gNCkgeworCQkvKiBGSVhNRTogY2hlY2sgZm9yIGJpZy1lbmRpYW4gKi8KKwkJZGF0YSA9IHN3YWIzMigqKHUzMiAqKXdidWYpOworCQl3YnVmICs9IDQ7CisJCXdsZW4gLT0gNDsKKwkJZGRid3JpdGVsKGRhdGEsIFNQSV9EQVRBKTsKKwkJd2hpbGUgKGRkYnJlYWRsKFNQSV9DT05UUk9MKSAmIDB4MDAwNCkKKwkJCTsKKwl9CisKKwlpZiAocmxlbikKKwkJZGRid3JpdGVsKDB4MDAwMSB8ICgod2xlbiA8PCAoOCArIDMpKSAmIDB4MWYwMCksIFNQSV9DT05UUk9MKTsKKwllbHNlCisJCWRkYndyaXRlbCgweDAwMDMgfCAoKHdsZW4gPDwgKDggKyAzKSkgJiAweDFmMDApLCBTUElfQ09OVFJPTCk7CisKKwlkYXRhID0gMDsKKwlzaGlmdCA9ICgoNCAtIHdsZW4pICogOCk7CisJd2hpbGUgKHdsZW4pIHsKKwkJZGF0YSA8PD0gODsKKwkJZGF0YSB8PSAqd2J1ZjsKKwkJd2xlbi0tOworCQl3YnVmKys7CisJfQorCWlmIChzaGlmdCkKKwkJZGF0YSA8PD0gc2hpZnQ7CisJZGRid3JpdGVsKGRhdGEsIFNQSV9EQVRBKTsKKwl3aGlsZSAoZGRicmVhZGwoU1BJX0NPTlRST0wpICYgMHgwMDA0KQorCQk7CisKKwlpZiAoIXJsZW4pIHsKKwkJZGRid3JpdGVsKDAsIFNQSV9DT05UUk9MKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChybGVuID4gNCkKKwkJZGRid3JpdGVsKDEsIFNQSV9DT05UUk9MKTsKKworCXdoaWxlIChybGVuID4gNCkgeworCQlkZGJ3cml0ZWwoMHhmZmZmZmZmZiwgU1BJX0RBVEEpOworCQl3aGlsZSAoZGRicmVhZGwoU1BJX0NPTlRST0wpICYgMHgwMDA0KQorCQkJOworCQlkYXRhID0gZGRicmVhZGwoU1BJX0RBVEEpOworCQkqKHUzMiAqKSByYnVmID0gc3dhYjMyKGRhdGEpOworCQlyYnVmICs9IDQ7CisJCXJsZW4gLT0gNDsKKwl9CisJZGRid3JpdGVsKDB4MDAwMyB8ICgocmxlbiA8PCAoOCArIDMpKSAmIDB4MUYwMCksIFNQSV9DT05UUk9MKTsKKwlkZGJ3cml0ZWwoMHhmZmZmZmZmZiwgU1BJX0RBVEEpOworCXdoaWxlIChkZGJyZWFkbChTUElfQ09OVFJPTCkgJiAweDAwMDQpCisJCTsKKworCWRhdGEgPSBkZGJyZWFkbChTUElfREFUQSk7CisJZGRid3JpdGVsKDAsIFNQSV9DT05UUk9MKTsKKworCWlmIChybGVuIDwgNCkKKwkJZGF0YSA8PD0gKCg0IC0gcmxlbikgKiA4KTsKKworCXdoaWxlIChybGVuID4gMCkgeworCQkqcmJ1ZiA9ICgoZGF0YSA+PiAyNCkgJiAweGZmKTsKKwkJZGF0YSA8PD0gODsKKwkJcmJ1ZisrOworCQlybGVuLS07CisJfQorCXJldHVybiAwOworfQorCisjZGVmaW5lIEREQl9NQUdJQyAnZCcKKworc3RydWN0IGRkYl9mbGFzaGlvIHsKKwlfX3U4ICp3cml0ZV9idWY7CisJX191MzIgd3JpdGVfbGVuOworCV9fdTggKnJlYWRfYnVmOworCV9fdTMyIHJlYWRfbGVuOworfTsKKworI2RlZmluZSBJT0NUTF9EREJfRkxBU0hJTyAgX0lPV1IoRERCX01BR0lDLCAweDAwLCBzdHJ1Y3QgZGRiX2ZsYXNoaW8pCisKKyNkZWZpbmUgRERCX05BTUUgImRkYnJpZGdlIgorCitzdGF0aWMgdTMyIGRkYl9udW07CitzdGF0aWMgc3RydWN0IGRkYiAqZGRic1szMl07CitzdGF0aWMgc3RydWN0IGNsYXNzICpkZGJfY2xhc3M7CitzdGF0aWMgaW50IGRkYl9tYWpvcjsKKworc3RhdGljIGludCBkZGJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZGRiICpkZXYgPSBkZGJzW2ltaW5vcihpbm9kZSldOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZGV2OworCXJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyBkZGJfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBkZGIgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl2b2lkICpwYXJnID0gKHZvaWQgKilhcmc7CisJaW50IHJlcyA9IC1FRkFVTFQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSU9DVExfRERCX0ZMQVNISU86CisJeworCQlzdHJ1Y3QgZGRiX2ZsYXNoaW8gZmlvOworCQl1OCAqcmJ1ZiwgKndidWY7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZmaW8sIHBhcmcsIHNpemVvZihmaW8pKSkKKwkJCWJyZWFrOworCQlpZiAoZmlvLndyaXRlX2xlbiArIGZpby5yZWFkX2xlbiA+IDEwMjgpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiSU9CVUYgdG9vIHNtYWxsXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXdidWYgPSAmZGV2LT5pb2J1ZlswXTsKKwkJaWYgKCF3YnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJidWYgPSB3YnVmICsgZmlvLndyaXRlX2xlbjsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHdidWYsIGZpby53cml0ZV9idWYsIGZpby53cml0ZV9sZW4pKSB7CisJCQl2ZnJlZSh3YnVmKTsKKwkJCWJyZWFrOworCQl9CisJCXJlcyA9IGZsYXNoaW8oZGV2LCB3YnVmLCBmaW8ud3JpdGVfbGVuLAorCQkJICAgICAgcmJ1ZiwgZmlvLnJlYWRfbGVuKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihmaW8ucmVhZF9idWYsIHJidWYsIGZpby5yZWFkX2xlbikpCisJCQlyZXMgPSAtRUZBVUxUOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRkYl9mb3BzID0geworCS51bmxvY2tlZF9pb2N0bCA9IGRkYl9pb2N0bCwKKwkub3BlbiAgICAgICAgICAgPSBkZGJfb3BlbiwKK307CisKK3N0YXRpYyBjaGFyICpkZGJfZGV2bm9kZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsIG1vZGVfdCAqbW9kZSkKK3sKKwlzdHJ1Y3QgZGRiICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKKworCXJldHVybiBrYXNwcmludGYoR0ZQX0tFUk5FTCwgImRkYnJpZGdlL2NhcmQlZCIsIGRldi0+bnIpOworfQorCitzdGF0aWMgaW50IGRkYl9jbGFzc19jcmVhdGUodm9pZCkKK3sKKwlkZGJfbWFqb3IgPSByZWdpc3Rlcl9jaHJkZXYoMCwgRERCX05BTUUsICZkZGJfZm9wcyk7CisJaWYgKGRkYl9tYWpvciA8IDApCisJCXJldHVybiBkZGJfbWFqb3I7CisKKwlkZGJfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsIEREQl9OQU1FKTsKKwlpZiAoSVNfRVJSKGRkYl9jbGFzcykpIHsKKwkJdW5yZWdpc3Rlcl9jaHJkZXYoZGRiX21ham9yLCBEREJfTkFNRSk7CisJCXJldHVybiAtMTsKKwl9CisJZGRiX2NsYXNzLT5kZXZub2RlID0gZGRiX2Rldm5vZGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRkYl9jbGFzc19kZXN0cm95KHZvaWQpCit7CisJY2xhc3NfZGVzdHJveShkZGJfY2xhc3MpOworCXVucmVnaXN0ZXJfY2hyZGV2KGRkYl9tYWpvciwgRERCX05BTUUpOworfQorCitzdGF0aWMgaW50IGRkYl9kZXZpY2VfY3JlYXRlKHN0cnVjdCBkZGIgKmRldikKK3sKKwlkZXYtPm5yID0gZGRiX251bSsrOworCWRldi0+ZGRiX2RldiA9IGRldmljZV9jcmVhdGUoZGRiX2NsYXNzLCBOVUxMLAorCQkJCSAgICAgTUtERVYoZGRiX21ham9yLCBkZXYtPm5yKSwKKwkJCQkgICAgIGRldiwgImRkYnJpZGdlJWQiLCBkZXYtPm5yKTsKKwlkZGJzW2Rldi0+bnJdID0gZGV2OworCWlmIChJU19FUlIoZGV2LT5kZGJfZGV2KSkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZGJfZGV2aWNlX2Rlc3Ryb3koc3RydWN0IGRkYiAqZGV2KQoreworCWRkYl9udW0tLTsKKwlpZiAoSVNfRVJSKGRldi0+ZGRiX2RldikpCisJCXJldHVybjsKKwlkZXZpY2VfZGVzdHJveShkZGJfY2xhc3MsIE1LREVWKGRkYl9tYWpvciwgMCkpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgZGRiX3VubWFwKHN0cnVjdCBkZGIgKmRldikKK3sKKwlpZiAoZGV2LT5yZWdzKQorCQlpb3VubWFwKGRldi0+cmVncyk7CisJdmZyZWUoZGV2KTsKK30KKworCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZGRiX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgZGRiICpkZXYgPSAoc3RydWN0IGRkYiAqKSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlkZGJfcG9ydHNfZGV0YWNoKGRldik7CisJZGRiX2kyY19yZWxlYXNlKGRldik7CisKKwlkZGJ3cml0ZWwoMCwgSU5URVJSVVBUX0VOQUJMRSk7CisJZnJlZV9pcnEoZGV2LT5wZGV2LT5pcnEsIGRldik7CisjaWZkZWYgQ09ORklHX1BDSV9NU0kKKwlpZiAoZGV2LT5tc2kpCisJCXBjaV9kaXNhYmxlX21zaShkZXYtPnBkZXYpOworI2VuZGlmCisJZGRiX3BvcnRzX3JlbGVhc2UoZGV2KTsKKwlkZGJfYnVmZmVyc19mcmVlKGRldik7CisJZGRiX2RldmljZV9kZXN0cm95KGRldik7CisKKwlkZGJfdW5tYXAoZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgMCk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGRkYl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGRkYiAqZGV2OworCWludCBzdGF0ID0gMDsKKwlpbnQgaXJxX2ZsYWcgPSBJUlFGX1NIQVJFRDsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSA8IDApCisJCXJldHVybiAtRU5PREVWOworCisJZGV2ID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGRkYikpOworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKHN0cnVjdCBkZGIpKTsKKworCWRldi0+cGRldiA9IHBkZXY7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisJZGV2LT5pbmZvID0gKHN0cnVjdCBkZGJfaW5mbyAqKSBpZC0+ZHJpdmVyX2RhdGE7CisJcHJpbnRrKEtFUk5fSU5GTyAiRERCcmlkZ2UgZHJpdmVyIGRldGVjdGVkOiAlc1xuIiwgZGV2LT5pbmZvLT5uYW1lKTsKKworCWRldi0+cmVncyA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMCksCisJCQkgICAgcGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIDApKTsKKwlpZiAoIWRldi0+cmVncykgeworCQlzdGF0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJIVyAlMDh4IEZXICUwOHhcbiIsIGRkYnJlYWRsKDApLCBkZGJyZWFkbCg0KSk7CisKKyNpZmRlZiBDT05GSUdfUENJX01TSQorCWlmIChwY2lfbXNpX2VuYWJsZWQoKSkKKwkJc3RhdCA9IHBjaV9lbmFibGVfbXNpKGRldi0+cGRldik7CisJaWYgKHN0YXQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiOiBNU0kgbm90IGF2YWlsYWJsZS5cbiIpOworCX0gZWxzZSB7CisJCWlycV9mbGFnID0gMDsKKwkJZGV2LT5tc2kgPSAxOworCX0KKyNlbmRpZgorCXN0YXQgPSByZXF1ZXN0X2lycShkZXYtPnBkZXYtPmlycSwgaXJxX2hhbmRsZXIsCisJCQkgICBpcnFfZmxhZywgIkREQnJpZGdlIiwgKHZvaWQgKikgZGV2KTsKKwlpZiAoc3RhdCA8IDApCisJCWdvdG8gZmFpbDE7CisJZGRid3JpdGVsKDAsIERNQV9CQVNFX1dSSVRFKTsKKwlkZGJ3cml0ZWwoMCwgRE1BX0JBU0VfUkVBRCk7CisJZGRid3JpdGVsKDB4ZmZmZmZmZmYsIElOVEVSUlVQVF9BQ0spOworCWRkYndyaXRlbCgweGZmZjBmLCBJTlRFUlJVUFRfRU5BQkxFKTsKKwlkZGJ3cml0ZWwoMCwgTVNJMV9FTkFCTEUpOworCisJaWYgKGRkYl9pMmNfaW5pdChkZXYpIDwgMCkKKwkJZ290byBmYWlsMTsKKwlkZGJfcG9ydHNfaW5pdChkZXYpOworCWlmIChkZGJfYnVmZmVyc19hbGxvYyhkZXYpIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICI6IENvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXIgbWVtb3J5XG4iKTsKKwkJZ290byBmYWlsMjsKKwl9CisJaWYgKGRkYl9wb3J0c19hdHRhY2goZGV2KSA8IDApCisJCWdvdG8gZmFpbDM7CisJZGRiX2RldmljZV9jcmVhdGUoZGV2KTsKKwlyZXR1cm4gMDsKKworZmFpbDM6CisJZGRiX3BvcnRzX2RldGFjaChkZXYpOworCXByaW50ayhLRVJOX0VSUiAiZmFpbDNcbiIpOworCWRkYl9wb3J0c19yZWxlYXNlKGRldik7CitmYWlsMjoKKwlwcmludGsoS0VSTl9FUlIgImZhaWwyXG4iKTsKKwlkZGJfYnVmZmVyc19mcmVlKGRldik7CitmYWlsMToKKwlwcmludGsoS0VSTl9FUlIgImZhaWwxXG4iKTsKKwlpZiAoZGV2LT5tc2kpCisJCXBjaV9kaXNhYmxlX21zaShkZXYtPnBkZXYpOworCWZyZWVfaXJxKGRldi0+cGRldi0+aXJxLCBkZXYpOworZmFpbDoKKwlwcmludGsoS0VSTl9FUlIgImZhaWxcbiIpOworCWRkYl91bm1hcChkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCAwKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0dXJuIC0xOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgZGRiX2luZm8gZGRiX25vbmUgPSB7CisJLnR5cGUgICAgID0gRERCX05PTkUsCisJLm5hbWUgICAgID0gIkRpZ2l0YWwgRGV2aWNlcyBQQ0llIGJyaWRnZSIsCit9OworCitzdGF0aWMgc3RydWN0IGRkYl9pbmZvIGRkYl9vY3RvcHVzID0geworCS50eXBlICAgICA9IEREQl9PQ1RPUFVTLAorCS5uYW1lICAgICA9ICJEaWdpdGFsIERldmljZXMgT2N0b3B1cyBEVkIgYWRhcHRlciIsCisJLnBvcnRfbnVtID0gNCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGRiX2luZm8gZGRiX29jdG9wdXNfbGUgPSB7CisJLnR5cGUgICAgID0gRERCX09DVE9QVVMsCisJLm5hbWUgICAgID0gIkRpZ2l0YWwgRGV2aWNlcyBPY3RvcHVzIExFIERWQiBhZGFwdGVyIiwKKwkucG9ydF9udW0gPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCBkZGJfaW5mbyBkZGJfdjYgPSB7CisJLnR5cGUgICAgID0gRERCX09DVE9QVVMsCisJLm5hbWUgICAgID0gIkRpZ2l0YWwgRGV2aWNlcyBDaW5lIFMyIFY2IERWQiBhZGFwdGVyIiwKKwkucG9ydF9udW0gPSAzLAorfTsKKworI2RlZmluZSBERFZJRCAweGRkMDEgLyogRGlnaXRhbCBEZXZpY2VzIFZlbmRvciBJRCAqLworCisjZGVmaW5lIEREQl9JRChfdmVuZCwgX2RldiwgX3N1YnZlbmQsIF9zdWJkZXYsIF9kcml2ZXJkYXRhKSB7CVwKKwkudmVuZG9yICAgICAgPSBfdmVuZCwgICAgLmRldmljZSAgICA9IF9kZXYsIFwKKwkuc3VidmVuZG9yICAgPSBfc3VidmVuZCwgLnN1YmRldmljZSA9IF9zdWJkZXYsIFwKKwkuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZykmX2RyaXZlcmRhdGEgfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgZGRiX2lkX3RibFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJRERCX0lEKEREVklELCAweDAwMDIsIEREVklELCAweDAwMDEsIGRkYl9vY3RvcHVzKSwKKwlEREJfSUQoRERWSUQsIDB4MDAwMywgRERWSUQsIDB4MDAwMSwgZGRiX29jdG9wdXMpLAorCUREQl9JRChERFZJRCwgMHgwMDAzLCBERFZJRCwgMHgwMDAyLCBkZGJfb2N0b3B1c19sZSksCisJRERCX0lEKEREVklELCAweDAwMDMsIEREVklELCAweDAwMTAsIGRkYl9vY3RvcHVzKSwKKwlEREJfSUQoRERWSUQsIDB4MDAwMywgRERWSUQsIDB4MDAyMCwgZGRiX3Y2KSwKKwkvKiBpbiBjYXNlIHN1Yi1pZHMgZ290IGRlbGV0ZWQgaW4gZmxhc2ggKi8KKwlEREJfSUQoRERWSUQsIDB4MDAwMywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGRiX25vbmUpLAorCXswfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBkZGJfaWRfdGJsKTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZGRiX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgICAgICAgID0gIkREQnJpZGdlIiwKKwkuaWRfdGFibGUgICAgPSBkZGJfaWRfdGJsLAorCS5wcm9iZSAgICAgICA9IGRkYl9wcm9iZSwKKwkucmVtb3ZlICAgICAgPSBkZGJfcmVtb3ZlLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgbW9kdWxlX2luaXRfZGRicmlkZ2Uodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJEaWdpdGFsIERldmljZXMgUENJRSBicmlkZ2UgZHJpdmVyLCAiCisJICAgICAgICJDb3B5cmlnaHQgKEMpIDIwMTAtMTEgRGlnaXRhbCBEZXZpY2VzIEdtYkhcbiIpOworCWlmIChkZGJfY2xhc3NfY3JlYXRlKCkpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZGRiX3BjaV9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgbW9kdWxlX2V4aXRfZGRicmlkZ2Uodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRkYl9wY2lfZHJpdmVyKTsKKwlkZGJfY2xhc3NfZGVzdHJveSgpOworfQorCittb2R1bGVfaW5pdChtb2R1bGVfaW5pdF9kZGJyaWRnZSk7Cittb2R1bGVfZXhpdChtb2R1bGVfZXhpdF9kZGJyaWRnZSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiRGlnaXRhbCBEZXZpY2VzIFBDSWUgQnJpZGdlIik7CitNT0RVTEVfQVVUSE9SKCJSYWxwaCBNZXR6bGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC41Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9kZGJyaWRnZS1yZWdzLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9kZGJyaWRnZS1yZWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNjY2IzMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2RkYnJpZGdlL2RkYnJpZGdlLXJlZ3MuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIGRkYnJpZGdlLXJlZ3MuaDogRGlnaXRhbCBEZXZpY2VzIFBDSWUgYnJpZGdlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIERpZ2l0YWwgRGV2aWNlcyBHbWJICisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqIE9yLCBwb2ludCB5b3VyIGJyb3dzZXIgdG8gaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworLyogREQtRFZCQnJpZGdlVjEuaCAyNzMgMjAxMC0wOS0xNyAwNTowMzoxNlogbWFuZnJlZCAqLworCisvKiBSZWdpc3RlciBEZWZpbml0aW9ucyAqLworCisjZGVmaW5lIENVUl9SRUdJU1RFUk1BUF9WRVJTSU9OIDB4MTAwMDAKKworI2RlZmluZSBIQVJEV0FSRV9WRVJTSU9OICAgICAgIDB4MDAKKyNkZWZpbmUgUkVHSVNURVJNQVBfVkVSU0lPTiAgICAweDA0CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFNQSSBDb250cm9sbGVyICovCisKKyNkZWZpbmUgU1BJX0NPTlRST0wgICAgIDB4MTAKKyNkZWZpbmUgU1BJX0RBVEEgICAgICAgIDB4MTQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBJbnRlcnJ1cHQgY29udHJvbGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSG93IG1hbnkgTVNJJ3MgYXJlIGF2YWlsYWJsZSBkZXBlbmRzIG9uIEhXIChNaW4gMiBtYXggOCkgKi8KKy8qIEhvdyBtYW55IGFyZSB1c2FibGUgYWxzbyBkZXBlbmRzIG9uIEhvc3QgcGxhdGZvcm0gICAgICAgICovCisKKyNkZWZpbmUgSU5URVJSVVBUX0JBU0UgICAoMHg0MCkKKworI2RlZmluZSBJTlRFUlJVUFRfRU5BQkxFIChJTlRFUlJVUFRfQkFTRSArIDB4MDApCisjZGVmaW5lIE1TSTBfRU5BQkxFICAgICAgKElOVEVSUlVQVF9CQVNFICsgMHgwMCkKKyNkZWZpbmUgTVNJMV9FTkFCTEUgICAgICAoSU5URVJSVVBUX0JBU0UgKyAweDA0KQorI2RlZmluZSBNU0kyX0VOQUJMRSAgICAgIChJTlRFUlJVUFRfQkFTRSArIDB4MDgpCisjZGVmaW5lIE1TSTNfRU5BQkxFICAgICAgKElOVEVSUlVQVF9CQVNFICsgMHgwQykKKyNkZWZpbmUgTVNJNF9FTkFCTEUgICAgICAoSU5URVJSVVBUX0JBU0UgKyAweDEwKQorI2RlZmluZSBNU0k1X0VOQUJMRSAgICAgIChJTlRFUlJVUFRfQkFTRSArIDB4MTQpCisjZGVmaW5lIE1TSTZfRU5BQkxFICAgICAgKElOVEVSUlVQVF9CQVNFICsgMHgxOCkKKyNkZWZpbmUgTVNJN19FTkFCTEUgICAgICAoSU5URVJSVVBUX0JBU0UgKyAweDFDKQorCisjZGVmaW5lIElOVEVSUlVQVF9TVEFUVVMgKElOVEVSUlVQVF9CQVNFICsgMHgyMCkKKyNkZWZpbmUgSU5URVJSVVBUX0FDSyAgICAoSU5URVJSVVBUX0JBU0UgKyAweDIwKQorCisjZGVmaW5lIElOVE1BU0tfSTJDMSAgICAgICAgKDB4MDAwMDAwMDEpCisjZGVmaW5lIElOVE1BU0tfSTJDMiAgICAgICAgKDB4MDAwMDAwMDIpCisjZGVmaW5lIElOVE1BU0tfSTJDMyAgICAgICAgKDB4MDAwMDAwMDQpCisjZGVmaW5lIElOVE1BU0tfSTJDNCAgICAgICAgKDB4MDAwMDAwMDgpCisKKyNkZWZpbmUgSU5UTUFTS19DSVJRMSAgICAgICAoMHgwMDAwMDAxMCkKKyNkZWZpbmUgSU5UTUFTS19DSVJRMiAgICAgICAoMHgwMDAwMDAyMCkKKyNkZWZpbmUgSU5UTUFTS19DSVJRMyAgICAgICAoMHgwMDAwMDA0MCkKKyNkZWZpbmUgSU5UTUFTS19DSVJRNCAgICAgICAoMHgwMDAwMDA4MCkKKworI2RlZmluZSBJTlRNQVNLX1RTSU5QVVQxICAgICgweDAwMDAwMTAwKQorI2RlZmluZSBJTlRNQVNLX1RTSU5QVVQyICAgICgweDAwMDAwMjAwKQorI2RlZmluZSBJTlRNQVNLX1RTSU5QVVQzICAgICgweDAwMDAwNDAwKQorI2RlZmluZSBJTlRNQVNLX1RTSU5QVVQ0ICAgICgweDAwMDAwODAwKQorI2RlZmluZSBJTlRNQVNLX1RTSU5QVVQ1ICAgICgweDAwMDAxMDAwKQorI2RlZmluZSBJTlRNQVNLX1RTSU5QVVQ2ICAgICgweDAwMDAyMDAwKQorI2RlZmluZSBJTlRNQVNLX1RTSU5QVVQ3ICAgICgweDAwMDA0MDAwKQorI2RlZmluZSBJTlRNQVNLX1RTSU5QVVQ4ICAgICgweDAwMDA4MDAwKQorCisjZGVmaW5lIElOVE1BU0tfVFNPVVRQVVQxICAgKDB4MDAwMTAwMDApCisjZGVmaW5lIElOVE1BU0tfVFNPVVRQVVQyICAgKDB4MDAwMjAwMDApCisjZGVmaW5lIElOVE1BU0tfVFNPVVRQVVQzICAgKDB4MDAwNDAwMDApCisjZGVmaW5lIElOVE1BU0tfVFNPVVRQVVQ0ICAgKDB4MDAwODAwMDApCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEkyQyBNYXN0ZXIgQ29udHJvbGxlciAqLworCisjZGVmaW5lIEkyQ19CQVNFICAgICAgICAoMHg4MCkgIC8qIEJ5dGUgb2Zmc2V0ICovCisKKyNkZWZpbmUgSTJDX0NPTU1BTkQgICAgICgweDAwKQorI2RlZmluZSBJMkNfVElNSU5HICAgICAgKDB4MDQpCisjZGVmaW5lIEkyQ19UQVNLTEVOR1RIICAoMHgwOCkgICAgIC8qIEhpZ2ggcmVhZCwgbG93IHdyaXRlICovCisjZGVmaW5lIEkyQ19UQVNLQUREUkVTUyAoMHgwQykgICAgIC8qIEhpZ2ggcmVhZCwgbG93IHdyaXRlICovCisKKyNkZWZpbmUgSTJDX01PTklUT1IgICAgICgweDFDKQorCisjZGVmaW5lIEkyQ19CQVNFXzEgICAgICAoSTJDX0JBU0UgKyAweDAwKQorI2RlZmluZSBJMkNfQkFTRV8yICAgICAgKEkyQ19CQVNFICsgMHgyMCkKKyNkZWZpbmUgSTJDX0JBU0VfMyAgICAgIChJMkNfQkFTRSArIDB4NDApCisjZGVmaW5lIEkyQ19CQVNFXzQgICAgICAoSTJDX0JBU0UgKyAweDYwKQorCisjZGVmaW5lIEkyQ19CQVNFX04oaSkgICAoSTJDX0JBU0UgKyAoaSkgKiAweDIwKQorCisjZGVmaW5lIEkyQ19UQVNLTUVNX0JBU0UgICAgKDB4MTAwMCkgICAgLyogQnl0ZSBvZmZzZXQgKi8KKyNkZWZpbmUgSTJDX1RBU0tNRU1fU0laRSAgICAoMHgxMDAwKQorCisjZGVmaW5lIEkyQ19TUEVFRF80MDAgICAoMHgwNDAzMDQwNCkKKyNkZWZpbmUgSTJDX1NQRUVEXzIwMCAgICgweDA5MDgwOTA5KQorI2RlZmluZSBJMkNfU1BFRURfMTU0ICAgKDB4MEMwQjBDMEMpCisjZGVmaW5lIEkyQ19TUEVFRF8xMDAgICAoMHgxMzEyMTMxMykKKyNkZWZpbmUgSTJDX1NQRUVEXzc3ICAgICgweDE5MTgxOTE5KQorI2RlZmluZSBJMkNfU1BFRURfNTAgICAgKDB4MjcyNjI3MjcpCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRE1BICBDb250cm9sbGVyICovCisKKyNkZWZpbmUgRE1BX0JBU0VfV1JJVEUgICAgICAgICgweDEwMCkKKyNkZWZpbmUgRE1BX0JBU0VfUkVBRCAgICAgICAgICgweDE0MCkKKworI2RlZmluZSBETUFfQ09OVFJPTCAgICAgKDB4MDApICAgICAgICAgICAgICAgICAgLyogNjQgKi8KKyNkZWZpbmUgRE1BX0VSUk9SICAgICAgICgweDA0KSAgICAgICAgICAgICAgICAgIC8qIDY1ICggb25seSByZWFkIGluc3RhbmNlICkgKi8KKworI2RlZmluZSBETUFfRElBR19DT05UUk9MICAgICAgICAgICAgICAgICgweDFDKSAgLyogNzEgKi8KKyNkZWZpbmUgRE1BX0RJQUdfUEFDS0VUQ09VTlRFUl9MT1cgICAgICAoMHgyMCkgIC8qIDcyICovCisjZGVmaW5lIERNQV9ESUFHX1BBQ0tFVENPVU5URVJfSElHSCAgICAgKDB4MjQpICAvKiA3MyAqLworI2RlZmluZSBETUFfRElBR19USU1FQ09VTlRFUl9MT1cgICAgICAgICgweDI4KSAgLyogNzQgKi8KKyNkZWZpbmUgRE1BX0RJQUdfVElNRUNPVU5URVJfSElHSCAgICAgICAoMHgyQykgIC8qIDc1ICovCisjZGVmaW5lIERNQV9ESUFHX1JFQ0hFQ0tDT1VOVEVSICAgICAgICAgKDB4MzApICAvKiA3NiAgKCBTcGxpdCBjb21wbGV0aW9ucyBvbiByZWFkICkgKi8KKyNkZWZpbmUgRE1BX0RJQUdfV0FJVFRJTUVPVVRJTklUICAgICAgICAoMHgzNCkgIC8qIDc3ICovCisjZGVmaW5lIERNQV9ESUFHX1dBSVRPVkVSRkxPV0NPVU5URVIgICAgKDB4MzgpICAvKiA3OCAqLworI2RlZmluZSBETUFfRElBR19XQUlUQ09VTlRFUiAgICAgICAgICAgICgweDNDKSAgLyogNzkgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogRE1BICBCdWZmZXIgKi8KKworI2RlZmluZSBUU19JTlBVVF9CQVNFICAgICAgICgweDIwMCkKKyNkZWZpbmUgVFNfSU5QVVRfQ09OVFJPTChpKSAgICAgICAgIChUU19JTlBVVF9CQVNFICsgKGkpICogMTYgKyAweDAwKQorCisjZGVmaW5lIFRTX09VVFBVVF9CQVNFICAgICAgICgweDI4MCkKKyNkZWZpbmUgVFNfT1VUUFVUX0NPTlRST0woaSkgICAgICAgICAoVFNfT1VUUFVUX0JBU0UgKyAoaSkgKiAxNiArIDB4MDApCisKKyNkZWZpbmUgRE1BX0JVRkZFUl9CQVNFICAgICAoMHgzMDApCisKKyNkZWZpbmUgRE1BX0JVRkZFUl9DT05UUk9MKGkpICAgICAgIChETUFfQlVGRkVSX0JBU0UgKyAoaSkgKiAxNiArIDB4MDApCisjZGVmaW5lIERNQV9CVUZGRVJfQUNLKGkpICAgICAgICAgICAoRE1BX0JVRkZFUl9CQVNFICsgKGkpICogMTYgKyAweDA0KQorI2RlZmluZSBETUFfQlVGRkVSX0NVUlJFTlQoaSkgICAgICAgKERNQV9CVUZGRVJfQkFTRSArIChpKSAqIDE2ICsgMHgwOCkKKyNkZWZpbmUgRE1BX0JVRkZFUl9TSVpFKGkpICAgICAgICAgIChETUFfQlVGRkVSX0JBU0UgKyAoaSkgKiAxNiArIDB4MGMpCisKKyNkZWZpbmUgRE1BX0JBU0VfQUREUkVTU19UQUJMRSAgKDB4MjAwMCkKKyNkZWZpbmUgRE1BX0JBU0VfQUREUkVTU19UQUJMRV9FTlRSSUVTICg1MTIpCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2RkYnJpZGdlL2RkYnJpZGdlLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9kZGJyaWRnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMTQ4OTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9kZGJyaWRnZS5oCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogZGRicmlkZ2UuaDogRGlnaXRhbCBEZXZpY2VzIFBDSWUgYnJpZGdlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIERpZ2l0YWwgRGV2aWNlcyBHbWJICisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqIE9yLCBwb2ludCB5b3VyIGJyb3dzZXIgdG8gaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworI2lmbmRlZiBfRERCUklER0VfSF8KKyNkZWZpbmUgX0REQlJJREdFX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+CisjaW5jbHVkZSA8bGludXgvZHZiL2NhLmg+CisjaW5jbHVkZSA8bGludXgvZHZiL3ZpZGVvLmg+CisjaW5jbHVkZSA8bGludXgvZHZiL2F1ZGlvLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisKKyNpbmNsdWRlICJkbXhkZXYuaCIKKyNpbmNsdWRlICJkdmJkZXYuaCIKKyNpbmNsdWRlICJkdmJfZGVtdXguaCIKKyNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKKyNpbmNsdWRlICJkdmJfcmluZ2J1ZmZlci5oIgorI2luY2x1ZGUgImR2Yl9jYV9lbjUwMjIxLmgiCisjaW5jbHVkZSAiZHZiX25ldC5oIgorI2luY2x1ZGUgImN4ZDIwOTkuaCIKKworI2RlZmluZSBEREJfTUFYX0kyQyAgICAgNAorI2RlZmluZSBEREJfTUFYX1BPUlQgICAgNAorI2RlZmluZSBEREJfTUFYX0lOUFVUICAgOAorI2RlZmluZSBEREJfTUFYX09VVFBVVCAgNAorCitzdHJ1Y3QgZGRiX2luZm8geworCWludCAgIHR5cGU7CisjZGVmaW5lIEREQl9OT05FICAgICAgICAgMAorI2RlZmluZSBEREJfT0NUT1BVUyAgICAgIDEKKwljaGFyICpuYW1lOworCWludCAgIHBvcnRfbnVtOworCXUzMiAgIHBvcnRfdHlwZVtEREJfTUFYX1BPUlRdOworfTsKKworLyogRE1BX1NJWkUgTVVTVCBiZSBkaXZpc2libGUgYnkgMTg4IGFuZCAxMjggISEhICovCisKKyNkZWZpbmUgSU5QVVRfRE1BX01BWF9CVUZTIDMyICAgICAgLyogaGFyZHdhcmUgdGFibGUgbGltaXQgKi8KKyNkZWZpbmUgSU5QVVRfRE1BX0JVRlMgOAorI2RlZmluZSBJTlBVVF9ETUFfU0laRSAoMTI4KjQ3KjIxKQorCisjZGVmaW5lIE9VVFBVVF9ETUFfTUFYX0JVRlMgMzIKKyNkZWZpbmUgT1VUUFVUX0RNQV9CVUZTIDgKKyNkZWZpbmUgT1VUUFVUX0RNQV9TSVpFICgxMjgqNDcqMjEpCisKK3N0cnVjdCBkZGI7CitzdHJ1Y3QgZGRiX3BvcnQ7CisKK3N0cnVjdCBkZGJfaW5wdXQgeworCXN0cnVjdCBkZGJfcG9ydCAgICAgICAqcG9ydDsKKwl1MzIgICAgICAgICAgICAgICAgICAgIG5yOworCWludCAgICAgICAgICAgICAgICAgICAgYXR0YWNoZWQ7CisKKwlkbWFfYWRkcl90ICAgICAgICAgICAgIHBidWZbSU5QVVRfRE1BX01BWF9CVUZTXTsKKwl1OCAgICAgICAgICAgICAgICAgICAgKnZidWZbSU5QVVRfRE1BX01BWF9CVUZTXTsKKwl1MzIgICAgICAgICAgICAgICAgICAgIGRtYV9idWZfbnVtOworCXUzMiAgICAgICAgICAgICAgICAgICAgZG1hX2J1Zl9zaXplOworCisJc3RydWN0IHRhc2tsZXRfc3RydWN0ICB0YXNrbGV0OworCXNwaW5sb2NrX3QgICAgICAgICAgICAgbG9jazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgIHdxOworCWludCAgICAgICAgICAgICAgICAgICAgcnVubmluZzsKKwl1MzIgICAgICAgICAgICAgICAgICAgIHN0YXQ7CisJdTMyICAgICAgICAgICAgICAgICAgICBjYnVmOworCXUzMiAgICAgICAgICAgICAgICAgICAgY29mZjsKKworCXN0cnVjdCBkdmJfYWRhcHRlciAgICAgYWRhcDsKKwlzdHJ1Y3QgZHZiX2RldmljZSAgICAgKmRldjsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kICAgKmZlOworCXN0cnVjdCBkdmJfZnJvbnRlbmQgICAqZmUyOworCXN0cnVjdCBkbXhkZXYgICAgICAgICAgZG14ZGV2OworCXN0cnVjdCBkdmJfZGVtdXggICAgICAgZGVtdXg7CisJc3RydWN0IGR2Yl9uZXQgICAgICAgICBkdmJuZXQ7CisJc3RydWN0IGRteF9mcm9udGVuZCAgICBod19mcm9udGVuZDsKKwlzdHJ1Y3QgZG14X2Zyb250ZW5kICAgIG1lbV9mcm9udGVuZDsKKwlpbnQgICAgICAgICAgICAgICAgICAgIHVzZXJzOworCWludCAoKmdhdGVfY3RybCkoc3RydWN0IGR2Yl9mcm9udGVuZCAqLCBpbnQpOworfTsKKworc3RydWN0IGRkYl9vdXRwdXQgeworCXN0cnVjdCBkZGJfcG9ydCAgICAgICAqcG9ydDsKKwl1MzIgICAgICAgICAgICAgICAgICAgIG5yOworCWRtYV9hZGRyX3QgICAgICAgICAgICAgcGJ1ZltPVVRQVVRfRE1BX01BWF9CVUZTXTsKKwl1OCAgICAgICAgICAgICAgICAgICAgKnZidWZbT1VUUFVUX0RNQV9NQVhfQlVGU107CisJdTMyICAgICAgICAgICAgICAgICAgICBkbWFfYnVmX251bTsKKwl1MzIgICAgICAgICAgICAgICAgICAgIGRtYV9idWZfc2l6ZTsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgIHRhc2tsZXQ7CisJc3BpbmxvY2tfdCAgICAgICAgICAgICBsb2NrOworCXdhaXRfcXVldWVfaGVhZF90ICAgICAgd3E7CisJaW50ICAgICAgICAgICAgICAgICAgICBydW5uaW5nOworCXUzMiAgICAgICAgICAgICAgICAgICAgc3RhdDsKKwl1MzIgICAgICAgICAgICAgICAgICAgIGNidWY7CisJdTMyICAgICAgICAgICAgICAgICAgICBjb2ZmOworCisJc3RydWN0IGR2Yl9hZGFwdGVyICAgICBhZGFwOworCXN0cnVjdCBkdmJfZGV2aWNlICAgICAqZGV2OworfTsKKworc3RydWN0IGRkYl9pMmMgeworCXN0cnVjdCBkZGIgICAgICAgICAgICAqZGV2OworCXUzMiAgICAgICAgICAgICAgICAgICAgbnI7CisJc3RydWN0IGkyY19hZGFwdGVyICAgICBhZGFwOworCXN0cnVjdCBpMmNfYWRhcHRlciAgICAgYWRhcDI7CisJdTMyICAgICAgICAgICAgICAgICAgICByZWdzOworCXUzMiAgICAgICAgICAgICAgICAgICAgcmJ1ZjsKKwl1MzIgICAgICAgICAgICAgICAgICAgIHdidWY7CisJaW50ICAgICAgICAgICAgICAgICAgICBkb25lOworCXdhaXRfcXVldWVfaGVhZF90ICAgICAgd3E7Cit9OworCitzdHJ1Y3QgZGRiX3BvcnQgeworCXN0cnVjdCBkZGIgICAgICAgICAgICAqZGV2OworCXUzMiAgICAgICAgICAgICAgICAgICAgbnI7CisJc3RydWN0IGRkYl9pMmMgICAgICAgICppMmM7CisJc3RydWN0IG11dGV4ICAgICAgICAgICBpMmNfZ2F0ZV9sb2NrOworCXUzMiAgICAgICAgICAgICAgICAgICAgY2xhc3M7CisjZGVmaW5lIEREQl9QT1JUX05PTkUgICAgICAgICAgIDAKKyNkZWZpbmUgRERCX1BPUlRfQ0kgICAgICAgICAgICAgMQorI2RlZmluZSBEREJfUE9SVF9UVU5FUiAgICAgICAgICAyCisJdTMyICAgICAgICAgICAgICAgICAgICB0eXBlOworI2RlZmluZSBEREJfVFVORVJfTk9ORSAgICAgICAgICAwCisjZGVmaW5lIEREQl9UVU5FUl9EVkJTX1NUICAgICAgIDEKKyNkZWZpbmUgRERCX1RVTkVSX0RWQlNfU1RfQUEgICAgMgorI2RlZmluZSBEREJfVFVORVJfRFZCQ1RfVFIgICAgIDE2CisjZGVmaW5lIEREQl9UVU5FUl9EVkJDVF9TVCAgICAgMTcKKwl1MzIgICAgICAgICAgICAgICAgICAgIGFkcjsKKworCXN0cnVjdCBkZGJfaW5wdXQgICAgICAqaW5wdXRbMl07CisJc3RydWN0IGRkYl9vdXRwdXQgICAgICpvdXRwdXQ7CisJc3RydWN0IGR2Yl9jYV9lbjUwMjIxICplbjsKK307CisKK3N0cnVjdCBkZGIgeworCXN0cnVjdCBwY2lfZGV2ICAgICAgICAqcGRldjsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgKnJlZ3M7CisJc3RydWN0IGRkYl9wb3J0ICAgICAgICBwb3J0W0REQl9NQVhfUE9SVF07CisJc3RydWN0IGRkYl9pMmMgICAgICAgICBpMmNbRERCX01BWF9JMkNdOworCXN0cnVjdCBkZGJfaW5wdXQgICAgICAgaW5wdXRbRERCX01BWF9JTlBVVF07CisJc3RydWN0IGRkYl9vdXRwdXQgICAgICBvdXRwdXRbRERCX01BWF9PVVRQVVRdOworCisJc3RydWN0IGRldmljZSAgICAgICAgICpkZGJfZGV2OworCWludCAgICAgICAgICAgICAgICAgICAgbnI7CisJdTggICAgICAgICAgICAgICAgICAgICBpb2J1ZlsxMDI4XTsKKworCXN0cnVjdCBkZGJfaW5mbyAgICAgICAqaW5mbzsKKwlpbnQgICAgICAgICAgICAgICAgICAgIG1zaTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGRkYndyaXRlbChfdmFsLCBfYWRyKSAgICAgICAgd3JpdGVsKChfdmFsKSwgXAorCQkJCSAgICAgKGNoYXIgKikgKGRldi0+cmVncysoX2FkcikpKQorI2RlZmluZSBkZGJyZWFkbChfYWRyKSAgICAgICAgICAgICAgIHJlYWRsKChjaGFyICopIChkZXYtPnJlZ3MrKF9hZHIpKSkKKyNkZWZpbmUgZGRiY3B5dG8oX2FkciwgX3NyYywgX2NvdW50KSBtZW1jcHlfdG9pbygoY2hhciAqKQlcCisJCQkJICAgICAoZGV2LT5yZWdzKyhfYWRyKSksIChfc3JjKSwgKF9jb3VudCkpCisjZGVmaW5lIGRkYmNweWZyb20oX2RzdCwgX2FkciwgX2NvdW50KSBtZW1jcHlfZnJvbWlvKChfZHN0KSwgKGNoYXIgKikgXAorCQkJCSAgICAgICAoZGV2LT5yZWdzKyhfYWRyKSksIChfY291bnQpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL01ha2VmaWxlCmluZGV4IDBiNTE4MjguLjhmMjJiY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL01ha2VmaWxlCkBAIC0yLDggKzIsMTAgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBrZXJuZWwgRFZCIGRldmljZSBkcml2ZXJzLgogIwogCitkdmItbmV0LSQoQ09ORklHX0RWQl9ORVQpIDo9IGR2Yl9uZXQubworCiBkdmItY29yZS1vYmpzIDo9IGR2YmRldi5vIGRteGRldi5vIGR2Yl9kZW11eC5vIGR2Yl9maWx0ZXIubyAJXAogCQkgZHZiX2NhX2VuNTAyMjEubyBkdmJfZnJvbnRlbmQubyAJCVwKLQkJIGR2Yl9uZXQubyBkdmJfcmluZ2J1ZmZlci5vIGR2Yl9tYXRoLm8KKwkJICQoZHZiLW5ldC15KSBkdmJfcmluZ2J1ZmZlci5vIGR2Yl9tYXRoLm8KIAogb2JqLSQoQ09ORklHX0RWQl9DT1JFKSArPSBkdmItY29yZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCmluZGV4IDViNmI0NTEuLmVmZTljMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCkBAIC05MDQsNyArOTA0LDcgQEAKIAkuYnVmZmVyID0gYiBcCiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZHR2X2NtZHNfaCBkdHZfY21kc1tdID0geworc3RhdGljIHN0cnVjdCBkdHZfY21kc19oIGR0dl9jbWRzW0RUVl9NQVhfQ09NTUFORCArIDFdID0gewogCV9EVFZfQ01EKERUVl9UVU5FLCAxLCAwKSwKIAlfRFRWX0NNRChEVFZfQ0xFQVIsIDEsIDApLAogCkBAIC05NjYsNiArOTY2LDcgQEAKIAlfRFRWX0NNRChEVFZfSVNEQlRfTEFZRVJDX1RJTUVfSU5URVJMRUFWSU5HLCAwLCAwKSwKIAogCV9EVFZfQ01EKERUVl9JU0RCU19UU19JRCwgMSwgMCksCisJX0RUVl9DTUQoRFRWX0RWQlQyX1BMUF9JRCwgMSwgMCksCiAKIAkvKiBHZXQgKi8KIAlfRFRWX0NNRChEVFZfRElTRVFDX1NMQVZFX1JFUExZLCAwLCAxKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9uZXQuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9uZXQuaAppbmRleCAzYTMxMjZjYS4uMWU1M2FjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9uZXQuaApAQCAtMzIsNiArMzIsOCBAQAogCiAjZGVmaW5lIERWQl9ORVRfREVWSUNFU19NQVggMTAKIAorI2lmZGVmIENPTkZJR19EVkJfTkVUCisKIHN0cnVjdCBkdmJfbmV0IHsKIAlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXZpY2VbRFZCX05FVF9ERVZJQ0VTX01BWF07CkBAIC00MCw4ICs0MiwyNSBAQAogCXN0cnVjdCBkbXhfZGVtdXggKmRlbXV4OwogfTsKIAotCiB2b2lkIGR2Yl9uZXRfcmVsZWFzZShzdHJ1Y3QgZHZiX25ldCAqKTsKIGludCAgZHZiX25ldF9pbml0KHN0cnVjdCBkdmJfYWRhcHRlciAqLCBzdHJ1Y3QgZHZiX25ldCAqLCBzdHJ1Y3QgZG14X2RlbXV4ICopOwogCisjZWxzZQorCitzdHJ1Y3QgZHZiX25ldCB7CisJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldjsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdmJfbmV0X3JlbGVhc2Uoc3RydWN0IGR2Yl9uZXQgKmR2Ym5ldCkKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgZHZiX25ldF9pbml0KHN0cnVjdCBkdmJfYWRhcHRlciAqYWRhcCwKKwkJCSAgICAgICBzdHJ1Y3QgZHZiX25ldCAqZHZibmV0LCBzdHJ1Y3QgZG14X2RlbXV4ICpkbXgpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBpZmRlZiBDT05GSUdfRFZCX05FVCAqLworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZwppbmRleCBlODUzMDRjLi41ZDczZGVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnCkBAIC04MSw2ICs4MSw3IEBACiAJc2VsZWN0IE1FRElBX1RVTkVSX01UMjI2NiBpZiAhTUVESUFfVFVORVJfQ1VTVE9NSVNFCiAJc2VsZWN0IE1FRElBX1RVTkVSX1hDMjAyOCBpZiAhTUVESUFfVFVORVJfQ1VTVE9NSVNFCiAJc2VsZWN0IE1FRElBX1RVTkVSX1hDNTAwMCBpZiAhTUVESUFfVFVORVJfQ1VTVE9NSVNFCisJc2VsZWN0IE1FRElBX1RVTkVSX1hDNDAwMCBpZiAhTUVESUFfVFVORVJfQ1VTVE9NSVNFCiAJc2VsZWN0IE1FRElBX1RVTkVSX01YTDUwMDdUIGlmICFNRURJQV9UVU5FUl9DVVNUT01JU0UKIAloZWxwCiAJICBTdXBwb3J0IGZvciBVU0IyLjAvMS4xIERWQiByZWNlaXZlcnMgYmFzZWQgb24gdGhlIERpQjA3MDAgVVNCIGJyaWRnZS4gVGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAxNS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuYwppbmRleCAxMDBlYmMzLi5kN2FkMDVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAxNS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDE1LmMKQEAgLTkxLDcgKzkxLDYgQEAKIAljYXNlIEdFVF9DT05GSUc6CiAJY2FzZSBSRUFEX01FTU9SWToKIAljYXNlIFJFQ09OTkVDVF9VU0I6Ci0JY2FzZSBHRVRfSVJfQ09ERToKIAkJd3JpdGUgPSAwOwogCQlicmVhazsKIAljYXNlIFJFQURfSTJDOgpAQCAtMTY0LDEzICsxNjMsNiBAQAogCWRlYl94ZmVyKCI8PDwgIik7CiAJZGVidWdfZHVtcChidWYsIGFjdF9sZW4sIGRlYl94ZmVyKTsKIAotCS8qIHJlbW90ZSBjb250cm9sbGVyIHF1ZXJ5IHN0YXR1cyBpcyAxIGlmIHJlbW90ZSBjb2RlIGlzIG5vdCByZWNlaXZlZCAqLwotCWlmIChyZXEtPmNtZCA9PSBHRVRfSVJfQ09ERSAmJiBidWZbMV0gPT0gMSkgewotCQlidWZbMV0gPSAwOyAvKiBjbGVhciBjb21tYW5kICJlcnJvciIgc3RhdHVzICovCi0JCW1lbXNldCgmYnVmWzJdLCAwLCByZXEtPmRhdGFfbGVuKTsKLQkJYnVmWzNdID0gMTsgLyogbm8gcmVtb3RlIGNvZGUgcmVjZWl2ZWQgbWFyayAqLwotCX0KLQogCS8qIGNoZWNrIHN0YXR1cyAqLwogCWlmIChidWZbMV0pIHsKIAkJZXJyKCJjb21tYW5kIGZhaWxlZDolZCIsIGJ1ZlsxXSk7CkBAIC0yOTIsNiArMjg0LDEwIEBACiAJCX0KIAogCQlpZiAobnVtID4gaSArIDEgJiYgKG1zZ1tpKzFdLmZsYWdzICYgSTJDX01fUkQpKSB7CisJCQlpZiAobXNnW2ldLmxlbiA+IDMgfHwgbXNnW2krMV0ubGVuID4gNjEpIHsKKwkJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCQlnb3RvIGVycm9yOworCQkJfQogCQkJaWYgKG1zZ1tpXS5hZGRyID09CiAJCQkJYWY5MDE1X2FmOTAxM19jb25maWdbMF0uZGVtb2RfYWRkcmVzcykKIAkJCQlyZXEuY21kID0gUkVBRF9NRU1PUlk7CkBAIC0zMDYsMTIgKzMwMiwxNiBAQAogCQkJcmV0ID0gYWY5MDE1X2N0cmxfbXNnKGQsICZyZXEpOwogCQkJaSArPSAyOwogCQl9IGVsc2UgaWYgKG1zZ1tpXS5mbGFncyAmIEkyQ19NX1JEKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJaWYgKG1zZ1tpXS5hZGRyID09Ci0JCQkJYWY5MDE1X2FmOTAxM19jb25maWdbMF0uZGVtb2RfYWRkcmVzcykKKwkJCWlmIChtc2dbaV0ubGVuID4gNjEpIHsKKwkJCQlyZXQgPSAtRU9QTk9UU1VQUDsKIAkJCQlnb3RvIGVycm9yOwotCQkJZWxzZQotCQkJCXJlcS5jbWQgPSBSRUFEX0kyQzsKKwkJCX0KKwkJCWlmIChtc2dbaV0uYWRkciA9PQorCQkJCWFmOTAxNV9hZjkwMTNfY29uZmlnWzBdLmRlbW9kX2FkZHJlc3MpIHsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCQlyZXEuY21kID0gUkVBRF9JMkM7CiAJCQlyZXEuaTJjX2FkZHIgPSBtc2dbaV0uYWRkcjsKIAkJCXJlcS5hZGRyID0gYWRkcjsKIAkJCXJlcS5tYm94ID0gbWJveDsKQEAgLTMyMSw2ICszMjEsMTAgQEAKIAkJCXJldCA9IGFmOTAxNV9jdHJsX21zZyhkLCAmcmVxKTsKIAkJCWkgKz0gMTsKIAkJfSBlbHNlIHsKKwkJCWlmIChtc2dbaV0ubGVuID4gMjEpIHsKKwkJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJCQlnb3RvIGVycm9yOworCQkJfQogCQkJaWYgKG1zZ1tpXS5hZGRyID09CiAJCQkJYWY5MDE1X2FmOTAxM19jb25maWdbMF0uZGVtb2RfYWRkcmVzcykKIAkJCQlyZXEuY21kID0gV1JJVEVfTUVNT1JZOwpAQCAtNzM1LDYgKzczOSw3IEBACiAJeyAweGI4ZmViNzA4LCBSQ19NQVBfTVNJX0RJR0lWT1hfSUkgfSwKIAl7IDB4YTM3MDNkMDAsIFJDX01BUF9BTElOS19EVFVfTSB9LAogCXsgMHg5YjdkYzY0ZSwgUkNfTUFQX1RPVEFMX01FRElBX0lOX0hBTkQgfSwgLyogTVlHSUNUViBVNzE4ICovCisJeyAweDVkNDllM2RiLCBSQ19NQVBfRElHSVRUUkFERSB9LCAvKiBMQy1Qb3dlciBMQy1VU0ItRFZCVCAqLwogCXsgfQogfTsKIApAQCAtNzQ5LDYgKzc1NCw4IEBACiAJCVJDX01BUF9BWlVSRVdBVkVfQURfVFU3MDAgfSwKIAl7IChVU0JfVklEX01TSV8yIDw8IDE2KSArIFVTQl9QSURfTVNJX0RJR0lfVk9YX01JTklfSUlJLAogCQlSQ19NQVBfTVNJX0RJR0lWT1hfSUlJIH0sCisJeyAoVVNCX1ZJRF9NU0lfMiA8PCAxNikgKyBVU0JfUElEX01TSV9ESUdJVk9YX0RVTywKKwkJUkNfTUFQX01TSV9ESUdJVk9YX0lJSSB9LAogCXsgKFVTQl9WSURfTEVBRFRFSyA8PCAxNikgKyBVU0JfUElEX1dJTkZBU1RfRFRWX0RPTkdMRV9HT0xELAogCQlSQ19NQVBfTEVBRFRFS19ZMDRHMDA1MSB9LAogCXsgKFVTQl9WSURfQVZFUk1FRElBIDw8IDE2KSArIFVTQl9QSURfQVZFUk1FRElBX1ZPTEFSX1gsCkBAIC03NTksNiArNzY2LDggQEAKIAkJUkNfTUFQX0RJR0lUQUxOT1dfVElOWVRXSU4gfSwKIAl7IChVU0JfVklEX0dURUsgPDwgMTYpICsgVVNCX1BJRF9USU5ZVFdJTl8zLAogCQlSQ19NQVBfRElHSVRBTE5PV19USU5ZVFdJTiB9LAorCXsgKFVTQl9WSURfS1dPUkxEXzIgPDwgMTYpICsgVVNCX1BJRF9TVkVPTl9TVFYyMiwKKwkJUkNfTUFQX01TSV9ESUdJVk9YX0lJSSB9LAogCXsgfQogfTsKIApAQCAtMTA4Miw0NCArMTA5MSwxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIGluaXQgMm5kIEkyQyBhZGFwdGVyICovCi1zdGF0aWMgaW50IGFmOTAxNV9pMmNfaW5pdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgYWY5MDE1X3N0YXRlICpzdGF0ZSA9IGQtPnByaXY7Ci0JZGViX2luZm8oIiVzOlxuIiwgX19mdW5jX18pOwotCi0Jc3RybmNweShzdGF0ZS0+aTJjX2FkYXAubmFtZSwgZC0+ZGVzYy0+bmFtZSwKLQkJc2l6ZW9mKHN0YXRlLT5pMmNfYWRhcC5uYW1lKSk7Ci0Jc3RhdGUtPmkyY19hZGFwLmFsZ28gICAgICA9IGQtPnByb3BzLmkyY19hbGdvOwotCXN0YXRlLT5pMmNfYWRhcC5hbGdvX2RhdGEgPSBOVUxMOwotCXN0YXRlLT5pMmNfYWRhcC5kZXYucGFyZW50ID0gJmQtPnVkZXYtPmRldjsKLQotCWkyY19zZXRfYWRhcGRhdGEoJnN0YXRlLT5pMmNfYWRhcCwgZCk7Ci0KLQlyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoJnN0YXRlLT5pMmNfYWRhcCk7Ci0JaWYgKHJldCA8IDApCi0JCWVycigiY291bGQgbm90IGFkZCBpMmMgYWRhcHRlciIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQogc3RhdGljIGludCBhZjkwMTVfYWY5MDEzX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewogCWludCByZXQ7Ci0Jc3RydWN0IGFmOTAxNV9zdGF0ZSAqc3RhdGUgPSBhZGFwLT5kZXYtPnByaXY7Ci0Jc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcDsKIAotCWlmIChhZGFwLT5pZCA9PSAwKSB7Ci0JCS8qIHNlbGVjdCBJMkMgYWRhcHRlciAqLwotCQlpMmNfYWRhcCA9ICZhZGFwLT5kZXYtPmkyY19hZGFwOwotCi0JCWRlYl9pbmZvKCIlczogaW5pdCBJMkNcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gYWY5MDE1X2kyY19pbml0KGFkYXAtPmRldik7Ci0JfSBlbHNlIHsKLQkJLyogc2VsZWN0IEkyQyBhZGFwdGVyICovCi0JCWkyY19hZGFwID0gJnN0YXRlLT5pMmNfYWRhcDsKLQorCWlmIChhZGFwLT5pZCA9PSAxKSB7CiAJCS8qIGNvcHkgZmlybXdhcmUgdG8gMm5kIGRlbW9kdWxhdG9yICovCiAJCWlmIChhZjkwMTVfY29uZmlnLmR1YWxfbW9kZSkgewogCQkJcmV0ID0gYWY5MDE1X2NvcHlfZmlybXdhcmUoYWRhcC0+ZGV2KTsKQEAgLTExMzYsNyArMTExMiw3IEBACiAKIAkvKiBhdHRhY2ggZGVtb2R1bGF0b3IgKi8KIAlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goYWY5MDEzX2F0dGFjaCwgJmFmOTAxNV9hZjkwMTNfY29uZmlnW2FkYXAtPmlkXSwKLQkJaTJjX2FkYXApOworCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCk7CiAKIAlyZXR1cm4gYWRhcC0+ZmUgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogfQpAQCAtMTIwNiw1NyArMTE4Miw1NiBAQAogCiBzdGF0aWMgaW50IGFmOTAxNV90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKLQlzdHJ1Y3QgYWY5MDE1X3N0YXRlICpzdGF0ZSA9IGFkYXAtPmRldi0+cHJpdjsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwOwogCWludCByZXQ7CiAJZGViX2luZm8oIiVzOlxuIiwgX19mdW5jX18pOwogCi0JLyogc2VsZWN0IEkyQyBhZGFwdGVyICovCi0JaWYgKGFkYXAtPmlkID09IDApCi0JCWkyY19hZGFwID0gJmFkYXAtPmRldi0+aTJjX2FkYXA7Ci0JZWxzZQotCQlpMmNfYWRhcCA9ICZzdGF0ZS0+aTJjX2FkYXA7Ci0KIAlzd2l0Y2ggKGFmOTAxNV9hZjkwMTNfY29uZmlnW2FkYXAtPmlkXS50dW5lcikgewogCWNhc2UgQUY5MDEzX1RVTkVSX01UMjA2MDoKIAljYXNlIEFGOTAxM19UVU5FUl9NVDIwNjBfMjoKLQkJcmV0ID0gZHZiX2F0dGFjaChtdDIwNjBfYXR0YWNoLCBhZGFwLT5mZSwgaTJjX2FkYXAsCisJCXJldCA9IGR2Yl9hdHRhY2gobXQyMDYwX2F0dGFjaCwgYWRhcC0+ZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJJmFmOTAxNV9tdDIwNjBfY29uZmlnLAogCQkJYWY5MDE1X2NvbmZpZy5tdDIwNjBfaWYxW2FkYXAtPmlkXSkKIAkJCT09IE5VTEwgPyAtRU5PREVWIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBBRjkwMTNfVFVORVJfUVQxMDEwOgogCWNhc2UgQUY5MDEzX1RVTkVSX1FUMTAxMEE6Ci0JCXJldCA9IGR2Yl9hdHRhY2gocXQxMDEwX2F0dGFjaCwgYWRhcC0+ZmUsIGkyY19hZGFwLAorCQlyZXQgPSBkdmJfYXR0YWNoKHF0MTAxMF9hdHRhY2gsIGFkYXAtPmZlLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJCSZhZjkwMTVfcXQxMDEwX2NvbmZpZykgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogCQlicmVhazsKIAljYXNlIEFGOTAxM19UVU5FUl9UREExODI3MToKLQkJcmV0ID0gZHZiX2F0dGFjaCh0ZGExODI3MV9hdHRhY2gsIGFkYXAtPmZlLCAweGMwLCBpMmNfYWRhcCwKKwkJcmV0ID0gZHZiX2F0dGFjaCh0ZGExODI3MV9hdHRhY2gsIGFkYXAtPmZlLCAweGMwLAorCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsCiAJCQkmYWY5MDE1X3RkYTE4MjcxX2NvbmZpZykgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogCQlicmVhazsKIAljYXNlIEFGOTAxM19UVU5FUl9UREExODIxODoKLQkJcmV0ID0gZHZiX2F0dGFjaCh0ZGExODIxOF9hdHRhY2gsIGFkYXAtPmZlLCBpMmNfYWRhcCwKKwkJcmV0ID0gZHZiX2F0dGFjaCh0ZGExODIxOF9hdHRhY2gsIGFkYXAtPmZlLAorCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsCiAJCQkmYWY5MDE1X3RkYTE4MjE4X2NvbmZpZykgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogCQlicmVhazsKIAljYXNlIEFGOTAxM19UVU5FUl9NWEw1MDAzRDoKLQkJcmV0ID0gZHZiX2F0dGFjaChteGw1MDA1c19hdHRhY2gsIGFkYXAtPmZlLCBpMmNfYWRhcCwKKwkJcmV0ID0gZHZiX2F0dGFjaChteGw1MDA1c19hdHRhY2gsIGFkYXAtPmZlLAorCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsCiAJCQkmYWY5MDE1X214bDUwMDNfY29uZmlnKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiAJCWJyZWFrOwogCWNhc2UgQUY5MDEzX1RVTkVSX01YTDUwMDVEOgogCWNhc2UgQUY5MDEzX1RVTkVSX01YTDUwMDVSOgotCQlyZXQgPSBkdmJfYXR0YWNoKG14bDUwMDVzX2F0dGFjaCwgYWRhcC0+ZmUsIGkyY19hZGFwLAorCQlyZXQgPSBkdmJfYXR0YWNoKG14bDUwMDVzX2F0dGFjaCwgYWRhcC0+ZmUsCisJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJCSZhZjkwMTVfbXhsNTAwNV9jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBBRjkwMTNfVFVORVJfRU5WNzdIMTFENToKLQkJcmV0ID0gZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmUsIDB4YzAsIGkyY19hZGFwLAorCQlyZXQgPSBkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZSwgMHhjMCwKKwkJCSZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJRFZCX1BMTF9UREE2NjVYKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiAJCWJyZWFrOwogCWNhc2UgQUY5MDEzX1RVTkVSX01DNDRTODAzOgotCQlyZXQgPSBkdmJfYXR0YWNoKG1jNDRzODAzX2F0dGFjaCwgYWRhcC0+ZmUsIGkyY19hZGFwLAorCQlyZXQgPSBkdmJfYXR0YWNoKG1jNDRzODAzX2F0dGFjaCwgYWRhcC0+ZmUsCisJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJCSZhZjkwMTVfbWM0NHM4MDNfY29uZmlnKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiAJCWJyZWFrOwogCWNhc2UgQUY5MDEzX1RVTkVSX01YTDUwMDdUOgotCQlyZXQgPSBkdmJfYXR0YWNoKG14bDUwMDd0X2F0dGFjaCwgYWRhcC0+ZmUsIGkyY19hZGFwLAorCQlyZXQgPSBkdmJfYXR0YWNoKG14bDUwMDd0X2F0dGFjaCwgYWRhcC0+ZmUsCisJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJCTB4YzAsICZhZjkwMTVfbXhsNTAwN3RfY29uZmlnKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiAJCWJyZWFrOwogCWNhc2UgQUY5MDEzX1RVTkVSX1VOS05PV046CkBAIC0xMzA5LDYgKzEyODQsNyBAQAogCQlVU0JfUElEX1RFUlJBVEVDX0NJTkVSR1lfVF9TVElDS19EVUFMX1JDKX0sCiAvKiAzNSAqL3tVU0JfREVWSUNFKFVTQl9WSURfQVZFUk1FRElBLCBVU0JfUElEX0FWRVJNRURJQV9BODUwVCl9LAogCXtVU0JfREVWSUNFKFVTQl9WSURfR1RFSywgICAgICBVU0JfUElEX1RJTllUV0lOXzMpfSwKKwl7VVNCX0RFVklDRShVU0JfVklEX0tXT1JMRF8yLCAgVVNCX1BJRF9TVkVPTl9TVFYyMil9LAogCXswfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgYWY5MDE1X3VzYl90YWJsZSk7CkBAIC0xNTAyLDcgKzE0NzgsNyBAQAogCiAJCS5pMmNfYWxnbyA9ICZhZjkwMTVfaTJjX2FsZ28sCiAKLQkJLm51bV9kZXZpY2VfZGVzY3MgPSA5LCAvKiBjaGVjayBtYXggZnJvbSBkdmItdXNiLmggKi8KKwkJLm51bV9kZXZpY2VfZGVzY3MgPSAxMCwgLyogY2hlY2sgbWF4IGZyb20gZHZiLXVzYi5oICovCiAJCS5kZXZpY2VzID0gewogCQkJewogCQkJCS5uYW1lID0gIlh0ZW5zaW9ucyBYRC0zODAiLApAQCAtMTU1NCw2ICsxNTMwLDExIEBACiAJCQkJLmNvbGRfaWRzID0geyZhZjkwMTVfdXNiX3RhYmxlWzIwXSwgTlVMTH0sCiAJCQkJLndhcm1faWRzID0ge05VTEx9LAogCQkJfSwKKwkJCXsKKwkJCQkubmFtZSA9ICJTdmVvbiBTVFYyMiBEdWFsIFVTQiBEVkItVCBUdW5lciBIRFRWIiwKKwkJCQkuY29sZF9pZHMgPSB7JmFmOTAxNV91c2JfdGFibGVbMzddLCBOVUxMfSwKKwkJCQkud2FybV9pZHMgPSB7TlVMTH0sCisJCQl9LAogCQl9CiAJfSwgewogCQkuY2FwcyA9IERWQl9VU0JfSVNfQU5fSTJDX0FEQVBURVIsCkBAIC0xNzA0LDMzICsxNjg1LDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgYWY5MDE1X2kyY19leGl0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKLXsKLQlzdHJ1Y3QgYWY5MDE1X3N0YXRlICpzdGF0ZSA9IGQtPnByaXY7Ci0JZGViX2luZm8oIiVzOlxuIiwgX19mdW5jX18pOwotCi0JLyogcmVtb3ZlIDJuZCBJMkMgYWRhcHRlciAqLwotCWlmIChkLT5zdGF0ZSAmIERWQl9VU0JfU1RBVEVfSTJDKQotCQlpMmNfZGVsX2FkYXB0ZXIoJnN0YXRlLT5pMmNfYWRhcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFmOTAxNV91c2JfZGV2aWNlX2V4aXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCi17Ci0Jc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKLQlkZWJfaW5mbygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiByZW1vdmUgMm5kIEkyQyBhZGFwdGVyICovCi0JaWYgKGQgIT0gTlVMTCAmJiBkLT5kZXNjICE9IE5VTEwpCi0JCWFmOTAxNV9pMmNfZXhpdChkKTsKLQotCWR2Yl91c2JfZGV2aWNlX2V4aXQoaW50Zik7Ci19Ci0KIC8qIHVzYiBzcGVjaWZpYyBvYmplY3QgbmVlZGVkIHRvIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIHVzYiBzdWJzeXN0ZW0gKi8KIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBhZjkwMTVfdXNiX2RyaXZlciA9IHsKIAkubmFtZSA9ICJkdmJfdXNiX2FmOTAxNSIsCiAJLnByb2JlID0gYWY5MDE1X3VzYl9wcm9iZSwKLQkuZGlzY29ubmVjdCA9IGFmOTAxNV91c2JfZGV2aWNlX2V4aXQsCisJLmRpc2Nvbm5lY3QgPSBkdmJfdXNiX2RldmljZV9leGl0LAogCS5pZF90YWJsZSA9IGFmOTAxNV91c2JfdGFibGUsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAxNS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuaAppbmRleCBiZWIzMDA0Li42MjUyZWE2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAxNS5oCkBAIC05OSw3ICs5OSw2IEBACiB9OwogCiBzdHJ1Y3QgYWY5MDE1X3N0YXRlIHsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgaTJjX2FkYXA7IC8qIEkyQyBhZGFwdGVyIGZvciAybmQgRkUgKi8KIAl1OCByY19yZXBlYXQ7CiAJdTMyIHJjX2tleWNvZGU7CiAJdTggcmNfbGFzdFs0XTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5jCmluZGV4IDdjMzI3YjUuLjJjYmYxOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuYwpAQCAtMzQ3LDE1ICszNDcsMTcgQEAKICAqIFBDQjogPwogICogcGFydHM6IEROT1M0MDRaSDEwMkEoTVQzNTIsIERUVDc1NzkoPykpCiAgKgotICogRTMwIFZJRD0wNGI0IFBJRD04NjFmIEhXPTIgRlc9Mi4xIFByb2R1Y3Q9Pz8/Pz8/Pz8KLSAqIFBDQjogPworICogRTMwIFZJRD0wNGI0IFBJRD04NjFmIEhXPTIgRlc9Mi4xICJhbnlzZWUtVChMUCkiCisgKiBQQ0I6IFBDQiA1MDdUIChyZXYxLjYxKQogICogcGFydHM6IEROT1M0MDRaSDEwM0EoWkwxMDM1MywgRFRUNzU3OSg/KSkKKyAqIE9FQT0wYSBPRUI9MDAgT0VDPTAwIE9FRD1mZiBPRUU9MDAKKyAqIElPQT00NSBJT0I9ZmYgSU9DPTAwIElPRD1mZiBJT0U9MDAKICAqCiAgKiBFMzAgUGx1cyBWSUQ9MDRiNCBQSUQ9ODYxZiBIVz02IEZXPTEuMCAiYW55c2VlIgogICogUENCOiA1MDdDRCAocmV2MS4xKQogICogcGFydHM6IEROT1M0MDRaSDEwM0EoWkwxMDM1MywgRFRUNzU3OSg/KSksIENTVDU2STAxCi0gKiBPRUE9ODAgT0VCPTAwIE9FQz0wMCBPRUQ9ZmYgT0VGPWZlCi0gKiBJT0E9NGYgSU9CPWZmIElPQz0wMCBJT0Q9MDYgSU9GPTAxCisgKiBPRUE9ODAgT0VCPTAwIE9FQz0wMCBPRUQ9ZmYgT0VFPWZlCisgKiBJT0E9NGYgSU9CPWZmIElPQz0wMCBJT0Q9MDYgSU9FPTAxCiAgKiBJT0RbMF0gWkwxMDM1MyAxPWVuYWJsZWQKICAqIElPQVs3XSBUUyAwPWVuYWJsZWQKICAqIHR1bmVyIGlzIG5vdCBiZWhpbmQgWkwxMDM1MyBJMkMtZ2F0ZSAobm8gY2FyZSBpZiBnYXRlIGRpc2FibGVkIG9yIG5vdCkKQEAgLTM2MywzMCArMzY1LDMwIEBACiAgKiBFMzAgQyBQbHVzIFZJRD0wNGI0IFBJRD04NjFmIEhXPTEwIEZXPTEuMCAiYW55c2VlLURDKExQKSIKICAqIFBDQjogNTA3REMgKHJldjAuMikKICAqIHBhcnRzOiBUREExMDAyMywgRFRPUzQwM0lIMTAyQiBUTSwgQ1NUNTZJMDEKLSAqIE9FQT04MCBPRUI9MDAgT0VDPTAwIE9FRD1mZiBPRUY9ZmUKLSAqIElPQT00ZiBJT0I9ZmYgSU9DPTAwIElPRD0yNiBJT0Y9MDEKKyAqIE9FQT04MCBPRUI9MDAgT0VDPTAwIE9FRD1mZiBPRUU9ZmUKKyAqIElPQT00ZiBJT0I9ZmYgSU9DPTAwIElPRD0yNiBJT0U9MDEKICAqIElPRFswXSBUREExMDAyMyAxPWVuYWJsZWQKICAqCiAgKiBFMzAgUzIgUGx1cyBWSUQ9MDRiNCBQSUQ9ODYxZiBIVz0xMSBGVz0wLjEgImFueXNlZS1TMihMUCkiCiAgKiBQQ0I6IDUwN1NJIChyZXYyLjEpCiAgKiBwYXJ0czogQlMyTjEwV0NDMDEoQ1gyNDExNiwgQ1gyNDExOCksIElTTDY0MjMsIFREQTgwMjQKLSAqIE9FQT04MCBPRUI9MDAgT0VDPWZmIE9FRD1mZiBPRUY9ZmUKLSAqIElPQT00ZCBJT0I9ZmYgSU9DPTAwIElPRD0yNiBJT0Y9MDEKKyAqIE9FQT04MCBPRUI9MDAgT0VDPWZmIE9FRD1mZiBPRUU9ZmUKKyAqIElPQT00ZCBJT0I9ZmYgSU9DPTAwIElPRD0yNiBJT0U9MDEKICAqIElPRFswXSBDWDI0MTE2IDE9ZW5hYmxlZAogICoKICAqIEUzMCBDIFBsdXMgVklEPTFjNzMgUElEPTg2MWYgSFc9MTUgRlc9MS4yICJhbnlzZWUtRkEoTFApIgogICogUENCOiA1MDdGQSAocmV2MC40KQogICogcGFydHM6IFREQTEwMDIzLCBEVE9TNDAzSUgxMDJCIFRNLCBUREE4MDI0Ci0gKiBPRUE9ODAgT0VCPTAwIE9FQz1mZiBPRUQ9ZmYgT0VGPWZmCi0gKiBJT0E9NGQgSU9CPWZmIElPQz0wMCBJT0Q9MDAgSU9GPWMwCisgKiBPRUE9ODAgT0VCPTAwIE9FQz1mZiBPRUQ9ZmYgT0VFPWZmCisgKiBJT0E9NGQgSU9CPWZmIElPQz0wMCBJT0Q9MDAgSU9FPWMwCiAgKiBJT0RbNV0gVERBMTAwMjMgMT1lbmFibGVkCiAgKiBJT0VbMF0gdHVuZXIgMT1lbmFibGVkCiAgKgogICogRTMwIENvbWJvIFBsdXMgVklEPTFjNzMgUElEPTg2MWYgSFc9MTUgRlc9MS4yICJhbnlzZWUtRkEoTFApIgogICogUENCOiA1MDdGQSAocmV2MS4xKQogICogcGFydHM6IFpMMTAzNTMsIFREQTEwMDIzLCBEVE9TNDAzSUgxMDJCIFRNLCBUREE4MDI0Ci0gKiBPRUE9ODAgT0VCPTAwIE9FQz1mZiBPRUQ9ZmYgT0VGPWZmCi0gKiBJT0E9NGQgSU9CPWZmIElPQz0wMCBJT0Q9MDAgSU9GPWMwCisgKiBPRUE9ODAgT0VCPTAwIE9FQz1mZiBPRUQ9ZmYgT0VFPWZmCisgKiBJT0E9NGQgSU9CPWZmIElPQz0wMCBJT0Q9MDAgSU9FPWMwCiAgKiBEVkItQzoKICAqIElPRFs1XSBUREExMDAyMyAxPWVuYWJsZWQKICAqIElPRVswXSB0dW5lciAxPWVuYWJsZWQKQEAgLTM5OCw4ICs0MDAsOCBAQAogICogRTcgVEMgVklEPTFjNzMgUElEPTg2MWYgSFc9MTggRlc9MC43IEFNVENJPTAuNSAiYW55c2VlLUU3VEMoTFApIgogICogUENCOiA1MDhUQyAocmV2MC42KQogICogcGFydHM6IFpMMTAzNTMsIFREQTEwMDIzLCBETk9ENDRDREgwODZBKFREQTE4MjEyKQotICogT0VBPTgwIE9FQj0wMCBPRUM9MDMgT0VEPWY3IE9FRj1mZgotICogSU9BPTRkIElPQj0wMCBJT0M9Y2MgSU9EPTQ4IElPRj1lNAorICogT0VBPTgwIE9FQj0wMCBPRUM9MDMgT0VEPWY3IE9FRT1mZgorICogSU9BPTRkIElPQj0wMCBJT0M9Y2MgSU9EPTQ4IElPRT1lNAogICogSU9BWzddIFRTIDE9ZW5hYmxlZAogICogSU9FWzRdIFREQTE4MjEyIDE9ZW5hYmxlZAogICogRFZCLUM6CkBAIC00MTQsMTEgKzQxNiwzNCBAQAogICogRTcgUzIgVklEPTFjNzMgUElEPTg2MWYgSFc9MTkgRlc9MC40IEFNVENJPTAuNSAiYW55c2VlLUU3UzIoTFApIgogICogUENCOiA1MDhTMiAocmV2MC43KQogICogcGFydHM6IEROQlUxMDUxMklTVChTVFYwOTAzLCBTVFY2MTEwKSwgSVNMNjQyMwotICogT0VBPTgwIE9FQj0wMCBPRUM9MDMgT0VEPWY3IE9FRj1mZgotICogSU9BPTRkIElPQj0wMCBJT0M9YzQgSU9EPTA4IElPRj1lNAorICogT0VBPTgwIE9FQj0wMCBPRUM9MDMgT0VEPWY3IE9FRT1mZgorICogSU9BPTRkIElPQj0wMCBJT0M9YzQgSU9EPTA4IElPRT1lNAogICogSU9BWzddIFRTIDE9ZW5hYmxlZAogICogSU9FWzVdIFNUVjA5MDMgMT1lbmFibGVkCiAgKgorICogRTcgUFRDIFZJRD0xYzczIFBJRD04NjFmIEhXPTIxIEZXPTAuMSBBTVRDST0/PyAiYW55c2VlLUU3UFRDKExQKSIKKyAqIFBDQjogNTA4UFRDIChyZXYwLjUpCisgKiBwYXJ0czogWkwxMDM1MywgVERBMTAwMjMsIEROT0Q0NENESDA4NkEoVERBMTgyMTIpCisgKiBPRUE9ODAgT0VCPTAwIE9FQz0wMyBPRUQ9ZjcgT0VFPWZmCisgKiBJT0E9NGQgSU9CPTAwIElPQz1jYyBJT0Q9NDggSU9FPWU0CisgKiBJT0FbN10gVFMgMT1lbmFibGVkCisgKiBJT0VbNF0gVERBMTgyMTIgMT1lbmFibGVkCisgKiBEVkItQzoKKyAqIElPRFs2XSBaTDEwMzUzIDA9ZGlzYWJsZWQKKyAqIElPRFs1XSBUREExMDAyMyAxPWVuYWJsZWQKKyAqIElPRVswXSBJRiAxPWVuYWJsZWQKKyAqIERWQi1UOgorICogSU9EWzVdIFREQTEwMDIzIDA9ZGlzYWJsZWQKKyAqIElPRFs2XSBaTDEwMzUzIDE9ZW5hYmxlZAorICogSU9FWzBdIElGIDA9ZW5hYmxlZAorICoKKyAqIEU3IFMyIFZJRD0xYzczIFBJRD04NjFmIEhXPTIyIEZXPTAuMSBBTVRDST0/PyAiYW55c2VlLUU3UFMyKExQKSIKKyAqIFBDQjogNTA4UFMyIChyZXYwLjQpCisgKiBwYXJ0czogRE5CVTEwNTEySVNUKFNUVjA5MDMsIFNUVjYxMTApLCBJU0w2NDIzCisgKiBPRUE9ODAgT0VCPTAwIE9FQz0wMyBPRUQ9ZjcgT0VFPWZmCisgKiBJT0E9NGQgSU9CPTAwIElPQz1jNCBJT0Q9MDggSU9FPWU0CisgKiBJT0FbN10gVFMgMT1lbmFibGVkCisgKiBJT0VbNV0gU1RWMDkwMyAxPWVuYWJsZWQKICAqLwogCiBzdGF0aWMgaW50IGFueXNlZV9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKQEAgLTQ1OSw3ICs0ODQsNyBAQAogCXN0YXRlLT5odyA9IGh3X2luZm9bMF07CiAKIAlzd2l0Y2ggKHN0YXRlLT5odykgewotCWNhc2UgQU5ZU0VFX0hXXzAyOiAvKiAyICovCisJY2FzZSBBTllTRUVfSFdfNTA3VDogLyogMiAqLwogCQkvKiBFMzAgKi8KIAogCQkvKiBhdHRhY2ggZGVtb2QgKi8KQEAgLTU5Myw3ICs2MTgsOSBAQAogCiAJCWJyZWFrOwogCWNhc2UgQU5ZU0VFX0hXXzUwOFRDOiAvKiAxOCAqLworCWNhc2UgQU5ZU0VFX0hXXzUwOFBUQzogLyogMjEgKi8KIAkJLyogRTcgVEMgKi8KKwkJLyogRTcgUFRDICovCiAKIAkJLyogZW5hYmxlIHRyYW5zcG9ydCBzdHJlYW0gb24gSU9BWzddICovCiAJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0EsICgxIDw8IDcpLCAweDgwKTsKQEAgLTY1MCw3ICs2NzcsOSBAQAogCiAJCWJyZWFrOwogCWNhc2UgQU5ZU0VFX0hXXzUwOFMyOiAvKiAxOSAqLworCWNhc2UgQU5ZU0VFX0hXXzUwOFBTMjogLyogMjIgKi8KIAkJLyogRTcgUzIgKi8KKwkJLyogRTcgUFMyICovCiAKIAkJLyogZW5hYmxlIHRyYW5zcG9ydCBzdHJlYW0gb24gSU9BWzddICovCiAJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0EsICgxIDw8IDcpLCAweDgwKTsKQEAgLTY4Nyw3ICs3MTYsNyBAQAogCWRlYl9pbmZvKCIlczpcbiIsIF9fZnVuY19fKTsKIAogCXN3aXRjaCAoc3RhdGUtPmh3KSB7Ci0JY2FzZSBBTllTRUVfSFdfMDI6IC8qIDIgKi8KKwljYXNlIEFOWVNFRV9IV181MDdUOiAvKiAyICovCiAJCS8qIEUzMCAqLwogCiAJCS8qIGF0dGFjaCB0dW5lciAqLwpAQCAtNzYyLDcgKzc5MSw5IEBACiAKIAkJYnJlYWs7CiAJY2FzZSBBTllTRUVfSFdfNTA4VEM6IC8qIDE4ICovCisJY2FzZSBBTllTRUVfSFdfNTA4UFRDOiAvKiAyMSAqLwogCQkvKiBFNyBUQyAqLworCQkvKiBFNyBQVEMgKi8KIAogCQkvKiBlbmFibGUgdHVuZXIgb24gSU9FWzRdICovCiAJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0UsICgxIDw8IDQpLCAweDEwKTsKQEAgLTc3NSw3ICs4MDYsOSBAQAogCiAJCWJyZWFrOwogCWNhc2UgQU5ZU0VFX0hXXzUwOFMyOiAvKiAxOSAqLworCWNhc2UgQU5ZU0VFX0hXXzUwOFBTMjogLyogMjIgKi8KIAkJLyogRTcgUzIgKi8KKwkJLyogRTcgUFMyICovCiAKIAkJLyogYXR0YWNoIHR1bmVyICovCiAJCWZlID0gZHZiX2F0dGFjaChzdHY2MTEwX2F0dGFjaCwgYWRhcC0+ZmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuaAppbmRleCBhNzY3M2FhLi5hZDZjY2QxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmgKQEAgLTYxLDEzICs2MSwxNSBAQAogCXU4IHNlcTsKIH07CiAKLSNkZWZpbmUgQU5ZU0VFX0hXXzAyICAgICAyIC8qIEUzMCAqLwotI2RlZmluZSBBTllTRUVfSFdfNTA3Q0QgIDYgLyogRTMwIFBsdXMgKi8KLSNkZWZpbmUgQU5ZU0VFX0hXXzUwN0RDIDEwIC8qIEUzMCBDIFBsdXMgKi8KLSNkZWZpbmUgQU5ZU0VFX0hXXzUwN1NJIDExIC8qIEUzMCBTMiBQbHVzICovCi0jZGVmaW5lIEFOWVNFRV9IV181MDdGQSAxNSAvKiBFMzAgQ29tYm8gUGx1cyAvIEUzMCBDIFBsdXMgKi8KLSNkZWZpbmUgQU5ZU0VFX0hXXzUwOFRDIDE4IC8qIEU3IFRDICovCi0jZGVmaW5lIEFOWVNFRV9IV181MDhTMiAxOSAvKiBFNyBTMiAqLworI2RlZmluZSBBTllTRUVfSFdfNTA3VCAgICAyIC8qIEUzMCAqLworI2RlZmluZSBBTllTRUVfSFdfNTA3Q0QgICA2IC8qIEUzMCBQbHVzICovCisjZGVmaW5lIEFOWVNFRV9IV181MDdEQyAgMTAgLyogRTMwIEMgUGx1cyAqLworI2RlZmluZSBBTllTRUVfSFdfNTA3U0kgIDExIC8qIEUzMCBTMiBQbHVzICovCisjZGVmaW5lIEFOWVNFRV9IV181MDdGQSAgMTUgLyogRTMwIENvbWJvIFBsdXMgLyBFMzAgQyBQbHVzICovCisjZGVmaW5lIEFOWVNFRV9IV181MDhUQyAgMTggLyogRTcgVEMgKi8KKyNkZWZpbmUgQU5ZU0VFX0hXXzUwOFMyICAxOSAvKiBFNyBTMiAqLworI2RlZmluZSBBTllTRUVfSFdfNTA4UFRDIDIxIC8qIEU3IFBUQyBQbHVzICovCisjZGVmaW5lIEFOWVNFRV9IV181MDhQUzIgMjIgLyogRTcgUFMyIFBsdXMgKi8KIAogI2RlZmluZSBSRUdfSU9BICAgICAgIDB4ODAgLyogUG9ydCBBIChiaXQgYWRkcmVzc2FibGUpICovCiAjZGVmaW5lIFJFR19JT0IgICAgICAgMHg5MCAvKiBQb3J0IEIgKGJpdCBhZGRyZXNzYWJsZSkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9kZXZpY2VzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDBfZGV2aWNlcy5jCmluZGV4IGM1MTlhZDUuLmQwZWE1YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9kZXZpY2VzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwX2RldmljZXMuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgIm10MjI2Ni5oIgogI2luY2x1ZGUgInR1bmVyLXhjMjAyOC5oIgogI2luY2x1ZGUgInhjNTAwMC5oIgorI2luY2x1ZGUgInhjNDAwMC5oIgogI2luY2x1ZGUgInM1aDE0MTEuaCIKICNpbmNsdWRlICJkaWIwMDcwLmgiCiAjaW5jbHVkZSAiZGliMDA5MC5oIgpAQCAtMjY1NSw2ICsyNjU2LDE1NiBAQAogCQk9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKK3N0YXRpYyBpbnQgZGliMDcwMF94YzQwMDBfdHVuZXJfY2FsbGJhY2sodm9pZCAqcHJpdiwgaW50IGNvbXBvbmVudCwKKwkJCQkJIGludCBjb21tYW5kLCBpbnQgYXJnKQoreworCXN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXAgPSBwcml2OworCisJaWYgKGNvbW1hbmQgPT0gWEM0MDAwX1RVTkVSX1JFU0VUKSB7CisJCS8qIFJlc2V0IHRoZSB0dW5lciAqLworCQlkaWI3MDAwcF9zZXRfZ3BpbyhhZGFwLT5mZSwgOCwgMCwgMCk7CisJCW1zbGVlcCgxMCk7CisJCWRpYjcwMDBwX3NldF9ncGlvKGFkYXAtPmZlLCA4LCAwLCAxKTsKKwl9IGVsc2UgeworCQllcnIoInhjNDAwMDogdW5rbm93biB0dW5lciBjYWxsYmFjayBjb21tYW5kOiAlZFxuIiwgY29tbWFuZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRpYngwMDBfYWdjX2NvbmZpZyBzdGs3NzAwcF83MDAwcF94YzQwMDBfYWdjX2NvbmZpZyA9IHsKKwkuYmFuZF9jYXBzID0gQkFORF9VSEYgfCBCQU5EX1ZIRiwKKwkuc2V0dXAgPSAweDY0LAorCS5pbnZfZ2FpbiA9IDB4MDJjOCwKKwkudGltZV9zdGFiaWxpeiA9IDB4MTUsCisJLmFscGhhX2xldmVsID0gMHgwMCwKKwkudGhsb2NrID0gMHg3NiwKKwkud2JkX2ludiA9IDB4MDEsCisJLndiZF9yZWYgPSAweDBiMzMsCisJLndiZF9zZWwgPSAweDAwLAorCS53YmRfYWxwaGEgPSAweDAyLAorCS5hZ2MxX21heCA9IDB4MDAsCisJLmFnYzFfbWluID0gMHgwMCwKKwkuYWdjMl9tYXggPSAweDliMjYsCisJLmFnYzJfbWluID0gMHgyNmNhLAorCS5hZ2MxX3B0MSA9IDB4MDAsCisJLmFnYzFfcHQyID0gMHgwMCwKKwkuYWdjMV9wdDMgPSAweDAwLAorCS5hZ2MxX3Nsb3BlMSA9IDB4MDAsCisJLmFnYzFfc2xvcGUyID0gMHgwMCwKKwkuYWdjMl9wdDEgPSAweDAwLAorCS5hZ2MyX3B0MiA9IDB4ODAsCisJLmFnYzJfc2xvcGUxID0gMHgxZCwKKwkuYWdjMl9zbG9wZTIgPSAweDFkLAorCS5hbHBoYV9tYW50ID0gMHgxMSwKKwkuYWxwaGFfZXhwID0gMHgxYiwKKwkuYmV0YV9tYW50ID0gMHgxNywKKwkuYmV0YV9leHAgPSAweDMzLAorCS5wZXJmb3JtX2FnY19zb2Z0c3BsaXQgPSAweDAwLAorfTsKKworc3RhdGljIHN0cnVjdCBkaWJ4MDAwX2JhbmR3aWR0aF9jb25maWcgc3RrNzcwMHBfeGM0MDAwX3BsbF9jb25maWcgPSB7CisJNjAwMDAsIDMwMDAwLAkvKiBpbnRlcm5hbCwgc2FtcGxpbmcgKi8KKwkxLCA4LCAzLCAxLCAwLAkvKiBwbGxfY2ZnOiBwcmVkaXYsIHJhdGlvLCByYW5nZSwgcmVzZXQsIGJ5cGFzcyAqLworCTAsIDAsIDEsIDEsIDAsCS8qIG1pc2M6IHJlZmRpdiwgYnlwY2xrX2RpdiwgSU9fQ0xLX2VuX2NvcmUsICovCisJCQkvKiBBRENsa1NyYywgbW9kdWxvICovCisJKDMgPDwgMTQpIHwgKDEgPDwgMTIpIHwgNTI0LAkvKiBzYWRfY2ZnOiByZWZzZWwsIHNlbCwgZnJlcV8xNWsgKi8KKwkzOTM3MDUzNCwJLyogaWZyZXEgKi8KKwkyMDQ1MjIyNSwJLyogdGltZiAqLworCTMwMDAwMDAwCS8qIHh0YWwgKi8KK307CisKKy8qIEZJWE1FOiBub25lIG9mIHRoZXNlIGlucHV0cyBhcmUgdmFsaWRhdGVkIHlldCAqLworc3RhdGljIHN0cnVjdCBkaWI3MDAwcF9jb25maWcgcGN0dl8zNDBlX2NvbmZpZyA9IHsKKwkub3V0cHV0X21wZWcyX2luXzE4OF9ieXRlcyA9IDEsCisKKwkuYWdjX2NvbmZpZ19jb3VudCA9IDEsCisJLmFnYyA9ICZzdGs3NzAwcF83MDAwcF94YzQwMDBfYWdjX2NvbmZpZywKKwkuYncgID0gJnN0azc3MDBwX3hjNDAwMF9wbGxfY29uZmlnLAorCisJLmdwaW9fZGlyID0gRElCNzAwME1fR1BJT19ERUZBVUxUX0RJUkVDVElPTlMsCisJLmdwaW9fdmFsID0gRElCNzAwME1fR1BJT19ERUZBVUxUX1ZBTFVFUywKKwkuZ3Bpb19wd21fcG9zID0gRElCNzAwME1fR1BJT19ERUZBVUxUX1BXTV9QT1MsCit9OworCisvKiBQQ1RWIDM0MGUgR1BJT3MgbWFwOgorICAgZGliMDcwMDoKKyAgIEdQSU8yICAtIENYMjU4NDMgc2xlZXAKKyAgIEdQSU8zICAtIENTNTM0MCByZXNldAorICAgR1BJTzUgIC0gSVJECisgICBHUElPNiAgLSBQb3dlciBTdXBwbHkKKyAgIEdQSU84ICAtIExOQSAoMT1vZmYgMD1vbikKKyAgIEdQSU8xMCAtIENYMjU4NDMgcmVzZXQKKyAgIGRpYjcwMDA6CisgICBHUElPOCAgLSB4YzQwMDAgcmVzZXQKKyAqLworc3RhdGljIGludCBwY3R2MzQwZV9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgZGliMDcwMF9zdGF0ZSAqc3QgPSBhZGFwLT5kZXYtPnByaXY7CisKKwkvKiBQb3dlciBTdXBwbHkgb24gKi8KKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzYsICBHUElPX09VVCwgMCk7CisJbXNsZWVwKDUwKTsKKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzYsICBHUElPX09VVCwgMSk7CisJbXNsZWVwKDEwMCk7IC8qIEFsbG93IHBvd2VyIHN1cHBseSB0byBzZXR0bGUgYmVmb3JlIHByb2JpbmcgKi8KKworCS8qIGN4MjU4NDMgcmVzZXQgKi8KKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzEwLCAgR1BJT19PVVQsIDApOworCW1zbGVlcCgxKTsgLyogY3gyNTg0MyBkYXRhc2hlZXQgc2F5IDM1MHVzIHJlcXVpcmVkICovCisJZGliMDcwMF9zZXRfZ3BpbyhhZGFwLT5kZXYsIEdQSU8xMCwgIEdQSU9fT1VULCAxKTsKKworCS8qIExOQSBvZmYgZm9yIG5vdyAqLworCWRpYjA3MDBfc2V0X2dwaW8oYWRhcC0+ZGV2LCBHUElPOCwgIEdQSU9fT1VULCAxKTsKKworCS8qIFB1dCB0aGUgQ1gyNTg0MyB0byBzbGVlcCBmb3Igbm93IHNpbmNlIHdlJ3JlIGluIGRpZ2l0YWwgbW9kZSAqLworCWRpYjA3MDBfc2V0X2dwaW8oYWRhcC0+ZGV2LCBHUElPMiwgR1BJT19PVVQsIDEpOworCisJLyogRklYTUU6IG5vdCB2ZXJpZmllZCB5ZXQgKi8KKwlkaWIwNzAwX2N0cmxfY2xvY2soYWRhcC0+ZGV2LCA3MiwgMSk7CisKKwltc2xlZXAoNTAwKTsKKworCWlmIChkaWI3MDAwcGNfZGV0ZWN0aW9uKCZhZGFwLT5kZXYtPmkyY19hZGFwKSA9PSAwKSB7CisJCS8qIERlbW9kdWxhdG9yIG5vdCBmb3VuZCBmb3Igc29tZSByZWFzb24/ICovCisJCXJldHVybiAtRU5PREVWOworCX0KKworCWFkYXAtPmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDEyLAorCQkJICAgICAgJnBjdHZfMzQwZV9jb25maWcpOworCXN0LT5pc19kaWI3MDAwcGMgPSAxOworCisJcmV0dXJuIGFkYXAtPmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKK30KKworc3RhdGljIHN0cnVjdCB4YzQwMDBfY29uZmlnIGRpYjcwMDBwX3hjNDAwMF90dW5lcmNvbmZpZyA9IHsKKwkuaTJjX2FkZHJlc3MJICA9IDB4NjEsCisJLmRlZmF1bHRfcG0JICA9IDEsCisJLmR2Yl9hbXBsaXR1ZGUJICA9IDAsCisJLnNldF9zbW9vdGhlZGN2YnMgPSAwLAorCS5pZl9raHoJCSAgPSA1NDAwCit9OworCitzdGF0aWMgaW50IHhjNDAwMF90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKnR1bl9pMmM7CisKKwkvKiBUaGUgeGM0MDAwIGlzIG5vdCBvbiB0aGUgbWFpbiBpMmMgYnVzICovCisJdHVuX2kyYyA9IGRpYjcwMDBwX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlLAorCQkJCQkgIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9UVU5FUiwgMSk7CisJaWYgKHR1bl9pMmMgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCByZWFjaCB0dW5lciBpMmMgYnVzXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogU2V0dXAgdGhlIHJlc2V0IGNhbGxiYWNrICovCisJYWRhcC0+ZmUtPmNhbGxiYWNrID0gZGliMDcwMF94YzQwMDBfdHVuZXJfY2FsbGJhY2s7CisKKwlyZXR1cm4gZHZiX2F0dGFjaCh4YzQwMDBfYXR0YWNoLCBhZGFwLT5mZSwgdHVuX2kyYywKKwkJCSAgJmRpYjcwMDBwX3hjNDAwMF90dW5lcmNvbmZpZykKKwkJPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworfQorCiBzdGF0aWMgc3RydWN0IGxnZHQzMzA1X2NvbmZpZyBoY3dfbGdkdDMzMDVfY29uZmlnID0gewogCS5pMmNfYWRkciAgICAgICAgICAgPSAweDBlLAogCS5tcGVnX21vZGUgICAgICAgICAgPSBMR0RUMzMwNV9NUEVHX1BBUkFMTEVMLApAQCAtMjgwMiw2ICsyOTUzLDggQEAKIAl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9ESUJDT00sICAgIFVTQl9QSURfRElCQ09NX1RGRTcwOTBQVlIpIH0sCiAJeyBVU0JfREVWSUNFKFVTQl9WSURfVEVDSE5JU0FULCBVU0JfUElEX1RFQ0hOSVNBVF9BSVJTVEFSX1RFTEVTVElDS18yKSB9LAogLyogNzUgKi97IFVTQl9ERVZJQ0UoVVNCX1ZJRF9NRURJT04sICAgIFVTQl9QSURfQ1JFQVRJWF9DVFgxOTIxKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVklEX1BJTk5BQ0xFLCAgVVNCX1BJRF9QSU5OQUNMRV9QQ1RWMzQwRSkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9QSU5OQUNMRSwgIFVTQl9QSURfUElOTkFDTEVfUENUVjM0MEVfU0UpIH0sCiAJeyAwIH0JCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGRpYjA3MDBfdXNiX2lkX3RhYmxlKTsKQEAgLTM3NzIsNiArMzkyNSw0MSBAQAogCQkJCQkgICAgUkNfVFlQRV9ORUMsCiAJCQkuY2hhbmdlX3Byb3RvY29sICA9IGRpYjA3MDBfY2hhbmdlX3Byb3RvY29sLAogCQl9LAorCX0sIHsgRElCMDcwMF9ERUZBVUxUX0RFVklDRV9QUk9QRVJUSUVTLAorCQkubnVtX2FkYXB0ZXJzID0gMSwKKwkJLmFkYXB0ZXIgPSB7CisJCQl7CisJCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBwY3R2MzQwZV9mcm9udGVuZF9hdHRhY2gsCisJCQkJLnR1bmVyX2F0dGFjaCAgICAgPSB4YzQwMDBfdHVuZXJfYXR0YWNoLAorCisJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMiksCisKKwkJCQkuc2l6ZV9vZl9wcml2ID0gc2l6ZW9mKHN0cnVjdAorCQkJCQkJZGliMDcwMF9hZGFwdGVyX3N0YXRlKSwKKwkJCX0sCisJCX0sCisKKwkJLm51bV9kZXZpY2VfZGVzY3MgPSAyLAorCQkuZGV2aWNlcyA9IHsKKwkJCXsgICAiUGlubmFjbGUgUENUViAzNDBlIEhEIFBybyBVU0IgU3RpY2siLAorCQkJCXsgJmRpYjA3MDBfdXNiX2lkX3RhYmxlWzc2XSwgTlVMTCB9LAorCQkJCXsgTlVMTCB9LAorCQkJfSwKKwkJCXsgICAiUGlubmFjbGUgUENUViBIeWJyaWQgU3RpY2sgU29sbyIsCisJCQkJeyAmZGliMDcwMF91c2JfaWRfdGFibGVbNzddLCBOVUxMIH0sCisJCQkJeyBOVUxMIH0sCisJCQl9LAorCQl9LAorCQkucmMuY29yZSA9IHsKKwkJCS5yY19pbnRlcnZhbCAgICAgID0gREVGQVVMVF9SQ19JTlRFUlZBTCwKKwkJCS5yY19jb2RlcyAgICAgICAgID0gUkNfTUFQX0RJQjA3MDBfUkM1X1RBQkxFLAorCQkJLm1vZHVsZV9uYW1lCSAgPSAiZGliMDcwMCIsCisJCQkucmNfcXVlcnkgICAgICAgICA9IGRpYjA3MDBfcmNfcXVlcnlfb2xkX2Zpcm13YXJlLAorCQkJLmFsbG93ZWRfcHJvdG9zICAgPSBSQ19UWVBFX1JDNSB8CisJCQkJCSAgICBSQ19UWVBFX1JDNiB8CisJCQkJCSAgICBSQ19UWVBFX05FQywKKwkJCS5jaGFuZ2VfcHJvdG9jb2wgID0gZGliMDcwMF9jaGFuZ2VfcHJvdG9jb2wsCisJCX0sCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaAppbmRleCAyMWIxNTQ5Li4yYTc5YjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oCkBAIC0yMzAsNiArMjMwLDggQEAKICNkZWZpbmUgVVNCX1BJRF9QSU5OQUNMRV9QQ1RWMzEwRQkJCTB4MzIxMQogI2RlZmluZSBVU0JfUElEX1BJTk5BQ0xFX1BDVFY4MDFFCQkJMHgwMjNhCiAjZGVmaW5lIFVTQl9QSURfUElOTkFDTEVfUENUVjgwMUVfU0UJCQkweDAyM2IKKyNkZWZpbmUgVVNCX1BJRF9QSU5OQUNMRV9QQ1RWMzQwRQkJCTB4MDIzZAorI2RlZmluZSBVU0JfUElEX1BJTk5BQ0xFX1BDVFYzNDBFX1NFCQkJMHgwMjNlCiAjZGVmaW5lIFVTQl9QSURfUElOTkFDTEVfUENUVjczQQkJCTB4MDI0MwogI2RlZmluZSBVU0JfUElEX1BJTk5BQ0xFX1BDVFY3M0VTRQkJCTB4MDI0NQogI2RlZmluZSBVU0JfUElEX1BJTk5BQ0xFX1BDVFY3NEUJCQkweDAyNDYKQEAgLTMxMyw2ICszMTUsNyBAQAogI2RlZmluZSBVU0JfUElEX0ZSSUlPX1dISVRFCQkJCTB4MDAwMQogI2RlZmluZSBVU0JfUElEX1RWV0FZX1BMVVMJCQkJMHgwMDAyCiAjZGVmaW5lIFVTQl9QSURfU1ZFT05fU1RWMjAJCQkJMHhlMzlkCisjZGVmaW5lIFVTQl9QSURfU1ZFT05fU1RWMjIJCQkJMHhlNDAxCiAjZGVmaW5lIFVTQl9QSURfQVpVUkVXQVZFX0FaNjAyNwkJCTB4MzI3NQogI2RlZmluZSBVU0JfUElEX1RFUlJBVEVDX0RWQlMyQ0lfVjEJCQkweDEwYTQKICNkZWZpbmUgVVNCX1BJRF9URVJSQVRFQ19EVkJTMkNJX1YyCQkJMHgxMGFjCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCmluZGV4IDc2YTgwOTYuLjdkMzVkMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCkBAIC04NSw3ICs4NSw3IEBACiAJcmV0dXJuIGtleS0+c2NhbmNvZGUgJiAweGZmOwogfQogCi1zdGF0aWMgaW5saW5lIHU4IHJjNV9zY2FuKHN0cnVjdCByY19tYXBfdGFibGUgKmtleSkKK3N0YXRpYyBpbmxpbmUgdTE2IHJjNV9zY2FuKHN0cnVjdCByY19tYXBfdGFibGUgKmtleSkKIHsKIAlyZXR1cm4ga2V5LT5zY2FuY29kZSAmIDB4ZmZmZjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay5oCmluZGV4IDgzMTc0OWEuLmVkMzJiOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ncDhwc2suaApAQCAtNzgsOSArNzgsNiBAQAogI2RlZmluZSBBRFZfTU9EX0RWQl9CUFNLIDkgICAgIC8qIERWQi1TIEJQU0sgKi8KIAogI2RlZmluZSBHRVRfVVNCX1NQRUVEICAgICAgICAgICAgICAgICAgICAgMHgwNwotICNkZWZpbmUgVVNCX1NQRUVEX0xPVyAgICAgICAgICAgICAgICAgICAgMAotICNkZWZpbmUgVVNCX1NQRUVEX0ZVTEwgICAgICAgICAgICAgICAgICAgMQotICNkZWZpbmUgVVNCX1NQRUVEX0hJR0ggICAgICAgICAgICAgICAgICAgMgogCiAjZGVmaW5lIFJFU0VUX0ZYMiAgICAgICAgICAgICAgICAgICAgICAgICAweDEzCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdGVjaG5pc2F0LXVzYjIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdGVjaG5pc2F0LXVzYjIuYwppbmRleCAwOGY4ODQyLi40NzNiOTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3RlY2huaXNhdC11c2IyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi90ZWNobmlzYXQtdXNiMi5jCkBAIC03NjUsMTAgKzc2NSw4IEBACiAJLyogd29yayBhbmQgc3R1ZmYgd2FzIG9ubHkgY3JlYXRlZCB3aGVuIHRoZSBkZXZpY2UgaXMgaXMgaG90LXN0YXRlICovCiAJaWYgKGRldiAhPSBOVUxMKSB7CiAJCXN0cnVjdCB0ZWNobmlzYXRfdXNiMl9zdGF0ZSAqc3RhdGUgPSBkZXYtPnByaXY7Ci0JCWlmIChzdGF0ZSAhPSBOVUxMKSB7CisJCWlmIChzdGF0ZSAhPSBOVUxMKQogCQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZzdGF0ZS0+Z3JlZW5fbGVkX3dvcmspOwotCQkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKLQkJfQogCX0KIAogCWR2Yl91c2JfZGV2aWNlX2V4aXQoaW50Zik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUuaAppbmRleCA5Njk2ODhmLi5jZjVlYzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LmgKQEAgLTM2LDkgKzM2LDYgQEAKICAjZGVmaW5lIFR1bmVyX1Bvd2VyX09GRiAgICAgICAgICAgICAgICAgIDAKIAogI2RlZmluZSBHRVRfVVNCX1NQRUVEICAgICAgICAgICAgICAgICAgICAgMHgwNwotICNkZWZpbmUgVVNCX1NQRUVEX0xPVyAgICAgICAgICAgICAgICAgICAgMAotICNkZWZpbmUgVVNCX1NQRUVEX0ZVTEwgICAgICAgICAgICAgICAgICAgMQotICNkZWZpbmUgVVNCX1NQRUVEX0hJR0ggICAgICAgICAgICAgICAgICAgMgogCiAjZGVmaW5lIExPQ0tfVFVORVJfQ09NTUFORCAgICAgICAgICAgICAgICAweDA5CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2ZpcmV3aXJlL2ZpcmVkdHYtYXZjLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9maXJlZHR2LWF2Yy5jCmluZGV4IDIxYzUyZTMuLjQ4OWFlODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2ZpcmV3aXJlL2ZpcmVkdHYtYXZjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZmlyZXdpcmUvZmlyZWR0di1hdmMuYwpAQCAtMTIwOCw3ICsxMjA4LDcgQEAKIAlpZiAoci0+cmVzcG9uc2UgIT0gQVZDX1JFU1BPTlNFX0FDQ0VQVEVEKSB7CiAJCWRldl9lcnIoZmR0di0+ZGV2aWNlLAogCQkJIkNBIFBNVCBmYWlsZWQgd2l0aCByZXNwb25zZSAweCV4XG4iLCByLT5yZXNwb25zZSk7Ci0JCXJldCA9IC1FRkFVTFQ7CisJCXJldCA9IC1FQUNDRVM7CiAJfQogb3V0OgogCW11dGV4X3VubG9jaygmZmR0di0+YXZjX211dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2ZpcmV3aXJlL2ZpcmVkdHYtY2kuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2ZpcmV3aXJlL2ZpcmVkdHYtY2kuYwppbmRleCA4ZmZiNTY1Li5lNWViZGJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9maXJlZHR2LWNpLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZmlyZXdpcmUvZmlyZWR0di1jaS5jCkBAIC00NSwxMSArNDUsNiBAQAogCXJldHVybiBmbGFnczsKIH0KIAotc3RhdGljIGludCBmZHR2X2NhX3Jlc2V0KHN0cnVjdCBmaXJlZHR2ICpmZHR2KQotewotCXJldHVybiBhdmNfY2FfcmVzZXQoZmR0dikgPyAtRUZBVUxUIDogMDsKLX0KLQogc3RhdGljIGludCBmZHR2X2NhX2dldF9jYXBzKHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgY2FfY2FwcyAqY2FwID0gYXJnOwpAQCAtNjUsMTIgKzYwLDE0IEBACiB7CiAJc3RydWN0IGZpcmVkdHZfdHVuZXJfc3RhdHVzIHN0YXQ7CiAJc3RydWN0IGNhX3Nsb3RfaW5mbyAqc2xvdCA9IGFyZzsKKwlpbnQgZXJyOwogCi0JaWYgKGF2Y190dW5lcl9zdGF0dXMoZmR0diwgJnN0YXQpKQotCQlyZXR1cm4gLUVGQVVMVDsKKwllcnIgPSBhdmNfdHVuZXJfc3RhdHVzKGZkdHYsICZzdGF0KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJaWYgKHNsb3QtPm51bSAhPSAwKQotCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIC1FQUNDRVM7CiAKIAlzbG90LT50eXBlID0gQ0FfQ0k7CiAJc2xvdC0+ZmxhZ3MgPSBmZHR2X2dldF9jYV9mbGFncygmc3RhdCk7CkBAIC04MSwyMSArNzgsMjEgQEAKIHsKIAlzdHJ1Y3QgY2FfbXNnICpyZXBseSA9IGFyZzsKIAotCXJldHVybiBhdmNfY2FfYXBwX2luZm8oZmR0diwgcmVwbHktPm1zZywgJnJlcGx5LT5sZW5ndGgpID8gLUVGQVVMVCA6IDA7CisJcmV0dXJuIGF2Y19jYV9hcHBfaW5mbyhmZHR2LCByZXBseS0+bXNnLCAmcmVwbHktPmxlbmd0aCk7CiB9CiAKIHN0YXRpYyBpbnQgZmR0dl9jYV9pbmZvKHN0cnVjdCBmaXJlZHR2ICpmZHR2LCB2b2lkICphcmcpCiB7CiAJc3RydWN0IGNhX21zZyAqcmVwbHkgPSBhcmc7CiAKLQlyZXR1cm4gYXZjX2NhX2luZm8oZmR0diwgcmVwbHktPm1zZywgJnJlcGx5LT5sZW5ndGgpID8gLUVGQVVMVCA6IDA7CisJcmV0dXJuIGF2Y19jYV9pbmZvKGZkdHYsIHJlcGx5LT5tc2csICZyZXBseS0+bGVuZ3RoKTsKIH0KIAogc3RhdGljIGludCBmZHR2X2NhX2dldF9tbWkoc3RydWN0IGZpcmVkdHYgKmZkdHYsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgY2FfbXNnICpyZXBseSA9IGFyZzsKIAotCXJldHVybiBhdmNfY2FfZ2V0X21taShmZHR2LCByZXBseS0+bXNnLCAmcmVwbHktPmxlbmd0aCkgPyAtRUZBVUxUIDogMDsKKwlyZXR1cm4gYXZjX2NhX2dldF9tbWkoZmR0diwgcmVwbHktPm1zZywgJnJlcGx5LT5sZW5ndGgpOwogfQogCiBzdGF0aWMgaW50IGZkdHZfY2FfZ2V0X21zZyhzdHJ1Y3QgZmlyZWR0diAqZmR0diwgdm9pZCAqYXJnKQpAQCAtMTExLDE0ICsxMDgsMTUgQEAKIAkJZXJyID0gZmR0dl9jYV9pbmZvKGZkdHYsIGFyZyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWlmIChhdmNfdHVuZXJfc3RhdHVzKGZkdHYsICZzdGF0KSkKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCWVsc2UgaWYgKHN0YXQuY2FfbW1pID09IDEpCisJCWVyciA9IGF2Y190dW5lcl9zdGF0dXMoZmR0diwgJnN0YXQpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJCWlmIChzdGF0LmNhX21taSA9PSAxKQogCQkJZXJyID0gZmR0dl9jYV9nZXRfbW1pKGZkdHYsIGFyZyk7CiAJCWVsc2UgewogCQkJZGV2X2luZm8oZmR0di0+ZGV2aWNlLCAidW5oYW5kbGVkIENBIG1lc3NhZ2UgMHglMDh4XG4iLAogCQkJCSBmZHR2LT5jYV9sYXN0X2NvbW1hbmQpOwotCQkJZXJyID0gLUVGQVVMVDsKKwkJCWVyciA9IC1FQUNDRVM7CiAJCX0KIAl9CiAJZmR0di0+Y2FfbGFzdF9jb21tYW5kID0gMDsKQEAgLTE0MSw3ICsxMzksNyBAQAogCQlkYXRhX2xlbmd0aCA9IG1zZy0+bXNnWzNdOwogCX0KIAotCXJldHVybiBhdmNfY2FfcG10KGZkdHYsICZtc2ctPm1zZ1tkYXRhX3Bvc10sIGRhdGFfbGVuZ3RoKSA/IC1FRkFVTFQgOiAwOworCXJldHVybiBhdmNfY2FfcG10KGZkdHYsICZtc2ctPm1zZ1tkYXRhX3Bvc10sIGRhdGFfbGVuZ3RoKTsKIH0KIAogc3RhdGljIGludCBmZHR2X2NhX3NlbmRfbXNnKHN0cnVjdCBmaXJlZHR2ICpmZHR2LCB2b2lkICphcmcpCkBAIC0xNzAsNyArMTY4LDcgQEAKIAlkZWZhdWx0OgogCQlkZXZfZXJyKGZkdHYtPmRldmljZSwgInVuaGFuZGxlZCBDQSBtZXNzYWdlIDB4JTA4eFxuIiwKIAkJCWZkdHYtPmNhX2xhc3RfY29tbWFuZCk7Ci0JCWVyciA9IC1FRkFVTFQ7CisJCWVyciA9IC1FQUNDRVM7CiAJfQogCXJldHVybiBlcnI7CiB9CkBAIC0xODQsNyArMTgyLDcgQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBDQV9SRVNFVDoKLQkJZXJyID0gZmR0dl9jYV9yZXNldChmZHR2KTsKKwkJZXJyID0gYXZjX2NhX3Jlc2V0KGZkdHYpOwogCQlicmVhazsKIAljYXNlIENBX0dFVF9DQVA6CiAJCWVyciA9IGZkdHZfY2FfZ2V0X2NhcHMoYXJnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKaW5kZXggNDRiODE2Zi4uMzJlMDhlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKQEAgLTQ5LDYgKzQ5LDI3IEBACiAJaGVscAogCSAgQSBTaWxpY29uIHR1bmVyIHRoYXQgc3VwcG9ydHMgRFZCLVMgYW5kIERWQi1TMiBtb2RlcwogCitjb21tZW50ICJNdWx0aXN0YW5kYXJkIChjYWJsZSArIHRlcnJlc3RyaWFsKSBmcm9udGVuZHMiCisJZGVwZW5kcyBvbiBEVkJfQ09SRQorCitjb25maWcgRFZCX0RSWEsKKwl0cmlzdGF0ZSAiTWljcm9uYXMgRFJYSyBiYXNlZCIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIEkyQworCWRlZmF1bHQgbSBpZiBEVkJfRkVfQ1VTVE9NSVNFCisJaGVscAorCSAgTWljcm9uYXMgRFJYLUsgRFZCLUMvVCBkZW1vZHVsYXRvci4KKworCSAgU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCisKK2NvbmZpZyBEVkJfVERBMTgyNzFDMkRECisJdHJpc3RhdGUgIk5YUCBUREExODI3MUMyIHNpbGljb24gdHVuZXIiCisJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBJMkMKKwlkZWZhdWx0IG0gaWYgRFZCX0ZFX0NVU1RPTUlTRQorCWhlbHAKKwkgIE5YUCBUREExODI3MSBzaWxpY29uIHR1bmVyLgorCisJICBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyB0dW5lci4KKwogY29tbWVudCAiRFZCLVMgKHNhdGVsbGl0ZSkgZnJvbnRlbmRzIgogCWRlcGVuZHMgb24gRFZCX0NPUkUKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlCmluZGV4IDJmM2E2ZjcuLjZhNmJhMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUKQEAgLTEwLDYgKzEwLDcgQEAKIGF1ODUyMi1vYmpzID0gYXU4NTIyX2RpZy5vIGF1ODUyMl9kZWNvZGVyLm8KIGRyeGQtb2JqcyA9IGRyeGRfZmlybS5vIGRyeGRfaGFyZC5vCiBjeGQyODIwci1vYmpzID0gY3hkMjgyMHJfY29yZS5vIGN4ZDI4MjByX2MubyBjeGQyODIwcl90Lm8gY3hkMjgyMHJfdDIubworZHJ4ay1vYmpzIDo9IGRyeGtfaGFyZC5vCiAKIG9iai0kKENPTkZJR19EVkJfUExMKSArPSBkdmItcGxsLm8KIG9iai0kKENPTkZJR19EVkJfU1RWMDI5OSkgKz0gc3R2MDI5OS5vCkBAIC04OCw0ICs4OSw2IEBACiBvYmotJChDT05GSUdfRFZCX0lYMjUwNVYpICs9IGl4MjUwNXYubwogb2JqLSQoQ09ORklHX0RWQl9TVFYwMzY3KSArPSBzdHYwMzY3Lm8KIG9iai0kKENPTkZJR19EVkJfQ1hEMjgyMFIpICs9IGN4ZDI4MjByLm8KK29iai0kKENPTkZJR19EVkJfRFJYSykgKz0gZHJ4ay5vCitvYmotJChDT05GSUdfRFZCX1REQTE4MjcxQzJERCkgKz0gdGRhMTgyNzFjMmRkLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2F1ODUyMl9kZWNvZGVyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYXU4NTIyX2RlY29kZXIuYwppbmRleCBiNTM3ODkxLi4yYjI0OGMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYXU4NTIyX2RlY29kZXIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYXU4NTIyX2RlY29kZXIuYwpAQCAtNjkyLDcgKzY5Miw3IEBACiAJLyogSW50ZXJyb2dhdGUgdGhlIGRlY29kZXIgdG8gc2VlIGlmIHdlIGFyZSBnZXR0aW5nIGEgcmVhbCBzaWduYWwgKi8KIAlsb2NrX3N0YXR1cyA9IGF1ODUyMl9yZWFkcmVnKHN0YXRlLCAweDAwKTsKIAlpZiAobG9ja19zdGF0dXMgPT0gMHhhMikKLQkJdnQtPnNpZ25hbCA9IDB4MDE7CisJCXZ0LT5zaWduYWwgPSAweGZmZmY7CiAJZWxzZQogCQl2dC0+c2lnbmFsID0gMHgwMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEzLmMKaW5kZXggZTllZTU1NS4uYzM0MWQ1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMy5jCkBAIC0zMSw4ICszMSw4IEBACiAKIHN0YXRpYyBpbnQgZGVidWc7CiAKLSNkZWZpbmUgaW5mbyhhcmdzLi4uKSBkbyB7IHByaW50ayhLRVJOX0lORk8gIkNYMjQxMTM6ICIgYXJncyk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGVycihhcmdzLi4uKSAgZG8geyBwcmludGsoS0VSTl9FUlIgICJDWDI0MTEzOiAiIGFyZ3MpOyB9IHdoaWxlICgwKQorI2RlZmluZSBjeF9pbmZvKGFyZ3MuLi4pIGRvIHsgcHJpbnRrKEtFUk5fSU5GTyAiQ1gyNDExMzogIiBhcmdzKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgY3hfZXJyKGFyZ3MuLi4pICBkbyB7IHByaW50ayhLRVJOX0VSUiAgIkNYMjQxMTM6ICIgYXJncyk7IH0gd2hpbGUgKDApCiAKICNkZWZpbmUgZHByaW50ayhhcmdzLi4uKSBcCiAJZG8geyBcCkBAIC0zNDEsNyArMzQxLDcgQEAKIAl9IHdoaWxlIChOIDwgNiAmJiBSIDwgMyk7CiAKIAlpZiAoTiA8IDYpIHsKLQkJZXJyKCJzdHJhbmdlIGZyZXF1ZW5jeTogTiA8IDZcbiIpOworCQljeF9lcnIoInN0cmFuZ2UgZnJlcXVlbmN5OiBOIDwgNlxuIik7CiAJCXJldHVybjsKIAl9CiAJRiA9IGZyZXFfaHo7CkBAIC01NjMsNyArNTYzLDcgQEAKIAkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGN4MjQxMTNfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpbnQgcmM7CiAJaWYgKHN0YXRlID09IE5VTEwpIHsKLQkJZXJyKCJVbmFibGUgdG8ga3phbGxvY1xuIik7CisJCWN4X2VycigiVW5hYmxlIHRvIGt6YWxsb2NcbiIpOwogCQlnb3RvIGVycm9yOwogCX0KIApAQCAtNTcxLDcgKzU3MSw3IEBACiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdGF0ZS0+aTJjID0gaTJjOwogCi0JaW5mbygidHJ5aW5nIHRvIGRldGVjdCBteXNlbGZcbiIpOworCWN4X2luZm8oInRyeWluZyB0byBkZXRlY3QgbXlzZWxmXG4iKTsKIAogCS8qIG1ha2luZyBhIGR1bW15IHJlYWQsIGJlY2F1c2Ugb2Ygc29tZSBleHBlY3RlZCB0cm91YmxlcwogCSAqIGFmdGVyIHBvd2VyIG9uICovCkBAIC01NzksMjQgKzU3OSwyNCBAQAogCiAJcmMgPSBjeDI0MTEzX3JlYWRyZWcoc3RhdGUsIDB4MDApOwogCWlmIChyYyA8IDApIHsKLQkJaW5mbygiQ1gyNDExMyBub3QgZm91bmQuXG4iKTsKKwkJY3hfaW5mbygiQ1gyNDExMyBub3QgZm91bmQuXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CiAJc3RhdGUtPnJldiA9IHJjOwogCiAJc3dpdGNoIChyYykgewogCWNhc2UgMHg0MzoKLQkJaW5mbygiZGV0ZWN0ZWQgQ1gyNDExMyB2YXJpYW50XG4iKTsKKwkJY3hfaW5mbygiZGV0ZWN0ZWQgQ1gyNDExMyB2YXJpYW50XG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBSRVZfQ1gyNDExMzoKLQkJaW5mbygic3VjY2Vzc2Z1bGx5IGRldGVjdGVkXG4iKTsKKwkJY3hfaW5mbygic3VjY2Vzc2Z1bGx5IGRldGVjdGVkXG4iKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZXJyKCJ1bnN1cHBvcnRlZCBkZXZpY2UgaWQ6ICV4XG4iLCBzdGF0ZS0+cmV2KTsKKwkJY3hfZXJyKCJ1bnN1cHBvcnRlZCBkZXZpY2UgaWQ6ICV4XG4iLCBzdGF0ZS0+cmV2KTsKIAkJZ290byBlcnJvcjsKIAl9CiAJc3RhdGUtPnZlciA9IGN4MjQxMTNfcmVhZHJlZyhzdGF0ZSwgMHgwMSk7Ci0JaW5mbygidmVyc2lvbjogJXhcbiIsIHN0YXRlLT52ZXIpOworCWN4X2luZm8oInZlcnNpb246ICV4XG4iLCBzdGF0ZS0+dmVyKTsKIAogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KIAltZW1jcHkoJmZlLT5vcHMudHVuZXJfb3BzLCAmY3gyNDExM190dW5lcl9vcHMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExNi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTYuYwppbmRleCA5NWM2NDY1Li5jY2QwNTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExNi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTE2LmMKQEAgLTE0NTIsMTEgKzE0NTIsNyBAQAogCWNtZC5hcmdzWzB4MDBdID0gQ01EX0JBTkRXSURUSDsKIAljbWQuYXJnc1sweDAxXSA9IDB4MDA7CiAJY21kLmxlbiA9IDB4MDI7Ci0JcmV0ID0gY3gyNDExNl9jbWRfZXhlY3V0ZShmZSwgJmNtZCk7Ci0JaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gY3gyNDExNl9jbWRfZXhlY3V0ZShmZSwgJmNtZCk7CiB9CiAKIHN0YXRpYyBpbnQgY3gyNDExNl90dW5lKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwci5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByLmgKaW5kZXggYWQxNzg0NS4uMjkwNjU4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByLmgKQEAgLTU1LDEzICs1NSwxMyBAQAogCSAqIERlZmF1bHQ6IDAKIAkgKiBWYWx1ZXM6IDAsIDEKIAkgKi8KLQlpbnQgaWZfYWdjX3BvbGFyaXR5OjE7CisJYm9vbCBpZl9hZ2NfcG9sYXJpdHk7CiAKIAkvKiBTcGVjdHJ1bSBpbnZlcnNpb24uCiAJICogRGVmYXVsdDogMAogCSAqIFZhbHVlczogMCwgMQogCSAqLwotCWludCBzcGVjX2ludjoxOworCWJvb2wgc3BlY19pbnY7CiAKIAkvKiBJRnMgZm9yIGFsbCB1c2VkIG1vZGVzLgogCSAqIERlZmF1bHQ6IG5vbmUsIG11c3Qgc2V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfY29yZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByX2NvcmUuYwppbmRleCAwNzc5ZjY5Li5kNDE2ZTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl9jb3JlLmMKQEAgLTMxNCw2ICszMTQsOCBAQAogCQkJfSBlbHNlIGlmIChjLT5kZWxpdmVyeV9zeXN0ZW0gPT0gU1lTX0RWQlQyKSB7CiAJCQkJLyogRFZCLVQgPT4gRFZCLVQyICovCiAJCQkJcmV0ID0gY3hkMjgyMHJfc2xlZXBfdChmZSk7CisJCQkJaWYgKHJldCkKKwkJCQkJYnJlYWs7CiAJCQkJcmV0ID0gY3hkMjgyMHJfc2V0X2Zyb250ZW5kX3QyKGZlLCBwKTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMzI0LDYgKzMyNiw4IEBACiAJCQl9IGVsc2UgaWYgKGMtPmRlbGl2ZXJ5X3N5c3RlbSA9PSBTWVNfRFZCVCkgewogCQkJCS8qIERWQi1UMiA9PiBEVkItVCAqLwogCQkJCXJldCA9IGN4ZDI4MjByX3NsZWVwX3QyKGZlKTsKKwkJCQlpZiAocmV0KQorCQkJCQlicmVhazsKIAkJCQlyZXQgPSBjeGQyODIwcl9zZXRfZnJvbnRlbmRfdChmZSwgcCk7CiAJCQl9CiAJCQlicmVhazsKQEAgLTc0MCwxMiArNzQ0LDEzIEBACiAJc3RydWN0IGkyY19tc2cgbXNnW10sIGludCBudW0pCiB7CiAJc3RydWN0IGN4ZDI4MjByX3ByaXYgKnByaXYgPSBpMmNfZ2V0X2FkYXBkYXRhKGkyY19hZGFwKTsKLQl1OCBvYnVmW21zZ1swXS5sZW4gKyAyXTsKKwlpbnQgcmV0OworCXU4ICpvYnVmID0ga21hbGxvYyhtc2dbMF0ubGVuICsgMiwgR0ZQX0tFUk5FTCk7CiAJc3RydWN0IGkyY19tc2cgbXNnMlsyXSA9IHsKIAkJewogCQkJLmFkZHIgPSBwcml2LT5jZmcuaTJjX2FkZHJlc3MsCiAJCQkuZmxhZ3MgPSAwLAotCQkJLmxlbiA9IHNpemVvZihvYnVmKSwKKwkJCS5sZW4gPSBtc2dbMF0ubGVuICsgMiwKIAkJCS5idWYgPSBvYnVmLAogCQl9LCB7CiAJCQkuYWRkciA9IHByaXYtPmNmZy5pMmNfYWRkcmVzcywKQEAgLTc1NSwxNSArNzYwLDI0IEBACiAJCX0KIAl9OwogCisJaWYgKCFvYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCW9idWZbMF0gPSAweDA5OwogCW9idWZbMV0gPSAobXNnWzBdLmFkZHIgPDwgMSk7CiAJaWYgKG51bSA9PSAyKSB7IC8qIEkyQyByZWFkICovCiAJCW9idWZbMV0gPSAobXNnWzBdLmFkZHIgPDwgMSkgfCBJMkNfTV9SRDsgLyogSTJDIFJEIGZsYWcgKi8KLQkJbXNnMlswXS5sZW4gPSBzaXplb2Yob2J1ZikgLSAxOyAvKiBtYXliZSBIVyBidWcgPyAqLworCQltc2cyWzBdLmxlbiA9IG1zZ1swXS5sZW4gKyAyIC0gMTsgLyogJy0xJyBtYXliZSBIVyBidWcgPyAqLwogCX0KIAltZW1jcHkoJm9idWZbMl0sIG1zZ1swXS5idWYsIG1zZ1swXS5sZW4pOwogCi0JcmV0dXJuIGkyY190cmFuc2Zlcihwcml2LT5pMmMsIG1zZzIsIG51bSk7CisJcmV0ID0gaTJjX3RyYW5zZmVyKHByaXYtPmkyYywgbXNnMiwgbnVtKTsKKwlpZiAocmV0IDwgMCkKKwkJd2FybigidHVuZXIgaTJjIGZhaWxlZCByZXQ6JWQiLCByZXQpOworCisJa2ZyZWUob2J1Zik7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gY3hkMjgyMHJfdHVuZXJfaTJjX2FsZ28gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfcHJpdi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByX3ByaXYuaAppbmRleCAyNWFkYmVlLi4wYzBlYmM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfcHJpdi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl9wcml2LmgKQEAgLTU1LDEzICs1NSwxMyBAQAogCXN0cnVjdCBtdXRleCBmZV9sb2NrOyAvKsKgRkUgbG9jayAqLwogCWludCBhY3RpdmVfZmU6MjsgLyogRkUgbG9jaywgLTE9Tk9ORSwgMD1EVkItVC9UMiwgMT1EVkItQyAqLwogCi0JaW50IGJlcl9ydW5uaW5nOjE7CisJYm9vbCBiZXJfcnVubmluZzsKIAogCXU4IGJhbmtbMl07CiAJdTggZ3Bpb1szXTsKIAogCWZlX2RlbGl2ZXJ5X3N5c3RlbV90IGRlbGl2ZXJ5X3N5c3RlbTsKLQlpbnQgbGFzdF90dW5lX2ZhaWxlZDoxOyAvKiBmb3Igc3dpdGNoIGJldHdlZW4gVCBhbmQgVDIgdHVuZSAqLworCWJvb2wgbGFzdF90dW5lX2ZhaWxlZDsgLyogZm9yIHN3aXRjaCBiZXR3ZWVuIFQgYW5kIFQyIHR1bmUgKi8KIH07CiAKIC8qIGN4ZDI4MjByX2NvcmUuYyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMHAuYwppbmRleCAwYzlmNDBjLi5hNjRhNTM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMHAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMHAuYwpAQCAtMjMzNiw2ICsyMzM2LDExIEBACiAJCXJlcXVlc3RfZmlybXdhcmUoKSB3aWxsIGhpdCBhbiBPT1BTICh0aGlzIHNob3VsZCBiZSBtb3ZlZCBzb21ld2hlcmUKIAkJbW9yZSBjb21tb24pICovCiAKKwkvKiBGSVhNRTogbWFrZSBzdXJlIHRoZSBkZXYucGFyZW50IGZpZWxkIGlzIGluaXRpYWxpemVkLCBvciBlbHNlCisJICAgcmVxdWVzdF9maXJtd2FyZSgpIHdpbGwgaGl0IGFuIE9PUFMgKHRoaXMgc2hvdWxkIGJlIG1vdmVkIHNvbWV3aGVyZQorCSAgIG1vcmUgY29tbW9uKSAqLworCXN0LT5pMmNfbWFzdGVyLmdhdGVkX3R1bmVyX2kyY19hZGFwLmRldi5wYXJlbnQgPSBpMmNfYWRhcC0+ZGV2LnBhcmVudDsKKwogCWRpYngwMDBfaW5pdF9pMmNfbWFzdGVyKCZzdC0+aTJjX21hc3RlciwgRElCNzAwMFAsIHN0LT5pMmNfYWRhcCwgc3QtPmkyY19hZGRyKTsKIAogCS8qIGluaXQgNzA5MCB0dW5lciBhZGFwdGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4ZF9oYXJkLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4ZF9oYXJkLmMKaW5kZXggZWE0YzFjMy4uMjIzOGJmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeGRfaGFyZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhkX2hhcmQuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAKICNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKQEAgLTIzMyw3ICsyMzIsNyBAQAogCXJldHVybiAwOwogfQogCi1pbmxpbmUgdTMyIE11bERpdjMyKHUzMiBhLCB1MzIgYiwgdTMyIGMpCitzdGF0aWMgaW5saW5lIHUzMiBNdWxEaXYzMih1MzIgYSwgdTMyIGIsIHUzMiBjKQogewogCXU2NCB0bXA2NDsKIApAQCAtOTEwLDE0ICs5MDksMTYgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0Jc3RhdGUtPm1pY3JvY29kZSA9IGt6YWxsb2MoZnctPnNpemUsIEdGUF9LRVJORUwpOworCXN0YXRlLT5taWNyb2NvZGUgPSBrbWFsbG9jKGZ3LT5zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUtPm1pY3JvY29kZSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZHJ4ZDogZmlybXdhcmUgbG9hZCBmYWlsdXJlOiBub21lbW9yeVxuIik7CisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQlwcmludGsoS0VSTl9FUlIgImRyeGQ6IGZpcm13YXJlIGxvYWQgZmFpbHVyZTogbm8gbWVtb3J5XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJbWVtY3B5KHN0YXRlLT5taWNyb2NvZGUsIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CiAJc3RhdGUtPm1pY3JvY29kZV9sZW5ndGggPSBmdy0+c2l6ZTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeGsuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThiYWY0MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhrLmgKQEAgLTAsMCArMSw0NyBAQAorI2lmbmRlZiBfRFJYS19IXworI2RlZmluZSBfRFJYS19IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworLyoqCisgKiBzdHJ1Y3QgZHJ4a19jb25maWcgLSBDb25maWd1cmUgdGhlIGluaXRpYWwgcGFyYW1ldGVycyBmb3IgRFJYLUsKKyAqCisgKiBhZHI6CQkJSTJDIEFkZHJlc3Mgb2YgdGhlIERSWC1LCisgKiBzaW5nbGVfbWFzdGVyOglEZXZpY2UgaXMgb24gdGhlIHNpbmdsZSBtYXN0ZXIgbW9kZQorICogbm9faTJjX2JyaWRnZToJRG9uJ3Qgc3dpdGNoIHRoZSBJMkMgYnJpZGdlIHRvIHRhbGsgd2l0aCB0dW5lcgorICogYW50ZW5uYV9ncGlvOglHUElPIGJpdCB1c2VkIHRvIGNvbnRyb2wgdGhlIGFudGVubmEKKyAqIGFudGVubmFfZHZidDoJR1BJTyBiaXQgZm9yIGNoYW5naW5nIGFudGVubmEgdG8gRFZCLUMuIEEgdmFsdWUgb2YgMQorICoJCQltZWFucyB0aGF0IDE9RFZCQywgMCA9IERWQlQuIFplcm8gbWVhbnMgdGhlIG9wcG9zaXRlLgorICogbWljcm9jb2RlX25hbWU6CU5hbWUgb2YgdGhlIGZpcm13YXJlIGZpbGUgd2l0aCB0aGUgbWljcm9jb2RlCisgKgorICogT24gdGhlICpfZ3BpbyB2YXJzLCBiaXQgMCBpcyBVSU8tMSwgYml0IDEgaXMgVUlPLTIgYW5kIGJpdCAyIGlzCisgKiBVSU8tMy4KKyAqLworc3RydWN0IGRyeGtfY29uZmlnIHsKKwl1OAlhZHI7CisJYm9vbAlzaW5nbGVfbWFzdGVyOworCWJvb2wJbm9faTJjX2JyaWRnZTsKKworCWJvb2wJYW50ZW5uYV9kdmJ0OworCXUxNglhbnRlbm5hX2dwaW87CisKKwljb25zdCBjaGFyICptaWNyb2NvZGVfbmFtZTsKK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfRFJYSykgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9EUlhLX01PRFVMRSkgXAorICAgICAgICAmJiBkZWZpbmVkKE1PRFVMRSkpCitleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCAqZHJ4a19hdHRhY2goY29uc3Qgc3RydWN0IGRyeGtfY29uZmlnICpjb25maWcsCisJCQkJCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAorCQkJCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kICoqZmVfdCk7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkcnhrX2F0dGFjaChjb25zdCBzdHJ1Y3QgZHJ4a19jb25maWcgKmNvbmZpZywKKwkJCQkJc3RydWN0IGkyY19hZGFwdGVyICppMmMsCisJCQkJCXN0cnVjdCBkdmJfZnJvbnRlbmQgKipmZV90KQoreworICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4a19oYXJkLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4a19oYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFiMDgzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhrX2hhcmQuYwpAQCAtMCwwICsxLDY0NTQgQEAKKy8qCisgKiBkcnhrX2hhcmQ6IERSWC1LIERWQi1DL1QgZGVtb2R1bGF0b3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgRGlnaXRhbCBEZXZpY2VzIEdtYkgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICogT3IsIHBvaW50IHlvdXIgYnJvd3NlciB0byBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKworI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgImRyeGsuaCIKKyNpbmNsdWRlICJkcnhrX2hhcmQuaCIKKworc3RhdGljIGludCBQb3dlckRvd25EVkJUKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgYm9vbCBzZXRQb3dlck1vZGUpOworc3RhdGljIGludCBQb3dlckRvd25RQU0oc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKTsKK3N0YXRpYyBpbnQgU2V0RFZCVFN0YW5kYXJkKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwKKwkJCSAgIGVudW0gT3BlcmF0aW9uTW9kZSBvTW9kZSk7CitzdGF0aWMgaW50IFNldFFBTVN0YW5kYXJkKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwKKwkJCSAgZW51bSBPcGVyYXRpb25Nb2RlIG9Nb2RlKTsKK3N0YXRpYyBpbnQgU2V0UUFNKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTE2IEludGVybWVkaWF0ZUZyZXFrSHosCisJCSAgczMyIHR1bmVyRnJlcU9mZnNldCk7CitzdGF0aWMgaW50IFNldERWQlRTdGFuZGFyZChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCQkgICBlbnVtIE9wZXJhdGlvbk1vZGUgb01vZGUpOworc3RhdGljIGludCBEVkJUU3RhcnQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKTsKK3N0YXRpYyBpbnQgU2V0RFZCVChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUxNiBJbnRlcm1lZGlhdGVGcmVxa0h6LAorCQkgICBzMzIgdHVuZXJGcmVxT2Zmc2V0KTsKK3N0YXRpYyBpbnQgR2V0UUFNTG9ja1N0YXR1cyhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUzMiAqcExvY2tTdGF0dXMpOworc3RhdGljIGludCBHZXREVkJUTG9ja1N0YXR1cyhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUzMiAqcExvY2tTdGF0dXMpOworc3RhdGljIGludCBTd2l0Y2hBbnRlbm5hVG9RQU0oc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKTsKK3N0YXRpYyBpbnQgU3dpdGNoQW50ZW5uYVRvRFZCVChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpOworCitzdGF0aWMgYm9vbCBJc0RWQlQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCXJldHVybiBzdGF0ZS0+bV9PcGVyYXRpb25Nb2RlID09IE9NX0RWQlQ7Cit9CisKK3N0YXRpYyBib29sIElzUUFNKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlyZXR1cm4gc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSA9PSBPTV9RQU1fSVRVX0EgfHwKKwkgICAgc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSA9PSBPTV9RQU1fSVRVX0IgfHwKKwkgICAgc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSA9PSBPTV9RQU1fSVRVX0M7Cit9CisKK2Jvb2wgSXNBMVdpdGhQYXRjaENvZGUoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCXJldHVybiBzdGF0ZS0+bV9EUlhLX0ExX1BBVENIX0NPREU7Cit9CisKK2Jvb2wgSXNBMVdpdGhSb21Db2RlKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlyZXR1cm4gc3RhdGUtPm1fRFJYS19BMV9ST01fQ09ERTsKK30KKworI2RlZmluZSBOT0ExUk9NIDAKKworI2RlZmluZSBEUlhEQVBfRkFTSV9TSE9SVF9GT1JNQVQoYWRkcikgKCgoYWRkcikgJiAweEZDMzBGRjgwKSA9PSAwKQorI2RlZmluZSBEUlhEQVBfRkFTSV9MT05HX0ZPUk1BVChhZGRyKSAgKCgoYWRkcikgJiAweEZDMzBGRjgwKSAhPSAwKQorCisjZGVmaW5lIERFRkFVTFRfTUVSXzgzICAxNjUKKyNkZWZpbmUgREVGQVVMVF9NRVJfOTMgIDI1MAorCisjaWZuZGVmIERSWEtfTVBFR19TRVJJQUxfT1VUUFVUX1BJTl9EUklWRV9TVFJFTkdUSAorI2RlZmluZSBEUlhLX01QRUdfU0VSSUFMX09VVFBVVF9QSU5fRFJJVkVfU1RSRU5HVEggKDB4MDIpCisjZW5kaWYKKworI2lmbmRlZiBEUlhLX01QRUdfUEFSQUxMRUxfT1VUUFVUX1BJTl9EUklWRV9TVFJFTkdUSAorI2RlZmluZSBEUlhLX01QRUdfUEFSQUxMRUxfT1VUUFVUX1BJTl9EUklWRV9TVFJFTkdUSCAoMHgwMykKKyNlbmRpZgorCisjaWZuZGVmIERSWEtfTVBFR19PVVRQVVRfQ0xLX0RSSVZFX1NUUkVOR1RICisjZGVmaW5lIERSWEtfTVBFR19PVVRQVVRfQ0xLX0RSSVZFX1NUUkVOR1RIICgweDA2KQorI2VuZGlmCisKKyNkZWZpbmUgREVGQVVMVF9EUlhLX01QRUdfTE9DS19USU1FT1VUIDcwMAorI2RlZmluZSBERUZBVUxUX0RSWEtfREVNT0RfTE9DS19USU1FT1VUIDUwMAorCisjaWZuZGVmIERSWEtfS0lfUkFHQ19BVFYKKyNkZWZpbmUgRFJYS19LSV9SQUdDX0FUViAgIDQKKyNlbmRpZgorI2lmbmRlZiBEUlhLX0tJX0lBR0NfQVRWCisjZGVmaW5lIERSWEtfS0lfSUFHQ19BVFYgICA2CisjZW5kaWYKKyNpZm5kZWYgRFJYS19LSV9EQUdDX0FUVgorI2RlZmluZSBEUlhLX0tJX0RBR0NfQVRWICAgNworI2VuZGlmCisKKyNpZm5kZWYgRFJYS19LSV9SQUdDX1FBTQorI2RlZmluZSBEUlhLX0tJX1JBR0NfUUFNICAgMworI2VuZGlmCisjaWZuZGVmIERSWEtfS0lfSUFHQ19RQU0KKyNkZWZpbmUgRFJYS19LSV9JQUdDX1FBTSAgIDQKKyNlbmRpZgorI2lmbmRlZiBEUlhLX0tJX0RBR0NfUUFNCisjZGVmaW5lIERSWEtfS0lfREFHQ19RQU0gICA3CisjZW5kaWYKKyNpZm5kZWYgRFJYS19LSV9SQUdDX0RWQlQKKyNkZWZpbmUgRFJYS19LSV9SQUdDX0RWQlQgIChJc0ExV2l0aFBhdGNoQ29kZShzdGF0ZSkgPyAzIDogMikKKyNlbmRpZgorI2lmbmRlZiBEUlhLX0tJX0lBR0NfRFZCVAorI2RlZmluZSBEUlhLX0tJX0lBR0NfRFZCVCAgKElzQTFXaXRoUGF0Y2hDb2RlKHN0YXRlKSA/IDQgOiAyKQorI2VuZGlmCisjaWZuZGVmIERSWEtfS0lfREFHQ19EVkJUCisjZGVmaW5lIERSWEtfS0lfREFHQ19EVkJUICAoSXNBMVdpdGhQYXRjaENvZGUoc3RhdGUpID8gMTAgOiA3KQorI2VuZGlmCisKKyNpZm5kZWYgRFJYS19BR0NfREFDX09GRlNFVAorI2RlZmluZSBEUlhLX0FHQ19EQUNfT0ZGU0VUICgweDgwMCkKKyNlbmRpZgorCisjaWZuZGVmIERSWEtfQkFORFdJRFRIXzhNSFpfSU5fSFoKKyNkZWZpbmUgRFJYS19CQU5EV0lEVEhfOE1IWl9JTl9IWiAgKDB4OEI4MjQ5TCkKKyNlbmRpZgorCisjaWZuZGVmIERSWEtfQkFORFdJRFRIXzdNSFpfSU5fSFoKKyNkZWZpbmUgRFJYS19CQU5EV0lEVEhfN01IWl9JTl9IWiAgKDB4N0ExMjAwTCkKKyNlbmRpZgorCisjaWZuZGVmIERSWEtfQkFORFdJRFRIXzZNSFpfSU5fSFoKKyNkZWZpbmUgRFJYS19CQU5EV0lEVEhfNk1IWl9JTl9IWiAgKDB4NjhBMUI2TCkKKyNlbmRpZgorCisjaWZuZGVmIERSWEtfUUFNX1NZTUJPTFJBVEVfTUFYCisjZGVmaW5lIERSWEtfUUFNX1NZTUJPTFJBVEVfTUFYICAgICAgICAgKDcyMzMwMDApCisjZW5kaWYKKworI2RlZmluZSBEUlhLX0JMX1JPTV9PRkZTRVRfVEFQU19EVkJUICAgIDU2CisjZGVmaW5lIERSWEtfQkxfUk9NX09GRlNFVF9UQVBTX0lUVV9BICAgNjQKKyNkZWZpbmUgRFJYS19CTF9ST01fT0ZGU0VUX1RBUFNfSVRVX0MgICAweDVGRTAKKyNkZWZpbmUgRFJYS19CTF9ST01fT0ZGU0VUX1RBUFNfQkcgICAgICAyNAorI2RlZmluZSBEUlhLX0JMX1JPTV9PRkZTRVRfVEFQU19ES0lMTFAgIDMyCisjZGVmaW5lIERSWEtfQkxfUk9NX09GRlNFVF9UQVBTX05UU0MgICAgNDAKKyNkZWZpbmUgRFJYS19CTF9ST01fT0ZGU0VUX1RBUFNfRk0gICAgICA0OAorI2RlZmluZSBEUlhLX0JMX1JPTV9PRkZTRVRfVUNPREUgICAgICAgIDAKKworI2RlZmluZSBEUlhLX0JMQ19USU1FT1VUICAgICAgICAgICAgICAgIDEwMAorCisjZGVmaW5lIERSWEtfQkxDQ19OUl9FTEVNRU5UU19UQVBTICAgICAgMgorI2RlZmluZSBEUlhLX0JMQ0NfTlJfRUxFTUVOVFNfVUNPREUgICAgIDYKKworI2RlZmluZSBEUlhLX0JMRENfTlJfRUxFTUVOVFNfVEFQUyAgICAgIDI4CisKKyNpZm5kZWYgRFJYS19PRkRNX05FX05PVENIX1dJRFRICisjZGVmaW5lIERSWEtfT0ZETV9ORV9OT1RDSF9XSURUSCAgICAgICAgICAgICAoNCkKKyNlbmRpZgorCisjZGVmaW5lIERSWEtfUUFNX1NMX1NJR19QT1dFUl9RQU0xNiAgICAgICAoNDA5NjApCisjZGVmaW5lIERSWEtfUUFNX1NMX1NJR19QT1dFUl9RQU0zMiAgICAgICAoMjA0ODApCisjZGVmaW5lIERSWEtfUUFNX1NMX1NJR19QT1dFUl9RQU02NCAgICAgICAoNDMwMDgpCisjZGVmaW5lIERSWEtfUUFNX1NMX1NJR19QT1dFUl9RQU0xMjggICAgICAoMjA5OTIpCisjZGVmaW5lIERSWEtfUUFNX1NMX1NJR19QT1dFUl9RQU0yNTYgICAgICAoNDM1MjApCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWc7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIik7CisKKyNkZWZpbmUgZHByaW50ayhsZXZlbCwgZm10LCBhcmcuLi4pIGRvIHsJCQlcCitpZiAoZGVidWcgPj0gbGV2ZWwpCQkJCQkJXAorCXByaW50ayhLRVJOX0RFQlVHICJkcnhrOiAlcyIgZm10LCBfX2Z1bmNfXywgIyMgYXJnKTsJXAorfSB3aGlsZSAoMCkKKworCitzdGF0aWMgaW5saW5lIHUzMiBNdWxEaXYzMih1MzIgYSwgdTMyIGIsIHUzMiBjKQoreworCXU2NCB0bXA2NDsKKworCXRtcDY0ID0gKHU2NCkgYSAqICh1NjQpIGI7CisJZG9fZGl2KHRtcDY0LCBjKTsKKworCXJldHVybiAodTMyKSB0bXA2NDsKK30KKworaW5saW5lIHUzMiBGcmFjMjhhKHUzMiBhLCB1MzIgYykKK3sKKwlpbnQgaSA9IDA7CisJdTMyIFExID0gMDsKKwl1MzIgUjAgPSAwOworCisJUjAgPSAoYSAlIGMpIDw8IDQ7CS8qIDMyLTI4ID09IDQgc2hpZnRzIHBvc3NpYmxlIGF0IG1heCAqLworCVExID0gYSAvIGM7CQkvKiBpbnRlZ2VyIHBhcnQsIG9ubHkgdGhlIDQgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cworCQkJCSAgIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgcmVzdWx0ICovCisKKwkvKiBkaXZpc2lvbiB1c2luZyByYWRpeCAxNiwgNyBuaWJibGVzIGluIHRoZSByZXN1bHQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCVExID0gKFExIDw8IDQpIHwgKFIwIC8gYyk7CisJCVIwID0gKFIwICUgYykgPDwgNDsKKwl9CisJLyogcm91bmRpbmcgKi8KKwlpZiAoKFIwID4+IDMpID49IGMpCisJCVExKys7CisKKwlyZXR1cm4gUTE7Cit9CisKK3N0YXRpYyB1MzIgTG9nMTBUaW1lczEwMCh1MzIgeCkKK3sKKwlzdGF0aWMgY29uc3QgdTggc2NhbGUgPSAxNTsKKwlzdGF0aWMgY29uc3QgdTggaW5kZXhXaWR0aCA9IDU7CisJdTggaSA9IDA7CisJdTMyIHkgPSAwOworCXUzMiBkID0gMDsKKwl1MzIgayA9IDA7CisJdTMyIHIgPSAwOworCS8qCisJICAgbG9nMmx1dFtuXSA9ICgxPDxzY2FsZSkgKiAyMDAgKiBsb2cyKDEuMCArICgoMS4wLygxPDxJTkRFWFdJRFRIKSkgKiBuKSkKKwkgICAwIDw9IG4gPCAoKDE8PElOREVYV0lEVEgpKzEpCisJICovCisKKwlzdGF0aWMgY29uc3QgdTMyIGxvZzJsdXRbXSA9IHsKKwkJMCwJCS8qIDAuMDAwMDAwICovCisJCTI5MDk0MSwJCS8qIDI5MDk0MS4zMDA2MjggKi8KKwkJNTczMTk2LAkJLyogNTczMTk2LjQ3NjQxOCAqLworCQk4NDcyNjksCQkvKiA4NDcyNjkuMTc5ODUxICovCisJCTExMTM2MjAsCS8qIDExMTM2MjAuNDg5NDUyICovCisJCTEzNzI2NzQsCS8qIDEzNzI2NzMuNTc2OTg2ICovCisJCTE2MjQ4MTgsCS8qIDE2MjQ4MTcuNzUyMTA0ICovCisJCTE4NzA0MTIsCS8qIDE4NzA0MTEuOTgxNTM2ICovCisJCTIxMDk3ODgsCS8qIDIxMDk3ODcuOTYyNjU0ICovCisJCTIzNDMyNTMsCS8qIDIzNDMyNTIuODE3NDY1ICovCisJCTI1NzEwOTEsCS8qIDI1NzEwOTEuNDYxOTIzICovCisJCTI3OTM1NjksCS8qIDI3OTM1NjguNjk2NDE2ICovCisJCTMwMTA5MzEsCS8qIDMwMTA5MzEuMDU1OTAxICovCisJCTMyMjM0MDgsCS8qIDMyMjM0MDguNDUyMTA2ICovCisJCTM0MzEyMTYsCS8qIDM0MzEyMTUuNjM1MjE1ICovCisJCTM2MzQ1NTMsCS8qIDM2MzQ1NTMuNDk4MzU1ICovCisJCTM4MzM2MTAsCS8qIDM4MzM2MTAuMjQ0NzI2ICovCisJCTQwMjg1NjIsCS8qIDQwMjg1NjIuNDM0MzkzICovCisJCTQyMTk1NzYsCS8qIDQyMTk1NzUuOTI1MzA4ICovCisJCTQ0MDY4MDcsCS8qIDQ0MDY4MDYuNzIxMTQ0ICovCisJCTQ1OTA0MDIsCS8qIDQ1OTA0MDEuNzM2ODA5ICovCisJCTQ3NzA0OTksCS8qIDQ3NzA0OTkuNDkxMDI1ICovCisJCTQ5NDcyMzEsCS8qIDQ5NDcyMzAuNzM0MTc5ICovCisJCTUxMjA3MTksCS8qIDUxMjA3MTkuMDE4NTU1ICovCisJCTUyOTEwODEsCS8qIDUyOTEwODEuMjE3MTk3ICovCisJCTU0NTg0MjgsCS8qIDU0NTg0MjcuOTk2ODMwICovCisJCTU2MjI4NjQsCS8qIDU2MjI4NjQuMjQ5NjY4ICovCisJCTU3ODQ0ODksCS8qIDU3ODQ0ODkuNDg4Mjk4ICovCisJCTU5NDMzOTgsCS8qIDU5NDMzOTguMjA3MzgwICovCisJCTYwOTk2ODAsCS8qIDYwOTk2ODAuMjE1NDUyICovCisJCTYyNTM0MjEsCS8qIDYyNTM0MjAuOTM5NzUxICovCisJCTY0MDQ3MDIsCS8qIDY0MDQ3MDEuNzA2NjQ5ICovCisJCTY1NTM2MDAsCS8qIDY1NTM2MDAuMDAwMDAwICovCisJfTsKKworCisJaWYgKHggPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBTY2FsZSB4IChub3JtYWxpemUpICovCisJLyogY29tcHV0aW5nIHkgaW4gbG9nKHgveSkgPSBsb2coeCkgLSBsb2coeSkgKi8KKwlpZiAoKHggJiAoKDB4ZmZmZmZmZmYpIDw8IChzY2FsZSArIDEpKSkgPT0gMCkgeworCQlmb3IgKGsgPSBzY2FsZTsgayA+IDA7IGstLSkgeworCQkJaWYgKHggJiAoKCh1MzIpIDEpIDw8IHNjYWxlKSkKKwkJCQlicmVhazsKKwkJCXggPDw9IDE7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGsgPSBzY2FsZTsgayA8IDMxOyBrKyspIHsKKwkJCWlmICgoeCAmICgoKHUzMikgKC0xKSkgPDwgKHNjYWxlICsgMSkpKSA9PSAwKQorCQkJCWJyZWFrOworCQkJeCA+Pj0gMTsKKwkJfQorCX0KKwkvKgorCSAgIE5vdyB4IGhhcyBiaW5hcnkgcG9pbnQgYmV0d2VlbiBiaXRbc2NhbGVdIGFuZCBiaXRbc2NhbGUtMV0KKwkgICBhbmQgMS4wIDw9IHggPCAyLjAgKi8KKworCS8qIGNvcnJlY3Rpb24gZm9yIGRpdmlzb246IGxvZyh4KSA9IGxvZyh4L3kpK2xvZyh5KSAqLworCXkgPSBrICogKCgoKHUzMikgMSkgPDwgc2NhbGUpICogMjAwKTsKKworCS8qIHJlbW92ZSBpbnRlZ2VyIHBhcnQgKi8KKwl4ICY9ICgoKCh1MzIpIDEpIDw8IHNjYWxlKSAtIDEpOworCS8qIGdldCBpbmRleCAqLworCWkgPSAodTgpICh4ID4+IChzY2FsZSAtIGluZGV4V2lkdGgpKTsKKwkvKiBjb21wdXRlIGRlbHRhICh4IC0gYSkgKi8KKwlkID0geCAmICgoKCh1MzIpIDEpIDw8IChzY2FsZSAtIGluZGV4V2lkdGgpKSAtIDEpOworCS8qIGNvbXB1dGUgbG9nLCBtdWx0aXBsaWNhdGlvbiAoZCogKC4uKSkgbXVzdCBiZSB3aXRoaW4gcmFuZ2UgISAqLworCXkgKz0gbG9nMmx1dFtpXSArCisJICAgICgoZCAqIChsb2cybHV0W2kgKyAxXSAtIGxvZzJsdXRbaV0pKSA+PiAoc2NhbGUgLSBpbmRleFdpZHRoKSk7CisJLyogQ29udmVyIHRvIGxvZzEwKCkgKi8KKwl5IC89IDEwODg1MzsJCS8qIChsb2cyKDEwKSA8PCBzY2FsZSkgKi8KKwlyID0gKHkgPj4gMSk7CisJLyogcm91bmRpbmcgKi8KKwlpZiAoeSAmICgodTMyKSAxKSkKKwkJcisrOworCXJldHVybiByOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEkyQyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgaTJjX3JlYWQxKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdTggYWRyLCB1OCAqdmFsKQoreworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbMV0gPSB7IHsuYWRkciA9IGFkciwgLmZsYWdzID0gSTJDX01fUkQsCisJCQkJICAgIC5idWYgPSB2YWwsIC5sZW4gPSAxfQorCX07CisKKwlyZXR1cm4gaTJjX3RyYW5zZmVyKGFkYXB0ZXIsIG1zZ3MsIDEpOworfQorCitzdGF0aWMgaW50IGkyY193cml0ZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHU4IGFkciwgdTggKmRhdGEsIGludCBsZW4pCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CisJICAgIC5hZGRyID0gYWRyLCAuZmxhZ3MgPSAwLCAuYnVmID0gZGF0YSwgLmxlbiA9IGxlbiB9OworCisJZHByaW50aygzLCAiOiIpOworCWlmIChkZWJ1ZyA+IDIpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCXByaW50ayhLRVJOX0NPTlQgIiAlMDJ4IiwgZGF0YVtpXSk7CisJCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CisJfQorCXN0YXR1cyA9IGkyY190cmFuc2ZlcihhZGFwLCAmbXNnLCAxKTsKKwlpZiAoc3RhdHVzID49IDAgJiYgc3RhdHVzICE9IDEpCisJCXN0YXR1cyA9IC1FSU87CisKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBpMmMgd3JpdGUgZXJyb3IgYXQgYWRkciAweCUwMnhcbiIsIGFkcik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGkyY19yZWFkKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwKKwkJICAgIHU4IGFkciwgdTggKm1zZywgaW50IGxlbiwgdTggKmFuc3csIGludCBhbGVuKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IGkyY19tc2cgbXNnc1syXSA9IHsKKwkJey5hZGRyID0gYWRyLCAuZmxhZ3MgPSAwLAorCQkJCSAgICAuYnVmID0gbXNnLCAubGVuID0gbGVufSwKKwkJey5hZGRyID0gYWRyLCAuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJIC5idWYgPSBhbnN3LCAubGVuID0gYWxlbn0KKwl9OworCisJc3RhdHVzID0gaTJjX3RyYW5zZmVyKGFkYXAsIG1zZ3MsIDIpOworCWlmIChzdGF0dXMgIT0gMikgeworCQlpZiAoZGVidWcgPiAyKQorCQkJcHJpbnRrKEtFUk5fQ09OVCAiOiBFUlJPUiFcbiIpOworCQlpZiAoc3RhdHVzID49IDApCisJCQlzdGF0dXMgPSAtRUlPOworCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogaTJjIHJlYWQgZXJyb3IgYXQgYWRkciAweCUwMnhcbiIsIGFkcik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCWlmIChkZWJ1ZyA+IDIpIHsKKwkJaW50IGk7CisJCWRwcmludGsoMiwgIjogcmVhZCBmcm9tICIpOworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQlwcmludGsoS0VSTl9DT05UICIgJTAyeCIsIG1zZ1tpXSk7CisJCXByaW50ayhLRVJOX0NPTlQgIlZhbHVlID0gIik7CisJCWZvciAoaSA9IDA7IGkgPCBhbGVuOyBpKyspCisJCQlwcmludGsoS0VSTl9DT05UICIgJTAyeCIsIGFuc3dbaV0pOworCQlwcmludGsoS0VSTl9DT05UICJcbiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkMTZfZmxhZ3Moc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MzIgcmVnLCB1MTYgKmRhdGEsIHU4IGZsYWdzKQoreworCWludCBzdGF0dXM7CisJdTggYWRyID0gc3RhdGUtPmRlbW9kX2FkZHJlc3MsIG1tMVs0XSwgbW0yWzJdLCBsZW47CisKKwlpZiAoc3RhdGUtPnNpbmdsZV9tYXN0ZXIpCisJCWZsYWdzIHw9IDB4QzA7CisKKwlpZiAoRFJYREFQX0ZBU0lfTE9OR19GT1JNQVQocmVnKSB8fCAoZmxhZ3MgIT0gMCkpIHsKKwkJbW0xWzBdID0gKCgocmVnIDw8IDEpICYgMHhGRikgfCAweDAxKTsKKwkJbW0xWzFdID0gKChyZWcgPj4gMTYpICYgMHhGRik7CisJCW1tMVsyXSA9ICgocmVnID4+IDI0KSAmIDB4RkYpIHwgZmxhZ3M7CisJCW1tMVszXSA9ICgocmVnID4+IDcpICYgMHhGRik7CisJCWxlbiA9IDQ7CisJfSBlbHNlIHsKKwkJbW0xWzBdID0gKChyZWcgPDwgMSkgJiAweEZGKTsKKwkJbW0xWzFdID0gKCgocmVnID4+IDE2KSAmIDB4MEYpIHwgKChyZWcgPj4gMTgpICYgMHhGMCkpOworCQlsZW4gPSAyOworCX0KKwlkcHJpbnRrKDIsICIoMHglMDh4LCAweCUwMngpXG4iLCByZWcsIGZsYWdzKTsKKwlzdGF0dXMgPSBpMmNfcmVhZChzdGF0ZS0+aTJjLCBhZHIsIG1tMSwgbGVuLCBtbTIsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChkYXRhKQorCQkqZGF0YSA9IG1tMlswXSB8IChtbTJbMV0gPDwgOCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkMTYoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MzIgcmVnLCB1MTYgKmRhdGEpCit7CisJcmV0dXJuIHJlYWQxNl9mbGFncyhzdGF0ZSwgcmVnLCBkYXRhLCAwKTsKK30KKworc3RhdGljIGludCByZWFkMzJfZmxhZ3Moc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MzIgcmVnLCB1MzIgKmRhdGEsIHU4IGZsYWdzKQoreworCWludCBzdGF0dXM7CisJdTggYWRyID0gc3RhdGUtPmRlbW9kX2FkZHJlc3MsIG1tMVs0XSwgbW0yWzRdLCBsZW47CisKKwlpZiAoc3RhdGUtPnNpbmdsZV9tYXN0ZXIpCisJCWZsYWdzIHw9IDB4QzA7CisKKwlpZiAoRFJYREFQX0ZBU0lfTE9OR19GT1JNQVQocmVnKSB8fCAoZmxhZ3MgIT0gMCkpIHsKKwkJbW0xWzBdID0gKCgocmVnIDw8IDEpICYgMHhGRikgfCAweDAxKTsKKwkJbW0xWzFdID0gKChyZWcgPj4gMTYpICYgMHhGRik7CisJCW1tMVsyXSA9ICgocmVnID4+IDI0KSAmIDB4RkYpIHwgZmxhZ3M7CisJCW1tMVszXSA9ICgocmVnID4+IDcpICYgMHhGRik7CisJCWxlbiA9IDQ7CisJfSBlbHNlIHsKKwkJbW0xWzBdID0gKChyZWcgPDwgMSkgJiAweEZGKTsKKwkJbW0xWzFdID0gKCgocmVnID4+IDE2KSAmIDB4MEYpIHwgKChyZWcgPj4gMTgpICYgMHhGMCkpOworCQlsZW4gPSAyOworCX0KKwlkcHJpbnRrKDIsICIoMHglMDh4LCAweCUwMngpXG4iLCByZWcsIGZsYWdzKTsKKwlzdGF0dXMgPSBpMmNfcmVhZChzdGF0ZS0+aTJjLCBhZHIsIG1tMSwgbGVuLCBtbTIsIDQpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChkYXRhKQorCQkqZGF0YSA9IG1tMlswXSB8IChtbTJbMV0gPDwgOCkgfAorCQkgICAgKG1tMlsyXSA8PCAxNikgfCAobW0yWzNdIDw8IDI0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWQzMihzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUzMiByZWcsIHUzMiAqZGF0YSkKK3sKKwlyZXR1cm4gcmVhZDMyX2ZsYWdzKHN0YXRlLCByZWcsIGRhdGEsIDApOworfQorCitzdGF0aWMgaW50IHdyaXRlMTZfZmxhZ3Moc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MzIgcmVnLCB1MTYgZGF0YSwgdTggZmxhZ3MpCit7CisJdTggYWRyID0gc3RhdGUtPmRlbW9kX2FkZHJlc3MsIG1tWzZdLCBsZW47CisKKwlpZiAoc3RhdGUtPnNpbmdsZV9tYXN0ZXIpCisJCWZsYWdzIHw9IDB4QzA7CisJaWYgKERSWERBUF9GQVNJX0xPTkdfRk9STUFUKHJlZykgfHwgKGZsYWdzICE9IDApKSB7CisJCW1tWzBdID0gKCgocmVnIDw8IDEpICYgMHhGRikgfCAweDAxKTsKKwkJbW1bMV0gPSAoKHJlZyA+PiAxNikgJiAweEZGKTsKKwkJbW1bMl0gPSAoKHJlZyA+PiAyNCkgJiAweEZGKSB8IGZsYWdzOworCQltbVszXSA9ICgocmVnID4+IDcpICYgMHhGRik7CisJCWxlbiA9IDQ7CisJfSBlbHNlIHsKKwkJbW1bMF0gPSAoKHJlZyA8PCAxKSAmIDB4RkYpOworCQltbVsxXSA9ICgoKHJlZyA+PiAxNikgJiAweDBGKSB8ICgocmVnID4+IDE4KSAmIDB4RjApKTsKKwkJbGVuID0gMjsKKwl9CisJbW1bbGVuXSA9IGRhdGEgJiAweGZmOworCW1tW2xlbiArIDFdID0gKGRhdGEgPj4gOCkgJiAweGZmOworCisJZHByaW50aygyLCAiKDB4JTA4eCwgMHglMDR4LCAweCUwMngpXG4iLCByZWcsIGRhdGEsIGZsYWdzKTsKKwlyZXR1cm4gaTJjX3dyaXRlKHN0YXRlLT5pMmMsIGFkciwgbW0sIGxlbiArIDIpOworfQorCitzdGF0aWMgaW50IHdyaXRlMTYoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MzIgcmVnLCB1MTYgZGF0YSkKK3sKKwlyZXR1cm4gd3JpdGUxNl9mbGFncyhzdGF0ZSwgcmVnLCBkYXRhLCAwKTsKK30KKworc3RhdGljIGludCB3cml0ZTMyX2ZsYWdzKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTMyIHJlZywgdTMyIGRhdGEsIHU4IGZsYWdzKQoreworCXU4IGFkciA9IHN0YXRlLT5kZW1vZF9hZGRyZXNzLCBtbVs4XSwgbGVuOworCisJaWYgKHN0YXRlLT5zaW5nbGVfbWFzdGVyKQorCQlmbGFncyB8PSAweEMwOworCWlmIChEUlhEQVBfRkFTSV9MT05HX0ZPUk1BVChyZWcpIHx8IChmbGFncyAhPSAwKSkgeworCQltbVswXSA9ICgoKHJlZyA8PCAxKSAmIDB4RkYpIHwgMHgwMSk7CisJCW1tWzFdID0gKChyZWcgPj4gMTYpICYgMHhGRik7CisJCW1tWzJdID0gKChyZWcgPj4gMjQpICYgMHhGRikgfCBmbGFnczsKKwkJbW1bM10gPSAoKHJlZyA+PiA3KSAmIDB4RkYpOworCQlsZW4gPSA0OworCX0gZWxzZSB7CisJCW1tWzBdID0gKChyZWcgPDwgMSkgJiAweEZGKTsKKwkJbW1bMV0gPSAoKChyZWcgPj4gMTYpICYgMHgwRikgfCAoKHJlZyA+PiAxOCkgJiAweEYwKSk7CisJCWxlbiA9IDI7CisJfQorCW1tW2xlbl0gPSBkYXRhICYgMHhmZjsKKwltbVtsZW4gKyAxXSA9IChkYXRhID4+IDgpICYgMHhmZjsKKwltbVtsZW4gKyAyXSA9IChkYXRhID4+IDE2KSAmIDB4ZmY7CisJbW1bbGVuICsgM10gPSAoZGF0YSA+PiAyNCkgJiAweGZmOworCWRwcmludGsoMiwgIigweCUwOHgsIDB4JTA4eCwgMHglMDJ4KVxuIiwgcmVnLCBkYXRhLCBmbGFncyk7CisKKwlyZXR1cm4gaTJjX3dyaXRlKHN0YXRlLT5pMmMsIGFkciwgbW0sIGxlbiArIDQpOworfQorCitzdGF0aWMgaW50IHdyaXRlMzIoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MzIgcmVnLCB1MzIgZGF0YSkKK3sKKwlyZXR1cm4gd3JpdGUzMl9mbGFncyhzdGF0ZSwgcmVnLCBkYXRhLCAwKTsKK30KKworc3RhdGljIGludCB3cml0ZV9ibG9jayhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUzMiBBZGRyZXNzLAorCQkgICAgICBjb25zdCBpbnQgQmxvY2tTaXplLCBjb25zdCB1OCBwQmxvY2tbXSkKK3sKKwlpbnQgc3RhdHVzID0gMCwgQmxrU2l6ZSA9IEJsb2NrU2l6ZTsKKwl1OCBGbGFncyA9IDA7CisKKwlpZiAoc3RhdGUtPnNpbmdsZV9tYXN0ZXIpCisJCUZsYWdzIHw9IDB4QzA7CisKKwl3aGlsZSAoQmxrU2l6ZSA+IDApIHsKKwkJaW50IENodW5rID0gQmxrU2l6ZSA+IHN0YXRlLT5tX0NodW5rU2l6ZSA/CisJCSAgICBzdGF0ZS0+bV9DaHVua1NpemUgOiBCbGtTaXplOworCQl1OCAqQWRyQnVmID0gJnN0YXRlLT5DaHVua1swXTsKKwkJdTMyIEFkckxlbmd0aCA9IDA7CisKKwkJaWYgKERSWERBUF9GQVNJX0xPTkdfRk9STUFUKEFkZHJlc3MpIHx8IChGbGFncyAhPSAwKSkgeworCQkJQWRyQnVmWzBdID0gKCgoQWRkcmVzcyA8PCAxKSAmIDB4RkYpIHwgMHgwMSk7CisJCQlBZHJCdWZbMV0gPSAoKEFkZHJlc3MgPj4gMTYpICYgMHhGRik7CisJCQlBZHJCdWZbMl0gPSAoKEFkZHJlc3MgPj4gMjQpICYgMHhGRik7CisJCQlBZHJCdWZbM10gPSAoKEFkZHJlc3MgPj4gNykgJiAweEZGKTsKKwkJCUFkckJ1ZlsyXSB8PSBGbGFnczsKKwkJCUFkckxlbmd0aCA9IDQ7CisJCQlpZiAoQ2h1bmsgPT0gc3RhdGUtPm1fQ2h1bmtTaXplKQorCQkJCUNodW5rIC09IDI7CisJCX0gZWxzZSB7CisJCQlBZHJCdWZbMF0gPSAoKEFkZHJlc3MgPDwgMSkgJiAweEZGKTsKKwkJCUFkckJ1ZlsxXSA9ICgoKEFkZHJlc3MgPj4gMTYpICYgMHgwRikgfAorCQkJCSAgICAgKChBZGRyZXNzID4+IDE4KSAmIDB4RjApKTsKKwkJCUFkckxlbmd0aCA9IDI7CisJCX0KKwkJbWVtY3B5KCZzdGF0ZS0+Q2h1bmtbQWRyTGVuZ3RoXSwgcEJsb2NrLCBDaHVuayk7CisJCWRwcmludGsoMiwgIigweCUwOHgsIDB4JTAyeClcbiIsIEFkZHJlc3MsIEZsYWdzKTsKKwkJaWYgKGRlYnVnID4gMSkgeworCQkJaW50IGk7CisJCQlpZiAocEJsb2NrKQorCQkJCWZvciAoaSA9IDA7IGkgPCBDaHVuazsgaSsrKQorCQkJCQlwcmludGsoS0VSTl9DT05UICIgJTAyeCIsIHBCbG9ja1tpXSk7CisJCQlwcmludGsoS0VSTl9DT05UICJcbiIpOworCQl9CisJCXN0YXR1cyA9IGkyY193cml0ZShzdGF0ZS0+aTJjLCBzdGF0ZS0+ZGVtb2RfYWRkcmVzcywKKwkJCQkgICAmc3RhdGUtPkNodW5rWzBdLCBDaHVuayArIEFkckxlbmd0aCk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImRyeGs6ICVzOiBpMmMgd3JpdGUgZXJyb3IgYXQgYWRkciAweCUwMnhcbiIsCisJCQkgICAgICAgX19mdW5jX18sIEFkZHJlc3MpOworCQkJYnJlYWs7CisJCX0KKwkJcEJsb2NrICs9IENodW5rOworCQlBZGRyZXNzICs9IChDaHVuayA+PiAxKTsKKwkJQmxrU2l6ZSAtPSBDaHVuazsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmbmRlZiBEUlhLX01BWF9SRVRSSUVTX1BPV0VSVVAKKyNkZWZpbmUgRFJYS19NQVhfUkVUUklFU19QT1dFUlVQIDIwCisjZW5kaWYKKworaW50IFBvd2VyVXBEZXZpY2Uoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXM7CisJdTggZGF0YSA9IDA7CisJdTE2IHJldHJ5Q291bnQgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKworCXN0YXR1cyA9IGkyY19yZWFkMShzdGF0ZS0+aTJjLCBzdGF0ZS0+ZGVtb2RfYWRkcmVzcywgJmRhdGEpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWRvIHsKKwkJCWRhdGEgPSAwOworCQkJc3RhdHVzID0gaTJjX3dyaXRlKHN0YXRlLT5pMmMsIHN0YXRlLT5kZW1vZF9hZGRyZXNzLAorCQkJCQkgICAmZGF0YSwgMSk7CisJCQltc2xlZXAoMTApOworCQkJcmV0cnlDb3VudCsrOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJY29udGludWU7CisJCQlzdGF0dXMgPSBpMmNfcmVhZDEoc3RhdGUtPmkyYywgc3RhdGUtPmRlbW9kX2FkZHJlc3MsCisJCQkJCSAgICZkYXRhKTsKKwkJfSB3aGlsZSAoc3RhdHVzIDwgMCAmJgorCQkJIChyZXRyeUNvdW50IDwgRFJYS19NQVhfUkVUUklFU19QT1dFUlVQKSk7CisJCWlmIChzdGF0dXMgPCAwICYmIHJldHJ5Q291bnQgPj0gRFJYS19NQVhfUkVUUklFU19QT1dFUlVQKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBNYWtlIHN1cmUgYWxsIGNsayBkb21haW5zIGFyZSBhY3RpdmUgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQ0NfUFdEX01PREVfX0EsIFNJT19DQ19QV0RfTU9ERV9MRVZFTF9OT05FKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQ0NfVVBEQVRFX19BLCBTSU9fQ0NfVVBEQVRFX0tFWSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJLyogRW5hYmxlIHBsbCBsb2NrIHRlc3RzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0NDX1BMTF9MT0NLX19BLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXRlLT5tX2N1cnJlbnRQb3dlck1vZGUgPSBEUlhfUE9XRVJfVVA7CisKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIGludCBpbml0X3N0YXRlKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwkvKgorCSAqIEZJWE1FOiBtb3N0IChhbGw/KSBvZiB0aGUgdmFsdWVzIGJlbGxvdyBzaG91bGQgYmUgbW92ZWQgaW50bworCSAqIHN0cnVjdCBkcnhrX2NvbmZpZywgYXMgdGhleSBhcmUgcHJvYmFibHkgYm9hcmQtc3BlY2lmaWMKKwkgKi8KKwl1MzIgdWxWU0JJZkFnY01vZGUgPSBEUlhLX0FHQ19DVFJMX0FVVE87CisJdTMyIHVsVlNCSWZBZ2NPdXRwdXRMZXZlbCA9IDA7CisJdTMyIHVsVlNCSWZBZ2NNaW5MZXZlbCA9IDA7CisJdTMyIHVsVlNCSWZBZ2NNYXhMZXZlbCA9IDB4N0ZGRjsKKwl1MzIgdWxWU0JJZkFnY1NwZWVkID0gMzsKKworCXUzMiB1bFZTQlJmQWdjTW9kZSA9IERSWEtfQUdDX0NUUkxfQVVUTzsKKwl1MzIgdWxWU0JSZkFnY091dHB1dExldmVsID0gMDsKKwl1MzIgdWxWU0JSZkFnY01pbkxldmVsID0gMDsKKwl1MzIgdWxWU0JSZkFnY01heExldmVsID0gMHg3RkZGOworCXUzMiB1bFZTQlJmQWdjU3BlZWQgPSAzOworCXUzMiB1bFZTQlJmQWdjVG9wID0gOTUwMDsKKwl1MzIgdWxWU0JSZkFnY0N1dE9mZkN1cnJlbnQgPSA0MDAwOworCisJdTMyIHVsQVRWSWZBZ2NNb2RlID0gRFJYS19BR0NfQ1RSTF9BVVRPOworCXUzMiB1bEFUVklmQWdjT3V0cHV0TGV2ZWwgPSAwOworCXUzMiB1bEFUVklmQWdjTWluTGV2ZWwgPSAwOworCXUzMiB1bEFUVklmQWdjTWF4TGV2ZWwgPSAwOworCXUzMiB1bEFUVklmQWdjU3BlZWQgPSAzOworCisJdTMyIHVsQVRWUmZBZ2NNb2RlID0gRFJYS19BR0NfQ1RSTF9PRkY7CisJdTMyIHVsQVRWUmZBZ2NPdXRwdXRMZXZlbCA9IDA7CisJdTMyIHVsQVRWUmZBZ2NNaW5MZXZlbCA9IDA7CisJdTMyIHVsQVRWUmZBZ2NNYXhMZXZlbCA9IDA7CisJdTMyIHVsQVRWUmZBZ2NUb3AgPSA5NTAwOworCXUzMiB1bEFUVlJmQWdjQ3V0T2ZmQ3VycmVudCA9IDQwMDA7CisJdTMyIHVsQVRWUmZBZ2NTcGVlZCA9IDM7CisKKwl1MzIgdWxRdWFsODMgPSBERUZBVUxUX01FUl84MzsKKwl1MzIgdWxRdWFsOTMgPSBERUZBVUxUX01FUl85MzsKKworCXUzMiB1bERWQlRTdGF0aWNUU0Nsb2NrID0gMTsKKwl1MzIgdWxEVkJDU3RhdGljVFNDbG9jayA9IDE7CisKKwl1MzIgdWxNcGVnTG9ja1RpbWVPdXQgPSBERUZBVUxUX0RSWEtfTVBFR19MT0NLX1RJTUVPVVQ7CisJdTMyIHVsRGVtb2RMb2NrVGltZU91dCA9IERFRkFVTFRfRFJYS19ERU1PRF9MT0NLX1RJTUVPVVQ7CisKKwkvKiBpb19wYWRfY2ZnIHJlZ2lzdGVyICg4IGJpdCByZWcuKSBNU0IgYml0IGlzIDEgKGRlZmF1bHQgdmFsdWUpICovCisJLyogaW9fcGFkX2NmZ19tb2RlIG91dHB1dCBtb2RlIGlzIGRyaXZlIGFsd2F5cyAqLworCS8qIGlvX3BhZF9jZmdfZHJpdmUgaXMgc2V0IHRvIHBvd2VyIDIgKDIzIG1BKSAqLworCXUzMiB1bEdQSU9DZmcgPSAweDAxMTM7CisJdTMyIHVsU2VyaWFsTW9kZSA9IDE7CisJdTMyIHVsSW52ZXJ0VFNDbG9jayA9IDA7CisJdTMyIHVsVFNEYXRhU3RyZW5ndGggPSBEUlhLX01QRUdfU0VSSUFMX09VVFBVVF9QSU5fRFJJVkVfU1RSRU5HVEg7CisJdTMyIHVsVFNDbG9ja2tTdHJlbmd0aCA9IERSWEtfTVBFR19PVVRQVVRfQ0xLX0RSSVZFX1NUUkVOR1RIOworCXUzMiB1bERWQlRCaXRyYXRlID0gNTAwMDAwMDA7CisJdTMyIHVsRFZCQ0JpdHJhdGUgPSBEUlhLX1FBTV9TWU1CT0xSQVRFX01BWCAqIDg7CisKKwl1MzIgdWxJbnNlcnRSU0J5dGUgPSAwOworCisJdTMyIHVsUmZNaXJyb3IgPSAxOworCXUzMiB1bFBvd2VyRG93biA9IDA7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJc3RhdGUtPm1faGFzTE5BID0gZmFsc2U7CisJc3RhdGUtPm1faGFzRFZCVCA9IGZhbHNlOworCXN0YXRlLT5tX2hhc0RWQkMgPSBmYWxzZTsKKwlzdGF0ZS0+bV9oYXNBVFYgPSBmYWxzZTsKKwlzdGF0ZS0+bV9oYXNPT0IgPSBmYWxzZTsKKwlzdGF0ZS0+bV9oYXNBdWRpbyA9IGZhbHNlOworCisJc3RhdGUtPm1fQ2h1bmtTaXplID0gMTI0OworCisJc3RhdGUtPm1fb3NjQ2xvY2tGcmVxID0gMDsKKwlzdGF0ZS0+bV9zbWFydEFudEludmVydGVkID0gZmFsc2U7CisJc3RhdGUtPm1fYlBEb3duT3BlbkJyaWRnZSA9IGZhbHNlOworCisJLyogcmVhbCBzeXN0ZW0gY2xvY2sgZnJlcXVlbmN5IGluIGtIeiAqLworCXN0YXRlLT5tX3N5c0Nsb2NrRnJlcSA9IDE1MTg3NTsKKwkvKiBUaW1pbmcgZGl2LCAyNTBucy9Qc3lzICovCisJLyogVGltaW5nIGRpdiwgPSAoZGVsYXkgKG5hbm8gc2Vjb25kcykgKiBzeXNjbGsgKGtIeikpLyAxMDAwICovCisJc3RhdGUtPm1fSElDZmdUaW1pbmdEaXYgPSAoKHN0YXRlLT5tX3N5c0Nsb2NrRnJlcSAvIDEwMDApICoKKwkJCQkgICBISV9JMkNfREVMQVkpIC8gMTAwMDsKKwkvKiBDbGlwcGluZyAqLworCWlmIChzdGF0ZS0+bV9ISUNmZ1RpbWluZ0RpdiA+IFNJT19ISV9SQV9SQU1fUEFSXzJfQ0ZHX0RJVl9fTSkKKwkJc3RhdGUtPm1fSElDZmdUaW1pbmdEaXYgPSBTSU9fSElfUkFfUkFNX1BBUl8yX0NGR19ESVZfX007CisJc3RhdGUtPm1fSElDZmdXYWtlVXBLZXkgPSAoc3RhdGUtPmRlbW9kX2FkZHJlc3MgPDwgMSk7CisJLyogcG9ydC9icmlkZ2UvcG93ZXIgZG93biBjdHJsICovCisJc3RhdGUtPm1fSElDZmdDdHJsID0gU0lPX0hJX1JBX1JBTV9QQVJfNV9DRkdfU0xWMF9TTEFWRTsKKworCXN0YXRlLT5tX2JQb3dlckRvd24gPSAodWxQb3dlckRvd24gIT0gMCk7CisKKwlzdGF0ZS0+bV9EUlhLX0ExX1BBVENIX0NPREUgPSBmYWxzZTsKKwlzdGF0ZS0+bV9EUlhLX0ExX1JPTV9DT0RFID0gZmFsc2U7CisJc3RhdGUtPm1fRFJYS19BMl9ST01fQ09ERSA9IGZhbHNlOworCXN0YXRlLT5tX0RSWEtfQTNfUk9NX0NPREUgPSBmYWxzZTsKKwlzdGF0ZS0+bV9EUlhLX0EyX1BBVENIX0NPREUgPSBmYWxzZTsKKwlzdGF0ZS0+bV9EUlhLX0EzX1BBVENIX0NPREUgPSBmYWxzZTsKKworCS8qIEluaXQgQUdDIGFuZCBQR0EgcGFyYW1ldGVycyAqLworCS8qIFZTQiBJRiAqLworCXN0YXRlLT5tX3ZzYklmQWdjQ2ZnLmN0cmxNb2RlID0gKHVsVlNCSWZBZ2NNb2RlKTsKKwlzdGF0ZS0+bV92c2JJZkFnY0NmZy5vdXRwdXRMZXZlbCA9ICh1bFZTQklmQWdjT3V0cHV0TGV2ZWwpOworCXN0YXRlLT5tX3ZzYklmQWdjQ2ZnLm1pbk91dHB1dExldmVsID0gKHVsVlNCSWZBZ2NNaW5MZXZlbCk7CisJc3RhdGUtPm1fdnNiSWZBZ2NDZmcubWF4T3V0cHV0TGV2ZWwgPSAodWxWU0JJZkFnY01heExldmVsKTsKKwlzdGF0ZS0+bV92c2JJZkFnY0NmZy5zcGVlZCA9ICh1bFZTQklmQWdjU3BlZWQpOworCXN0YXRlLT5tX3ZzYlBnYUNmZyA9IDE0MDsKKworCS8qIFZTQiBSRiAqLworCXN0YXRlLT5tX3ZzYlJmQWdjQ2ZnLmN0cmxNb2RlID0gKHVsVlNCUmZBZ2NNb2RlKTsKKwlzdGF0ZS0+bV92c2JSZkFnY0NmZy5vdXRwdXRMZXZlbCA9ICh1bFZTQlJmQWdjT3V0cHV0TGV2ZWwpOworCXN0YXRlLT5tX3ZzYlJmQWdjQ2ZnLm1pbk91dHB1dExldmVsID0gKHVsVlNCUmZBZ2NNaW5MZXZlbCk7CisJc3RhdGUtPm1fdnNiUmZBZ2NDZmcubWF4T3V0cHV0TGV2ZWwgPSAodWxWU0JSZkFnY01heExldmVsKTsKKwlzdGF0ZS0+bV92c2JSZkFnY0NmZy5zcGVlZCA9ICh1bFZTQlJmQWdjU3BlZWQpOworCXN0YXRlLT5tX3ZzYlJmQWdjQ2ZnLnRvcCA9ICh1bFZTQlJmQWdjVG9wKTsKKwlzdGF0ZS0+bV92c2JSZkFnY0NmZy5jdXRPZmZDdXJyZW50ID0gKHVsVlNCUmZBZ2NDdXRPZmZDdXJyZW50KTsKKwlzdGF0ZS0+bV92c2JQcmVTYXdDZmcucmVmZXJlbmNlID0gMHgwNzsKKwlzdGF0ZS0+bV92c2JQcmVTYXdDZmcudXNlUHJlU2F3ID0gdHJ1ZTsKKworCXN0YXRlLT5tX1F1YWxpdHk4M3BlcmNlbnQgPSBERUZBVUxUX01FUl84MzsKKwlzdGF0ZS0+bV9RdWFsaXR5OTNwZXJjZW50ID0gREVGQVVMVF9NRVJfOTM7CisJaWYgKHVsUXVhbDkzIDw9IDUwMCAmJiB1bFF1YWw4MyA8IHVsUXVhbDkzKSB7CisJCXN0YXRlLT5tX1F1YWxpdHk4M3BlcmNlbnQgPSB1bFF1YWw4MzsKKwkJc3RhdGUtPm1fUXVhbGl0eTkzcGVyY2VudCA9IHVsUXVhbDkzOworCX0KKworCS8qIEFUViBJRiAqLworCXN0YXRlLT5tX2F0dklmQWdjQ2ZnLmN0cmxNb2RlID0gKHVsQVRWSWZBZ2NNb2RlKTsKKwlzdGF0ZS0+bV9hdHZJZkFnY0NmZy5vdXRwdXRMZXZlbCA9ICh1bEFUVklmQWdjT3V0cHV0TGV2ZWwpOworCXN0YXRlLT5tX2F0dklmQWdjQ2ZnLm1pbk91dHB1dExldmVsID0gKHVsQVRWSWZBZ2NNaW5MZXZlbCk7CisJc3RhdGUtPm1fYXR2SWZBZ2NDZmcubWF4T3V0cHV0TGV2ZWwgPSAodWxBVFZJZkFnY01heExldmVsKTsKKwlzdGF0ZS0+bV9hdHZJZkFnY0NmZy5zcGVlZCA9ICh1bEFUVklmQWdjU3BlZWQpOworCisJLyogQVRWIFJGICovCisJc3RhdGUtPm1fYXR2UmZBZ2NDZmcuY3RybE1vZGUgPSAodWxBVFZSZkFnY01vZGUpOworCXN0YXRlLT5tX2F0dlJmQWdjQ2ZnLm91dHB1dExldmVsID0gKHVsQVRWUmZBZ2NPdXRwdXRMZXZlbCk7CisJc3RhdGUtPm1fYXR2UmZBZ2NDZmcubWluT3V0cHV0TGV2ZWwgPSAodWxBVFZSZkFnY01pbkxldmVsKTsKKwlzdGF0ZS0+bV9hdHZSZkFnY0NmZy5tYXhPdXRwdXRMZXZlbCA9ICh1bEFUVlJmQWdjTWF4TGV2ZWwpOworCXN0YXRlLT5tX2F0dlJmQWdjQ2ZnLnNwZWVkID0gKHVsQVRWUmZBZ2NTcGVlZCk7CisJc3RhdGUtPm1fYXR2UmZBZ2NDZmcudG9wID0gKHVsQVRWUmZBZ2NUb3ApOworCXN0YXRlLT5tX2F0dlJmQWdjQ2ZnLmN1dE9mZkN1cnJlbnQgPSAodWxBVFZSZkFnY0N1dE9mZkN1cnJlbnQpOworCXN0YXRlLT5tX2F0dlByZVNhd0NmZy5yZWZlcmVuY2UgPSAweDA0OworCXN0YXRlLT5tX2F0dlByZVNhd0NmZy51c2VQcmVTYXcgPSB0cnVlOworCisKKwkvKiBEVkJUIFJGICovCisJc3RhdGUtPm1fZHZidFJmQWdjQ2ZnLmN0cmxNb2RlID0gRFJYS19BR0NfQ1RSTF9PRkY7CisJc3RhdGUtPm1fZHZidFJmQWdjQ2ZnLm91dHB1dExldmVsID0gMDsKKwlzdGF0ZS0+bV9kdmJ0UmZBZ2NDZmcubWluT3V0cHV0TGV2ZWwgPSAwOworCXN0YXRlLT5tX2R2YnRSZkFnY0NmZy5tYXhPdXRwdXRMZXZlbCA9IDB4RkZGRjsKKwlzdGF0ZS0+bV9kdmJ0UmZBZ2NDZmcudG9wID0gMHgyMTAwOworCXN0YXRlLT5tX2R2YnRSZkFnY0NmZy5jdXRPZmZDdXJyZW50ID0gNDAwMDsKKwlzdGF0ZS0+bV9kdmJ0UmZBZ2NDZmcuc3BlZWQgPSAxOworCisKKwkvKiBEVkJUIElGICovCisJc3RhdGUtPm1fZHZidElmQWdjQ2ZnLmN0cmxNb2RlID0gRFJYS19BR0NfQ1RSTF9BVVRPOworCXN0YXRlLT5tX2R2YnRJZkFnY0NmZy5vdXRwdXRMZXZlbCA9IDA7CisJc3RhdGUtPm1fZHZidElmQWdjQ2ZnLm1pbk91dHB1dExldmVsID0gMDsKKwlzdGF0ZS0+bV9kdmJ0SWZBZ2NDZmcubWF4T3V0cHV0TGV2ZWwgPSA5MDAwOworCXN0YXRlLT5tX2R2YnRJZkFnY0NmZy50b3AgPSAxMzQyNDsKKwlzdGF0ZS0+bV9kdmJ0SWZBZ2NDZmcuY3V0T2ZmQ3VycmVudCA9IDA7CisJc3RhdGUtPm1fZHZidElmQWdjQ2ZnLnNwZWVkID0gMzsKKwlzdGF0ZS0+bV9kdmJ0SWZBZ2NDZmcuRmFzdENsaXBDdHJsRGVsYXkgPSAzMDsKKwlzdGF0ZS0+bV9kdmJ0SWZBZ2NDZmcuSW5nYWluVGd0TWF4ID0gMzAwMDA7CisJLyogc3RhdGUtPm1fZHZidFBnYUNmZyA9IDE0MDsgKi8KKworCXN0YXRlLT5tX2R2YnRQcmVTYXdDZmcucmVmZXJlbmNlID0gNDsKKwlzdGF0ZS0+bV9kdmJ0UHJlU2F3Q2ZnLnVzZVByZVNhdyA9IGZhbHNlOworCisJLyogUUFNIFJGICovCisJc3RhdGUtPm1fcWFtUmZBZ2NDZmcuY3RybE1vZGUgPSBEUlhLX0FHQ19DVFJMX09GRjsKKwlzdGF0ZS0+bV9xYW1SZkFnY0NmZy5vdXRwdXRMZXZlbCA9IDA7CisJc3RhdGUtPm1fcWFtUmZBZ2NDZmcubWluT3V0cHV0TGV2ZWwgPSA2MDIzOworCXN0YXRlLT5tX3FhbVJmQWdjQ2ZnLm1heE91dHB1dExldmVsID0gMjcwMDA7CisJc3RhdGUtPm1fcWFtUmZBZ2NDZmcudG9wID0gMHgyMzgwOworCXN0YXRlLT5tX3FhbVJmQWdjQ2ZnLmN1dE9mZkN1cnJlbnQgPSA0MDAwOworCXN0YXRlLT5tX3FhbVJmQWdjQ2ZnLnNwZWVkID0gMzsKKworCS8qIFFBTSBJRiAqLworCXN0YXRlLT5tX3FhbUlmQWdjQ2ZnLmN0cmxNb2RlID0gRFJYS19BR0NfQ1RSTF9BVVRPOworCXN0YXRlLT5tX3FhbUlmQWdjQ2ZnLm91dHB1dExldmVsID0gMDsKKwlzdGF0ZS0+bV9xYW1JZkFnY0NmZy5taW5PdXRwdXRMZXZlbCA9IDA7CisJc3RhdGUtPm1fcWFtSWZBZ2NDZmcubWF4T3V0cHV0TGV2ZWwgPSA5MDAwOworCXN0YXRlLT5tX3FhbUlmQWdjQ2ZnLnRvcCA9IDB4MDUxMTsKKwlzdGF0ZS0+bV9xYW1JZkFnY0NmZy5jdXRPZmZDdXJyZW50ID0gMDsKKwlzdGF0ZS0+bV9xYW1JZkFnY0NmZy5zcGVlZCA9IDM7CisJc3RhdGUtPm1fcWFtSWZBZ2NDZmcuSW5nYWluVGd0TWF4ID0gNTExOTsKKwlzdGF0ZS0+bV9xYW1JZkFnY0NmZy5GYXN0Q2xpcEN0cmxEZWxheSA9IDUwOworCisJc3RhdGUtPm1fcWFtUGdhQ2ZnID0gMTQwOworCXN0YXRlLT5tX3FhbVByZVNhd0NmZy5yZWZlcmVuY2UgPSA0OworCXN0YXRlLT5tX3FhbVByZVNhd0NmZy51c2VQcmVTYXcgPSBmYWxzZTsKKworCXN0YXRlLT5tX09wZXJhdGlvbk1vZGUgPSBPTV9OT05FOworCXN0YXRlLT5tX0RyeGtTdGF0ZSA9IERSWEtfVU5JTklUSUFMSVpFRDsKKworCS8qIE1QRUcgb3V0cHV0IGNvbmZpZ3VyYXRpb24gKi8KKwlzdGF0ZS0+bV9lbmFibGVNUEVHT3V0cHV0ID0gdHJ1ZTsJLyogSWYgVFJVRTsgZW5hYmxlIE1QRUcgb3VwdXQgKi8KKwlzdGF0ZS0+bV9pbnNlcnRSU0J5dGUgPSBmYWxzZTsJLyogSWYgVFJVRTsgaW5zZXJ0IFJTIGJ5dGUgKi8KKwlzdGF0ZS0+bV9lbmFibGVQYXJhbGxlbCA9IHRydWU7CS8qIElmIFRSVUU7CisJCQkJCSAgIHBhcmFsbGVsIG91dCBvdGhlcndpc2Ugc2VyaWFsICovCisJc3RhdGUtPm1faW52ZXJ0REFUQSA9IGZhbHNlOwkvKiBJZiBUUlVFOyBpbnZlcnQgREFUQSBzaWduYWxzICovCisJc3RhdGUtPm1faW52ZXJ0RVJSID0gZmFsc2U7CS8qIElmIFRSVUU7IGludmVydCBFUlIgc2lnbmFsICovCisJc3RhdGUtPm1faW52ZXJ0U1RSID0gZmFsc2U7CS8qIElmIFRSVUU7IGludmVydCBTVFIgc2lnbmFscyAqLworCXN0YXRlLT5tX2ludmVydFZBTCA9IGZhbHNlOwkvKiBJZiBUUlVFOyBpbnZlcnQgVkFMIHNpZ25hbHMgKi8KKwlzdGF0ZS0+bV9pbnZlcnRDTEsgPSAodWxJbnZlcnRUU0Nsb2NrICE9IDApOwkvKiBJZiBUUlVFOyBpbnZlcnQgQ0xLIHNpZ25hbHMgKi8KKwlzdGF0ZS0+bV9EVkJUU3RhdGljQ0xLID0gKHVsRFZCVFN0YXRpY1RTQ2xvY2sgIT0gMCk7CisJc3RhdGUtPm1fRFZCQ1N0YXRpY0NMSyA9ICh1bERWQkNTdGF0aWNUU0Nsb2NrICE9IDApOworCS8qIElmIFRSVUU7IHN0YXRpYyBNUEVHIGNsb2NrcmF0ZSB3aWxsIGJlIHVzZWQ7CisJICAgb3RoZXJ3aXNlIGNsb2NrcmF0ZSB3aWxsIGFkYXB0IHRvIHRoZSBiaXRyYXRlIG9mIHRoZSBUUyAqLworCisJc3RhdGUtPm1fRFZCVEJpdHJhdGUgPSB1bERWQlRCaXRyYXRlOworCXN0YXRlLT5tX0RWQkNCaXRyYXRlID0gdWxEVkJDQml0cmF0ZTsKKworCXN0YXRlLT5tX1RTRGF0YVN0cmVuZ3RoID0gKHVsVFNEYXRhU3RyZW5ndGggJiAweDA3KTsKKwlzdGF0ZS0+bV9UU0Nsb2Nra1N0cmVuZ3RoID0gKHVsVFNDbG9ja2tTdHJlbmd0aCAmIDB4MDcpOworCisJLyogTWF4aW11bSBiaXRyYXRlIGluIGIvcyBpbiBjYXNlIHN0YXRpYyBjbG9ja3JhdGUgaXMgc2VsZWN0ZWQgKi8KKwlzdGF0ZS0+bV9tcGVnVHNTdGF0aWNCaXRyYXRlID0gMTkzOTI2NTg7CisJc3RhdGUtPm1fZGlzYWJsZVRFSWhhbmRsaW5nID0gZmFsc2U7CisKKwlpZiAodWxJbnNlcnRSU0J5dGUpCisJCXN0YXRlLT5tX2luc2VydFJTQnl0ZSA9IHRydWU7CisKKwlzdGF0ZS0+bV9NcGVnTG9ja1RpbWVPdXQgPSBERUZBVUxUX0RSWEtfTVBFR19MT0NLX1RJTUVPVVQ7CisJaWYgKHVsTXBlZ0xvY2tUaW1lT3V0IDwgMTAwMDApCisJCXN0YXRlLT5tX01wZWdMb2NrVGltZU91dCA9IHVsTXBlZ0xvY2tUaW1lT3V0OworCXN0YXRlLT5tX0RlbW9kTG9ja1RpbWVPdXQgPSBERUZBVUxUX0RSWEtfREVNT0RfTE9DS19USU1FT1VUOworCWlmICh1bERlbW9kTG9ja1RpbWVPdXQgPCAxMDAwMCkKKwkJc3RhdGUtPm1fRGVtb2RMb2NrVGltZU91dCA9IHVsRGVtb2RMb2NrVGltZU91dDsKKworCS8qIFFBTSBkZWZhdWx0cyAqLworCXN0YXRlLT5tX0NvbnN0ZWxsYXRpb24gPSBEUlhfQ09OU1RFTExBVElPTl9BVVRPOworCXN0YXRlLT5tX3FhbUludGVybGVhdmVNb2RlID0gRFJYS19RQU1fSTEyX0oxNzsKKwlzdGF0ZS0+bV9mZWNSc1BsZW4gPSAyMDQgKiA4OwkvKiBmZWNSc1BsZW4gIGFubmV4IEEgKi8KKwlzdGF0ZS0+bV9mZWNSc1ByZXNjYWxlID0gMTsKKworCXN0YXRlLT5tX3NxaVNwZWVkID0gRFJYS19EVkJUX1NRSV9TUEVFRF9NRURJVU07CisJc3RhdGUtPm1fYWdjRmFzdENsaXBDdHJsRGVsYXkgPSAwOworCisJc3RhdGUtPm1fR1BJT0NmZyA9ICh1bEdQSU9DZmcpOworCisJc3RhdGUtPm1fYlBvd2VyRG93biA9IGZhbHNlOworCXN0YXRlLT5tX2N1cnJlbnRQb3dlck1vZGUgPSBEUlhfUE9XRVJfRE9XTjsKKworCXN0YXRlLT5tX2VuYWJsZVBhcmFsbGVsID0gKHVsU2VyaWFsTW9kZSA9PSAwKTsKKworCXN0YXRlLT5tX3JmbWlycm9yID0gKHVsUmZNaXJyb3IgPT0gMCk7CisJc3RhdGUtPm1fSWZBZ2NQb2wgPSBmYWxzZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBEUlhYX09wZW4oc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXMgPSAwOworCXUzMiBqdGFnID0gMDsKKwl1MTYgYmlkID0gMDsKKwl1MTYga2V5ID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisJLyogc3RvcCBsb2NrIGluZGljYXRvciBwcm9jZXNzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9HUElPX19BLCBTQ1VfUkFNX0dQSU9fSFdfTE9DS19JTkRfRElTQUJMRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJLyogQ2hlY2sgZGV2aWNlIGlkICovCisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBTSU9fVE9QX0NPTU1fS0VZX19BLCAma2V5KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fVE9QX0NPTU1fS0VZX19BLCBTSU9fVE9QX0NPTU1fS0VZX0tFWSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gcmVhZDMyKHN0YXRlLCBTSU9fVE9QX0pUQUdJRF9MT19fQSwgJmp0YWcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0lPX1BEUl9VSU9fSU5fSElfX0EsICZiaWQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19UT1BfQ09NTV9LRVlfX0EsIGtleSk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBHZXREZXZpY2VDYXBhYmlsaXRpZXMoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCXUxNiBzaW9QZHJPaHdDZmcgPSAwOworCXUzMiBzaW9Ub3BKdGFnaWRMbyA9IDA7CisJaW50IHN0YXR1czsKKwljb25zdCBjaGFyICpzcGluID0gIiI7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJLyogZHJpdmVyIDAuOS4wICovCisJLyogc3RvcCBsb2NrIGluZGljYXRvciBwcm9jZXNzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9HUElPX19BLCBTQ1VfUkFNX0dQSU9fSFdfTE9DS19JTkRfRElTQUJMRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1RPUF9DT01NX0tFWV9fQSwgMHhGQUJBKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNJT19QRFJfT0hXX0NGR19fQSwgJnNpb1Bkck9od0NmZyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1RPUF9DT01NX0tFWV9fQSwgMHgwMDAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN3aXRjaCAoKHNpb1Bkck9od0NmZyAmIFNJT19QRFJfT0hXX0NGR19GUkVGX1NFTF9fTSkpIHsKKwljYXNlIDA6CisJCS8qIGlnbm9yZSAoYnlwYXNzID8pICovCisJCWJyZWFrOworCWNhc2UgMToKKwkJLyogMjcgTUh6ICovCisJCXN0YXRlLT5tX29zY0Nsb2NrRnJlcSA9IDI3MDAwOworCQlicmVhazsKKwljYXNlIDI6CisJCS8qIDIwLjI1IE1IeiAqLworCQlzdGF0ZS0+bV9vc2NDbG9ja0ZyZXEgPSAyMDI1MDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQkvKiA0IE1IeiAqLworCQlzdGF0ZS0+bV9vc2NDbG9ja0ZyZXEgPSAyMDI1MDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBDbG9jayBGcmVxdWVuY3kgaXMgdW5rb253blxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKgorCQlEZXRlcm1pbmUgZGV2aWNlIGNhcGFiaWxpdGllcworCQlCYXNlZCBvbiBwaW5uaW5nIHYxNAorCQkqLworCXN0YXR1cyA9IHJlYWQzMihzdGF0ZSwgU0lPX1RPUF9KVEFHSURfTE9fX0EsICZzaW9Ub3BKdGFnaWRMbyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJLyogZHJpdmVyIDAuOS4wICovCisJc3dpdGNoICgoc2lvVG9wSnRhZ2lkTG8gPj4gMjkpICYgMHhGKSB7CisJY2FzZSAwOgorCQlzdGF0ZS0+bV9kZXZpY2VTcGluID0gRFJYS19TUElOX0ExOworCQlzcGluID0gIkExIjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzdGF0ZS0+bV9kZXZpY2VTcGluID0gRFJYS19TUElOX0EyOworCQlzcGluID0gIkEyIjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzdGF0ZS0+bV9kZXZpY2VTcGluID0gRFJYS19TUElOX0EzOworCQlzcGluID0gIkEzIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RhdGUtPm1fZGV2aWNlU3BpbiA9IERSWEtfU1BJTl9VTktOT1dOOworCQlzdGF0dXMgPSAtRUlOVkFMOworCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IFNwaW4gdW5rbm93blxuIik7CisJCWdvdG8gZXJyb3IyOworCX0KKwlzd2l0Y2ggKChzaW9Ub3BKdGFnaWRMbyA+PiAxMikgJiAweEZGKSB7CisJY2FzZSAweDEzOgorCQkvKiB0eXBlSWQgPSBEUlgzOTEzS19UWVBFX0lEICovCisJCXN0YXRlLT5tX2hhc0xOQSA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNPT0IgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzQVRWID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc0F1ZGlvID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc0RWQlQgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNEVkJDID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzU0FXU1cgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNHUElPMiA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNHUElPMSA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNJUlFOID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgMHgxNToKKwkJLyogdHlwZUlkID0gRFJYMzkxNUtfVFlQRV9JRCAqLworCQlzdGF0ZS0+bV9oYXNMTkEgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzT09CID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc0FUViA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0F1ZGlvID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc0RWQlQgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNEVkJDID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc1NBV1NXID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzR1BJTzIgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNHUElPMSA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0lSUU4gPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSAweDE2OgorCQkvKiB0eXBlSWQgPSBEUlgzOTE2S19UWVBFX0lEICovCisJCXN0YXRlLT5tX2hhc0xOQSA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNPT0IgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzQVRWID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzQXVkaW8gPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzRFZCVCA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0RWQkMgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzU0FXU1cgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNHUElPMiA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0dQSU8xID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzSVJRTiA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIDB4MTg6CisJCS8qIHR5cGVJZCA9IERSWDM5MThLX1RZUEVfSUQgKi8KKwkJc3RhdGUtPm1faGFzTE5BID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc09PQiA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNBVFYgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNBdWRpbyA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0RWQlQgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNEVkJDID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc1NBV1NXID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzR1BJTzIgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNHUElPMSA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0lSUU4gPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSAweDIxOgorCQkvKiB0eXBlSWQgPSBEUlgzOTIxS19UWVBFX0lEICovCisJCXN0YXRlLT5tX2hhc0xOQSA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNPT0IgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzQVRWID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzQXVkaW8gPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNEVkJUID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzRFZCQyA9IHRydWU7CisJCXN0YXRlLT5tX2hhc1NBV1NXID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzR1BJTzIgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNHUElPMSA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0lSUU4gPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSAweDIzOgorCQkvKiB0eXBlSWQgPSBEUlgzOTIzS19UWVBFX0lEICovCisJCXN0YXRlLT5tX2hhc0xOQSA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNPT0IgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzQVRWID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzQXVkaW8gPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNEVkJUID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzRFZCQyA9IHRydWU7CisJCXN0YXRlLT5tX2hhc1NBV1NXID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzR1BJTzIgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNHUElPMSA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0lSUU4gPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSAweDI1OgorCQkvKiB0eXBlSWQgPSBEUlgzOTI1S19UWVBFX0lEICovCisJCXN0YXRlLT5tX2hhc0xOQSA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNPT0IgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzQVRWID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzQXVkaW8gPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNEVkJUID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzRFZCQyA9IHRydWU7CisJCXN0YXRlLT5tX2hhc1NBV1NXID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzR1BJTzIgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNHUElPMSA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0lSUU4gPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSAweDI2OgorCQkvKiB0eXBlSWQgPSBEUlgzOTI2S19UWVBFX0lEICovCisJCXN0YXRlLT5tX2hhc0xOQSA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNPT0IgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzQVRWID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzQXVkaW8gPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzRFZCVCA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0RWQkMgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNTQVdTVyA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0dQSU8yID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzR1BJTzEgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNJUlFOID0gZmFsc2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRGV2aWNlSUQgMHglMDJ4IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkoKHNpb1RvcEp0YWdpZExvID4+IDEyKSAmIDB4RkYpKTsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjI7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTworCSAgICAgICAiZHJ4azogZGV0ZWN0ZWQgYSBkcngtMzklMDJ4aywgc3BpbiAlcywgeHRhbCAlZC4lMDNkIE1IelxuIiwKKwkgICAgICAgKChzaW9Ub3BKdGFnaWRMbyA+PiAxMikgJiAweEZGKSwgc3BpbiwKKwkgICAgICAgc3RhdGUtPm1fb3NjQ2xvY2tGcmVxIC8gMTAwMCwKKwkgICAgICAgc3RhdGUtPm1fb3NjQ2xvY2tGcmVxICUgMTAwMCk7CisKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKworZXJyb3IyOgorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgSElfQ29tbWFuZChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUxNiBjbWQsIHUxNiAqcFJlc3VsdCkKK3sKKwlpbnQgc3RhdHVzOworCWJvb2wgcG93ZXJkb3duX2NtZDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwkvKiBXcml0ZSBjb21tYW5kICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0hJX1JBX1JBTV9DTURfX0EsIGNtZCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJaWYgKGNtZCA9PSBTSU9fSElfUkFfUkFNX0NNRF9SRVNFVCkKKwkJbXNsZWVwKDEpOworCisJcG93ZXJkb3duX2NtZCA9CisJICAgIChib29sKSAoKGNtZCA9PSBTSU9fSElfUkFfUkFNX0NNRF9DT05GSUcpICYmCisJCSAgICAoKHN0YXRlLT5tX0hJQ2ZnQ3RybCkgJgorCQkgICAgIFNJT19ISV9SQV9SQU1fUEFSXzVfQ0ZHX1NMRUVQX19NKSA9PQorCQkgICAgU0lPX0hJX1JBX1JBTV9QQVJfNV9DRkdfU0xFRVBfWlpaKTsKKwlpZiAocG93ZXJkb3duX2NtZCA9PSBmYWxzZSkgeworCQkvKiBXYWl0IHVudGlsIGNvbW1hbmQgcmR5ICovCisJCXUzMiByZXRyeUNvdW50ID0gMDsKKwkJdTE2IHdhaXRDbWQ7CisKKwkJZG8geworCQkJbXNsZWVwKDEpOworCQkJcmV0cnlDb3VudCArPSAxOworCQkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBTSU9fSElfUkFfUkFNX0NNRF9fQSwKKwkJCQkJICAmd2FpdENtZCk7CisJCX0gd2hpbGUgKChzdGF0dXMgPCAwKSAmJiAocmV0cnlDb3VudCA8IERSWEtfTUFYX1JFVFJJRVMpCisJCQkgJiYgKHdhaXRDbWQgIT0gMCkpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0lPX0hJX1JBX1JBTV9SRVNfX0EsIHBSZXN1bHQpOworCX0KK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgSElfQ2ZnQ29tbWFuZChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwltdXRleF9sb2NrKCZzdGF0ZS0+bXV0ZXgpOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0hJX1JBX1JBTV9QQVJfNl9fQSwgc3RhdGUtPm1fSElDZmdUaW1lb3V0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fSElfUkFfUkFNX1BBUl81X19BLCBzdGF0ZS0+bV9ISUNmZ0N0cmwpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19ISV9SQV9SQU1fUEFSXzRfX0EsIHN0YXRlLT5tX0hJQ2ZnV2FrZVVwS2V5KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fSElfUkFfUkFNX1BBUl8zX19BLCBzdGF0ZS0+bV9ISUNmZ0JyaWRnZURlbGF5KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fSElfUkFfUkFNX1BBUl8yX19BLCBzdGF0ZS0+bV9ISUNmZ1RpbWluZ0Rpdik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0hJX1JBX1JBTV9QQVJfMV9fQSwgU0lPX0hJX1JBX1JBTV9QQVJfMV9QQVIxX1NFQ19LRVkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IEhJX0NvbW1hbmQoc3RhdGUsIFNJT19ISV9SQV9SQU1fQ01EX0NPTkZJRywgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0ZS0+bV9ISUNmZ0N0cmwgJj0gflNJT19ISV9SQV9SQU1fUEFSXzVfQ0ZHX1NMRUVQX1paWjsKK2Vycm9yOgorCW11dGV4X3VubG9jaygmc3RhdGUtPm11dGV4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBJbml0SEkoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWRwcmludGsoMSwgIlxuIik7CisKKwlzdGF0ZS0+bV9ISUNmZ1dha2VVcEtleSA9IChzdGF0ZS0+ZGVtb2RfYWRkcmVzcyA8PCAxKTsKKwlzdGF0ZS0+bV9ISUNmZ1RpbWVvdXQgPSAweDk2RkY7CisJLyogcG9ydC9icmlkZ2UvcG93ZXIgZG93biBjdHJsICovCisJc3RhdGUtPm1fSElDZmdDdHJsID0gU0lPX0hJX1JBX1JBTV9QQVJfNV9DRkdfU0xWMF9TTEFWRTsKKworCXJldHVybiBISV9DZmdDb21tYW5kKHN0YXRlKTsKK30KKworc3RhdGljIGludCBNUEVHVFNDb25maWd1cmVQaW5zKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgYm9vbCBtcGVnRW5hYmxlKQoreworCWludCBzdGF0dXMgPSAtMTsKKwl1MTYgc2lvUGRyTWNsa0NmZyA9IDA7CisJdTE2IHNpb1Bkck1keENmZyA9IDA7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJLyogc3RvcCBsb2NrIGluZGljYXRvciBwcm9jZXNzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9HUElPX19BLCBTQ1VfUkFNX0dQSU9fSFdfTE9DS19JTkRfRElTQUJMRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiAgTVBFRyBUUyBwYWQgY29uZmlndXJhdGlvbiAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19UT1BfQ09NTV9LRVlfX0EsIDB4RkFCQSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAobXBlZ0VuYWJsZSA9PSBmYWxzZSkgeworCQkvKiAgU2V0IE1QRUcgVFMgcGFkcyB0byBpbnB1dG1vZGUgKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NU1RSVF9DRkdfX0EsIDB4MDAwMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRVJSX0NGR19fQSwgMHgwMDAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01DTEtfQ0ZHX19BLCAweDAwMDApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTVZBTF9DRkdfX0EsIDB4MDAwMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDBfQ0ZHX19BLCAweDAwMDApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQxX0NGR19fQSwgMHgwMDAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01EMl9DRkdfX0EsIDB4MDAwMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDNfQ0ZHX19BLCAweDAwMDApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQ0X0NGR19fQSwgMHgwMDAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01ENV9DRkdfX0EsIDB4MDAwMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDZfQ0ZHX19BLCAweDAwMDApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQ3X0NGR19fQSwgMHgwMDAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCX0gZWxzZSB7CisJCS8qIEVuYWJsZSBNUEVHIG91dHB1dCAqLworCQlzaW9QZHJNZHhDZmcgPQorCQkJKChzdGF0ZS0+bV9UU0RhdGFTdHJlbmd0aCA8PAorCQkJU0lPX1BEUl9NRDBfQ0ZHX0RSSVZFX19CKSB8IDB4MDAwMyk7CisJCXNpb1Bkck1jbGtDZmcgPSAoKHN0YXRlLT5tX1RTQ2xvY2trU3RyZW5ndGggPDwKKwkJCQkJU0lPX1BEUl9NQ0xLX0NGR19EUklWRV9fQikgfAorCQkJCQkweDAwMDMpOworCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTVNUUlRfQ0ZHX19BLCBzaW9QZHJNZHhDZmcpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUVSUl9DRkdfX0EsIDB4MDAwMCk7CS8qIERpc2FibGUgKi8KKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01WQUxfQ0ZHX19BLCAweDAwMDApOwkvKiBEaXNhYmxlICovCisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJaWYgKHN0YXRlLT5tX2VuYWJsZVBhcmFsbGVsID09IHRydWUpIHsKKwkJCS8qIHBhcmFsZWwgLT4gZW5hYmxlIE1EMSB0byBNRDcgKi8KKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQxX0NGR19fQSwgc2lvUGRyTWR4Q2ZnKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01EMl9DRkdfX0EsIHNpb1Bkck1keENmZyk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDNfQ0ZHX19BLCBzaW9QZHJNZHhDZmcpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQ0X0NGR19fQSwgc2lvUGRyTWR4Q2ZnKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01ENV9DRkdfX0EsIHNpb1Bkck1keENmZyk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDZfQ0ZHX19BLCBzaW9QZHJNZHhDZmcpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQ3X0NGR19fQSwgc2lvUGRyTWR4Q2ZnKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCX0gZWxzZSB7CisJCQlzaW9QZHJNZHhDZmcgPSAoKHN0YXRlLT5tX1RTRGF0YVN0cmVuZ3RoIDw8CisJCQkJCQlTSU9fUERSX01EMF9DRkdfRFJJVkVfX0IpCisJCQkJCXwgMHgwMDAzKTsKKwkJCS8qIHNlcmlhbCAtPiBkaXNhYmxlIE1EMSB0byBNRDcgKi8KKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQxX0NGR19fQSwgMHgwMDAwKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01EMl9DRkdfX0EsIDB4MDAwMCk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDNfQ0ZHX19BLCAweDAwMDApOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQ0X0NGR19fQSwgMHgwMDAwKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01ENV9DRkdfX0EsIDB4MDAwMCk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDZfQ0ZHX19BLCAweDAwMDApOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQ3X0NGR19fQSwgMHgwMDAwKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCX0KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NQ0xLX0NGR19fQSwgc2lvUGRyTWNsa0NmZyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDBfQ0ZHX19BLCBzaW9QZHJNZHhDZmcpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCS8qICBFbmFibGUgTUIgb3V0cHV0IG92ZXIgTVBFRyBwYWRzIGFuZCBjdGwgaW5wdXQgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01PTl9DRkdfX0EsIDB4MDAwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJLyogIFdyaXRlIG5vbWFnaWMgd29yZCB0byBlbmFibGUgcGRyIHJlZyB3cml0ZSAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19UT1BfQ09NTV9LRVlfX0EsIDB4MDAwMCk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBNUEVHVFNEaXNhYmxlKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlkcHJpbnRrKDEsICJcbiIpOworCisJcmV0dXJuIE1QRUdUU0NvbmZpZ3VyZVBpbnMoc3RhdGUsIGZhbHNlKTsKK30KKworc3RhdGljIGludCBCTENoYWluQ21kKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwKKwkJICAgICAgdTE2IHJvbU9mZnNldCwgdTE2IG5yT2ZFbGVtZW50cywgdTMyIHRpbWVPdXQpCit7CisJdTE2IGJsU3RhdHVzID0gMDsKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZW5kOworCisJZHByaW50aygxLCAiXG4iKTsKKwltdXRleF9sb2NrKCZzdGF0ZS0+bXV0ZXgpOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19CTF9NT0RFX19BLCBTSU9fQkxfTU9ERV9DSEFJTik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0JMX0NIQUlOX0FERFJfX0EsIHJvbU9mZnNldCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0JMX0NIQUlOX0xFTl9fQSwgbnJPZkVsZW1lbnRzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQkxfRU5BQkxFX19BLCBTSU9fQkxfRU5BQkxFX09OKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCWVuZCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHRpbWVPdXQpOworCWRvIHsKKwkJbXNsZWVwKDEpOworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNJT19CTF9TVEFUVVNfX0EsICZibFN0YXR1cyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9IHdoaWxlICgoYmxTdGF0dXMgPT0gMHgxKSAmJgorCQkJKCh0aW1lX2lzX2FmdGVyX2ppZmZpZXMoZW5kKSkpKTsKKworCWlmIChibFN0YXR1cyA9PSAweDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBTSU8gbm90IHJlYWR5XG4iKTsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjI7CisJfQorZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworZXJyb3IyOgorCW11dGV4X3VubG9jaygmc3RhdGUtPm11dGV4KTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXRpYyBpbnQgRG93bmxvYWRNaWNyb2NvZGUoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLAorCQkJICAgICBjb25zdCB1OCBwTUNJbWFnZVtdLCB1MzIgTGVuZ3RoKQoreworCWNvbnN0IHU4ICpwU3JjID0gcE1DSW1hZ2U7CisJdTE2IEZsYWdzOworCXUxNiBEcmFpbjsKKwl1MzIgQWRkcmVzczsKKwl1MTYgbkJsb2NrczsKKwl1MTYgQmxvY2tTaXplOworCXUxNiBCbG9ja0NSQzsKKwl1MzIgb2Zmc2V0ID0gMDsKKwl1MzIgaTsKKwlpbnQgc3RhdHVzID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwkvKiBkb3duIHRoZSBkcmFpbiAod2UgZG9uIGNhcmUgYWJvdXQgTUFHSUNfV09SRCkgKi8KKwlEcmFpbiA9IChwU3JjWzBdIDw8IDgpIHwgcFNyY1sxXTsKKwlwU3JjICs9IHNpemVvZih1MTYpOworCW9mZnNldCArPSBzaXplb2YodTE2KTsKKwluQmxvY2tzID0gKHBTcmNbMF0gPDwgOCkgfCBwU3JjWzFdOworCXBTcmMgKz0gc2l6ZW9mKHUxNik7CisJb2Zmc2V0ICs9IHNpemVvZih1MTYpOworCisJZm9yIChpID0gMDsgaSA8IG5CbG9ja3M7IGkgKz0gMSkgeworCQlBZGRyZXNzID0gKHBTcmNbMF0gPDwgMjQpIHwgKHBTcmNbMV0gPDwgMTYpIHwKKwkJICAgIChwU3JjWzJdIDw8IDgpIHwgcFNyY1szXTsKKwkJcFNyYyArPSBzaXplb2YodTMyKTsKKwkJb2Zmc2V0ICs9IHNpemVvZih1MzIpOworCisJCUJsb2NrU2l6ZSA9ICgocFNyY1swXSA8PCA4KSB8IHBTcmNbMV0pICogc2l6ZW9mKHUxNik7CisJCXBTcmMgKz0gc2l6ZW9mKHUxNik7CisJCW9mZnNldCArPSBzaXplb2YodTE2KTsKKworCQlGbGFncyA9IChwU3JjWzBdIDw8IDgpIHwgcFNyY1sxXTsKKwkJcFNyYyArPSBzaXplb2YodTE2KTsKKwkJb2Zmc2V0ICs9IHNpemVvZih1MTYpOworCisJCUJsb2NrQ1JDID0gKHBTcmNbMF0gPDwgOCkgfCBwU3JjWzFdOworCQlwU3JjICs9IHNpemVvZih1MTYpOworCQlvZmZzZXQgKz0gc2l6ZW9mKHUxNik7CisKKwkJaWYgKG9mZnNldCArIEJsb2NrU2l6ZSA+IExlbmd0aCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBGaXJtd2FyZSBpcyBjb3JydXB0ZWQuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJc3RhdHVzID0gd3JpdGVfYmxvY2soc3RhdGUsIEFkZHJlc3MsIEJsb2NrU2l6ZSwgcFNyYyk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIHdoaWxlIGxvYWRpbmcgZmlybXdhcmVcbiIsIHN0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCQlwU3JjICs9IEJsb2NrU2l6ZTsKKwkJb2Zmc2V0ICs9IEJsb2NrU2l6ZTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBEVkJURW5hYmxlT0ZETVRva2VuUmluZyhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIGJvb2wgZW5hYmxlKQoreworCWludCBzdGF0dXM7CisJdTE2IGRhdGEgPSAwOworCXUxNiBkZXNpcmVkQ3RybCA9IFNJT19PRkRNX1NIX09GRE1fUklOR19FTkFCTEVfT047CisJdTE2IGRlc2lyZWRTdGF0dXMgPSBTSU9fT0ZETV9TSF9PRkRNX1JJTkdfU1RBVFVTX0VOQUJMRUQ7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJaWYgKGVuYWJsZSA9PSBmYWxzZSkgeworCQlkZXNpcmVkQ3RybCA9IFNJT19PRkRNX1NIX09GRE1fUklOR19FTkFCTEVfT0ZGOworCQlkZXNpcmVkU3RhdHVzID0gU0lPX09GRE1fU0hfT0ZETV9SSU5HX1NUQVRVU19ET1dOOworCX0KKworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0lPX09GRE1fU0hfT0ZETV9SSU5HX1NUQVRVU19fQSwgJmRhdGEpOworCWlmIChzdGF0dXMgPj0gMCAmJiBkYXRhID09IGRlc2lyZWRTdGF0dXMpIHsKKwkJLyogdG9rZW5yaW5nIGFscmVhZHkgaGFzIGNvcnJlY3Qgc3RhdHVzICovCisJCXJldHVybiBzdGF0dXM7CisJfQorCS8qIERpc2FibGUvZW5hYmxlIGR2YnQgdG9rZW5yaW5nIGJyaWRnZSAgICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX09GRE1fU0hfT0ZETV9SSU5HX0VOQUJMRV9fQSwgZGVzaXJlZEN0cmwpOworCisJZW5kID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoRFJYS19PRkRNX1RSX1NIVVRET1dOX1RJTUVPVVQpOworCWRvIHsKKwkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBTSU9fT0ZETV9TSF9PRkRNX1JJTkdfU1RBVFVTX19BLCAmZGF0YSk7CisJCWlmICgoc3RhdHVzID49IDAgJiYgZGF0YSA9PSBkZXNpcmVkU3RhdHVzKSB8fCB0aW1lX2lzX2FmdGVyX2ppZmZpZXMoZW5kKSkKKwkJCWJyZWFrOworCQltc2xlZXAoMSk7CisJfSB3aGlsZSAoMSk7CisJaWYgKGRhdGEgIT0gZGVzaXJlZFN0YXR1cykgeworCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IFNJTyBub3QgcmVhZHlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBNUEVHVFNTdG9wKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwl1MTYgZmVjT2NTbmNNb2RlID0gMDsKKwl1MTYgZmVjT2NJcHJNb2RlID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwkvKiBHcmFjZWZ1bGwgc2h1dGRvd24gKGJ5dGUgYm91bmRhcmllcykgKi8KKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIEZFQ19PQ19TTkNfTU9ERV9fQSwgJmZlY09jU25jTW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJZmVjT2NTbmNNb2RlIHw9IEZFQ19PQ19TTkNfTU9ERV9TSFVURE9XTl9fTTsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfU05DX01PREVfX0EsIGZlY09jU25jTW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBTdXBwcmVzcyBNQ0xLIGR1cmluZyBhYnNlbmNlIG9mIGRhdGEgKi8KKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIEZFQ19PQ19JUFJfTU9ERV9fQSwgJmZlY09jSXByTW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJZmVjT2NJcHJNb2RlIHw9IEZFQ19PQ19JUFJfTU9ERV9NQ0xLX0RJU19EQVRfQUJTX19NOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19JUFJfTU9ERV9fQSwgZmVjT2NJcHJNb2RlKTsKKworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBzY3VfY29tbWFuZChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCSAgICAgICB1MTYgY21kLCB1OCBwYXJhbWV0ZXJMZW4sCisJCSAgICAgICB1MTYgKnBhcmFtZXRlciwgdTggcmVzdWx0TGVuLCB1MTYgKnJlc3VsdCkKK3sKKyNpZiAoU0NVX1JBTV9QQVJBTV8wX19BIC0gU0NVX1JBTV9QQVJBTV8xNV9fQSkgIT0gMTUKKyNlcnJvciBEUlhLIHJlZ2lzdGVyIG1hcHBpbmcgbm8gbG9uZ2VyIGNvbXBhdGlibGUgd2l0aCB0aGlzIHJvdXRpbmUhCisjZW5kaWYKKwl1MTYgY3VyQ21kID0gMDsKKwlpbnQgc3RhdHVzID0gLUVJTlZBTDsKKwl1bnNpZ25lZCBsb25nIGVuZDsKKwl1OCBidWZmZXJbMzRdOworCWludCBjbnQgPSAwLCBpaTsKKwljb25zdCBjaGFyICpwOworCWNoYXIgZXJybmFtZVszMF07CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJaWYgKChjbWQgPT0gMCkgfHwgKChwYXJhbWV0ZXJMZW4gPiAwKSAmJiAocGFyYW1ldGVyID09IE5VTEwpKSB8fAorCSAgICAoKHJlc3VsdExlbiA+IDApICYmIChyZXN1bHQgPT0gTlVMTCkpKQorCQlnb3RvIGVycm9yOworCisJbXV0ZXhfbG9jaygmc3RhdGUtPm11dGV4KTsKKworCS8qIGFzc3VtZSB0aGF0IHRoZSBjb21tYW5kIHJlZ2lzdGVyIGlzIHJlYWR5CisJCXNpbmNlIGl0IGlzIGNoZWNrZWQgYWZ0ZXJ3YXJkcyAqLworCWZvciAoaWkgPSBwYXJhbWV0ZXJMZW4gLSAxOyBpaSA+PSAwOyBpaSAtPSAxKSB7CisJCWJ1ZmZlcltjbnQrK10gPSAocGFyYW1ldGVyW2lpXSAmIDB4RkYpOworCQlidWZmZXJbY250KytdID0gKChwYXJhbWV0ZXJbaWldID4+IDgpICYgMHhGRik7CisJfQorCWJ1ZmZlcltjbnQrK10gPSAoY21kICYgMHhGRik7CisJYnVmZmVyW2NudCsrXSA9ICgoY21kID4+IDgpICYgMHhGRik7CisKKwl3cml0ZV9ibG9jayhzdGF0ZSwgU0NVX1JBTV9QQVJBTV8wX19BIC0KKwkJCShwYXJhbWV0ZXJMZW4gLSAxKSwgY250LCBidWZmZXIpOworCS8qIFdhaXQgdW50aWwgU0NVIGhhcyBwcm9jZXNzZWQgY29tbWFuZCAqLworCWVuZCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKERSWEtfTUFYX1dBSVRUSU1FKTsKKwlkbyB7CisJCW1zbGVlcCgxKTsKKwkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBTQ1VfUkFNX0NPTU1BTkRfX0EsICZjdXJDbWQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfSB3aGlsZSAoIShjdXJDbWQgPT0gRFJYX1NDVV9SRUFEWSkgJiYgKHRpbWVfaXNfYWZ0ZXJfamlmZmllcyhlbmQpKSk7CisJaWYgKGN1ckNtZCAhPSBEUlhfU0NVX1JFQURZKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogU0NVIG5vdCByZWFkeVxuIik7CisJCXN0YXR1cyA9IC1FSU87CisJCWdvdG8gZXJyb3IyOworCX0KKwkvKiByZWFkIHJlc3VsdHMgKi8KKwlpZiAoKHJlc3VsdExlbiA+IDApICYmIChyZXN1bHQgIT0gTlVMTCkpIHsKKwkJczE2IGVycjsKKwkJaW50IGlpOworCisJCWZvciAoaWkgPSByZXN1bHRMZW4gLSAxOyBpaSA+PSAwOyBpaSAtPSAxKSB7CisJCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNDVV9SQU1fUEFSQU1fMF9fQSAtIGlpLCAmcmVzdWx0W2lpXSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQl9CisKKwkJLyogQ2hlY2sgaWYgYW4gZXJyb3Igd2FzIHJlcG9ydGVkIGJ5IFNDVSAqLworCQllcnIgPSAoczE2KXJlc3VsdFswXTsKKwkJaWYgKGVyciA+PSAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBjaGVjayBmb3IgdGhlIGtub3duIGVycm9yIGNvZGVzICovCisJCXN3aXRjaCAoZXJyKSB7CisJCWNhc2UgU0NVX1JFU1VMVF9VTktDTUQ6CisJCQlwID0gIlNDVV9SRVNVTFRfVU5LQ01EIjsKKwkJCWJyZWFrOworCQljYXNlIFNDVV9SRVNVTFRfVU5LU1REOgorCQkJcCA9ICJTQ1VfUkVTVUxUX1VOS1NURCI7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfUkVTVUxUX1NJWkU6CisJCQlwID0gIlNDVV9SRVNVTFRfU0laRSI7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfUkVTVUxUX0lOVlBBUjoKKwkJCXAgPSAiU0NVX1JFU1VMVF9JTlZQQVIiOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8qIE90aGVyIG5lZ2F0aXZlIHZhbHVlcyBhcmUgZXJyb3JzICovCisJCQlzcHJpbnRmKGVycm5hbWUsICJFUlJPUjogJWRcbiIsIGVycik7CisJCQlwID0gZXJybmFtZTsKKwkJfQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6ICVzIHdoaWxlIHNlbmRpbmcgY21kIDB4JTA0eCB3aXRoIHBhcmFtczoiLCBwLCBjbWQpOworCQlwcmludF9oZXhfZHVtcF9ieXRlcygiZHJ4azogIiwgRFVNUF9QUkVGSVhfTk9ORSwgYnVmZmVyLCBjbnQpOworCQlzdGF0dXMgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yMjsKKwl9CisKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKK2Vycm9yMjoKKwltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBTZXRJcW1BZihzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIGJvb2wgYWN0aXZlKQoreworCXUxNiBkYXRhID0gMDsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygxLCAiXG4iKTsKKworCS8qIENvbmZpZ3VyZSBJUU0gKi8KKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIElRTV9BRl9TVERCWV9fQSwgJmRhdGEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJaWYgKCFhY3RpdmUpIHsKKwkJZGF0YSB8PSAoSVFNX0FGX1NUREJZX1NUREJZX0FEQ19TVEFOREJZCisJCQkJfCBJUU1fQUZfU1REQllfU1REQllfQU1QX1NUQU5EQlkKKwkJCQl8IElRTV9BRl9TVERCWV9TVERCWV9QRF9TVEFOREJZCisJCQkJfCBJUU1fQUZfU1REQllfU1REQllfVEFHQ19JRl9TVEFOREJZCisJCQkJfCBJUU1fQUZfU1REQllfU1REQllfVEFHQ19SRl9TVEFOREJZKTsKKwl9IGVsc2UgeworCQlkYXRhICY9ICgofklRTV9BRl9TVERCWV9TVERCWV9BRENfU1RBTkRCWSkKKwkJCQkmICh+SVFNX0FGX1NUREJZX1NUREJZX0FNUF9TVEFOREJZKQorCQkJCSYgKH5JUU1fQUZfU1REQllfU1REQllfUERfU1RBTkRCWSkKKwkJCQkmICh+SVFNX0FGX1NUREJZX1NUREJZX1RBR0NfSUZfU1RBTkRCWSkKKwkJCQkmICh+SVFNX0FGX1NUREJZX1NUREJZX1RBR0NfUkZfU1RBTkRCWSkKKwkJCSk7CisJfQorCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9TVERCWV9fQSwgZGF0YSk7CisKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IEN0cmxQb3dlck1vZGUoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCBlbnVtIERSWFBvd2VyTW9kZSAqbW9kZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwl1MTYgc2lvQ2NQd2RNb2RlID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwkvKiBDaGVjayBhcmd1bWVudHMgKi8KKwlpZiAobW9kZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoKm1vZGUpIHsKKwljYXNlIERSWF9QT1dFUl9VUDoKKwkJc2lvQ2NQd2RNb2RlID0gU0lPX0NDX1BXRF9NT0RFX0xFVkVMX05PTkU7CisJCWJyZWFrOworCWNhc2UgRFJYS19QT1dFUl9ET1dOX09GRE06CisJCXNpb0NjUHdkTW9kZSA9IFNJT19DQ19QV0RfTU9ERV9MRVZFTF9PRkRNOworCQlicmVhazsKKwljYXNlIERSWEtfUE9XRVJfRE9XTl9DT1JFOgorCQlzaW9DY1B3ZE1vZGUgPSBTSU9fQ0NfUFdEX01PREVfTEVWRUxfQ0xPQ0s7CisJCWJyZWFrOworCWNhc2UgRFJYS19QT1dFUl9ET1dOX1BMTDoKKwkJc2lvQ2NQd2RNb2RlID0gU0lPX0NDX1BXRF9NT0RFX0xFVkVMX1BMTDsKKwkJYnJlYWs7CisJY2FzZSBEUlhfUE9XRVJfRE9XTjoKKwkJc2lvQ2NQd2RNb2RlID0gU0lPX0NDX1BXRF9NT0RFX0xFVkVMX09TQzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogVW5rbm93IHNsZWVwIG1vZGUgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogSWYgYWxyZWFkeSBpbiByZXF1ZXN0ZWQgcG93ZXIgbW9kZSwgZG8gbm90aGluZyAqLworCWlmIChzdGF0ZS0+bV9jdXJyZW50UG93ZXJNb2RlID09ICptb2RlKQorCQlyZXR1cm4gMDsKKworCS8qIEZvciBuZXh0IHN0ZXBzIG1ha2Ugc3VyZSB0byBzdGFydCBmcm9tIERSWF9QT1dFUl9VUCBtb2RlICovCisJaWYgKHN0YXRlLT5tX2N1cnJlbnRQb3dlck1vZGUgIT0gRFJYX1BPV0VSX1VQKSB7CisJCXN0YXR1cyA9IFBvd2VyVXBEZXZpY2Uoc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IERWQlRFbmFibGVPRkRNVG9rZW5SaW5nKHN0YXRlLCB0cnVlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCX0KKworCWlmICgqbW9kZSA9PSBEUlhfUE9XRVJfVVApIHsKKwkJLyogUmVzdG9yZSBhbmFsb2cgJiBwaW4gY29uZmlndWFydGlvbiAqLworCX0gZWxzZSB7CisJCS8qIFBvd2VyIGRvd24gdG8gcmVxdWVzdGVkIG1vZGUgKi8KKwkJLyogQmFja3VwIHNvbWUgcmVnaXN0ZXIgc2V0dGluZ3MgKi8KKwkJLyogU2V0IHBpbnMgd2l0aCBwb3NzaWJsZSBwdWxsLXVwcyBjb25uZWN0ZWQKKwkJICAgdG8gdGhlbSBpbiBpbnB1dCBtb2RlICovCisJCS8qIEFuYWxvZyBwb3dlciBkb3duICovCisJCS8qIEFEQyBwb3dlciBkb3duICovCisJCS8qIFBvd2VyIGRvd24gZGV2aWNlICovCisJCS8qIHN0b3AgYWxsIGNvbW1fZXhlYyAqLworCQkvKiBTdG9wIGFuZCBwb3dlciBkb3duIHByZXZpb3VzIHN0YW5kYXJkICovCisJCXN3aXRjaCAoc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSkgeworCQljYXNlIE9NX0RWQlQ6CisJCQlzdGF0dXMgPSBNUEVHVFNTdG9wKHN0YXRlKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlzdGF0dXMgPSBQb3dlckRvd25EVkJUKHN0YXRlLCBmYWxzZSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJYnJlYWs7CisJCWNhc2UgT01fUUFNX0lUVV9BOgorCQljYXNlIE9NX1FBTV9JVFVfQzoKKwkJCXN0YXR1cyA9IE1QRUdUU1N0b3Aoc3RhdGUpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCXN0YXR1cyA9IFBvd2VyRG93blFBTShzdGF0ZSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlzdGF0dXMgPSBEVkJURW5hYmxlT0ZETVRva2VuUmluZyhzdGF0ZSwgZmFsc2UpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19DQ19QV0RfTU9ERV9fQSwgc2lvQ2NQd2RNb2RlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQ0NfVVBEQVRFX19BLCBTSU9fQ0NfVVBEQVRFX0tFWSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQlpZiAoKm1vZGUgIT0gRFJYS19QT1dFUl9ET1dOX09GRE0pIHsKKwkJCXN0YXRlLT5tX0hJQ2ZnQ3RybCB8PQorCQkJCVNJT19ISV9SQV9SQU1fUEFSXzVfQ0ZHX1NMRUVQX1paWjsKKwkJCXN0YXR1cyA9IEhJX0NmZ0NvbW1hbmQoc3RhdGUpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKwlzdGF0ZS0+bV9jdXJyZW50UG93ZXJNb2RlID0gKm1vZGU7CisKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgUG93ZXJEb3duRFZCVChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIGJvb2wgc2V0UG93ZXJNb2RlKQoreworCWVudW0gRFJYUG93ZXJNb2RlIHBvd2VyTW9kZSA9IERSWEtfUE9XRVJfRE9XTl9PRkRNOworCXUxNiBjbWRSZXN1bHQgPSAwOworCXUxNiBkYXRhID0gMDsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygxLCAiXG4iKTsKKworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0NVX0NPTU1fRVhFQ19fQSwgJmRhdGEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCWlmIChkYXRhID09IFNDVV9DT01NX0VYRUNfQUNUSVZFKSB7CisJCS8qIFNlbmQgT0ZETSBzdG9wIGNvbW1hbmQgKi8KKwkJc3RhdHVzID0gc2N1X2NvbW1hbmQoc3RhdGUsIFNDVV9SQU1fQ09NTUFORF9TVEFOREFSRF9PRkRNIHwgU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9TVE9QLCAwLCBOVUxMLCAxLCAmY21kUmVzdWx0KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQkvKiBTZW5kIE9GRE0gcmVzZXQgY29tbWFuZCAqLworCQlzdGF0dXMgPSBzY3VfY29tbWFuZChzdGF0ZSwgU0NVX1JBTV9DT01NQU5EX1NUQU5EQVJEX09GRE0gfCBTQ1VfUkFNX0NPTU1BTkRfQ01EX0RFTU9EX1JFU0VULCAwLCBOVUxMLCAxLCAmY21kUmVzdWx0KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCX0KKworCS8qIFJlc2V0IGRhdGFwYXRoIGZvciBPRkRNLCBwcm9jZXNzb3JzIGZpcnN0ICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19DT01NX0VYRUNfX0EsIE9GRE1fU0NfQ09NTV9FWEVDX1NUT1ApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fTENfQ09NTV9FWEVDX19BLCBPRkRNX0xDX0NPTU1fRVhFQ19TVE9QKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ09NTV9FWEVDX19BLCBJUU1fQ09NTV9FWEVDX0JfU1RPUCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBwb3dlcmRvd24gQUZFICAgICAgICAgICAgICAgICAgICovCisJc3RhdHVzID0gU2V0SXFtQWYoc3RhdGUsIGZhbHNlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIHBvd2VyZG93biB0byBPRkRNIG1vZGUgICAgICAgICAgKi8KKwlpZiAoc2V0UG93ZXJNb2RlKSB7CisJCXN0YXR1cyA9IEN0cmxQb3dlck1vZGUoc3RhdGUsICZwb3dlck1vZGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfQorZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgU2V0T3BlcmF0aW9uTW9kZShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCQkgICAgZW51bSBPcGVyYXRpb25Nb2RlIG9Nb2RlKQoreworCWludCBzdGF0dXMgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKwkvKgorCSAgIFN0b3AgYW5kIHBvd2VyIGRvd24gcHJldmlvdXMgc3RhbmRhcmQKKwkgICBUT0RPIGludmVzdGlnYXRlIHRvdGFsIHBvd2VyIGRvd24gaW5zdGVhZCBvZiBwYXJ0aWFsCisJICAgcG93ZXIgZG93biBkZXBlbmRpbmcgb24gInByZXZpb3VzIiBzdGFuZGFyZC4KKwkgKi8KKworCS8qIGRpc2FibGUgSFcgbG9jayBpbmRpY2F0b3IgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0dQSU9fX0EsIFNDVV9SQU1fR1BJT19IV19MT0NLX0lORF9ESVNBQkxFKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIERldmljZSBpcyBhbHJlYWR5IGF0IHRoZSByZXF1aXJlZCBtb2RlICovCisJaWYgKHN0YXRlLT5tX09wZXJhdGlvbk1vZGUgPT0gb01vZGUpCisJCXJldHVybiAwOworCisJc3dpdGNoIChzdGF0ZS0+bV9PcGVyYXRpb25Nb2RlKSB7CisJCS8qIE9NX05PTkUgd2FzIGFkZGVkIGZvciBzdGFydCB1cCAqLworCWNhc2UgT01fTk9ORToKKwkJYnJlYWs7CisJY2FzZSBPTV9EVkJUOgorCQlzdGF0dXMgPSBNUEVHVFNTdG9wKHN0YXRlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSBQb3dlckRvd25EVkJUKHN0YXRlLCB0cnVlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0ZS0+bV9PcGVyYXRpb25Nb2RlID0gT01fTk9ORTsKKwkJYnJlYWs7CisJY2FzZSBPTV9RQU1fSVRVX0E6CS8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBPTV9RQU1fSVRVX0M6CisJCXN0YXR1cyA9IE1QRUdUU1N0b3Aoc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IFBvd2VyRG93blFBTShzdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSA9IE9NX05PTkU7CisJCWJyZWFrOworCWNhc2UgT01fUUFNX0lUVV9COgorCWRlZmF1bHQ6CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyoKKwkJUG93ZXIgdXAgbmV3IHN0YW5kYXJkCisJCSovCisJc3dpdGNoIChvTW9kZSkgeworCWNhc2UgT01fRFZCVDoKKwkJc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSA9IG9Nb2RlOworCQlzdGF0dXMgPSBTZXREVkJUU3RhbmRhcmQoc3RhdGUsIG9Nb2RlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlicmVhazsKKwljYXNlIE9NX1FBTV9JVFVfQToJLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIE9NX1FBTV9JVFVfQzoKKwkJc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSA9IG9Nb2RlOworCQlzdGF0dXMgPSBTZXRRQU1TdGFuZGFyZChzdGF0ZSwgb01vZGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWJyZWFrOworCWNhc2UgT01fUUFNX0lUVV9COgorCWRlZmF1bHQ6CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJfQorZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgU3RhcnQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCBzMzIgb2Zmc2V0RnJlcSwKKwkJIHMzMiBJbnRlcm1lZGlhdGVGcmVxdWVuY3kpCit7CisJaW50IHN0YXR1cyA9IC1FSU5WQUw7CisKKwl1MTYgSUZyZXFrSHo7CisJczMyIE9mZnNldGtIeiA9IG9mZnNldEZyZXEgLyAxMDAwOworCisJZHByaW50aygxLCAiXG4iKTsKKwlpZiAoc3RhdGUtPm1fRHJ4a1N0YXRlICE9IERSWEtfU1RPUFBFRCAmJgorCQlzdGF0ZS0+bV9EcnhrU3RhdGUgIT0gRFJYS19EVFZfU1RBUlRFRCkKKwkJZ290byBlcnJvcjsKKworCXN0YXRlLT5tX2JNaXJyb3JGcmVxU3BlY3QgPSAoc3RhdGUtPnBhcmFtLmludmVyc2lvbiA9PSBJTlZFUlNJT05fT04pOworCisJaWYgKEludGVybWVkaWF0ZUZyZXF1ZW5jeSA8IDApIHsKKwkJc3RhdGUtPm1fYk1pcnJvckZyZXFTcGVjdCA9ICFzdGF0ZS0+bV9iTWlycm9yRnJlcVNwZWN0OworCQlJbnRlcm1lZGlhdGVGcmVxdWVuY3kgPSAtSW50ZXJtZWRpYXRlRnJlcXVlbmN5OworCX0KKworCXN3aXRjaCAoc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSkgeworCWNhc2UgT01fUUFNX0lUVV9BOgorCWNhc2UgT01fUUFNX0lUVV9DOgorCQlJRnJlcWtIeiA9IChJbnRlcm1lZGlhdGVGcmVxdWVuY3kgLyAxMDAwKTsKKwkJc3RhdHVzID0gU2V0UUFNKHN0YXRlLCBJRnJlcWtIeiwgT2Zmc2V0a0h6KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0ZS0+bV9EcnhrU3RhdGUgPSBEUlhLX0RUVl9TVEFSVEVEOworCQlicmVhazsKKwljYXNlIE9NX0RWQlQ6CisJCUlGcmVxa0h6ID0gKEludGVybWVkaWF0ZUZyZXF1ZW5jeSAvIDEwMDApOworCQlzdGF0dXMgPSBNUEVHVFNTdG9wKHN0YXRlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSBTZXREVkJUKHN0YXRlLCBJRnJlcWtIeiwgT2Zmc2V0a0h6KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSBEVkJUU3RhcnQoc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXRlLT5tX0RyeGtTdGF0ZSA9IERSWEtfRFRWX1NUQVJURUQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFNodXREb3duKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlkcHJpbnRrKDEsICJcbiIpOworCisJTVBFR1RTU3RvcChzdGF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgR2V0TG9ja1N0YXR1cyhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUzMiAqcExvY2tTdGF0dXMsCisJCQkgdTMyIFRpbWUpCit7CisJaW50IHN0YXR1cyA9IC1FSU5WQUw7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJaWYgKHBMb2NrU3RhdHVzID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CisKKwkqcExvY2tTdGF0dXMgPSBOT1RfTE9DS0VEOworCisJLyogZGVmaW5lIHRoZSBTQ1UgY29tbWFuZCBjb2RlICovCisJc3dpdGNoIChzdGF0ZS0+bV9PcGVyYXRpb25Nb2RlKSB7CisJY2FzZSBPTV9RQU1fSVRVX0E6CisJY2FzZSBPTV9RQU1fSVRVX0I6CisJY2FzZSBPTV9RQU1fSVRVX0M6CisJCXN0YXR1cyA9IEdldFFBTUxvY2tTdGF0dXMoc3RhdGUsIHBMb2NrU3RhdHVzKTsKKwkJYnJlYWs7CisJY2FzZSBPTV9EVkJUOgorCQlzdGF0dXMgPSBHZXREVkJUTG9ja1N0YXR1cyhzdGF0ZSwgcExvY2tTdGF0dXMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBNUEVHVFNTdGFydChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJaW50IHN0YXR1czsKKworCXUxNiBmZWNPY1NuY01vZGUgPSAwOworCisJLyogQWxsb3cgT0MgdG8gc3luYyBhZ2FpbiAqLworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgRkVDX09DX1NOQ19NT0RFX19BLCAmZmVjT2NTbmNNb2RlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlmZWNPY1NuY01vZGUgJj0gfkZFQ19PQ19TTkNfTU9ERV9TSFVURE9XTl9fTTsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfU05DX01PREVfX0EsIGZlY09jU25jTW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX1NOQ19VTkxPQ0tfX0EsIDEpOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgTVBFR1RTRHRvSW5pdChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwkvKiBSYXRlIGludGVncmF0aW9uIHNldHRpbmdzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX1JDTl9DVExfU1RFUF9MT19fQSwgMHgwMDAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfUkNOX0NUTF9TVEVQX0hJX19BLCAweDAwMEMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19SQ05fR0FJTl9fQSwgMHgwMDBBKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfQVZSX1BBUk1fQV9fQSwgMHgwMDA4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfQVZSX1BBUk1fQl9fQSwgMHgwMDA2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfVE1EX0hJX01BUkdJTl9fQSwgMHgwNjgwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfVE1EX0xPX01BUkdJTl9fQSwgMHgwMDgwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfVE1EX0NPVU5UX19BLCAweDAzRjQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogQWRkaXRpb25hbCBjb25maWd1cmF0aW9uICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX09DUl9JTlZFUlRfX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19TTkNfTFdNX19BLCAyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfU05DX0hXTV9fQSwgMTIpOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBNUEVHVFNEdG9TZXR1cChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCQkgIGVudW0gT3BlcmF0aW9uTW9kZSBvTW9kZSkKK3sKKwlpbnQgc3RhdHVzOworCisJdTE2IGZlY09jUmVnTW9kZSA9IDA7CS8qIEZFQ19PQ19NT0RFICAgICAgIHJlZ2lzdGVyIHZhbHVlICovCisJdTE2IGZlY09jUmVnSXByTW9kZSA9IDA7CS8qIEZFQ19PQ19JUFJfTU9ERSAgIHJlZ2lzdGVyIHZhbHVlICovCisJdTE2IGZlY09jRHRvTW9kZSA9IDA7CS8qIEZFQ19PQ19JUFJfSU5WRVJUIHJlZ2lzdGVyIHZhbHVlICovCisJdTE2IGZlY09jRmN0TW9kZSA9IDA7CS8qIEZFQ19PQ19JUFJfSU5WRVJUIHJlZ2lzdGVyIHZhbHVlICovCisJdTE2IGZlY09jRHRvUGVyaW9kID0gMjsJLyogRkVDX09DX0lQUl9JTlZFUlQgcmVnaXN0ZXIgdmFsdWUgKi8KKwl1MTYgZmVjT2NEdG9CdXJzdExlbiA9IDE4ODsJLyogRkVDX09DX0lQUl9JTlZFUlQgcmVnaXN0ZXIgdmFsdWUgKi8KKwl1MzIgZmVjT2NSY25DdGxSYXRlID0gMDsJLyogRkVDX09DX0lQUl9JTlZFUlQgcmVnaXN0ZXIgdmFsdWUgKi8KKwl1MTYgZmVjT2NUbWRNb2RlID0gMDsKKwl1MTYgZmVjT2NUbWRJbnRVcGRSYXRlID0gMDsKKwl1MzIgbWF4Qml0UmF0ZSA9IDA7CisJYm9vbCBzdGF0aWNDTEsgPSBmYWxzZTsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwkvKiBDaGVjayBpbnNlcnRpb24gb2YgdGhlIFJlZWQtU29sb21vbiBwYXJpdHkgYnl0ZXMgKi8KKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIEZFQ19PQ19NT0RFX19BLCAmZmVjT2NSZWdNb2RlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIEZFQ19PQ19JUFJfTU9ERV9fQSwgJmZlY09jUmVnSXByTW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJZmVjT2NSZWdNb2RlICY9ICh+RkVDX09DX01PREVfUEFSSVRZX19NKTsKKwlmZWNPY1JlZ0lwck1vZGUgJj0gKH5GRUNfT0NfSVBSX01PREVfTVZBTF9ESVNfUEFSX19NKTsKKwlpZiAoc3RhdGUtPm1faW5zZXJ0UlNCeXRlID09IHRydWUpIHsKKwkJLyogZW5hYmxlIHBhcml0eSBzeW1ib2wgZm9yd2FyZCAqLworCQlmZWNPY1JlZ01vZGUgfD0gRkVDX09DX01PREVfUEFSSVRZX19NOworCQkvKiBNVkFMIGRpc2FibGUgZHVyaW5nIHBhcml0eSBieXRlcyAqLworCQlmZWNPY1JlZ0lwck1vZGUgfD0gRkVDX09DX0lQUl9NT0RFX01WQUxfRElTX1BBUl9fTTsKKwkJLyogVFMgYnVyc3QgbGVuZ3RoIHRvIDIwNCAqLworCQlmZWNPY0R0b0J1cnN0TGVuID0gMjA0OworCX0KKworCS8qIENoZWNrIHNlcmlhbCBvciBwYXJyYWxsZWwgb3V0cHV0ICovCisJZmVjT2NSZWdJcHJNb2RlICY9ICh+KEZFQ19PQ19JUFJfTU9ERV9TRVJJQUxfX00pKTsKKwlpZiAoc3RhdGUtPm1fZW5hYmxlUGFyYWxsZWwgPT0gZmFsc2UpIHsKKwkJLyogTVBFRyBkYXRhIG91dHB1dCBpcyBzZXJpYWwgLT4gc2V0IGlwcl9tb2RlWzBdICovCisJCWZlY09jUmVnSXByTW9kZSB8PSBGRUNfT0NfSVBSX01PREVfU0VSSUFMX19NOworCX0KKworCXN3aXRjaCAob01vZGUpIHsKKwljYXNlIE9NX0RWQlQ6CisJCW1heEJpdFJhdGUgPSBzdGF0ZS0+bV9EVkJUQml0cmF0ZTsKKwkJZmVjT2NUbWRNb2RlID0gMzsKKwkJZmVjT2NSY25DdGxSYXRlID0gMHhDMDAwMDA7CisJCXN0YXRpY0NMSyA9IHN0YXRlLT5tX0RWQlRTdGF0aWNDTEs7CisJCWJyZWFrOworCWNhc2UgT01fUUFNX0lUVV9BOgkvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgT01fUUFNX0lUVV9DOgorCQlmZWNPY1RtZE1vZGUgPSAweDAwMDQ7CisJCWZlY09jUmNuQ3RsUmF0ZSA9IDB4RDJCNEVFOwkvKiBnb29kIGZvciA+NjMgTWIvcyAqLworCQltYXhCaXRSYXRlID0gc3RhdGUtPm1fRFZCQ0JpdHJhdGU7CisJCXN0YXRpY0NMSyA9IHN0YXRlLT5tX0RWQkNTdGF0aWNDTEs7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJfQkJLyogc3dpdGNoIChzdGFuZGFyZCkgKi8KKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIENvbmZpZ3VyZSBEVE8ncyAqLworCWlmIChzdGF0aWNDTEspIHsKKwkJdTMyIGJpdFJhdGUgPSAwOworCisJCS8qIFJhdGlvbmFsIERUTyBmb3IgTUNMSyBzb3VyY2UgKHN0YXRpYyBNQ0xLIHJhdGUpLAorCQkJRHluYW1pYyBEVE8gZm9yIG9wdGltYWwgZ3JvdXBpbmcKKwkJCShhdm9pZCBpbnRyYS1wYWNrZXQgZ2FwcyksCisJCQlEVE8gb2Zmc2V0IGVuYWJsZSB0byBzeW5jIFRTIGJ1cnN0IHdpdGggTVNUUlQgKi8KKwkJZmVjT2NEdG9Nb2RlID0gKEZFQ19PQ19EVE9fTU9ERV9EWU5BTUlDX19NIHwKKwkJCQlGRUNfT0NfRFRPX01PREVfT0ZGU0VUX0VOQUJMRV9fTSk7CisJCWZlY09jRmN0TW9kZSA9IChGRUNfT0NfRkNUX01PREVfUkFUX0VOQV9fTSB8CisJCQkJRkVDX09DX0ZDVF9NT0RFX1ZJUlRfRU5BX19NKTsKKworCQkvKiBDaGVjayB1c2VyIGRlZmluZWQgYml0cmF0ZSAqLworCQliaXRSYXRlID0gbWF4Qml0UmF0ZTsKKwkJaWYgKGJpdFJhdGUgPiA3NTkwMDAwMFVMKSB7CS8qIG1heCBpcyA3NS45IE1iL3MgKi8KKwkJCWJpdFJhdGUgPSA3NTkwMDAwMFVMOworCQl9CisJCS8qIFJhdGlvbmFsIERUTyBwZXJpb2Q6CisJCQlkdG9fcGVyaW9kID0gKEZzeXMgLyBiaXRyYXRlKSAtIDIKKworCQkJUmVzdWx0IHNob3VsZCBiZSBmbG9vcmVkLAorCQkJdG8gbWFrZSBzdXJlID49IHJlcXVlc3RlZCBiaXRyYXRlCisJCQkqLworCQlmZWNPY0R0b1BlcmlvZCA9ICh1MTYpICgoKHN0YXRlLT5tX3N5c0Nsb2NrRnJlcSkKKwkJCQkJCSogMTAwMCkgLyBiaXRSYXRlKTsKKwkJaWYgKGZlY09jRHRvUGVyaW9kIDw9IDIpCisJCQlmZWNPY0R0b1BlcmlvZCA9IDA7CisJCWVsc2UKKwkJCWZlY09jRHRvUGVyaW9kIC09IDI7CisJCWZlY09jVG1kSW50VXBkUmF0ZSA9IDg7CisJfSBlbHNlIHsKKwkJLyogKGNvbW1vbkF0dHItPnN0YXRpY0NMSyA9PSBmYWxzZSkgPT4gZHluYW1pYyBtb2RlICovCisJCWZlY09jRHRvTW9kZSA9IEZFQ19PQ19EVE9fTU9ERV9EWU5BTUlDX19NOworCQlmZWNPY0ZjdE1vZGUgPSBGRUNfT0NfRkNUX01PREVfX1BSRTsKKwkJZmVjT2NUbWRJbnRVcGRSYXRlID0gNTsKKwl9CisKKwkvKiBXcml0ZSBhcHByb3ByaWF0ZSByZWdpc3RlcnMgd2l0aCByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbiAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19EVE9fQlVSU1RfTEVOX19BLCBmZWNPY0R0b0J1cnN0TGVuKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfRFRPX1BFUklPRF9fQSwgZmVjT2NEdG9QZXJpb2QpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19EVE9fTU9ERV9fQSwgZmVjT2NEdG9Nb2RlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfRkNUX01PREVfX0EsIGZlY09jRmN0TW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX01PREVfX0EsIGZlY09jUmVnTW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX0lQUl9NT0RFX19BLCBmZWNPY1JlZ0lwck1vZGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogUmF0ZSBpbnRlZ3JhdGlvbiBzZXR0aW5ncyAqLworCXN0YXR1cyA9IHdyaXRlMzIoc3RhdGUsIEZFQ19PQ19SQ05fQ1RMX1JBVEVfTE9fX0EsIGZlY09jUmNuQ3RsUmF0ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX1RNRF9JTlRfVVBEX1JBVEVfX0EsIGZlY09jVG1kSW50VXBkUmF0ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX1RNRF9NT0RFX19BLCBmZWNPY1RtZE1vZGUpOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgTVBFR1RTQ29uZmlndXJlUG9sYXJpdHkoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCXUxNiBmZWNPY1JlZ0lwckludmVydCA9IDA7CisKKwkvKiBEYXRhIG1hc2sgZm9yIHRoZSBvdXRwdXQgZGF0YSBieXRlICovCisJdTE2IEludmVydERhdGFNYXNrID0KKwkgICAgRkVDX09DX0lQUl9JTlZFUlRfTUQ3X19NIHwgRkVDX09DX0lQUl9JTlZFUlRfTUQ2X19NIHwKKwkgICAgRkVDX09DX0lQUl9JTlZFUlRfTUQ1X19NIHwgRkVDX09DX0lQUl9JTlZFUlRfTUQ0X19NIHwKKwkgICAgRkVDX09DX0lQUl9JTlZFUlRfTUQzX19NIHwgRkVDX09DX0lQUl9JTlZFUlRfTUQyX19NIHwKKwkgICAgRkVDX09DX0lQUl9JTlZFUlRfTUQxX19NIHwgRkVDX09DX0lQUl9JTlZFUlRfTUQwX19NOworCisJZHByaW50aygxLCAiXG4iKTsKKworCS8qIENvbnRyb2wgc2VsZWN0aXZlIGludmVyc2lvbiBvZiBvdXRwdXQgYml0cyAqLworCWZlY09jUmVnSXBySW52ZXJ0ICY9ICh+KEludmVydERhdGFNYXNrKSk7CisJaWYgKHN0YXRlLT5tX2ludmVydERBVEEgPT0gdHJ1ZSkKKwkJZmVjT2NSZWdJcHJJbnZlcnQgfD0gSW52ZXJ0RGF0YU1hc2s7CisJZmVjT2NSZWdJcHJJbnZlcnQgJj0gKH4oRkVDX09DX0lQUl9JTlZFUlRfTUVSUl9fTSkpOworCWlmIChzdGF0ZS0+bV9pbnZlcnRFUlIgPT0gdHJ1ZSkKKwkJZmVjT2NSZWdJcHJJbnZlcnQgfD0gRkVDX09DX0lQUl9JTlZFUlRfTUVSUl9fTTsKKwlmZWNPY1JlZ0lwckludmVydCAmPSAofihGRUNfT0NfSVBSX0lOVkVSVF9NU1RSVF9fTSkpOworCWlmIChzdGF0ZS0+bV9pbnZlcnRTVFIgPT0gdHJ1ZSkKKwkJZmVjT2NSZWdJcHJJbnZlcnQgfD0gRkVDX09DX0lQUl9JTlZFUlRfTVNUUlRfX007CisJZmVjT2NSZWdJcHJJbnZlcnQgJj0gKH4oRkVDX09DX0lQUl9JTlZFUlRfTVZBTF9fTSkpOworCWlmIChzdGF0ZS0+bV9pbnZlcnRWQUwgPT0gdHJ1ZSkKKwkJZmVjT2NSZWdJcHJJbnZlcnQgfD0gRkVDX09DX0lQUl9JTlZFUlRfTVZBTF9fTTsKKwlmZWNPY1JlZ0lwckludmVydCAmPSAofihGRUNfT0NfSVBSX0lOVkVSVF9NQ0xLX19NKSk7CisJaWYgKHN0YXRlLT5tX2ludmVydENMSyA9PSB0cnVlKQorCQlmZWNPY1JlZ0lwckludmVydCB8PSBGRUNfT0NfSVBSX0lOVkVSVF9NQ0xLX19NOworCisJcmV0dXJuIHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19JUFJfSU5WRVJUX19BLCBmZWNPY1JlZ0lwckludmVydCk7Cit9CisKKyNkZWZpbmUgICBTQ1VfUkFNX0FHQ19LSV9JTlZfUkZfUE9MX19NIDB4NDAwMAorCitzdGF0aWMgaW50IFNldEFnY1JmKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwKKwkJICAgIHN0cnVjdCBTQ2ZnQWdjICpwQWdjQ2ZnLCBib29sIGlzRFRWKQoreworCWludCBzdGF0dXMgPSAtRUlOVkFMOworCXUxNiBkYXRhID0gMDsKKwlzdHJ1Y3QgU0NmZ0FnYyAqcElmQWdjU2V0dGluZ3M7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJaWYgKHBBZ2NDZmcgPT0gTlVMTCkKKwkJZ290byBlcnJvcjsKKworCXN3aXRjaCAocEFnY0NmZy0+Y3RybE1vZGUpIHsKKwljYXNlIERSWEtfQUdDX0NUUkxfQVVUTzoKKwkJLyogRW5hYmxlIFJGIEFHQyBEQUMgKi8KKwkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBJUU1fQUZfU1REQllfX0EsICZkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlkYXRhICY9IH5JUU1fQUZfU1REQllfU1REQllfVEFHQ19SRl9TVEFOREJZOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfU1REQllfX0EsIGRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ09ORklHX19BLCAmZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBFbmFibGUgU0NVIFJGIEFHQyBsb29wICovCisJCWRhdGEgJj0gflNDVV9SQU1fQUdDX0NPTkZJR19ESVNBQkxFX1JGX0FHQ19fTTsKKworCQkvKiBQb2xhcml0eSAqLworCQlpZiAoc3RhdGUtPm1fUmZBZ2NQb2wpCisJCQlkYXRhIHw9IFNDVV9SQU1fQUdDX0NPTkZJR19JTlZfUkZfUE9MX19NOworCQllbHNlCisJCQlkYXRhICY9IH5TQ1VfUkFNX0FHQ19DT05GSUdfSU5WX1JGX1BPTF9fTTsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ09ORklHX19BLCBkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIFNldCBzcGVlZCAodXNpbmcgY29tcGxlbWVudGFyeSByZWR1Y3Rpb24gdmFsdWUpICovCisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0NVX1JBTV9BR0NfS0lfUkVEX19BLCAmZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQlkYXRhICY9IH5TQ1VfUkFNX0FHQ19LSV9SRURfUkFHQ19SRURfX007CisJCWRhdGEgfD0gKH4ocEFnY0NmZy0+c3BlZWQgPDwKKwkJCQlTQ1VfUkFNX0FHQ19LSV9SRURfUkFHQ19SRURfX0IpCisJCQkJJiBTQ1VfUkFNX0FHQ19LSV9SRURfUkFHQ19SRURfX00pOworCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0tJX1JFRF9fQSwgZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQlpZiAoSXNEVkJUKHN0YXRlKSkKKwkJCXBJZkFnY1NldHRpbmdzID0gJnN0YXRlLT5tX2R2YnRJZkFnY0NmZzsKKwkJZWxzZSBpZiAoSXNRQU0oc3RhdGUpKQorCQkJcElmQWdjU2V0dGluZ3MgPSAmc3RhdGUtPm1fcWFtSWZBZ2NDZmc7CisJCWVsc2UKKwkJCXBJZkFnY1NldHRpbmdzID0gJnN0YXRlLT5tX2F0dklmQWdjQ2ZnOworCQlpZiAocElmQWdjU2V0dGluZ3MgPT0gTlVMTCkgeworCQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQkvKiBTZXQgVE9QLCBvbmx5IGlmIElGLUFHQyBpcyBpbiBBVVRPIG1vZGUgKi8KKwkJaWYgKHBJZkFnY1NldHRpbmdzLT5jdHJsTW9kZSA9PSBEUlhLX0FHQ19DVFJMX0FVVE8pCisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19JRl9JQUNDVV9ISV9UR1RfTUFYX19BLCBwQWdjQ2ZnLT50b3ApOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKworCQkvKiBDdXQtT2ZmIGN1cnJlbnQgKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfUkZfSUFDQ1VfSElfQ09fX0EsIHBBZ2NDZmctPmN1dE9mZkN1cnJlbnQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJLyogTWF4LiBvdXRwdXQgbGV2ZWwgKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfUkZfTUFYX19BLCBwQWdjQ2ZnLT5tYXhPdXRwdXRMZXZlbCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQlicmVhazsKKworCWNhc2UgRFJYS19BR0NfQ1RSTF9VU0VSOgorCQkvKiBFbmFibGUgUkYgQUdDIERBQyAqLworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIElRTV9BRl9TVERCWV9fQSwgJmRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWRhdGEgJj0gfklRTV9BRl9TVERCWV9TVERCWV9UQUdDX1JGX1NUQU5EQlk7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9TVERCWV9fQSwgZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBEaXNhYmxlIFNDVSBSRiBBR0MgbG9vcCAqLworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NPTkZJR19fQSwgJmRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWRhdGEgfD0gU0NVX1JBTV9BR0NfQ09ORklHX0RJU0FCTEVfUkZfQUdDX19NOworCQlpZiAoc3RhdGUtPm1fUmZBZ2NQb2wpCisJCQlkYXRhIHw9IFNDVV9SQU1fQUdDX0NPTkZJR19JTlZfUkZfUE9MX19NOworCQllbHNlCisJCQlkYXRhICY9IH5TQ1VfUkFNX0FHQ19DT05GSUdfSU5WX1JGX1BPTF9fTTsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ09ORklHX19BLCBkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIFNDVSBjLm8uYy4gdG8gMCwgZW5hYmxpbmcgZnVsbCBjb250cm9sIHJhbmdlICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX1JGX0lBQ0NVX0hJX0NPX19BLCAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIFdyaXRlIHZhbHVlIHRvIG91dHB1dCBwaW4gKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfUkZfSUFDQ1VfSElfX0EsIHBBZ2NDZmctPm91dHB1dExldmVsKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlicmVhazsKKworCWNhc2UgRFJYS19BR0NfQ1RSTF9PRkY6CisJCS8qIERpc2FibGUgUkYgQUdDIERBQyAqLworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIElRTV9BRl9TVERCWV9fQSwgJmRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWRhdGEgfD0gSVFNX0FGX1NUREJZX1NUREJZX1RBR0NfUkZfU1RBTkRCWTsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX1NUREJZX19BLCBkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIERpc2FibGUgU0NVIFJGIEFHQyBsb29wICovCisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ09ORklHX19BLCAmZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJZGF0YSB8PSBTQ1VfUkFNX0FHQ19DT05GSUdfRElTQUJMRV9SRl9BR0NfX007CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NPTkZJR19fQSwgZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRUlOVkFMOworCisJfQorZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKKyNkZWZpbmUgU0NVX1JBTV9BR0NfS0lfSU5WX0lGX1BPTF9fTSAweDIwMDAKKworc3RhdGljIGludCBTZXRBZ2NJZihzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCSAgICBzdHJ1Y3QgU0NmZ0FnYyAqcEFnY0NmZywgYm9vbCBpc0RUVikKK3sKKwl1MTYgZGF0YSA9IDA7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IFNDZmdBZ2MgKnBSZkFnY1NldHRpbmdzOworCisJZHByaW50aygxLCAiXG4iKTsKKworCXN3aXRjaCAocEFnY0NmZy0+Y3RybE1vZGUpIHsKKwljYXNlIERSWEtfQUdDX0NUUkxfQVVUTzoKKworCQkvKiBFbmFibGUgSUYgQUdDIERBQyAqLworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIElRTV9BRl9TVERCWV9fQSwgJmRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWRhdGEgJj0gfklRTV9BRl9TVERCWV9TVERCWV9UQUdDX0lGX1NUQU5EQlk7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9TVERCWV9fQSwgZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NPTkZJR19fQSwgJmRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJLyogRW5hYmxlIFNDVSBJRiBBR0MgbG9vcCAqLworCQlkYXRhICY9IH5TQ1VfUkFNX0FHQ19DT05GSUdfRElTQUJMRV9JRl9BR0NfX007CisKKwkJLyogUG9sYXJpdHkgKi8KKwkJaWYgKHN0YXRlLT5tX0lmQWdjUG9sKQorCQkJZGF0YSB8PSBTQ1VfUkFNX0FHQ19DT05GSUdfSU5WX0lGX1BPTF9fTTsKKwkJZWxzZQorCQkJZGF0YSAmPSB+U0NVX1JBTV9BR0NfQ09ORklHX0lOVl9JRl9QT0xfX007CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NPTkZJR19fQSwgZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBTZXQgc3BlZWQgKHVzaW5nIGNvbXBsZW1lbnRhcnkgcmVkdWN0aW9uIHZhbHVlKSAqLworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0tJX1JFRF9fQSwgJmRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWRhdGEgJj0gflNDVV9SQU1fQUdDX0tJX1JFRF9JQUdDX1JFRF9fTTsKKwkJZGF0YSB8PSAofihwQWdjQ2ZnLT5zcGVlZCA8PAorCQkJCVNDVV9SQU1fQUdDX0tJX1JFRF9JQUdDX1JFRF9fQikKKwkJCQkmIFNDVV9SQU1fQUdDX0tJX1JFRF9JQUdDX1JFRF9fTSk7CisKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfS0lfUkVEX19BLCBkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCWlmIChJc1FBTShzdGF0ZSkpCisJCQlwUmZBZ2NTZXR0aW5ncyA9ICZzdGF0ZS0+bV9xYW1SZkFnY0NmZzsKKwkJZWxzZQorCQkJcFJmQWdjU2V0dGluZ3MgPSAmc3RhdGUtPm1fYXR2UmZBZ2NDZmc7CisJCWlmIChwUmZBZ2NTZXR0aW5ncyA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCQkvKiBSZXN0b3JlIFRPUCAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19JRl9JQUNDVV9ISV9UR1RfTUFYX19BLCBwUmZBZ2NTZXR0aW5ncy0+dG9wKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlicmVhazsKKworCWNhc2UgRFJYS19BR0NfQ1RSTF9VU0VSOgorCisJCS8qIEVuYWJsZSBJRiBBR0MgREFDICovCisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgSVFNX0FGX1NUREJZX19BLCAmZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJZGF0YSAmPSB+SVFNX0FGX1NUREJZX1NUREJZX1RBR0NfSUZfU1RBTkRCWTsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX1NUREJZX19BLCBkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ09ORklHX19BLCAmZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBEaXNhYmxlIFNDVSBJRiBBR0MgbG9vcCAqLworCQlkYXRhIHw9IFNDVV9SQU1fQUdDX0NPTkZJR19ESVNBQkxFX0lGX0FHQ19fTTsKKworCQkvKiBQb2xhcml0eSAqLworCQlpZiAoc3RhdGUtPm1fSWZBZ2NQb2wpCisJCQlkYXRhIHw9IFNDVV9SQU1fQUdDX0NPTkZJR19JTlZfSUZfUE9MX19NOworCQllbHNlCisJCQlkYXRhICY9IH5TQ1VfUkFNX0FHQ19DT05GSUdfSU5WX0lGX1BPTF9fTTsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ09ORklHX19BLCBkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIFdyaXRlIHZhbHVlIHRvIG91dHB1dCBwaW4gKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfSUZfSUFDQ1VfSElfVEdUX01BWF9fQSwgcEFnY0NmZy0+b3V0cHV0TGV2ZWwpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWJyZWFrOworCisJY2FzZSBEUlhLX0FHQ19DVFJMX09GRjoKKworCQkvKiBEaXNhYmxlIElmIEFHQyBEQUMgKi8KKwkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBJUU1fQUZfU1REQllfX0EsICZkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlkYXRhIHw9IElRTV9BRl9TVERCWV9TVERCWV9UQUdDX0lGX1NUQU5EQlk7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9TVERCWV9fQSwgZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBEaXNhYmxlIFNDVSBJRiBBR0MgbG9vcCAqLworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NPTkZJR19fQSwgJmRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWRhdGEgfD0gU0NVX1JBTV9BR0NfQ09ORklHX0RJU0FCTEVfSUZfQUdDX19NOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19DT05GSUdfX0EsIGRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWJyZWFrOworCX0JCS8qIHN3aXRjaCAoYWdjU2V0dGluZ3NJZi0+Y3RybE1vZGUpICovCisKKwkvKiBhbHdheXMgc2V0IHRoZSB0b3AgdG8gc3VwcG9ydAorCQljb25maWd1cmF0aW9ucyB3aXRob3V0IGlmLWxvb3AgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19JTkdBSU5fVEdUX01JTl9fQSwgcEFnY0NmZy0+dG9wKTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFJlYWRJRkFnYyhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUzMiAqcFZhbHVlKQoreworCXUxNiBhZ2NEYWNMdmw7CisJaW50IHN0YXR1czsKKwl1MTYgTGV2ZWwgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgSVFNX0FGX0FHQ19JRl9fQSwgJmFnY0RhY0x2bCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJKnBWYWx1ZSA9IDA7CisKKwlpZiAoYWdjRGFjTHZsID4gRFJYS19BR0NfREFDX09GRlNFVCkKKwkJTGV2ZWwgPSBhZ2NEYWNMdmwgLSBEUlhLX0FHQ19EQUNfT0ZGU0VUOworCWlmIChMZXZlbCA8IDE0MDAwKQorCQkqcFZhbHVlID0gKDE0MDAwIC0gTGV2ZWwpIC8gNDsKKwllbHNlCisJCSpwVmFsdWUgPSAwOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBHZXRRQU1TaWduYWxUb05vaXNlKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwKKwkJCSAgICAgICBzMzIgKnBTaWduYWxUb05vaXNlKQoreworCWludCBzdGF0dXMgPSAwOworCXUxNiBxYW1TbEVyclBvd2VyID0gMDsJLyogYWNjdW0uIGVycm9yIGJldHdlZW4KKwkJCQkJcmF3IGFuZCBzbGljZWQgc3ltYm9scyAqLworCXUzMiBxYW1TbFNpZ1Bvd2VyID0gMDsJLyogdXNlZCBmb3IgTUVSLCBkZXBlbmRzIG9mCisJCQkJCVFBTSBjb25zdGVsbGF0aW9uICovCisJdTMyIHFhbVNsTWVyID0gMDsJLyogUUFNIE1FUiAqLworCisJZHByaW50aygxLCAiXG4iKTsKKworCS8qIE1FUiBjYWxjdWxhdGlvbiAqLworCisJLyogZ2V0IHRoZSByZWdpc3RlciB2YWx1ZSBuZWVkZWQgZm9yIE1FUiAqLworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgUUFNX1NMX0VSUl9QT1dFUl9fQSwgJnFhbVNsRXJyUG93ZXIpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHN0YXRlLT5wYXJhbS51LnFhbS5tb2R1bGF0aW9uKSB7CisJY2FzZSBRQU1fMTY6CisJCXFhbVNsU2lnUG93ZXIgPSBEUlhLX1FBTV9TTF9TSUdfUE9XRVJfUUFNMTYgPDwgMjsKKwkJYnJlYWs7CisJY2FzZSBRQU1fMzI6CisJCXFhbVNsU2lnUG93ZXIgPSBEUlhLX1FBTV9TTF9TSUdfUE9XRVJfUUFNMzIgPDwgMjsKKwkJYnJlYWs7CisJY2FzZSBRQU1fNjQ6CisJCXFhbVNsU2lnUG93ZXIgPSBEUlhLX1FBTV9TTF9TSUdfUE9XRVJfUUFNNjQgPDwgMjsKKwkJYnJlYWs7CisJY2FzZSBRQU1fMTI4OgorCQlxYW1TbFNpZ1Bvd2VyID0gRFJYS19RQU1fU0xfU0lHX1BPV0VSX1FBTTEyOCA8PCAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCWNhc2UgUUFNXzI1NjoKKwkJcWFtU2xTaWdQb3dlciA9IERSWEtfUUFNX1NMX1NJR19QT1dFUl9RQU0yNTYgPDwgMjsKKwkJYnJlYWs7CisJfQorCisJaWYgKHFhbVNsRXJyUG93ZXIgPiAwKSB7CisJCXFhbVNsTWVyID0gTG9nMTBUaW1lczEwMChxYW1TbFNpZ1Bvd2VyKSAtCisJCQlMb2cxMFRpbWVzMTAwKCh1MzIpIHFhbVNsRXJyUG93ZXIpOworCX0KKwkqcFNpZ25hbFRvTm9pc2UgPSBxYW1TbE1lcjsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgR2V0RFZCVFNpZ25hbFRvTm9pc2Uoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLAorCQkJCXMzMiAqcFNpZ25hbFRvTm9pc2UpCit7CisJaW50IHN0YXR1czsKKwl1MTYgcmVnRGF0YSA9IDA7CisJdTMyIEVxUmVnVGRTcXJFcnJJID0gMDsKKwl1MzIgRXFSZWdUZFNxckVyclEgPSAwOworCXUxNiBFcVJlZ1RkU3FyRXJyRXhwID0gMDsKKwl1MTYgRXFSZWdUZFRwc1B3ck9mcyA9IDA7CisJdTE2IEVxUmVnVGRSZXFTbWJDbnQgPSAwOworCXUzMiB0cHNDbnQgPSAwOworCXUzMiBTcXJFcnJJUSA9IDA7CisJdTMyIGEgPSAwOworCXUzMiBiID0gMDsKKwl1MzIgYyA9IDA7CisJdTMyIGlNRVIgPSAwOworCXUxNiB0cmFuc21pc3Npb25QYXJhbXMgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9FUV9UT1BfVERfVFBTX1BXUl9PRlNfX0EsICZFcVJlZ1RkVHBzUHdyT2ZzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIE9GRE1fRVFfVE9QX1REX1JFUV9TTUJfQ05UX19BLCAmRXFSZWdUZFJlcVNtYkNudCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBPRkRNX0VRX1RPUF9URF9TUVJfRVJSX0VYUF9fQSwgJkVxUmVnVGRTcXJFcnJFeHApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9FUV9UT1BfVERfU1FSX0VSUl9JX19BLCAmcmVnRGF0YSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJLyogRXh0ZW5kIFNRUl9FUlJfSSBvcGVyYXRpb25hbCByYW5nZSAqLworCUVxUmVnVGRTcXJFcnJJID0gKHUzMikgcmVnRGF0YTsKKwlpZiAoKEVxUmVnVGRTcXJFcnJFeHAgPiAxMSkgJiYKKwkJKEVxUmVnVGRTcXJFcnJJIDwgMHgwMDAwMEZGRlVMKSkgeworCQlFcVJlZ1RkU3FyRXJySSArPSAweDAwMDEwMDAwVUw7CisJfQorCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9FUV9UT1BfVERfU1FSX0VSUl9RX19BLCAmcmVnRGF0YSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJLyogRXh0ZW5kIFNRUl9FUlJfUSBvcGVyYXRpb25hbCByYW5nZSAqLworCUVxUmVnVGRTcXJFcnJRID0gKHUzMikgcmVnRGF0YTsKKwlpZiAoKEVxUmVnVGRTcXJFcnJFeHAgPiAxMSkgJiYKKwkJKEVxUmVnVGRTcXJFcnJRIDwgMHgwMDAwMEZGRlVMKSkKKwkJRXFSZWdUZFNxckVyclEgKz0gMHgwMDAxMDAwMFVMOworCisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9fQSwgJnRyYW5zbWlzc2lvblBhcmFtcyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBDaGVjayBpbnB1dCBkYXRhIGZvciBNRVIgKi8KKworCS8qIE1FUiBjYWxjdWxhdGlvbiAoaW4gMC4xIGRCKSB3aXRob3V0IG1hdGguaCAqLworCWlmICgoRXFSZWdUZFRwc1B3ck9mcyA9PSAwKSB8fCAoRXFSZWdUZFJlcVNtYkNudCA9PSAwKSkKKwkJaU1FUiA9IDA7CisJZWxzZSBpZiAoKEVxUmVnVGRTcXJFcnJJICsgRXFSZWdUZFNxckVyclEpID09IDApIHsKKwkJLyogTm8gZXJyb3IgYXQgYWxsLCB0aGlzIG11c3QgYmUgdGhlIEhXIHJlc2V0IHZhbHVlCisJCQkqIEFwcGFyZW50bHkgbm8gZmlyc3QgbWVhc3VyZW1lbnQgeWV0CisJCQkqIFNldCBNRVIgdG8gMC4wICovCisJCWlNRVIgPSAwOworCX0gZWxzZSB7CisJCVNxckVycklRID0gKEVxUmVnVGRTcXJFcnJJICsgRXFSZWdUZFNxckVyclEpIDw8CisJCQlFcVJlZ1RkU3FyRXJyRXhwOworCQlpZiAoKHRyYW5zbWlzc2lvblBhcmFtcyAmCisJCQlPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9NT0RFX19NKQorCQkJPT0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fTU9ERV8ySykKKwkJCXRwc0NudCA9IDE3OworCQllbHNlCisJCQl0cHNDbnQgPSA2ODsKKworCQkvKiBJTUVSID0gMTAwICogbG9nMTAgKHgpCisJCQl3aGVyZSB4ID0gKEVxUmVnVGRUcHNQd3JPZnNeMiAqCisJCQlFcVJlZ1RkUmVxU21iQ250ICogdHBzQ250KS9TcXJFcnJJUQorCisJCQk9PiBJTUVSID0gYSArIGIgLWMKKwkJCXdoZXJlIGEgPSAxMDAgKiBsb2cxMCAoRXFSZWdUZFRwc1B3ck9mc14yKQorCQkJYiA9IDEwMCAqIGxvZzEwIChFcVJlZ1RkUmVxU21iQ250ICogdHBzQ250KQorCQkJYyA9IDEwMCAqIGxvZzEwIChTcXJFcnJJUSkKKwkJCSovCisKKwkJLyogbG9nKHgpIHggPSA5Yml0cyAqIDliaXRzLT4xOCBiaXRzICAqLworCQlhID0gTG9nMTBUaW1lczEwMChFcVJlZ1RkVHBzUHdyT2ZzICoKKwkJCQkJRXFSZWdUZFRwc1B3ck9mcyk7CisJCS8qIGxvZyh4KSB4ID0gMTZiaXRzICogN2JpdHMtPjIzIGJpdHMgICovCisJCWIgPSBMb2cxMFRpbWVzMTAwKEVxUmVnVGRSZXFTbWJDbnQgKiB0cHNDbnQpOworCQkvKiBsb2coeCkgeCA9ICgxNmJpdHMgKyAxNmJpdHMpIDw8IDE1IC0+MzIgYml0cyAgKi8KKwkJYyA9IExvZzEwVGltZXMxMDAoU3FyRXJySVEpOworCisJCWlNRVIgPSBhICsgYjsKKwkJLyogTm8gbmVnYXRpdmUgTUVSLCBjbGlwIHRvIHplcm8gKi8KKwkJaWYgKGlNRVIgPiBjKQorCQkJaU1FUiAtPSBjOworCQllbHNlCisJCQlpTUVSID0gMDsKKwl9CisJKnBTaWduYWxUb05vaXNlID0gaU1FUjsKKworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgR2V0U2lnbmFsVG9Ob2lzZShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHMzMiAqcFNpZ25hbFRvTm9pc2UpCit7CisJZHByaW50aygxLCAiXG4iKTsKKworCSpwU2lnbmFsVG9Ob2lzZSA9IDA7CisJc3dpdGNoIChzdGF0ZS0+bV9PcGVyYXRpb25Nb2RlKSB7CisJY2FzZSBPTV9EVkJUOgorCQlyZXR1cm4gR2V0RFZCVFNpZ25hbFRvTm9pc2Uoc3RhdGUsIHBTaWduYWxUb05vaXNlKTsKKwljYXNlIE9NX1FBTV9JVFVfQToKKwljYXNlIE9NX1FBTV9JVFVfQzoKKwkJcmV0dXJuIEdldFFBTVNpZ25hbFRvTm9pc2Uoc3RhdGUsIHBTaWduYWxUb05vaXNlKTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50IEdldERWQlRRdWFsaXR5KHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgczMyICpwUXVhbGl0eSkKK3sKKwkvKiBTTlIgVmFsdWVzIGZvciBxdWFzaSBlcnJvcmZyZWUgcmVjZXB0aW9uIHJvbSBOb3JkaWcgMi4yICovCisJaW50IHN0YXR1cyA9IDA7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJc3RhdGljIHMzMiBRRV9TTltdID0geworCQk1MSwJCS8qIFFQU0sgMS8yICovCisJCTY5LAkJLyogUVBTSyAyLzMgKi8KKwkJNzksCQkvKiBRUFNLIDMvNCAqLworCQk4OSwJCS8qIFFQU0sgNS82ICovCisJCTk3LAkJLyogUVBTSyA3LzggKi8KKwkJMTA4LAkJLyogMTYtUUFNIDEvMiAqLworCQkxMzEsCQkvKiAxNi1RQU0gMi8zICovCisJCTE0NiwJCS8qIDE2LVFBTSAzLzQgKi8KKwkJMTU2LAkJLyogMTYtUUFNIDUvNiAqLworCQkxNjAsCQkvKiAxNi1RQU0gNy84ICovCisJCTE2NSwJCS8qIDY0LVFBTSAxLzIgKi8KKwkJMTg3LAkJLyogNjQtUUFNIDIvMyAqLworCQkyMDIsCQkvKiA2NC1RQU0gMy80ICovCisJCTIxNiwJCS8qIDY0LVFBTSA1LzYgKi8KKwkJMjI1LAkJLyogNjQtUUFNIDcvOCAqLworCX07CisKKwkqcFF1YWxpdHkgPSAwOworCisJZG8geworCQlzMzIgU2lnbmFsVG9Ob2lzZSA9IDA7CisJCXUxNiBDb25zdGVsbGF0aW9uID0gMDsKKwkJdTE2IENvZGVSYXRlID0gMDsKKwkJdTMyIFNpZ25hbFRvTm9pc2VSZWw7CisJCXUzMiBCRVJRdWFsaXR5OworCisJCXN0YXR1cyA9IEdldERWQlRTaWduYWxUb05vaXNlKHN0YXRlLCAmU2lnbmFsVG9Ob2lzZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9FUV9UT1BfVERfVFBTX0NPTlNUX19BLCAmQ29uc3RlbGxhdGlvbik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCUNvbnN0ZWxsYXRpb24gJj0gT0ZETV9FUV9UT1BfVERfVFBTX0NPTlNUX19NOworCisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9FUV9UT1BfVERfVFBTX0NPREVfSFBfX0EsICZDb2RlUmF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCUNvZGVSYXRlICY9IE9GRE1fRVFfVE9QX1REX1RQU19DT0RFX0hQX19NOworCisJCWlmIChDb25zdGVsbGF0aW9uID4gT0ZETV9FUV9UT1BfVERfVFBTX0NPTlNUXzY0UUFNIHx8CisJCSAgICBDb2RlUmF0ZSA+IE9GRE1fRVFfVE9QX1REX1RQU19DT0RFX0xQXzdfOCkKKwkJCWJyZWFrOworCQlTaWduYWxUb05vaXNlUmVsID0gU2lnbmFsVG9Ob2lzZSAtCisJCSAgICBRRV9TTltDb25zdGVsbGF0aW9uICogNSArIENvZGVSYXRlXTsKKwkJQkVSUXVhbGl0eSA9IDEwMDsKKworCQlpZiAoU2lnbmFsVG9Ob2lzZVJlbCA8IC03MCkKKwkJCSpwUXVhbGl0eSA9IDA7CisJCWVsc2UgaWYgKFNpZ25hbFRvTm9pc2VSZWwgPCAzMCkKKwkJCSpwUXVhbGl0eSA9ICgoU2lnbmFsVG9Ob2lzZVJlbCArIDcwKSAqCisJCQkJICAgICBCRVJRdWFsaXR5KSAvIDEwMDsKKwkJZWxzZQorCQkJKnBRdWFsaXR5ID0gQkVSUXVhbGl0eTsKKwl9IHdoaWxlICgwKTsKKwlyZXR1cm4gMDsKK307CisKK3N0YXRpYyBpbnQgR2V0RFZCQ1F1YWxpdHkoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCBzMzIgKnBRdWFsaXR5KQoreworCWludCBzdGF0dXMgPSAwOworCSpwUXVhbGl0eSA9IDA7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJZG8geworCQl1MzIgU2lnbmFsVG9Ob2lzZSA9IDA7CisJCXUzMiBCRVJRdWFsaXR5ID0gMTAwOworCQl1MzIgU2lnbmFsVG9Ob2lzZVJlbCA9IDA7CisKKwkJc3RhdHVzID0gR2V0UUFNU2lnbmFsVG9Ob2lzZShzdGF0ZSwgJlNpZ25hbFRvTm9pc2UpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoc3RhdGUtPnBhcmFtLnUucWFtLm1vZHVsYXRpb24pIHsKKwkJY2FzZSBRQU1fMTY6CisJCQlTaWduYWxUb05vaXNlUmVsID0gU2lnbmFsVG9Ob2lzZSAtIDIwMDsKKwkJCWJyZWFrOworCQljYXNlIFFBTV8zMjoKKwkJCVNpZ25hbFRvTm9pc2VSZWwgPSBTaWduYWxUb05vaXNlIC0gMjMwOworCQkJYnJlYWs7CS8qIE5vdCBpbiBOb3JEaWcgKi8KKwkJY2FzZSBRQU1fNjQ6CisJCQlTaWduYWxUb05vaXNlUmVsID0gU2lnbmFsVG9Ob2lzZSAtIDI2MDsKKwkJCWJyZWFrOworCQljYXNlIFFBTV8xMjg6CisJCQlTaWduYWxUb05vaXNlUmVsID0gU2lnbmFsVG9Ob2lzZSAtIDI5MDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQljYXNlIFFBTV8yNTY6CisJCQlTaWduYWxUb05vaXNlUmVsID0gU2lnbmFsVG9Ob2lzZSAtIDMyMDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKFNpZ25hbFRvTm9pc2VSZWwgPCAtNzApCisJCQkqcFF1YWxpdHkgPSAwOworCQllbHNlIGlmIChTaWduYWxUb05vaXNlUmVsIDwgMzApCisJCQkqcFF1YWxpdHkgPSAoKFNpZ25hbFRvTm9pc2VSZWwgKyA3MCkgKgorCQkJCSAgICAgQkVSUXVhbGl0eSkgLyAxMDA7CisJCWVsc2UKKwkJCSpwUXVhbGl0eSA9IEJFUlF1YWxpdHk7CisJfSB3aGlsZSAoMCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IEdldFF1YWxpdHkoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCBzMzIgKnBRdWFsaXR5KQoreworCWRwcmludGsoMSwgIlxuIik7CisKKwlzd2l0Y2ggKHN0YXRlLT5tX09wZXJhdGlvbk1vZGUpIHsKKwljYXNlIE9NX0RWQlQ6CisJCXJldHVybiBHZXREVkJUUXVhbGl0eShzdGF0ZSwgcFF1YWxpdHkpOworCWNhc2UgT01fUUFNX0lUVV9BOgorCQlyZXR1cm4gR2V0RFZCQ1F1YWxpdHkoc3RhdGUsIHBRdWFsaXR5KTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBGcmVlIGRhdGEgcmFtIGluIFNJTyBISSAqLworI2RlZmluZSBTSU9fSElfUkFfUkFNX1VTUl9CRUdJTl9fQSAweDQyMDA0MAorI2RlZmluZSBTSU9fSElfUkFfUkFNX1VTUl9FTkRfX0EgICAweDQyMDA2MAorCisjZGVmaW5lIERSWEtfSElfQVRPTUlDX0JVRl9TVEFSVCAoU0lPX0hJX1JBX1JBTV9VU1JfQkVHSU5fX0EpCisjZGVmaW5lIERSWEtfSElfQVRPTUlDX0JVRl9FTkQgICAoU0lPX0hJX1JBX1JBTV9VU1JfQkVHSU5fX0EgKyA3KQorI2RlZmluZSBEUlhLX0hJX0FUT01JQ19SRUFEICAgICAgU0lPX0hJX1JBX1JBTV9QQVJfM19BQ1BfUldfUkVBRAorI2RlZmluZSBEUlhLX0hJX0FUT01JQ19XUklURSAgICAgU0lPX0hJX1JBX1JBTV9QQVJfM19BQ1BfUldfV1JJVEUKKworI2RlZmluZSBEUlhEQVBfRkFTSV9BRERSMkJMT0NLKGFkZHIpICAoKChhZGRyKSA+PiAyMikgJiAweDNGKQorI2RlZmluZSBEUlhEQVBfRkFTSV9BRERSMkJBTksoYWRkcikgICAoKChhZGRyKSA+PiAxNikgJiAweDNGKQorI2RlZmluZSBEUlhEQVBfRkFTSV9BRERSMk9GRlNFVChhZGRyKSAoKGFkZHIpICYgMHg3RkZGKQorCitzdGF0aWMgaW50IENvbmZpZ3VyZUkyQ0JyaWRnZShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIGJvb2wgYkVuYWJsZUJyaWRnZSkKK3sKKwlpbnQgc3RhdHVzID0gLUVJTlZBTDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwlpZiAoc3RhdGUtPm1fRHJ4a1N0YXRlID09IERSWEtfVU5JTklUSUFMSVpFRCkKKwkJZ290byBlcnJvcjsKKwlpZiAoc3RhdGUtPm1fRHJ4a1N0YXRlID09IERSWEtfUE9XRVJFRF9ET1dOKQorCQlnb3RvIGVycm9yOworCisJaWYgKHN0YXRlLT5ub19pMmNfYnJpZGdlKQorCQlyZXR1cm4gMDsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19ISV9SQV9SQU1fUEFSXzFfX0EsIFNJT19ISV9SQV9SQU1fUEFSXzFfUEFSMV9TRUNfS0VZKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlpZiAoYkVuYWJsZUJyaWRnZSkgeworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fSElfUkFfUkFNX1BBUl8yX19BLCBTSU9fSElfUkFfUkFNX1BBUl8yX0JSRF9DRkdfQ0xPU0VEKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19ISV9SQV9SQU1fUEFSXzJfX0EsIFNJT19ISV9SQV9SQU1fUEFSXzJfQlJEX0NGR19PUEVOKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCX0KKworCXN0YXR1cyA9IEhJX0NvbW1hbmQoc3RhdGUsIFNJT19ISV9SQV9SQU1fQ01EX0JSRENUUkwsIDApOworCitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBTZXRQcmVTYXcoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLAorCQkgICAgIHN0cnVjdCBTQ2ZnUHJlU2F3ICpwUHJlU2F3Q2ZnKQoreworCWludCBzdGF0dXMgPSAtRUlOVkFMOworCisJZHByaW50aygxLCAiXG4iKTsKKworCWlmICgocFByZVNhd0NmZyA9PSBOVUxMKQorCSAgICB8fCAocFByZVNhd0NmZy0+cmVmZXJlbmNlID4gSVFNX0FGX1BEUkVGX19NKSkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9QRFJFRl9fQSwgcFByZVNhd0NmZy0+cmVmZXJlbmNlKTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IEJMRGlyZWN0Q21kKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTMyIHRhcmdldEFkZHIsCisJCSAgICAgICB1MTYgcm9tT2Zmc2V0LCB1MTYgbnJPZkVsZW1lbnRzLCB1MzIgdGltZU91dCkKK3sKKwl1MTYgYmxTdGF0dXMgPSAwOworCXUxNiBvZmZzZXQgPSAodTE2KSAoKHRhcmdldEFkZHIgPj4gMCkgJiAweDAwRkZGRik7CisJdTE2IGJsb2NrYmFuayA9ICh1MTYpICgodGFyZ2V0QWRkciA+PiAxNikgJiAweDAwMEZGRik7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGVuZDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwltdXRleF9sb2NrKCZzdGF0ZS0+bXV0ZXgpOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19CTF9NT0RFX19BLCBTSU9fQkxfTU9ERV9ESVJFQ1QpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19CTF9UR1RfSERSX19BLCBibG9ja2JhbmspOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19CTF9UR1RfQUREUl9fQSwgb2Zmc2V0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQkxfU1JDX0FERFJfX0EsIHJvbU9mZnNldCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0JMX1NSQ19MRU5fX0EsIG5yT2ZFbGVtZW50cyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0JMX0VOQUJMRV9fQSwgU0lPX0JMX0VOQUJMRV9PTik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwllbmQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh0aW1lT3V0KTsKKwlkbyB7CisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0lPX0JMX1NUQVRVU19fQSwgJmJsU3RhdHVzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCX0gd2hpbGUgKChibFN0YXR1cyA9PSAweDEpICYmIHRpbWVfaXNfYWZ0ZXJfamlmZmllcyhlbmQpKTsKKwlpZiAoYmxTdGF0dXMgPT0gMHgxKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogU0lPIG5vdCByZWFkeVxuIik7CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3IyOworCX0KK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKK2Vycm9yMjoKKwltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7CisJcmV0dXJuIHN0YXR1czsKKworfQorCitzdGF0aWMgaW50IEFEQ1N5bmNNZWFzdXJlbWVudChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUxNiAqY291bnQpCit7CisJdTE2IGRhdGEgPSAwOworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJLyogU3RhcnQgbWVhc3VyZW1lbnQgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfQ09NTV9FWEVDX19BLCBJUU1fQUZfQ09NTV9FWEVDX0FDVElWRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX1NUQVJUX0xPQ0tfX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJKmNvdW50ID0gMDsKKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIElRTV9BRl9QSEFTRTBfX0EsICZkYXRhKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlpZiAoZGF0YSA9PSAxMjcpCisJCSpjb3VudCA9ICpjb3VudCArIDE7CisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBJUU1fQUZfUEhBU0UxX19BLCAmZGF0YSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJaWYgKGRhdGEgPT0gMTI3KQorCQkqY291bnQgPSAqY291bnQgKyAxOworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgSVFNX0FGX1BIQVNFMl9fQSwgJmRhdGEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCWlmIChkYXRhID09IDEyNykKKwkJKmNvdW50ID0gKmNvdW50ICsgMTsKKworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgQURDU3luY2hyb25pemF0aW9uKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwl1MTYgY291bnQgPSAwOworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJc3RhdHVzID0gQURDU3luY01lYXN1cmVtZW50KHN0YXRlLCAmY291bnQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJaWYgKGNvdW50ID09IDEpIHsKKwkJLyogVHJ5IHNhbXBsaW5nIG9uIGEgZGlmZnJlbnQgZWRnZSAqLworCQl1MTYgY2xrTmVnID0gMDsKKworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIElRTV9BRl9DTEtORUdfX0EsICZjbGtOZWcpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWlmICgoY2xrTmVnIHwgSVFNX0FGX0NMS05FR19DTEtORUdEQVRBX19NKSA9PQorCQkJSVFNX0FGX0NMS05FR19DTEtORUdEQVRBX0NMS19BRENfREFUQV9QT1MpIHsKKwkJCWNsa05lZyAmPSAofihJUU1fQUZfQ0xLTkVHX0NMS05FR0RBVEFfX00pKTsKKwkJCWNsa05lZyB8PQorCQkJCUlRTV9BRl9DTEtORUdfQ0xLTkVHREFUQV9DTEtfQURDX0RBVEFfTkVHOworCQl9IGVsc2UgeworCQkJY2xrTmVnICY9ICh+KElRTV9BRl9DTEtORUdfQ0xLTkVHREFUQV9fTSkpOworCQkJY2xrTmVnIHw9CisJCQkJSVFNX0FGX0NMS05FR19DTEtORUdEQVRBX0NMS19BRENfREFUQV9QT1M7CisJCX0KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX0NMS05FR19fQSwgY2xrTmVnKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSBBRENTeW5jTWVhc3VyZW1lbnQoc3RhdGUsICZjb3VudCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoY291bnQgPCAyKQorCQlzdGF0dXMgPSAtRUlOVkFMOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgU2V0RnJlcXVlbmN5U2hpZnRlcihzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCQkgICAgICAgdTE2IGludGVybWVkaWF0ZUZyZXFrSHosCisJCQkgICAgICAgczMyIHR1bmVyRnJlcU9mZnNldCwgYm9vbCBpc0RUVikKK3sKKwlib29sIHNlbGVjdFBvc0ltYWdlID0gZmFsc2U7CisJdTMyIHJmRnJlcVJlc2lkdWFsID0gdHVuZXJGcmVxT2Zmc2V0OworCXUzMiBmbUZyZXF1ZW5jeVNoaWZ0ID0gMDsKKwlib29sIHR1bmVyTWlycm9yID0gIXN0YXRlLT5tX2JNaXJyb3JGcmVxU3BlY3Q7CisJdTMyIGFkY0ZyZXE7CisJYm9vbCBhZGNGbGlwOworCWludCBzdGF0dXM7CisJdTMyIGlmRnJlcUFjdHVhbDsKKwl1MzIgc2FtcGxpbmdGcmVxdWVuY3kgPSAodTMyKSAoc3RhdGUtPm1fc3lzQ2xvY2tGcmVxIC8gMyk7CisJdTMyIGZyZXF1ZW5jeVNoaWZ0OworCWJvb2wgaW1hZ2VUb1NlbGVjdDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwkvKgorCSAgIFByb2dyYW0gZnJlcXVlbmN5IHNoaWZ0ZXIKKwkgICBObyBuZWVkIHRvIGFjY291bnQgZm9yIG1pcnJvcmluZyBvbiBSRgorCSAqLworCWlmIChpc0RUVikgeworCQlpZiAoKHN0YXRlLT5tX09wZXJhdGlvbk1vZGUgPT0gT01fUUFNX0lUVV9BKSB8fAorCQkgICAgKHN0YXRlLT5tX09wZXJhdGlvbk1vZGUgPT0gT01fUUFNX0lUVV9DKSB8fAorCQkgICAgKHN0YXRlLT5tX09wZXJhdGlvbk1vZGUgPT0gT01fRFZCVCkpCisJCQlzZWxlY3RQb3NJbWFnZSA9IHRydWU7CisJCWVsc2UKKwkJCXNlbGVjdFBvc0ltYWdlID0gZmFsc2U7CisJfQorCWlmICh0dW5lck1pcnJvcikKKwkJLyogdHVuZXIgZG9lc24ndCBtaXJyb3IgKi8KKwkJaWZGcmVxQWN0dWFsID0gaW50ZXJtZWRpYXRlRnJlcWtIeiArCisJCSAgICByZkZyZXFSZXNpZHVhbCArIGZtRnJlcXVlbmN5U2hpZnQ7CisJZWxzZQorCQkvKiB0dW5lciBtaXJyb3JzICovCisJCWlmRnJlcUFjdHVhbCA9IGludGVybWVkaWF0ZUZyZXFrSHogLQorCQkgICAgcmZGcmVxUmVzaWR1YWwgLSBmbUZyZXF1ZW5jeVNoaWZ0OworCWlmIChpZkZyZXFBY3R1YWwgPiBzYW1wbGluZ0ZyZXF1ZW5jeSAvIDIpIHsKKwkJLyogYWRjIG1pcnJvcnMgKi8KKwkJYWRjRnJlcSA9IHNhbXBsaW5nRnJlcXVlbmN5IC0gaWZGcmVxQWN0dWFsOworCQlhZGNGbGlwID0gdHJ1ZTsKKwl9IGVsc2UgeworCQkvKiBhZGMgZG9lc24ndCBtaXJyb3IgKi8KKwkJYWRjRnJlcSA9IGlmRnJlcUFjdHVhbDsKKwkJYWRjRmxpcCA9IGZhbHNlOworCX0KKworCWZyZXF1ZW5jeVNoaWZ0ID0gYWRjRnJlcTsKKwlpbWFnZVRvU2VsZWN0ID0gc3RhdGUtPm1fcmZtaXJyb3IgXiB0dW5lck1pcnJvciBeCisJICAgIGFkY0ZsaXAgXiBzZWxlY3RQb3NJbWFnZTsKKwlzdGF0ZS0+bV9JcW1Gc1JhdGVPZnMgPQorCSAgICBGcmFjMjhhKChmcmVxdWVuY3lTaGlmdCksIHNhbXBsaW5nRnJlcXVlbmN5KTsKKworCWlmIChpbWFnZVRvU2VsZWN0KQorCQlzdGF0ZS0+bV9JcW1Gc1JhdGVPZnMgPSB+c3RhdGUtPm1fSXFtRnNSYXRlT2ZzICsgMTsKKworCS8qIFByb2dyYW0gZnJlcXVlbmN5IHNoaWZ0ZXIgd2l0aCB0dW5lciBvZmZzZXQgY29tcGVuc2F0aW9uICovCisJLyogZnJlcXVlbmN5U2hpZnQgKz0gdHVuZXJGcmVxT2Zmc2V0OyBUT0RPICovCisJc3RhdHVzID0gd3JpdGUzMihzdGF0ZSwgSVFNX0ZTX1JBVEVfT0ZTX0xPX19BLAorCQkJIHN0YXRlLT5tX0lxbUZzUmF0ZU9mcyk7CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgSW5pdEFHQyhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIGJvb2wgaXNEVFYpCit7CisJdTE2IGluZ2FpblRndCA9IDA7CisJdTE2IGluZ2FpblRndE1pbiA9IDA7CisJdTE2IGluZ2FpblRndE1heCA9IDA7CisJdTE2IGNscEN5Y2xlbiA9IDA7CisJdTE2IGNscFN1bU1pbiA9IDA7CisJdTE2IGNscERpclRvID0gMDsKKwl1MTYgc25zU3VtTWluID0gMDsKKwl1MTYgc25zU3VtTWF4ID0gMDsKKwl1MTYgY2xwU3VtTWF4ID0gMDsKKwl1MTYgc25zRGlyVG8gPSAwOworCXUxNiBraUlubmVyZ2Fpbk1pbiA9IDA7CisJdTE2IGlmSWFjY3VIaVRndCA9IDA7CisJdTE2IGlmSWFjY3VIaVRndE1pbiA9IDA7CisJdTE2IGlmSWFjY3VIaVRndE1heCA9IDA7CisJdTE2IGRhdGEgPSAwOworCXUxNiBmYXN0Q2xwQ3RybERlbGF5ID0gMDsKKwl1MTYgY2xwQ3RybE1vZGUgPSAwOworCWludCBzdGF0dXMgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKworCS8qIENvbW1vbiBzZXR0aW5ncyAqLworCXNuc1N1bU1heCA9IDEwMjM7CisJaWZJYWNjdUhpVGd0TWluID0gMjA0NzsKKwljbHBDeWNsZW4gPSA1MDA7CisJY2xwU3VtTWF4ID0gMTAyMzsKKworCS8qIEFHQ0luaXQoKSBub3QgYXZhaWxhYmxlIGZvciBEVkJUOyBpbml0IGRvbmUgaW4gbWljcm9jb2RlICovCisJaWYgKCFJc1FBTShzdGF0ZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiAlczogbW9kZSAlZCBpcyBub3QgRFZCLUNcbiIsIF9fZnVuY19fLCBzdGF0ZS0+bV9PcGVyYXRpb25Nb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRklYTUU6IEFuYWxvZyBUViBBR0MgcmVxdWlyZSBkaWZmZXJlbnQgc2V0dGluZ3MgKi8KKworCS8qIFN0YW5kYXJkIHNwZWNpZmljIHNldHRpbmdzICovCisJY2xwU3VtTWluID0gODsKKwljbHBEaXJUbyA9ICh1MTYpIC05OworCWNscEN0cmxNb2RlID0gMDsKKwlzbnNTdW1NaW4gPSA4OworCXNuc0RpclRvID0gKHUxNikgLTk7CisJa2lJbm5lcmdhaW5NaW4gPSAodTE2KSAtMTAzMDsKKwlpZklhY2N1SGlUZ3RNYXggPSAweDIzODA7CisJaWZJYWNjdUhpVGd0ID0gMHgyMzgwOworCWluZ2FpblRndE1pbiA9IDB4MDUxMTsKKwlpbmdhaW5UZ3QgPSAweDA1MTE7CisJaW5nYWluVGd0TWF4ID0gNTExOTsKKwlmYXN0Q2xwQ3RybERlbGF5ID0gc3RhdGUtPm1fcWFtSWZBZ2NDZmcuRmFzdENsaXBDdHJsRGVsYXk7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19GQVNUX0NMUF9DVFJMX0RFTEFZX19BLCBmYXN0Q2xwQ3RybERlbGF5KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NMUF9DVFJMX01PREVfX0EsIGNscEN0cmxNb2RlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19JTkdBSU5fVEdUX19BLCBpbmdhaW5UZ3QpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0lOR0FJTl9UR1RfTUlOX19BLCBpbmdhaW5UZ3RNaW4pOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0lOR0FJTl9UR1RfTUFYX19BLCBpbmdhaW5UZ3RNYXgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0lGX0lBQ0NVX0hJX1RHVF9NSU5fX0EsIGlmSWFjY3VIaVRndE1pbik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfSUZfSUFDQ1VfSElfVEdUX01BWF9fQSwgaWZJYWNjdUhpVGd0TWF4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19JRl9JQUNDVV9ISV9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfSUZfSUFDQ1VfTE9fX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX1JGX0lBQ0NVX0hJX19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19SRl9JQUNDVV9MT19fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ0xQX1NVTV9NQVhfX0EsIGNscFN1bU1heCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfU05TX1NVTV9NQVhfX0EsIHNuc1N1bU1heCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19LSV9JTk5FUkdBSU5fTUlOX19BLCBraUlubmVyZ2Fpbk1pbik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfSUZfSUFDQ1VfSElfVEdUX19BLCBpZklhY2N1SGlUZ3QpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NMUF9DWUNMRU5fX0EsIGNscEN5Y2xlbik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19SRl9TTlNfREVWX01BWF9fQSwgMTAyMyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfUkZfU05TX0RFVl9NSU5fX0EsICh1MTYpIC0xMDIzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19GQVNUX1NOU19DVFJMX0RFTEFZX19BLCA1MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19LSV9NQVhNSU5HQUlOX1RIX19BLCAyMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ0xQX1NVTV9NSU5fX0EsIGNscFN1bU1pbik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfU05TX1NVTV9NSU5fX0EsIHNuc1N1bU1pbik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ0xQX0RJUl9UT19fQSwgY2xwRGlyVG8pOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX1NOU19ESVJfVE9fX0EsIHNuc0RpclRvKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19LSV9NSU5HQUlOX19BLCAweDdmZmYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0tJX01BWEdBSU5fX0EsIDB4MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfS0lfTUlOX19BLCAweDAxMTcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0tJX01BWF9fQSwgMHgwNjU3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19DTFBfU1VNX19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19DTFBfQ1lDQ05UX19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19DTFBfRElSX1dEX19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19DTFBfRElSX1NUUF9fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfU05TX1NVTV9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfU05TX0NZQ0NOVF9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfU05TX0RJUl9XRF9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfU05TX0RJUl9TVFBfX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX1NOU19DWUNMRU5fX0EsIDUwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfS0lfQ1lDTEVOX19BLCA1MDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogSW5pdGlhbGl6ZSBpbm5lci1sb29wIEtJIGdhaW4gZmFjdG9ycyAqLworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0NVX1JBTV9BR0NfS0lfX0EsICZkYXRhKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCWRhdGEgPSAweDA2NTc7CisJZGF0YSAmPSB+U0NVX1JBTV9BR0NfS0lfUkZfX007CisJZGF0YSB8PSAoRFJYS19LSV9SQUdDX1FBTSA8PCBTQ1VfUkFNX0FHQ19LSV9SRl9fQik7CisJZGF0YSAmPSB+U0NVX1JBTV9BR0NfS0lfSUZfX007CisJZGF0YSB8PSAoRFJYS19LSV9JQUdDX1FBTSA8PCBTQ1VfUkFNX0FHQ19LSV9JRl9fQik7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19LSV9fQSwgZGF0YSk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBEVkJUUUFNR2V0QWNjUGt0RXJyKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTE2ICpwYWNrZXRFcnIpCit7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoMSwgIlxuIik7CisJaWYgKHBhY2tldEVyciA9PSBOVUxMKQorCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0ZFQ19BQ0NVTV9QS1RfRkFJTFVSRVNfX0EsIDApOworCWVsc2UKKwkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBTQ1VfUkFNX0ZFQ19BQ0NVTV9QS1RfRkFJTFVSRVNfX0EsIHBhY2tldEVycik7CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgRFZCVFNjQ29tbWFuZChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCQkgdTE2IGNtZCwgdTE2IHN1YmNtZCwKKwkJCSB1MTYgcGFyYW0wLCB1MTYgcGFyYW0xLCB1MTYgcGFyYW0yLAorCQkJIHUxNiBwYXJhbTMsIHUxNiBwYXJhbTQpCit7CisJdTE2IGN1ckNtZCA9IDA7CisJdTE2IGVyckNvZGUgPSAwOworCXUxNiByZXRyeUNudCA9IDA7CisJdTE2IHNjRXhlYyA9IDA7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoMSwgIlxuIik7CisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBPRkRNX1NDX0NPTU1fRVhFQ19fQSwgJnNjRXhlYyk7CisJaWYgKHNjRXhlYyAhPSAxKSB7CisJCS8qIFNDIGlzIG5vdCBydW5uaW5nICovCisJCXN0YXR1cyA9IC1FSU5WQUw7CisJfQorCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogV2FpdCB1bnRpbCBzYyBpcyByZWFkeSB0byByZWNlaXZlIGNvbW1hbmQgKi8KKwlyZXRyeUNudCA9IDA7CisJZG8geworCQltc2xlZXAoMSk7CisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fQ01EX19BLCAmY3VyQ21kKTsKKwkJcmV0cnlDbnQrKzsKKwl9IHdoaWxlICgoY3VyQ21kICE9IDApICYmIChyZXRyeUNudCA8IERSWEtfTUFYX1JFVFJJRVMpKTsKKwlpZiAocmV0cnlDbnQgPj0gRFJYS19NQVhfUkVUUklFUyAmJiAoc3RhdHVzIDwgMCkpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBXcml0ZSBzdWItY29tbWFuZCAqLworCXN3aXRjaCAoY21kKSB7CisJCS8qIEFsbCBjb21tYW5kcyB1c2luZyBzdWItY21kICovCisJY2FzZSBPRkRNX1NDX1JBX1JBTV9DTURfUFJPQ19TVEFSVDoKKwljYXNlIE9GRE1fU0NfUkFfUkFNX0NNRF9TRVRfUFJFRl9QQVJBTToKKwljYXNlIE9GRE1fU0NfUkFfUkFNX0NNRF9QUk9HUkFNX1BBUkFNOgorCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9DTURfQUREUl9fQSwgc3ViY21kKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBEbyBub3RoaW5nICovCisJCWJyZWFrOworCX0KKworCS8qIFdyaXRlIG5lZWRlZCBwYXJhbWV0ZXJzIGFuZCB0aGUgY29tbWFuZCAqLworCXN3aXRjaCAoY21kKSB7CisJCS8qIEFsbCBjb21tYW5kcyB1c2luZyA1IHBhcmFtZXRlcnMgKi8KKwkJLyogQWxsIGNvbW1hbmRzIHVzaW5nIDQgcGFyYW1ldGVycyAqLworCQkvKiBBbGwgY29tbWFuZHMgdXNpbmcgMyBwYXJhbWV0ZXJzICovCisJCS8qIEFsbCBjb21tYW5kcyB1c2luZyAyIHBhcmFtZXRlcnMgKi8KKwljYXNlIE9GRE1fU0NfUkFfUkFNX0NNRF9QUk9DX1NUQVJUOgorCWNhc2UgT0ZETV9TQ19SQV9SQU1fQ01EX1NFVF9QUkVGX1BBUkFNOgorCWNhc2UgT0ZETV9TQ19SQV9SQU1fQ01EX1BST0dSQU1fUEFSQU06CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX1BBUkFNMV9fQSwgcGFyYW0xKTsKKwkJLyogQWxsIGNvbW1hbmRzIHVzaW5nIDEgcGFyYW1ldGVycyAqLworCWNhc2UgT0ZETV9TQ19SQV9SQU1fQ01EX1NFVF9FQ0hPX1RJTUlORzoKKwljYXNlIE9GRE1fU0NfUkFfUkFNX0NNRF9VU0VSX0lPOgorCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9QQVJBTTBfX0EsIHBhcmFtMCk7CisJCS8qIEFsbCBjb21tYW5kcyB1c2luZyAwIHBhcmFtZXRlcnMgKi8KKwljYXNlIE9GRE1fU0NfUkFfUkFNX0NNRF9HRVRfT1BfUEFSQU06CisJY2FzZSBPRkRNX1NDX1JBX1JBTV9DTURfTlVMTDoKKwkJLyogV3JpdGUgY29tbWFuZCAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9DTURfX0EsIGNtZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFVua25vd24gY29tbWFuZCAqLworCQlzdGF0dXMgPSAtRUlOVkFMOworCX0KKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFdhaXQgdW50aWwgc2MgaXMgcmVhZHkgcHJvY2Vzc2luZyBjb21tYW5kICovCisJcmV0cnlDbnQgPSAwOworCWRvIHsKKwkJbXNsZWVwKDEpOworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX0NNRF9fQSwgJmN1ckNtZCk7CisJCXJldHJ5Q250Kys7CisJfSB3aGlsZSAoKGN1ckNtZCAhPSAwKSAmJiAocmV0cnlDbnQgPCBEUlhLX01BWF9SRVRSSUVTKSk7CisJaWYgKHJldHJ5Q250ID49IERSWEtfTUFYX1JFVFJJRVMgJiYgKHN0YXR1cyA8IDApKQorCQlnb3RvIGVycm9yOworCisJLyogQ2hlY2sgZm9yIGlsbGVnYWwgY21kICovCisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9DTURfQUREUl9fQSwgJmVyckNvZGUpOworCWlmIChlcnJDb2RlID09IDB4RkZGRikgeworCQkvKiBpbGxlZ2FsIGNvbW1hbmQgKi8KKwkJc3RhdHVzID0gLUVJTlZBTDsKKwl9CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBSZXRyZWl2ZSByZXN1bHRzIHBhcmFtZXRlcnMgZnJvbSBTQyAqLworCXN3aXRjaCAoY21kKSB7CisJCS8qIEFsbCBjb21tYW5kcyB5aWVsZGluZyA1IHJlc3VsdHMgKi8KKwkJLyogQWxsIGNvbW1hbmRzIHlpZWxkaW5nIDQgcmVzdWx0cyAqLworCQkvKiBBbGwgY29tbWFuZHMgeWllbGRpbmcgMyByZXN1bHRzICovCisJCS8qIEFsbCBjb21tYW5kcyB5aWVsZGluZyAyIHJlc3VsdHMgKi8KKwkJLyogQWxsIGNvbW1hbmRzIHlpZWxkaW5nIDEgcmVzdWx0ICovCisJY2FzZSBPRkRNX1NDX1JBX1JBTV9DTURfVVNFUl9JTzoKKwljYXNlIE9GRE1fU0NfUkFfUkFNX0NNRF9HRVRfT1BfUEFSQU06CisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fUEFSQU0wX19BLCAmKHBhcmFtMCkpOworCQkvKiBBbGwgY29tbWFuZHMgeWllbGRpbmcgMCByZXN1bHRzICovCisJY2FzZSBPRkRNX1NDX1JBX1JBTV9DTURfU0VUX0VDSE9fVElNSU5HOgorCWNhc2UgT0ZETV9TQ19SQV9SQU1fQ01EX1NFVF9USU1FUjoKKwljYXNlIE9GRE1fU0NfUkFfUkFNX0NNRF9QUk9DX1NUQVJUOgorCWNhc2UgT0ZETV9TQ19SQV9SQU1fQ01EX1NFVF9QUkVGX1BBUkFNOgorCWNhc2UgT0ZETV9TQ19SQV9SQU1fQ01EX1BST0dSQU1fUEFSQU06CisJY2FzZSBPRkRNX1NDX1JBX1JBTV9DTURfTlVMTDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogVW5rbm93biBjb21tYW5kICovCisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0JCQkvKiBzd2l0Y2ggKGNtZC0+Y21kKSAqLworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgUG93ZXJVcERWQlQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWVudW0gRFJYUG93ZXJNb2RlIHBvd2VyTW9kZSA9IERSWF9QT1dFUl9VUDsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygxLCAiXG4iKTsKKwlzdGF0dXMgPSBDdHJsUG93ZXJNb2RlKHN0YXRlLCAmcG93ZXJNb2RlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBEVkJUQ3RybFNldEluY0VuYWJsZShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIGJvb2wgKmVuYWJsZWQpCit7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoMSwgIlxuIik7CisJaWYgKCplbmFibGVkID09IHRydWUpCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9CWVBBU1NERVRfX0EsIDApOworCWVsc2UKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX0JZUEFTU0RFVF9fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKKyNkZWZpbmUgREVGQVVMVF9GUl9USFJFU184SyAgICAgNDAwMAorc3RhdGljIGludCBEVkJUQ3RybFNldEZyRW5hYmxlKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgYm9vbCAqZW5hYmxlZCkKK3sKKworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCWlmICgqZW5hYmxlZCA9PSB0cnVlKSB7CisJCS8qIHdyaXRlIG1hc2sgdG8gMSAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9GUl9USFJFU184S19fQSwKKwkJCQkgICBERUZBVUxUX0ZSX1RIUkVTXzhLKTsKKwl9IGVsc2UgeworCQkvKiB3cml0ZSBtYXNrIHRvIDAgKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fRlJfVEhSRVNfOEtfX0EsIDApOworCX0KKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IERWQlRDdHJsU2V0RWNob1RocmVzaG9sZChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCQkJICAgIHN0cnVjdCBEUlhLQ2ZnRHZidEVjaG9UaHJlc190ICplY2hvVGhyZXMpCit7CisJdTE2IGRhdGEgPSAwOworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fRUNIT19USFJFU19fQSwgJmRhdGEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3dpdGNoIChlY2hvVGhyZXMtPmZmdE1vZGUpIHsKKwljYXNlIERSWF9GRlRNT0RFXzJLOgorCQlkYXRhICY9IH5PRkRNX1NDX1JBX1JBTV9FQ0hPX1RIUkVTXzJLX19NOworCQlkYXRhIHw9ICgoZWNob1RocmVzLT50aHJlc2hvbGQgPDwKKwkJCU9GRE1fU0NfUkFfUkFNX0VDSE9fVEhSRVNfMktfX0IpCisJCQkmIChPRkRNX1NDX1JBX1JBTV9FQ0hPX1RIUkVTXzJLX19NKSk7CisJCWJyZWFrOworCWNhc2UgRFJYX0ZGVE1PREVfOEs6CisJCWRhdGEgJj0gfk9GRE1fU0NfUkFfUkFNX0VDSE9fVEhSRVNfOEtfX007CisJCWRhdGEgfD0gKChlY2hvVGhyZXMtPnRocmVzaG9sZCA8PAorCQkJT0ZETV9TQ19SQV9SQU1fRUNIT19USFJFU184S19fQikKKwkJCSYgKE9GRE1fU0NfUkFfUkFNX0VDSE9fVEhSRVNfOEtfX00pKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fRUNIT19USFJFU19fQSwgZGF0YSk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBEVkJUQ3RybFNldFNxaVNwZWVkKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwKKwkJCSAgICAgICBlbnVtIERSWEtDZmdEdmJ0U3FpU3BlZWQgKnNwZWVkKQoreworCWludCBzdGF0dXMgPSAtRUlOVkFMOworCisJZHByaW50aygxLCAiXG4iKTsKKworCXN3aXRjaCAoKnNwZWVkKSB7CisJY2FzZSBEUlhLX0RWQlRfU1FJX1NQRUVEX0ZBU1Q6CisJY2FzZSBEUlhLX0RWQlRfU1FJX1NQRUVEX01FRElVTToKKwljYXNlIERSWEtfRFZCVF9TUUlfU1BFRURfU0xPVzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBlcnJvcjsKKwl9CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9GRUNfUFJFX1JTX0JFUl9GSUxURVJfU0hfX0EsCisJCQkgICAodTE2KSAqc3BlZWQpOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorKiBcYnJpZWYgQWN0aXZhdGUgRFZCVCBzcGVjaWZpYyBwcmVzZXRzCisqIFxwYXJhbSBkZW1vZCBpbnN0YW5jZSBvZiBkZW1vZHVsYXRvci4KKyogXHJldHVybiBEUlhTdGF0dXNfdC4KKyoKKyogQ2FsbGVkIGluIERWQlRTZXRTdGFuZGFyZAorKgorKi8KK3N0YXRpYyBpbnQgRFZCVEFjdGl2YXRlUHJlc2V0cyhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJaW50IHN0YXR1czsKKwlib29sIHNldGluY2VuYWJsZSA9IGZhbHNlOworCWJvb2wgc2V0ZnJlbmFibGUgPSB0cnVlOworCisJc3RydWN0IERSWEtDZmdEdmJ0RWNob1RocmVzX3QgZWNob1RocmVzMmsgPSB7IDAsIERSWF9GRlRNT0RFXzJLIH07CisJc3RydWN0IERSWEtDZmdEdmJ0RWNob1RocmVzX3QgZWNob1RocmVzOGsgPSB7IDAsIERSWF9GRlRNT0RFXzhLIH07CisKKwlkcHJpbnRrKDEsICJcbiIpOworCXN0YXR1cyA9IERWQlRDdHJsU2V0SW5jRW5hYmxlKHN0YXRlLCAmc2V0aW5jZW5hYmxlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSBEVkJUQ3RybFNldEZyRW5hYmxlKHN0YXRlLCAmc2V0ZnJlbmFibGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IERWQlRDdHJsU2V0RWNob1RocmVzaG9sZChzdGF0ZSwgJmVjaG9UaHJlczJrKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSBEVkJUQ3RybFNldEVjaG9UaHJlc2hvbGQoc3RhdGUsICZlY2hvVGhyZXM4ayk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfSU5HQUlOX1RHVF9NQVhfX0EsIHN0YXRlLT5tX2R2YnRJZkFnY0NmZy5JbmdhaW5UZ3RNYXgpOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorKiBcYnJpZWYgSW5pdGlhbGl6ZSBjaGFubmVsc3dpdGNoLWluZGVwZW5kZW50IHNldHRpbmdzIGZvciBEVkJULgorKiBccGFyYW0gZGVtb2QgaW5zdGFuY2Ugb2YgZGVtb2R1bGF0b3IuCisqIFxyZXR1cm4gRFJYU3RhdHVzX3QuCisqCisqIEZvciBST00gY29kZSBjaGFubmVsIGZpbHRlciB0YXBzIGFyZSBsb2FkZWQgZnJvbSB0aGUgYm9vdGxvYWRlci4gRm9yIG1pY3JvY29kZQorKiB0aGUgRFZCLVQgdGFwcyBmcm9tIHRoZSBkcnhrX2ZpbHRlcnMuaCBhcmUgdXNlZC4KKyovCitzdGF0aWMgaW50IFNldERWQlRTdGFuZGFyZChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCQkgICBlbnVtIE9wZXJhdGlvbk1vZGUgb01vZGUpCit7CisJdTE2IGNtZFJlc3VsdCA9IDA7CisJdTE2IGRhdGEgPSAwOworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJUG93ZXJVcERWQlQoc3RhdGUpOworCS8qIGFkZGVkIGFudGVubmEgc3dpdGNoICovCisJU3dpdGNoQW50ZW5uYVRvRFZCVChzdGF0ZSk7CisJLyogc2VuZCBPRkRNIHJlc2V0IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBzY3VfY29tbWFuZChzdGF0ZSwgU0NVX1JBTV9DT01NQU5EX1NUQU5EQVJEX09GRE0gfCBTQ1VfUkFNX0NPTU1BTkRfQ01EX0RFTU9EX1JFU0VULCAwLCBOVUxMLCAxLCAmY21kUmVzdWx0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIHNlbmQgT0ZETSBzZXRlbnYgY29tbWFuZCAqLworCXN0YXR1cyA9IHNjdV9jb21tYW5kKHN0YXRlLCBTQ1VfUkFNX0NPTU1BTkRfU1RBTkRBUkRfT0ZETSB8IFNDVV9SQU1fQ09NTUFORF9DTURfREVNT0RfU0VUX0VOViwgMCwgTlVMTCwgMSwgJmNtZFJlc3VsdCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiByZXNldCBkYXRhcGF0aCBmb3IgT0ZETSwgcHJvY2Vzc29ycyBmaXJzdCAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfQ09NTV9FWEVDX19BLCBPRkRNX1NDX0NPTU1fRVhFQ19TVE9QKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX0xDX0NPTU1fRVhFQ19fQSwgT0ZETV9MQ19DT01NX0VYRUNfU1RPUCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NPTU1fRVhFQ19fQSwgSVFNX0NPTU1fRVhFQ19CX1NUT1ApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogSVFNIHNldHVwICovCisJLyogc3luY2hyb25pemUgb24gb2Zkc3RhdGUtPm1fZmVzdGFydCAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9VUERfU0VMX19BLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwkvKiB3aW5kb3cgc2l6ZSBmb3IgY2xpcHBpbmcgQURDIGRldGVjdGlvbiAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9DTFBfTEVOX19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwkvKiB3aW5kb3cgc2l6ZSBmb3IgZm9yIHNlbnNlIHByZS1TQVcgZGV0ZWN0aW9uICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX1NOU19MRU5fX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCS8qIHNlbnNlIHRocmVzaG9sZCBmb3Igc2Vuc2UgcHJlLVNBVyBkZXRlY3Rpb24gKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfQU1VWF9fQSwgSVFNX0FGX0FNVVhfU0lHTkFMMkFEQyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gU2V0SXFtQWYoc3RhdGUsIHRydWUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX0FHQ19SRl9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBJbXB1bHNlIG5vaXNlIGNydW5jaGVyIHNldHVwICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX0lOQ19MQ1RfX0EsIDApOwkvKiBjcnVuY2ggaW4gSVFNX0NGICovCisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX0RFVF9MQ1RfX0EsIDApOwkvKiBkZXRlY3QgaW4gSVFNX0NGICovCisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX1dORF9MRU5fX0EsIDMpOwkvKiBwZWFrIGRldGVjdG9yIHdpbmRvdyBsZW5ndGggKi8KKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9SQ19TVFJFVENIX19BLCAxNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX09VVF9FTkFfX0EsIDB4NCk7CS8qIGVuYWJsZSBvdXRwdXQgMiAqLworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9EU19FTkFfX0EsIDB4NCk7CS8qIGRlY2ltYXRlIG91dHB1dCAyICovCisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX1NDQUxFX19BLCAxNjAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfU0NBTEVfU0hfX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogdmlydHVhbCBjbGlwcGluZyB0aHJlc2hvbGQgZm9yIGNsaXBwaW5nIEFEQyBkZXRlY3Rpb24gKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfQ0xQX1RIX19BLCA0NDgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9EQVRBVEhfX0EsIDQ5NSk7CS8qIGNydW5jaGluZyB0aHJlc2hvbGQgKi8KKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IEJMQ2hhaW5DbWQoc3RhdGUsIERSWEtfQkxfUk9NX09GRlNFVF9UQVBTX0RWQlQsIERSWEtfQkxDQ19OUl9FTEVNRU5UU19UQVBTLCBEUlhLX0JMQ19USU1FT1VUKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9QS0RUSF9fQSwgMik7CS8qIHBlYWsgZGV0ZWN0b3IgdGhyZXNob2xkICovCisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX1BPV19NRUFTX0xFTl9fQSwgMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJLyogZW5hYmxlIHBvd2VyIG1lYXN1cmVtZW50IGludGVycnVwdCAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9DT01NX0lOVF9NU0tfX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DT01NX0VYRUNfX0EsIElRTV9DT01NX0VYRUNfQl9BQ1RJVkUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogSVFNIHdpbGwgbm90IGJlIHJlc2V0IGZyb20gaGVyZSwgc3luYyBBREMgYW5kIHVwZGF0ZS9pbml0IEFHQyAqLworCXN0YXR1cyA9IEFEQ1N5bmNocm9uaXphdGlvbihzdGF0ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gU2V0UHJlU2F3KHN0YXRlLCAmc3RhdGUtPm1fZHZidFByZVNhd0NmZyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBIYWx0IFNDVSB0byBlbmFibGUgc2FmZSBub24tYXRvbWljIGFjY2Vzc2VzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX0NPTU1fRVhFQ19fQSwgU0NVX0NPTU1fRVhFQ19IT0xEKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IFNldEFnY1JmKHN0YXRlLCAmc3RhdGUtPm1fZHZidFJmQWdjQ2ZnLCB0cnVlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSBTZXRBZ2NJZihzdGF0ZSwgJnN0YXRlLT5tX2R2YnRJZkFnY0NmZywgdHJ1ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBTZXQgTm9pc2UgRXN0aW1hdGlvbiBub3RjaCB3aWR0aCBhbmQgZW5hYmxlIERDIGZpeCAqLworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fQ09ORklHX19BLCAmZGF0YSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJZGF0YSB8PSBPRkRNX1NDX1JBX1JBTV9DT05GSUdfTkVfRklYX0VOQUJMRV9fTTsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9DT05GSUdfX0EsIGRhdGEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogQWN0aXZhdGUgU0NVIHRvIGVuYWJsZSBTQ1UgY29tbWFuZHMgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfQ09NTV9FWEVDX19BLCBTQ1VfQ09NTV9FWEVDX0FDVElWRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoIXN0YXRlLT5tX0RSWEtfQTNfUk9NX0NPREUpIHsKKwkJLyogQUdDSW5pdCgpIGlzIG5vdCBkb25lIGZvciBEVkJULCBzbyBzZXQgYWdjRmFzdENsaXBDdHJsRGVsYXkgICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0ZBU1RfQ0xQX0NUUkxfREVMQVlfX0EsIHN0YXRlLT5tX2R2YnRJZkFnY0NmZy5GYXN0Q2xpcEN0cmxEZWxheSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBPRkRNX1NDIHNldHVwICovCisjaWZkZWYgQ09NUElMRV9GT1JfTk9OUlQKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9CRV9PUFRfREVMQVlfX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX0JFX09QVF9JTklUX0RFTEFZX19BLCAyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKyNlbmRpZgorCisJLyogRkVDIHNldHVwICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX0RJX0lOUFVUX0NUTF9fQSwgMSk7CS8qIE9GRE0gaW5wdXQgKi8KKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCisjaWZkZWYgQ09NUElMRV9GT1JfTk9OUlQKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfUlNfTUVBU1VSRU1FTlRfUEVSSU9EX19BLCAweDQwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisjZWxzZQorCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19SU19NRUFTVVJFTUVOVF9QRVJJT0RfX0EsIDB4MTAwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisjZW5kaWYKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfUlNfTUVBU1VSRU1FTlRfUFJFU0NBTEVfX0EsIDB4MDAwMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBTZXR1cCBNUEVHIGJ1cyAqLworCXN0YXR1cyA9IE1QRUdUU0R0b1NldHVwKHN0YXRlLCBPTV9EVkJUKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwkvKiBTZXQgRFZCVCBQcmVzZXRzICovCisJc3RhdHVzID0gRFZCVEFjdGl2YXRlUHJlc2V0cyhzdGF0ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyoqCisqIFxicmllZiBTdGFydCBkdmJ0IGRlbW9kdWxhdGluZyBmb3IgY2hhbm5lbC4KKyogXHBhcmFtIGRlbW9kIGluc3RhbmNlIG9mIGRlbW9kdWxhdG9yLgorKiBccmV0dXJuIERSWFN0YXR1c190LgorKi8KK3N0YXRpYyBpbnQgRFZCVFN0YXJ0KHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwl1MTYgcGFyYW0xOworCWludCBzdGF0dXM7CisJLyogRFJYS09mZG1TY0NtZF90IHNjQ21kOyAqLworCisJZHByaW50aygxLCAiXG4iKTsKKwkvKiBTdGFydCBjb3JyZWN0IHByb2Nlc3NlcyB0byBnZXQgaW4gbG9jayAqLworCS8qIERSWEs6IE9GRE1fU0NfUkFfUkFNX1BST0NfTE9DS1RSQUNLIGlzIG5vIGxvbmdlciBpbiBtYXBmaWxlISAqLworCXBhcmFtMSA9IE9GRE1fU0NfUkFfUkFNX0xPQ0tUUkFDS19NSU47CisJc3RhdHVzID0gRFZCVFNjQ29tbWFuZChzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fQ01EX1BST0NfU1RBUlQsIDAsIE9GRE1fU0NfUkFfUkFNX1NXX0VWRU5UX1JVTl9OTUFTS19fTSwgcGFyYW0xLCAwLCAwLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwkvKiBTdGFydCBGRUMgT0MgKi8KKwlzdGF0dXMgPSBNUEVHVFNTdGFydChzdGF0ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX0NPTU1fRVhFQ19fQSwgRkVDX0NPTU1fRVhFQ19BQ1RJVkUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisqIFxicmllZiBTZXQgdXAgZHZidCBkZW1vZHVsYXRvciBmb3IgY2hhbm5lbC4KKyogXHBhcmFtIGRlbW9kIGluc3RhbmNlIG9mIGRlbW9kdWxhdG9yLgorKiBccmV0dXJuIERSWFN0YXR1c190LgorKiAvLyBvcmlnaW5hbCBEVkJUU2V0Q2hhbm5lbCgpCisqLworc3RhdGljIGludCBTZXREVkJUKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTE2IEludGVybWVkaWF0ZUZyZXFrSHosCisJCSAgIHMzMiB0dW5lckZyZXFPZmZzZXQpCit7CisJdTE2IGNtZFJlc3VsdCA9IDA7CisJdTE2IHRyYW5zbWlzc2lvblBhcmFtcyA9IDA7CisJdTE2IG9wZXJhdGlvbk1vZGUgPSAwOworCXUzMiBpcW1SY1JhdGVPZnMgPSAwOworCXUzMiBiYW5kd2lkdGggPSAwOworCXUxNiBwYXJhbTE7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoMSwgIklGID0lZCwgVEZPID0gJWRcbiIsIEludGVybWVkaWF0ZUZyZXFrSHosIHR1bmVyRnJlcU9mZnNldCk7CisKKwlzdGF0dXMgPSBzY3VfY29tbWFuZChzdGF0ZSwgU0NVX1JBTV9DT01NQU5EX1NUQU5EQVJEX09GRE0gfCBTQ1VfUkFNX0NPTU1BTkRfQ01EX0RFTU9EX1NUT1AsIDAsIE5VTEwsIDEsICZjbWRSZXN1bHQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogSGFsdCBTQ1UgdG8gZW5hYmxlIHNhZmUgbm9uLWF0b21pYyBhY2Nlc3NlcyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9DT01NX0VYRUNfX0EsIFNDVV9DT01NX0VYRUNfSE9MRCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBTdG9wIHByb2Nlc3NvcnMgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX0NPTU1fRVhFQ19fQSwgT0ZETV9TQ19DT01NX0VYRUNfU1RPUCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9MQ19DT01NX0VYRUNfX0EsIE9GRE1fTENfQ09NTV9FWEVDX1NUT1ApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogTWFuZGF0b3J5IGZpeCwgYWx3YXlzIHN0b3AgQ1AsIHJlcXVpcmVkIHRvIHNldCBzcGwgb2Zmc2V0IGJhY2sgdG8KKwkJaGFyZHdhcmUgZGVmYXVsdCAoaXMgc2V0IHRvIDAgYnkgdWNvZGUgZHVyaW5nIHBpbG90IGRldGVjdGlvbiAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fQ1BfQ09NTV9FWEVDX19BLCBPRkRNX0NQX0NPTU1fRVhFQ19TVE9QKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qPT0gV3JpdGUgY2hhbm5lbCBzZXR0aW5ncyB0byBkZXZpY2UgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwkvKiBtb2RlICovCisJc3dpdGNoIChzdGF0ZS0+cGFyYW0udS5vZmRtLnRyYW5zbWlzc2lvbl9tb2RlKSB7CisJY2FzZSBUUkFOU01JU1NJT05fTU9ERV9BVVRPOgorCWRlZmF1bHQ6CisJCW9wZXJhdGlvbk1vZGUgfD0gT0ZETV9TQ19SQV9SQU1fT1BfQVVUT19NT0RFX19NOworCQkvKiBmYWxsIHRocm91Z2ggLCB0cnkgZmlyc3QgZ3Vlc3MgRFJYX0ZGVE1PREVfOEsgKi8KKwljYXNlIFRSQU5TTUlTU0lPTl9NT0RFXzhLOgorCQl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fTU9ERV84SzsKKwkJYnJlYWs7CisJY2FzZSBUUkFOU01JU1NJT05fTU9ERV8ySzoKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX01PREVfMks7CisJCWJyZWFrOworCX0KKworCS8qIGd1YXJkICovCisJc3dpdGNoIChzdGF0ZS0+cGFyYW0udS5vZmRtLmd1YXJkX2ludGVydmFsKSB7CisJZGVmYXVsdDoKKwljYXNlIEdVQVJEX0lOVEVSVkFMX0FVVE86CisJCW9wZXJhdGlvbk1vZGUgfD0gT0ZETV9TQ19SQV9SQU1fT1BfQVVUT19HVUFSRF9fTTsKKwkJLyogZmFsbCB0aHJvdWdoICwgdHJ5IGZpcnN0IGd1ZXNzIERSWF9HVUFSRF8xRElWNCAqLworCWNhc2UgR1VBUkRfSU5URVJWQUxfMV80OgorCQl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fR1VBUkRfNDsKKwkJYnJlYWs7CisJY2FzZSBHVUFSRF9JTlRFUlZBTF8xXzMyOgorCQl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fR1VBUkRfMzI7CisJCWJyZWFrOworCWNhc2UgR1VBUkRfSU5URVJWQUxfMV8xNjoKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0dVQVJEXzE2OworCQlicmVhazsKKwljYXNlIEdVQVJEX0lOVEVSVkFMXzFfODoKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0dVQVJEXzg7CisJCWJyZWFrOworCX0KKworCS8qIGhpZXJhcmNoeSAqLworCXN3aXRjaCAoc3RhdGUtPnBhcmFtLnUub2ZkbS5oaWVyYXJjaHlfaW5mb3JtYXRpb24pIHsKKwljYXNlIEhJRVJBUkNIWV9BVVRPOgorCWNhc2UgSElFUkFSQ0hZX05PTkU6CisJZGVmYXVsdDoKKwkJb3BlcmF0aW9uTW9kZSB8PSBPRkRNX1NDX1JBX1JBTV9PUF9BVVRPX0hJRVJfX007CisJCS8qIGZhbGwgdGhyb3VnaCAsIHRyeSBmaXJzdCBndWVzcyBTQ19SQV9SQU1fT1BfUEFSQU1fSElFUl9OTyAqLworCQkvKiB0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fSElFUl9OTzsgKi8KKwkJLyogYnJlYWs7ICovCisJY2FzZSBISUVSQVJDSFlfMToKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0hJRVJfQTE7CisJCWJyZWFrOworCWNhc2UgSElFUkFSQ0hZXzI6CisJCXRyYW5zbWlzc2lvblBhcmFtcyB8PSBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9ISUVSX0EyOworCQlicmVhazsKKwljYXNlIEhJRVJBUkNIWV80OgorCQl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fSElFUl9BNDsKKwkJYnJlYWs7CisJfQorCisKKwkvKiBjb25zdGVsbGF0aW9uICovCisJc3dpdGNoIChzdGF0ZS0+cGFyYW0udS5vZmRtLmNvbnN0ZWxsYXRpb24pIHsKKwljYXNlIFFBTV9BVVRPOgorCWRlZmF1bHQ6CisJCW9wZXJhdGlvbk1vZGUgfD0gT0ZETV9TQ19SQV9SQU1fT1BfQVVUT19DT05TVF9fTTsKKwkJLyogZmFsbCB0aHJvdWdoICwgdHJ5IGZpcnN0IGd1ZXNzIERSWF9DT05TVEVMTEFUSU9OX1FBTTY0ICovCisJY2FzZSBRQU1fNjQ6CisJCXRyYW5zbWlzc2lvblBhcmFtcyB8PSBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9DT05TVF9RQU02NDsKKwkJYnJlYWs7CisJY2FzZSBRUFNLOgorCQl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fQ09OU1RfUVBTSzsKKwkJYnJlYWs7CisJY2FzZSBRQU1fMTY6CisJCXRyYW5zbWlzc2lvblBhcmFtcyB8PSBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9DT05TVF9RQU0xNjsKKwkJYnJlYWs7CisJfQorI2lmIDAKKwkvKiBObyBoaWVyYWNoaWNhbCBjaGFubmVscyBzdXBwb3J0IGluIEJEQSAqLworCS8qIFByaW9yaXR5IChvbmx5IGZvciBoaWVyYXJjaGljYWwgY2hhbm5lbHMpICovCisJc3dpdGNoIChjaGFubmVsLT5wcmlvcml0eSkgeworCWNhc2UgRFJYX1BSSU9SSVRZX0xPVzoKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX1BSSU9fTE87CisJCVdSMTYoZGV2QWRkciwgT0ZETV9FQ19TQl9QUklPUl9fQSwKKwkJCU9GRE1fRUNfU0JfUFJJT1JfTE8pOworCQlicmVhazsKKwljYXNlIERSWF9QUklPUklUWV9ISUdIOgorCQl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fUFJJT19ISTsKKwkJV1IxNihkZXZBZGRyLCBPRkRNX0VDX1NCX1BSSU9SX19BLAorCQkJT0ZETV9FQ19TQl9QUklPUl9ISSkpOworCQlicmVhazsKKwljYXNlIERSWF9QUklPUklUWV9VTktOT1dOOgkvKiBmYWxsIHRocm91Z2ggKi8KKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKyNlbHNlCisJLyogU2V0IFByaW9ydHkgaGlnaCAqLworCXRyYW5zbWlzc2lvblBhcmFtcyB8PSBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9QUklPX0hJOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fRUNfU0JfUFJJT1JfX0EsIE9GRE1fRUNfU0JfUFJJT1JfSEkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworI2VuZGlmCisKKwkvKiBjb2RlcmF0ZSAqLworCXN3aXRjaCAoc3RhdGUtPnBhcmFtLnUub2ZkbS5jb2RlX3JhdGVfSFApIHsKKwljYXNlIEZFQ19BVVRPOgorCWRlZmF1bHQ6CisJCW9wZXJhdGlvbk1vZGUgfD0gT0ZETV9TQ19SQV9SQU1fT1BfQVVUT19SQVRFX19NOworCQkvKiBmYWxsIHRocm91Z2ggLCB0cnkgZmlyc3QgZ3Vlc3MgRFJYX0NPREVSQVRFXzJESVYzICovCisJY2FzZSBGRUNfMl8zOgorCQl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fUkFURV8yXzM7CisJCWJyZWFrOworCWNhc2UgRkVDXzFfMjoKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX1JBVEVfMV8yOworCQlicmVhazsKKwljYXNlIEZFQ18zXzQ6CisJCXRyYW5zbWlzc2lvblBhcmFtcyB8PSBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9SQVRFXzNfNDsKKwkJYnJlYWs7CisJY2FzZSBGRUNfNV82OgorCQl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fUkFURV81XzY7CisJCWJyZWFrOworCWNhc2UgRkVDXzdfODoKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX1JBVEVfN184OworCQlicmVhazsKKwl9CisKKwkvKiBTQVcgZmlsdGVyIHNlbGVjdGlvbjogbm9ybWFseSBub3QgbmVjZXNhcnJ5LCBidXQgaWYgd2FudGVkCisJCXRoZSBhcHBsaWNhdGlvbiBjYW4gc2VsZWN0IGEgU0FXIGZpbHRlciB2aWEgdGhlIGRyaXZlciBieSB1c2luZyBVSU9zICovCisJLyogRmlyc3QgZGV0ZXJtaW5lIHJlYWwgYmFuZHdpZHRoIChIeikgKi8KKwkvKiBBbHNvIHNldCBkZWxheSBmb3IgaW1wdWxzZSBub2lzZSBjcnVuY2hlciAqLworCS8qIEFsc28gc2V0IHBhcmFtZXRlcnMgZm9yIEVDX09DIGZpeCwgbm90ZSBFQ19PQ19SRUdfVE1EX0hJTF9NQVIgaXMgY2hhbmdlZAorCQlieSBTQyBmb3IgZml4IGZvciBzb21lIDhLLDEvOCBndWFyZCBidXQgaXMgcmVzdG9yZWQgYnkgSW5pdEVDIGFuZCBSZXNldEVDCisJCWZ1bmN0aW9ucyAqLworCXN3aXRjaCAoc3RhdGUtPnBhcmFtLnUub2ZkbS5iYW5kd2lkdGgpIHsKKwljYXNlIEJBTkRXSURUSF9BVVRPOgorCWNhc2UgQkFORFdJRFRIXzhfTUhaOgorCQliYW5kd2lkdGggPSBEUlhLX0JBTkRXSURUSF84TUhaX0lOX0haOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9TUk1NX0ZJWF9GQUNUXzhLX19BLCAzMDUyKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQkvKiBjb2NoYW5uZWwgcHJvdGVjdGlvbiBmb3IgUEFMIDggTUh6ICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfOEtfUEVSX0xFRlRfX0EsIDcpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfOEtfUEVSX1JJR0hUX19BLCA3KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9OSV9JTklUXzJLX1BFUl9MRUZUX19BLCA3KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9OSV9JTklUXzJLX1BFUl9SSUdIVF9fQSwgMSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJYnJlYWs7CisJY2FzZSBCQU5EV0lEVEhfN19NSFo6CisJCWJhbmR3aWR0aCA9IERSWEtfQkFORFdJRFRIXzdNSFpfSU5fSFo7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX1NSTU1fRklYX0ZBQ1RfOEtfX0EsIDM0OTEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCS8qIGNvY2hhbm5lbCBwcm90ZWN0aW9uIGZvciBQQUwgNyBNSHogKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fTklfSU5JVF84S19QRVJfTEVGVF9fQSwgOCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fTklfSU5JVF84S19QRVJfUklHSFRfX0EsIDgpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfMktfUEVSX0xFRlRfX0EsIDQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfMktfUEVSX1JJR0hUX19BLCAxKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlicmVhazsKKwljYXNlIEJBTkRXSURUSF82X01IWjoKKwkJYmFuZHdpZHRoID0gRFJYS19CQU5EV0lEVEhfNk1IWl9JTl9IWjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fU1JNTV9GSVhfRkFDVF84S19fQSwgNDA3Myk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJLyogY29jaGFubmVsIHByb3RlY3Rpb24gZm9yIE5UU0MgNiBNSHogKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fTklfSU5JVF84S19QRVJfTEVGVF9fQSwgMTkpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfOEtfUEVSX1JJR0hUX19BLCAxOSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fTklfSU5JVF8yS19QRVJfTEVGVF9fQSwgMTQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfMktfUEVSX1JJR0hUX19BLCAxKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChpcW1SY1JhdGVPZnMgPT0gMCkgeworCQkvKiBOb3cgY29tcHV0ZSBJUU1fUkNfUkFURV9PRlMKKwkJCSgoKFN5c0ZyZXEvQmFuZFdpZHRoKS8yKS8yKSAtMSkgKiAyXjIzKQorCQkJPT4KKwkJCSgoU3lzRnJlcSAvIEJhbmRXaWR0aCkgKiAoMl4yMSkpIC0gKDJeMjMpCisJCQkqLworCQkvKiAoU3lzRnJlcSAvIEJhbmRXaWR0aCkgKiAoMl4yOCkgICovCisJCS8qIGFzc2VydCAoTUFYKHN5c0NsaykvTUlOKGJhbmR3aWR0aCkgPCAxNikKKwkJCT0+IGFzc2VydChNQVgoc3lzQ2xrKSA8IDE2Kk1JTihiYW5kd2lkdGgpKQorCQkJPT4gYXNzZXJ0KDEwOTcxNDI3MiA+IDQ4MDAwMDAwKSA9IHRydWUgc28gRnJhYyAyOCBjYW4gYmUgdXNlZCAgKi8KKwkJaXFtUmNSYXRlT2ZzID0gRnJhYzI4YSgodTMyKQorCQkJCQkoKHN0YXRlLT5tX3N5c0Nsb2NrRnJlcSAqCisJCQkJCQkxMDAwKSAvIDMpLCBiYW5kd2lkdGgpOworCQkvKiAoU3lzRnJlcSAvIEJhbmRXaWR0aCkgKiAoMl4yMSksIHJvdW5kaW5nIGJlZm9yZSB0cnVuY2F0aW5nICAqLworCQlpZiAoKGlxbVJjUmF0ZU9mcyAmIDB4N2ZMKSA+PSAweDQwKQorCQkJaXFtUmNSYXRlT2ZzICs9IDB4ODBMOworCQlpcW1SY1JhdGVPZnMgPSBpcW1SY1JhdGVPZnMgPj4gNzsKKwkJLyogKChTeXNGcmVxIC8gQmFuZFdpZHRoKSAqICgyXjIxKSkgLSAoMl4yMykgICovCisJCWlxbVJjUmF0ZU9mcyA9IGlxbVJjUmF0ZU9mcyAtICgxIDw8IDIzKTsKKwl9CisKKwlpcW1SY1JhdGVPZnMgJj0KKwkJKCgoKHUzMikgSVFNX1JDX1JBVEVfT0ZTX0hJX19NKSA8PAorCQlJUU1fUkNfUkFURV9PRlNfTE9fX1cpIHwgSVFNX1JDX1JBVEVfT0ZTX0xPX19NKTsKKwlzdGF0dXMgPSB3cml0ZTMyKHN0YXRlLCBJUU1fUkNfUkFURV9PRlNfTE9fX0EsIGlxbVJjUmF0ZU9mcyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBCYW5kd2lkdGggc2V0dGluZyBkb25lICovCisKKyNpZiAwCisJc3RhdHVzID0gRFZCVFNldEZyZXF1ZW5jeVNoaWZ0KGRlbW9kLCBjaGFubmVsLCB0dW5lck9mZnNldCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisjZW5kaWYKKwlzdGF0dXMgPSBTZXRGcmVxdWVuY3lTaGlmdGVyKHN0YXRlLCBJbnRlcm1lZGlhdGVGcmVxa0h6LCB0dW5lckZyZXFPZmZzZXQsIHRydWUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyo9PSBTdGFydCBTQywgd3JpdGUgY2hhbm5lbCBzZXR0aW5ncyB0byBTQyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCS8qIEFjdGl2YXRlIFNDVSB0byBlbmFibGUgU0NVIGNvbW1hbmRzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX0NPTU1fRVhFQ19fQSwgU0NVX0NPTU1fRVhFQ19BQ1RJVkUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogRW5hYmxlIFNDIGFmdGVyIHNldHRpbmcgYWxsIG90aGVyIHBhcmFtZXRlcnMgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX0NPTU1fU1RBVEVfX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfQ09NTV9FWEVDX19BLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCisJc3RhdHVzID0gc2N1X2NvbW1hbmQoc3RhdGUsIFNDVV9SQU1fQ09NTUFORF9TVEFOREFSRF9PRkRNIHwgU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9TVEFSVCwgMCwgTlVMTCwgMSwgJmNtZFJlc3VsdCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBXcml0ZSBTQyBwYXJhbWV0ZXIgcmVnaXN0ZXJzLCBzZXQgYWxsIEFVVE8gZmxhZ3MgaW4gb3BlcmF0aW9uIG1vZGUgKi8KKwlwYXJhbTEgPSAoT0ZETV9TQ19SQV9SQU1fT1BfQVVUT19NT0RFX19NIHwKKwkJCU9GRE1fU0NfUkFfUkFNX09QX0FVVE9fR1VBUkRfX00gfAorCQkJT0ZETV9TQ19SQV9SQU1fT1BfQVVUT19DT05TVF9fTSB8CisJCQlPRkRNX1NDX1JBX1JBTV9PUF9BVVRPX0hJRVJfX00gfAorCQkJT0ZETV9TQ19SQV9SQU1fT1BfQVVUT19SQVRFX19NKTsKKwlzdGF0dXMgPSBEVkJUU2NDb21tYW5kKHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9DTURfU0VUX1BSRUZfUEFSQU0sCisJCQkJMCwgdHJhbnNtaXNzaW9uUGFyYW1zLCBwYXJhbTEsIDAsIDAsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJaWYgKCFzdGF0ZS0+bV9EUlhLX0EzX1JPTV9DT0RFKQorCQlzdGF0dXMgPSBEVkJUQ3RybFNldFNxaVNwZWVkKHN0YXRlLCAmc3RhdGUtPm1fc3FpU3BlZWQpOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyogXGJyaWVmIFJldHJlaXZlIGxvY2sgc3RhdHVzIC4KKyogXHBhcmFtIGRlbW9kICAgIFBvaW50ZXIgdG8gZGVtb2R1bGF0b3IgaW5zdGFuY2UuCisqIFxwYXJhbSBsb2NrU3RhdCBQb2ludGVyIHRvIGxvY2sgc3RhdHVzIHN0cnVjdHVyZS4KKyogXHJldHVybiBEUlhTdGF0dXNfdC4KKyoKKyovCitzdGF0aWMgaW50IEdldERWQlRMb2NrU3RhdHVzKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTMyICpwTG9ja1N0YXR1cykKK3sKKwlpbnQgc3RhdHVzOworCWNvbnN0IHUxNiBtcGVnX2xvY2tfbWFzayA9IChPRkRNX1NDX1JBX1JBTV9MT0NLX01QRUdfX00gfAorCQkJCSAgICBPRkRNX1NDX1JBX1JBTV9MT0NLX0ZFQ19fTSk7CisJY29uc3QgdTE2IGZlY19sb2NrX21hc2sgPSAoT0ZETV9TQ19SQV9SQU1fTE9DS19GRUNfX00pOworCWNvbnN0IHUxNiBkZW1vZF9sb2NrX21hc2sgPSBPRkRNX1NDX1JBX1JBTV9MT0NLX0RFTU9EX19NOworCisJdTE2IFNjUmFSYW1Mb2NrID0gMDsKKwl1MTYgU2NDb21tRXhlYyA9IDA7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJKnBMb2NrU3RhdHVzID0gTk9UX0xPQ0tFRDsKKwkvKiBkcml2ZXIgMC45LjAgKi8KKwkvKiBDaGVjayBpZiBTQyBpcyBydW5uaW5nICovCisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBPRkRNX1NDX0NPTU1fRVhFQ19fQSwgJlNjQ29tbUV4ZWMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVuZDsKKwlpZiAoU2NDb21tRXhlYyA9PSBPRkRNX1NDX0NPTU1fRVhFQ19TVE9QKQorCQlnb3RvIGVuZDsKKworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fTE9DS19fQSwgJlNjUmFSYW1Mb2NrKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlbmQ7CisKKwlpZiAoKFNjUmFSYW1Mb2NrICYgbXBlZ19sb2NrX21hc2spID09IG1wZWdfbG9ja19tYXNrKQorCQkqcExvY2tTdGF0dXMgPSBNUEVHX0xPQ0s7CisJZWxzZSBpZiAoKFNjUmFSYW1Mb2NrICYgZmVjX2xvY2tfbWFzaykgPT0gZmVjX2xvY2tfbWFzaykKKwkJKnBMb2NrU3RhdHVzID0gRkVDX0xPQ0s7CisJZWxzZSBpZiAoKFNjUmFSYW1Mb2NrICYgZGVtb2RfbG9ja19tYXNrKSA9PSBkZW1vZF9sb2NrX21hc2spCisJCSpwTG9ja1N0YXR1cyA9IERFTU9EX0xPQ0s7CisJZWxzZSBpZiAoU2NSYVJhbUxvY2sgJiBPRkRNX1NDX1JBX1JBTV9MT0NLX05PRFZCVF9fTSkKKwkJKnBMb2NrU3RhdHVzID0gTkVWRVJfTE9DSzsKK2VuZDoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFBvd2VyVXBRQU0oc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWVudW0gRFJYUG93ZXJNb2RlIHBvd2VyTW9kZSA9IERSWEtfUE9XRVJfRE9XTl9PRkRNOworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCXN0YXR1cyA9IEN0cmxQb3dlck1vZGUoc3RhdGUsICZwb3dlck1vZGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoqIFBvd2VyIERvd24gUUFNICovCitzdGF0aWMgaW50IFBvd2VyRG93blFBTShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJdTE2IGRhdGEgPSAwOworCXUxNiBjbWRSZXN1bHQ7CisJaW50IHN0YXR1cyA9IDA7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0NVX0NPTU1fRVhFQ19fQSwgJmRhdGEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCWlmIChkYXRhID09IFNDVV9DT01NX0VYRUNfQUNUSVZFKSB7CisJCS8qCisJCQlTVE9QIGRlbW9kdWxhdG9yCisJCQlRQU0gYW5kIEhXIGJsb2NrcworCQkJKi8KKwkJLyogc3RvcCBhbGwgY29tc3RhdGUtPm1fZXhlYyAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fQ09NTV9FWEVDX19BLCBRQU1fQ09NTV9FWEVDX1NUT1ApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHNjdV9jb21tYW5kKHN0YXRlLCBTQ1VfUkFNX0NPTU1BTkRfU1RBTkRBUkRfUUFNIHwgU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9TVE9QLCAwLCBOVUxMLCAxLCAmY21kUmVzdWx0KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCX0KKwkvKiBwb3dlcmRvd24gQUZFICAgICAgICAgICAgICAgICAgICovCisJc3RhdHVzID0gU2V0SXFtQWYoc3RhdGUsIGZhbHNlKTsKKworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisqIFxicmllZiBTZXR1cCBvZiB0aGUgUUFNIE1lYXN1cmVtZW50IGludGVydmFscyBmb3Igc2lnbmFsIHF1YWxpdHkKKyogXHBhcmFtIGRlbW9kIGluc3RhbmNlIG9mIGRlbW9kLgorKiBccGFyYW0gY29uc3RlbGxhdGlvbiBjdXJyZW50IGNvbnN0ZWxsYXRpb24uCisqIFxyZXR1cm4gRFJYU3RhdHVzX3QuCisqCisqICBOT1RFOgorKiAgVGFrZSBpbnRvIGFjY291bnQgdGhhdCBmb3IgY2VydGFpbiBzZXR0aW5ncyB0aGUgZXJyb3Jjb3VudGVycyBjYW4gb3ZlcmZsb3cuCisqICBUaGUgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgY2hlY2sgdGhpcy4KKyoKKyovCitzdGF0aWMgaW50IFNldFFBTU1lYXN1cmVtZW50KHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwKKwkJCSAgICAgZW51bSBFRHJ4a0NvbnN0ZWxsYXRpb24gY29uc3RlbGxhdGlvbiwKKwkJCSAgICAgdTMyIHN5bWJvbFJhdGUpCit7CisJdTMyIGZlY0JpdHNEZXNpcmVkID0gMDsJLyogQkVSIGFjY291bnRpbmcgcGVyaW9kICovCisJdTMyIGZlY1JzUGVyaW9kVG90YWwgPSAwOwkvKiBUb3RhbCBwZXJpb2QgKi8KKwl1MTYgZmVjUnNQcmVzY2FsZSA9IDA7CS8qIFJlZWRTb2xvbW9uIE1lYXN1cmVtZW50IFByZXNjYWxlICovCisJdTE2IGZlY1JzUGVyaW9kID0gMDsJLyogVmFsdWUgZm9yIGNvcnJlc3BvbmRpbmcgSTJDIHJlZ2lzdGVyICovCisJaW50IHN0YXR1cyA9IDA7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJZmVjUnNQcmVzY2FsZSA9IDE7CisJLyogZmVjQml0c0Rlc2lyZWQgPSBzeW1ib2xSYXRlIFtrSHpdICoKKwkJRnJhbWVMZW5naHQgW21zXSAqCisJCShjb25zdGVsbGF0aW9uICsgMSkgKgorCQlTeW5jTG9zcyAoPT0gMSkgKgorCQlWaXRlcmJpTG9zcyAoPT0xKQorCQkqLworCXN3aXRjaCAoY29uc3RlbGxhdGlvbikgeworCWNhc2UgRFJYX0NPTlNURUxMQVRJT05fUUFNMTY6CisJCWZlY0JpdHNEZXNpcmVkID0gNCAqIHN5bWJvbFJhdGU7CisJCWJyZWFrOworCWNhc2UgRFJYX0NPTlNURUxMQVRJT05fUUFNMzI6CisJCWZlY0JpdHNEZXNpcmVkID0gNSAqIHN5bWJvbFJhdGU7CisJCWJyZWFrOworCWNhc2UgRFJYX0NPTlNURUxMQVRJT05fUUFNNjQ6CisJCWZlY0JpdHNEZXNpcmVkID0gNiAqIHN5bWJvbFJhdGU7CisJCWJyZWFrOworCWNhc2UgRFJYX0NPTlNURUxMQVRJT05fUUFNMTI4OgorCQlmZWNCaXRzRGVzaXJlZCA9IDcgKiBzeW1ib2xSYXRlOworCQlicmVhazsKKwljYXNlIERSWF9DT05TVEVMTEFUSU9OX1FBTTI1NjoKKwkJZmVjQml0c0Rlc2lyZWQgPSA4ICogc3ltYm9sUmF0ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwl9CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlmZWNCaXRzRGVzaXJlZCAvPSAxMDAwOwkvKiBzeW1ib2xSYXRlIFtIel0gLT4gc3ltYm9sUmF0ZSBba0h6XSAgKi8KKwlmZWNCaXRzRGVzaXJlZCAqPSA1MDA7CS8qIG1lYXMuIHBlcmlvZCBbbXNdICovCisKKwkvKiBBbm5leCBBL0M6IGJpdHMvUnNQZXJpb2QgPSAyMDQgKiA4ID0gMTYzMiAqLworCS8qIGZlY1JzUGVyaW9kVG90YWwgPSBmZWNCaXRzRGVzaXJlZCAvIDE2MzIgKi8KKwlmZWNSc1BlcmlvZFRvdGFsID0gKGZlY0JpdHNEZXNpcmVkIC8gMTYzMlVMKSArIDE7CS8qIHJvdWdobHkgY2VpbCAqLworCisJLyogZmVjUnNQZXJpb2RUb3RhbCA9ICBmZWNSc1ByZXNjYWxlICogZmVjUnNQZXJpb2QgICovCisJZmVjUnNQcmVzY2FsZSA9IDEgKyAodTE2KSAoZmVjUnNQZXJpb2RUb3RhbCA+PiAxNik7CisJaWYgKGZlY1JzUHJlc2NhbGUgPT0gMCkgeworCQkvKiBEaXZpZGUgYnkgemVybyAodGhvdWdoIGltcG9zc2libGUpICovCisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9CisJZmVjUnNQZXJpb2QgPQorCQkoKHUxNikgZmVjUnNQZXJpb2RUb3RhbCArCisJCShmZWNSc1ByZXNjYWxlID4+IDEpKSAvIGZlY1JzUHJlc2NhbGU7CisKKwkvKiB3cml0ZSBjb3JyZXNwb25kaW5nIHJlZ2lzdGVycyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19SU19NRUFTVVJFTUVOVF9QRVJJT0RfX0EsIGZlY1JzUGVyaW9kKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfUlNfTUVBU1VSRU1FTlRfUFJFU0NBTEVfX0EsIGZlY1JzUHJlc2NhbGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19TTkNfRkFJTF9QRVJJT0RfX0EsIGZlY1JzUGVyaW9kKTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFNldFFBTTE2KHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisJLyogUUFNIEVxdWFsaXplciBTZXR1cCAqLworCS8qIEVxdWFsaXplciAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQwX19BLCAxMzUxNyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDFfX0EsIDEzNTE3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEMl9fQSwgMTM1MTcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQzX19BLCAxMzUxNyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDRfX0EsIDEzNTE3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFENV9fQSwgMTM1MTcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCS8qIERlY2lzaW9uIEZlZWRiYWNrIEVxdWFsaXplciAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjBfX0EsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjFfX0EsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjJfX0EsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjNfX0EsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjRfX0EsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjVfX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX1NZX1NZTkNfSFdNX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fU1lfU1lOQ19BV01fX0EsIDQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9TWV9TWU5DX0xXTV9fQSwgMyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBRQU0gU2xpY2VyIFNldHRpbmdzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fU0xfU0lHX1BPV0VSX19BLCBEUlhLX1FBTV9TTF9TSUdfUE9XRVJfUUFNMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogUUFNIExvb3AgQ29udHJvbGxlciBDb2VmaWNpZW50cyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NBX0ZJTkVfX0EsIDE1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DQV9DT0FSU0VfX0EsIDQwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FUF9GSU5FX19BLCAxMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRVBfTUVESVVNX19BLCAyNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRVBfQ09BUlNFX19BLCAyNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRUlfRklORV9fQSwgMTIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VJX01FRElVTV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VJX0NPQVJTRV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfRklORV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfTUVESVVNX19BLCAyMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfQ09BUlNFX19BLCA4MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfRklORV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfTUVESVVNX19BLCAyMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfQ09BUlNFX19BLCA1MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0ZfRklORV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGX01FRElVTV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGX0NPQVJTRV9fQSwgMzIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGMV9GSU5FX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRjFfTUVESVVNX19BLCAxMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0YxX0NPQVJTRV9fQSwgMTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisKKwkvKiBRQU0gU3RhdGUgTWFjaGluZSAoRlNNKSBUaHJlc2hvbGRzICovCisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUlRIX19BLCAxNDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9GVEhfX0EsIDUwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fQ1RIX19BLCA5NSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1BUSF9fQSwgMTIwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUVRIX19BLCAyMzApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9NVEhfX0EsIDEwNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUkFURV9MSU1fX0EsIDQwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fQ09VTlRfTElNX19BLCA0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fRlJFUV9MSU1fX0EsIDI0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCisJLyogUUFNIEZTTSBUcmFja2luZyBQYXJhbWV0ZXJzICovCisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTUVESUFOX0FWX01VTFRfX0EsICh1MTYpIDE2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUkFESVVTX0FWX0xJTUlUX19BLCAodTE2KSAyMjApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQxX19BLCAodTE2KSAyNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDJfX0EsICh1MTYpIDYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQzX19BLCAodTE2KSAtMjQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQ0X19BLCAodTE2KSAtNjUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQ1X19BLCAodTE2KSAtMTI3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorKiBcYnJpZWYgUUFNMzIgc3BlY2lmaWMgc2V0dXAKKyogXHBhcmFtIGRlbW9kIGluc3RhbmNlIG9mIGRlbW9kLgorKiBccmV0dXJuIERSWFN0YXR1c190LgorKi8KK3N0YXRpYyBpbnQgU2V0UUFNMzIoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXMgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKworCS8qIFFBTSBFcXVhbGl6ZXIgU2V0dXAgKi8KKwkvKiBFcXVhbGl6ZXIgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEMF9fQSwgNjcwNyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDFfX0EsIDY3MDcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQyX19BLCA2NzA3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEM19fQSwgNjcwNyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDRfX0EsIDY3MDcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQ1X19BLCA2NzA3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIERlY2lzaW9uIEZlZWRiYWNrIEVxdWFsaXplciAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjBfX0EsIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjFfX0EsIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjJfX0EsIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjNfX0EsIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjRfX0EsIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjVfX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX1NZX1NZTkNfSFdNX19BLCA2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fU1lfU1lOQ19BV01fX0EsIDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9TWV9TWU5DX0xXTV9fQSwgMyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBRQU0gU2xpY2VyIFNldHRpbmdzICovCisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9TTF9TSUdfUE9XRVJfX0EsIERSWEtfUUFNX1NMX1NJR19QT1dFUl9RQU0zMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKworCS8qIFFBTSBMb29wIENvbnRyb2xsZXIgQ29lZmljaWVudHMgKi8KKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NBX0ZJTkVfX0EsIDE1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DQV9DT0FSU0VfX0EsIDQwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FUF9GSU5FX19BLCAxMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRVBfTUVESVVNX19BLCAyNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRVBfQ09BUlNFX19BLCAyNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRUlfRklORV9fQSwgMTIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VJX01FRElVTV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VJX0NPQVJTRV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfRklORV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfTUVESVVNX19BLCAyMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfQ09BUlNFX19BLCA4MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfRklORV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfTUVESVVNX19BLCAyMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfQ09BUlNFX19BLCA1MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0ZfRklORV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGX01FRElVTV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGX0NPQVJTRV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGMV9GSU5FX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRjFfTUVESVVNX19BLCAxMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0YxX0NPQVJTRV9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKworCS8qIFFBTSBTdGF0ZSBNYWNoaW5lIChGU00pIFRocmVzaG9sZHMgKi8KKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9SVEhfX0EsIDkwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fRlRIX19BLCA1MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0NUSF9fQSwgODApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9QVEhfX0EsIDEwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1FUSF9fQSwgMTcwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTVRIX19BLCAxMDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1JBVEVfTElNX19BLCA0MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0NPVU5UX0xJTV9fQSwgNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0ZSRVFfTElNX19BLCAxMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKworCS8qIFFBTSBGU00gVHJhY2tpbmcgUGFyYW1ldGVycyAqLworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX01FRElBTl9BVl9NVUxUX19BLCAodTE2KSAxMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1JBRElVU19BVl9MSU1JVF9fQSwgKHUxNikgMTQwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUMV9fQSwgKHUxNikgLTgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQyX19BLCAodTE2KSAtMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQzX19BLCAodTE2KSAtMjYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQ0X19BLCAodTE2KSAtNTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQ1X19BLCAodTE2KSAtODYpOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorKiBcYnJpZWYgUUFNNjQgc3BlY2lmaWMgc2V0dXAKKyogXHBhcmFtIGRlbW9kIGluc3RhbmNlIG9mIGRlbW9kLgorKiBccmV0dXJuIERSWFN0YXR1c190LgorKi8KK3N0YXRpYyBpbnQgU2V0UUFNNjQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXMgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKwkvKiBRQU0gRXF1YWxpemVyIFNldHVwICovCisJLyogRXF1YWxpemVyICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDBfX0EsIDEzMzM2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEMV9fQSwgMTI2MTgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQyX19BLCAxMTk4OCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDNfX0EsIDEzODA5KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFENF9fQSwgMTM4MDkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQ1X19BLCAxNTYwOSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBEZWNpc2lvbiBGZWVkYmFjayBFcXVhbGl6ZXIgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4wX19BLCA0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4xX19BLCA0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4yX19BLCA0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4zX19BLCA0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU40X19BLCAzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU41X19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9TWV9TWU5DX0hXTV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX1NZX1NZTkNfQVdNX19BLCA0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fU1lfU1lOQ19MV01fX0EsIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogUUFNIFNsaWNlciBTZXR0aW5ncyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX1NMX1NJR19QT1dFUl9fQSwgRFJYS19RQU1fU0xfU0lHX1BPV0VSX1FBTTY0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCisJLyogUUFNIExvb3AgQ29udHJvbGxlciBDb2VmaWNpZW50cyAqLworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0FfRklORV9fQSwgMTUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NBX0NPQVJTRV9fQSwgNDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VQX0ZJTkVfX0EsIDEyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FUF9NRURJVU1fX0EsIDI0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FUF9DT0FSU0VfX0EsIDI0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FSV9GSU5FX19BLCAxMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRUlfTUVESVVNX19BLCAxNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRUlfQ09BUlNFX19BLCAxNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DUF9GSU5FX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DUF9NRURJVU1fX0EsIDMwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DUF9DT0FSU0VfX0EsIDEwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfRklORV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfTUVESVVNX19BLCAzMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfQ09BUlNFX19BLCA1MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0ZfRklORV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGX01FRElVTV9fQSwgMjUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGX0NPQVJTRV9fQSwgNDgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGMV9GSU5FX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRjFfTUVESVVNX19BLCAxMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0YxX0NPQVJTRV9fQSwgMTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisKKwkvKiBRQU0gU3RhdGUgTWFjaGluZSAoRlNNKSBUaHJlc2hvbGRzICovCisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUlRIX19BLCAxMDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9GVEhfX0EsIDYwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fQ1RIX19BLCA4MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1BUSF9fQSwgMTEwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUVRIX19BLCAyMDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9NVEhfX0EsIDk1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9SQVRFX0xJTV9fQSwgNDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9DT1VOVF9MSU1fX0EsIDQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9GUkVRX0xJTV9fQSwgMTUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisKKwkvKiBRQU0gRlNNIFRyYWNraW5nIFBhcmFtZXRlcnMgKi8KKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9NRURJQU5fQVZfTVVMVF9fQSwgKHUxNikgMTIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9SQURJVVNfQVZfTElNSVRfX0EsICh1MTYpIDE0MSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDFfX0EsICh1MTYpIDcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQyX19BLCAodTE2KSAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUM19fQSwgKHUxNikgLTE1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUNF9fQSwgKHUxNikgLTQ1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUNV9fQSwgKHUxNikgLTgwKTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorKiBcYnJpZWYgUUFNMTI4IHNwZWNpZmljIHNldHVwCisqIFxwYXJhbSBkZW1vZDogaW5zdGFuY2Ugb2YgZGVtb2QuCisqIFxyZXR1cm4gRFJYU3RhdHVzX3QuCisqLworc3RhdGljIGludCBTZXRRQU0xMjgoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXMgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKwkvKiBRQU0gRXF1YWxpemVyIFNldHVwICovCisJLyogRXF1YWxpemVyICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDBfX0EsIDY1NjQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQxX19BLCA2NTk4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEMl9fQSwgNjM5NCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDNfX0EsIDY0MDkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQ0X19BLCA2NjU2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFENV9fQSwgNzIzOCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBEZWNpc2lvbiBGZWVkYmFjayBFcXVhbGl6ZXIgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4wX19BLCA2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4xX19BLCA2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4yX19BLCA2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4zX19BLCA2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU40X19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU41X19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9TWV9TWU5DX0hXTV9fQSwgNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX1NZX1NZTkNfQVdNX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fU1lfU1lOQ19MV01fX0EsIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisKKwkvKiBRQU0gU2xpY2VyIFNldHRpbmdzICovCisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9TTF9TSUdfUE9XRVJfX0EsIERSWEtfUUFNX1NMX1NJR19QT1dFUl9RQU0xMjgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisKKwkvKiBRQU0gTG9vcCBDb250cm9sbGVyIENvZWZpY2llbnRzICovCisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DQV9GSU5FX19BLCAxNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0FfQ09BUlNFX19BLCA0MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRVBfRklORV9fQSwgMTIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VQX01FRElVTV9fQSwgMjQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VQX0NPQVJTRV9fQSwgMjQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VJX0ZJTkVfX0EsIDEyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FSV9NRURJVU1fX0EsIDE2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FSV9DT0FSU0VfX0EsIDE2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NQX0ZJTkVfX0EsIDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NQX01FRElVTV9fQSwgNDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NQX0NPQVJTRV9fQSwgMTIwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DSV9GSU5FX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DSV9NRURJVU1fX0EsIDQwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DSV9DT0FSU0VfX0EsIDYwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRl9GSU5FX19BLCAxNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0ZfTUVESVVNX19BLCAyNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0ZfQ09BUlNFX19BLCA2NCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0YxX0ZJTkVfX0EsIDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGMV9NRURJVU1fX0EsIDEwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRjFfQ09BUlNFX19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCisJLyogUUFNIFN0YXRlIE1hY2hpbmUgKEZTTSkgVGhyZXNob2xkcyAqLworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1JUSF9fQSwgNTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9GVEhfX0EsIDYwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fQ1RIX19BLCA4MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1BUSF9fQSwgMTAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUVRIX19BLCAxNDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9NVEhfX0EsIDEwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUkFURV9MSU1fX0EsIDQwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fQ09VTlRfTElNX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9GUkVRX0xJTV9fQSwgMTIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogUUFNIEZTTSBUcmFja2luZyBQYXJhbWV0ZXJzICovCisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTUVESUFOX0FWX01VTFRfX0EsICh1MTYpIDgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9SQURJVVNfQVZfTElNSVRfX0EsICh1MTYpIDY1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUMV9fQSwgKHUxNikgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDJfX0EsICh1MTYpIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQzX19BLCAodTE2KSAtMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDRfX0EsICh1MTYpIC0xMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDVfX0EsICh1MTYpIC0yMyk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyogXGJyaWVmIFFBTTI1NiBzcGVjaWZpYyBzZXR1cAorKiBccGFyYW0gZGVtb2Q6IGluc3RhbmNlIG9mIGRlbW9kLgorKiBccmV0dXJuIERSWFN0YXR1c190LgorKi8KK3N0YXRpYyBpbnQgU2V0UUFNMjU2KHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisJLyogUUFNIEVxdWFsaXplciBTZXR1cCAqLworCS8qIEVxdWFsaXplciAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQwX19BLCAxMTUwMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDFfX0EsIDEyMDg0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEMl9fQSwgMTI1NDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQzX19BLCAxMjkzMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDRfX0EsIDEzNjI5KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFENV9fQSwgMTUzODUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogRGVjaXNpb24gRmVlZGJhY2sgRXF1YWxpemVyICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVOMF9fQSwgOCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVOMV9fQSwgOCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVOMl9fQSwgOCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVOM19fQSwgOCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVONF9fQSwgNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVONV9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fU1lfU1lOQ19IV01fX0EsIDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9TWV9TWU5DX0FXTV9fQSwgNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX1NZX1NZTkNfTFdNX19BLCAzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFFBTSBTbGljZXIgU2V0dGluZ3MgKi8KKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX1NMX1NJR19QT1dFUl9fQSwgRFJYS19RQU1fU0xfU0lHX1BPV0VSX1FBTTI1Nik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKworCS8qIFFBTSBMb29wIENvbnRyb2xsZXIgQ29lZmljaWVudHMgKi8KKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NBX0ZJTkVfX0EsIDE1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DQV9DT0FSU0VfX0EsIDQwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FUF9GSU5FX19BLCAxMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRVBfTUVESVVNX19BLCAyNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRVBfQ09BUlNFX19BLCAyNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRUlfRklORV9fQSwgMTIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VJX01FRElVTV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VJX0NPQVJTRV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfRklORV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfTUVESVVNX19BLCA1MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfQ09BUlNFX19BLCAyNTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NJX0ZJTkVfX0EsIDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NJX01FRElVTV9fQSwgNTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NJX0NPQVJTRV9fQSwgMTI1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRl9GSU5FX19BLCAxNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0ZfTUVESVVNX19BLCAyNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0ZfQ09BUlNFX19BLCA0OCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0YxX0ZJTkVfX0EsIDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGMV9NRURJVU1fX0EsIDEwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRjFfQ09BUlNFX19BLCAxMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKworCS8qIFFBTSBTdGF0ZSBNYWNoaW5lIChGU00pIFRocmVzaG9sZHMgKi8KKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9SVEhfX0EsIDUwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fRlRIX19BLCA2MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0NUSF9fQSwgODApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9QVEhfX0EsIDEwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1FUSF9fQSwgMTUwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTVRIX19BLCAxMTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1JBVEVfTElNX19BLCA0MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0NPVU5UX0xJTV9fQSwgNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0ZSRVFfTElNX19BLCAxMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKworCS8qIFFBTSBGU00gVHJhY2tpbmcgUGFyYW1ldGVycyAqLworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX01FRElBTl9BVl9NVUxUX19BLCAodTE2KSA4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUkFESVVTX0FWX0xJTUlUX19BLCAodTE2KSA3NCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDFfX0EsICh1MTYpIDE4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUMl9fQSwgKHUxNikgMTMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQzX19BLCAodTE2KSA3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUNF9fQSwgKHUxNikgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDVfX0EsICh1MTYpIC04KTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKioKKyogXGJyaWVmIFJlc2V0IFFBTSBibG9jay4KKyogXHBhcmFtIGRlbW9kOiAgIGluc3RhbmNlIG9mIGRlbW9kLgorKiBccGFyYW0gY2hhbm5lbDogcG9pbnRlciB0byBjaGFubmVsIGRhdGEuCisqIFxyZXR1cm4gRFJYU3RhdHVzX3QuCisqLworc3RhdGljIGludCBRQU1SZXNldFFBTShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJaW50IHN0YXR1czsKKwl1MTYgY21kUmVzdWx0OworCisJZHByaW50aygxLCAiXG4iKTsKKwkvKiBTdG9wIFFBTSBjb21zdGF0ZS0+bV9leGVjICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0NPTU1fRVhFQ19fQSwgUUFNX0NPTU1fRVhFQ19TVE9QKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHNjdV9jb21tYW5kKHN0YXRlLCBTQ1VfUkFNX0NPTU1BTkRfU1RBTkRBUkRfUUFNIHwgU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9SRVNFVCwgMCwgTlVMTCwgMSwgJmNtZFJlc3VsdCk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisqIFxicmllZiBTZXQgUUFNIHN5bWJvbHJhdGUuCisqIFxwYXJhbSBkZW1vZDogICBpbnN0YW5jZSBvZiBkZW1vZC4KKyogXHBhcmFtIGNoYW5uZWw6IHBvaW50ZXIgdG8gY2hhbm5lbCBkYXRhLgorKiBccmV0dXJuIERSWFN0YXR1c190LgorKi8KK3N0YXRpYyBpbnQgUUFNU2V0U3ltYm9scmF0ZShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJdTMyIGFkY0ZyZXF1ZW5jeSA9IDA7CisJdTMyIHN5bWJGcmVxID0gMDsKKwl1MzIgaXFtUmNSYXRlID0gMDsKKwl1MTYgcmF0ZXNlbCA9IDA7CisJdTMyIGxjU3ltYlJhdGUgPSAwOworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCS8qIFNlbGVjdCAmIGNhbGN1bGF0ZSBjb3JyZWN0IElRTSByYXRlICovCisJYWRjRnJlcXVlbmN5ID0gKHN0YXRlLT5tX3N5c0Nsb2NrRnJlcSAqIDEwMDApIC8gMzsKKwlyYXRlc2VsID0gMDsKKwkvKiBwcmludGsoS0VSTl9ERUJVRyAiZHJ4azogU1IgJWRcbiIsIHN0YXRlLT5wYXJhbS51LnFhbS5zeW1ib2xfcmF0ZSk7ICovCisJaWYgKHN0YXRlLT5wYXJhbS51LnFhbS5zeW1ib2xfcmF0ZSA8PSAxMTg4NzUwKQorCQlyYXRlc2VsID0gMzsKKwllbHNlIGlmIChzdGF0ZS0+cGFyYW0udS5xYW0uc3ltYm9sX3JhdGUgPD0gMjM3NzUwMCkKKwkJcmF0ZXNlbCA9IDI7CisJZWxzZSBpZiAoc3RhdGUtPnBhcmFtLnUucWFtLnN5bWJvbF9yYXRlIDw9IDQ3NTUwMDApCisJCXJhdGVzZWwgPSAxOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9GRF9SQVRFU0VMX19BLCByYXRlc2VsKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qCisJCUlxbVJjUmF0ZSA9ICgoRmFkYyAvIChzeW1ib2xyYXRlICogKDQ8PHJhdGVzZWwpKSkgLSAxKSAqICgxPDwyMykKKwkJKi8KKwlzeW1iRnJlcSA9IHN0YXRlLT5wYXJhbS51LnFhbS5zeW1ib2xfcmF0ZSAqICgxIDw8IHJhdGVzZWwpOworCWlmIChzeW1iRnJlcSA9PSAwKSB7CisJCS8qIERpdmlkZSBieSB6ZXJvICovCisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCWlxbVJjUmF0ZSA9IChhZGNGcmVxdWVuY3kgLyBzeW1iRnJlcSkgKiAoMSA8PCAyMSkgKworCQkoRnJhYzI4YSgoYWRjRnJlcXVlbmN5ICUgc3ltYkZyZXEpLCBzeW1iRnJlcSkgPj4gNykgLQorCQkoMSA8PCAyMyk7CisJc3RhdHVzID0gd3JpdGUzMihzdGF0ZSwgSVFNX1JDX1JBVEVfT0ZTX0xPX19BLCBpcW1SY1JhdGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXRlLT5tX2lxbVJjUmF0ZSA9IGlxbVJjUmF0ZTsKKwkvKgorCQlMY1N5bWJGcmVxID0gcm91bmQgKC4xMjUgKiAgc3ltYm9scmF0ZSAvIGFkY0ZyZXEgKiAoMTw8MTUpKQorCQkqLworCXN5bWJGcmVxID0gc3RhdGUtPnBhcmFtLnUucWFtLnN5bWJvbF9yYXRlOworCWlmIChhZGNGcmVxdWVuY3kgPT0gMCkgeworCQkvKiBEaXZpZGUgYnkgemVybyAqLworCQlzdGF0dXMgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKwlsY1N5bWJSYXRlID0gKHN5bWJGcmVxIC8gYWRjRnJlcXVlbmN5KSAqICgxIDw8IDEyKSArCisJCShGcmFjMjhhKChzeW1iRnJlcSAlIGFkY0ZyZXF1ZW5jeSksIGFkY0ZyZXF1ZW5jeSkgPj4KKwkJMTYpOworCWlmIChsY1N5bWJSYXRlID4gNTExKQorCQlsY1N5bWJSYXRlID0gNTExOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19TWU1CT0xfRlJFUV9fQSwgKHUxNikgbGNTeW1iUmF0ZSk7CisKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyogXGJyaWVmIEdldCBRQU0gbG9jayBzdGF0dXMuCisqIFxwYXJhbSBkZW1vZDogICBpbnN0YW5jZSBvZiBkZW1vZC4KKyogXHBhcmFtIGNoYW5uZWw6IHBvaW50ZXIgdG8gY2hhbm5lbCBkYXRhLgorKiBccmV0dXJuIERSWFN0YXR1c190LgorKi8KKworc3RhdGljIGludCBHZXRRQU1Mb2NrU3RhdHVzKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTMyICpwTG9ja1N0YXR1cykKK3sKKwlpbnQgc3RhdHVzOworCXUxNiBSZXN1bHRbMl0gPSB7IDAsIDAgfTsKKworCWRwcmludGsoMSwgIlxuIik7CisJKnBMb2NrU3RhdHVzID0gTk9UX0xPQ0tFRDsKKwlzdGF0dXMgPSBzY3VfY29tbWFuZChzdGF0ZSwKKwkJCVNDVV9SQU1fQ09NTUFORF9TVEFOREFSRF9RQU0gfAorCQkJU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9HRVRfTE9DSywgMCwgTlVMTCwgMiwKKwkJCVJlc3VsdCk7CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogJXMgc3RhdHVzID0gJTA4eFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CisKKwlpZiAoUmVzdWx0WzFdIDwgU0NVX1JBTV9RQU1fTE9DS0VEX0xPQ0tFRF9ERU1PRF9MT0NLRUQpIHsKKwkJLyogMHgwMDAwIE5PVCBMT0NLRUQgKi8KKwl9IGVsc2UgaWYgKFJlc3VsdFsxXSA8IFNDVV9SQU1fUUFNX0xPQ0tFRF9MT0NLRURfTE9DS0VEKSB7CisJCS8qIDB4NDAwMCBERU1PRCBMT0NLRUQgKi8KKwkJKnBMb2NrU3RhdHVzID0gREVNT0RfTE9DSzsKKwl9IGVsc2UgaWYgKFJlc3VsdFsxXSA8IFNDVV9SQU1fUUFNX0xPQ0tFRF9MT0NLRURfTkVWRVJfTE9DSykgeworCQkvKiAweDgwMDAgREVNT0QgKyBGRUMgTE9DS0VEIChzeXN0ZW0gbG9jaykgKi8KKwkJKnBMb2NrU3RhdHVzID0gTVBFR19MT0NLOworCX0gZWxzZSB7CisJCS8qIDB4QzAwMCBORVZFUiBMT0NLRUQgKi8KKwkJLyogKHN5c3RlbSB3aWxsIG5ldmVyIGJlIGFibGUgdG8gbG9jayB0byB0aGUgc2lnbmFsKSAqLworCQkvKiBUT0RPOiBjaGVjayB0aGlzLCBpbnRlcm1lZGlhdGUgJiBzdGFuZGFyZCBzcGVjaWZpYyBsb2NrIHN0YXRlcyBhcmUgbm90CisJCSAgIHRha2VuIGludG8gYWNjb3VudCBoZXJlICovCisJCSpwTG9ja1N0YXR1cyA9IE5FVkVSX0xPQ0s7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKyNkZWZpbmUgUUFNX01JUlJPUl9fTSAgICAgICAgIDB4MDMKKyNkZWZpbmUgUUFNX01JUlJPUl9OT1JNQUwgICAgIDB4MDAKKyNkZWZpbmUgUUFNX01JUlJPUkVEICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUUFNX01JUlJPUl9BVVRPX09OICAgIDB4MDIKKyNkZWZpbmUgUUFNX0xPQ0tSQU5HRV9fTSAgICAgIDB4MTAKKyNkZWZpbmUgUUFNX0xPQ0tSQU5HRV9OT1JNQUwgIDB4MTAKKworc3RhdGljIGludCBTZXRRQU0oc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MTYgSW50ZXJtZWRpYXRlRnJlcWtIeiwKKwkJICBzMzIgdHVuZXJGcmVxT2Zmc2V0KQoreworCWludCBzdGF0dXM7CisJdTE2IHNldFBhcmFtUGFyYW1ldGVyc1s0XSA9IHsgMCwgMCwgMCwgMCB9OworCXUxNiBjbWRSZXN1bHQ7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCS8qCisJICogU1RFUCAxOiByZXNldCBkZW1vZHVsYXRvcgorCSAqCXJlc2V0cyBGRUMgREkgYW5kIEZFQyBSUworCSAqCXJlc2V0cyBRQU0gYmxvY2sKKwkgKglyZXNldHMgU0NVIHZhcmlhYmxlcworCSAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19ESV9DT01NX0VYRUNfX0EsIEZFQ19ESV9DT01NX0VYRUNfU1RPUCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX1JTX0NPTU1fRVhFQ19fQSwgRkVDX1JTX0NPTU1fRVhFQ19TVE9QKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSBRQU1SZXNldFFBTShzdGF0ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKgorCSAqIFNURVAgMjogY29uZmlndXJlIGRlbW9kdWxhdG9yCisJICoJLXNldCBwYXJhbXM7IHJlc2V0cyBJUU0sUUFNLEZFQyBIVzsgaW5pdGlhbGl6ZXMgc29tZQorCSAqICAgICAgIFNDVSB2YXJpYWJsZXMKKwkgKi8KKwlzdGF0dXMgPSBRQU1TZXRTeW1ib2xyYXRlKHN0YXRlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFNldCBwYXJhbXMgKi8KKwlzd2l0Y2ggKHN0YXRlLT5wYXJhbS51LnFhbS5tb2R1bGF0aW9uKSB7CisJY2FzZSBRQU1fMjU2OgorCQlzdGF0ZS0+bV9Db25zdGVsbGF0aW9uID0gRFJYX0NPTlNURUxMQVRJT05fUUFNMjU2OworCQlicmVhazsKKwljYXNlIFFBTV9BVVRPOgorCWNhc2UgUUFNXzY0OgorCQlzdGF0ZS0+bV9Db25zdGVsbGF0aW9uID0gRFJYX0NPTlNURUxMQVRJT05fUUFNNjQ7CisJCWJyZWFrOworCWNhc2UgUUFNXzE2OgorCQlzdGF0ZS0+bV9Db25zdGVsbGF0aW9uID0gRFJYX0NPTlNURUxMQVRJT05fUUFNMTY7CisJCWJyZWFrOworCWNhc2UgUUFNXzMyOgorCQlzdGF0ZS0+bV9Db25zdGVsbGF0aW9uID0gRFJYX0NPTlNURUxMQVRJT05fUUFNMzI7CisJCWJyZWFrOworCWNhc2UgUUFNXzEyODoKKwkJc3RhdGUtPm1fQ29uc3RlbGxhdGlvbiA9IERSWF9DT05TVEVMTEFUSU9OX1FBTTEyODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXNldFBhcmFtUGFyYW1ldGVyc1swXSA9IHN0YXRlLT5tX0NvbnN0ZWxsYXRpb247CS8qIGNvbnN0ZWxsYXRpb24gICAgICovCisJc2V0UGFyYW1QYXJhbWV0ZXJzWzFdID0gRFJYS19RQU1fSTEyX0oxNzsJLyogaW50ZXJsZWF2ZSBtb2RlICAgKi8KKwlpZiAoc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSA9PSBPTV9RQU1fSVRVX0MpCisJCXNldFBhcmFtUGFyYW1ldGVyc1syXSA9IFFBTV9UT1BfQU5ORVhfQzsKKwllbHNlCisJCXNldFBhcmFtUGFyYW1ldGVyc1syXSA9IFFBTV9UT1BfQU5ORVhfQTsKKwlzZXRQYXJhbVBhcmFtZXRlcnNbM10gfD0gKFFBTV9NSVJST1JfQVVUT19PTik7CisJLyogRW52IHBhcmFtZXRlcnMgKi8KKwkvKiBjaGVjayBmb3IgTE9DS1JBTkdFIEV4dGVudGVkICovCisJLyogc2V0UGFyYW1QYXJhbWV0ZXJzWzNdIHw9IFFBTV9MT0NLUkFOR0VfTk9STUFMOyAqLworCisJc3RhdHVzID0gc2N1X2NvbW1hbmQoc3RhdGUsIFNDVV9SQU1fQ09NTUFORF9TVEFOREFSRF9RQU0gfCBTQ1VfUkFNX0NPTU1BTkRfQ01EX0RFTU9EX1NFVF9QQVJBTSwgNCwgc2V0UGFyYW1QYXJhbWV0ZXJzLCAxLCAmY21kUmVzdWx0KTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQkvKiBGYWxsLWJhY2sgdG8gdGhlIHNpbXBsZXIgY2FsbCAqLworCQlpZiAoc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSA9PSBPTV9RQU1fSVRVX0MpCisJCQlzZXRQYXJhbVBhcmFtZXRlcnNbMF0gPSBRQU1fVE9QX0FOTkVYX0M7CisJCWVsc2UKKwkJCXNldFBhcmFtUGFyYW1ldGVyc1swXSA9IFFBTV9UT1BfQU5ORVhfQTsKKwkJc3RhdHVzID0gc2N1X2NvbW1hbmQoc3RhdGUsIFNDVV9SQU1fQ09NTUFORF9TVEFOREFSRF9RQU0gfCBTQ1VfUkFNX0NPTU1BTkRfQ01EX0RFTU9EX1NFVF9FTlYsIDEsIHNldFBhcmFtUGFyYW1ldGVycywgMSwgJmNtZFJlc3VsdCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQlzZXRQYXJhbVBhcmFtZXRlcnNbMF0gPSBzdGF0ZS0+bV9Db25zdGVsbGF0aW9uOyAvKiBjb25zdGVsbGF0aW9uICAgICAqLworCQlzZXRQYXJhbVBhcmFtZXRlcnNbMV0gPSBEUlhLX1FBTV9JMTJfSjE3OyAgICAgICAvKiBpbnRlcmxlYXZlIG1vZGUgICAqLworCQlzdGF0dXMgPSBzY3VfY29tbWFuZChzdGF0ZSwgU0NVX1JBTV9DT01NQU5EX1NUQU5EQVJEX1FBTSB8IFNDVV9SQU1fQ09NTUFORF9DTURfREVNT0RfU0VUX1BBUkFNLCAyLCBzZXRQYXJhbVBhcmFtZXRlcnMsIDEsICZjbWRSZXN1bHQpOworCX0KKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qCisJICogU1RFUCAzOiBlbmFibGUgdGhlIHN5c3RlbSBpbiBhIG1vZGUgd2hlcmUgdGhlIEFEQyBwcm92aWRlcyB2YWxpZAorCSAqIHNpZ25hbCBzZXR1cCBjb25zdGVsbGF0aW9uIGluZGVwZW5kZW50IHJlZ2lzdGVycworCSAqLworI2lmIDAKKwlzdGF0dXMgPSBTZXRGcmVxdWVuY3koY2hhbm5lbCwgdHVuZXJGcmVxT2Zmc2V0KSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisjZW5kaWYKKwlzdGF0dXMgPSBTZXRGcmVxdWVuY3lTaGlmdGVyKHN0YXRlLCBJbnRlcm1lZGlhdGVGcmVxa0h6LCB0dW5lckZyZXFPZmZzZXQsIHRydWUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogU2V0dXAgQkVSIG1lYXN1cmVtZW50ICovCisJc3RhdHVzID0gU2V0UUFNTWVhc3VyZW1lbnQoc3RhdGUsIHN0YXRlLT5tX0NvbnN0ZWxsYXRpb24sIHN0YXRlLT5wYXJhbS51LiBxYW0uc3ltYm9sX3JhdGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogUmVzZXQgZGVmYXVsdCB2YWx1ZXMgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfU0NBTEVfU0hfX0EsIElRTV9DRl9TQ0FMRV9TSF9fUFJFKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fU1lfVElNRU9VVF9fQSwgUUFNX1NZX1RJTUVPVVRfX1BSRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBSZXNldCBkZWZhdWx0IExDIHZhbHVlcyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19SQVRFX0xJTUlUX19BLCAzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fTENfTFBGX0ZBQ1RPUlBfX0EsIDQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19MUEZfRkFDVE9SSV9fQSwgNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX01PREVfX0EsIDcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCMF9fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCMV9fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCMl9fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCM19fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCNF9fQSwgMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCNV9fQSwgMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCNl9fQSwgMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCOF9fQSwgMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCOV9fQSwgMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCMTBfX0EsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19RVUFMX1RBQjEyX19BLCAyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fTENfUVVBTF9UQUIxNV9fQSwgMyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCMTZfX0EsIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19RVUFMX1RBQjIwX19BLCA0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fTENfUVVBTF9UQUIyNV9fQSwgNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBNaXJyb3JpbmcsIFFBTS1ibG9jayBzdGFydGluZyBwb2ludCBub3QgaW52ZXJ0ZWQgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fU1lfU1BfSU5WX19BLCBRQU1fU1lfU1BfSU5WX1NQRUNUUlVNX0lOVl9ESVMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogSGFsdCBTQ1UgdG8gZW5hYmxlIHNhZmUgbm9uLWF0b21pYyBhY2Nlc3NlcyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9DT01NX0VYRUNfX0EsIFNDVV9DT01NX0VYRUNfSE9MRCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBTVEVQIDQ6IGNvbnN0ZWxsYXRpb24gc3BlY2lmaWMgc2V0dXAgKi8KKwlzd2l0Y2ggKHN0YXRlLT5wYXJhbS51LnFhbS5tb2R1bGF0aW9uKSB7CisJY2FzZSBRQU1fMTY6CisJCXN0YXR1cyA9IFNldFFBTTE2KHN0YXRlKTsKKwkJYnJlYWs7CisJY2FzZSBRQU1fMzI6CisJCXN0YXR1cyA9IFNldFFBTTMyKHN0YXRlKTsKKwkJYnJlYWs7CisJY2FzZSBRQU1fQVVUTzoKKwljYXNlIFFBTV82NDoKKwkJc3RhdHVzID0gU2V0UUFNNjQoc3RhdGUpOworCQlicmVhazsKKwljYXNlIFFBTV8xMjg6CisJCXN0YXR1cyA9IFNldFFBTTEyOChzdGF0ZSk7CisJCWJyZWFrOworCWNhc2UgUUFNXzI1NjoKKwkJc3RhdHVzID0gU2V0UUFNMjU2KHN0YXRlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogQWN0aXZhdGUgU0NVIHRvIGVuYWJsZSBTQ1UgY29tbWFuZHMgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfQ09NTV9FWEVDX19BLCBTQ1VfQ09NTV9FWEVDX0FDVElWRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBSZS1jb25maWd1cmUgTVBFRyBvdXRwdXQsIHJlcXVpcmVzIGtub3dsZWRnZSBvZiBjaGFubmVsIGJpdHJhdGUgKi8KKwkvKiBleHRBdHRyLT5jdXJyZW50Q2hhbm5lbC5jb25zdGVsbGF0aW9uID0gY2hhbm5lbC0+Y29uc3RlbGxhdGlvbjsgKi8KKwkvKiBleHRBdHRyLT5jdXJyZW50Q2hhbm5lbC5zeW1ib2xyYXRlICAgID0gY2hhbm5lbC0+c3ltYm9scmF0ZTsgKi8KKwlzdGF0dXMgPSBNUEVHVFNEdG9TZXR1cChzdGF0ZSwgc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBTdGFydCBwcm9jZXNzZXMgKi8KKwlzdGF0dXMgPSBNUEVHVFNTdGFydChzdGF0ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX0NPTU1fRVhFQ19fQSwgRkVDX0NPTU1fRVhFQ19BQ1RJVkUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9DT01NX0VYRUNfX0EsIFFBTV9DT01NX0VYRUNfQUNUSVZFKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ09NTV9FWEVDX19BLCBJUU1fQ09NTV9FWEVDX0JfQUNUSVZFKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFNURVAgNTogc3RhcnQgUUFNIGRlbW9kdWxhdG9yIChzdGFydHMgRkVDLCBRQU0gYW5kIElRTSBIVykgKi8KKwlzdGF0dXMgPSBzY3VfY29tbWFuZChzdGF0ZSwgU0NVX1JBTV9DT01NQU5EX1NUQU5EQVJEX1FBTSB8IFNDVV9SQU1fQ09NTUFORF9DTURfREVNT0RfU1RBUlQsIDAsIE5VTEwsIDEsICZjbWRSZXN1bHQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogdXBkYXRlIGdsb2JhbCBEUlhLIGRhdGEgY29udGFpbmVyICovCisvKj8gICAgIGV4dEF0dHItPnFhbUludGVybGVhdmVNb2RlID0gRFJYS19RQU1fSTEyX0oxNzsgKi8KKworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgU2V0UUFNU3RhbmRhcmQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLAorCQkJICBlbnVtIE9wZXJhdGlvbk1vZGUgb01vZGUpCit7CisJaW50IHN0YXR1czsKKyNpZmRlZiBEUlhLX1FBTV9UQVBTCisjZGVmaW5lIERSWEtfUUFNQV9UQVBTX1NFTEVDVAorI2luY2x1ZGUgImRyeGtfZmlsdGVycy5oIgorI3VuZGVmIERSWEtfUUFNQV9UQVBTX1NFTEVDVAorI2VuZGlmCisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJLyogYWRkZWQgYW50ZW5uYSBzd2l0Y2ggKi8KKwlTd2l0Y2hBbnRlbm5hVG9RQU0oc3RhdGUpOworCisJLyogRW5zdXJlIGNvcnJlY3QgcG93ZXItdXAgbW9kZSAqLworCXN0YXR1cyA9IFBvd2VyVXBRQU0oc3RhdGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCS8qIFJlc2V0IFFBTSBibG9jayAqLworCXN0YXR1cyA9IFFBTVJlc2V0UUFNKHN0YXRlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFNldHVwIElRTSAqLworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NPTU1fRVhFQ19fQSwgSVFNX0NPTU1fRVhFQ19CX1NUT1ApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9BTVVYX19BLCBJUU1fQUZfQU1VWF9TSUdOQUwyQURDKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFVwbG9hZCBJUU0gQ2hhbm5lbCBGaWx0ZXIgc2V0dGluZ3MgYnkKKwkJYm9vdCBsb2FkZXIgZnJvbSBST00gdGFibGUgKi8KKwlzd2l0Y2ggKG9Nb2RlKSB7CisJY2FzZSBPTV9RQU1fSVRVX0E6CisJCXN0YXR1cyA9IEJMQ2hhaW5DbWQoc3RhdGUsIERSWEtfQkxfUk9NX09GRlNFVF9UQVBTX0lUVV9BLCBEUlhLX0JMQ0NfTlJfRUxFTUVOVFNfVEFQUywgRFJYS19CTENfVElNRU9VVCk7CisJCWJyZWFrOworCWNhc2UgT01fUUFNX0lUVV9DOgorCQlzdGF0dXMgPSBCTERpcmVjdENtZChzdGF0ZSwgSVFNX0NGX1RBUF9SRTBfX0EsIERSWEtfQkxfUk9NX09GRlNFVF9UQVBTX0lUVV9DLCBEUlhLX0JMRENfTlJfRUxFTUVOVFNfVEFQUywgRFJYS19CTENfVElNRU9VVCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gQkxEaXJlY3RDbWQoc3RhdGUsIElRTV9DRl9UQVBfSU0wX19BLCBEUlhLX0JMX1JPTV9PRkZTRVRfVEFQU19JVFVfQywgRFJYS19CTERDX05SX0VMRU1FTlRTX1RBUFMsIERSWEtfQkxDX1RJTUVPVVQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRUlOVkFMOworCX0KKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9PVVRfRU5BX19BLCAoMSA8PCBJUU1fQ0ZfT1VUX0VOQV9RQU1fX0IpKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfU1lNTUVUUklDX19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfTUlEVEFQX19BLCAoKDEgPDwgSVFNX0NGX01JRFRBUF9SRV9fQikgfCAoMSA8PCBJUU1fQ0ZfTUlEVEFQX0lNX19CKSkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX1JDX1NUUkVUQ0hfX0EsIDIxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfQ0xQX0xFTl9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX0NMUF9USF9fQSwgNDQ4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfU05TX0xFTl9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX1BPV19NRUFTX0xFTl9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fRlNfQURKX1NFTF9fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX1JDX0FESl9TRUxfX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9BREpfU0VMX19BLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfVVBEX1NFTF9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBJUU0gSW1wdWxzZSBOb2lzZSBQcm9jZXNzaW5nIFVuaXQgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfQ0xQX1ZBTF9fQSwgNTAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfREFUQVRIX19BLCAxMDAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfQllQQVNTREVUX19BLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfREVUX0xDVF9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX1dORF9MRU5fX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9QS0RUSF9fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX0lOQ19CWVBBU1NfX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogdHVybiBvbiBJUU1BRi4gTXVzdCBiZSBkb25lIGJlZm9yZSBzZXRBZ2MqKigpICovCisJc3RhdHVzID0gU2V0SXFtQWYoc3RhdGUsIHRydWUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9TVEFSVF9MT0NLX19BLCAweDAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIElRTSB3aWxsIG5vdCBiZSByZXNldCBmcm9tIGhlcmUsIHN5bmMgQURDIGFuZCB1cGRhdGUvaW5pdCBBR0MgKi8KKwlzdGF0dXMgPSBBRENTeW5jaHJvbml6YXRpb24oc3RhdGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogU2V0IHRoZSBGU00gc3RlcCBwZXJpb2QgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fU1RFUF9QRVJJT0RfX0EsIDIwMDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogSGFsdCBTQ1UgdG8gZW5hYmxlIHNhZmUgbm9uLWF0b21pYyBhY2Nlc3NlcyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9DT01NX0VYRUNfX0EsIFNDVV9DT01NX0VYRUNfSE9MRCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBObyBtb3JlIHJlc2V0cyBvZiB0aGUgSVFNLCBjdXJyZW50IHN0YW5kYXJkIGNvcnJlY3RseSBzZXQgPT4KKwkJbm93IEFHQ3MgY2FuIGJlIGNvbmZpZ3VyZWQuICovCisKKwlzdGF0dXMgPSBJbml0QUdDKHN0YXRlLCB0cnVlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSBTZXRQcmVTYXcoc3RhdGUsICYoc3RhdGUtPm1fcWFtUHJlU2F3Q2ZnKSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBDb25maWd1cmUgQUdDJ3MgKi8KKwlzdGF0dXMgPSBTZXRBZ2NSZihzdGF0ZSwgJihzdGF0ZS0+bV9xYW1SZkFnY0NmZyksIHRydWUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IFNldEFnY0lmKHN0YXRlLCAmKHN0YXRlLT5tX3FhbUlmQWdjQ2ZnKSwgdHJ1ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBBY3RpdmF0ZSBTQ1UgdG8gZW5hYmxlIFNDVSBjb21tYW5kcyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9DT01NX0VYRUNfX0EsIFNDVV9DT01NX0VYRUNfQUNUSVZFKTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFdyaXRlR1BJTyhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJaW50IHN0YXR1czsKKwl1MTYgdmFsdWUgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKwkvKiBzdG9wIGxvY2sgaW5kaWNhdG9yIHByb2Nlc3MgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0dQSU9fX0EsIFNDVV9SQU1fR1BJT19IV19MT0NLX0lORF9ESVNBQkxFKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qICBXcml0ZSBtYWdpYyB3b3JkIHRvIGVuYWJsZSBwZHIgcmVnIHdyaXRlICAgICAgICAgICAgICAgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fVE9QX0NPTU1fS0VZX19BLCBTSU9fVE9QX0NPTU1fS0VZX0tFWSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoc3RhdGUtPm1faGFzU0FXU1cpIHsKKwkJaWYgKHN0YXRlLT5VSU9fbWFzayAmIDB4MDAwMSkgeyAvKiBVSU8tMSAqLworCQkJLyogd3JpdGUgdG8gaW8gcGFkIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgLSBvdXRwdXQgbW9kZSAqLworCQkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9TTUFfVFhfQ0ZHX19BLCBzdGF0ZS0+bV9HUElPQ2ZnKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCS8qIHVzZSBjb3JyZXNwb25kaW5nIGJpdCBpbiBpbyBkYXRhIG91dHB1dCByZWdpc3RhciAqLworCQkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBTSU9fUERSX1VJT19PVVRfTE9fX0EsICZ2YWx1ZSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJaWYgKChzdGF0ZS0+bV9HUElPICYgMHgwMDAxKSA9PSAwKQorCQkJCXZhbHVlICY9IDB4N0ZGRjsJLyogd3JpdGUgemVybyB0byAxNXRoIGJpdCAtIDFzdCBVSU8gKi8KKwkJCWVsc2UKKwkJCQl2YWx1ZSB8PSAweDgwMDA7CS8qIHdyaXRlIG9uZSB0byAxNXRoIGJpdCAtIDFzdCBVSU8gKi8KKwkJCS8qIHdyaXRlIGJhY2sgdG8gaW8gZGF0YSBvdXRwdXQgcmVnaXN0ZXIgKi8KKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfVUlPX09VVF9MT19fQSwgdmFsdWUpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJfQorCQlpZiAoc3RhdGUtPlVJT19tYXNrICYgMHgwMDAyKSB7IC8qIFVJTy0yICovCisJCQkvKiB3cml0ZSB0byBpbyBwYWQgY29uZmlndXJhdGlvbiByZWdpc3RlciAtIG91dHB1dCBtb2RlICovCisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX1NNQV9UWF9DRkdfX0EsIHN0YXRlLT5tX0dQSU9DZmcpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKworCQkJLyogdXNlIGNvcnJlc3BvbmRpbmcgYml0IGluIGlvIGRhdGEgb3V0cHV0IHJlZ2lzdGFyICovCisJCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNJT19QRFJfVUlPX09VVF9MT19fQSwgJnZhbHVlKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlpZiAoKHN0YXRlLT5tX0dQSU8gJiAweDAwMDIpID09IDApCisJCQkJdmFsdWUgJj0gMHhCRkZGOwkvKiB3cml0ZSB6ZXJvIHRvIDE0dGggYml0IC0gMnN0IFVJTyAqLworCQkJZWxzZQorCQkJCXZhbHVlIHw9IDB4NDAwMDsJLyogd3JpdGUgb25lIHRvIDE0dGggYml0IC0gMnN0IFVJTyAqLworCQkJLyogd3JpdGUgYmFjayB0byBpbyBkYXRhIG91dHB1dCByZWdpc3RlciAqLworCQkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9VSU9fT1VUX0xPX19BLCB2YWx1ZSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQl9CisJCWlmIChzdGF0ZS0+VUlPX21hc2sgJiAweDAwMDQpIHsgLyogVUlPLTMgKi8KKwkJCS8qIHdyaXRlIHRvIGlvIHBhZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIC0gb3V0cHV0IG1vZGUgKi8KKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfU01BX1RYX0NGR19fQSwgc3RhdGUtPm1fR1BJT0NmZyk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCisJCQkvKiB1c2UgY29ycmVzcG9uZGluZyBiaXQgaW4gaW8gZGF0YSBvdXRwdXQgcmVnaXN0YXIgKi8KKwkJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0lPX1BEUl9VSU9fT1VUX0xPX19BLCAmdmFsdWUpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCWlmICgoc3RhdGUtPm1fR1BJTyAmIDB4MDAwNCkgPT0gMCkKKwkJCQl2YWx1ZSAmPSAweEZGRkI7ICAgICAgICAgICAgLyogd3JpdGUgemVybyB0byAybmQgYml0IC0gM3JkIFVJTyAqLworCQkJZWxzZQorCQkJCXZhbHVlIHw9IDB4MDAwNDsgICAgICAgICAgICAvKiB3cml0ZSBvbmUgdG8gMm5kIGJpdCAtIDNyZCBVSU8gKi8KKwkJCS8qIHdyaXRlIGJhY2sgdG8gaW8gZGF0YSBvdXRwdXQgcmVnaXN0ZXIgKi8KKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfVUlPX09VVF9MT19fQSwgdmFsdWUpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKwkvKiAgV3JpdGUgbWFnaWMgd29yZCB0byBkaXNhYmxlIHBkciByZWcgd3JpdGUgICAgICAgICAgICAgICAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19UT1BfQ09NTV9LRVlfX0EsIDB4MDAwMCk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBTd2l0Y2hBbnRlbm5hVG9RQU0oc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXMgPSAwOworCWJvb2wgZ3Bpb19zdGF0ZTsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwlpZiAoIXN0YXRlLT5hbnRlbm5hX2dwaW8pCisJCXJldHVybiAwOworCisJZ3Bpb19zdGF0ZSA9IHN0YXRlLT5tX0dQSU8gJiBzdGF0ZS0+YW50ZW5uYV9ncGlvOworCisJaWYgKHN0YXRlLT5hbnRlbm5hX2R2YnQgXiBncGlvX3N0YXRlKSB7CisJCS8qIEFudGVubmEgaXMgb24gRFZCLVQgbW9kZS4gU3dpdGNoICovCisJCWlmIChzdGF0ZS0+YW50ZW5uYV9kdmJ0KQorCQkJc3RhdGUtPm1fR1BJTyAmPSB+c3RhdGUtPmFudGVubmFfZ3BpbzsKKwkJZWxzZQorCQkJc3RhdGUtPm1fR1BJTyB8PSBzdGF0ZS0+YW50ZW5uYV9ncGlvOworCQlzdGF0dXMgPSBXcml0ZUdQSU8oc3RhdGUpOworCX0KKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBTd2l0Y2hBbnRlbm5hVG9EVkJUKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlib29sIGdwaW9fc3RhdGU7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJaWYgKCFzdGF0ZS0+YW50ZW5uYV9ncGlvKQorCQlyZXR1cm4gMDsKKworCWdwaW9fc3RhdGUgPSBzdGF0ZS0+bV9HUElPICYgc3RhdGUtPmFudGVubmFfZ3BpbzsKKworCWlmICghKHN0YXRlLT5hbnRlbm5hX2R2YnQgXiBncGlvX3N0YXRlKSkgeworCQkvKiBBbnRlbm5hIGlzIG9uIERWQi1DIG1vZGUuIFN3aXRjaCAqLworCQlpZiAoc3RhdGUtPmFudGVubmFfZHZidCkKKwkJCXN0YXRlLT5tX0dQSU8gfD0gc3RhdGUtPmFudGVubmFfZ3BpbzsKKwkJZWxzZQorCQkJc3RhdGUtPm1fR1BJTyAmPSB+c3RhdGUtPmFudGVubmFfZ3BpbzsKKwkJc3RhdHVzID0gV3JpdGVHUElPKHN0YXRlKTsKKwl9CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIGludCBQb3dlckRvd25EZXZpY2Uoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCS8qIFBvd2VyIGRvd24gdG8gcmVxdWVzdGVkIG1vZGUgKi8KKwkvKiBCYWNrdXAgc29tZSByZWdpc3RlciBzZXR0aW5ncyAqLworCS8qIFNldCBwaW5zIHdpdGggcG9zc2libGUgcHVsbC11cHMgY29ubmVjdGVkIHRvIHRoZW0gaW4gaW5wdXQgbW9kZSAqLworCS8qIEFuYWxvZyBwb3dlciBkb3duICovCisJLyogQURDIHBvd2VyIGRvd24gKi8KKwkvKiBQb3dlciBkb3duIGRldmljZSAqLworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCWlmIChzdGF0ZS0+bV9iUERvd25PcGVuQnJpZGdlKSB7CisJCS8qIE9wZW4gSTJDIGJyaWRnZSBiZWZvcmUgcG93ZXIgZG93biBvZiBEUlhLICovCisJCXN0YXR1cyA9IENvbmZpZ3VyZUkyQ0JyaWRnZShzdGF0ZSwgdHJ1ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9CisJLyogZHJpdmVyIDAuOS4wICovCisJc3RhdHVzID0gRFZCVEVuYWJsZU9GRE1Ub2tlblJpbmcoc3RhdGUsIGZhbHNlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19DQ19QV0RfTU9ERV9fQSwgU0lPX0NDX1BXRF9NT0RFX0xFVkVMX0NMT0NLKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQ0NfVVBEQVRFX19BLCBTSU9fQ0NfVVBEQVRFX0tFWSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdGUtPm1fSElDZmdDdHJsIHw9IFNJT19ISV9SQV9SQU1fUEFSXzVfQ0ZHX1NMRUVQX1paWjsKKwlzdGF0dXMgPSBISV9DZmdDb21tYW5kKHN0YXRlKTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbG9hZF9taWNyb2NvZGUoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCBjb25zdCBjaGFyICptY19uYW1lKQoreworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncgPSBOVUxMOworCWludCBlcnIgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKworCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBtY19uYW1lLCBzdGF0ZS0+aTJjLT5kZXYucGFyZW50KTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJkcnhrOiBDb3VsZCBub3QgbG9hZCBmaXJtd2FyZSBmaWxlICVzLlxuIiwgbWNfbmFtZSk7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJkcnhrOiBDb3B5ICVzIHRvIHlvdXIgaG90cGx1ZyBkaXJlY3RvcnkhXG4iLCBtY19uYW1lKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZXJyID0gRG93bmxvYWRNaWNyb2NvZGUoc3RhdGUsIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpbml0X2RyeGsoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXMgPSAwOworCWVudW0gRFJYUG93ZXJNb2RlIHBvd2VyTW9kZSA9IERSWEtfUE9XRVJfRE9XTl9PRkRNOworCXUxNiBkcml2ZXJWZXJzaW9uOworCisJZHByaW50aygxLCAiXG4iKTsKKwlpZiAoKHN0YXRlLT5tX0RyeGtTdGF0ZSA9PSBEUlhLX1VOSU5JVElBTElaRUQpKSB7CisJCXN0YXR1cyA9IFBvd2VyVXBEZXZpY2Uoc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IERSWFhfT3BlbihzdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJLyogU29mdCByZXNldCBvZiBPRkRNLSwgc3lzLSBhbmQgb3NjLWNsb2NrZG9tYWluICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19DQ19TT0ZUX1JTVF9fQSwgU0lPX0NDX1NPRlRfUlNUX09GRE1fX00gfCBTSU9fQ0NfU09GVF9SU1RfU1lTX19NIHwgU0lPX0NDX1NPRlRfUlNUX09TQ19fTSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0NDX1VQREFURV9fQSwgU0lPX0NDX1VQREFURV9LRVkpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCS8qIFRPRE8gaXMgdGhpcyBuZWVkZWQsIGlmIHllcyBob3cgbXVjaCBkZWxheSBpbiB3b3JzdCBjYXNlIHNjZW5hcmlvICovCisJCW1zbGVlcCgxKTsKKwkJc3RhdGUtPm1fRFJYS19BM19QQVRDSF9DT0RFID0gdHJ1ZTsKKwkJc3RhdHVzID0gR2V0RGV2aWNlQ2FwYWJpbGl0aWVzKHN0YXRlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIEJyaWRnZSBkZWxheSwgdXNlcyBvc2NpbGF0b3IgY2xvY2sgKi8KKwkJLyogRGVsYXkgPSAoZGVsYXkgKG5hbm8gc2Vjb25kcykgKiBvc2NjbGsgKGtIeikpLyAxMDAwICovCisJCS8qIFNEQSBicmRpZ2UgZGVsYXkgKi8KKwkJc3RhdGUtPm1fSElDZmdCcmlkZ2VEZWxheSA9CisJCQkodTE2KSAoKHN0YXRlLT5tX29zY0Nsb2NrRnJlcSAvIDEwMDApICoKKwkJCQlISV9JMkNfQlJJREdFX0RFTEFZKSAvIDEwMDA7CisJCS8qIENsaXBwaW5nICovCisJCWlmIChzdGF0ZS0+bV9ISUNmZ0JyaWRnZURlbGF5ID4KKwkJCVNJT19ISV9SQV9SQU1fUEFSXzNfQ0ZHX0RCTF9TREFfX00pIHsKKwkJCXN0YXRlLT5tX0hJQ2ZnQnJpZGdlRGVsYXkgPQorCQkJCVNJT19ISV9SQV9SQU1fUEFSXzNfQ0ZHX0RCTF9TREFfX007CisJCX0KKwkJLyogU0NMIGJyaWRnZSBkZWxheSwgc2FtZSBhcyBTREEgZm9yIG5vdyAqLworCQlzdGF0ZS0+bV9ISUNmZ0JyaWRnZURlbGF5ICs9CisJCQlzdGF0ZS0+bV9ISUNmZ0JyaWRnZURlbGF5IDw8CisJCQlTSU9fSElfUkFfUkFNX1BBUl8zX0NGR19EQkxfU0NMX19COworCisJCXN0YXR1cyA9IEluaXRISShzdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJLyogZGlzYWJsZSB2YXJpb3VzIHByb2Nlc3NlcyAqLworI2lmIE5PQTFST00KKwkJaWYgKCEoc3RhdGUtPm1fRFJYS19BMV9ST01fQ09ERSkKKwkJCSYmICEoc3RhdGUtPm1fRFJYS19BMl9ST01fQ09ERSkpCisjZW5kaWYKKwkJeworCQkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9HUElPX19BLCBTQ1VfUkFNX0dQSU9fSFdfTE9DS19JTkRfRElTQUJMRSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQl9CisKKwkJLyogZGlzYWJsZSBNUEVHIHBvcnQgKi8KKwkJc3RhdHVzID0gTVBFR1RTRGlzYWJsZShzdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBTdG9wIEFVRCBhbmQgU0NVICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEFVRF9DT01NX0VYRUNfX0EsIEFVRF9DT01NX0VYRUNfU1RPUCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX0NPTU1fRVhFQ19fQSwgU0NVX0NPTU1fRVhFQ19TVE9QKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIGVuYWJsZSB0b2tlbi1yaW5nIGJ1cyB0aHJvdWdoIE9GRE0gYmxvY2sgZm9yIHBvc3NpYmxlIHVjb2RlIHVwbG9hZCAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fT0ZETV9TSF9PRkRNX1JJTkdfRU5BQkxFX19BLCBTSU9fT0ZETV9TSF9PRkRNX1JJTkdfRU5BQkxFX09OKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIGluY2x1ZGUgYm9vdCBsb2FkZXIgc2VjdGlvbiAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQkxfQ09NTV9FWEVDX19BLCBTSU9fQkxfQ09NTV9FWEVDX0FDVElWRSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gQkxDaGFpbkNtZChzdGF0ZSwgMCwgNiwgMTAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCWlmICghc3RhdGUtPm1pY3JvY29kZV9uYW1lKQorCQkJbG9hZF9taWNyb2NvZGUoc3RhdGUsICJkcnhrX2EzLm1jIik7CisJCWVsc2UKKwkJCWxvYWRfbWljcm9jb2RlKHN0YXRlLCBzdGF0ZS0+bWljcm9jb2RlX25hbWUpOworCisJCS8qIGRpc2FibGUgdG9rZW4tcmluZyBidXMgdGhyb3VnaCBPRkRNIGJsb2NrIGZvciBwb3NzaWJsZSB1Y29kZSB1cGxvYWQgKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX09GRE1fU0hfT0ZETV9SSU5HX0VOQUJMRV9fQSwgU0lPX09GRE1fU0hfT0ZETV9SSU5HX0VOQUJMRV9PRkYpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJLyogUnVuIFNDVSBmb3IgYSBsaXR0bGUgd2hpbGUgdG8gaW5pdGlhbGl6ZSBtaWNyb2NvZGUgdmVyc2lvbiBudW1iZXJzICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9DT01NX0VYRUNfX0EsIFNDVV9DT01NX0VYRUNfQUNUSVZFKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSBEUlhYX09wZW4oc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCS8qIGFkZGVkIGZvciB0ZXN0ICovCisJCW1zbGVlcCgzMCk7CisKKwkJcG93ZXJNb2RlID0gRFJYS19QT1dFUl9ET1dOX09GRE07CisJCXN0YXR1cyA9IEN0cmxQb3dlck1vZGUoc3RhdGUsICZwb3dlck1vZGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJLyogU3RhbXAgZHJpdmVyIHZlcnNpb24gbnVtYmVyIGluIFNDVSBkYXRhIFJBTSBpbiBCQ0QgY29kZQorCQkJRG9uZSB0byBlbmFibGUgZmllbGQgYXBwbGljYXRpb24gZW5naW5lZXJzIHRvIHJldHJlaXZlIGRyeGRyaXZlciB2ZXJzaW9uCisJCQl2aWEgSTJDIGZyb20gU0NVIFJBTS4KKwkJCU5vdCB1c2luZyBTQ1UgY29tbWFuZCBpbnRlcmZhY2UgZm9yIFNDVSByZWdpc3RlciBhY2Nlc3Mgc2luY2Ugbm8KKwkJCW1pY3JvY29kZSBtYXkgYmUgcHJlc2VudC4KKwkJCSovCisJCWRyaXZlclZlcnNpb24gPQorCQkJKCgoRFJYS19WRVJTSU9OX01BSk9SIC8gMTAwKSAlIDEwKSA8PCAxMikgKworCQkJKCgoRFJYS19WRVJTSU9OX01BSk9SIC8gMTApICUgMTApIDw8IDgpICsKKwkJCSgoRFJYS19WRVJTSU9OX01BSk9SICUgMTApIDw8IDQpICsKKwkJCShEUlhLX1ZFUlNJT05fTUlOT1IgJSAxMCk7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fRFJJVkVSX1ZFUl9ISV9fQSwgZHJpdmVyVmVyc2lvbik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJZHJpdmVyVmVyc2lvbiA9CisJCQkoKChEUlhLX1ZFUlNJT05fUEFUQ0ggLyAxMDAwKSAlIDEwKSA8PCAxMikgKworCQkJKCgoRFJYS19WRVJTSU9OX1BBVENIIC8gMTAwKSAlIDEwKSA8PCA4KSArCisJCQkoKChEUlhLX1ZFUlNJT05fUEFUQ0ggLyAxMCkgJSAxMCkgPDwgNCkgKworCQkJKERSWEtfVkVSU0lPTl9QQVRDSCAlIDEwKTsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9EUklWRVJfVkVSX0xPX19BLCBkcml2ZXJWZXJzaW9uKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCXByaW50ayhLRVJOX0lORk8gIkRSWEsgZHJpdmVyIHZlcnNpb24gJWQuJWQuJWRcbiIsCisJCQlEUlhLX1ZFUlNJT05fTUFKT1IsIERSWEtfVkVSU0lPTl9NSU5PUiwKKwkJCURSWEtfVkVSU0lPTl9QQVRDSCk7CisKKwkJLyogRGlydHkgZml4IG9mIGRlZmF1bHQgdmFsdWVzIGZvciBST00vUEFUQ0ggbWljcm9jb2RlCisJCQlEaXJ0eSBiZWNhdXNlIHRoaXMgZml4IG1ha2VzIGl0IGltcG9zc2libGUgdG8gc2V0dXAgc3VpdGFibGUgdmFsdWVzCisJCQliZWZvcmUgY2FsbGluZyBEUlhfT3Blbi4gVGhpcyBzb2x1dGlvbiByZXF1aXJlcyBjaGFuZ2VzIHRvIFJGIEFHQyBzcGVlZAorCQkJdG8gYmUgZG9uZSB2aWEgdGhlIENUUkwgZnVuY3Rpb24gYWZ0ZXIgY2FsbGluZyBEUlhfT3BlbiAqLworCisJCS8qIG1fZHZidFJmQWdjQ2ZnLnNwZWVkID0gMzsgKi8KKworCQkvKiBSZXNldCBkcml2ZXIgZGVidWcgZmxhZ3MgdG8gMCAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0RSSVZFUl9ERUJVR19fQSwgMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJLyogZHJpdmVyIDAuOS4wICovCisJCS8qIFNldHVwIEZFQyBPQzoKKwkJCU5PVEU6IE5vIG1vcmUgZnVsbCBGRUMgcmVzZXRzIGFsbG93ZWQgYWZ0ZXJ3YXJkcyEhICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19DT01NX0VYRUNfX0EsIEZFQ19DT01NX0VYRUNfU1RPUCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJLyogTVBFR1RTIGZ1bmN0aW9ucyBhcmUgc3RpbGwgdGhlIHNhbWUgKi8KKwkJc3RhdHVzID0gTVBFR1RTRHRvSW5pdChzdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gTVBFR1RTU3RvcChzdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gTVBFR1RTQ29uZmlndXJlUG9sYXJpdHkoc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IE1QRUdUU0NvbmZpZ3VyZVBpbnMoc3RhdGUsIHN0YXRlLT5tX2VuYWJsZU1QRUdPdXRwdXQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCS8qIGFkZGVkOiBjb25maWd1cmUgR1BJTyAqLworCQlzdGF0dXMgPSBXcml0ZUdQSU8oc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJc3RhdGUtPm1fRHJ4a1N0YXRlID0gRFJYS19TVE9QUEVEOworCisJCWlmIChzdGF0ZS0+bV9iUG93ZXJEb3duKSB7CisJCQlzdGF0dXMgPSBQb3dlckRvd25EZXZpY2Uoc3RhdGUpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCXN0YXRlLT5tX0RyeGtTdGF0ZSA9IERSWEtfUE9XRVJFRF9ET1dOOworCQl9IGVsc2UKKwkJCXN0YXRlLT5tX0RyeGtTdGF0ZSA9IERSWEtfU1RPUFBFRDsKKwl9CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBkcnhrX2NfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWRwcmludGsoMSwgIlxuIik7CisJa2ZyZWUoc3RhdGUpOworfQorCitzdGF0aWMgaW50IGRyeGtfY19pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJZHByaW50aygxLCAiXG4iKTsKKwlpZiAobXV0ZXhfdHJ5bG9jaygmc3RhdGUtPmN0bG9jaykgPT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKwlTZXRPcGVyYXRpb25Nb2RlKHN0YXRlLCBPTV9RQU1fSVRVX0EpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRyeGtfY19zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWRwcmludGsoMSwgIlxuIik7CisJU2h1dERvd24oc3RhdGUpOworCW11dGV4X3VubG9jaygmc3RhdGUtPmN0bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJ4a19nYXRlX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBlbmFibGUpCit7CisJc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlkcHJpbnRrKDEsICIlc1xuIiwgZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCXJldHVybiBDb25maWd1cmVJMkNCcmlkZ2Uoc3RhdGUsIGVuYWJsZSA/IHRydWUgOiBmYWxzZSk7Cit9CisKK3N0YXRpYyBpbnQgZHJ4a19zZXRfcGFyYW1ldGVycyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCSAgICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTMyIElGOworCisJZHByaW50aygxLCAiXG4iKTsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCWlmIChmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKQorCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBwKTsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOworCXN0YXRlLT5wYXJhbSA9ICpwOworCWZlLT5vcHMudHVuZXJfb3BzLmdldF9mcmVxdWVuY3koZmUsICZJRik7CisJU3RhcnQoc3RhdGUsIDAsIElGKTsKKworCS8qIHByaW50ayhLRVJOX0RFQlVHICJkcnhrOiAlcyBJRj0lZCBkb25lXG4iLCBfX2Z1bmNfXywgSUYpOyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJ4a19jX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCSAgICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJZHByaW50aygxLCAiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcnhrX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBmZV9zdGF0dXNfdCAqc3RhdHVzKQoreworCXN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXUzMiBzdGF0OworCisJZHByaW50aygxLCAiXG4iKTsKKwkqc3RhdHVzID0gMDsKKwlHZXRMb2NrU3RhdHVzKHN0YXRlLCAmc3RhdCwgMCk7CisJaWYgKHN0YXQgPT0gTVBFR19MT0NLKQorCQkqc3RhdHVzIHw9IDB4MWY7CisJaWYgKHN0YXQgPT0gRkVDX0xPQ0spCisJCSpzdGF0dXMgfD0gMHgwZjsKKwlpZiAoc3RhdCA9PSBERU1PRF9MT0NLKQorCQkqc3RhdHVzIHw9IDB4MDc7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJ4a19yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpiZXIpCit7CisJZHByaW50aygxLCAiXG4iKTsKKworCSpiZXIgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRyeGtfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJICAgICB1MTYgKnN0cmVuZ3RoKQoreworCXN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXUzMiB2YWwgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKwlSZWFkSUZBZ2Moc3RhdGUsICZ2YWwpOworCSpzdHJlbmd0aCA9IHZhbCAmIDB4ZmZmZjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcnhrX3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MTYgKnNucikKK3sKKwlzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzMzIgc25yMjsKKworCWRwcmludGsoMSwgIlxuIik7CisJR2V0U2lnbmFsVG9Ob2lzZShzdGF0ZSwgJnNucjIpOworCSpzbnIgPSBzbnIyICYgMHhmZmZmOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRyeGtfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICp1Y2Jsb2NrcykKK3sKKwlzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1MTYgZXJyOworCisJZHByaW50aygxLCAiXG4iKTsKKwlEVkJUUUFNR2V0QWNjUGt0RXJyKHN0YXRlLCAmZXJyKTsKKwkqdWNibG9ja3MgPSAodTMyKSBlcnI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJ4a19jX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MKKwkJCQkgICAgKnNldHMpCit7CisJZHByaW50aygxLCAiXG4iKTsKKwlzZXRzLT5taW5fZGVsYXlfbXMgPSAzMDAwOworCXNldHMtPm1heF9kcmlmdCA9IDA7CisJc2V0cy0+c3RlcF9zaXplID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHJ4a190X3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJLyoKKwkgKiBUaGVyZSdzIG5vdGhpbmcgdG8gcmVsZWFzZSBoZXJlLCBhcyB0aGUgc3RhdGUgc3RydWN0CisJICogaXMgYWxyZWFkeSBmcmVlZCBieSBkcnhrX2NfcmVsZWFzZS4KKwkgKi8KK30KKworc3RhdGljIGludCBkcnhrX3RfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWRwcmludGsoMSwgIlxuIik7CisJaWYgKG11dGV4X3RyeWxvY2soJnN0YXRlLT5jdGxvY2spID09IDApCisJCXJldHVybiAtRUJVU1k7CisJU2V0T3BlcmF0aW9uTW9kZShzdGF0ZSwgT01fRFZCVCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJ4a190X3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJZHByaW50aygxLCAiXG4iKTsKKwltdXRleF91bmxvY2soJnN0YXRlLT5jdGxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRyeGtfdF9nZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkgICAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCWRwcmludGsoMSwgIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGRyeGtfY19vcHMgPSB7CisJLmluZm8gPSB7CisJCSAubmFtZSA9ICJEUlhLIERWQi1DIiwKKwkJIC50eXBlID0gRkVfUUFNLAorCQkgLmZyZXF1ZW5jeV9zdGVwc2l6ZSA9IDYyNTAwLAorCQkgLmZyZXF1ZW5jeV9taW4gPSA0NzAwMDAwMCwKKwkJIC5mcmVxdWVuY3lfbWF4ID0gODYyMDAwMDAwLAorCQkgLnN5bWJvbF9yYXRlX21pbiA9IDg3MDAwMCwKKwkJIC5zeW1ib2xfcmF0ZV9tYXggPSAxMTcwMDAwMCwKKwkJIC5jYXBzID0gRkVfQ0FOX1FBTV8xNiB8IEZFX0NBTl9RQU1fMzIgfCBGRV9DQU5fUUFNXzY0IHwKKwkJIEZFX0NBTl9RQU1fMTI4IHwgRkVfQ0FOX1FBTV8yNTYgfCBGRV9DQU5fRkVDX0FVVE99LAorCS5yZWxlYXNlID0gZHJ4a19jX3JlbGVhc2UsCisJLmluaXQgPSBkcnhrX2NfaW5pdCwKKwkuc2xlZXAgPSBkcnhrX2Nfc2xlZXAsCisJLmkyY19nYXRlX2N0cmwgPSBkcnhrX2dhdGVfY3RybCwKKworCS5zZXRfZnJvbnRlbmQgPSBkcnhrX3NldF9wYXJhbWV0ZXJzLAorCS5nZXRfZnJvbnRlbmQgPSBkcnhrX2NfZ2V0X2Zyb250ZW5kLAorCS5nZXRfdHVuZV9zZXR0aW5ncyA9IGRyeGtfY19nZXRfdHVuZV9zZXR0aW5ncywKKworCS5yZWFkX3N0YXR1cyA9IGRyeGtfcmVhZF9zdGF0dXMsCisJLnJlYWRfYmVyID0gZHJ4a19yZWFkX2JlciwKKwkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBkcnhrX3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAorCS5yZWFkX3NuciA9IGRyeGtfcmVhZF9zbnIsCisJLnJlYWRfdWNibG9ja3MgPSBkcnhrX3JlYWRfdWNibG9ja3MsCit9OworCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgZHJ4a190X29wcyA9IHsKKwkuaW5mbyA9IHsKKwkJIC5uYW1lID0gIkRSWEsgRFZCLVQiLAorCQkgLnR5cGUgPSBGRV9PRkRNLAorCQkgLmZyZXF1ZW5jeV9taW4gPSA0NzEyNTAwMCwKKwkJIC5mcmVxdWVuY3lfbWF4ID0gODY1MDAwMDAwLAorCQkgLmZyZXF1ZW5jeV9zdGVwc2l6ZSA9IDE2NjY2NywKKwkJIC5mcmVxdWVuY3lfdG9sZXJhbmNlID0gMCwKKwkJIC5jYXBzID0gRkVfQ0FOX0ZFQ18xXzIgfCBGRV9DQU5fRkVDXzJfMyB8CisJCSBGRV9DQU5fRkVDXzNfNCB8IEZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ183XzggfAorCQkgRkVfQ0FOX0ZFQ19BVVRPIHwKKwkJIEZFX0NBTl9RQU1fMTYgfCBGRV9DQU5fUUFNXzY0IHwKKwkJIEZFX0NBTl9RQU1fQVVUTyB8CisJCSBGRV9DQU5fVFJBTlNNSVNTSU9OX01PREVfQVVUTyB8CisJCSBGRV9DQU5fR1VBUkRfSU5URVJWQUxfQVVUTyB8CisJCSBGRV9DQU5fSElFUkFSQ0hZX0FVVE8gfCBGRV9DQU5fUkVDT1ZFUiB8IEZFX0NBTl9NVVRFX1RTfSwKKwkucmVsZWFzZSA9IGRyeGtfdF9yZWxlYXNlLAorCS5pbml0ID0gZHJ4a190X2luaXQsCisJLnNsZWVwID0gZHJ4a190X3NsZWVwLAorCS5pMmNfZ2F0ZV9jdHJsID0gZHJ4a19nYXRlX2N0cmwsCisKKwkuc2V0X2Zyb250ZW5kID0gZHJ4a19zZXRfcGFyYW1ldGVycywKKwkuZ2V0X2Zyb250ZW5kID0gZHJ4a190X2dldF9mcm9udGVuZCwKKworCS5yZWFkX3N0YXR1cyA9IGRyeGtfcmVhZF9zdGF0dXMsCisJLnJlYWRfYmVyID0gZHJ4a19yZWFkX2JlciwKKwkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBkcnhrX3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAorCS5yZWFkX3NuciA9IGRyeGtfcmVhZF9zbnIsCisJLnJlYWRfdWNibG9ja3MgPSBkcnhrX3JlYWRfdWNibG9ja3MsCit9OworCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkcnhrX2F0dGFjaChjb25zdCBzdHJ1Y3QgZHJ4a19jb25maWcgKmNvbmZpZywKKwkJCQkgc3RydWN0IGkyY19hZGFwdGVyICppMmMsCisJCQkJIHN0cnVjdCBkdmJfZnJvbnRlbmQgKipmZV90KQoreworCXN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSA9IE5VTEw7CisJdTggYWRyID0gY29uZmlnLT5hZHI7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCXN0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRyeGtfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0YXRlKQorCQlyZXR1cm4gTlVMTDsKKworCXN0YXRlLT5pMmMgPSBpMmM7CisJc3RhdGUtPmRlbW9kX2FkZHJlc3MgPSBhZHI7CisJc3RhdGUtPnNpbmdsZV9tYXN0ZXIgPSBjb25maWctPnNpbmdsZV9tYXN0ZXI7CisJc3RhdGUtPm1pY3JvY29kZV9uYW1lID0gY29uZmlnLT5taWNyb2NvZGVfbmFtZTsKKwlzdGF0ZS0+bm9faTJjX2JyaWRnZSA9IGNvbmZpZy0+bm9faTJjX2JyaWRnZTsKKwlzdGF0ZS0+YW50ZW5uYV9ncGlvID0gY29uZmlnLT5hbnRlbm5hX2dwaW87CisJc3RhdGUtPmFudGVubmFfZHZidCA9IGNvbmZpZy0+YW50ZW5uYV9kdmJ0OworCisJLyogTk9URTogYXMgbW9yZSBVSU8gYml0cyB3aWxsIGJlIHVzZWQsIGFkZCB0aGVtIHRvIHRoZSBtYXNrICovCisJc3RhdGUtPlVJT19tYXNrID0gY29uZmlnLT5hbnRlbm5hX2dwaW87CisKKwkvKiBEZWZhdWx0IGdwaW8gdG8gRFZCLUMgKi8KKwlpZiAoIXN0YXRlLT5hbnRlbm5hX2R2YnQgJiYgc3RhdGUtPmFudGVubmFfZ3BpbykKKwkJc3RhdGUtPm1fR1BJTyB8PSBzdGF0ZS0+YW50ZW5uYV9ncGlvOworCWVsc2UKKwkJc3RhdGUtPm1fR1BJTyAmPSB+c3RhdGUtPmFudGVubmFfZ3BpbzsKKworCW11dGV4X2luaXQoJnN0YXRlLT5tdXRleCk7CisJbXV0ZXhfaW5pdCgmc3RhdGUtPmN0bG9jayk7CisKKwltZW1jcHkoJnN0YXRlLT5jX2Zyb250ZW5kLm9wcywgJmRyeGtfY19vcHMsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCW1lbWNweSgmc3RhdGUtPnRfZnJvbnRlbmQub3BzLCAmZHJ4a190X29wcywKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CisJc3RhdGUtPmNfZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOworCXN0YXRlLT50X2Zyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKKworCWluaXRfc3RhdGUoc3RhdGUpOworCWlmIChpbml0X2RyeGsoc3RhdGUpIDwgMCkKKwkJZ290byBlcnJvcjsKKwkqZmVfdCA9ICZzdGF0ZS0+dF9mcm9udGVuZDsKKworCXJldHVybiAmc3RhdGUtPmNfZnJvbnRlbmQ7CisKK2Vycm9yOgorCXByaW50ayhLRVJOX0VSUiAiZHJ4azogbm90IGZvdW5kXG4iKTsKKwlrZnJlZShzdGF0ZSk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGRyeGtfYXR0YWNoKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJEUlgtSyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlJhbHBoIE1ldHpsZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhrX2hhcmQuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhrX2hhcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDVjMzJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeGtfaGFyZC5oCkBAIC0wLDAgKzEsMzQ4IEBACisjaW5jbHVkZSAiZHJ4a19tYXAuaCIKKworI2RlZmluZSBEUlhLX1ZFUlNJT05fTUFKT1IgMAorI2RlZmluZSBEUlhLX1ZFUlNJT05fTUlOT1IgOQorI2RlZmluZSBEUlhLX1ZFUlNJT05fUEFUQ0ggNDMwMAorCisjZGVmaW5lIEhJX0kyQ19ERUxBWSAgICAgICAgNDIKKyNkZWZpbmUgSElfSTJDX0JSSURHRV9ERUxBWSAzNTAKKyNkZWZpbmUgRFJYS19NQVhfUkVUUklFUyAgICAxMDAKKworI2RlZmluZSBEUklWRVJfNDQwMCAxCisKKyNkZWZpbmUgRFJYWF9KVEFHSUQgICAweDAzOTIxMEQ5CisjZGVmaW5lIERSWFhfSl9KVEFHSUQgMHgyMzkzMTBEOQorI2RlZmluZSBEUlhYX0tfSlRBR0lEIDB4MDM5MjEwRDkKKworI2RlZmluZSBEUlhfVU5LTk9XTiAgICAgMjU0CisjZGVmaW5lIERSWF9BVVRPICAgICAgICAyNTUKKworI2RlZmluZSBEUlhfU0NVX1JFQURZICAgMAorI2RlZmluZSBEUlhLX01BWF9XQUlUVElNRSAoMjAwKQorI2RlZmluZSBTQ1VfUkVTVUxUX09LICAgICAgMAorI2RlZmluZSBTQ1VfUkVTVUxUX1NJWkUgICAtNAorI2RlZmluZSBTQ1VfUkVTVUxUX0lOVlBBUiAtMworI2RlZmluZSBTQ1VfUkVTVUxUX1VOS1NURCAtMgorI2RlZmluZSBTQ1VfUkVTVUxUX1VOS0NNRCAtMQorCisjaWZuZGVmIERSWEtfT0ZETV9UUl9TSFVURE9XTl9USU1FT1VUCisjZGVmaW5lIERSWEtfT0ZETV9UUl9TSFVURE9XTl9USU1FT1VUICgyMDApCisjZW5kaWYKKworI2RlZmluZSBEUlhLXzhWU0JfTVBFR19CSVRfUkFURSAgICAgMTkzOTI2NThVTCAgLypicHMqLworI2RlZmluZSBEUlhLX0RWQlRfTVBFR19CSVRfUkFURSAgICAgMzIwMDAwMDBVTCAgLypicHMqLworI2RlZmluZSBEUlhLX1FBTTE2X01QRUdfQklUX1JBVEUgICAgMjcwMDAwMDBVTCAgLypicHMqLworI2RlZmluZSBEUlhLX1FBTTMyX01QRUdfQklUX1JBVEUgICAgMzMwMDAwMDBVTCAgLypicHMqLworI2RlZmluZSBEUlhLX1FBTTY0X01QRUdfQklUX1JBVEUgICAgNDAwMDAwMDBVTCAgLypicHMqLworI2RlZmluZSBEUlhLX1FBTTEyOF9NUEVHX0JJVF9SQVRFICAgNDYwMDAwMDBVTCAgLypicHMqLworI2RlZmluZSBEUlhLX1FBTTI1Nl9NUEVHX0JJVF9SQVRFICAgNTIwMDAwMDBVTCAgLypicHMqLworI2RlZmluZSBEUlhLX01BWF9NUEVHX0JJVF9SQVRFICAgICAgNTIwMDAwMDBVTCAgLypicHMqLworCisjZGVmaW5lICAgSVFNX0NGX09VVF9FTkFfT0ZETV9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lICAgICBJUU1fRlNfQURKX1NFTF9CX1FBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgICBJUU1fRlNfQURKX1NFTF9CX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgICBJUU1fRlNfQURKX1NFTF9CX1ZTQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lICAgICBJUU1fUkNfQURKX1NFTF9CX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgICBJUU1fUkNfQURKX1NFTF9CX1FBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgICBJUU1fUkNfQURKX1NFTF9CX1ZTQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisKK2VudW0gT3BlcmF0aW9uTW9kZSB7CisJT01fTk9ORSwKKwlPTV9RQU1fSVRVX0EsCisJT01fUUFNX0lUVV9CLAorCU9NX1FBTV9JVFVfQywKKwlPTV9EVkJUCit9OworCitlbnVtIERSWFBvd2VyTW9kZSB7CisJRFJYX1BPV0VSX1VQID0gMCwKKwlEUlhfUE9XRVJfTU9ERV8xLAorCURSWF9QT1dFUl9NT0RFXzIsCisJRFJYX1BPV0VSX01PREVfMywKKwlEUlhfUE9XRVJfTU9ERV80LAorCURSWF9QT1dFUl9NT0RFXzUsCisJRFJYX1BPV0VSX01PREVfNiwKKwlEUlhfUE9XRVJfTU9ERV83LAorCURSWF9QT1dFUl9NT0RFXzgsCisKKwlEUlhfUE9XRVJfTU9ERV85LAorCURSWF9QT1dFUl9NT0RFXzEwLAorCURSWF9QT1dFUl9NT0RFXzExLAorCURSWF9QT1dFUl9NT0RFXzEyLAorCURSWF9QT1dFUl9NT0RFXzEzLAorCURSWF9QT1dFUl9NT0RFXzE0LAorCURSWF9QT1dFUl9NT0RFXzE1LAorCURSWF9QT1dFUl9NT0RFXzE2LAorCURSWF9QT1dFUl9ET1dOID0gMjU1Cit9OworCisKKy8qKiAvYnJpZWYgSW50ZXJtZWRpYXRlIHBvd2VyIG1vZGUgZm9yIERSWEssIHBvd2VyIGRvd24gT0ZETSBjbG9jayBkb21haW4gKi8KKyNpZm5kZWYgRFJYS19QT1dFUl9ET1dOX09GRE0KKyNkZWZpbmUgRFJYS19QT1dFUl9ET1dOX09GRE0gICAgICAgIERSWF9QT1dFUl9NT0RFXzEKKyNlbmRpZgorCisvKiogL2JyaWVmIEludGVybWVkaWF0ZSBwb3dlciBtb2RlIGZvciBEUlhLLCBwb3dlciBkb3duIGNvcmUgKHN5c2NsaykgKi8KKyNpZm5kZWYgRFJYS19QT1dFUl9ET1dOX0NPUkUKKyNkZWZpbmUgRFJYS19QT1dFUl9ET1dOX0NPUkUgICAgICAgIERSWF9QT1dFUl9NT0RFXzkKKyNlbmRpZgorCisvKiogL2JyaWVmIEludGVybWVkaWF0ZSBwb3dlciBtb2RlIGZvciBEUlhLLCBwb3dlciBkb3duIHBsbCAob25seSBvc2MgcnVucykgKi8KKyNpZm5kZWYgRFJYS19QT1dFUl9ET1dOX1BMTAorI2RlZmluZSBEUlhLX1BPV0VSX0RPV05fUExMICAgICAgICAgRFJYX1BPV0VSX01PREVfMTAKKyNlbmRpZgorCisKK2VudW0gQUdDX0NUUkxfTU9ERSB7IERSWEtfQUdDX0NUUkxfQVVUTyA9IDAsIERSWEtfQUdDX0NUUkxfVVNFUiwgRFJYS19BR0NfQ1RSTF9PRkYgfTsKK2VudW0gRURyeGtTdGF0ZSB7IERSWEtfVU5JTklUSUFMSVpFRCA9IDAsIERSWEtfU1RPUFBFRCwgRFJYS19EVFZfU1RBUlRFRCwgRFJYS19BVFZfU1RBUlRFRCwgRFJYS19QT1dFUkVEX0RPV04gfTsKK2VudW0gRURyeGtDb2VmQXJyYXlJbmRleCB7CisJRFJYS19DT0VGX0lEWF9NTiA9IDAsCisJRFJYS19DT0VGX0lEWF9GTSAgICAsCisJRFJYS19DT0VGX0lEWF9MICAgICAsCisJRFJYS19DT0VGX0lEWF9MUCAgICAsCisJRFJYS19DT0VGX0lEWF9CRyAgICAsCisJRFJYS19DT0VGX0lEWF9ESyAgICAsCisJRFJYS19DT0VGX0lEWF9JICAgICAsCisJRFJYS19DT0VGX0lEWF9NQVgKK307CitlbnVtIEVEcnhrU2lmQXR0ZW51YXRpb24geworCURSWEtfU0lGX0FUVEVOVUFUSU9OXzBEQiwKKwlEUlhLX1NJRl9BVFRFTlVBVElPTl8zREIsCisJRFJYS19TSUZfQVRURU5VQVRJT05fNkRCLAorCURSWEtfU0lGX0FUVEVOVUFUSU9OXzlEQgorfTsKK2VudW0gRURyeGtDb25zdGVsbGF0aW9uIHsKKwlEUlhfQ09OU1RFTExBVElPTl9CUFNLID0gMCwKKwlEUlhfQ09OU1RFTExBVElPTl9RUFNLLAorCURSWF9DT05TVEVMTEFUSU9OX1BTSzgsCisJRFJYX0NPTlNURUxMQVRJT05fUUFNMTYsCisJRFJYX0NPTlNURUxMQVRJT05fUUFNMzIsCisJRFJYX0NPTlNURUxMQVRJT05fUUFNNjQsCisJRFJYX0NPTlNURUxMQVRJT05fUUFNMTI4LAorCURSWF9DT05TVEVMTEFUSU9OX1FBTTI1NiwKKwlEUlhfQ09OU1RFTExBVElPTl9RQU01MTIsCisJRFJYX0NPTlNURUxMQVRJT05fUUFNMTAyNCwKKwlEUlhfQ09OU1RFTExBVElPTl9VTktOT1dOID0gRFJYX1VOS05PV04sCisJRFJYX0NPTlNURUxMQVRJT05fQVVUTyAgICA9IERSWF9BVVRPCit9OworZW51bSBFRHJ4a0ludGVybGVhdmVNb2RlIHsKKwlEUlhLX1FBTV9JMTJfSjE3ICAgID0gMTYsCisJRFJYS19RQU1fSV9VTktOT1dOICA9IERSWF9VTktOT1dOCit9OworZW51bSB7CisJRFJYS19TUElOX0ExID0gMCwKKwlEUlhLX1NQSU5fQTIsCisJRFJYS19TUElOX0EzLAorCURSWEtfU1BJTl9VTktOT1dOCit9OworCitlbnVtIERSWEtDZmdEdmJ0U3FpU3BlZWQgeworCURSWEtfRFZCVF9TUUlfU1BFRURfRkFTVCA9IDAsCisJRFJYS19EVkJUX1NRSV9TUEVFRF9NRURJVU0sCisJRFJYS19EVkJUX1NRSV9TUEVFRF9TTE9XLAorCURSWEtfRFZCVF9TUUlfU1BFRURfVU5LTk9XTiA9IERSWF9VTktOT1dOCit9IDsKKworZW51bSBEUlhGZnRtb2RlX3QgeworCURSWF9GRlRNT0RFXzJLID0gMCwKKwlEUlhfRkZUTU9ERV80SywKKwlEUlhfRkZUTU9ERV84SywKKwlEUlhfRkZUTU9ERV9VTktOT1dOID0gRFJYX1VOS05PV04sCisJRFJYX0ZGVE1PREVfQVVUTyAgICA9IERSWF9BVVRPCit9OworCitlbnVtIERSWE1QRUdTdHJXaWR0aF90IHsKKwlEUlhfTVBFR19TVFJfV0lEVEhfMSwKKwlEUlhfTVBFR19TVFJfV0lEVEhfOAorfTsKKworZW51bSBEUlhRYW1Mb2NrUmFuZ2VfdCB7CisJRFJYX1FBTV9MT0NLUkFOR0VfTk9STUFMLAorCURSWF9RQU1fTE9DS1JBTkdFX0VYVEVOREVECit9OworCitzdHJ1Y3QgRFJYS0NmZ0R2YnRFY2hvVGhyZXNfdCB7CisJdTE2ICAgICAgICAgICAgIHRocmVzaG9sZDsKKwllbnVtIERSWEZmdG1vZGVfdCAgICAgIGZmdE1vZGU7Cit9IDsKKworc3RydWN0IFNDZmdBZ2MgeworCWVudW0gQUdDX0NUUkxfTU9ERSAgICAgY3RybE1vZGU7ICAgICAgICAvKiBvZmYsIHVzZXIsIGF1dG8gKi8KKwl1MTYgICAgICAgICAgICBvdXRwdXRMZXZlbDsgICAgIC8qIHJhbmdlIGRlcGVuZGVudCBvbiBBR0MgKi8KKwl1MTYgICAgICAgICAgICBtaW5PdXRwdXRMZXZlbDsgIC8qIHJhbmdlIGRlcGVuZGVudCBvbiBBR0MgKi8KKwl1MTYgICAgICAgICAgICBtYXhPdXRwdXRMZXZlbDsgIC8qIHJhbmdlIGRlcGVuZGVudCBvbiBBR0MgKi8KKwl1MTYgICAgICAgICAgICBzcGVlZDsgICAgICAgICAgIC8qIHJhbmdlIGRlcGVuZGVudCBvbiBBR0MgKi8KKwl1MTYgICAgICAgICAgICB0b3A7ICAgICAgICAgICAgIC8qIHJmLWFnYyB0YWtlIG92ZXIgcG9pbnQgKi8KKwl1MTYgICAgICAgICAgICBjdXRPZmZDdXJyZW50OyAgIC8qIHJmLWFnYyBpcyBhY2NlbGVyYXRlZCBpZiBvdXRwdXQgY3VycmVudAorCQkJCQkgICBpcyBiZWxvdyBjdXQtb2ZmIGN1cnJlbnQgKi8KKwl1MTYgICAgICAgICAgICBJbmdhaW5UZ3RNYXg7CisJdTE2ICAgICAgICAgICAgRmFzdENsaXBDdHJsRGVsYXk7Cit9OworCitzdHJ1Y3QgU0NmZ1ByZVNhdyB7CisJdTE2ICAgICAgICByZWZlcmVuY2U7IC8qIHByZSBTQVcgcmVmZXJlbmNlIHZhbHVlLCByYW5nZSAwIC4uIDMxICovCisJYm9vbCAgICAgICAgICB1c2VQcmVTYXc7IC8qIFRSVUUgYWxnb3JpdGhtcyBtdXN0IHVzZSBwcmUgU0FXIHNlbnNlICovCit9OworCitzdHJ1Y3QgRFJYS09mZG1TY0NtZF90IHsKKwl1MTYgY21kOyAgICAgICAgLyoqPCBDb21tYW5kIG51bWJlciAqLworCXUxNiBzdWJjbWQ7ICAgICAvKio8IFN1Yi1jb21tYW5kIHBhcmFtZXRlciovCisJdTE2IHBhcmFtMDsgICAgIC8qKjwgR2VuZXJhbCBwdXJwb3VzIHBhcmFtICovCisJdTE2IHBhcmFtMTsgICAgIC8qKjwgR2VuZXJhbCBwdXJwb3VzIHBhcmFtICovCisJdTE2IHBhcmFtMjsgICAgIC8qKjwgR2VuZXJhbCBwdXJwb3VzIHBhcmFtICovCisJdTE2IHBhcmFtMzsgICAgIC8qKjwgR2VuZXJhbCBwdXJwb3VzIHBhcmFtICovCisJdTE2IHBhcmFtNDsgICAgIC8qKjwgR2VuZXJhbCBwdXJwb3VzIHBhcmFtICovCit9OworCitzdHJ1Y3QgZHJ4a19zdGF0ZSB7CisJc3RydWN0IGR2Yl9mcm9udGVuZCBjX2Zyb250ZW5kOworCXN0cnVjdCBkdmJfZnJvbnRlbmQgdF9mcm9udGVuZDsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgcGFyYW07CisJc3RydWN0IGRldmljZSAqZGV2OworCisJc3RydWN0IGkyY19hZGFwdGVyICppMmM7CisJdTggICAgIGRlbW9kX2FkZHJlc3M7CisJdm9pZCAgKnByaXY7CisKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJc3RydWN0IG11dGV4IGN0bG9jazsKKworCXUzMiAgICBtX0luc3RhbmNlOyAgICAgICAgICAgLyoqPCBDaGFubmVsIDEsMiwzIG9yIDQgKi8KKworCWludCAgICBtX0NodW5rU2l6ZTsKKwl1OCBDaHVua1syNTZdOworCisJYm9vbCAgIG1faGFzTE5BOworCWJvb2wgICBtX2hhc0RWQlQ7CisJYm9vbCAgIG1faGFzRFZCQzsKKwlib29sICAgbV9oYXNBdWRpbzsKKwlib29sICAgbV9oYXNBVFY7CisJYm9vbCAgIG1faGFzT09COworCWJvb2wgICBtX2hhc1NBV1NXOyAgICAgICAgIC8qKjwgVFJVRSBpZiBtYXRfdHggaXMgYXZhaWxhYmxlICovCisJYm9vbCAgIG1faGFzR1BJTzE7ICAgICAgICAgLyoqPCBUUlVFIGlmIG1hdF9yeCBpcyBhdmFpbGFibGUgKi8KKwlib29sICAgbV9oYXNHUElPMjsgICAgICAgICAvKio8IFRSVUUgaWYgR1BJTyBpcyBhdmFpbGFibGUgKi8KKwlib29sICAgbV9oYXNJUlFOOyAgICAgICAgICAvKio8IFRSVUUgaWYgSVJRTiBpcyBhdmFpbGFibGUgKi8KKwl1MTYgICAgbV9vc2NDbG9ja0ZyZXE7CisJdTE2ICAgIG1fSElDZmdUaW1pbmdEaXY7CisJdTE2ICAgIG1fSElDZmdCcmlkZ2VEZWxheTsKKwl1MTYgICAgbV9ISUNmZ1dha2VVcEtleTsKKwl1MTYgICAgbV9ISUNmZ1RpbWVvdXQ7CisJdTE2ICAgIG1fSElDZmdDdHJsOworCXMzMiAgICBtX3N5c0Nsb2NrRnJlcTsgICAgICAvKio8IHN5c3RlbSBjbG9jayBmcmVxdWVuY3kgaW4ga0h6ICovCisKKwllbnVtIEVEcnhrU3RhdGUgICAgbV9EcnhrU3RhdGU7ICAgICAgLyoqPCBTdGF0ZSBvZiBEcnhrIChpbml0LHN0b3BwZWQsc3RhcnRlZCkgKi8KKwllbnVtIE9wZXJhdGlvbk1vZGUgbV9PcGVyYXRpb25Nb2RlOyAgLyoqPCBkaWdpdGFsIHN0YW5kYXJkcyAqLworCXN0cnVjdCBTQ2ZnQWdjICAgICBtX3ZzYlJmQWdjQ2ZnOyAgICAvKio8IHNldHRpbmdzIGZvciBWU0IgUkYtQUdDICovCisJc3RydWN0IFNDZmdBZ2MgICAgIG1fdnNiSWZBZ2NDZmc7ICAgIC8qKjwgc2V0dGluZ3MgZm9yIFZTQiBJRi1BR0MgKi8KKwl1MTYgICAgICAgICAgICAgICAgbV92c2JQZ2FDZmc7ICAgICAgLyoqPCBzZXR0aW5ncyBmb3IgVlNCIFBHQSAqLworCXN0cnVjdCBTQ2ZnUHJlU2F3ICBtX3ZzYlByZVNhd0NmZzsgICAvKio8IHNldHRpbmdzIGZvciBwcmUgU0FXIHNlbnNlICovCisJczMyICAgIG1fUXVhbGl0eTgzcGVyY2VudDsgIC8qKjwgTUVSIGxldmVsICgqMC4xIGRCKSBmb3IgODMlIHF1YWxpdHkgaW5kaWNhdGlvbiAqLworCXMzMiAgICBtX1F1YWxpdHk5M3BlcmNlbnQ7ICAvKio8IE1FUiBsZXZlbCAoKjAuMSBkQikgZm9yIDkzJSBxdWFsaXR5IGluZGljYXRpb24gKi8KKwlib29sICAgbV9zbWFydEFudEludmVydGVkOworCWJvb2wgICBtX2JEZWJ1Z0VuYWJsZUJyaWRnZTsKKwlib29sICAgbV9iUERvd25PcGVuQnJpZGdlOyAgLyoqPCBvbmx5IG9wZW4gRFJYSyBicmlkZ2UgYmVmb3JlIHBvd2VyLWRvd24gb25jZSBpdCBoYXMgYmVlbiBhY2Nlc3NlZCAqLworCWJvb2wgICBtX2JQb3dlckRvd247ICAgICAgICAvKio8IFBvd2VyIGRvd24gd2hlbiBub3QgdXNlZCAqLworCisJdTMyICAgIG1fSXFtRnNSYXRlT2ZzOyAgICAgIC8qKjwgZnJlcXVlbmN5IHNoaWZ0IGFzIHdyaXR0ZW4gdG8gRFJYSyByZWdpc3RlciAoMjhiaXQgZml4cG9pbnQpICovCisKKwlib29sICAgbV9lbmFibGVNUEVHT3V0cHV0OyAgLyoqPCBJZiBUUlVFLCBlbmFibGUgTVBFRyBvdXRwdXQgKi8KKwlib29sICAgbV9pbnNlcnRSU0J5dGU7ICAgICAgLyoqPCBJZiBUUlVFLCBpbnNlcnQgUlMgYnl0ZSAqLworCWJvb2wgICBtX2VuYWJsZVBhcmFsbGVsOyAgICAvKio8IElmIFRSVUUsIHBhcmFsbGVsIG91dCBvdGhlcndpc2Ugc2VyaWFsICovCisJYm9vbCAgIG1faW52ZXJ0REFUQTsgICAgICAgIC8qKjwgSWYgVFJVRSwgaW52ZXJ0IERBVEEgc2lnbmFscyAqLworCWJvb2wgICBtX2ludmVydEVSUjsgICAgICAgICAvKio8IElmIFRSVUUsIGludmVydCBFUlIgc2lnbmFsICovCisJYm9vbCAgIG1faW52ZXJ0U1RSOyAgICAgICAgIC8qKjwgSWYgVFJVRSwgaW52ZXJ0IFNUUiBzaWduYWxzICovCisJYm9vbCAgIG1faW52ZXJ0VkFMOyAgICAgICAgIC8qKjwgSWYgVFJVRSwgaW52ZXJ0IFZBTCBzaWduYWxzICovCisJYm9vbCAgIG1faW52ZXJ0Q0xLOyAgICAgICAgIC8qKjwgSWYgVFJVRSwgaW52ZXJ0IENMSyBzaWduYWxzICovCisJYm9vbCAgIG1fRFZCQ1N0YXRpY0NMSzsKKwlib29sICAgbV9EVkJUU3RhdGljQ0xLOyAgICAgLyoqPCBJZiBUUlVFLCBzdGF0aWMgTVBFRyBjbG9ja3JhdGUgd2lsbAorCQkJCQkgYmUgdXNlZCwgb3RoZXJ3aXNlIGNsb2NrcmF0ZSB3aWxsCisJCQkJCSBhZGFwdCB0byB0aGUgYml0cmF0ZSBvZiB0aGUgVFMgKi8KKwl1MzIgICAgbV9EVkJUQml0cmF0ZTsKKwl1MzIgICAgbV9EVkJDQml0cmF0ZTsKKworCXU4ICAgICBtX1RTRGF0YVN0cmVuZ3RoOworCXU4ICAgICBtX1RTQ2xvY2trU3RyZW5ndGg7CisKKwllbnVtIERSWE1QRUdTdHJXaWR0aF90ICBtX3dpZHRoU1RSOyAgICAvKio8IE1QRUcgc3RhcnQgd2lkdGggKi8KKwl1MzIgICAgbV9tcGVnVHNTdGF0aWNCaXRyYXRlOyAgICAgICAgICAvKio8IE1heGltdW0gYml0cmF0ZSBpbiBiL3MgaW4gY2FzZQorCQkJCQkJICAgIHN0YXRpYyBjbG9ja3JhdGUgaXMgc2VsZWN0ZWQgKi8KKworCS8qIExBUkdFX0lOVEVHRVIgICBtX1N0YXJ0VGltZTsgKi8gICAgIC8qKjwgQ29udGFpbnMgdGhlIHRpbWUgb2YgdGhlIGxhc3QgZGVtb2Qgc3RhcnQgKi8KKwlzMzIgICAgbV9NcGVnTG9ja1RpbWVPdXQ7ICAgICAgLyoqPCBXYWl0Rm9yTG9ja1N0YXR1cyBUaW1lb3V0IChjb3VudHMgZnJvbSBzdGFydCB0aW1lKSAqLworCXMzMiAgICBtX0RlbW9kTG9ja1RpbWVPdXQ7ICAgICAvKio8IFdhaXRGb3JMb2NrU3RhdHVzIFRpbWVvdXQgKGNvdW50cyBmcm9tIHN0YXJ0IHRpbWUpICovCisKKwlib29sICAgbV9kaXNhYmxlVEVJaGFuZGxpbmc7CisKKwlib29sICAgbV9SZkFnY1BvbDsKKwlib29sICAgbV9JZkFnY1BvbDsKKworCXN0cnVjdCBTQ2ZnQWdjICAgIG1fYXR2UmZBZ2NDZmc7ICAvKio8IHNldHRpbmdzIGZvciBBVFYgUkYtQUdDICovCisJc3RydWN0IFNDZmdBZ2MgICAgbV9hdHZJZkFnY0NmZzsgIC8qKjwgc2V0dGluZ3MgZm9yIEFUViBJRi1BR0MgKi8KKwlzdHJ1Y3QgU0NmZ1ByZVNhdyBtX2F0dlByZVNhd0NmZzsgLyoqPCBzZXR0aW5ncyBmb3IgQVRWIHByZSBTQVcgc2Vuc2UgKi8KKwlib29sICAgICAgICAgICAgICBtX3BoYXNlQ29ycmVjdGlvbkJ5cGFzczsKKwlzMTYgICAgICAgICAgICAgICBtX2F0dlRvcFZpZFBlYWs7CisJdTE2ICAgICAgICAgICAgICAgbV9hdHZUb3BOb2lzZVRoOworCWVudW0gRURyeGtTaWZBdHRlbnVhdGlvbiBtX3NpZkF0dGVudWF0aW9uOworCWJvb2wgICAgICAgICAgICAgIG1fZW5hYmxlQ1ZCU091dHB1dDsKKwlib29sICAgICAgICAgICAgICBtX2VuYWJsZVNJRk91dHB1dDsKKwlib29sICAgICAgICAgICAgICBtX2JNaXJyb3JGcmVxU3BlY3Q7CisJZW51bSBFRHJ4a0NvbnN0ZWxsYXRpb24gIG1fQ29uc3RlbGxhdGlvbjsgLyoqPCBDb25zdGVsbGF0aW9uIHR5cGUgb2YgdGhlIGNoYW5uZWwgKi8KKwl1MzIgICAgICAgICAgICAgICBtX0N1cnJTeW1ib2xSYXRlOyAgICAgICAvKio8IEN1cnJlbnQgUUFNIHN5bWJvbCByYXRlICovCisJc3RydWN0IFNDZmdBZ2MgICAgbV9xYW1SZkFnY0NmZzsgICAgICAgICAgLyoqPCBzZXR0aW5ncyBmb3IgUUFNIFJGLUFHQyAqLworCXN0cnVjdCBTQ2ZnQWdjICAgIG1fcWFtSWZBZ2NDZmc7ICAgICAgICAgIC8qKjwgc2V0dGluZ3MgZm9yIFFBTSBJRi1BR0MgKi8KKwl1MTYgICAgICAgICAgICAgICBtX3FhbVBnYUNmZzsgICAgICAgICAgICAvKio8IHNldHRpbmdzIGZvciBRQU0gUEdBICovCisJc3RydWN0IFNDZmdQcmVTYXcgbV9xYW1QcmVTYXdDZmc7ICAgICAgICAgLyoqPCBzZXR0aW5ncyBmb3IgUUFNIHByZSBTQVcgc2Vuc2UgKi8KKwllbnVtIEVEcnhrSW50ZXJsZWF2ZU1vZGUgbV9xYW1JbnRlcmxlYXZlTW9kZTsgLyoqPCBRQU0gSW50ZXJsZWF2ZSBtb2RlICovCisJdTE2ICAgICAgICAgICAgICAgbV9mZWNSc1BsZW47CisJdTE2ICAgICAgICAgICAgICAgbV9mZWNSc1ByZXNjYWxlOworCisJZW51bSBEUlhLQ2ZnRHZidFNxaVNwZWVkIG1fc3FpU3BlZWQ7CisKKwl1MTYgICAgICAgICAgICAgICBtX0dQSU87CisJdTE2ICAgICAgICAgICAgICAgbV9HUElPQ2ZnOworCisJc3RydWN0IFNDZmdBZ2MgICAgbV9kdmJ0UmZBZ2NDZmc7ICAgICAvKio8IHNldHRpbmdzIGZvciBRQU0gUkYtQUdDICovCisJc3RydWN0IFNDZmdBZ2MgICAgbV9kdmJ0SWZBZ2NDZmc7ICAgICAvKio8IHNldHRpbmdzIGZvciBRQU0gSUYtQUdDICovCisJc3RydWN0IFNDZmdQcmVTYXcgbV9kdmJ0UHJlU2F3Q2ZnOyAgICAvKio8IHNldHRpbmdzIGZvciBRQU0gcHJlIFNBVyBzZW5zZSAqLworCisJdTE2ICAgICAgICAgICAgICAgbV9hZ2NGYXN0Q2xpcEN0cmxEZWxheTsKKwlib29sICAgICAgICAgICAgICBtX2FkY0NvbXBQYXNzZWQ7CisJdTE2ICAgICAgICAgICAgICAgbV9hZGNDb21wQ29lZls2NF07CisJdTE2ICAgICAgICAgICAgICAgbV9hZGNTdGF0ZTsKKworCXU4ICAgICAgICAgICAgICAgKm1fbWljcm9jb2RlOworCWludCAgICAgICAgICAgICAgIG1fbWljcm9jb2RlX2xlbmd0aDsKKwlib29sICAgICAgICAgICAgICBtX0RSWEtfQTFfUEFUQ0hfQ09ERTsKKwlib29sICAgICAgICAgICAgICBtX0RSWEtfQTFfUk9NX0NPREU7CisJYm9vbCAgICAgICAgICAgICAgbV9EUlhLX0EyX1JPTV9DT0RFOworCWJvb2wgICAgICAgICAgICAgIG1fRFJYS19BM19ST01fQ09ERTsKKwlib29sICAgICAgICAgICAgICBtX0RSWEtfQTJfUEFUQ0hfQ09ERTsKKwlib29sICAgICAgICAgICAgICBtX0RSWEtfQTNfUEFUQ0hfQ09ERTsKKworCWJvb2wgICAgICAgICAgICAgIG1fcmZtaXJyb3I7CisJdTggICAgICAgICAgICAgICAgbV9kZXZpY2VTcGluOworCXUzMiAgICAgICAgICAgICAgIG1faXFtUmNSYXRlOworCisJZW51bSBEUlhQb3dlck1vZGUgbV9jdXJyZW50UG93ZXJNb2RlOworCisJLyoKKwkgKiBDb25maWd1cmFibGUgcGFyYW1ldGVycyBhdCB0aGUgZHJpdmVyLiBUaGV5IHN0b3JlcyB0aGUgdmFsdWVzIGZvdW5kCisJICogYXQgc3RydWN0IGRyeGtfY29uZmlnLgorCSAqLworCisJdTE2CVVJT19tYXNrOwkvKiBCaXRzIHVzZWQgYnkgVUlPICovCisKKwlib29sCXNpbmdsZV9tYXN0ZXI7CisJYm9vbAlub19pMmNfYnJpZGdlOworCWJvb2wJYW50ZW5uYV9kdmJ0OworCXUxNglhbnRlbm5hX2dwaW87CisKKwljb25zdCBjaGFyICptaWNyb2NvZGVfbmFtZTsKK307CisKKyNkZWZpbmUgTkVWRVJfTE9DSyAwCisjZGVmaW5lIE5PVF9MT0NLRUQgMQorI2RlZmluZSBERU1PRF9MT0NLIDIKKyNkZWZpbmUgRkVDX0xPQ0sgICAzCisjZGVmaW5lIE1QRUdfTE9DSyAgNAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4a19tYXAuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhrX21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMTFhODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4a19tYXAuaApAQCAtMCwwICsxLDQ0OSBAQAorI2RlZmluZSAgQVVEX0NPTU1fRVhFQ19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwCisjZGVmaW5lICAgIEFVRF9DT01NX0VYRUNfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgIEZFQ19DT01NX0VYRUNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMwMDAwMAorI2RlZmluZSAgICBGRUNfQ09NTV9FWEVDX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgIEZFQ19DT01NX0VYRUNfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgIEZFQ19ESV9DT01NX0VYRUNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMyMDAwMAorI2RlZmluZSAgICBGRUNfRElfQ09NTV9FWEVDX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICBGRUNfRElfSU5QVVRfQ1RMX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDMjAwMTYKKyNkZWZpbmUgIEZFQ19SU19DT01NX0VYRUNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMzMDAwMAorI2RlZmluZSAgICBGRUNfUlNfQ09NTV9FWEVDX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICBGRUNfUlNfTUVBU1VSRU1FTlRfUEVSSU9EX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDMzAwMTIKKyNkZWZpbmUgIEZFQ19SU19NRUFTVVJFTUVOVF9QUkVTQ0FMRV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMzMDAxMworI2RlZmluZSAgRkVDX09DX01PREVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDExCisjZGVmaW5lICAgIEZFQ19PQ19NT0RFX1BBUklUWV9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgIEZFQ19PQ19EVE9fTU9ERV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDAxNAorI2RlZmluZSAgICBGRUNfT0NfRFRPX01PREVfRFlOQU1JQ19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgIEZFQ19PQ19EVE9fTU9ERV9PRkZTRVRfRU5BQkxFX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgIEZFQ19PQ19EVE9fUEVSSU9EX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDAxNQorI2RlZmluZSAgRkVDX09DX0RUT19CVVJTVF9MRU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDE4CisjZGVmaW5lICBGRUNfT0NfRkNUX01PREVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwMUEKKyNkZWZpbmUgIEZFQ19PQ19GQ1RfTU9ERV9fUFJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICBGRUNfT0NfRkNUX01PREVfUkFUX0VOQV9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgIEZFQ19PQ19GQ1RfTU9ERV9WSVJUX0VOQV9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgIEZFQ19PQ19UTURfTU9ERV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDAxRQorI2RlZmluZSAgRkVDX09DX1RNRF9DT1VOVF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDFGCisjZGVmaW5lICBGRUNfT0NfVE1EX0hJX01BUkdJTl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwMjAKKyNkZWZpbmUgIEZFQ19PQ19UTURfTE9fTUFSR0lOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDAyMQorI2RlZmluZSAgRkVDX09DX1RNRF9JTlRfVVBEX1JBVEVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDIzCisjZGVmaW5lICBGRUNfT0NfQVZSX1BBUk1fQV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwMjYKKyNkZWZpbmUgIEZFQ19PQ19BVlJfUEFSTV9CX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDAyNworI2RlZmluZSAgRkVDX09DX1JDTl9HQUlOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDJFCisjZGVmaW5lICBGRUNfT0NfUkNOX0NUTF9SQVRFX0xPX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwMzAKKyNkZWZpbmUgIEZFQ19PQ19SQ05fQ1RMX1NURVBfTE9fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDAzMgorI2RlZmluZSAgRkVDX09DX1JDTl9DVExfU1RFUF9ISV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDMzCisjZGVmaW5lICBGRUNfT0NfU05DX01PREVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwNDAKKyNkZWZpbmUgICAgRkVDX09DX1NOQ19NT0RFX1NIVVRET1dOX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgIEZFQ19PQ19TTkNfTFdNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDA0MQorI2RlZmluZSAgRkVDX09DX1NOQ19IV01fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDQyCisjZGVmaW5lICBGRUNfT0NfU05DX1VOTE9DS19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwNDMKKyNkZWZpbmUgIEZFQ19PQ19TTkNfRkFJTF9QRVJJT0RfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDA0NgorI2RlZmluZSAgRkVDX09DX0lQUl9NT0RFX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDQ4CisjZGVmaW5lICAgIEZFQ19PQ19JUFJfTU9ERV9TRVJJQUxfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgICAgRkVDX09DX0lQUl9NT0RFX01DTEtfRElTX0RBVF9BQlNfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSAgICBGRUNfT0NfSVBSX01PREVfTVZBTF9ESVNfUEFSX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSAgRkVDX09DX0lQUl9JTlZFUlRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDQ5CisjZGVmaW5lICAgIEZFQ19PQ19JUFJfSU5WRVJUX01EMF9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgICAgRkVDX09DX0lQUl9JTlZFUlRfTUQxX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgICBGRUNfT0NfSVBSX0lOVkVSVF9NRDJfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lICAgIEZFQ19PQ19JUFJfSU5WRVJUX01EM19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgKKyNkZWZpbmUgICAgRkVDX09DX0lQUl9JTlZFUlRfTUQ0X19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgICAgRkVDX09DX0lQUl9JTlZFUlRfTUQ1X19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgICAgRkVDX09DX0lQUl9JTlZFUlRfTUQ2X19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgICAgRkVDX09DX0lQUl9JTlZFUlRfTUQ3X19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgICAgRkVDX09DX0lQUl9JTlZFUlRfTUVSUl9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwCisjZGVmaW5lICAgIEZFQ19PQ19JUFJfSU5WRVJUX01TVFJUX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMAorI2RlZmluZSAgICBGRUNfT0NfSVBSX0lOVkVSVF9NVkFMX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAKKyNkZWZpbmUgICAgRkVDX09DX0lQUl9JTlZFUlRfTUNMS19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwCisjZGVmaW5lICBGRUNfT0NfT0NSX0lOVkVSVF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwNTIKKyNkZWZpbmUgIElRTV9DT01NX0VYRUNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgwMDAwMAorI2RlZmluZSAgICAgIElRTV9DT01NX0VYRUNfQl9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgICAgSVFNX0NPTU1fRVhFQ19CX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgIElRTV9GU19SQVRFX09GU19MT19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgyMDAxMAorI2RlZmluZSAgSVFNX0ZTX0FESl9TRUxfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODIwMDE0CisjZGVmaW5lICAgICAgSVFNX0ZTX0FESl9TRUxfQl9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgICBJUU1fRlNfQURKX1NFTF9CX1FBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgICAgIElRTV9GU19BREpfU0VMX0JfVlNCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lICBJUU1fRkRfUkFURVNFTF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MzAwMTAKKyNkZWZpbmUgIElRTV9SQ19SQVRFX09GU19MT19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg0MDAxMAorI2RlZmluZSAgSVFNX1JDX1JBVEVfT0ZTX0xPX19XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgIElRTV9SQ19SQVRFX09GU19MT19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRgorI2RlZmluZSAgSVFNX1JDX1JBVEVfT0ZTX0hJX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRgorI2RlZmluZSAgSVFNX1JDX0FESl9TRUxfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODQwMDE0CisjZGVmaW5lICAgICAgSVFNX1JDX0FESl9TRUxfQl9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgICBJUU1fUkNfQURKX1NFTF9CX1FBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgICAgIElRTV9SQ19BREpfU0VMX0JfVlNCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lICBJUU1fUkNfU1RSRVRDSF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NDAwMTYKKyNkZWZpbmUgIElRTV9DRl9DT01NX0lOVF9NU0tfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg2MDAwNgorI2RlZmluZSAgSVFNX0NGX1NZTU1FVFJJQ19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODYwMDEwCisjZGVmaW5lICBJUU1fQ0ZfTUlEVEFQX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NjAwMTEKKyNkZWZpbmUgICAgSVFNX0NGX01JRFRBUF9SRV9fQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgICAgSVFNX0NGX01JRFRBUF9JTV9fQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgIElRTV9DRl9PVVRfRU5BX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg2MDAxMgorI2RlZmluZSAgICBJUU1fQ0ZfT1VUX0VOQV9RQU1fX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSAgICBJUU1fQ0ZfT1VUX0VOQV9PRkRNX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lICBJUU1fQ0ZfQURKX1NFTF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NjAwMTMKKyNkZWZpbmUgIElRTV9DRl9TQ0FMRV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg2MDAxNAorI2RlZmluZSAgSVFNX0NGX1NDQUxFX1NIX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODYwMDE1CisjZGVmaW5lICBJUU1fQ0ZfU0NBTEVfU0hfX1BSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgIElRTV9DRl9QT1dfTUVBU19MRU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg2MDAxNworI2RlZmluZSAgSVFNX0NGX0RTX0VOQV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODYwMDE5CisjZGVmaW5lICBJUU1fQ0ZfVEFQX1JFMF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NjAwMjAKKyNkZWZpbmUgIElRTV9DRl9UQVBfSU0wX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg2MDA0MAorI2RlZmluZSAgSVFNX0NGX0NMUF9WQUxfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODYwMDYwCisjZGVmaW5lICBJUU1fQ0ZfREFUQVRIX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NjAwNjEKKyNkZWZpbmUgIElRTV9DRl9QS0RUSF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg2MDA2MgorI2RlZmluZSAgSVFNX0NGX1dORF9MRU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODYwMDYzCisjZGVmaW5lICBJUU1fQ0ZfREVUX0xDVF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NjAwNjQKKyNkZWZpbmUgIElRTV9DRl9CWVBBU1NERVRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg2MDA2NworI2RlZmluZSAgSVFNX0FGX0NPTU1fRVhFQ19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODcwMDAwCisjZGVmaW5lICAgIElRTV9BRl9DT01NX0VYRUNfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgIElRTV9BRl9DTEtORUdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg3MDAxMgorI2RlZmluZSAgICBJUU1fQUZfQ0xLTkVHX0NMS05FR0RBVEFfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lICAgICAgSVFNX0FGX0NMS05FR19DTEtORUdEQVRBX0NMS19BRENfREFUQV9QT1MgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgICBJUU1fQUZfQ0xLTkVHX0NMS05FR0RBVEFfQ0xLX0FEQ19EQVRBX05FRyAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgSVFNX0FGX1NUQVJUX0xPQ0tfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODcwMDFCCisjZGVmaW5lICBJUU1fQUZfUEhBU0UwX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NzAwMUMKKyNkZWZpbmUgIElRTV9BRl9QSEFTRTFfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg3MDAxRAorI2RlZmluZSAgSVFNX0FGX1BIQVNFMl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODcwMDFFCisjZGVmaW5lICBJUU1fQUZfQ0xQX0xFTl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NzAwMjMKKyNkZWZpbmUgIElRTV9BRl9DTFBfVEhfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg3MDAyNAorI2RlZmluZSAgSVFNX0FGX1NOU19MRU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODcwMDI2CisjZGVmaW5lICBJUU1fQUZfQUdDX0lGX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NzAwMjgKKyNkZWZpbmUgIElRTV9BRl9BR0NfUkZfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg3MDAyOQorI2RlZmluZSAgSVFNX0FGX1BEUkVGX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODcwMDJCCisjZGVmaW5lICBJUU1fQUZfUERSRUZfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFGCisjZGVmaW5lICBJUU1fQUZfU1REQllfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NzAwMkMKKyNkZWZpbmUgICAgICBJUU1fQUZfU1REQllfU1REQllfQURDX1NUQU5EQlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgICAgIElRTV9BRl9TVERCWV9TVERCWV9BTVBfU1RBTkRCWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lICAgICAgSVFNX0FGX1NUREJZX1NUREJZX1BEX1NUQU5EQlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgKKyNkZWZpbmUgICAgICBJUU1fQUZfU1REQllfU1REQllfVEFHQ19JRl9TVEFOREJZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgICAgICBJUU1fQUZfU1REQllfU1REQllfVEFHQ19SRl9TVEFOREJZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgIElRTV9BRl9BTVVYX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg3MDAyRAorI2RlZmluZSAgICBJUU1fQUZfQU1VWF9TSUdOQUwyQURDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICBJUU1fQUZfVVBEX1NFTF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NzAwMkYKKyNkZWZpbmUgIElRTV9BRl9JTkNfTENUX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg3MDAzNAorI2RlZmluZSAgSVFNX0FGX0lOQ19CWVBBU1NfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODcwMDM2CisjZGVmaW5lICBPRkRNX0NQX0NPTU1fRVhFQ19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI4MDAwMDAKKyNkZWZpbmUgICAgT0ZETV9DUF9DT01NX0VYRUNfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgT0ZETV9FQ19TQl9QUklPUl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNDEwMDEzCisjZGVmaW5lICAgIE9GRE1fRUNfU0JfUFJJT1JfSEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgT0ZETV9FQ19TQl9QUklPUl9MTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgT0ZETV9FUV9UT1BfVERfVFBTX0NPTlNUX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDEwMDU0CisjZGVmaW5lICBPRkRNX0VRX1RPUF9URF9UUFNfQ09OU1RfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMKKyNkZWZpbmUgICAgT0ZETV9FUV9UT1BfVERfVFBTX0NPTlNUXzY0UUFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgT0ZETV9FUV9UT1BfVERfVFBTX0NPREVfSFBfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDEwMDU2CisjZGVmaW5lICBPRkRNX0VRX1RPUF9URF9UUFNfQ09ERV9IUF9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcKKyNkZWZpbmUgICAgT0ZETV9FUV9UT1BfVERfVFBTX0NPREVfTFBfN184ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSAgT0ZETV9FUV9UT1BfVERfU1FSX0VSUl9JX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDEwMDVFCisjZGVmaW5lICBPRkRNX0VRX1RPUF9URF9TUVJfRVJSX1FfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMTAwNUYKKyNkZWZpbmUgIE9GRE1fRVFfVE9QX1REX1NRUl9FUlJfRVhQX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAxMDA2MAorI2RlZmluZSAgT0ZETV9FUV9UT1BfVERfUkVRX1NNQl9DTlRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDEwMDYxCisjZGVmaW5lICBPRkRNX0VRX1RPUF9URF9UUFNfUFdSX09GU19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMTAwNjIKKyNkZWZpbmUgIE9GRE1fTENfQ09NTV9FWEVDX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMDAwMAorI2RlZmluZSAgICBPRkRNX0xDX0NPTU1fRVhFQ19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICBPRkRNX1NDX0NPTU1fRVhFQ19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNDMDAwMDAKKyNkZWZpbmUgICAgT0ZETV9TQ19DT01NX0VYRUNfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgT0ZETV9TQ19DT01NX1NUQVRFX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQzAwMDAxCisjZGVmaW5lICBPRkRNX1NDX1JBX1JBTV9QQVJBTTBfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNDMjAwNDAKKyNkZWZpbmUgIE9GRE1fU0NfUkFfUkFNX1BBUkFNMV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0MyMDA0MQorI2RlZmluZSAgT0ZETV9TQ19SQV9SQU1fQ01EX0FERFJfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQzIwMDQyCisjZGVmaW5lICBPRkRNX1NDX1JBX1JBTV9DTURfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNDMjAwNDMKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fQ01EX05VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9DTURfUFJPQ19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX0NNRF9TRVRfUFJFRl9QQVJBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fQ01EX1BST0dSQU1fUEFSQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9DTURfR0VUX09QX1BBUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1CisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX0NNRF9VU0VSX0lPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fQ01EX1NFVF9USU1FUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NworI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9DTURfU0VUX0VDSE9fVElNSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX1NXX0VWRU5UX1JVTl9OTUFTS19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fTE9DS1RSQUNLX01JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQzIwMDQ4CisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX01PREVfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMKKyNkZWZpbmUgICAgICBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9NT0RFXzJLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX01PREVfOEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fR1VBUkRfMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgICBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9HVUFSRF8xNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSAgICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0dVQVJEXzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fR1VBUkRfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEMKKyNkZWZpbmUgICAgICBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9DT05TVF9RUFNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0NPTlNUX1FBTTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSAgICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0NPTlNUX1FBTTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSAgICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0hJRVJfTk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fSElFUl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fSElFUl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fSElFUl9BNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEMwCisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fUkFURV8xXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgICBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9SQVRFXzJfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwCisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fUkFURV8zXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMAorI2RlZmluZSAgICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX1JBVEVfNV82ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MDAKKyNkZWZpbmUgICAgICBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9SQVRFXzdfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwCisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fUFJJT19ISSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgICBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9QUklPX0xPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9PUF9BVVRPX01PREVfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX09QX0FVVE9fR1VBUkRfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fT1BfQVVUT19DT05TVF9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9PUF9BVVRPX0hJRVJfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX09QX0FVVE9fUkFURV9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lICBPRkRNX1NDX1JBX1JBTV9MT0NLX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNDMjAwNEIKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fTE9DS19ERU1PRF9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9MT0NLX0ZFQ19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX0xPQ0tfTVBFR19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fTE9DS19OT0RWQlRfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OAorI2RlZmluZSAgT0ZETV9TQ19SQV9SQU1fQkVfT1BUX0RFTEFZX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQzIwMDRECisjZGVmaW5lICBPRkRNX1NDX1JBX1JBTV9CRV9PUFRfSU5JVF9ERUxBWV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNDMjAwNEUKKyNkZWZpbmUgIE9GRE1fU0NfUkFfUkFNX0VDSE9fVEhSRVNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0MyMDA0RgorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9FQ0hPX1RIUkVTXzhLX19CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9FQ0hPX1RIUkVTXzhLX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRgorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9FQ0hPX1RIUkVTXzJLX19CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9FQ0hPX1RIUkVTXzJLX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRjAwCisjZGVmaW5lICBPRkRNX1NDX1JBX1JBTV9DT05GSUdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNDMjAwNTAKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fQ09ORklHX05FX0ZJWF9FTkFCTEVfX00gICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwCisjZGVmaW5lICBPRkRNX1NDX1JBX1JBTV9GUl9USFJFU184S19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNDMjAwN0QKKyNkZWZpbmUgIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfMktfUEVSX0xFRlRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0MyMDBFMAorI2RlZmluZSAgT0ZETV9TQ19SQV9SQU1fTklfSU5JVF8yS19QRVJfUklHSFRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQzIwMEUxCisjZGVmaW5lICBPRkRNX1NDX1JBX1JBTV9OSV9JTklUXzhLX1BFUl9MRUZUX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNDMjAwRTMKKyNkZWZpbmUgIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfOEtfUEVSX1JJR0hUX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0MyMDBFNAorI2RlZmluZSAgT0ZETV9TQ19SQV9SQU1fU1JNTV9GSVhfRkFDVF84S19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQzIwMEY4CisjZGVmaW5lICBRQU1fQ09NTV9FWEVDX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDAwMDAKKyNkZWZpbmUgICAgUUFNX0NPTU1fRVhFQ19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICBRQU1fQ09NTV9FWEVDX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgIFFBTV9UT1BfQU5ORVhfQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgUUFNX1RPUF9BTk5FWF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgUUFNX1NMX0VSUl9QT1dFUl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDMwMDE3CisjZGVmaW5lICBRQU1fRFFfUVVBTF9GVU4wX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NDAwMTgKKyNkZWZpbmUgIFFBTV9EUV9RVUFMX0ZVTjFfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ0MDAxOQorI2RlZmluZSAgUUFNX0RRX1FVQUxfRlVOMl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDQwMDFBCisjZGVmaW5lICBRQU1fRFFfUVVBTF9GVU4zX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NDAwMUIKKyNkZWZpbmUgIFFBTV9EUV9RVUFMX0ZVTjRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ0MDAxQworI2RlZmluZSAgUUFNX0RRX1FVQUxfRlVONV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDQwMDFECisjZGVmaW5lICBRQU1fTENfTU9ERV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMTAKKyNkZWZpbmUgIFFBTV9MQ19RVUFMX1RBQjBfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ1MDAxOAorI2RlZmluZSAgUUFNX0xDX1FVQUxfVEFCMV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDUwMDE5CisjZGVmaW5lICBRQU1fTENfUVVBTF9UQUIyX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMUEKKyNkZWZpbmUgIFFBTV9MQ19RVUFMX1RBQjNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ1MDAxQgorI2RlZmluZSAgUUFNX0xDX1FVQUxfVEFCNF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDUwMDFDCisjZGVmaW5lICBRQU1fTENfUVVBTF9UQUI1X19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMUQKKyNkZWZpbmUgIFFBTV9MQ19RVUFMX1RBQjZfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ1MDAxRQorI2RlZmluZSAgUUFNX0xDX1FVQUxfVEFCOF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDUwMDFGCisjZGVmaW5lICBRQU1fTENfUVVBTF9UQUI5X19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMjAKKyNkZWZpbmUgIFFBTV9MQ19RVUFMX1RBQjEwX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ1MDAyMQorI2RlZmluZSAgUUFNX0xDX1FVQUxfVEFCMTJfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDUwMDIyCisjZGVmaW5lICBRQU1fTENfUVVBTF9UQUIxNV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMjMKKyNkZWZpbmUgIFFBTV9MQ19RVUFMX1RBQjE2X19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ1MDAyNAorI2RlZmluZSAgUUFNX0xDX1FVQUxfVEFCMjBfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDUwMDI1CisjZGVmaW5lICBRQU1fTENfUVVBTF9UQUIyNV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMjYKKyNkZWZpbmUgIFFBTV9MQ19MUEZfRkFDVE9SUF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ1MDAyOAorI2RlZmluZSAgUUFNX0xDX0xQRl9GQUNUT1JJX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDUwMDI5CisjZGVmaW5lICBRQU1fTENfUkFURV9MSU1JVF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMkEKKyNkZWZpbmUgIFFBTV9MQ19TWU1CT0xfRlJFUV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ1MDAyQgorI2RlZmluZSAgUUFNX1NZX1RJTUVPVVRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDcwMDExCisjZGVmaW5lICBRQU1fU1lfVElNRU9VVF9fUFJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNBOTgKKyNkZWZpbmUgIFFBTV9TWV9TWU5DX0xXTV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ3MDAxMgorI2RlZmluZSAgUUFNX1NZX1NZTkNfQVdNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDcwMDEzCisjZGVmaW5lICBRQU1fU1lfU1lOQ19IV01fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NzAwMTQKKyNkZWZpbmUgIFFBTV9TWV9TUF9JTlZfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ3MDAxNworI2RlZmluZSAgICBRQU1fU1lfU1BfSU5WX1NQRUNUUlVNX0lOVl9ESVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICBTQ1VfQ09NTV9FWEVDX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMAorI2RlZmluZSAgICBTQ1VfQ09NTV9FWEVDX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgIFNDVV9DT01NX0VYRUNfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgICAgU0NVX0NPTU1fRVhFQ19IT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgU0NVX1JBTV9EUklWRVJfREVCVUdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFFQkYKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0ZTTV9TVEVQX1BFUklPRF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRUM0CisjZGVmaW5lICBTQ1VfUkFNX0dQSU9fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUVDNworI2RlZmluZSAgICAgIFNDVV9SQU1fR1BJT19IV19MT0NLX0lORF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19DTFBfQ1RSTF9NT0RFX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUVDOAorI2RlZmluZSAgU0NVX1JBTV9GRUNfQUNDVU1fUEtUX0ZBSUxVUkVTX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFFQ0IKKyNkZWZpbmUgIFNDVV9SQU1fRkVDX1BSRV9SU19CRVJfRklMVEVSX1NIX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjA1CisjZGVmaW5lICBTQ1VfUkFNX0FHQ19GQVNUX1NOU19DVFJMX0RFTEFZX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYxNQorI2RlZmluZSAgU0NVX1JBTV9BR0NfS0lfQ1lDTEVOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMTcKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX1NOU19DWUNMRU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjE4CisjZGVmaW5lICBTQ1VfUkFNX0FHQ19SRl9TTlNfREVWX01BWF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYxOQorI2RlZmluZSAgU0NVX1JBTV9BR0NfUkZfU05TX0RFVl9NSU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMUEKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX1JGX01BWF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjFCCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19DT05GSUdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYyNAorI2RlZmluZSAgICBTQ1VfUkFNX0FHQ19DT05GSUdfRElTQUJMRV9SRl9BR0NfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgIFNDVV9SQU1fQUdDX0NPTkZJR19ESVNBQkxFX0lGX0FHQ19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgICAgU0NVX1JBTV9BR0NfQ09ORklHX0lOVl9JRl9QT0xfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwCisjZGVmaW5lICAgIFNDVV9SQU1fQUdDX0NPTkZJR19JTlZfUkZfUE9MX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMAorI2RlZmluZSAgU0NVX1JBTV9BR0NfS0lfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMjUKKyNkZWZpbmUgICAgU0NVX1JBTV9BR0NfS0lfUkZfX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgICAgU0NVX1JBTV9BR0NfS0lfUkZfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RjAKKyNkZWZpbmUgICAgU0NVX1JBTV9BR0NfS0lfSUZfX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgICAgU0NVX1JBTV9BR0NfS0lfSUZfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RjAwCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19LSV9SRURfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYyNgorI2RlZmluZSAgICBTQ1VfUkFNX0FHQ19LSV9SRURfUkFHQ19SRURfX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSAgICBTQ1VfUkFNX0FHQ19LSV9SRURfUkFHQ19SRURfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDCisjZGVmaW5lICAgIFNDVV9SQU1fQUdDX0tJX1JFRF9JQUdDX1JFRF9fQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lICAgIFNDVV9SQU1fQUdDX0tJX1JFRF9JQUdDX1JFRF9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19LSV9JTk5FUkdBSU5fTUlOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYyNworI2RlZmluZSAgU0NVX1JBTV9BR0NfS0lfTUlOR0FJTl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMjgKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0tJX01BWEdBSU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjI5CisjZGVmaW5lICBTQ1VfUkFNX0FHQ19LSV9NQVhNSU5HQUlOX1RIX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYyQQorI2RlZmluZSAgU0NVX1JBTV9BR0NfS0lfTUlOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMkIKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0tJX01BWF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjJDCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19DTFBfU1VNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYyRAorI2RlZmluZSAgU0NVX1JBTV9BR0NfQ0xQX1NVTV9NSU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMkUKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0NMUF9TVU1fTUFYX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjJGCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19DTFBfQ1lDTEVOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYzMAorI2RlZmluZSAgU0NVX1JBTV9BR0NfQ0xQX0NZQ0NOVF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMzEKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0NMUF9ESVJfVE9fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjMyCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19DTFBfRElSX1dEX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYzMworI2RlZmluZSAgU0NVX1JBTV9BR0NfQ0xQX0RJUl9TVFBfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMzQKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX1NOU19TVU1fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjM1CisjZGVmaW5lICBTQ1VfUkFNX0FHQ19TTlNfU1VNX01JTl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYzNgorI2RlZmluZSAgU0NVX1JBTV9BR0NfU05TX1NVTV9NQVhfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMzcKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX1NOU19DWUNDTlRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjM4CisjZGVmaW5lICBTQ1VfUkFNX0FHQ19TTlNfRElSX1RPX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYzOQorI2RlZmluZSAgU0NVX1JBTV9BR0NfU05TX0RJUl9XRF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGM0EKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX1NOU19ESVJfU1RQX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjNCCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19JTkdBSU5fVEdUX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYzRAorI2RlZmluZSAgU0NVX1JBTV9BR0NfSU5HQUlOX1RHVF9NSU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGM0UKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0lOR0FJTl9UR1RfTUFYX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjNGCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19JRl9JQUNDVV9ISV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY0MAorI2RlZmluZSAgU0NVX1JBTV9BR0NfSUZfSUFDQ1VfTE9fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGNDEKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0lGX0lBQ0NVX0hJX1RHVF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjQyCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19JRl9JQUNDVV9ISV9UR1RfTUlOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY0MworI2RlZmluZSAgU0NVX1JBTV9BR0NfSUZfSUFDQ1VfSElfVEdUX01BWF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGNDQKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX1JGX0lBQ0NVX0hJX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjQ1CisjZGVmaW5lICBTQ1VfUkFNX0FHQ19SRl9JQUNDVV9MT19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY0NgorI2RlZmluZSAgU0NVX1JBTV9BR0NfUkZfSUFDQ1VfSElfQ09fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGNDcKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0ZTTV9NRURJQU5fQVZfTVVMVF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjg0CisjZGVmaW5lICBTQ1VfUkFNX1FBTV9GU01fUkFESVVTX0FWX0xJTUlUX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY4NQorI2RlZmluZSAgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDFfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGODYKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQyX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjg3CisjZGVmaW5lICBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUM19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY4OAorI2RlZmluZSAgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGODkKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQ1X19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjhBCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9GU01fUlRIX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY4RQorI2RlZmluZSAgU0NVX1JBTV9RQU1fRlNNX0ZUSF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGOEYKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0ZTTV9QVEhfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjkwCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9GU01fTVRIX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY5MQorI2RlZmluZSAgU0NVX1JBTV9RQU1fRlNNX0NUSF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGOTIKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0ZTTV9RVEhfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjkzCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9GU01fUkFURV9MSU1fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY5NAorI2RlZmluZSAgU0NVX1JBTV9RQU1fRlNNX0ZSRVFfTElNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGOTUKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0ZTTV9DT1VOVF9MSU1fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjk2CisjZGVmaW5lICBTQ1VfUkFNX1FBTV9MQ19DQV9DT0FSU0VfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY5NworI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfQ0FfRklORV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGOTkKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0xDX0NQX0NPQVJTRV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjlBCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9MQ19DUF9NRURJVU1fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY5QgorI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfQ1BfRklORV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGOUMKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0xDX0NJX0NPQVJTRV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjlECisjZGVmaW5lICBTQ1VfUkFNX1FBTV9MQ19DSV9NRURJVU1fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY5RQorI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfQ0lfRklORV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGOUYKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0xDX0VQX0NPQVJTRV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkEwCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9MQ19FUF9NRURJVU1fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZBMQorI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfRVBfRklORV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGQTIKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0xDX0VJX0NPQVJTRV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkEzCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9MQ19FSV9NRURJVU1fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZBNAorI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfRUlfRklORV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGQTUKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0xDX0NGX0NPQVJTRV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkE2CisjZGVmaW5lICBTQ1VfUkFNX1FBTV9MQ19DRl9NRURJVU1fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZBNworI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfQ0ZfRklORV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGQTgKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0xDX0NGMV9DT0FSU0VfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkE5CisjZGVmaW5lICBTQ1VfUkFNX1FBTV9MQ19DRjFfTUVESVVNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZBQQorI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfQ0YxX0ZJTkVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGQUIKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX1NMX1NJR19QT1dFUl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkFDCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEMF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZBRAorI2RlZmluZSAgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDFfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGQUUKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQyX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkFGCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEM19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZCMAorI2RlZmluZSAgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGQjEKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQ1X19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkIyCisjZGVmaW5lICAgICAgU0NVX1JBTV9RQU1fTE9DS0VEX0xPQ0tFRF9ERU1PRF9MT0NLRUQgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgICAgICBTQ1VfUkFNX1FBTV9MT0NLRURfTE9DS0VEX0xPQ0tFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSAgICAgIFNDVV9SQU1fUUFNX0xPQ0tFRF9MT0NLRURfTkVWRVJfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDMDAwCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19GQVNUX0NMUF9DVFJMX0RFTEFZX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZFQQorI2RlZmluZSAgU0NVX1JBTV9EUklWRVJfVkVSX0hJX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGRUIKKyNkZWZpbmUgIFNDVV9SQU1fRFJJVkVSX1ZFUl9MT19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkVDCisjZGVmaW5lICBTQ1VfUkFNX1BBUkFNXzE1X19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZFRAorI2RlZmluZSAgU0NVX1JBTV9QQVJBTV8wX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGRkMKKyNkZWZpbmUgIFNDVV9SQU1fQ09NTUFORF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkZECisjZGVmaW5lICAgIFNDVV9SQU1fQ09NTUFORF9DTURfREVNT0RfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgICAgU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9TRVRfRU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgICBTQ1VfUkFNX0NPTU1BTkRfQ01EX0RFTU9EX1NFVF9QQVJBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzCisjZGVmaW5lICAgIFNDVV9SQU1fQ09NTUFORF9DTURfREVNT0RfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgICAgU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9HRVRfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NQorI2RlZmluZSAgICBTQ1VfUkFNX0NPTU1BTkRfQ01EX0RFTU9EX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5CisjZGVmaW5lICAgICAgU0NVX1JBTV9DT01NQU5EX1NUQU5EQVJEX1FBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMAorI2RlZmluZSAgICAgIFNDVV9SQU1fQ09NTUFORF9TVEFOREFSRF9PRkRNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAKKyNkZWZpbmUgIFNJT19UT1BfQ09NTV9LRVlfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDEwMDBGCisjZGVmaW5lICAgIFNJT19UT1BfQ09NTV9LRVlfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZBQkEKKyNkZWZpbmUgIFNJT19UT1BfSlRBR0lEX0xPX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDEwMDEyCisjZGVmaW5lICBTSU9fSElfUkFfUkFNX1JFU19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyMDAzMQorI2RlZmluZSAgU0lPX0hJX1JBX1JBTV9DTURfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MjAwMzIKKyNkZWZpbmUgICAgU0lPX0hJX1JBX1JBTV9DTURfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgICBTSU9fSElfUkFfUkFNX0NNRF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzCisjZGVmaW5lICAgIFNJT19ISV9SQV9SQU1fQ01EX0JSRENUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcKKyNkZWZpbmUgIFNJT19ISV9SQV9SQU1fUEFSXzFfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDIwMDMzCisjZGVmaW5lICAgICAgU0lPX0hJX1JBX1JBTV9QQVJfMV9QQVIxX1NFQ19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM5NDUKKyNkZWZpbmUgIFNJT19ISV9SQV9SQU1fUEFSXzJfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDIwMDM0CisjZGVmaW5lICAgIFNJT19ISV9SQV9SQU1fUEFSXzJfQ0ZHX0RJVl9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGCisjZGVmaW5lICAgICAgU0lPX0hJX1JBX1JBTV9QQVJfMl9CUkRfQ0ZHX09QRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgICBTSU9fSElfUkFfUkFNX1BBUl8yX0JSRF9DRkdfQ0xPU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSAgU0lPX0hJX1JBX1JBTV9QQVJfM19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MjAwMzUKKyNkZWZpbmUgICAgU0lPX0hJX1JBX1JBTV9QQVJfM19DRkdfREJMX1NEQV9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YKKyNkZWZpbmUgICAgU0lPX0hJX1JBX1JBTV9QQVJfM19DRkdfREJMX1NDTF9fQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgICAgICBTSU9fSElfUkFfUkFNX1BBUl8zX0FDUF9SV19SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICAgIFNJT19ISV9SQV9SQU1fUEFSXzNfQUNQX1JXX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lICBTSU9fSElfUkFfUkFNX1BBUl80X19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyMDAzNgorI2RlZmluZSAgU0lPX0hJX1JBX1JBTV9QQVJfNV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MjAwMzcKKyNkZWZpbmUgICAgICBTSU9fSElfUkFfUkFNX1BBUl81X0NGR19TTFYwX1NMQVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgICBTSU9fSElfUkFfUkFNX1BBUl81X0NGR19TTEVFUF9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lICAgICAgU0lPX0hJX1JBX1JBTV9QQVJfNV9DRkdfU0xFRVBfWlpaICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgKKyNkZWZpbmUgIFNJT19ISV9SQV9SQU1fUEFSXzZfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDIwMDM4CisjZGVmaW5lICBTSU9fQ0NfUExMX0xPQ0tfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ1MDAxMgorI2RlZmluZSAgU0lPX0NDX1BXRF9NT0RFX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NTAwMTUKKyNkZWZpbmUgICAgICBTSU9fQ0NfUFdEX01PREVfTEVWRUxfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICAgIFNJT19DQ19QV0RfTU9ERV9MRVZFTF9PRkRNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgICAgU0lPX0NDX1BXRF9NT0RFX0xFVkVMX0NMT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgICAgICBTSU9fQ0NfUFdEX01PREVfTEVWRUxfUExMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MworI2RlZmluZSAgICAgIFNJT19DQ19QV0RfTU9ERV9MRVZFTF9PU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lICBTSU9fQ0NfU09GVF9SU1RfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ1MDAxNgorI2RlZmluZSAgICBTSU9fQ0NfU09GVF9SU1RfT0ZETV9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgIFNJT19DQ19TT0ZUX1JTVF9TWVNfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgICAgU0lPX0NDX1NPRlRfUlNUX09TQ19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSAgU0lPX0NDX1VQREFURV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NTAwMTcKKyNkZWZpbmUgICAgU0lPX0NDX1VQREFURV9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkFCQQorI2RlZmluZSAgU0lPX09GRE1fU0hfT0ZETV9SSU5HX0VOQUJMRV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NzAwMTAKKyNkZWZpbmUgICAgU0lPX09GRE1fU0hfT0ZETV9SSU5HX0VOQUJMRV9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICBTSU9fT0ZETV9TSF9PRkRNX1JJTkdfRU5BQkxFX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICBTSU9fT0ZETV9TSF9PRkRNX1JJTkdfU1RBVFVTX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ3MDAxMgorI2RlZmluZSAgICBTSU9fT0ZETV9TSF9PRkRNX1JJTkdfU1RBVFVTX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgIFNJT19PRkRNX1NIX09GRE1fUklOR19TVEFUVVNfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgIFNJT19CTF9DT01NX0VYRUNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDgwMDAwCisjZGVmaW5lICAgIFNJT19CTF9DT01NX0VYRUNfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgIFNJT19CTF9TVEFUVVNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDgwMDEwCisjZGVmaW5lICBTSU9fQkxfTU9ERV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ4MDAxMQorI2RlZmluZSAgICBTSU9fQkxfTU9ERV9ESVJFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgIFNJT19CTF9NT0RFX0NIQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgIFNJT19CTF9FTkFCTEVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDgwMDEyCisjZGVmaW5lICAgIFNJT19CTF9FTkFCTEVfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgIFNJT19CTF9UR1RfSERSX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDgwMDE0CisjZGVmaW5lICBTSU9fQkxfVEdUX0FERFJfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ4MDAxNQorI2RlZmluZSAgU0lPX0JMX1NSQ19BRERSX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ODAwMTYKKyNkZWZpbmUgIFNJT19CTF9TUkNfTEVOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDgwMDE3CisjZGVmaW5lICBTSU9fQkxfQ0hBSU5fQUREUl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ4MDAxOAorI2RlZmluZSAgU0lPX0JMX0NIQUlOX0xFTl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ODAwMTkKKyNkZWZpbmUgIFNJT19QRFJfTU9OX0NGR19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YwMDEwCisjZGVmaW5lICBTSU9fUERSX1VJT19JTl9ISV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGMDAxNQorI2RlZmluZSAgU0lPX1BEUl9VSU9fT1VUX0xPX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RjAwMTYKKyNkZWZpbmUgIFNJT19QRFJfT0hXX0NGR19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YwMDFGCisjZGVmaW5lICAgIFNJT19QRFJfT0hXX0NGR19GUkVGX1NFTF9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMKKyNkZWZpbmUgIFNJT19QRFJfTVNUUlRfQ0ZHX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YwMDI1CisjZGVmaW5lICBTSU9fUERSX01FUlJfQ0ZHX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGMDAyNgorI2RlZmluZSAgU0lPX1BEUl9NQ0xLX0NGR19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RjAwMjgKKyNkZWZpbmUgICAgU0lPX1BEUl9NQ0xLX0NGR19EUklWRV9fQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgIFNJT19QRFJfTVZBTF9DRkdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YwMDI5CisjZGVmaW5lICBTSU9fUERSX01EMF9DRkdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGMDAyQQorI2RlZmluZSAgICBTSU9fUERSX01EMF9DRkdfRFJJVkVfX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSAgU0lPX1BEUl9NRDFfQ0ZHX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RjAwMkIKKyNkZWZpbmUgIFNJT19QRFJfTUQyX0NGR19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YwMDJDCisjZGVmaW5lICBTSU9fUERSX01EM19DRkdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGMDAyRAorI2RlZmluZSAgU0lPX1BEUl9NRDRfQ0ZHX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RjAwMkYKKyNkZWZpbmUgIFNJT19QRFJfTUQ1X0NGR19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YwMDMwCisjZGVmaW5lICBTSU9fUERSX01ENl9DRkdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGMDAzMQorI2RlZmluZSAgU0lPX1BEUl9NRDdfQ0ZHX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RjAwMzIKKyNkZWZpbmUgIFNJT19QRFJfU01BX1RYX0NGR19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YwMDM4CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvaXRkMTAwMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2l0ZDEwMDAuYwppbmRleCBmN2E0MGExLi5hYTljY2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvaXRkMTAwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9pdGQxMDAwLmMKQEAgLTM1LDIxICszNSwxOCBAQAogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlR1cm4gb24vb2ZmIGRlYnVnZ2luZyAoZGVmYXVsdDpvZmYpLiIpOwogCi0jZGVmaW5lIGRlYihhcmdzLi4uKSAgZG8geyBcCisjZGVmaW5lIGl0ZF9kYmcoYXJncy4uLikgIGRvIHsgXAogCWlmIChkZWJ1ZykgeyBcCiAJCXByaW50ayhLRVJOX0RFQlVHICAgIklURDEwMDA6ICIgYXJncyk7XAotCQlwcmludGsoIlxuIik7IFwKIAl9IFwKIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgd2FybihhcmdzLi4uKSBkbyB7IFwKKyNkZWZpbmUgaXRkX3dhcm4oYXJncy4uLikgZG8geyBcCiAJcHJpbnRrKEtFUk5fV0FSTklORyAiSVREMTAwMDogIiBhcmdzKTsgXAotCXByaW50aygiXG4iKTsgXAogfSB3aGlsZSAoMCkKIAotI2RlZmluZSBpbmZvKGFyZ3MuLi4pIGRvIHsgXAorI2RlZmluZSBpdGRfaW5mbyhhcmdzLi4uKSBkbyB7IFwKIAlwcmludGsoS0VSTl9JTkZPICAgICJJVEQxMDAwOiAiIGFyZ3MpOyBcCi0JcHJpbnRrKCJcbiIpOyBcCiB9IHdoaWxlICgwKQogCiAvKiBkb24ndCB3cml0ZSBtb3JlIHRoYW4gb25lIGJ5dGUgd2l0aCBmbGV4Y29wIGJlaGluZCAqLwpAQCAtNjIsNyArNTksNyBAQAogCWJ1ZlswXSA9IHJlZzsKIAltZW1jcHkoJmJ1ZlsxXSwgdiwgbGVuKTsKIAotCS8qIGRlYigid3IgJTAyeDogJTAyeCIsIHJlZywgdlswXSk7ICovCisJLyogaXRkX2RiZygid3IgJTAyeDogJTAyeFxuIiwgcmVnLCB2WzBdKTsgKi8KIAogCWlmIChpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZywgMSkgIT0gMSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJpdGQxMDAwIEkyQyB3cml0ZSBmYWlsZWRcbiIpOwpAQCAtODMsNyArODAsNyBAQAogCWl0ZDEwMDBfd3JpdGVfcmVncyhzdGF0ZSwgKHJlZyAtIDEpICYgMHhmZiwgJnN0YXRlLT5zaGFkb3dbKHJlZyAtIDEpICYgMHhmZl0sIDEpOwogCiAJaWYgKGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCBtc2csIDIpICE9IDIpIHsKLQkJd2FybigiaXRkMTAwMCBJMkMgcmVhZCBmYWlsZWQiKTsKKwkJaXRkX3dhcm4oIml0ZDEwMDAgSTJDIHJlYWQgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FUkVNT1RFSU87CiAJfQogCXJldHVybiB2YWw7CkBAIC0xMjcsMTQgKzEyNCwxNCBAQAogCXU4IGJiZ3ZtaW4gPSBpdGQxMDAwX3JlYWRfcmVnKHN0YXRlLCBCQkdWTUlOKSAmIDB4ZjA7CiAJdTggYncgICAgICA9IGl0ZDEwMDBfcmVhZF9yZWcoc3RhdGUsIEJXKSAgICAgICYgMHhmMDsKIAotCWRlYigic3ltYm9sX3JhdGUgPSAlZCIsIHN5bWJvbF9yYXRlKTsKKwlpdGRfZGJnKCJzeW1ib2xfcmF0ZSA9ICVkXG4iLCBzeW1ib2xfcmF0ZSk7CiAKIAkvKiBub3Qgc3VyZSB3aGF0IGlzIHRoYXQgPyAtIHN0YXJ0aW5nIHRvIGRvd25sb2FkIHRoZSB0YWJsZSAqLwogCWl0ZDEwMDBfd3JpdGVfcmVnKHN0YXRlLCBDT04xLCBjb24xIHwgKDEgPDwgMSkpOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXRkMTAwMF9scGZfcGdhKTsgaSsrKQogCQlpZiAoc3ltYm9sX3JhdGUgPCBpdGQxMDAwX2xwZl9wZ2FbaV0uc3ltYm9sX3JhdGUpIHsKLQkJCWRlYigic3ltcmF0ZTogaW5kZXg6ICVkIHBnYWV4dDogJXgsIGJiZ3ZtaW46ICV4IiwgaSwgaXRkMTAwMF9scGZfcGdhW2ldLnBnYWV4dCwgaXRkMTAwMF9scGZfcGdhW2ldLmJiZ3ZtaW4pOworCQkJaXRkX2RiZygic3ltcmF0ZTogaW5kZXg6ICVkIHBnYWV4dDogJXgsIGJiZ3ZtaW46ICV4XG4iLCBpLCBpdGQxMDAwX2xwZl9wZ2FbaV0ucGdhZXh0LCBpdGQxMDAwX2xwZl9wZ2FbaV0uYmJndm1pbik7CiAJCQlpdGQxMDAwX3dyaXRlX3JlZyhzdGF0ZSwgUExMRkgsICAgcGxsZmggfCAoaXRkMTAwMF9scGZfcGdhW2ldLnBnYWV4dCA8PCA0KSk7CiAJCQlpdGQxMDAwX3dyaXRlX3JlZyhzdGF0ZSwgQkJHVk1JTiwgYmJndm1pbiB8IChpdGQxMDAwX2xwZl9wZ2FbaV0uYmJndm1pbikpOwogCQkJaXRkMTAwMF93cml0ZV9yZWcoc3RhdGUsIEJXLCAgICAgIGJ3IHwgKGkgJiAweDBmKSk7CkBAIC0xODIsNyArMTc5LDcgQEAKIAogCQkJYWRjb3V0ID0gaXRkMTAwMF9yZWFkX3JlZyhzdGF0ZSwgUExMTE9DSykgJiAweDBmOwogCi0JCQlkZWIoIlZDTzogJWRrSHo6ICVkIC0+IEFEQ09VVDogJWQgJTAyeCIsIGZyZXFfa2h6LCBpdGQxMDAwX3Zjb3JnW2ldLnZjb3JnLCBhZGNvdXQsIHZjb19jaHAxX2kyYyk7CisJCQlpdGRfZGJnKCJWQ086ICVka0h6OiAlZCAtPiBBRENPVVQ6ICVkICUwMnhcbiIsIGZyZXFfa2h6LCBpdGQxMDAwX3Zjb3JnW2ldLnZjb3JnLCBhZGNvdXQsIHZjb19jaHAxX2kyYyk7CiAKIAkJCWlmIChhZGNvdXQgPiAxMykgewogCQkJCWlmICghKGl0ZDEwMDBfdmNvcmdbaV0udmNvcmcgPT0gNyB8fCBpdGQxMDAwX3Zjb3JnW2ldLnZjb3JnID09IDE1KSkKQEAgLTIzMiw3ICsyMjksNyBAQAogCXBsbGYgPSAodTMyKSB0bXA7CiAKIAlzdGF0ZS0+ZnJlcXVlbmN5ID0gKChwbGxuICogMTAwMCkgKyAocGxsZiAqIDEwMDApLzEwNDg1NzYpICogMipGUkVGOwotCWRlYigiZnJlcXVlbmN5OiAlZGtIeiAod2FudGVkKSAlZGtIeiAoc2V0KSwgUExMRiA9ICVkLCBQTExOID0gJWQiLCBmcmVxX2toeiwgc3RhdGUtPmZyZXF1ZW5jeSwgcGxsZiwgcGxsbik7CisJaXRkX2RiZygiZnJlcXVlbmN5OiAlZGtIeiAod2FudGVkKSAlZGtIeiAoc2V0KSwgUExMRiA9ICVkLCBQTExOID0gJWRcbiIsIGZyZXFfa2h6LCBzdGF0ZS0+ZnJlcXVlbmN5LCBwbGxmLCBwbGxuKTsKIAogCWl0ZDEwMDBfd3JpdGVfcmVnKHN0YXRlLCBQTExOSCwgMHg4MCk7IC8qIFBMTE5IICovOwogCWl0ZDEwMDBfd3JpdGVfcmVnKHN0YXRlLCBQTExOTCwgcGxsbiAmIDB4ZmYpOwpAQCAtMjQyLDcgKzIzOSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpdGQxMDAwX2ZyZV92YWx1ZXMpOyBpKyspIHsKIAkJaWYgKGZyZXFfa2h6IDw9IGl0ZDEwMDBfZnJlX3ZhbHVlc1tpXS5mcmVxKSB7Ci0JCQlkZWIoImZyZV92YWx1ZXM6ICVkIiwgaSk7CisJCQlpdGRfZGJnKCJmcmVfdmFsdWVzOiAlZFxuIiwgaSk7CiAJCQlpdGQxMDAwX3dyaXRlX3JlZyhzdGF0ZSwgUkZUUiwgaXRkMTAwMF9mcmVfdmFsdWVzW2ldLnZhbHVlc1swXSk7CiAJCQlmb3IgKGogPSAwOyBqIDwgOTsgaisrKQogCQkJCWl0ZDEwMDBfd3JpdGVfcmVnKHN0YXRlLCBSRlNUMStqLCBpdGQxMDAwX2ZyZV92YWx1ZXNbaV0udmFsdWVzW2orMV0pOwpAQCAtMzgyLDcgKzM3OSw3IEBACiAJCWtmcmVlKHN0YXRlKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWluZm8oInN1Y2Nlc3NmdWxseSBpZGVudGlmaWVkIChJRDogJWQpIiwgaSk7CisJaXRkX2luZm8oInN1Y2Nlc3NmdWxseSBpZGVudGlmaWVkIChJRDogJWQpXG4iLCBpKTsKIAogCW1lbXNldChzdGF0ZS0+c2hhZG93LCAweGZmLCBzaXplb2Yoc3RhdGUtPnNoYWRvdykpOwogCWZvciAoaSA9IDB4NjU7IGkgPCAweDljOyBpKyspCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0NjAwMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDAuYwppbmRleCBhNzYzZWM3NS4uNjU5OWI4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0NjAwMC5jCkBAIC01MCw3ICs1MCw3IEBACiAJaWYgKChyZXQgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZywgMSkpICE9IDEpCiAJCWRwcmludGsoIm54dDYwMDA6IG54dDYwMDBfd3JpdGUgZXJyb3IgKHJlZzogMHglMDJYLCBkYXRhOiAweCUwMlgsIHJldDogJWQpXG4iLCByZWcsIGRhdGEsIHJldCk7CiAKLQlyZXR1cm4gKHJldCAhPSAxKSA/IC1FRkFVTFQgOiAwOworCXJldHVybiAocmV0ICE9IDEpID8gLUVJTyA6IDA7CiB9CiAKIHN0YXRpYyB1OCBueHQ2MDAwX3JlYWRyZWcoc3RydWN0IG54dDYwMDBfc3RhdGUqIHN0YXRlLCB1OCByZWcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuYwppbmRleCAxN2Y4Y2RmLi4zODc5ZDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDIwLmMKQEAgLTYzNCw3ICs2MzQsNyBAQAogCXN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWludCBmcmVxdWVuY3lfZGVsdGE7CiAJc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzIGZlc2V0dGluZ3M7Ci0JdWludDhfdCBjbG9ja19zZXR0dGluZzsKKwl1aW50OF90IGNsb2NrX3NldHRpbmc7CiAKIAlkcHJpbnRrKCJlbnRlciAlc1xuIiwgX19mdW5jX18pOwogCkBAIC02ODQsMTkgKzY4NCwxOSBAQAogCXN3aXRjaCAoc3RhdGUtPmZjbGspIHsKIAlkZWZhdWx0OgogCWNhc2UgODgwMDAwMDA6Ci0JCWNsb2NrX3NldHR0aW5nID0gODA7CisJCWNsb2NrX3NldHRpbmcgPSA4MDsKIAkJYnJlYWs7CiAJY2FzZSA4NjAwMDAwMDoKLQkJY2xvY2tfc2V0dHRpbmcgPSA3ODsKKwkJY2xvY2tfc2V0dGluZyA9IDc4OwogCQlicmVhazsKIAljYXNlIDgwMDAwMDAwOgotCQljbG9ja19zZXR0dGluZyA9IDcyOworCQljbG9ja19zZXR0aW5nID0gNzI7CiAJCWJyZWFrOwogCWNhc2UgNTkwMDAwMDA6Ci0JCWNsb2NrX3NldHR0aW5nID0gNTE7CisJCWNsb2NrX3NldHRpbmcgPSA1MTsKIAkJYnJlYWs7CiAJY2FzZSA0NDAwMDAwMDoKLQkJY2xvY2tfc2V0dHRpbmcgPSAzNjsKKwkJY2xvY2tfc2V0dGluZyA9IDM2OwogCQlicmVhazsKIAl9CiAJZHByaW50aygicGxsMDE6ICVkLCBUb25lRnJlcTogJWRcbiIsIHN0YXRlLT5mY2xrLzEwMDAwMDAgLSA4LCAoc3RhdGUtPmZjbGsgKyAoVE9ORV9GUkVRICogMzIpIC0gMSkgLyAoVE9ORV9GUkVRICogMzIpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExODI3MWMyZGQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExODI3MWMyZGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzg0ZThkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTE4MjcxYzJkZC5jCkBAIC0wLDAgKzEsMTI1MSBAQAorLyoKKyAqIHRkYTE4MjcxYzJkZDogRHJpdmVyIGZvciB0aGUgVERBMTgyNzFDMiB0dW5lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBEaWdpdGFsIERldmljZXMgR21iSAorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICogT3IsIHBvaW50IHlvdXIgYnJvd3NlciB0byBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKworI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorCitzdHJ1Y3QgU1N0YW5kYXJkUGFyYW0geworCXMzMiAgIG1fSUZGcmVxdWVuY3k7CisJdTMyICAgbV9CYW5kV2lkdGg7CisJdTggICAgbV9FUDNfNF8wOworCXU4ICAgIG1fRUIyMjsKK307CisKK3N0cnVjdCBTTWFwIHsKKwl1MzIgICBtX0ZyZXF1ZW5jeTsKKwl1OCAgICBtX1BhcmFtOworfTsKKworc3RydWN0IFNNYXBJIHsKKwl1MzIgICBtX0ZyZXF1ZW5jeTsKKwlzMzIgICAgbV9QYXJhbTsKK307CisKK3N0cnVjdCBTTWFwMiB7CisJdTMyICAgbV9GcmVxdWVuY3k7CisJdTggICAgbV9QYXJhbTE7CisJdTggICAgbV9QYXJhbTI7Cit9OworCitzdHJ1Y3QgU1JGQmFuZE1hcCB7CisJdTMyICAgbV9SRl9tYXg7CisJdTMyICAgbV9SRjFfRGVmYXVsdDsKKwl1MzIgICBtX1JGMl9EZWZhdWx0OworCXUzMiAgIG1fUkYzX0RlZmF1bHQ7Cit9OworCitlbnVtIEVSZWdpc3RlciB7CisJSUQgPSAwLAorCVRNLAorCVBMLAorCUVQMSwgRVAyLCBFUDMsIEVQNCwgRVA1LAorCUNQRCwgQ0QxLCBDRDIsIENEMywKKwlNUEQsIE1EMSwgTUQyLCBNRDMsCisJRUIxLCBFQjIsIEVCMywgRUI0LCBFQjUsIEVCNiwgRUI3LCBFQjgsIEVCOSwgRUIxMCwKKwlFQjExLCBFQjEyLCBFQjEzLCBFQjE0LCBFQjE1LCBFQjE2LCBFQjE3LCBFQjE4LCBFQjE5LCBFQjIwLAorCUVCMjEsIEVCMjIsIEVCMjMsCisJTlVNX1JFR1MKK307CisKK3N0cnVjdCB0ZGFfc3RhdGUgeworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjOworCXU4IGFkcjsKKworCXUzMiAgIG1fRnJlcXVlbmN5OworCXUzMiAgIElGOworCisJdTggICAgbV9JRkxldmVsQW5hbG9nOworCXU4ICAgIG1fSUZMZXZlbERpZ2l0YWw7CisJdTggICAgbV9JRkxldmVsRFZCQzsKKwl1OCAgICBtX0lGTGV2ZWxEVkJUOworCisJdTggICAgbV9FUDQ7CisJdTggICAgbV9FUDNfU3RhbmRieTsKKworCWJvb2wgIG1fYk1hc3RlcjsKKworCXMzMiAgIG1fU2V0dGxpbmdUaW1lOworCisJdTggICAgbV9SZWdzW05VTV9SRUdTXTsKKworCS8qIFRyYWNraW5nIGZpbHRlciBzZXR0aW5ncyBmb3IgYmFuZCAwLi42ICovCisJdTMyICAgbV9SRjFbN107CisJczMyICAgbV9SRl9BMVs3XTsKKwlzMzIgICBtX1JGX0IxWzddOworCXUzMiAgIG1fUkYyWzddOworCXMzMiAgIG1fUkZfQTJbN107CisJczMyICAgbV9SRl9CMls3XTsKKwl1MzIgICBtX1JGM1s3XTsKKworCXU4ICAgIG1fVE1WYWx1ZV9SRkNhbDsgICAgLyogQ2FsaWJyYXRpb24gdGVtcGVyYXR1ciAqLworCisJYm9vbCAgbV9iRk1JbnB1dDsgICAgICAgICAvKiB0cnVlIHRvIHVzZSBQaW4gOCBmb3IgRk0gUmFkaW8gKi8KKworfTsKKworc3RhdGljIGludCBQb3dlclNjYW4oc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUsCisJCSAgICAgdTggUkZCYW5kLCB1MzIgUkZfaW4sCisJCSAgICAgdTMyICpwUkZfT3V0LCBib29sICpwYmNhbCk7CisKK3N0YXRpYyBpbnQgaTJjX3JlYWRuKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdTggYWRyLCB1OCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzWzFdID0ge3suYWRkciA9IGFkciwgIC5mbGFncyA9IEkyQ19NX1JELAorCQkJCSAgIC5idWYgID0gZGF0YSwgLmxlbiAgID0gbGVufSB9OworCXJldHVybiAoaTJjX3RyYW5zZmVyKGFkYXB0ZXIsIG1zZ3MsIDEpID09IDEpID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IGkyY193cml0ZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHU4IGFkciwgdTggKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyID0gYWRyLCAuZmxhZ3MgPSAwLAorCQkJICAgICAgLmJ1ZiA9IGRhdGEsIC5sZW4gPSBsZW59OworCisJaWYgKGkyY190cmFuc2ZlcihhZGFwLCAmbXNnLCAxKSAhPSAxKSB7CisJCXByaW50ayhLRVJOX0VSUiAidGRhMTgyNzFjMmRkOiBpMmMgd3JpdGUgZXJyb3IgYXQgYWRkciAlaVxuIiwgYWRyKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBXcml0ZVJlZ3Moc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUsCisJCSAgICAgdTggU3ViQWRkciwgdTggKlJlZ3MsIHUxNiBuUmVncykKK3sKKwl1OCBkYXRhW25SZWdzKzFdOworCisJZGF0YVswXSA9IFN1YkFkZHI7CisJbWVtY3B5KGRhdGEgKyAxLCBSZWdzLCBuUmVncyk7CisJcmV0dXJuIGkyY193cml0ZShzdGF0ZS0+aTJjLCBzdGF0ZS0+YWRyLCBkYXRhLCBuUmVncysxKTsKK30KKworc3RhdGljIGludCBXcml0ZVJlZyhzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSwgdTggU3ViQWRkciwgdTggUmVnKQoreworCXU4IG1zZ1syXSA9IHtTdWJBZGRyLCBSZWd9OworCisJcmV0dXJuIGkyY193cml0ZShzdGF0ZS0+aTJjLCBzdGF0ZS0+YWRyLCBtc2csIDIpOworfQorCitzdGF0aWMgaW50IFJlYWQoc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUsIHU4ICogUmVncykKK3sKKwlyZXR1cm4gaTJjX3JlYWRuKHN0YXRlLT5pMmMsIHN0YXRlLT5hZHIsIFJlZ3MsIDE2KTsKK30KKworc3RhdGljIGludCBSZWFkRXh0ZW50ZWQoc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUsIHU4ICogUmVncykKK3sKKwlyZXR1cm4gaTJjX3JlYWRuKHN0YXRlLT5pMmMsIHN0YXRlLT5hZHIsIFJlZ3MsIE5VTV9SRUdTKTsKK30KKworc3RhdGljIGludCBVcGRhdGVSZWdzKHN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlLCB1OCBSZWdGcm9tLCB1OCBSZWdUbykKK3sKKwlyZXR1cm4gV3JpdGVSZWdzKHN0YXRlLCBSZWdGcm9tLAorCQkJICZzdGF0ZS0+bV9SZWdzW1JlZ0Zyb21dLCBSZWdUby1SZWdGcm9tKzEpOworfQorc3RhdGljIGludCBVcGRhdGVSZWcoc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUsIHU4IFJlZykKK3sKKwlyZXR1cm4gV3JpdGVSZWcoc3RhdGUsIFJlZywgc3RhdGUtPm1fUmVnc1tSZWddKTsKK30KKworI2luY2x1ZGUgInRkYTE4MjcxYzJkZF9tYXBzLmgiCisKK3N0YXRpYyB2b2lkIHJlc2V0KHN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlKQoreworCXUzMiAgIHVsSUZMZXZlbEFuYWxvZyA9IDA7CisJdTMyICAgdWxJRkxldmVsRGlnaXRhbCA9IDI7CisJdTMyICAgdWxJRkxldmVsRFZCQyA9IDc7CisJdTMyICAgdWxJRkxldmVsRFZCVCA9IDY7CisJdTMyICAgdWxYVE91dCA9IDA7CisJdTMyICAgdWxTdGFuZGJ5TW9kZSA9IDB4MDY7ICAgIC8qIFNlbmQgaW4gc3RkYiwgYnV0IGxlYXZlIG9zYyBvbiAqLworCXUzMiAgIHVsU2xhdmUgPSAwOworCXUzMiAgIHVsRk1JbnB1dCA9IDA7CisJdTMyICAgdWxTZXR0bGluZ1RpbWUgPSAxMDA7CisKKwlzdGF0ZS0+bV9GcmVxdWVuY3kgICAgICAgICA9IDA7CisJc3RhdGUtPm1fU2V0dGxpbmdUaW1lID0gMTAwOworCXN0YXRlLT5tX0lGTGV2ZWxBbmFsb2cgPSAodWxJRkxldmVsQW5hbG9nICYgMHgwNykgPDwgMjsKKwlzdGF0ZS0+bV9JRkxldmVsRGlnaXRhbCA9ICh1bElGTGV2ZWxEaWdpdGFsICYgMHgwNykgPDwgMjsKKwlzdGF0ZS0+bV9JRkxldmVsRFZCQyA9ICh1bElGTGV2ZWxEVkJDICYgMHgwNykgPDwgMjsKKwlzdGF0ZS0+bV9JRkxldmVsRFZCVCA9ICh1bElGTGV2ZWxEVkJUICYgMHgwNykgPDwgMjsKKworCXN0YXRlLT5tX0VQNCA9IDB4MjA7CisJaWYgKHVsWFRPdXQgIT0gMCkKKwkJc3RhdGUtPm1fRVA0IHw9IDB4NDA7CisKKwlzdGF0ZS0+bV9FUDNfU3RhbmRieSA9ICgodWxTdGFuZGJ5TW9kZSAmIDB4MDcpIDw8IDUpIHwgMHgwRjsKKwlzdGF0ZS0+bV9iTWFzdGVyID0gKHVsU2xhdmUgPT0gMCk7CisKKwlzdGF0ZS0+bV9TZXR0bGluZ1RpbWUgPSB1bFNldHRsaW5nVGltZTsKKworCXN0YXRlLT5tX2JGTUlucHV0ID0gKHVsRk1JbnB1dCA9PSAyKTsKK30KKworc3RhdGljIGJvb2wgU2VhcmNoTWFwMShzdHJ1Y3QgU01hcCBNYXBbXSwKKwkJICAgICAgIHUzMiBGcmVxdWVuY3ksIHU4ICpwUGFyYW0pCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKChNYXBbaV0ubV9GcmVxdWVuY3kgIT0gMCkgJiYgKEZyZXF1ZW5jeSA+IE1hcFtpXS5tX0ZyZXF1ZW5jeSkpCisJCWkgKz0gMTsKKwlpZiAoTWFwW2ldLm1fRnJlcXVlbmN5ID09IDApCisJCXJldHVybiBmYWxzZTsKKwkqcFBhcmFtID0gTWFwW2ldLm1fUGFyYW07CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIFNlYXJjaE1hcDIoc3RydWN0IFNNYXBJIE1hcFtdLAorCQkgICAgICAgdTMyIEZyZXF1ZW5jeSwgczMyICpwUGFyYW0pCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKChNYXBbaV0ubV9GcmVxdWVuY3kgIT0gMCkgJiYKKwkgICAgICAgKEZyZXF1ZW5jeSA+IE1hcFtpXS5tX0ZyZXF1ZW5jeSkpCisJCWkgKz0gMTsKKwlpZiAoTWFwW2ldLm1fRnJlcXVlbmN5ID09IDApCisJCXJldHVybiBmYWxzZTsKKwkqcFBhcmFtID0gTWFwW2ldLm1fUGFyYW07CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIFNlYXJjaE1hcDMoc3RydWN0IFNNYXAyIE1hcFtdLCB1MzIgRnJlcXVlbmN5LAorCQkgICAgICAgdTggKnBQYXJhbTEsIHU4ICpwUGFyYW0yKQoreworCWludCBpID0gMDsKKworCXdoaWxlICgoTWFwW2ldLm1fRnJlcXVlbmN5ICE9IDApICYmCisJICAgICAgIChGcmVxdWVuY3kgPiBNYXBbaV0ubV9GcmVxdWVuY3kpKQorCQlpICs9IDE7CisJaWYgKE1hcFtpXS5tX0ZyZXF1ZW5jeSA9PSAwKQorCQlyZXR1cm4gZmFsc2U7CisJKnBQYXJhbTEgPSBNYXBbaV0ubV9QYXJhbTE7CisJKnBQYXJhbTIgPSBNYXBbaV0ubV9QYXJhbTI7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIFNlYXJjaE1hcDQoc3RydWN0IFNSRkJhbmRNYXAgTWFwW10sCisJCSAgICAgICB1MzIgRnJlcXVlbmN5LCB1OCAqcFJGQmFuZCkKK3sKKwlpbnQgaSA9IDA7CisKKwl3aGlsZSAoaSA8IDcgJiYgKEZyZXF1ZW5jeSA+IE1hcFtpXS5tX1JGX21heCkpCisJCWkgKz0gMTsKKwlpZiAoaSA9PSA3KQorCQlyZXR1cm4gZmFsc2U7CisJKnBSRkJhbmQgPSBpOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IFRoZXJtb21ldGVyUmVhZChzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSwgdTggKnBUTV9WYWx1ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCWRvIHsKKwkJdTggUmVnc1sxNl07CisJCXN0YXRlLT5tX1JlZ3NbVE1dIHw9IDB4MTA7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgVE0pOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBSZWFkKHN0YXRlLCBSZWdzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJaWYgKCgoUmVnc1tUTV0gJiAweDBGKSA9PSAwICYmIChSZWdzW1RNXSAmIDB4MjApID09IDB4MjApIHx8CisJCSAgICAoKFJlZ3NbVE1dICYgMHgwRikgPT0gOCAmJiAoUmVnc1tUTV0gJiAweDIwKSA9PSAweDAwKSkgeworCQkJc3RhdGUtPm1fUmVnc1tUTV0gXj0gMHgyMDsKKwkJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgVE0pOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCQltc2xlZXAoMTApOworCQkJc3RhdHVzID0gUmVhZChzdGF0ZSwgUmVncyk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJfQorCQkqcFRNX1ZhbHVlID0gKFJlZ3NbVE1dICYgMHgyMCkKKwkJCQk/IG1fVGhlcm1vbWV0ZXJfTWFwXzJbUmVnc1tUTV0gJiAweDBGXQorCQkJCTogbV9UaGVybW9tZXRlcl9NYXBfMVtSZWdzW1RNXSAmIDB4MEZdIDsKKwkJc3RhdGUtPm1fUmVnc1tUTV0gJj0gfjB4MTA7ICAgICAgICAvKiBUaGVybW9tZXRlciBvZmYgKi8KKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBUTSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXRlLT5tX1JlZ3NbRVA0XSAmPSB+MHgwMzsgICAgICAgLyogQ0FMX21vZGUgPSAwID8/Pz8/Pz8/PyAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQNCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoMCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFN0YW5kQnkoc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUpCit7CisJaW50IHN0YXR1cyA9IDA7CisJZG8geworCQlzdGF0ZS0+bV9SZWdzW0VCMTJdICY9IH4weDIwOyAgLyogUERfQUdDMV9EZXQgPSAwICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUIxMik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXRlLT5tX1JlZ3NbRUIxOF0gJj0gfjB4ODM7ICAvKiBBR0MxX2xvb3Bfb2ZmID0gMCwgQUdDMV9HYWluID0gNiBkQiAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCMTgpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0ZS0+bV9SZWdzW0VCMjFdIHw9IDB4MDM7IC8qIEFHQzJfR2FpbiA9IC02IGRCICovCisJCXN0YXRlLT5tX1JlZ3NbRVAzXSA9IHN0YXRlLT5tX0VQM19TdGFuZGJ5OworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQMyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXRlLT5tX1JlZ3NbRUIyM10gJj0gfjB4MDY7IC8qIEZvcmNlTFBfRmMyX0VuID0gMCwgTFBfRmNbMl0gPSAwICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZ3Moc3RhdGUsIEVCMjEsIEVCMjMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCX0gd2hpbGUgKDApOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgQ2FsY01haW5QTEwoc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUsIHUzMiBmcmVxKQoreworCisJdTggIFBvc3REaXY7CisJdTggIERpdjsKKwl1NjQgT3NjRnJlcTsKKwl1MzIgTWFpbkRpdjsKKworCWlmICghU2VhcmNoTWFwMyhtX01haW5fUExMX01hcCwgZnJlcSwgJlBvc3REaXYsICZEaXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCU9zY0ZyZXEgPSAodTY0KSBmcmVxICogKHU2NCkgRGl2OworCU9zY0ZyZXEgKj0gKHU2NCkgMTYzODQ7CisJZG9fZGl2KE9zY0ZyZXEsICh1NjQpMTYwMDAwMDApOworCU1haW5EaXYgPSBPc2NGcmVxOworCisJc3RhdGUtPm1fUmVnc1tNUERdID0gUG9zdERpdiAmIDB4Nzc7CisJc3RhdGUtPm1fUmVnc1tNRDFdID0gKChNYWluRGl2ID4+IDE2KSAmIDB4N0YpOworCXN0YXRlLT5tX1JlZ3NbTUQyXSA9ICgoTWFpbkRpdiA+PiAgOCkgJiAweEZGKTsKKwlzdGF0ZS0+bV9SZWdzW01EM10gPSAoTWFpbkRpdiAmIDB4RkYpOworCisJcmV0dXJuIFVwZGF0ZVJlZ3Moc3RhdGUsIE1QRCwgTUQzKTsKK30KKworc3RhdGljIGludCBDYWxjQ2FsUExMKHN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlLCB1MzIgZnJlcSkKK3sKKwl1OCBQb3N0RGl2OworCXU4IERpdjsKKwl1NjQgT3NjRnJlcTsKKwl1MzIgQ2FsRGl2OworCisJaWYgKCFTZWFyY2hNYXAzKG1fQ2FsX1BMTF9NYXAsIGZyZXEsICZQb3N0RGl2LCAmRGl2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlPc2NGcmVxID0gKHU2NClmcmVxICogKHU2NClEaXY7CisJLyogQ2FsRGl2ID0gdTMyKCBPc2NGcmVxICogMTYzODQgLyAxNjAwMDAwMCApOyAqLworCU9zY0ZyZXEgKj0gKHU2NCkxNjM4NDsKKwlkb19kaXYoT3NjRnJlcSwgKHU2NCkxNjAwMDAwMCk7CisJQ2FsRGl2ID0gT3NjRnJlcTsKKworCXN0YXRlLT5tX1JlZ3NbQ1BEXSA9IFBvc3REaXY7CisJc3RhdGUtPm1fUmVnc1tDRDFdID0gKChDYWxEaXYgPj4gMTYpICYgMHhGRik7CisJc3RhdGUtPm1fUmVnc1tDRDJdID0gKChDYWxEaXYgPj4gIDgpICYgMHhGRik7CisJc3RhdGUtPm1fUmVnc1tDRDNdID0gKENhbERpdiAmIDB4RkYpOworCisJcmV0dXJuIFVwZGF0ZVJlZ3Moc3RhdGUsIENQRCwgQ0QzKTsKK30KKworc3RhdGljIGludCBDYWxpYnJhdGVSRihzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSwKKwkJICAgICAgIHU4IFJGQmFuZCwgdTMyIGZyZXEsIHMzMiAqcENwcm9nKQoreworCWludCBzdGF0dXMgPSAwOworCXU4IFJlZ3NbTlVNX1JFR1NdOworCWRvIHsKKwkJdTggQlBfRmlsdGVyID0gMDsKKwkJdTggR2FpblRhcGVyID0gMDsKKwkJdTggUkZDX0sgPSAwOworCQl1OCBSRkNfTSA9IDA7CisKKwkJc3RhdGUtPm1fUmVnc1tFUDRdICY9IH4weDAzOyAvKiBDQUxfbW9kZSA9IDAgKi8KKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0ZS0+bV9SZWdzW0VCMThdIHw9IDB4MDM7ICAvKiBBR0MxX0dhaW4gPSAzICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUIxOCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJLyogU3dpdGNoaW5nIG9mZiBMVCAoYXMgZGF0YXNoZWV0IHNheXMpIGNhdXNlcyBjYWxpYnJhdGlvbiBvbiBDMSB0byBmYWlsICovCisJCS8qIChSZWFkb3V0IG9mIENwcm9nIGlzIGFsbHdheXMgMjU1KSAqLworCQlpZiAoc3RhdGUtPm1fUmVnc1tJRF0gIT0gMHg4MykgICAgLyogQzE6IElEID09IDgzLCBDMjogSUQgPT0gODQgKi8KKwkJCXN0YXRlLT5tX1JlZ3NbRVAzXSB8PSAweDQwOyAvKiBTTV9MVCA9IDEgKi8KKworCQlpZiAoIShTZWFyY2hNYXAxKG1fQlBfRmlsdGVyX01hcCwgZnJlcSwgJkJQX0ZpbHRlcikgJiYKKwkJCVNlYXJjaE1hcDEobV9HYWluVGFwZXJfTWFwLCBmcmVxLCAmR2FpblRhcGVyKSAmJgorCQkJU2VhcmNoTWFwMyhtX0tNX01hcCwgZnJlcSwgJlJGQ19LLCAmUkZDX00pKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXN0YXRlLT5tX1JlZ3NbRVAxXSA9IChzdGF0ZS0+bV9SZWdzW0VQMV0gJiB+MHgwNykgfCBCUF9GaWx0ZXI7CisJCXN0YXRlLT5tX1JlZ3NbRVAyXSA9IChSRkJhbmQgPDwgNSkgfCBHYWluVGFwZXI7CisKKwkJc3RhdGUtPm1fUmVnc1tFQjEzXSA9IChzdGF0ZS0+bV9SZWdzW0VCMTNdICYgfjB4N0MpIHwgKFJGQ19LIDw8IDQpIHwgKFJGQ19NIDw8IDIpOworCisJCXN0YXR1cyA9IFVwZGF0ZVJlZ3Moc3RhdGUsIEVQMSwgRVAzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFQjEzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQlzdGF0ZS0+bV9SZWdzW0VCNF0gfD0gMHgyMDsgICAgLyogTE9fRm9yY2VTcmNlID0gMSAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCNCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJc3RhdGUtPm1fUmVnc1tFQjddIHw9IDB4MjA7ICAgIC8qIENBTF9Gb3JjZVNyY2UgPSAxICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUI3KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQlzdGF0ZS0+bV9SZWdzW0VCMTRdID0gMDsgLyogUkZDX0Nwcm9nID0gMCAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCMTQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCXN0YXRlLT5tX1JlZ3NbRUIyMF0gJj0gfjB4MjA7ICAvKiBGb3JjZUxvY2sgPSAwOyAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCMjApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCXN0YXRlLT5tX1JlZ3NbRVA0XSB8PSAweDAzOyAgLyogQ0FMX01vZGUgPSAzICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZ3Moc3RhdGUsIEVQNCwgRVA1KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQlzdGF0dXMgPSBDYWxjQ2FsUExMKHN0YXRlLCBmcmVxKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gQ2FsY01haW5QTEwoc3RhdGUsIGZyZXEgKyAxMDAwMDAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQltc2xlZXAoNSk7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVAyKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQMik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVAxKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQlzdGF0ZS0+bV9SZWdzW0VCNF0gJj0gfjB4MjA7ICAgIC8qIExPX0ZvcmNlU3JjZSA9IDAgKi8KKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFQjQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCXN0YXRlLT5tX1JlZ3NbRUI3XSAmPSB+MHgyMDsgICAgLyogQ0FMX0ZvcmNlU3JjZSA9IDAgKi8KKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFQjcpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQltc2xlZXAoMTApOworCisJCXN0YXRlLT5tX1JlZ3NbRUIyMF0gfD0gMHgyMDsgIC8qIEZvcmNlTG9jayA9IDE7ICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUIyMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCW1zbGVlcCg2MCk7CisKKwkJc3RhdGUtPm1fUmVnc1tFUDRdICY9IH4weDAzOyAgLyogQ0FMX01vZGUgPSAwICovCisJCXN0YXRlLT5tX1JlZ3NbRVAzXSAmPSB+MHg0MDsgLyogU01fTFQgPSAwICovCisJCXN0YXRlLT5tX1JlZ3NbRUIxOF0gJj0gfjB4MDM7ICAvKiBBR0MxX0dhaW4gPSAwICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUIxOCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZ3Moc3RhdGUsIEVQMywgRVA0KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCXN0YXR1cyA9IFJlYWRFeHRlbnRlZChzdGF0ZSwgUmVncyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJKnBDcHJvZyA9IFJlZ3NbRUIxNF07CisKKwl9IHdoaWxlICgwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFJGVHJhY2tpbmdGaWx0ZXJzSW5pdChzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSwKKwkJCQkgdTggUkZCYW5kKQoreworCWludCBzdGF0dXMgPSAwOworCisJdTMyICAgUkYxID0gbV9SRl9CYW5kX01hcFtSRkJhbmRdLm1fUkYxX0RlZmF1bHQ7CisJdTMyICAgUkYyID0gbV9SRl9CYW5kX01hcFtSRkJhbmRdLm1fUkYyX0RlZmF1bHQ7CisJdTMyICAgUkYzID0gbV9SRl9CYW5kX01hcFtSRkJhbmRdLm1fUkYzX0RlZmF1bHQ7CisJYm9vbCAgICBiY2FsID0gZmFsc2U7CisKKwlzMzIgICAgQ3Byb2dfY2FsMSA9IDA7CisJczMyICAgIENwcm9nX3RhYmxlMSA9IDA7CisJczMyICAgIENwcm9nX2NhbDIgPSAwOworCXMzMiAgICBDcHJvZ190YWJsZTIgPSAwOworCXMzMiAgICBDcHJvZ19jYWwzID0gMDsKKwlzMzIgICAgQ3Byb2dfdGFibGUzID0gMDsKKworCXN0YXRlLT5tX1JGX0ExW1JGQmFuZF0gPSAwOworCXN0YXRlLT5tX1JGX0IxW1JGQmFuZF0gPSAwOworCXN0YXRlLT5tX1JGX0EyW1JGQmFuZF0gPSAwOworCXN0YXRlLT5tX1JGX0IyW1JGQmFuZF0gPSAwOworCisJZG8geworCQlzdGF0dXMgPSBQb3dlclNjYW4oc3RhdGUsIFJGQmFuZCwgUkYxLCAmUkYxLCAmYmNhbCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCWlmIChiY2FsKSB7CisJCQlzdGF0dXMgPSBDYWxpYnJhdGVSRihzdGF0ZSwgUkZCYW5kLCBSRjEsICZDcHJvZ19jYWwxKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCQl9CisJCVNlYXJjaE1hcDIobV9SRl9DYWxfTWFwLCBSRjEsICZDcHJvZ190YWJsZTEpOworCQlpZiAoIWJjYWwpCisJCQlDcHJvZ19jYWwxID0gQ3Byb2dfdGFibGUxOworCQlzdGF0ZS0+bV9SRl9CMVtSRkJhbmRdID0gQ3Byb2dfY2FsMSAtIENwcm9nX3RhYmxlMTsKKwkJLyogc3RhdGUtPm1fUkZfQTFbUkZfQmFuZF0gPSA/Pz8/ICovCisKKwkJaWYgKFJGMiA9PSAwKQorCQkJYnJlYWs7CisKKwkJc3RhdHVzID0gUG93ZXJTY2FuKHN0YXRlLCBSRkJhbmQsIFJGMiwgJlJGMiwgJmJjYWwpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlpZiAoYmNhbCkgeworCQkJc3RhdHVzID0gQ2FsaWJyYXRlUkYoc3RhdGUsIFJGQmFuZCwgUkYyLCAmQ3Byb2dfY2FsMik7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJfQorCQlTZWFyY2hNYXAyKG1fUkZfQ2FsX01hcCwgUkYyLCAmQ3Byb2dfdGFibGUyKTsKKwkJaWYgKCFiY2FsKQorCQkJQ3Byb2dfY2FsMiA9IENwcm9nX3RhYmxlMjsKKworCQlzdGF0ZS0+bV9SRl9BMVtSRkJhbmRdID0KKwkJCShDcHJvZ19jYWwyIC0gQ3Byb2dfdGFibGUyIC0gQ3Byb2dfY2FsMSArIENwcm9nX3RhYmxlMSkgLworCQkJKChzMzIpKFJGMikgLSAoczMyKShSRjEpKTsKKworCQlpZiAoUkYzID09IDApCisJCQlicmVhazsKKworCQlzdGF0dXMgPSBQb3dlclNjYW4oc3RhdGUsIFJGQmFuZCwgUkYzLCAmUkYzLCAmYmNhbCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCWlmIChiY2FsKSB7CisJCQlzdGF0dXMgPSBDYWxpYnJhdGVSRihzdGF0ZSwgUkZCYW5kLCBSRjMsICZDcHJvZ19jYWwzKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCQl9CisJCVNlYXJjaE1hcDIobV9SRl9DYWxfTWFwLCBSRjMsICZDcHJvZ190YWJsZTMpOworCQlpZiAoIWJjYWwpCisJCQlDcHJvZ19jYWwzID0gQ3Byb2dfdGFibGUzOworCQlzdGF0ZS0+bV9SRl9BMltSRkJhbmRdID0gKENwcm9nX2NhbDMgLSBDcHJvZ190YWJsZTMgLSBDcHJvZ19jYWwyICsgQ3Byb2dfdGFibGUyKSAvICgoczMyKShSRjMpIC0gKHMzMikoUkYyKSk7CisJCXN0YXRlLT5tX1JGX0IyW1JGQmFuZF0gPSBDcHJvZ19jYWwyIC0gQ3Byb2dfdGFibGUyOworCisJfSB3aGlsZSAoMCk7CisKKwlzdGF0ZS0+bV9SRjFbUkZCYW5kXSA9IFJGMTsKKwlzdGF0ZS0+bV9SRjJbUkZCYW5kXSA9IFJGMjsKKwlzdGF0ZS0+bV9SRjNbUkZCYW5kXSA9IFJGMzsKKworI2lmIDAKKwlwcmludGsoS0VSTl9FUlIgInRkYTE4MjcxYzJkZDogJXMgJWQgUkYxID0gJWQgQTEgPSAlZCBCMSA9ICVkIFJGMiA9ICVkIEEyID0gJWQgQjIgPSAlZCBSRjMgPSAlZFxuIiwgX19mdW5jX18sCisJICAgICAgIFJGQmFuZCwgUkYxLCBzdGF0ZS0+bV9SRl9BMVtSRkJhbmRdLCBzdGF0ZS0+bV9SRl9CMVtSRkJhbmRdLCBSRjIsCisJICAgICAgIHN0YXRlLT5tX1JGX0EyW1JGQmFuZF0sIHN0YXRlLT5tX1JGX0IyW1JGQmFuZF0sIFJGMyk7CisjZW5kaWYKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgUG93ZXJTY2FuKHN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlLAorCQkgICAgIHU4IFJGQmFuZCwgdTMyIFJGX2luLCB1MzIgKnBSRl9PdXQsIGJvb2wgKnBiY2FsKQoreworCWludCBzdGF0dXMgPSAwOworCWRvIHsKKwkJdTggICBHYWluX1RhcGVyID0gMDsKKwkJczMyICBSRkNfQ3Byb2cgPSAwOworCQl1OCAgIENJRF9UYXJnZXQgPSAwOworCQl1OCAgIENvdW50TGltaXQgPSAwOworCQl1MzIgIGZyZXFfTWFpblBMTDsKKwkJdTggICBSZWdzW05VTV9SRUdTXTsKKwkJdTggICBDSURfR2FpbjsKKwkJczMyICBDb3VudCA9IDA7CisJCWludCAgc2lnbiAgPSAxOworCQlib29sIHdhaXQgPSBmYWxzZTsKKworCQlpZiAoIShTZWFyY2hNYXAyKG1fUkZfQ2FsX01hcCwgUkZfaW4sICZSRkNfQ3Byb2cpICYmCisJCSAgICAgIFNlYXJjaE1hcDEobV9HYWluVGFwZXJfTWFwLCBSRl9pbiwgJkdhaW5fVGFwZXIpICYmCisJCSAgICAgIFNlYXJjaE1hcDMobV9DSURfVGFyZ2V0X01hcCwgUkZfaW4sICZDSURfVGFyZ2V0LCAmQ291bnRMaW1pdCkpKSB7CisKKwkJCXByaW50ayhLRVJOX0VSUiAidGRhMTgyNzFjMmRkOiAlcyBTZWFyY2ggbWFwIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlzdGF0ZS0+bV9SZWdzW0VQMl0gPSAoUkZCYW5kIDw8IDUpIHwgR2Fpbl9UYXBlcjsKKwkJc3RhdGUtPm1fUmVnc1tFQjE0XSA9IChSRkNfQ3Byb2cpOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQMik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUIxNCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJZnJlcV9NYWluUExMID0gUkZfaW4gKyAxMDAwMDAwOworCQlzdGF0dXMgPSBDYWxjTWFpblBMTChzdGF0ZSwgZnJlcV9NYWluUExMKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJbXNsZWVwKDUpOworCQlzdGF0ZS0+bV9SZWdzW0VQNF0gPSAoc3RhdGUtPm1fUmVnc1tFUDRdICYgfjB4MDMpIHwgMTsgICAgLyogQ0FMX21vZGUgPSAxICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVA0KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDIpOyAgLyogTGF1bmNoIHBvd2VyIG1lYXN1cmVtZW50ICovCisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFJlYWRFeHRlbnRlZChzdGF0ZSwgUmVncyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCUNJRF9HYWluID0gUmVnc1tFQjEwXSAmIDB4M0Y7CisJCXN0YXRlLT5tX1JlZ3NbSURdID0gUmVnc1tJRF07ICAvKiBDaGlwIHZlcnNpb24sIChuZWVkZWQgZm9yIEMxIHdvcmthcnJvdW5kIGluIENhbGlicmF0ZVJGKSAqLworCisJCSpwUkZfT3V0ID0gUkZfaW47CisKKwkJd2hpbGUgKENJRF9HYWluIDwgQ0lEX1RhcmdldCkgeworCQkJZnJlcV9NYWluUExMID0gUkZfaW4gKyBzaWduICogQ291bnQgKyAxMDAwMDAwOworCQkJc3RhdHVzID0gQ2FsY01haW5QTEwoc3RhdGUsIGZyZXFfTWFpblBMTCk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJCW1zbGVlcCh3YWl0ID8gNSA6IDEpOworCQkJd2FpdCA9IGZhbHNlOworCQkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDIpOyAgLyogTGF1bmNoIHBvd2VyIG1lYXN1cmVtZW50ICovCisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJCXN0YXR1cyA9IFJlYWRFeHRlbnRlZChzdGF0ZSwgUmVncyk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJCUNJRF9HYWluID0gUmVnc1tFQjEwXSAmIDB4M0Y7CisJCQlDb3VudCArPSAyMDAwMDA7CisKKwkJCWlmIChDb3VudCA8IENvdW50TGltaXQgKiAxMDAwMDApCisJCQkJY29udGludWU7CisJCQlpZiAoc2lnbiA8IDApCisJCQkJYnJlYWs7CisKKwkJCXNpZ24gPSAtc2lnbjsKKwkJCUNvdW50ID0gMjAwMDAwOworCQkJd2FpdCA9IHRydWU7CisJCX0KKwkJc3RhdHVzID0gc3RhdHVzOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlpZiAoQ0lEX0dhaW4gPj0gQ0lEX1RhcmdldCkgeworCQkJKnBiY2FsID0gdHJ1ZTsKKwkJCSpwUkZfT3V0ID0gZnJlcV9NYWluUExMIC0gMTAwMDAwMDsKKwkJfSBlbHNlCisJCQkqcGJjYWwgPSBmYWxzZTsKKwl9IHdoaWxlICgwKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgUG93ZXJTY2FuSW5pdChzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlkbyB7CisJCXN0YXRlLT5tX1JlZ3NbRVAzXSA9IChzdGF0ZS0+bV9SZWdzW0VQM10gJiB+MHgxRikgfCAweDEyOworCQlzdGF0ZS0+bV9SZWdzW0VQNF0gPSAoc3RhdGUtPm1fUmVnc1tFUDRdICYgfjB4MUYpOyAvKiBJZiBsZXZlbCA9IDAsIENhbCBtb2RlID0gMCAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWdzKHN0YXRlLCBFUDMsIEVQNCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXRlLT5tX1JlZ3NbRUIxOF0gPSAoc3RhdGUtPm1fUmVnc1tFQjE4XSAmIH4weDAzKTsgLyogQUdDIDEgR2FpbiA9IDAgKi8KKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFQjE4KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdGUtPm1fUmVnc1tFQjIxXSA9IChzdGF0ZS0+bV9SZWdzW0VCMjFdICYgfjB4MDMpOyAvKiBBR0MgMiBHYWluID0gMCAoRGF0YXNoZWV0ID0gMykgKi8KKwkJc3RhdGUtPm1fUmVnc1tFQjIzXSA9IChzdGF0ZS0+bV9SZWdzW0VCMjNdIHwgMHgwNik7IC8qIEZvcmNlTFBfRmMyX0VuID0gMSwgTFBGY1syXSA9IDEgKi8KKwkJc3RhdHVzID0gVXBkYXRlUmVncyhzdGF0ZSwgRUIyMSwgRUIyMyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoMCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBDYWxjUkZGaWx0ZXJDdXJ2ZShzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlkbyB7CisJCW1zbGVlcCgyMDApOyAgICAgIC8qIFRlbXBlcmF0dXJlIHN0YWJpbGlzYXRpb24gKi8KKwkJc3RhdHVzID0gUG93ZXJTY2FuSW5pdChzdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFJGVHJhY2tpbmdGaWx0ZXJzSW5pdChzdGF0ZSwgMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFJGVHJhY2tpbmdGaWx0ZXJzSW5pdChzdGF0ZSwgMSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFJGVHJhY2tpbmdGaWx0ZXJzSW5pdChzdGF0ZSwgMik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFJGVHJhY2tpbmdGaWx0ZXJzSW5pdChzdGF0ZSwgMyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFJGVHJhY2tpbmdGaWx0ZXJzSW5pdChzdGF0ZSwgNCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFJGVHJhY2tpbmdGaWx0ZXJzSW5pdChzdGF0ZSwgNSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFJGVHJhY2tpbmdGaWx0ZXJzSW5pdChzdGF0ZSwgNik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFRoZXJtb21ldGVyUmVhZChzdGF0ZSwgJnN0YXRlLT5tX1RNVmFsdWVfUkZDYWwpOyAvKiBhbHNvIHN3aXRjaGVzIG9mZiBDYWwgbW9kZSAhISEgKi8KKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwl9IHdoaWxlICgwKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgRml4ZWRDb250ZW50c0kyQ1VwZGF0ZShzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSkKK3sKKwlzdGF0aWMgdTggSW5pdFJlZ3NbXSA9IHsKKwkJMHgwOCwgMHg4MCwgMHhDNiwKKwkJMHhERiwgMHgxNiwgMHg2MCwgMHg4MCwKKwkJMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJMHhGQywgMHgwMSwgMHg4NCwgMHg0MSwKKwkJMHgwMSwgMHg4NCwgMHg0MCwgMHgwNywKKwkJMHgwMCwgMHgwMCwgMHg5NiwgMHgzRiwKKwkJMHhDMSwgMHgwMCwgMHg4RiwgMHgwMCwKKwkJMHgwMCwgMHg4QywgMHgwMCwgMHgyMCwKKwkJMHhCMywgMHg0OCwgMHhCMCwKKwl9OworCWludCBzdGF0dXMgPSAwOworCW1lbWNweSgmc3RhdGUtPm1fUmVnc1tUTV0sIEluaXRSZWdzLCBFQjIzIC0gVE0gKyAxKTsKKwlkbyB7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZ3Moc3RhdGUsIFRNLCBFQjIzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQkvKiBBR0MxIGdhaW4gc2V0dXAgKi8KKwkJc3RhdGUtPm1fUmVnc1tFQjE3XSA9IDB4MDA7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUIxNyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXRlLT5tX1JlZ3NbRUIxN10gPSAweDAzOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCMTcpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0ZS0+bV9SZWdzW0VCMTddID0gMHg0MzsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFQjE3KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdGUtPm1fUmVnc1tFQjE3XSA9IDB4NEM7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUIxNyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJLyogSVJDIENhbCBMb3cgYmFuZCAqLworCQlzdGF0ZS0+bV9SZWdzW0VQM10gPSAweDFGOworCQlzdGF0ZS0+bV9SZWdzW0VQNF0gPSAweDY2OworCQlzdGF0ZS0+bV9SZWdzW0VQNV0gPSAweDgxOworCQlzdGF0ZS0+bV9SZWdzW0NQRF0gPSAweENDOworCQlzdGF0ZS0+bV9SZWdzW0NEMV0gPSAweDZDOworCQlzdGF0ZS0+bV9SZWdzW0NEMl0gPSAweDAwOworCQlzdGF0ZS0+bV9SZWdzW0NEM10gPSAweDAwOworCQlzdGF0ZS0+bV9SZWdzW01QRF0gPSAweEM1OworCQlzdGF0ZS0+bV9SZWdzW01EMV0gPSAweDc3OworCQlzdGF0ZS0+bV9SZWdzW01EMl0gPSAweDA4OworCQlzdGF0ZS0+bV9SZWdzW01EM10gPSAweDAwOworCQlzdGF0dXMgPSBVcGRhdGVSZWdzKHN0YXRlLCBFUDIsIE1EMyk7IC8qIGRpZmYgYmV0d2VlbiBzdyBhbmQgZGF0YXNoZWV0IChlcDMtbWQzKSAqLworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisjaWYgMAorCQlzdGF0ZS0+bV9SZWdzW0VCNF0gPSAweDYxOyAgICAgICAgICAvKiBtaXNzaW5nIGluIHN3ICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUI0KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJbXNsZWVwKDEpOworCQlzdGF0ZS0+bV9SZWdzW0VCNF0gPSAweDQxOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCNCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisjZW5kaWYKKworCQltc2xlZXAoNSk7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVAxKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJbXNsZWVwKDUpOworCisJCXN0YXRlLT5tX1JlZ3NbRVA1XSA9IDB4ODU7CisJCXN0YXRlLT5tX1JlZ3NbQ1BEXSA9IDB4Q0I7CisJCXN0YXRlLT5tX1JlZ3NbQ0QxXSA9IDB4NjY7CisJCXN0YXRlLT5tX1JlZ3NbQ0QyXSA9IDB4NzA7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZ3Moc3RhdGUsIEVQMywgQ0QzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJbXNsZWVwKDUpOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQMik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCW1zbGVlcCgzMCk7CisKKwkJLyogSVJDIENhbCBtaWQgYmFuZCAqLworCQlzdGF0ZS0+bV9SZWdzW0VQNV0gPSAweDgyOworCQlzdGF0ZS0+bV9SZWdzW0NQRF0gPSAweEE4OworCQlzdGF0ZS0+bV9SZWdzW0NEMl0gPSAweDAwOworCQlzdGF0ZS0+bV9SZWdzW01QRF0gPSAweEExOyAvKiBEYXRhc2hlZXQgPSAweEE5ICovCisJCXN0YXRlLT5tX1JlZ3NbTUQxXSA9IDB4NzM7CisJCXN0YXRlLT5tX1JlZ3NbTUQyXSA9IDB4MUE7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZ3Moc3RhdGUsIEVQMywgTUQzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQltc2xlZXAoNSk7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVAxKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJbXNsZWVwKDUpOworCisJCXN0YXRlLT5tX1JlZ3NbRVA1XSA9IDB4ODY7CisJCXN0YXRlLT5tX1JlZ3NbQ1BEXSA9IDB4QTg7CisJCXN0YXRlLT5tX1JlZ3NbQ0QxXSA9IDB4NjY7CisJCXN0YXRlLT5tX1JlZ3NbQ0QyXSA9IDB4QTA7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZ3Moc3RhdGUsIEVQMywgQ0QzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJbXNsZWVwKDUpOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQMik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCW1zbGVlcCgzMCk7CisKKwkJLyogSVJDIENhbCBoaWdoIGJhbmQgKi8KKwkJc3RhdGUtPm1fUmVnc1tFUDVdID0gMHg4MzsKKwkJc3RhdGUtPm1fUmVnc1tDUERdID0gMHg5ODsKKwkJc3RhdGUtPm1fUmVnc1tDRDFdID0gMHg2NTsKKwkJc3RhdGUtPm1fUmVnc1tDRDJdID0gMHgwMDsKKwkJc3RhdGUtPm1fUmVnc1tNUERdID0gMHg5MTsgIC8qIERhdGFzaGVldCA9IDB4OTEgKi8KKwkJc3RhdGUtPm1fUmVnc1tNRDFdID0gMHg3MTsKKwkJc3RhdGUtPm1fUmVnc1tNRDJdID0gMHhDRDsKKwkJc3RhdHVzID0gVXBkYXRlUmVncyhzdGF0ZSwgRVAzLCBNRDMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQltc2xlZXAoNSk7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVAxKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJbXNsZWVwKDUpOworCQlzdGF0ZS0+bV9SZWdzW0VQNV0gPSAweDg3OworCQlzdGF0ZS0+bV9SZWdzW0NEMV0gPSAweDY1OworCQlzdGF0ZS0+bV9SZWdzW0NEMl0gPSAweDUwOworCQlzdGF0dXMgPSBVcGRhdGVSZWdzKHN0YXRlLCBFUDMsIENEMyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCW1zbGVlcCg1KTsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDIpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQltc2xlZXAoMzApOworCisJCS8qIEJhY2sgdG8gbm9ybWFsICovCisJCXN0YXRlLT5tX1JlZ3NbRVA0XSA9IDB4NjQ7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVA0KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJfSB3aGlsZSAoMCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBJbml0Q2FsKHN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXMgPSAwOworCisJZG8geworCQlzdGF0dXMgPSBGaXhlZENvbnRlbnRzSTJDVXBkYXRlKHN0YXRlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gQ2FsY1JGRmlsdGVyQ3VydmUoc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBTdGFuZEJ5KHN0YXRlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJLyogbV9iSW5pdERvbmUgPSB0cnVlOyAqLworCX0gd2hpbGUgKDApOworCXJldHVybiBzdGF0dXM7Cit9OworCitzdGF0aWMgaW50IFJGVHJhY2tpbmdGaWx0ZXJzQ29ycmVjdGlvbihzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSwKKwkJCQkgICAgICAgdTMyIEZyZXF1ZW5jeSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzMzIgQ3Byb2dfdGFibGU7CisJdTggUkZCYW5kOworCXU4IGRDb3ZlcmRUOworCisJaWYgKCFTZWFyY2hNYXAyKG1fUkZfQ2FsX01hcCwgRnJlcXVlbmN5LCAmQ3Byb2dfdGFibGUpIHx8CisJICAgICFTZWFyY2hNYXA0KG1fUkZfQmFuZF9NYXAsIEZyZXF1ZW5jeSwgJlJGQmFuZCkgfHwKKwkgICAgIVNlYXJjaE1hcDEobV9SRl9DYWxfRENfT3Zlcl9EVF9NYXAsIEZyZXF1ZW5jeSwgJmRDb3ZlcmRUKSkKKworCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvIHsKKwkJdTggVE1WYWx1ZV9DdXJyZW50OworCQl1MzIgICBSRjEgPSBzdGF0ZS0+bV9SRjFbUkZCYW5kXTsKKwkJdTMyICAgUkYyID0gc3RhdGUtPm1fUkYxW1JGQmFuZF07CisJCXUzMiAgIFJGMyA9IHN0YXRlLT5tX1JGMVtSRkJhbmRdOworCQlzMzIgICAgUkZfQTEgPSBzdGF0ZS0+bV9SRl9BMVtSRkJhbmRdOworCQlzMzIgICAgUkZfQjEgPSBzdGF0ZS0+bV9SRl9CMVtSRkJhbmRdOworCQlzMzIgICAgUkZfQTIgPSBzdGF0ZS0+bV9SRl9BMltSRkJhbmRdOworCQlzMzIgICAgUkZfQjIgPSBzdGF0ZS0+bV9SRl9CMltSRkJhbmRdOworCQlzMzIgQ2FwcHJveCA9IDA7CisJCWludCBUQ29tcDsKKworCQlzdGF0ZS0+bV9SZWdzW0VQM10gJj0gfjB4RTA7ICAvKiBQb3dlciB1cCAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQMyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJc3RhdHVzID0gVGhlcm1vbWV0ZXJSZWFkKHN0YXRlLCAmVE1WYWx1ZV9DdXJyZW50KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQlpZiAoUkYzID09IDAgfHwgRnJlcXVlbmN5IDwgUkYyKQorCQkJQ2FwcHJveCA9IFJGX0ExICogKChzMzIpKEZyZXF1ZW5jeSkgLSAoczMyKShSRjEpKSArIFJGX0IxICsgQ3Byb2dfdGFibGU7CisJCWVsc2UKKwkJCUNhcHByb3ggPSBSRl9BMiAqICgoczMyKShGcmVxdWVuY3kpIC0gKHMzMikoUkYyKSkgKyBSRl9CMiArIENwcm9nX3RhYmxlOworCisJCVRDb21wID0gKGludCkoZENvdmVyZFQpICogKChpbnQpKFRNVmFsdWVfQ3VycmVudCkgLSAoaW50KShzdGF0ZS0+bV9UTVZhbHVlX1JGQ2FsKSkvMTAwMDsKKworCQlDYXBwcm94ICs9IFRDb21wOworCisJCWlmIChDYXBwcm94IDwgMCkKKwkJCUNhcHByb3ggPSAwOworCQllbHNlIGlmIChDYXBwcm94ID4gMjU1KQorCQkJQ2FwcHJveCA9IDI1NTsKKworCisJCS8qIFRPRE8gVGVtcGVyYXR1cmUgY29tcGVuc2F0aW9uLiBUaGVyZSBpcyBkZWZlbml0ZWx5IGEgc2NhbGUgZmFjdG9yICovCisJCS8qICAgICAgbWlzc2luZyBpbiB0aGUgZGF0YXNoZWV0LCBzbyBsZWF2ZSBpdCBvdXQgZm9yIG5vdy4gICAgICAgICAgICovCisJCXN0YXRlLT5tX1JlZ3NbRUIxNF0gPSBDYXBwcm94OworCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUIxNCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwl9IHdoaWxlICgwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IENoYW5uZWxDb25maWd1cmF0aW9uKHN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlLAorCQkJCXUzMiBGcmVxdWVuY3ksIGludCBTdGFuZGFyZCkKK3sKKworCXMzMiBJbnRlcm1lZGlhdGVGcmVxdWVuY3kgPSBtX1N0YW5kYXJkVGFibGVbU3RhbmRhcmRdLm1fSUZGcmVxdWVuY3k7CisJaW50IHN0YXR1cyA9IDA7CisKKwl1OCBCUF9GaWx0ZXIgPSAwOworCXU4IFJGX0JhbmQgPSAwOworCXU4IEdhaW5UYXBlciA9IDA7CisJdTggSVJfTWVhcyA9IDA7CisKKwlzdGF0ZS0+SUYgPSBJbnRlcm1lZGlhdGVGcmVxdWVuY3k7CisJLyogcHJpbnRrKCJ0ZGExODI3MWMyZGQ6ICVzIEZyZXEgPSAlZCBTdGFuZGFyZCA9ICVkIElGID0gJWRcbiIsIF9fZnVuY19fLCBGcmVxdWVuY3ksIFN0YW5kYXJkLCBJbnRlcm1lZGlhdGVGcmVxdWVuY3kpOyAqLworCS8qIGdldCB2YWx1ZXMgZnJvbSB0YWJsZXMgKi8KKworCWlmICghKFNlYXJjaE1hcDEobV9CUF9GaWx0ZXJfTWFwLCBGcmVxdWVuY3ksICZCUF9GaWx0ZXIpICYmCisJICAgICAgIFNlYXJjaE1hcDEobV9HYWluVGFwZXJfTWFwLCBGcmVxdWVuY3ksICZHYWluVGFwZXIpICYmCisJICAgICAgIFNlYXJjaE1hcDEobV9JUl9NZWFzX01hcCwgRnJlcXVlbmN5LCAmSVJfTWVhcykgJiYKKwkgICAgICAgU2VhcmNoTWFwNChtX1JGX0JhbmRfTWFwLCBGcmVxdWVuY3ksICZSRl9CYW5kKSkpIHsKKworCQlwcmludGsoS0VSTl9FUlIgInRkYTE4MjcxYzJkZDogJXMgU2VhcmNoTWFwIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkbyB7CisJCXN0YXRlLT5tX1JlZ3NbRVAzXSA9IChzdGF0ZS0+bV9SZWdzW0VQM10gJiB+MHgxRikgfCBtX1N0YW5kYXJkVGFibGVbU3RhbmRhcmRdLm1fRVAzXzRfMDsKKwkJc3RhdGUtPm1fUmVnc1tFUDNdICY9IH4weDA0OyAgIC8qIHN3aXRjaCBSRkFHQyB0byBoaWdoIHNwZWVkIG1vZGUgKi8KKworCQkvKiBtX0VQNCBkZWZhdWx0IGZvciBYVG91dE9uLCBDQUxfTW9kZSAoMCkgKi8KKwkJc3RhdGUtPm1fUmVnc1tFUDRdID0gc3RhdGUtPm1fRVA0IHwgKChTdGFuZGFyZCA+IEhGX0FuYWxvZ01heCkgPyBzdGF0ZS0+bV9JRkxldmVsRGlnaXRhbCA6IHN0YXRlLT5tX0lGTGV2ZWxBbmFsb2cpOworCQkvKiBzdGF0ZS0+bV9SZWdzW0VQNF0gPSBzdGF0ZS0+bV9FUDQgfCBzdGF0ZS0+bV9JRkxldmVsRGlnaXRhbDsgKi8KKwkJaWYgKFN0YW5kYXJkIDw9IEhGX0FuYWxvZ01heCkKKwkJCXN0YXRlLT5tX1JlZ3NbRVA0XSA9IHN0YXRlLT5tX0VQNCB8IHN0YXRlLT5tX0lGTGV2ZWxBbmFsb2c7CisJCWVsc2UgaWYgKFN0YW5kYXJkIDw9IEhGX0FUU0MpCisJCQlzdGF0ZS0+bV9SZWdzW0VQNF0gPSBzdGF0ZS0+bV9FUDQgfCBzdGF0ZS0+bV9JRkxldmVsRFZCVDsKKwkJZWxzZSBpZiAoU3RhbmRhcmQgPD0gSEZfRFZCQykKKwkJCXN0YXRlLT5tX1JlZ3NbRVA0XSA9IHN0YXRlLT5tX0VQNCB8IHN0YXRlLT5tX0lGTGV2ZWxEVkJDOworCQllbHNlCisJCQlzdGF0ZS0+bV9SZWdzW0VQNF0gPSBzdGF0ZS0+bV9FUDQgfCBzdGF0ZS0+bV9JRkxldmVsRGlnaXRhbDsKKworCQlpZiAoKFN0YW5kYXJkID09IEhGX0ZNX1JhZGlvKSAmJiBzdGF0ZS0+bV9iRk1JbnB1dCkKKwkJCXN0YXRlLT5tX1JlZ3NbRVA0XSB8PSA4MDsKKworCQlzdGF0ZS0+bV9SZWdzW01QRF0gJj0gfjB4ODA7CisJCWlmIChTdGFuZGFyZCA+IEhGX0FuYWxvZ01heCkKKwkJCXN0YXRlLT5tX1JlZ3NbTVBEXSB8PSAweDgwOyAvKiBBZGQgSUZfbm90Y2ggZm9yIGRpZ2l0YWwgKi8KKworCQlzdGF0ZS0+bV9SZWdzW0VCMjJdID0gbV9TdGFuZGFyZFRhYmxlW1N0YW5kYXJkXS5tX0VCMjI7CisKKwkJLyogTm90ZTogVGhpcyBpcyBtaXNzaW5nIGZyb20gZmxvd2NoYXJ0IGluIFREQTE4MjcxIHNwZWNpZmljYXRpb24gKCAxLjUgTUh6IGN1dG9mZiBmb3IgRk0gKSAqLworCQlpZiAoU3RhbmRhcmQgPT0gSEZfRk1fUmFkaW8pCisJCQlzdGF0ZS0+bV9SZWdzW0VCMjNdIHw9ICAweDA2OyAvKiBGb3JjZUxQX0ZjMl9FbiA9IDEsIExQRmNbMl0gPSAxICovCisJCWVsc2UKKwkJCXN0YXRlLT5tX1JlZ3NbRUIyM10gJj0gfjB4MDY7IC8qIEZvcmNlTFBfRmMyX0VuID0gMCwgTFBGY1syXSA9IDAgKi8KKworCQlzdGF0dXMgPSBVcGRhdGVSZWdzKHN0YXRlLCBFQjIyLCBFQjIzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQlzdGF0ZS0+bV9SZWdzW0VQMV0gPSAoc3RhdGUtPm1fUmVnc1tFUDFdICYgfjB4MDcpIHwgMHg0MCB8IEJQX0ZpbHRlcjsgICAvKiBEaXNfUG93ZXJfbGV2ZWwgPSAxLCBGaWx0ZXIgKi8KKwkJc3RhdGUtPm1fUmVnc1tFUDVdID0gKHN0YXRlLT5tX1JlZ3NbRVA1XSAmIH4weDA3KSB8IElSX01lYXM7CisJCXN0YXRlLT5tX1JlZ3NbRVAyXSA9IChSRl9CYW5kIDw8IDUpIHwgR2FpblRhcGVyOworCisJCXN0YXRlLT5tX1JlZ3NbRUIxXSA9IChzdGF0ZS0+bV9SZWdzW0VCMV0gJiB+MHgwNykgfAorCQkJKHN0YXRlLT5tX2JNYXN0ZXIgPyAweDA0IDogMHgwMCk7IC8qIENBTFZDT19Gb3J0TE9uID0gTVMgKi8KKwkJLyogQUdDMV9hbHdheXNfbWFzdGVyID0gMCAqLworCQkvKiBBR0NfZmlyc3RuID0gMCAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCMSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJaWYgKHN0YXRlLT5tX2JNYXN0ZXIpIHsKKwkJCXN0YXR1cyA9IENhbGNNYWluUExMKHN0YXRlLCBGcmVxdWVuY3kgKyBJbnRlcm1lZGlhdGVGcmVxdWVuY3kpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCQlzdGF0dXMgPSBVcGRhdGVSZWdzKHN0YXRlLCBUTSwgRVA1KTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCQkJc3RhdGUtPm1fUmVnc1tFQjRdIHw9IDB4MjA7ICAgIC8qIExPX2ZvcmNlU3JjZSA9IDEgKi8KKwkJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUI0KTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCQkJbXNsZWVwKDEpOworCQkJc3RhdGUtPm1fUmVnc1tFQjRdICY9IH4weDIwOyAgIC8qIExPX2ZvcmNlU3JjZSA9IDAgKi8KKwkJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUI0KTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJdTggUG9zdERpdiA9IDA7CisJCQl1OCBEaXY7CisJCQlzdGF0dXMgPSBDYWxjQ2FsUExMKHN0YXRlLCBGcmVxdWVuY3kgKyBJbnRlcm1lZGlhdGVGcmVxdWVuY3kpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisKKwkJCVNlYXJjaE1hcDMobV9DYWxfUExMX01hcCwgRnJlcXVlbmN5ICsgSW50ZXJtZWRpYXRlRnJlcXVlbmN5LCAmUG9zdERpdiwgJkRpdik7CisJCQlzdGF0ZS0+bV9SZWdzW01QRF0gPSAoc3RhdGUtPm1fUmVnc1tNUERdICYgfjB4N0YpIHwgKFBvc3REaXYgJiAweDc3KTsKKwkJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgTVBEKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCQkJc3RhdHVzID0gVXBkYXRlUmVncyhzdGF0ZSwgVE0sIEVQNSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKworCQkJc3RhdGUtPm1fUmVnc1tFQjddIHw9IDB4MjA7ICAgIC8qIENBTF9mb3JjZVNyY2UgPSAxICovCisJCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCNyk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJCW1zbGVlcCgxKTsKKwkJCXN0YXRlLT5tX1JlZ3NbRUI3XSAmPSB+MHgyMDsgICAvKiBDQUxfZm9yY2VTcmNlID0gMCAqLworCQkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFQjcpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCX0KKwkJbXNsZWVwKDIwKTsKKwkJaWYgKFN0YW5kYXJkICE9IEhGX0ZNX1JhZGlvKQorCQkJc3RhdGUtPm1fUmVnc1tFUDNdIHw9IDB4MDQ7ICAgIC8qIFJGQUdDIHRvIG5vcm1hbCBtb2RlICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVAzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCX0gd2hpbGUgKDApOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKworCVN0YW5kQnkoc3RhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlrZnJlZShmZS0+dHVuZXJfcHJpdik7CisJZmUtPnR1bmVyX3ByaXYgPSBOVUxMOworCXJldHVybiAwOworfQorCisvKgorICogQXMgZGVmaW5lZCBvbiBFTiAzMDAgNDI5IEFubmV4IEEgYW5kIG9uIElUVS1UIEouODMgYW5uZXggQSwgdGhlIERWQi1DCisgKiByb2xsLW9mZiBmYWN0b3IgaXMgMC4xNS4KKyAqIEFjY29yZGluZyB3aXRoIHRoZSBzcGVjcywgdGhlIGFtb3VudCBvZiB0aGUgbmVlZGVkIGJhbmR3aXRoIGlzIGdpdmVuIGJ5OgorICoJQncgPSBTeW1ib2xfcmF0ZSAqICgxICsgMC4xNSkKKyAqIEFzIHN1Y2gsIHRoZSBtYXhpbXVtIHN5bWJvbCByYXRlIHN1cHBvcnRlZCBieSA2IE1IeiBpcworICoJbWF4X3N5bWJvbF9yYXRlID0gNiBNSHogLyAxLjE1ID0gNTIxNzM5MSBCYXVkcworICpOT1RFOiBGb3IgSVRVLVQgSi44MyBBbm5leCBDLCB0aGUgcm9sbC1vZmYgZmFjdG9yIGlzIDAuMTMuIFNvOgorICoJbWF4X3N5bWJvbF9yYXRlID0gNiBNSHogLyAxLjEzID0gNTMwOTczNSBCYXVkCisgKglUaGF0IG1lYW5zIHRoYXQgYW4gYWRqdXN0bWVudCBpcyBuZWVkZWQgZm9yIEphcGFuLAorICoJYnV0LCBhcyBjdXJyZW50bHkgRFJYLUsgaXMgaGFyZGNvZGVkIHRvIEFubmV4IEEsIGxldCdzIHN0aWNrCisgKgl3aXRoIDAuMTUgcm9sbC1vZmYgZmFjdG9yLgorICovCisjZGVmaW5lIE1BWF9TWU1CT0xfUkFURV82TUh6CTUyMTczOTEKKworc3RhdGljIGludCBzZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkgICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSA9IGZlLT50dW5lcl9wcml2OworCWludCBzdGF0dXMgPSAwOworCWludCBTdGFuZGFyZDsKKworCXN0YXRlLT5tX0ZyZXF1ZW5jeSA9IHBhcmFtcy0+ZnJlcXVlbmN5OworCisJaWYgKGZlLT5vcHMuaW5mby50eXBlID09IEZFX09GRE0pCisJCXN3aXRjaCAocGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoKSB7CisJCWNhc2UgQkFORFdJRFRIXzZfTUhaOgorCQkJU3RhbmRhcmQgPSBIRl9EVkJUXzZNSFo7CisJCQlicmVhazsKKwkJY2FzZSBCQU5EV0lEVEhfN19NSFo6CisJCQlTdGFuZGFyZCA9IEhGX0RWQlRfN01IWjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQljYXNlIEJBTkRXSURUSF84X01IWjoKKwkJCVN0YW5kYXJkID0gSEZfRFZCVF84TUhaOworCQkJYnJlYWs7CisJCX0KKwllbHNlIGlmIChmZS0+b3BzLmluZm8udHlwZSA9PSBGRV9RQU0pIHsKKwkJaWYgKHBhcmFtcy0+dS5xYW0uc3ltYm9sX3JhdGUgPD0gTUFYX1NZTUJPTF9SQVRFXzZNSHopCisJCQlTdGFuZGFyZCA9IEhGX0RWQkNfNk1IWjsKKwkJZWxzZQorCQkJU3RhbmRhcmQgPSBIRl9EVkJDXzhNSFo7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworCWRvIHsKKwkJc3RhdHVzID0gUkZUcmFja2luZ0ZpbHRlcnNDb3JyZWN0aW9uKHN0YXRlLCBwYXJhbXMtPmZyZXF1ZW5jeSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IENoYW5uZWxDb25maWd1cmF0aW9uKHN0YXRlLCBwYXJhbXMtPmZyZXF1ZW5jeSwgU3RhbmRhcmQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCW1zbGVlcChzdGF0ZS0+bV9TZXR0bGluZ1RpbWUpOyAgLyogQWxsb3cgQUdDJ3MgdG8gc2V0dGxlIGRvd24gKi8KKwl9IHdoaWxlICgwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisjaWYgMAorc3RhdGljIGludCBHZXRTaWduYWxTdHJlbmd0aChzMzIgKnBTaWduYWxTdHJlbmd0aCwgdTMyIFJGQWdjLCB1MzIgSUZBZ2MpCit7CisJaWYgKElGQWdjIDwgNTAwKSB7CisJCS8qIFNjYWxlIHRoaXMgZnJvbSAwIHRvIDUwMDAwICovCisJCSpwU2lnbmFsU3RyZW5ndGggPSBJRkFnYyAqIDEwMDsKKwl9IGVsc2UgeworCQkvKiBTY2FsZSByYW5nZSA1MDAtMTUwMCB0byA1MDAwMC04MDAwMCAqLworCQkqcFNpZ25hbFN0cmVuZ3RoID0gNTAwMDAgKyAoSUZBZ2MgLSA1MDApICogMzA7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBnZXRfZnJlcXVlbmN5KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmZyZXF1ZW5jeSkKK3sKKwlzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSA9IGZlLT50dW5lcl9wcml2OworCisJKmZyZXF1ZW5jeSA9IHN0YXRlLT5JRjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfYmFuZHdpZHRoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmJhbmR3aWR0aCkKK3sKKwkvKiBzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSA9IGZlLT50dW5lcl9wcml2OyAqLworCS8qICpiYW5kd2lkdGggPSBwcml2LT5iYW5kd2lkdGg7ICovCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBkdmJfdHVuZXJfb3BzIHR1bmVyX29wcyA9IHsKKwkuaW5mbyA9IHsKKwkJLm5hbWUgPSAiTlhQIFREQTE4MjcxQzJEIiwKKwkJLmZyZXF1ZW5jeV9taW4gID0gIDQ3MTI1MDAwLAorCQkuZnJlcXVlbmN5X21heCAgPSA4NjUwMDAwMDAsCisJCS5mcmVxdWVuY3lfc3RlcCA9ICAgICA2MjUwMAorCX0sCisJLmluaXQgICAgICAgICAgICAgID0gaW5pdCwKKwkuc2xlZXAgICAgICAgICAgICAgPSBzbGVlcCwKKwkuc2V0X3BhcmFtcyAgICAgICAgPSBzZXRfcGFyYW1zLAorCS5yZWxlYXNlICAgICAgICAgICA9IHJlbGVhc2UsCisJLmdldF9mcmVxdWVuY3kgICAgID0gZ2V0X2ZyZXF1ZW5jeSwKKwkuZ2V0X2JhbmR3aWR0aCAgICAgPSBnZXRfYmFuZHdpZHRoLAorfTsKKworc3RydWN0IGR2Yl9mcm9udGVuZCAqdGRhMTgyNzFjMmRkX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCB1OCBhZHIpCit7CisJc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGU7CisKKwlzdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZGFfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0YXRlKQorCQlyZXR1cm4gTlVMTDsKKworCWZlLT50dW5lcl9wcml2ID0gc3RhdGU7CisJc3RhdGUtPmFkciA9IGFkcjsKKwlzdGF0ZS0+aTJjID0gaTJjOworCW1lbWNweSgmZmUtPm9wcy50dW5lcl9vcHMsICZ0dW5lcl9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX3R1bmVyX29wcykpOworCXJlc2V0KHN0YXRlKTsKKwlJbml0Q2FsKHN0YXRlKTsKKworCXJldHVybiBmZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRkYTE4MjcxYzJkZF9hdHRhY2gpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlREQTE4MjcxQzIgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJERCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTE4MjcxYzJkZC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTE4MjcxYzJkZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzODljNzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTgyNzFjMmRkLmgKQEAgLTAsMCArMSwxNiBAQAorI2lmbmRlZiBfVERBMTgyNzFDMkREX0hfCisjZGVmaW5lIF9UREExODI3MUMyRERfSF8KKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfVERBMTgyNzFDMkREKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX1REQTE4MjcxQzJERF9NT0RVTEUpIFwKKyAgICAgICAgJiYgZGVmaW5lZChNT0RVTEUpKQorc3RydWN0IGR2Yl9mcm9udGVuZCAqdGRhMTgyNzFjMmRkX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCB1OCBhZHIpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCAqdGRhMTgyNzFjMmRkX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCB1OCBhZHIpCit7CisgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkcml2ZXIgZGlzYWJsZWQgYnkgS2NvbmZpZ1xuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExODI3MWMyZGRfbWFwcy5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTE4MjcxYzJkZF9tYXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg3NjYxYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExODI3MWMyZGRfbWFwcy5oCkBAIC0wLDAgKzEsODE0IEBACitlbnVtIEhGX1MgeworCUhGX05vbmUgPSAwLCBIRl9CLCBIRl9ESywgSEZfRywgSEZfSSwgSEZfTCwgSEZfTDEsIEhGX01OLCBIRl9GTV9SYWRpbywKKwlIRl9BbmFsb2dNYXgsIEhGX0RWQlRfNk1IWiwgSEZfRFZCVF83TUhaLCBIRl9EVkJUXzhNSFosCisJSEZfRFZCVCwgSEZfQVRTQywgIEhGX0RWQkNfNk1IWiwgIEhGX0RWQkNfN01IWiwKKwlIRl9EVkJDXzhNSFosIEhGX0RWQkMKK307CisKK3N0cnVjdCBTU3RhbmRhcmRQYXJhbSBtX1N0YW5kYXJkVGFibGVbXSA9IHsKKwl7ICAgICAgIDAsICAgICAgICAwLCAweDAwLCAweDAwIH0sICAgIC8qIEhGX05vbmUgKi8KKwl7IDYwMDAwMDAsICA3MDAwMDAwLCAweDFELCAweDJDIH0sICAgIC8qIEhGX0IsICovCisJeyA2OTAwMDAwLCAgODAwMDAwMCwgMHgxRSwgMHgyQyB9LCAgICAvKiBIRl9ESywgKi8KKwl7IDcxMDAwMDAsICA4MDAwMDAwLCAweDFFLCAweDJDIH0sICAgIC8qIEhGX0csICovCisJeyA3MjUwMDAwLCAgODAwMDAwMCwgMHgxRSwgMHgyQyB9LCAgICAvKiBIRl9JLCAqLworCXsgNjkwMDAwMCwgIDgwMDAwMDAsIDB4MUUsIDB4MkMgfSwgICAgLyogSEZfTCwgKi8KKwl7IDEyNTAwMDAsICA4MDAwMDAwLCAweDFFLCAweDJDIH0sICAgIC8qIEhGX0wxLCAqLworCXsgNTQwMDAwMCwgIDYwMDAwMDAsIDB4MUMsIDB4MkMgfSwgICAgLyogSEZfTU4sICovCisJeyAxMjUwMDAwLCAgIDUwMDAwMCwgMHgxOCwgMHgyQyB9LCAgICAvKiBIRl9GTV9SYWRpbywgKi8KKwl7ICAgICAgIDAsICAgICAgICAwLCAweDAwLCAweDAwIH0sICAgIC8qIEhGX0FuYWxvZ01heCAoVW51c2VkKSAqLworCXsgMzMwMDAwMCwgIDYwMDAwMDAsIDB4MUMsIDB4NTggfSwgICAgLyogSEZfRFZCVF82TUhaICovCisJeyAzNTAwMDAwLCAgNzAwMDAwMCwgMHgxQywgMHgzNyB9LCAgICAvKiBIRl9EVkJUXzdNSFogKi8KKwl7IDQwMDAwMDAsICA4MDAwMDAwLCAweDFELCAweDM3IH0sICAgIC8qIEhGX0RWQlRfOE1IWiAqLworCXsgICAgICAgMCwgICAgICAgIDAsIDB4MDAsIDB4MDAgfSwgICAgLyogSEZfRFZCVCAoVW51c2VkKSAqLworCXsgNTAwMDAwMCwgIDYwMDAwMDAsIDB4MUMsIDB4MzcgfSwgICAgLyogSEZfQVRTQyAgKGNlbnRlciA9IDMuMjUgTUh6KSAqLworCXsgNDAwMDAwMCwgIDYwMDAwMDAsIDB4MUQsIDB4NTggfSwgICAgLyogSEZfRFZCQ182TUhaIChDaGljYWdvKSAqLworCXsgNDUwMDAwMCwgIDcwMDAwMDAsIDB4MUUsIDB4MzcgfSwgICAgLyogSEZfRFZCQ183TUhaIChub3QgZG9jdW1lbnRlZCBieSBOWFApICovCisJeyA1MDAwMDAwLCAgODAwMDAwMCwgMHgxRiwgMHgzNyB9LCAgICAvKiBIRl9EVkJDXzhNSFogKi8KKwl7ICAgICAgIDAsICAgICAgICAwLCAweDAwLCAweDAwIH0sICAgIC8qIEhGX0RWQkMgKFVudXNlZCkgKi8KK307CisKK3N0cnVjdCBTTWFwICBtX0JQX0ZpbHRlcl9NYXBbXSA9IHsKKwl7ICAgNjIwMDAwMDAsICAweDAwIH0sCisJeyAgIDg0MDAwMDAwLCAgMHgwMSB9LAorCXsgIDEwMDAwMDAwMCwgIDB4MDIgfSwKKwl7ICAxNDAwMDAwMDAsICAweDAzIH0sCisJeyAgMTcwMDAwMDAwLCAgMHgwNCB9LAorCXsgIDE4MDAwMDAwMCwgIDB4MDUgfSwKKwl7ICA4NjUwMDAwMDAsICAweDA2IH0sCisJeyAgICAgICAgICAwLCAgMHgwMCB9LCAgICAvKiBUYWJsZSBFbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgU01hcEkgbV9SRl9DYWxfTWFwW10gPSB7CisJeyAgIDQxMDAwMDAwLCAgMHgwRiB9LAorCXsgICA0MzAwMDAwMCwgIDB4MUMgfSwKKwl7ICAgNDUwMDAwMDAsICAweDJGIH0sCisJeyAgIDQ2MDAwMDAwLCAgMHgzOSB9LAorCXsgICA0NzAwMDAwMCwgIDB4NDAgfSwKKwl7ICAgNDc5MDAwMDAsICAweDUwIH0sCisJeyAgIDQ5MTAwMDAwLCAgMHgxNiB9LAorCXsgICA1MDAwMDAwMCwgIDB4MTggfSwKKwl7ICAgNTEwMDAwMDAsICAweDIwIH0sCisJeyAgIDUzMDAwMDAwLCAgMHgyOCB9LAorCXsgICA1NTAwMDAwMCwgIDB4MkIgfSwKKwl7ICAgNTYwMDAwMDAsICAweDMyIH0sCisJeyAgIDU3MDAwMDAwLCAgMHgzNSB9LAorCXsgICA1ODAwMDAwMCwgIDB4M0UgfSwKKwl7ICAgNTkwMDAwMDAsICAweDQzIH0sCisJeyAgIDYwMDAwMDAwLCAgMHg0RSB9LAorCXsgICA2MTEwMDAwMCwgIDB4NTUgfSwKKwl7ICAgNjMwMDAwMDAsICAweDBGIH0sCisJeyAgIDY0MDAwMDAwLCAgMHgxMSB9LAorCXsgICA2NTAwMDAwMCwgIDB4MTIgfSwKKwl7ICAgNjYwMDAwMDAsICAweDE1IH0sCisJeyAgIDY3MDAwMDAwLCAgMHgxNiB9LAorCXsgICA2ODAwMDAwMCwgIDB4MTcgfSwKKwl7ICAgNzAwMDAwMDAsICAweDE5IH0sCisJeyAgIDcxMDAwMDAwLCAgMHgxQyB9LAorCXsgICA3MjAwMDAwMCwgIDB4MUQgfSwKKwl7ICAgNzMwMDAwMDAsICAweDFGIH0sCisJeyAgIDc0MDAwMDAwLCAgMHgyMCB9LAorCXsgICA3NTAwMDAwMCwgIDB4MjEgfSwKKwl7ICAgNzYwMDAwMDAsICAweDI0IH0sCisJeyAgIDc3MDAwMDAwLCAgMHgyNSB9LAorCXsgICA3ODAwMDAwMCwgIDB4MjcgfSwKKwl7ICAgODAwMDAwMDAsICAweDI4IH0sCisJeyAgIDgxMDAwMDAwLCAgMHgyOSB9LAorCXsgICA4MjAwMDAwMCwgIDB4MkQgfSwKKwl7ICAgODMwMDAwMDAsICAweDJFIH0sCisJeyAgIDg0MDAwMDAwLCAgMHgyRiB9LAorCXsgICA4NTAwMDAwMCwgIDB4MzEgfSwKKwl7ICAgODYwMDAwMDAsICAweDMzIH0sCisJeyAgIDg3MDAwMDAwLCAgMHgzNCB9LAorCXsgICA4ODAwMDAwMCwgIDB4MzUgfSwKKwl7ICAgODkwMDAwMDAsICAweDM3IH0sCisJeyAgIDkwMDAwMDAwLCAgMHgzOCB9LAorCXsgICA5MTAwMDAwMCwgIDB4MzkgfSwKKwl7ICAgOTMwMDAwMDAsICAweDNDIH0sCisJeyAgIDk0MDAwMDAwLCAgMHgzRSB9LAorCXsgICA5NTAwMDAwMCwgIDB4M0YgfSwKKwl7ICAgOTYwMDAwMDAsICAweDQwIH0sCisJeyAgIDk3MDAwMDAwLCAgMHg0MiB9LAorCXsgICA5OTAwMDAwMCwgIDB4NDUgfSwKKwl7ICAxMDAwMDAwMDAsICAweDQ2IH0sCisJeyAgMTAyMDAwMDAwLCAgMHg0OCB9LAorCXsgIDEwMzAwMDAwMCwgIDB4NEEgfSwKKwl7ICAxMDUwMDAwMDAsICAweDREIH0sCisJeyAgMTA2MDAwMDAwLCAgMHg0RSB9LAorCXsgIDEwNzAwMDAwMCwgIDB4NTAgfSwKKwl7ICAxMDgwMDAwMDAsICAweDUxIH0sCisJeyAgMTEwMDAwMDAwLCAgMHg1NCB9LAorCXsgIDExMTAwMDAwMCwgIDB4NTYgfSwKKwl7ICAxMTIwMDAwMDAsICAweDU3IH0sCisJeyAgMTEzMDAwMDAwLCAgMHg1OCB9LAorCXsgIDExNDAwMDAwMCwgIDB4NTkgfSwKKwl7ICAxMTUwMDAwMDAsICAweDVDIH0sCisJeyAgMTE2MDAwMDAwLCAgMHg1RCB9LAorCXsgIDExNzAwMDAwMCwgIDB4NUYgfSwKKwl7ICAxMTkwMDAwMDAsICAweDYwIH0sCisJeyAgMTIwMDAwMDAwLCAgMHg2NCB9LAorCXsgIDEyMTAwMDAwMCwgIDB4NjUgfSwKKwl7ICAxMjIwMDAwMDAsICAweDY2IH0sCisJeyAgMTIzMDAwMDAwLCAgMHg2OCB9LAorCXsgIDEyNDAwMDAwMCwgIDB4NjkgfSwKKwl7ICAxMjUwMDAwMDAsICAweDZDIH0sCisJeyAgMTI2MDAwMDAwLCAgMHg2RCB9LAorCXsgIDEyNzAwMDAwMCwgIDB4NkUgfSwKKwl7ICAxMjgwMDAwMDAsICAweDcwIH0sCisJeyAgMTI5MDAwMDAwLCAgMHg3MSB9LAorCXsgIDEzMDAwMDAwMCwgIDB4NzUgfSwKKwl7ICAxMzEwMDAwMDAsICAweDc3IH0sCisJeyAgMTMyMDAwMDAwLCAgMHg3OCB9LAorCXsgIDEzMzAwMDAwMCwgIDB4N0IgfSwKKwl7ICAxMzQwMDAwMDAsICAweDdFIH0sCisJeyAgMTM1MDAwMDAwLCAgMHg4MSB9LAorCXsgIDEzNjAwMDAwMCwgIDB4ODIgfSwKKwl7ICAxMzcwMDAwMDAsICAweDg3IH0sCisJeyAgMTM4MDAwMDAwLCAgMHg4OCB9LAorCXsgIDEzOTAwMDAwMCwgIDB4OEQgfSwKKwl7ICAxNDAwMDAwMDAsICAweDhFIH0sCisJeyAgMTQxMDAwMDAwLCAgMHg5MSB9LAorCXsgIDE0MjAwMDAwMCwgIDB4OTUgfSwKKwl7ICAxNDMwMDAwMDAsICAweDlBIH0sCisJeyAgMTQ0MDAwMDAwLCAgMHg5RCB9LAorCXsgIDE0NTAwMDAwMCwgIDB4QTEgfSwKKwl7ICAxNDYwMDAwMDAsICAweEEyIH0sCisJeyAgMTQ3MDAwMDAwLCAgMHhBNCB9LAorCXsgIDE0ODAwMDAwMCwgIDB4QTkgfSwKKwl7ICAxNDkwMDAwMDAsICAweEFFIH0sCisJeyAgMTUwMDAwMDAwLCAgMHhCMCB9LAorCXsgIDE1MTAwMDAwMCwgIDB4QjEgfSwKKwl7ICAxNTIwMDAwMDAsICAweEI3IH0sCisJeyAgMTUyNjAwMDAwLCAgMHhCRCB9LAorCXsgIDE1NDAwMDAwMCwgIDB4MjAgfSwKKwl7ICAxNTUwMDAwMDAsICAweDIyIH0sCisJeyAgMTU2MDAwMDAwLCAgMHgyNCB9LAorCXsgIDE1NzAwMDAwMCwgIDB4MjUgfSwKKwl7ICAxNTgwMDAwMDAsICAweDI3IH0sCisJeyAgMTU5MDAwMDAwLCAgMHgyOSB9LAorCXsgIDE2MDAwMDAwMCwgIDB4MkMgfSwKKwl7ICAxNjEwMDAwMDAsICAweDJEIH0sCisJeyAgMTYzMDAwMDAwLCAgMHgyRSB9LAorCXsgIDE2NDAwMDAwMCwgIDB4MkYgfSwKKwl7ICAxNjQ3MDAwMDAsICAweDMwIH0sCisJeyAgMTY2MDAwMDAwLCAgMHgxMSB9LAorCXsgIDE2NzAwMDAwMCwgIDB4MTIgfSwKKwl7ICAxNjgwMDAwMDAsICAweDEzIH0sCisJeyAgMTY5MDAwMDAwLCAgMHgxNCB9LAorCXsgIDE3MDAwMDAwMCwgIDB4MTUgfSwKKwl7ICAxNzIwMDAwMDAsICAweDE2IH0sCisJeyAgMTczMDAwMDAwLCAgMHgxNyB9LAorCXsgIDE3NDAwMDAwMCwgIDB4MTggfSwKKwl7ICAxNzUwMDAwMDAsICAweDFBIH0sCisJeyAgMTc2MDAwMDAwLCAgMHgxQiB9LAorCXsgIDE3ODAwMDAwMCwgIDB4MUQgfSwKKwl7ICAxNzkwMDAwMDAsICAweDFFIH0sCisJeyAgMTgwMDAwMDAwLCAgMHgxRiB9LAorCXsgIDE4MTAwMDAwMCwgIDB4MjAgfSwKKwl7ICAxODIwMDAwMDAsICAweDIxIH0sCisJeyAgMTgzMDAwMDAwLCAgMHgyMiB9LAorCXsgIDE4NDAwMDAwMCwgIDB4MjQgfSwKKwl7ICAxODUwMDAwMDAsICAweDI1IH0sCisJeyAgMTg2MDAwMDAwLCAgMHgyNiB9LAorCXsgIDE4NzAwMDAwMCwgIDB4MjcgfSwKKwl7ICAxODgwMDAwMDAsICAweDI5IH0sCisJeyAgMTg5MDAwMDAwLCAgMHgyQSB9LAorCXsgIDE5MDAwMDAwMCwgIDB4MkMgfSwKKwl7ICAxOTEwMDAwMDAsICAweDJEIH0sCisJeyAgMTkyMDAwMDAwLCAgMHgyRSB9LAorCXsgIDE5MzAwMDAwMCwgIDB4MkYgfSwKKwl7ICAxOTQwMDAwMDAsICAweDMwIH0sCisJeyAgMTk1MDAwMDAwLCAgMHgzMyB9LAorCXsgIDE5NjAwMDAwMCwgIDB4MzUgfSwKKwl7ICAxOTgwMDAwMDAsICAweDM2IH0sCisJeyAgMjAwMDAwMDAwLCAgMHgzOCB9LAorCXsgIDIwMTAwMDAwMCwgIDB4M0MgfSwKKwl7ICAyMDIwMDAwMDAsICAweDNEIH0sCisJeyAgMjAzNTAwMDAwLCAgMHgzRSB9LAorCXsgIDIwNjAwMDAwMCwgIDB4MEUgfSwKKwl7ICAyMDgwMDAwMDAsICAweDBGIH0sCisJeyAgMjEyMDAwMDAwLCAgMHgxMCB9LAorCXsgIDIxNjAwMDAwMCwgIDB4MTEgfSwKKwl7ICAyMTcwMDAwMDAsICAweDEyIH0sCisJeyAgMjE4MDAwMDAwLCAgMHgxMyB9LAorCXsgIDIyMDAwMDAwMCwgIDB4MTQgfSwKKwl7ICAyMjIwMDAwMDAsICAweDE1IH0sCisJeyAgMjI1MDAwMDAwLCAgMHgxNiB9LAorCXsgIDIyODAwMDAwMCwgIDB4MTcgfSwKKwl7ICAyMzEwMDAwMDAsICAweDE4IH0sCisJeyAgMjM0MDAwMDAwLCAgMHgxOSB9LAorCXsgIDIzNTAwMDAwMCwgIDB4MUEgfSwKKwl7ICAyMzYwMDAwMDAsICAweDFCIH0sCisJeyAgMjM3MDAwMDAwLCAgMHgxQyB9LAorCXsgIDI0MDAwMDAwMCwgIDB4MUQgfSwKKwl7ICAyNDIwMDAwMDAsICAweDFFIH0sCisJeyAgMjQ0MDAwMDAwLCAgMHgxRiB9LAorCXsgIDI0NzAwMDAwMCwgIDB4MjAgfSwKKwl7ICAyNDkwMDAwMDAsICAweDIxIH0sCisJeyAgMjUyMDAwMDAwLCAgMHgyMiB9LAorCXsgIDI1MzAwMDAwMCwgIDB4MjMgfSwKKwl7ICAyNTQwMDAwMDAsICAweDI0IH0sCisJeyAgMjU2MDAwMDAwLCAgMHgyNSB9LAorCXsgIDI1OTAwMDAwMCwgIDB4MjYgfSwKKwl7ICAyNjIwMDAwMDAsICAweDI3IH0sCisJeyAgMjY0MDAwMDAwLCAgMHgyOCB9LAorCXsgIDI2NzAwMDAwMCwgIDB4MjkgfSwKKwl7ICAyNjkwMDAwMDAsICAweDJBIH0sCisJeyAgMjcxMDAwMDAwLCAgMHgyQiB9LAorCXsgIDI3MzAwMDAwMCwgIDB4MkMgfSwKKwl7ICAyNzUwMDAwMDAsICAweDJEIH0sCisJeyAgMjc3MDAwMDAwLCAgMHgyRSB9LAorCXsgIDI3OTAwMDAwMCwgIDB4MkYgfSwKKwl7ICAyODIwMDAwMDAsICAweDMwIH0sCisJeyAgMjg0MDAwMDAwLCAgMHgzMSB9LAorCXsgIDI4NjAwMDAwMCwgIDB4MzIgfSwKKwl7ICAyODcwMDAwMDAsICAweDMzIH0sCisJeyAgMjkwMDAwMDAwLCAgMHgzNCB9LAorCXsgIDI5MzAwMDAwMCwgIDB4MzUgfSwKKwl7ICAyOTUwMDAwMDAsICAweDM2IH0sCisJeyAgMjk3MDAwMDAwLCAgMHgzNyB9LAorCXsgIDMwMDAwMDAwMCwgIDB4MzggfSwKKwl7ICAzMDMwMDAwMDAsICAweDM5IH0sCisJeyAgMzA1MDAwMDAwLCAgMHgzQSB9LAorCXsgIDMwNjAwMDAwMCwgIDB4M0IgfSwKKwl7ICAzMDcwMDAwMDAsICAweDNDIH0sCisJeyAgMzEwMDAwMDAwLCAgMHgzRCB9LAorCXsgIDMxMjAwMDAwMCwgIDB4M0UgfSwKKwl7ICAzMTUwMDAwMDAsICAweDNGIH0sCisJeyAgMzE4MDAwMDAwLCAgMHg0MCB9LAorCXsgIDMyMDAwMDAwMCwgIDB4NDEgfSwKKwl7ICAzMjMwMDAwMDAsICAweDQyIH0sCisJeyAgMzI0MDAwMDAwLCAgMHg0MyB9LAorCXsgIDMyNTAwMDAwMCwgIDB4NDQgfSwKKwl7ICAzMjcwMDAwMDAsICAweDQ1IH0sCisJeyAgMzMxMDAwMDAwLCAgMHg0NiB9LAorCXsgIDMzNDAwMDAwMCwgIDB4NDcgfSwKKwl7ICAzMzcwMDAwMDAsICAweDQ4IH0sCisJeyAgMzM5MDAwMDAwLCAgMHg0OSB9LAorCXsgIDM0MDAwMDAwMCwgIDB4NEEgfSwKKwl7ICAzNDEwMDAwMDAsICAweDRCIH0sCisJeyAgMzQzMDAwMDAwLCAgMHg0QyB9LAorCXsgIDM0NTAwMDAwMCwgIDB4NEQgfSwKKwl7ICAzNDkwMDAwMDAsICAweDRFIH0sCisJeyAgMzUyMDAwMDAwLCAgMHg0RiB9LAorCXsgIDM1MzAwMDAwMCwgIDB4NTAgfSwKKwl7ICAzNTUwMDAwMDAsICAweDUxIH0sCisJeyAgMzU3MDAwMDAwLCAgMHg1MiB9LAorCXsgIDM1OTAwMDAwMCwgIDB4NTMgfSwKKwl7ICAzNjEwMDAwMDAsICAweDU0IH0sCisJeyAgMzYyMDAwMDAwLCAgMHg1NSB9LAorCXsgIDM2NDAwMDAwMCwgIDB4NTYgfSwKKwl7ICAzNjgwMDAwMDAsICAweDU3IH0sCisJeyAgMzcwMDAwMDAwLCAgMHg1OCB9LAorCXsgIDM3MjAwMDAwMCwgIDB4NTkgfSwKKwl7ICAzNzUwMDAwMDAsICAweDVBIH0sCisJeyAgMzc2MDAwMDAwLCAgMHg1QiB9LAorCXsgIDM3NzAwMDAwMCwgIDB4NUMgfSwKKwl7ICAzNzkwMDAwMDAsICAweDVEIH0sCisJeyAgMzgyMDAwMDAwLCAgMHg1RSB9LAorCXsgIDM4NDAwMDAwMCwgIDB4NUYgfSwKKwl7ICAzODUwMDAwMDAsICAweDYwIH0sCisJeyAgMzg2MDAwMDAwLCAgMHg2MSB9LAorCXsgIDM4ODAwMDAwMCwgIDB4NjIgfSwKKwl7ICAzOTAwMDAwMDAsICAweDYzIH0sCisJeyAgMzkzMDAwMDAwLCAgMHg2NCB9LAorCXsgIDM5NDAwMDAwMCwgIDB4NjUgfSwKKwl7ICAzOTYwMDAwMDAsICAweDY2IH0sCisJeyAgMzk3MDAwMDAwLCAgMHg2NyB9LAorCXsgIDM5ODAwMDAwMCwgIDB4NjggfSwKKwl7ICA0MDAwMDAwMDAsICAweDY5IH0sCisJeyAgNDAyMDAwMDAwLCAgMHg2QSB9LAorCXsgIDQwMzAwMDAwMCwgIDB4NkIgfSwKKwl7ICA0MDcwMDAwMDAsICAweDZDIH0sCisJeyAgNDA4MDAwMDAwLCAgMHg2RCB9LAorCXsgIDQwOTAwMDAwMCwgIDB4NkUgfSwKKwl7ICA0MTAwMDAwMDAsICAweDZGIH0sCisJeyAgNDExMDAwMDAwLCAgMHg3MCB9LAorCXsgIDQxMjAwMDAwMCwgIDB4NzEgfSwKKwl7ICA0MTMwMDAwMDAsICAweDcyIH0sCisJeyAgNDE0MDAwMDAwLCAgMHg3MyB9LAorCXsgIDQxNzAwMDAwMCwgIDB4NzQgfSwKKwl7ICA0MTgwMDAwMDAsICAweDc1IH0sCisJeyAgNDIwMDAwMDAwLCAgMHg3NiB9LAorCXsgIDQyMjAwMDAwMCwgIDB4NzcgfSwKKwl7ICA0MjMwMDAwMDAsICAweDc4IH0sCisJeyAgNDI0MDAwMDAwLCAgMHg3OSB9LAorCXsgIDQyNzAwMDAwMCwgIDB4N0EgfSwKKwl7ICA0MjgwMDAwMDAsICAweDdCIH0sCisJeyAgNDI5MDAwMDAwLCAgMHg3RCB9LAorCXsgIDQzMjAwMDAwMCwgIDB4N0YgfSwKKwl7ICA0MzQwMDAwMDAsICAweDgwIH0sCisJeyAgNDM1MDAwMDAwLCAgMHg4MSB9LAorCXsgIDQzNjAwMDAwMCwgIDB4ODMgfSwKKwl7ICA0MzcwMDAwMDAsICAweDg0IH0sCisJeyAgNDM4MDAwMDAwLCAgMHg4NSB9LAorCXsgIDQzOTAwMDAwMCwgIDB4ODYgfSwKKwl7ICA0NDAwMDAwMDAsICAweDg3IH0sCisJeyAgNDQxMDAwMDAwLCAgMHg4OCB9LAorCXsgIDQ0MjAwMDAwMCwgIDB4ODkgfSwKKwl7ICA0NDUwMDAwMDAsICAweDhBIH0sCisJeyAgNDQ2MDAwMDAwLCAgMHg4QiB9LAorCXsgIDQ0NzAwMDAwMCwgIDB4OEMgfSwKKwl7ICA0NDgwMDAwMDAsICAweDhFIH0sCisJeyAgNDQ5MDAwMDAwLCAgMHg4RiB9LAorCXsgIDQ1MDAwMDAwMCwgIDB4OTAgfSwKKwl7ICA0NTIwMDAwMDAsICAweDkxIH0sCisJeyAgNDUzMDAwMDAwLCAgMHg5MyB9LAorCXsgIDQ1NDAwMDAwMCwgIDB4OTQgfSwKKwl7ICA0NTYwMDAwMDAsICAweDk2IH0sCisJeyAgNDU3ODAwMDAwLCAgMHg5OCB9LAorCXsgIDQ2MTAwMDAwMCwgIDB4MTEgfSwKKwl7ICA0NjgwMDAwMDAsICAweDEyIH0sCisJeyAgNDcyMDAwMDAwLCAgMHgxMyB9LAorCXsgIDQ3MzAwMDAwMCwgIDB4MTQgfSwKKwl7ICA0NzQwMDAwMDAsICAweDE1IH0sCisJeyAgNDgxMDAwMDAwLCAgMHgxNiB9LAorCXsgIDQ4NjAwMDAwMCwgIDB4MTcgfSwKKwl7ICA0OTEwMDAwMDAsICAweDE4IH0sCisJeyAgNDk4MDAwMDAwLCAgMHgxOSB9LAorCXsgIDQ5OTAwMDAwMCwgIDB4MUEgfSwKKwl7ICA1MDEwMDAwMDAsICAweDFCIH0sCisJeyAgNTA2MDAwMDAwLCAgMHgxQyB9LAorCXsgIDUxMTAwMDAwMCwgIDB4MUQgfSwKKwl7ICA1MTYwMDAwMDAsICAweDFFIH0sCisJeyAgNTIwMDAwMDAwLCAgMHgxRiB9LAorCXsgIDUyMTAwMDAwMCwgIDB4MjAgfSwKKwl7ICA1MjUwMDAwMDAsICAweDIxIH0sCisJeyAgNTI5MDAwMDAwLCAgMHgyMiB9LAorCXsgIDUzMzAwMDAwMCwgIDB4MjMgfSwKKwl7ICA1MzkwMDAwMDAsICAweDI0IH0sCisJeyAgNTQxMDAwMDAwLCAgMHgyNSB9LAorCXsgIDU0NzAwMDAwMCwgIDB4MjYgfSwKKwl7ICA1NDkwMDAwMDAsICAweDI3IH0sCisJeyAgNTUxMDAwMDAwLCAgMHgyOCB9LAorCXsgIDU1NjAwMDAwMCwgIDB4MjkgfSwKKwl7ICA1NjEwMDAwMDAsICAweDJBIH0sCisJeyAgNTYzMDAwMDAwLCAgMHgyQiB9LAorCXsgIDU2NTAwMDAwMCwgIDB4MkMgfSwKKwl7ICA1NjkwMDAwMDAsICAweDJEIH0sCisJeyAgNTcxMDAwMDAwLCAgMHgyRSB9LAorCXsgIDU3NzAwMDAwMCwgIDB4MkYgfSwKKwl7ICA1ODAwMDAwMDAsICAweDMwIH0sCisJeyAgNTgyMDAwMDAwLCAgMHgzMSB9LAorCXsgIDU4NDAwMDAwMCwgIDB4MzIgfSwKKwl7ICA1ODgwMDAwMDAsICAweDMzIH0sCisJeyAgNTkxMDAwMDAwLCAgMHgzNCB9LAorCXsgIDU5NjAwMDAwMCwgIDB4MzUgfSwKKwl7ICA1OTgwMDAwMDAsICAweDM2IH0sCisJeyAgNjAzMDAwMDAwLCAgMHgzNyB9LAorCXsgIDYwNDAwMDAwMCwgIDB4MzggfSwKKwl7ICA2MDYwMDAwMDAsICAweDM5IH0sCisJeyAgNjEyMDAwMDAwLCAgMHgzQSB9LAorCXsgIDYxNTAwMDAwMCwgIDB4M0IgfSwKKwl7ICA2MTcwMDAwMDAsICAweDNDIH0sCisJeyAgNjIxMDAwMDAwLCAgMHgzRCB9LAorCXsgIDYyMjAwMDAwMCwgIDB4M0UgfSwKKwl7ICA2MjUwMDAwMDAsICAweDNGIH0sCisJeyAgNjMyMDAwMDAwLCAgMHg0MCB9LAorCXsgIDYzMzAwMDAwMCwgIDB4NDEgfSwKKwl7ICA2MzQwMDAwMDAsICAweDQyIH0sCisJeyAgNjQyMDAwMDAwLCAgMHg0MyB9LAorCXsgIDY0MzAwMDAwMCwgIDB4NDQgfSwKKwl7ICA2NDcwMDAwMDAsICAweDQ1IH0sCisJeyAgNjUwMDAwMDAwLCAgMHg0NiB9LAorCXsgIDY1MjAwMDAwMCwgIDB4NDcgfSwKKwl7ICA2NTcwMDAwMDAsICAweDQ4IH0sCisJeyAgNjYxMDAwMDAwLCAgMHg0OSB9LAorCXsgIDY2MjAwMDAwMCwgIDB4NEEgfSwKKwl7ICA2NjUwMDAwMDAsICAweDRCIH0sCisJeyAgNjY3MDAwMDAwLCAgMHg0QyB9LAorCXsgIDY3MDAwMDAwMCwgIDB4NEQgfSwKKwl7ICA2NzMwMDAwMDAsICAweDRFIH0sCisJeyAgNjc2MDAwMDAwLCAgMHg0RiB9LAorCXsgIDY3NzAwMDAwMCwgIDB4NTAgfSwKKwl7ICA2ODEwMDAwMDAsICAweDUxIH0sCisJeyAgNjgzMDAwMDAwLCAgMHg1MiB9LAorCXsgIDY4NjAwMDAwMCwgIDB4NTMgfSwKKwl7ICA2ODgwMDAwMDAsICAweDU0IH0sCisJeyAgNjg5MDAwMDAwLCAgMHg1NSB9LAorCXsgIDY5MTAwMDAwMCwgIDB4NTYgfSwKKwl7ICA2OTUwMDAwMDAsICAweDU3IH0sCisJeyAgNjk4MDAwMDAwLCAgMHg1OCB9LAorCXsgIDcwMzAwMDAwMCwgIDB4NTkgfSwKKwl7ICA3MDQwMDAwMDAsICAweDVBIH0sCisJeyAgNzA1MDAwMDAwLCAgMHg1QiB9LAorCXsgIDcwNzAwMDAwMCwgIDB4NUMgfSwKKwl7ICA3MTAwMDAwMDAsICAweDVEIH0sCisJeyAgNzEyMDAwMDAwLCAgMHg1RSB9LAorCXsgIDcxNzAwMDAwMCwgIDB4NUYgfSwKKwl7ICA3MTgwMDAwMDAsICAweDYwIH0sCisJeyAgNzIxMDAwMDAwLCAgMHg2MSB9LAorCXsgIDcyMjAwMDAwMCwgIDB4NjIgfSwKKwl7ICA3MjMwMDAwMDAsICAweDYzIH0sCisJeyAgNzI1MDAwMDAwLCAgMHg2NCB9LAorCXsgIDcyNzAwMDAwMCwgIDB4NjUgfSwKKwl7ICA3MzAwMDAwMDAsICAweDY2IH0sCisJeyAgNzMyMDAwMDAwLCAgMHg2NyB9LAorCXsgIDczNTAwMDAwMCwgIDB4NjggfSwKKwl7ICA3NDAwMDAwMDAsICAweDY5IH0sCisJeyAgNzQxMDAwMDAwLCAgMHg2QSB9LAorCXsgIDc0MjAwMDAwMCwgIDB4NkIgfSwKKwl7ICA3NDMwMDAwMDAsICAweDZDIH0sCisJeyAgNzQ1MDAwMDAwLCAgMHg2RCB9LAorCXsgIDc0NzAwMDAwMCwgIDB4NkUgfSwKKwl7ICA3NDgwMDAwMDAsICAweDZGIH0sCisJeyAgNzUwMDAwMDAwLCAgMHg3MCB9LAorCXsgIDc1MjAwMDAwMCwgIDB4NzEgfSwKKwl7ICA3NTQwMDAwMDAsICAweDcyIH0sCisJeyAgNzU3MDAwMDAwLCAgMHg3MyB9LAorCXsgIDc1ODAwMDAwMCwgIDB4NzQgfSwKKwl7ICA3NjAwMDAwMDAsICAweDc1IH0sCisJeyAgNzYzMDAwMDAwLCAgMHg3NiB9LAorCXsgIDc2NDAwMDAwMCwgIDB4NzcgfSwKKwl7ICA3NjYwMDAwMDAsICAweDc4IH0sCisJeyAgNzY3MDAwMDAwLCAgMHg3OSB9LAorCXsgIDc2ODAwMDAwMCwgIDB4N0EgfSwKKwl7ICA3NzMwMDAwMDAsICAweDdCIH0sCisJeyAgNzc0MDAwMDAwLCAgMHg3QyB9LAorCXsgIDc3NjAwMDAwMCwgIDB4N0QgfSwKKwl7ICA3NzcwMDAwMDAsICAweDdFIH0sCisJeyAgNzc4MDAwMDAwLCAgMHg3RiB9LAorCXsgIDc3OTAwMDAwMCwgIDB4ODAgfSwKKwl7ICA3ODEwMDAwMDAsICAweDgxIH0sCisJeyAgNzgzMDAwMDAwLCAgMHg4MiB9LAorCXsgIDc4NDAwMDAwMCwgIDB4ODMgfSwKKwl7ICA3ODUwMDAwMDAsICAweDg0IH0sCisJeyAgNzg2MDAwMDAwLCAgMHg4NSB9LAorCXsgIDc5MzAwMDAwMCwgIDB4ODYgfSwKKwl7ICA3OTQwMDAwMDAsICAweDg3IH0sCisJeyAgNzk1MDAwMDAwLCAgMHg4OCB9LAorCXsgIDc5NzAwMDAwMCwgIDB4ODkgfSwKKwl7ICA3OTkwMDAwMDAsICAweDhBIH0sCisJeyAgODAxMDAwMDAwLCAgMHg4QiB9LAorCXsgIDgwMjAwMDAwMCwgIDB4OEMgfSwKKwl7ICA4MDMwMDAwMDAsICAweDhEIH0sCisJeyAgODA0MDAwMDAwLCAgMHg4RSB9LAorCXsgIDgxMDAwMDAwMCwgIDB4OTAgfSwKKwl7ICA4MTEwMDAwMDAsICAweDkxIH0sCisJeyAgODEyMDAwMDAwLCAgMHg5MiB9LAorCXsgIDgxNDAwMDAwMCwgIDB4OTMgfSwKKwl7ICA4MTYwMDAwMDAsICAweDk0IH0sCisJeyAgODE3MDAwMDAwLCAgMHg5NiB9LAorCXsgIDgxODAwMDAwMCwgIDB4OTcgfSwKKwl7ICA4MjAwMDAwMDAsICAweDk4IH0sCisJeyAgODIxMDAwMDAwLCAgMHg5OSB9LAorCXsgIDgyMjAwMDAwMCwgIDB4OUEgfSwKKwl7ICA4MjgwMDAwMDAsICAweDlCIH0sCisJeyAgODI5MDAwMDAwLCAgMHg5RCB9LAorCXsgIDgzMDAwMDAwMCwgIDB4OUYgfSwKKwl7ICA4MzEwMDAwMDAsICAweEEwIH0sCisJeyAgODMzMDAwMDAwLCAgMHhBMSB9LAorCXsgIDgzNTAwMDAwMCwgIDB4QTIgfSwKKwl7ICA4MzYwMDAwMDAsICAweEEzIH0sCisJeyAgODM3MDAwMDAwLCAgMHhBNCB9LAorCXsgIDgzODAwMDAwMCwgIDB4QTYgfSwKKwl7ICA4NDAwMDAwMDAsICAweEE4IH0sCisJeyAgODQyMDAwMDAwLCAgMHhBOSB9LAorCXsgIDg0NTAwMDAwMCwgIDB4QUEgfSwKKwl7ICA4NDYwMDAwMDAsICAweEFCIH0sCisJeyAgODQ3MDAwMDAwLCAgMHhBRCB9LAorCXsgIDg0ODAwMDAwMCwgIDB4QUUgfSwKKwl7ICA4NTIwMDAwMDAsICAweEFGIH0sCisJeyAgODUzMDAwMDAwLCAgMHhCMCB9LAorCXsgIDg1ODAwMDAwMCwgIDB4QjEgfSwKKwl7ICA4NjAwMDAwMDAsICAweEIyIH0sCisJeyAgODYxMDAwMDAwLCAgMHhCMyB9LAorCXsgIDg2MjAwMDAwMCwgIDB4QjQgfSwKKwl7ICA4NjMwMDAwMDAsICAweEI2IH0sCisJeyAgODY0MDAwMDAwLCAgMHhCOCB9LAorCXsgIDg2NTAwMDAwMCwgIDB4QjkgfSwKKwl7ICAgICAgICAgIDAsICAweDAwIH0sICAgIC8qIFRhYmxlIEVuZCAqLworfTsKKworCitzdGF0aWMgc3RydWN0IFNNYXAyICBtX0tNX01hcFtdID0geworCXsgICA0NzkwMDAwMCwgIDMsIDIgfSwKKwl7ICAgNjExMDAwMDAsICAzLCAxIH0sCisJeyAgMzUwMDAwMDAwLCAgMywgMCB9LAorCXsgIDcyMDAwMDAwMCwgIDIsIDEgfSwKKwl7ICA4NjUwMDAwMDAsICAzLCAzIH0sCisJeyAgICAgICAgICAwLCAgMHgwMCB9LCAgICAvKiBUYWJsZSBFbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgU01hcDIgbV9NYWluX1BMTF9NYXBbXSA9IHsKKwl7ICAzMzEyNTAwMCwgMHg1NywgMHhGMCB9LAorCXsgIDM1NTAwMDAwLCAweDU2LCAweEUwIH0sCisJeyAgMzgxODgwMDAsIDB4NTUsIDB4RDAgfSwKKwl7ICA0MTM3NTAwMCwgMHg1NCwgMHhDMCB9LAorCXsgIDQ1MTI1MDAwLCAweDUzLCAweEIwIH0sCisJeyAgNDk2ODgwMDAsIDB4NTIsIDB4QTAgfSwKKwl7ICA1NTE4ODAwMCwgMHg1MSwgMHg5MCB9LAorCXsgIDYyMTI1MDAwLCAweDUwLCAweDgwIH0sCisJeyAgNjYyNTAwMDAsIDB4NDcsIDB4NzggfSwKKwl7ICA3MTAwMDAwMCwgMHg0NiwgMHg3MCB9LAorCXsgIDc2Mzc1MDAwLCAweDQ1LCAweDY4IH0sCisJeyAgODI3NTAwMDAsIDB4NDQsIDB4NjAgfSwKKwl7ICA5MDI1MDAwMCwgMHg0MywgMHg1OCB9LAorCXsgIDk5Mzc1MDAwLCAweDQyLCAweDUwIH0sCisJeyAxMTAzNzUwMDAsIDB4NDEsIDB4NDggfSwKKwl7IDEyNDI1MDAwMCwgMHg0MCwgMHg0MCB9LAorCXsgMTMyNTAwMDAwLCAweDM3LCAweDNDIH0sCisJeyAxNDIwMDAwMDAsIDB4MzYsIDB4MzggfSwKKwl7IDE1Mjc1MDAwMCwgMHgzNSwgMHgzNCB9LAorCXsgMTY1NTAwMDAwLCAweDM0LCAweDMwIH0sCisJeyAxODA1MDAwMDAsIDB4MzMsIDB4MkMgfSwKKwl7IDE5ODc1MDAwMCwgMHgzMiwgMHgyOCB9LAorCXsgMjIwNzUwMDAwLCAweDMxLCAweDI0IH0sCisJeyAyNDg1MDAwMDAsIDB4MzAsIDB4MjAgfSwKKwl7IDI2NTAwMDAwMCwgMHgyNywgMHgxRSB9LAorCXsgMjg0MDAwMDAwLCAweDI2LCAweDFDIH0sCisJeyAzMDU1MDAwMDAsIDB4MjUsIDB4MUEgfSwKKwl7IDMzMTAwMDAwMCwgMHgyNCwgMHgxOCB9LAorCXsgMzYxMDAwMDAwLCAweDIzLCAweDE2IH0sCisJeyAzOTc1MDAwMDAsIDB4MjIsIDB4MTQgfSwKKwl7IDQ0MTUwMDAwMCwgMHgyMSwgMHgxMiB9LAorCXsgNDk3MDAwMDAwLCAweDIwLCAweDEwIH0sCisJeyA1MzAwMDAwMDAsIDB4MTcsIDB4MEYgfSwKKwl7IDU2ODAwMDAwMCwgMHgxNiwgMHgwRSB9LAorCXsgNjExMDAwMDAwLCAweDE1LCAweDBEIH0sCisJeyA2NjIwMDAwMDAsIDB4MTQsIDB4MEMgfSwKKwl7IDcyMjAwMDAwMCwgMHgxMywgMHgwQiB9LAorCXsgNzk1MDAwMDAwLCAweDEyLCAweDBBIH0sCisJeyA4ODMwMDAwMDAsIDB4MTEsIDB4MDkgfSwKKwl7IDk5NDAwMDAwMCwgMHgxMCwgMHgwOCB9LAorCXsgICAgICAgICAwLCAweDAwLCAweDAwIH0sICAgIC8qIFRhYmxlIEVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBTTWFwMiBtX0NhbF9QTExfTWFwW10gPSB7CisJeyAgMzM4MTMwMDAsIDB4REQsIDB4RDAgfSwKKwl7ICAzNjYyNTAwMCwgMHhEQywgMHhDMCB9LAorCXsgIDM5OTM4MDAwLCAweERCLCAweEIwIH0sCisJeyAgNDM5MzgwMDAsIDB4REEsIDB4QTAgfSwKKwl7ICA0ODgxMzAwMCwgMHhEOSwgMHg5MCB9LAorCXsgIDU0OTM4MDAwLCAweEQ4LCAweDgwIH0sCisJeyAgNjI4MTMwMDAsIDB4RDMsIDB4NzAgfSwKKwl7ICA2NzYyNTAwMCwgMHhDRCwgMHg2OCB9LAorCXsgIDczMjUwMDAwLCAweENDLCAweDYwIH0sCisJeyAgNzk4NzUwMDAsIDB4Q0IsIDB4NTggfSwKKwl7ICA4Nzg3NTAwMCwgMHhDQSwgMHg1MCB9LAorCXsgIDk3NjI1MDAwLCAweEM5LCAweDQ4IH0sCisJeyAxMDk4NzUwMDAsIDB4QzgsIDB4NDAgfSwKKwl7IDEyNTYyNTAwMCwgMHhDMywgMHgzOCB9LAorCXsgMTM1MjUwMDAwLCAweEJELCAweDM0IH0sCisJeyAxNDY1MDAwMDAsIDB4QkMsIDB4MzAgfSwKKwl7IDE1OTc1MDAwMCwgMHhCQiwgMHgyQyB9LAorCXsgMTc1NzUwMDAwLCAweEJBLCAweDI4IH0sCisJeyAxOTUyNTAwMDAsIDB4QjksIDB4MjQgfSwKKwl7IDIxOTc1MDAwMCwgMHhCOCwgMHgyMCB9LAorCXsgMjUxMjUwMDAwLCAweEIzLCAweDFDIH0sCisJeyAyNzA1MDAwMDAsIDB4QUQsIDB4MUEgfSwKKwl7IDI5MzAwMDAwMCwgMHhBQywgMHgxOCB9LAorCXsgMzE5NTAwMDAwLCAweEFCLCAweDE2IH0sCisJeyAzNTE1MDAwMDAsIDB4QUEsIDB4MTQgfSwKKwl7IDM5MDUwMDAwMCwgMHhBOSwgMHgxMiB9LAorCXsgNDM5NTAwMDAwLCAweEE4LCAweDEwIH0sCisJeyA1MDI1MDAwMDAsIDB4QTMsIDB4MEUgfSwKKwl7IDU0MTAwMDAwMCwgMHg5RCwgMHgwRCB9LAorCXsgNTg2MDAwMDAwLCAweDlDLCAweDBDIH0sCisJeyA2MzkwMDAwMDAsIDB4OUIsIDB4MEIgfSwKKwl7IDcwMzAwMDAwMCwgMHg5QSwgMHgwQSB9LAorCXsgNzgxMDAwMDAwLCAweDk5LCAweDA5IH0sCisJeyA4NzkwMDAwMDAsIDB4OTgsIDB4MDggfSwKKwl7ICAgICAgICAgMCwgMHgwMCwgMHgwMCB9LCAgICAvKiBUYWJsZSBFbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgU01hcCAgbV9HYWluVGFwZXJfTWFwW10gPSB7CisJeyAgNDU0MDAwMDAsIDB4MUYgfSwKKwl7ICA0NTgwMDAwMCwgMHgxRSB9LAorCXsgIDQ2MjAwMDAwLCAweDFEIH0sCisJeyAgNDY3MDAwMDAsIDB4MUMgfSwKKwl7ICA0NzEwMDAwMCwgMHgxQiB9LAorCXsgIDQ3NTAwMDAwLCAweDFBIH0sCisJeyAgNDc5MDAwMDAsIDB4MTkgfSwKKwl7ICA0OTYwMDAwMCwgMHgxNyB9LAorCXsgIDUxMjAwMDAwLCAweDE2IH0sCisJeyAgNTI5MDAwMDAsIDB4MTUgfSwKKwl7ICA1NDUwMDAwMCwgMHgxNCB9LAorCXsgIDU2MjAwMDAwLCAweDEzIH0sCisJeyAgNTc4MDAwMDAsIDB4MTIgfSwKKwl7ICA1OTUwMDAwMCwgMHgxMSB9LAorCXsgIDYxMTAwMDAwLCAweDEwIH0sCisJeyAgNjc2MDAwMDAsIDB4MEQgfSwKKwl7ICA3NDIwMDAwMCwgMHgwQyB9LAorCXsgIDgwNzAwMDAwLCAweDBCIH0sCisJeyAgODcyMDAwMDAsIDB4MEEgfSwKKwl7ICA5MzgwMDAwMCwgMHgwOSB9LAorCXsgMTAwMzAwMDAwLCAweDA4IH0sCisJeyAxMDY5MDAwMDAsIDB4MDcgfSwKKwl7IDExMzQwMDAwMCwgMHgwNiB9LAorCXsgMTE5OTAwMDAwLCAweDA1IH0sCisJeyAxMjY1MDAwMDAsIDB4MDQgfSwKKwl7IDEzMzAwMDAwMCwgMHgwMyB9LAorCXsgMTM5NTAwMDAwLCAweDAyIH0sCisJeyAxNDYxMDAwMDAsIDB4MDEgfSwKKwl7IDE1MjYwMDAwMCwgMHgwMCB9LAorCXsgMTU0MzAwMDAwLCAweDFGIH0sCisJeyAxNTYxMDAwMDAsIDB4MUUgfSwKKwl7IDE1NzgwMDAwMCwgMHgxRCB9LAorCXsgMTU5NTAwMDAwLCAweDFDIH0sCisJeyAxNjEyMDAwMDAsIDB4MUIgfSwKKwl7IDE2MzAwMDAwMCwgMHgxQSB9LAorCXsgMTY0NzAwMDAwLCAweDE5IH0sCisJeyAxNzAyMDAwMDAsIDB4MTcgfSwKKwl7IDE3NTgwMDAwMCwgMHgxNiB9LAorCXsgMTgxMzAwMDAwLCAweDE1IH0sCisJeyAxODY5MDAwMDAsIDB4MTQgfSwKKwl7IDE5MjQwMDAwMCwgMHgxMyB9LAorCXsgMTk4MDAwMDAwLCAweDEyIH0sCisJeyAyMDM1MDAwMDAsIDB4MTEgfSwKKwl7IDIxNjIwMDAwMCwgMHgxNCB9LAorCXsgMjI4OTAwMDAwLCAweDEzIH0sCisJeyAyNDE2MDAwMDAsIDB4MTIgfSwKKwl7IDI1NDQwMDAwMCwgMHgxMSB9LAorCXsgMjY3MTAwMDAwLCAweDEwIH0sCisJeyAyNzk4MDAwMDAsIDB4MEYgfSwKKwl7IDI5MjUwMDAwMCwgMHgwRSB9LAorCXsgMzA1MjAwMDAwLCAweDBEIH0sCisJeyAzMTc5MDAwMDAsIDB4MEMgfSwKKwl7IDMzMDcwMDAwMCwgMHgwQiB9LAorCXsgMzQzNDAwMDAwLCAweDBBIH0sCisJeyAzNTYxMDAwMDAsIDB4MDkgfSwKKwl7IDM2ODgwMDAwMCwgMHgwOCB9LAorCXsgMzgxNTAwMDAwLCAweDA3IH0sCisJeyAzOTQyMDAwMDAsIDB4MDYgfSwKKwl7IDQwNjkwMDAwMCwgMHgwNSB9LAorCXsgNDE5NzAwMDAwLCAweDA0IH0sCisJeyA0MzI0MDAwMDAsIDB4MDMgfSwKKwl7IDQ0NTEwMDAwMCwgMHgwMiB9LAorCXsgNDU3ODAwMDAwLCAweDAxIH0sCisJeyA0NzYzMDAwMDAsIDB4MTkgfSwKKwl7IDQ5NDgwMDAwMCwgMHgxOCB9LAorCXsgNTEzMzAwMDAwLCAweDE3IH0sCisJeyA1MzE4MDAwMDAsIDB4MTYgfSwKKwl7IDU1MDMwMDAwMCwgMHgxNSB9LAorCXsgNTY4OTAwMDAwLCAweDE0IH0sCisJeyA1ODc0MDAwMDAsIDB4MTMgfSwKKwl7IDYwNTkwMDAwMCwgMHgxMiB9LAorCXsgNjI0NDAwMDAwLCAweDExIH0sCisJeyA2NDI5MDAwMDAsIDB4MTAgfSwKKwl7IDY2MTQwMDAwMCwgMHgwRiB9LAorCXsgNjc5OTAwMDAwLCAweDBFIH0sCisJeyA2OTg0MDAwMDAsIDB4MEQgfSwKKwl7IDcxNjkwMDAwMCwgMHgwQyB9LAorCXsgNzM1NDAwMDAwLCAweDBCIH0sCisJeyA3NTM5MDAwMDAsIDB4MEEgfSwKKwl7IDc3MjUwMDAwMCwgMHgwOSB9LAorCXsgNzkxMDAwMDAwLCAweDA4IH0sCisJeyA4MDk1MDAwMDAsIDB4MDcgfSwKKwl7IDgyODAwMDAwMCwgMHgwNiB9LAorCXsgODQ2NTAwMDAwLCAweDA1IH0sCisJeyA4NjUwMDAwMDAsIDB4MDQgfSwKKwl7ICAgICAgICAgMCwgMHgwMCB9LCAgICAvKiBUYWJsZSBFbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgU01hcCBtX1JGX0NhbF9EQ19PdmVyX0RUX01hcFtdID0geworCXsgIDQ3OTAwMDAwLCAweDAwIH0sCisJeyAgNTUwMDAwMDAsIDB4MDAgfSwKKwl7ICA2MTEwMDAwMCwgMHgwQSB9LAorCXsgIDY0MDAwMDAwLCAweDBBIH0sCisJeyAgODIwMDAwMDAsIDB4MTQgfSwKKwl7ICA4NDAwMDAwMCwgMHgxOSB9LAorCXsgMTE5MDAwMDAwLCAweDFDIH0sCisJeyAxMjQwMDAwMDAsIDB4MjAgfSwKKwl7IDEyOTAwMDAwMCwgMHgyQSB9LAorCXsgMTM0MDAwMDAwLCAweDMyIH0sCisJeyAxMzkwMDAwMDAsIDB4MzkgfSwKKwl7IDE0NDAwMDAwMCwgMHgzRSB9LAorCXsgMTQ5MDAwMDAwLCAweDNGIH0sCisJeyAxNTI2MDAwMDAsIDB4NDAgfSwKKwl7IDE1NDAwMDAwMCwgMHg0MCB9LAorCXsgMTY0NzAwMDAwLCAweDQxIH0sCisJeyAyMDM1MDAwMDAsIDB4MzIgfSwKKwl7IDM1MzAwMDAwMCwgMHgxOSB9LAorCXsgMzU2MDAwMDAwLCAweDFBIH0sCisJeyAzNTkwMDAwMDAsIDB4MUIgfSwKKwl7IDM2MzAwMDAwMCwgMHgxQyB9LAorCXsgMzY2MDAwMDAwLCAweDFEIH0sCisJeyAzNjkwMDAwMDAsIDB4MUUgfSwKKwl7IDM3MzAwMDAwMCwgMHgxRiB9LAorCXsgMzc2MDAwMDAwLCAweDIwIH0sCisJeyAzNzkwMDAwMDAsIDB4MjEgfSwKKwl7IDM4MzAwMDAwMCwgMHgyMiB9LAorCXsgMzg2MDAwMDAwLCAweDIzIH0sCisJeyAzODkwMDAwMDAsIDB4MjQgfSwKKwl7IDM5MzAwMDAwMCwgMHgyNSB9LAorCXsgMzk2MDAwMDAwLCAweDI2IH0sCisJeyAzOTkwMDAwMDAsIDB4MjcgfSwKKwl7IDQwMjAwMDAwMCwgMHgyOCB9LAorCXsgNDA0MDAwMDAwLCAweDI5IH0sCisJeyA0MDcwMDAwMDAsIDB4MkEgfSwKKwl7IDQwOTAwMDAwMCwgMHgyQiB9LAorCXsgNDEyMDAwMDAwLCAweDJDIH0sCisJeyA0MTQwMDAwMDAsIDB4MkQgfSwKKwl7IDQxNzAwMDAwMCwgMHgyRSB9LAorCXsgNDE5MDAwMDAwLCAweDJGIH0sCisJeyA0MjIwMDAwMDAsIDB4MzAgfSwKKwl7IDQyNDAwMDAwMCwgMHgzMSB9LAorCXsgNDI3MDAwMDAwLCAweDMyIH0sCisJeyA0MjkwMDAwMDAsIDB4MzMgfSwKKwl7IDQzMjAwMDAwMCwgMHgzNCB9LAorCXsgNDM0MDAwMDAwLCAweDM1IH0sCisJeyA0MzcwMDAwMDAsIDB4MzYgfSwKKwl7IDQzOTAwMDAwMCwgMHgzNyB9LAorCXsgNDQyMDAwMDAwLCAweDM4IH0sCisJeyA0NDQwMDAwMDAsIDB4MzkgfSwKKwl7IDQ0NzAwMDAwMCwgMHgzQSB9LAorCXsgNDQ5MDAwMDAwLCAweDNCIH0sCisJeyA0NTc4MDAwMDAsIDB4M0MgfSwKKwl7IDQ2NTAwMDAwMCwgMHgwRiB9LAorCXsgNDc3MDAwMDAwLCAweDEyIH0sCisJeyA0ODMwMDAwMDAsIDB4MTQgfSwKKwl7IDUwMjAwMDAwMCwgMHgxOSB9LAorCXsgNTA4MDAwMDAwLCAweDFCIH0sCisJeyA1MTkwMDAwMDAsIDB4MUMgfSwKKwl7IDUyMjAwMDAwMCwgMHgxRCB9LAorCXsgNTI0MDAwMDAwLCAweDFFIH0sCisJeyA1MzQwMDAwMDAsIDB4MUYgfSwKKwl7IDU0OTAwMDAwMCwgMHgyMCB9LAorCXsgNTU0MDAwMDAwLCAweDIyIH0sCisJeyA1ODQwMDAwMDAsIDB4MjQgfSwKKwl7IDU4OTAwMDAwMCwgMHgyNiB9LAorCXsgNjU4MDAwMDAwLCAweDI3IH0sCisJeyA2NjQwMDAwMDAsIDB4MkMgfSwKKwl7IDY2OTAwMDAwMCwgMHgyRCB9LAorCXsgNjk5MDAwMDAwLCAweDJFIH0sCisJeyA3MDQwMDAwMDAsIDB4MzAgfSwKKwl7IDcwOTAwMDAwMCwgMHgzMSB9LAorCXsgNzE0MDAwMDAwLCAweDMyIH0sCisJeyA3MjQwMDAwMDAsIDB4MzMgfSwKKwl7IDcyOTAwMDAwMCwgMHgzNiB9LAorCXsgNzM5MDAwMDAwLCAweDM4IH0sCisJeyA3NDQwMDAwMDAsIDB4MzkgfSwKKwl7IDc0OTAwMDAwMCwgMHgzQiB9LAorCXsgNzU0MDAwMDAwLCAweDNDIH0sCisJeyA3NTkwMDAwMDAsIDB4M0QgfSwKKwl7IDc2NDAwMDAwMCwgMHgzRSB9LAorCXsgNzY5MDAwMDAwLCAweDNGIH0sCisJeyA3NzQwMDAwMDAsIDB4NDAgfSwKKwl7IDc3OTAwMDAwMCwgMHg0MSB9LAorCXsgNzg0MDAwMDAwLCAweDQzIH0sCisJeyA3ODkwMDAwMDAsIDB4NDYgfSwKKwl7IDc5NDAwMDAwMCwgMHg0OCB9LAorCXsgNzk5MDAwMDAwLCAweDRCIH0sCisJeyA4MDQwMDAwMDAsIDB4NEYgfSwKKwl7IDgwOTAwMDAwMCwgMHg1NCB9LAorCXsgODE0MDAwMDAwLCAweDU5IH0sCisJeyA4MTkwMDAwMDAsIDB4NUQgfSwKKwl7IDgyNDAwMDAwMCwgMHg2MSB9LAorCXsgODI5MDAwMDAwLCAweDY4IH0sCisJeyA4MzQwMDAwMDAsIDB4NkUgfSwKKwl7IDgzOTAwMDAwMCwgMHg3NSB9LAorCXsgODQ0MDAwMDAwLCAweDdFIH0sCisJeyA4NDkwMDAwMDAsIDB4ODIgfSwKKwl7IDg1NDAwMDAwMCwgMHg4NCB9LAorCXsgODU5MDAwMDAwLCAweDhGIH0sCisJeyA4NjUwMDAwMDAsIDB4OUEgfSwKKwl7ICAgICAgICAgMCwgMHgwMCB9LCAgICAvKiBUYWJsZSBFbmQgKi8KK307CisKKworc3RhdGljIHN0cnVjdCBTTWFwICBtX0lSX01lYXNfTWFwW10gPSB7CisJeyAyMDAwMDAwMDAsIDB4MDUgfSwKKwl7IDQwMDAwMDAwMCwgMHgwNiB9LAorCXsgODY1MDAwMDAwLCAweDA3IH0sCisJeyAgICAgICAgIDAsIDB4MDAgfSwgICAgLyogVGFibGUgRW5kICovCit9OworCitzdGF0aWMgc3RydWN0IFNNYXAyIG1fQ0lEX1RhcmdldF9NYXBbXSA9IHsKKwl7ICA0NjAwMDAwMCwgMHgwNCwgMTggfSwKKwl7ICA1MjIwMDAwMCwgMHgwQSwgMTUgfSwKKwl7ICA3MDEwMDAwMCwgMHgwMSwgNDAgfSwKKwl7IDEzNjgwMDAwMCwgMHgxOCwgNDAgfSwKKwl7IDE1NjcwMDAwMCwgMHgxOCwgNDAgfSwKKwl7IDE4NjI1MDAwMCwgMHgwQSwgNDAgfSwKKwl7IDIzMDAwMDAwMCwgMHgwQSwgNDAgfSwKKwl7IDM0NTAwMDAwMCwgMHgxOCwgNDAgfSwKKwl7IDQyNjAwMDAwMCwgMHgwRSwgNDAgfSwKKwl7IDQ4OTUwMDAwMCwgMHgxRSwgNDAgfSwKKwl7IDY5NzUwMDAwMCwgMHgzMiwgNDAgfSwKKwl7IDg0MjAwMDAwMCwgMHgzQSwgNDAgfSwKKwl7ICAgICAgICAgMCwgMHgwMCwgIDAgfSwgICAgLyogVGFibGUgRW5kICovCit9OworCitzdGF0aWMgc3RydWN0IFNSRkJhbmRNYXAgIG1fUkZfQmFuZF9NYXBbN10gPSB7CisJeyAgIDQ3OTAwMDAwLCAgIDQ2MDAwMDAwLCAgICAgICAgICAgMCwgICAgICAgICAgMH0sCisJeyAgIDYxMTAwMDAwLCAgIDUyMjAwMDAwLCAgICAgICAgICAgMCwgICAgICAgICAgMH0sCisJeyAgMTUyNjAwMDAwLCAgIDcwMTAwMDAwLCAgIDEzNjgwMDAwMCwgICAgICAgICAgMH0sCisJeyAgMTY0NzAwMDAwLCAgMTU2NzAwMDAwLCAgICAgICAgICAgMCwgICAgICAgICAgMH0sCisJeyAgMjAzNTAwMDAwLCAgMTg2MjUwMDAwLCAgICAgICAgICAgMCwgICAgICAgICAgMH0sCisJeyAgNDU3ODAwMDAwLCAgMjMwMDAwMDAwLCAgIDM0NTAwMDAwMCwgIDQyNjAwMDAwMH0sCisJeyAgODY1MDAwMDAwLCAgNDg5NTAwMDAwLCAgIDY5NzUwMDAwMCwgIDg0MjAwMDAwMH0sCit9OworCit1OCBtX1RoZXJtb21ldGVyX01hcF8xWzE2XSA9IHsKKwk2MCwgNjIsIDY2LCA2NCwKKwk3NCwgNzIsIDY4LCA3MCwKKwk5MCwgODgsIDg0LCA4NiwKKwk3NiwgNzgsIDgyLCA4MCwKK307CisKK3U4IG1fVGhlcm1vbWV0ZXJfTWFwXzJbMTZdID0geworCTkyLCA5NCwgOTgsIDk2LAorCTEwNiwgMTA0LCAxMDAsIDEwMiwKKwkxMjIsIDEyMCwgMTE2LCAxMTgsCisJMTA4LCAxMTAsIDExNCwgMTEyLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL25nZW5lL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9LY29uZmlnCmluZGV4IGNlYzI0MmIuLjY0Yzg0NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL25nZW5lL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvS2NvbmZpZwpAQCAtNSw2ICs1LDggQEAKIAlzZWxlY3QgRFZCX1NUVjYxMTB4IGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9TVFYwOTB4IGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9MR0RUMzMwWCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfRFJYSyBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfVERBMTgyNzFDMkREIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IE1FRElBX1RVTkVSX01UMjEzMSBpZiAhTUVESUFfVFVORVJfQ1VTVE9NSVNFCiAJLS0taGVscC0tLQogCSAgU3VwcG9ydCBmb3IgTWljcm9uYXMgUENJIGV4cHJlc3MgY2FyZHMgd2l0aCBuR2VuZSBicmlkZ2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9uZ2VuZS1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvbmdlbmUtY2FyZHMuYwppbmRleCBmY2Y0YmU5Li4wNTY0MTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9uZ2VuZS1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL25nZW5lL25nZW5lLWNhcmRzLmMKQEAgLTQwLDYgKzQwLDggQEAKICNpbmNsdWRlICJsbmJoMjQuaCIKICNpbmNsdWRlICJsZ2R0MzMweC5oIgogI2luY2x1ZGUgIm10MjEzMS5oIgorI2luY2x1ZGUgInRkYTE4MjcxYzJkZC5oIgorI2luY2x1ZGUgImRyeGsuaCIKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTgzLDYgKzg1LDQ5IEBACiB9CiAKIAorc3RhdGljIGludCBkcnhrX2dhdGVfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgbmdlbmVfY2hhbm5lbCAqY2hhbiA9IGZlLT5zZWNfcHJpdjsKKwlpbnQgc3RhdHVzOworCisJaWYgKGVuYWJsZSkgeworCQlkb3duKCZjaGFuLT5kZXYtPnBsbF9tdXRleCk7CisJCXN0YXR1cyA9IGNoYW4tPmdhdGVfY3RybChmZSwgMSk7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gY2hhbi0+Z2F0ZV9jdHJsKGZlLCAwKTsKKwkJdXAoJmNoYW4tPmRldi0+cGxsX211dGV4KTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCB0dW5lcl9hdHRhY2hfdGRhMTgyNzEoc3RydWN0IG5nZW5lX2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmM7CisJc3RydWN0IGR2Yl9mcm9udGVuZCAqZmU7CisKKwlpMmMgPSAmY2hhbi0+ZGV2LT5jaGFubmVsWzBdLmkyY19hZGFwdGVyOworCWlmIChjaGFuLT5mZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWNoYW4tPmZlLT5vcHMuaTJjX2dhdGVfY3RybChjaGFuLT5mZSwgMSk7CisJZmUgPSBkdmJfYXR0YWNoKHRkYTE4MjcxYzJkZF9hdHRhY2gsIGNoYW4tPmZlLCBpMmMsIDB4NjApOworCWlmIChjaGFuLT5mZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWNoYW4tPmZlLT5vcHMuaTJjX2dhdGVfY3RybChjaGFuLT5mZSwgMCk7CisJaWYgKCFmZSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5vIFREQTE4MjcxIGZvdW5kIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR1bmVyX2F0dGFjaF9wcm9iZShzdHJ1Y3QgbmdlbmVfY2hhbm5lbCAqY2hhbikKK3sKKwlpZiAoY2hhbi0+ZGVtb2RfdHlwZSA9PSAwKQorCQlyZXR1cm4gdHVuZXJfYXR0YWNoX3N0djYxMTAoY2hhbik7CisJaWYgKGNoYW4tPmRlbW9kX3R5cGUgPT0gMSkKKwkJcmV0dXJuIHR1bmVyX2F0dGFjaF90ZGExODI3MShjaGFuKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKwogc3RhdGljIGludCBkZW1vZF9hdHRhY2hfc3R2MDkwMChzdHJ1Y3QgbmdlbmVfY2hhbm5lbCAqY2hhbikKIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYzsKQEAgLTEzMCw2ICsxNzUsNjAgQEAKIAkJdXAoJmNoYW4tPmRldi0+cGxsX211dGV4KTsKIH0KIAorc3RhdGljIGludCBpMmNfcmVhZChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IGFkciwgdTggKnZhbCkKK3sKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzWzFdID0ge3suYWRkciA9IGFkciwgIC5mbGFncyA9IEkyQ19NX1JELAorCQkJCSAgIC5idWYgID0gdmFsLCAgLmxlbiAgID0gMSB9IH07CisJcmV0dXJuIChpMmNfdHJhbnNmZXIoYWRhcHRlciwgbXNncywgMSkgPT0gMSkgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQgaTJjX3JlYWRfcmVnMTYoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCB1OCBhZHIsCisJCQkgIHUxNiByZWcsIHU4ICp2YWwpCit7CisJdTggbXNnWzJdID0ge3JlZz4+OCwgcmVnJjB4ZmZ9OworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbMl0gPSB7ey5hZGRyID0gYWRyLCAuZmxhZ3MgPSAwLAorCQkJCSAgIC5idWYgID0gbXNnLCAubGVuICAgPSAyfSwKKwkJCQkgIHsuYWRkciA9IGFkciwgLmZsYWdzID0gSTJDX01fUkQsCisJCQkJICAgLmJ1ZiAgPSB2YWwsIC5sZW4gICA9IDF9IH07CisJcmV0dXJuIChpMmNfdHJhbnNmZXIoYWRhcHRlciwgbXNncywgMikgPT0gMikgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQgcG9ydF9oYXNfc3R2MDkwMChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgaW50IHBvcnQpCit7CisJdTggdmFsOworCWlmIChpMmNfcmVhZF9yZWcxNihpMmMsIDB4NjgrcG9ydC8yLCAweGYxMDAsICZ2YWwpIDwgMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcG9ydF9oYXNfZHJ4ayhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgaW50IHBvcnQpCit7CisJdTggdmFsOworCisJaWYgKGkyY19yZWFkKGkyYywgMHgyOStwb3J0LCAmdmFsKSA8IDApCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGRlbW9kX2F0dGFjaF9kcnhrKHN0cnVjdCBuZ2VuZV9jaGFubmVsICpjaGFuLAorCQkJICAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYykKK3sKKwlzdHJ1Y3QgZHJ4a19jb25maWcgY29uZmlnOworCisJbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKKwljb25maWcuYWRyID0gMHgyOSArIChjaGFuLT5udW1iZXIgXiAyKTsKKworCWNoYW4tPmZlID0gZHZiX2F0dGFjaChkcnhrX2F0dGFjaCwgJmNvbmZpZywgaTJjLCAmY2hhbi0+ZmUyKTsKKwlpZiAoIWNoYW4tPmZlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTm8gRFJYSyBmb3VuZCFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJY2hhbi0+ZmUtPnNlY19wcml2ID0gY2hhbjsKKwljaGFuLT5nYXRlX2N0cmwgPSBjaGFuLT5mZS0+b3BzLmkyY19nYXRlX2N0cmw7CisJY2hhbi0+ZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsID0gZHJ4a19nYXRlX2N0cmw7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgY2luZVMyX3Byb2JlKHN0cnVjdCBuZ2VuZV9jaGFubmVsICpjaGFuKQogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjOwpAQCAtMTQ0LDQzICsyNDMsNDIgQEAKIAllbHNlCiAJCWkyYyA9ICZjaGFuLT5kZXYtPmNoYW5uZWxbMV0uaTJjX2FkYXB0ZXI7CiAKLQlmZV9jb25mID0gY2hhbi0+ZGV2LT5jYXJkX2luZm8tPmZlX2NvbmZpZ1tjaGFuLT5udW1iZXJdOwotCWkyY19tc2cuYWRkciA9IGZlX2NvbmYtPmFkZHJlc3M7CisJaWYgKHBvcnRfaGFzX3N0djA5MDAoaTJjLCBjaGFuLT5udW1iZXIpKSB7CisJCWNoYW4tPmRlbW9kX3R5cGUgPSAwOworCQlmZV9jb25mID0gY2hhbi0+ZGV2LT5jYXJkX2luZm8tPmZlX2NvbmZpZ1tjaGFuLT5udW1iZXJdOworCQkvKiBkZW1vZCBmb3VuZCwgYXR0YWNoIGl0ICovCisJCXJjID0gZGVtb2RfYXR0YWNoX3N0djA5MDAoY2hhbik7CisJCWlmIChyYyA8IDAgfHwgY2hhbi0+bnVtYmVyIDwgMikKKwkJCXJldHVybiByYzsKIAotCS8qIHByb2JlIGRlbW9kICovCi0JaTJjX21zZy5sZW4gPSAyOwotCWJ1ZlswXSA9IDB4ZjE7Ci0JYnVmWzFdID0gMHgwMDsKLQlyYyA9IGkyY190cmFuc2ZlcihpMmMsICZpMmNfbXNnLCAxKTsKLQlpZiAocmMgIT0gMSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKiBkZW1vZCBmb3VuZCwgYXR0YWNoIGl0ICovCi0JcmMgPSBkZW1vZF9hdHRhY2hfc3R2MDkwMChjaGFuKTsKLQlpZiAocmMgPCAwIHx8IGNoYW4tPm51bWJlciA8IDIpCi0JCXJldHVybiByYzsKLQotCS8qIGRlbW9kICMyOiByZXByb2dyYW0gb3V0cHV0cyBEUE4xICYgRFBOMiAqLwotCWkyY19tc2cubGVuID0gMzsKLQlidWZbMF0gPSAweGYxOwotCXN3aXRjaCAoY2hhbi0+bnVtYmVyKSB7Ci0JY2FzZSAyOgotCQlidWZbMV0gPSAweDVjOwotCQlidWZbMl0gPSAweGMyOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCWJ1ZlsxXSA9IDB4NjE7Ci0JCWJ1ZlsyXSA9IDB4Y2M7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6CisJCS8qIGRlbW9kICMyOiByZXByb2dyYW0gb3V0cHV0cyBEUE4xICYgRFBOMiAqLworCQlpMmNfbXNnLmFkZHIgPSBmZV9jb25mLT5hZGRyZXNzOworCQlpMmNfbXNnLmxlbiA9IDM7CisJCWJ1ZlswXSA9IDB4ZjE7CisJCXN3aXRjaCAoY2hhbi0+bnVtYmVyKSB7CisJCWNhc2UgMjoKKwkJCWJ1ZlsxXSA9IDB4NWM7CisJCQlidWZbMl0gPSAweGMyOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWJ1ZlsxXSA9IDB4NjE7CisJCQlidWZbMl0gPSAweGNjOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlyYyA9IGkyY190cmFuc2ZlcihpMmMsICZpMmNfbXNnLCAxKTsKKwkJaWYgKHJjICE9IDEpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBERVZJQ0VfTkFNRSAiOiBjb3VsZCBub3Qgc2V0dXAgRFBOeFxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0gZWxzZSBpZiAocG9ydF9oYXNfZHJ4ayhpMmMsIGNoYW4tPm51bWJlcl4yKSkgeworCQljaGFuLT5kZW1vZF90eXBlID0gMTsKKwkJZGVtb2RfYXR0YWNoX2RyeGsoY2hhbiwgaTJjKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIk5vIGRlbW9kIGZvdW5kIG9uIGNoYW4gJWRcbiIsIGNoYW4tPm51bWJlcik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQlyYyA9IGkyY190cmFuc2ZlcihpMmMsICZpMmNfbXNnLCAxKTsKLQlpZiAocmMgIT0gMSkgewotCQlwcmludGsoS0VSTl9FUlIgREVWSUNFX05BTUUgIjogY291bGQgbm90IHNldHVwIERQTnhcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzA2LDcgKzQwNCw3IEBACiAJLmlvX3R5cGUJPSB7TkdFTkVfSU9fVFNJTiwgTkdFTkVfSU9fVFNJTiwgTkdFTkVfSU9fVFNJTiwgTkdFTkVfSU9fVFNJTiwKIAkJCSAgIE5HRU5FX0lPX1RTT1VUfSwKIAkuZGVtb2RfYXR0YWNoCT0ge2RlbW9kX2F0dGFjaF9zdHYwOTAwLCBkZW1vZF9hdHRhY2hfc3R2MDkwMCwgY2luZVMyX3Byb2JlLCBjaW5lUzJfcHJvYmV9LAotCS50dW5lcl9hdHRhY2gJPSB7dHVuZXJfYXR0YWNoX3N0djYxMTAsIHR1bmVyX2F0dGFjaF9zdHY2MTEwLCB0dW5lcl9hdHRhY2hfc3R2NjExMCwgdHVuZXJfYXR0YWNoX3N0djYxMTB9LAorCS50dW5lcl9hdHRhY2gJPSB7dHVuZXJfYXR0YWNoX3N0djYxMTAsIHR1bmVyX2F0dGFjaF9zdHY2MTEwLCB0dW5lcl9hdHRhY2hfcHJvYmUsIHR1bmVyX2F0dGFjaF9wcm9iZX0sCiAJLmZlX2NvbmZpZwk9IHsmZmVfY2luZVMyLCAmZmVfY2luZVMyLCAmZmVfY2luZVMyXzIsICZmZV9jaW5lUzJfMn0sCiAJLnR1bmVyX2NvbmZpZwk9IHsmdHVuZXJfY2luZVMyXzAsICZ0dW5lcl9jaW5lUzJfMSwgJnR1bmVyX2NpbmVTMl8wLCAmdHVuZXJfY2luZVMyXzF9LAogCS5sbmIJCT0gezB4MGEsIDB4MDgsIDB4MGIsIDB4MDl9LApAQCAtMzIxLDcgKzQxOSw3IEBACiAJLmlvX3R5cGUJPSB7TkdFTkVfSU9fVFNJTiwgTkdFTkVfSU9fVFNJTiwgTkdFTkVfSU9fVFNJTiwgTkdFTkVfSU9fVFNJTiwKIAkJCSAgIE5HRU5FX0lPX1RTT1VUfSwKIAkuZGVtb2RfYXR0YWNoCT0ge2RlbW9kX2F0dGFjaF9zdHYwOTAwLCBkZW1vZF9hdHRhY2hfc3R2MDkwMCwgY2luZVMyX3Byb2JlLCBjaW5lUzJfcHJvYmV9LAotCS50dW5lcl9hdHRhY2gJPSB7dHVuZXJfYXR0YWNoX3N0djYxMTAsIHR1bmVyX2F0dGFjaF9zdHY2MTEwLCB0dW5lcl9hdHRhY2hfc3R2NjExMCwgdHVuZXJfYXR0YWNoX3N0djYxMTB9LAorCS50dW5lcl9hdHRhY2gJPSB7dHVuZXJfYXR0YWNoX3N0djYxMTAsIHR1bmVyX2F0dGFjaF9zdHY2MTEwLCB0dW5lcl9hdHRhY2hfcHJvYmUsIHR1bmVyX2F0dGFjaF9wcm9iZX0sCiAJLmZlX2NvbmZpZwk9IHsmZmVfY2luZVMyLCAmZmVfY2luZVMyLCAmZmVfY2luZVMyXzIsICZmZV9jaW5lUzJfMn0sCiAJLnR1bmVyX2NvbmZpZwk9IHsmdHVuZXJfY2luZVMyXzAsICZ0dW5lcl9jaW5lUzJfMSwgJnR1bmVyX2NpbmVTMl8wLCAmdHVuZXJfY2luZVMyXzF9LAogCS5sbmIJCT0gezB4MGEsIDB4MDgsIDB4MGIsIDB4MDl9LApAQCAtMzMxLDEzICs0MjksMTMgQEAKIH07CiAKIAotc3RhdGljIHN0cnVjdCBuZ2VuZV9pbmZvIG5nZW5lX2luZm9fZHVvRmxleFMyID0geworc3RhdGljIHN0cnVjdCBuZ2VuZV9pbmZvIG5nZW5lX2luZm9fZHVvRmxleCA9IHsKIAkudHlwZSAgICAgICAgICAgPSBOR0VORV9TSURFV0lOREVSLAotCS5uYW1lICAgICAgICAgICA9ICJEaWdpdGFsIERldmljZXMgRHVvRmxleCBTMiBtaW5pUENJZSIsCisJLm5hbWUgICAgICAgICAgID0gIkRpZ2l0YWwgRGV2aWNlcyBEdW9GbGV4IFBDSWUgb3IgbWluaVBDSWUiLAogCS5pb190eXBlICAgICAgICA9IHtOR0VORV9JT19UU0lOLCBOR0VORV9JT19UU0lOLCBOR0VORV9JT19UU0lOLCBOR0VORV9JT19UU0lOLAogCQkJICAgTkdFTkVfSU9fVFNPVVR9LAogCS5kZW1vZF9hdHRhY2ggICA9IHtjaW5lUzJfcHJvYmUsIGNpbmVTMl9wcm9iZSwgY2luZVMyX3Byb2JlLCBjaW5lUzJfcHJvYmV9LAotCS50dW5lcl9hdHRhY2ggICA9IHt0dW5lcl9hdHRhY2hfc3R2NjExMCwgdHVuZXJfYXR0YWNoX3N0djYxMTAsIHR1bmVyX2F0dGFjaF9zdHY2MTEwLCB0dW5lcl9hdHRhY2hfc3R2NjExMH0sCisJLnR1bmVyX2F0dGFjaCAgID0ge3R1bmVyX2F0dGFjaF9wcm9iZSwgdHVuZXJfYXR0YWNoX3Byb2JlLCB0dW5lcl9hdHRhY2hfcHJvYmUsIHR1bmVyX2F0dGFjaF9wcm9iZX0sCiAJLmZlX2NvbmZpZyAgICAgID0geyZmZV9jaW5lUzIsICZmZV9jaW5lUzIsICZmZV9jaW5lUzJfMiwgJmZlX2NpbmVTMl8yfSwKIAkudHVuZXJfY29uZmlnICAgPSB7JnR1bmVyX2NpbmVTMl8wLCAmdHVuZXJfY2luZVMyXzEsICZ0dW5lcl9jaW5lUzJfMCwgJnR1bmVyX2NpbmVTMl8xfSwKIAkubG5iICAgICAgICAgICAgPSB7MHgwYSwgMHgwOCwgMHgwYiwgMHgwOX0sCkBAIC0zODUsOCArNDgzLDggQEAKIAlOR0VORV9JRCgweDE4YzMsIDB4ZGIwMSwgbmdlbmVfaW5mb19zYXRpeFMyKSwKIAlOR0VORV9JRCgweDE4YzMsIDB4ZGIwMiwgbmdlbmVfaW5mb19zYXRpeFMydjIpLAogCU5HRU5FX0lEKDB4MThjMywgMHhkZDAwLCBuZ2VuZV9pbmZvX2NpbmVTMnY1KSwKLQlOR0VORV9JRCgweDE4YzMsIDB4ZGQxMCwgbmdlbmVfaW5mb19kdW9GbGV4UzIpLAotCU5HRU5FX0lEKDB4MThjMywgMHhkZDIwLCBuZ2VuZV9pbmZvX2R1b0ZsZXhTMiksCisJTkdFTkVfSUQoMHgxOGMzLCAweGRkMTAsIG5nZW5lX2luZm9fZHVvRmxleCksCisJTkdFTkVfSUQoMHgxOGMzLCAweGRkMjAsIG5nZW5lX2luZm9fZHVvRmxleCksCiAJTkdFTkVfSUQoMHgxNDYxLCAweDA2MmUsIG5nZW5lX2luZm9fbTc4MCksCiAJezB9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvbmdlbmUtY29yZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvbmdlbmUtY29yZS5jCmluZGV4IDY5MjdjNzIuLmYxMjlhOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL25nZW5lL25nZW5lLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9uZ2VuZS1jb3JlLmMKQEAgLTQxLDcgKzQxLDcgQEAKIAogI2luY2x1ZGUgIm5nZW5lLmgiCiAKLXN0YXRpYyBpbnQgb25lX2FkYXB0ZXIgPSAxOworc3RhdGljIGludCBvbmVfYWRhcHRlcjsKIG1vZHVsZV9wYXJhbShvbmVfYWRhcHRlciwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Mob25lX2FkYXB0ZXIsICJVc2Ugb25seSBvbmUgYWRhcHRlci4iKTsKIApAQCAtNDYxLDcgKzQ2MSw3IEBACiAJMHg0MiwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHhiYywgMHgwMCwgMHgwMCwKIAkweDQwLCAweDA2LCAweDAwLCAweDAyLCAweDAyLCAweGJjLCAweDAwLCAweDAwLAkvKiBEUlhIICovCiAJMHg3MSwgMHgwNywgMHgwMCwgMHgwMiwgMHgwMiwgMHhiYywgMHgwMCwgMHgwMCwJLyogRFJYSHNlciAqLwotCTB4NzIsIDB4MDYsIDB4MDAsIDB4MDIsIDB4MDIsIDB4YmMsIDB4MDAsIDB4MDAsCS8qIFMyc2VyICovCisJMHg3MiwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHhiYywgMHgwMCwgMHgwMCwJLyogUzJzZXIgKi8KIAkweDQwLCAweDA3LCAweDAwLCAweDAyLCAweDAyLCAweGJjLCAweDAwLCAweDAwLCAvKiBMR0RUMzMwMyAqLwogfTsKIApAQCAtNTA3LDcgKzUwNyw3IEBACiB7CiAJdTMyICpwdHIgPSBCdWZmZXI7CiAKLQltZW1zZXQoQnVmZmVyLCAweGZmLCBMZW5ndGgpOworCW1lbXNldChCdWZmZXIsIFRTX0ZJTExFUiwgTGVuZ3RoKTsKIAl3aGlsZSAoTGVuZ3RoID4gMCkgewogCQlpZiAoRmxhZ3MgJiBERl9TV0FQMzIpCiAJCQkqcHRyID0gMHg0NzFGRkYxMDsKQEAgLTE0NDMsNiArMTQ0Myw5IEBACiAJCWNoYW4tPmNpX2RldiA9IE5VTEw7CiAJfQogCisJaWYgKGNoYW4tPmZlMikKKwkJZHZiX3VucmVnaXN0ZXJfZnJvbnRlbmQoY2hhbi0+ZmUyKTsKKwogCWlmIChjaGFuLT5mZSkgewogCQlkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChjaGFuLT5mZSk7CiAJCWR2Yl9mcm9udGVuZF9kZXRhY2goY2hhbi0+ZmUpOwpAQCAtMTUzNCw2ICsxNTM3LDE0IEBACiAJCQlnb3RvIGVycjsKIAkJY2hhbi0+aGFzX2RlbXV4ID0gdHJ1ZTsKIAl9CisJaWYgKGNoYW4tPmZlMikgeworCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKGFkYXB0ZXIsIGNoYW4tPmZlMikgPCAwKQorCQkJZ290byBlcnI7CisJCWNoYW4tPmZlMi0+dHVuZXJfcHJpdiA9IGNoYW4tPmZlLT50dW5lcl9wcml2OworCQltZW1jcHkoJmNoYW4tPmZlMi0+b3BzLnR1bmVyX29wcywKKwkJICAgICAgICZjaGFuLT5mZS0+b3BzLnR1bmVyX29wcywKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgZHZiX3R1bmVyX29wcykpOworCX0KIAogCWlmIChjaGFuLT5oYXNfZGVtdXgpIHsKIAkJcmV0ID0gbXlfZHZiX2RteF90c19jYXJkX2luaXQoZHZiZGVtdXgsICJTVyBkZW11eCIsCkBAIC0xNTcxLDExICsxNTgyLDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgY3hkMjA5OV9jZmcgY3hkX2NmZyA9IHsKKwkuYml0cmF0ZSA9IDYyMDAwLAorCS5hZHIgPSAweDQwLAorCS5wb2xhcml0eSA9IDAsCisJLmNsb2NrX21vZGUgPSAwLAorfTsKKwogc3RhdGljIHZvaWQgY3hkX2F0dGFjaChzdHJ1Y3QgbmdlbmUgKmRldikKIHsKIAlzdHJ1Y3QgbmdlbmVfY2kgKmNpID0gJmRldi0+Y2k7CiAKLQljaS0+ZW4gPSBjeGQyMDk5X2F0dGFjaCgweDQwLCBkZXYsICZkZXYtPmNoYW5uZWxbMF0uaTJjX2FkYXB0ZXIpOworCWNpLT5lbiA9IGN4ZDIwOTlfYXR0YWNoKCZjeGRfY2ZnLCBkZXYsICZkZXYtPmNoYW5uZWxbMF0uaTJjX2FkYXB0ZXIpOwogCWNpLT5kZXYgPSBkZXY7CiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvbmdlbmUtZHZiLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9uZ2VuZS1kdmIuYwppbmRleCAwYjQ5NDMyLi5mY2IxNmE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9uZ2VuZS1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9uZ2VuZS1kdmIuYwpAQCAtMTE4LDYgKzExOCwxNiBAQAogCX0KIH0KIAorLyogc3RhcnQgb2YgZmlsbGVyIHBhY2tldCAqLworc3RhdGljIHU4IGZpbGxfdHNbXSA9IHsgMHg0NywgMHgxZiwgMHhmZiwgMHgxMCwgVFNfRklMTEVSIH07CisKKy8qICNkZWZpbmUgREVCVUdfQ0lfWEZFUiAqLworI2lmZGVmIERFQlVHX0NJX1hGRVIKK3N0YXRpYyB1MzIgb2s7CitzdGF0aWMgdTMyIG92ZXJmbG93Oworc3RhdGljIHUzMiBzdHJpcHBlZDsKKyNlbmRpZgorCiB2b2lkICp0c2luX2V4Y2hhbmdlKHZvaWQgKnByaXYsIHZvaWQgKmJ1ZiwgdTMyIGxlbiwgdTMyIGNsb2NrLCB1MzIgZmxhZ3MpCiB7CiAJc3RydWN0IG5nZW5lX2NoYW5uZWwgKmNoYW4gPSBwcml2OwpAQCAtMTI2LDIxICsxMzYsNDEgQEAKIAogCWlmIChmbGFncyAmIERGX1NXQVAzMikKIAkJc3dhcF9idWZmZXIoYnVmLCBsZW4pOworCiAJaWYgKGRldi0+Y2kuZW4gJiYgY2hhbi0+bnVtYmVyID09IDIpIHsKLQkJaWYgKGR2Yl9yaW5nYnVmZmVyX2ZyZWUoJmRldi0+dHNpbl9yYnVmKSA+IGxlbikgewotCQkJZHZiX3JpbmdidWZmZXJfd3JpdGUoJmRldi0+dHNpbl9yYnVmLCBidWYsIGxlbik7Ci0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+dHNpbl9yYnVmLnF1ZXVlKTsKKwkJd2hpbGUgKGxlbiA+PSAxODgpIHsKKwkJCWlmIChtZW1jbXAoYnVmLCBmaWxsX3RzLCBzaXplb2YgZmlsbF90cykgIT0gMCkgeworCQkJCWlmIChkdmJfcmluZ2J1ZmZlcl9mcmVlKCZkZXYtPnRzaW5fcmJ1ZikgPj0gMTg4KSB7CisJCQkJCWR2Yl9yaW5nYnVmZmVyX3dyaXRlKCZkZXYtPnRzaW5fcmJ1ZiwgYnVmLCAxODgpOworCQkJCQl3YWtlX3VwKCZkZXYtPnRzaW5fcmJ1Zi5xdWV1ZSk7CisjaWZkZWYgREVCVUdfQ0lfWEZFUgorCQkJCQlvaysrOworI2VuZGlmCisJCQkJfQorI2lmZGVmIERFQlVHX0NJX1hGRVIKKwkJCQllbHNlCisJCQkJCW92ZXJmbG93Kys7CisjZW5kaWYKKwkJCX0KKyNpZmRlZiBERUJVR19DSV9YRkVSCisJCQllbHNlCisJCQkJc3RyaXBwZWQrKzsKKworCQkJaWYgKG9rICUgMTAwID09IDAgJiYgb3ZlcmZsb3cpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG9rICV1IG92ZXJmbG93ICV1IGRyb3BwZWQgJXVcbiIsIF9fZnVuY19fLCBvaywgb3ZlcmZsb3csIHN0cmlwcGVkKTsKKyNlbmRpZgorCQkJYnVmICs9IDE4ODsKKwkJCWxlbiAtPSAxODg7CiAJCX0KLQkJcmV0dXJuIDA7CisJCXJldHVybiBOVUxMOwogCX0KLQlpZiAoY2hhbi0+dXNlcnMgPiAwKSB7CisKKwlpZiAoY2hhbi0+dXNlcnMgPiAwKQogCQlkdmJfZG14X3N3ZmlsdGVyKCZjaGFuLT5kZW11eCwgYnVmLCBsZW4pOwotCX0KKwogCXJldHVybiBOVUxMOwogfQogCi11OCBmaWxsX3RzWzE4OF0gPSB7IDB4NDcsIDB4MWYsIDB4ZmYsIDB4MTAgfTsKLQogdm9pZCAqdHNvdXRfZXhjaGFuZ2Uodm9pZCAqcHJpdiwgdm9pZCAqYnVmLCB1MzIgbGVuLCB1MzIgY2xvY2ssIHUzMiBmbGFncykKIHsKIAlzdHJ1Y3QgbmdlbmVfY2hhbm5lbCAqY2hhbiA9IHByaXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9uZ2VuZS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvbmdlbmUuaAppbmRleCA0MGZjZTllLi41NDQzZGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9uZ2VuZS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL25nZW5lL25nZW5lLmgKQEAgLTY0MSw4ICs2NDEsMTEgQEAKIAlpbnQgICAgICAgICAgICAgICAgICAgbW9kZTsKIAlib29sICAgICAgICAgICAgICAgICAgaGFzX2FkYXB0ZXI7CiAJYm9vbCAgICAgICAgICAgICAgICAgIGhhc19kZW11eDsKKwlpbnQgICAgICAgICAgICAgICAgICAgZGVtb2RfdHlwZTsKKwlpbnQgKCpnYXRlX2N0cmwpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKiwgaW50KTsKIAogCXN0cnVjdCBkdmJfZnJvbnRlbmQgICpmZTsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kICAqZmUyOwogCXN0cnVjdCBkbXhkZXYgICAgICAgICBkbXhkZXY7CiAJc3RydWN0IGR2Yl9kZW11eCAgICAgIGRlbXV4OwogCXN0cnVjdCBkdmJfbmV0ICAgICAgICBkdmJuZXQ7CkBAIC03ODYsNiArNzg5LDggQEAKIAl1OCAgICAgICAgICAgICAgICAgICAgdWFydF9yYnVmW1VBUlRfUkJVRl9MRU5dOwogCWludCAgICAgICAgICAgICAgICAgICB1YXJ0X3JwLCB1YXJ0X3dwOwogCisjZGVmaW5lIFRTX0ZJTExFUiAgMHg2ZgorCiAJdTggICAgICAgICAgICAgICAgICAgKnRzb3V0X2J1ZjsKICNkZWZpbmUgVFNPVVRfQlVGX1NJWkUgKDUxMioxODgqOCkKIAlzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgdHNvdXRfcmJ1ZjsKQEAgLTg1Miw3ICs4NTcsNyBAQAogfTsKIAogI2lmZGVmIE5HRU5FX1Y0TAotc3RydWN0IG5nZW5lX2Zvcm1hdHsKK3N0cnVjdCBuZ2VuZV9mb3JtYXQgewogCWNoYXIgKm5hbWU7CiAJaW50ICAgZm91cmNjOyAgICAgICAgICAvKiB2aWRlbzRsaW51eCAyICAgICAgKi8KIAlpbnQgICBidGZvcm1hdDsgICAgICAgIC8qIEJUODQ4X0NPTE9SX0ZNVF8qICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zY29yZWFwaS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zY29yZWFwaS5jCmluZGV4IDc4NzY1ZWQuLjczMzFlODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc2NvcmVhcGkuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNjb3JlYXBpLmMKQEAgLTExNDcsNyArMTE0Nyw3IEBACiAKIAlpZiAoIWNsaWVudCkgewogCQlzbXNfZXJyKCJiYWQgcGFyYW1ldGVyLiIpOwotCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJlZ2lzdGVyZWRfY2xpZW50ID0gc21zY29yZV9maW5kX2NsaWVudChjb3JlZGV2LCBkYXRhX3R5cGUsIGlkKTsKIAlpZiAocmVnaXN0ZXJlZF9jbGllbnQgPT0gY2xpZW50KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zY29yZWFwaS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zY29yZWFwaS5oCmluZGV4IDhlY2FkZWMuLmM1OTJhZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc2NvcmVhcGkuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNjb3JlYXBpLmgKQEAgLTIyLDcgKzIyLDYgQEAKICNpZm5kZWYgX19TTVNfQ09SRV9BUElfSF9fCiAjZGVmaW5lIF9fU01TX0NPUkVfQVBJX0hfXwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9kc2JyMTAwLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL2RzYnIxMDAuYwppbmRleCAzZDhjYzQyLi4yNWU1OGNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL2RzYnIxMDAuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL2RzYnIxMDAuYwpAQCAtMTAyLDEwICsxMDIsNyBAQAogLyoKICAqIFZlcnNpb24gSW5mb3JtYXRpb24KICAqLwotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4JLyogZm9yIEtFUk5FTF9WRVJTSU9OIE1BQ1JPCSovCi0KLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYwLjQ2IgotI2RlZmluZSBSQURJT19WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDQsIDYpCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjQuNyIKIAogI2RlZmluZSBEUklWRVJfQVVUSE9SICJNYXJrdXMgRGVtbGVpdG5lciA8bXNkZW1sZWlAdHVjYW5hLmhhcnZhcmQuZWR1PiIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIkQtTGluayBEU0ItUjEwMCBVU0IgRk0gcmFkaW8gZHJpdmVyIgpAQCAtMzM1LDcgKzMzMiw2IEBACiAJc3RybGNweSh2LT5kcml2ZXIsICJkc2JyMTAwIiwgc2l6ZW9mKHYtPmRyaXZlcikpOwogCXN0cmxjcHkodi0+Y2FyZCwgIkQtTGluayBSLTEwMCBVU0IgRk0gUmFkaW8iLCBzaXplb2Yodi0+Y2FyZCkpOwogCXVzYl9tYWtlX3BhdGgocmFkaW8tPnVzYmRldiwgdi0+YnVzX2luZm8sIHNpemVvZih2LT5idXNfaW5mbykpOwotCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwogCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSOwogCXJldHVybiAwOwogfQpAQCAtNjQ3LDMgKzY0Myw0IEBACiBNT0RVTEVfQVVUSE9SKCBEUklWRVJfQVVUSE9SICk7CiBNT0RVTEVfREVTQ1JJUFRJT04oIERSSVZFUl9ERVNDICk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWFpbXNsYWIuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYWltc2xhYi5jCmluZGV4IDRjZTEwZGIuLjFjM2Y4NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYWltc2xhYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYWltc2xhYi5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CS8qIHJlcXVlc3RfcmVnaW9uCQkqLwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIG1zbGVlcAkJCSovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CS8qIGtlcm5lbCByYWRpbyBzdHJ1Y3RzCQkqLwotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4JLyogZm9yIEtFUk5FTF9WRVJTSU9OIE1BQ1JPCSovCiAjaW5jbHVkZSA8bGludXgvaW8uaD4JCS8qIG91dGIsIG91dGJfcAkJCSovCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CkBAIC00MSw2ICs0MCw3IEBACiBNT0RVTEVfQVVUSE9SKCJNLktpcmt3b29kIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkEgZHJpdmVyIGZvciB0aGUgUmFkaW9UcmFjay9SYWRpb1JldmVhbCByYWRpbyBjYXJkLiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjAuMC4zIik7CiAKICNpZm5kZWYgQ09ORklHX1JBRElPX1JUUkFDS19QT1JUCiAjZGVmaW5lIENPTkZJR19SQURJT19SVFJBQ0tfUE9SVCAtMQpAQCAtNTMsOCArNTMsNiBAQAogTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBhZGRyZXNzIG9mIHRoZSBSYWRpb1RyYWNrIGNhcmQgKDB4MjBmIG9yIDB4MzBmKSIpOwogbW9kdWxlX3BhcmFtKHJhZGlvX25yLCBpbnQsIDApOwogCi0jZGVmaW5lIFJBRElPX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMCwgMCwgMikKLQogc3RydWN0IHJ0cmFjawogewogCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKQEAgLTIyMyw3ICsyMjEsNiBAQAogCXN0cmxjcHkodi0+ZHJpdmVyLCAicmFkaW8tYWltc2xhYiIsIHNpemVvZih2LT5kcml2ZXIpKTsKIAlzdHJsY3B5KHYtPmNhcmQsICJSYWRpb1RyYWNrIiwgc2l6ZW9mKHYtPmNhcmQpKTsKIAlzdHJsY3B5KHYtPmJ1c19pbmZvLCAiSVNBIiwgc2l6ZW9mKHYtPmJ1c19pbmZvKSk7Ci0Jdi0+dmVyc2lvbiA9IFJBRElPX1ZFUlNJT047CiAJdi0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVIgfCBWNEwyX0NBUF9SQURJTzsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYXp0ZWNoLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWF6dGVjaC5jCmluZGV4IGRkOGE2YWIuLmVlZDdiMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYXp0ZWNoLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1henRlY2guYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgkvKiByZXF1ZXN0X3JlZ2lvbgkJKi8KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiB1ZGVsYXkJCQkqLwogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgkvKiBrZXJuZWwgcmFkaW8gc3RydWN0cwkJKi8KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+ICAgICAgLyogZm9yIEtFUk5FTF9WRVJTSU9OIE1BQ1JPICAgICAqLwogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CQkvKiBvdXRiLCBvdXRiX3AJCQkqLwogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgpAQCAtMzgsNiArMzcsNyBAQAogTU9EVUxFX0FVVEhPUigiUnVzc2VsbCBLcm9sbCwgUXVheSBMdSwgRG9uYWxkIFNvbmcsIEphc29uIExld2lzLCBTY290dCBNY0dyYXRoLCBXaWxsaWFtIE1jR3JhdGgiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQSBkcml2ZXIgZm9yIHRoZSBBenRlY2ggcmFkaW8gY2FyZC4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjAuMyIpOwogCiAvKiBhY2NlcHRhYmxlIHBvcnRzOiAweDM1MCAoSlAzIHNob3J0ZWQpLCAweDM1OCAoSlAzIG9wZW4pICovCiAKQEAgLTUzLDggKzUzLDYgQEAKIG1vZHVsZV9wYXJhbShyYWRpb19uciwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoaW8sICJJL08gYWRkcmVzcyBvZiB0aGUgQXp0ZWNoIGNhcmQgKDB4MzUwIG9yIDB4MzU4KSIpOwogCi0jZGVmaW5lIFJBRElPX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMCwgMCwgMikKLQogc3RydWN0IGF6dGVjaAogewogCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKQEAgLTE4OCw3ICsxODYsNiBAQAogCXN0cmxjcHkodi0+ZHJpdmVyLCAicmFkaW8tYXp0ZWNoIiwgc2l6ZW9mKHYtPmRyaXZlcikpOwogCXN0cmxjcHkodi0+Y2FyZCwgIkF6dGVjaCBSYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7CiAJc3RybGNweSh2LT5idXNfaW5mbywgIklTQSIsIHNpemVvZih2LT5idXNfaW5mbykpOwotCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwogCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU87CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWNhZGV0LmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWNhZGV0LmMKaW5kZXggYmM5YWQwOC4uMTZhMDg5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1jYWRldC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tY2FkZXQuYwpAQCAtMzAsNyArMzAsNiBAQAogICoJCUNoYW5nZWQgQVBJIHRvIFY0TDIKICAqLwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgkvKiBNb2R1bGVzIAkJCSovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgkJLyogSW5pdGRhdGEJCQkqLwogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgkvKiByZXF1ZXN0X3JlZ2lvbgkJKi8KQEAgLTQ2LDYgKzQ1LDcgQEAKIE1PRFVMRV9BVVRIT1IoIkZyZWQgR2xlYXNvbiwgUnVzc2VsbCBLcm9sbCwgUXVheSBMdSwgRG9uYWxkIFNvbmcsIEphc29uIExld2lzLCBTY290dCBNY0dyYXRoLCBXaWxsaWFtIE1jR3JhdGgiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQSBkcml2ZXIgZm9yIHRoZSBBRFMgQ2FkZXQgQU0vRk0vUkRTIHJhZGlvIGNhcmQuIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4zLjQiKTsKIAogc3RhdGljIGludCBpbyA9IC0xOwkJLyogZGVmYXVsdCB0byBpc2FwbnAgYWN0aXZhdGlvbiAqLwogc3RhdGljIGludCByYWRpb19uciA9IC0xOwpAQCAtNTQsOCArNTQsNiBAQAogTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBhZGRyZXNzIG9mIENhZGV0IGNhcmQgKDB4MzMwLDB4MzMyLDB4MzM0LDB4MzM2LDB4MzM4LDB4MzNhLDB4MzNjLDB4MzNlKSIpOwogbW9kdWxlX3BhcmFtKHJhZGlvX25yLCBpbnQsIDApOwogCi0jZGVmaW5lIENBREVUX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMCwgMywgMykKLQogI2RlZmluZSBSRFNfQlVGRkVSIDI1NgogI2RlZmluZSBSRFNfUlhfRkxBRyAxCiAjZGVmaW5lIE1CU19SWF9GTEFHIDIKQEAgLTM2MSw3ICszNTksNiBAQAogCXN0cmxjcHkodi0+ZHJpdmVyLCAiQURTIENhZGV0Iiwgc2l6ZW9mKHYtPmRyaXZlcikpOwogCXN0cmxjcHkodi0+Y2FyZCwgIkFEUyBDYWRldCIsIHNpemVvZih2LT5jYXJkKSk7CiAJc3RybGNweSh2LT5idXNfaW5mbywgIklTQSIsIHNpemVvZih2LT5idXNfaW5mbykpOwotCXYtPnZlcnNpb24gPSBDQURFVF9WRVJTSU9OOwogCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU8gfAogCQkJICBWNEwyX0NBUF9SRUFEV1JJVEUgfCBWNEwyX0NBUF9SRFNfQ0FQVFVSRTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWdlbXRlay5jCmluZGV4IDI1OTkzNjQuLmVkYWRjODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWsuYwpAQCAtMjEsMjEgKzIxLDE5IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CS8qIHJlcXVlc3RfcmVnaW9uCQkqLwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIHVkZWxheQkJCSovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CS8qIGtlcm5lbCByYWRpbyBzdHJ1Y3RzCQkqLwotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4JLyogZm9yIEtFUk5FTF9WRVJTSU9OIE1BQ1JPCSovCiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgkJLyogb3V0Yiwgb3V0Yl9wCQkJKi8KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KIAotI2RlZmluZSBSQURJT19WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDMpCi0KIC8qCiAgKiBNb2R1bGUgaW5mby4KICAqLwogCi1NT0RVTEVfQVVUSE9SKCJKb25hcyBNdW5zaW4sIFBla2thIFNlcHDkbmVuIDxwZXh1QGthcHNpLmZpPiIpOworTU9EVUxFX0FVVEhPUigiSm9uYXMgTXVuc2luLCBQZWtrYSBTZXBww6RuZW4gPHBleHVAa2Fwc2kuZmk+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkEgZHJpdmVyIGZvciB0aGUgR2VtVGVrIFJhZGlvIGNhcmQuIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4wLjQiKTsKIAogLyoKICAqIE1vZHVsZSBwYXJhbXMuCkBAIC0zODcsNyArMzg1LDYgQEAKIAlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLWdlbXRlayIsIHNpemVvZih2LT5kcml2ZXIpKTsKIAlzdHJsY3B5KHYtPmNhcmQsICJHZW1UZWsiLCBzaXplb2Yodi0+Y2FyZCkpOwogCXN0cmxjcHkodi0+YnVzX2luZm8sICJJU0EiLCBzaXplb2Yodi0+YnVzX2luZm8pKTsKLQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKIAl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1JBRElPOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tYXhpcmFkaW8uYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWF4aXJhZGlvLmMKaW5kZXggZTgzZTg0MC4uZjg3MmE1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tYXhpcmFkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1heGlyYWRpby5jCkBAIC00MCwxNSArNDAsMTggQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4gICAgICAvKiBmb3IgS0VSTkVMX1ZFUlNJT04gTUFDUk8gICAgICovCiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjAuNy44IgorCisKIE1PRFVMRV9BVVRIT1IoIkRpbWl0cm9tYW5vbGFraXMgQXBvc3RvbG9zLCBhcGRpbUBncmVjaWFuLm5ldCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJSYWRpbyBkcml2ZXIgZm9yIHRoZSBHdWlsbGVtb3QgTWF4aSBSYWRpbyBGTTIwMDAgcmFkaW8uIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7CiAKIHN0YXRpYyBpbnQgcmFkaW9fbnIgPSAtMTsKIG1vZHVsZV9wYXJhbShyYWRpb19uciwgaW50LCAwKTsKQEAgLTU4LDEwICs2MSw2IEBACiBtb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiYWN0aXZhdGVzIGRlYnVnIGluZm8iKTsKIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTgkiMC43NyIKLQotI2RlZmluZSBSQURJT19WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDcsIDcpCi0KICNkZWZpbmUgZHByaW50ayhkZXYsIG51bSwgZm10LCBhcmcuLi4pIFwKIAl2NGwyX2RiZyhudW0sIGRlYnVnLCAmZGV2LT52NGwyX2RldiwgZm10LCAjIyBhcmcpCiAKQEAgLTE5NSw3ICsxOTQsNiBAQAogCXN0cmxjcHkodi0+ZHJpdmVyLCAicmFkaW8tbWF4aXJhZGlvIiwgc2l6ZW9mKHYtPmRyaXZlcikpOwogCXN0cmxjcHkodi0+Y2FyZCwgIk1heGkgUmFkaW8gRk0yMDAwIHJhZGlvIiwgc2l6ZW9mKHYtPmNhcmQpKTsKIAlzbnByaW50Zih2LT5idXNfaW5mbywgc2l6ZW9mKHYtPmJ1c19pbmZvKSwgIlBDSTolcyIsIHBjaV9uYW1lKGRldi0+cGRldikpOwotCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwogCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU87CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1yODAwLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1yODAwLmMKaW5kZXggYjNhNjM1Yi4uMTc0MmJkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tcjgwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbXI4MDAuYwpAQCAtNjMsMTggKzYzLDE3IEBACiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgkvKiBmb3IgS0VSTkVMX1ZFUlNJT04gTUFDUk8gKi8KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAvKiBkcml2ZXIgYW5kIG1vZHVsZSBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBEUklWRVJfQVVUSE9SICJBbGV4ZXkgS2xpbW92IDxrbGltb3YubGludXhAZ21haWwuY29tPiIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIkF2ZXJNZWRpYSBNUiA4MDAgVVNCIEZNIHJhZGlvIGRyaXZlciIKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMTEiCi0jZGVmaW5lIFJBRElPX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMCwgMSwgMSkKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMS4yIgogCiBNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwogTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OKTsKIAogI2RlZmluZSBVU0JfQU1SQURJT19WRU5ET1IgMHgwN2NhCiAjZGVmaW5lIFVTQl9BTVJBRElPX1BST0RVQ1QgMHhiODAwCkBAIC0zMDEsNyArMzAwLDYgQEAKIAlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLW1yODAwIiwgc2l6ZW9mKHYtPmRyaXZlcikpOwogCXN0cmxjcHkodi0+Y2FyZCwgIkF2ZXJNZWRpYSBNUiA4MDAgVVNCIEZNIFJhZGlvIiwgc2l6ZW9mKHYtPmNhcmQpKTsKIAl1c2JfbWFrZV9wYXRoKHJhZGlvLT51c2JkZXYsIHYtPmJ1c19pbmZvLCBzaXplb2Yodi0+YnVzX2luZm8pKTsKLQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKIAl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUjsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tcnRyYWNrMi5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1ydHJhY2syLmMKaW5kZXggOGQ2ZWE1OS4uMzYyOGJlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1ydHJhY2syLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1ydHJhY2syLmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiB1ZGVsYXkJCQkqLwogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgkvKiBrZXJuZWwgcmFkaW8gc3RydWN0cwkJKi8KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4gICAgICAvKiBmb3IgS0VSTkVMX1ZFUlNJT04gTUFDUk8gICAgICovCiAjaW5jbHVkZSA8bGludXgvaW8uaD4JCS8qIG91dGIsIG91dGJfcAkJCSovCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CkBAIC0yMyw2ICsyMiw3IEBACiBNT0RVTEVfQVVUSE9SKCJCZW4gUGZhZmYiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQSBkcml2ZXIgZm9yIHRoZSBSYWRpb1RyYWNrIElJIHJhZGlvIGNhcmQuIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4wLjMiKTsKIAogI2lmbmRlZiBDT05GSUdfUkFESU9fUlRSQUNLMl9QT1JUCiAjZGVmaW5lIENPTkZJR19SQURJT19SVFJBQ0syX1BPUlQgLTEKQEAgLTM1LDggKzM1LDYgQEAKIE1PRFVMRV9QQVJNX0RFU0MoaW8sICJJL08gYWRkcmVzcyBvZiB0aGUgUmFkaW9UcmFjayBjYXJkICgweDIwYyBvciAweDMwYykiKTsKIG1vZHVsZV9wYXJhbShyYWRpb19uciwgaW50LCAwKTsKIAotI2RlZmluZSBSQURJT19WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDIpCi0KIHN0cnVjdCBydHJhY2syCiB7CiAJc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2OwpAQCAtMTIxLDcgKzExOSw2IEBACiAJc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby1ydHJhY2syIiwgc2l6ZW9mKHYtPmRyaXZlcikpOwogCXN0cmxjcHkodi0+Y2FyZCwgIlJhZGlvVHJhY2sgSUkiLCBzaXplb2Yodi0+Y2FyZCkpOwogCXN0cmxjcHkodi0+YnVzX2luZm8sICJJU0EiLCBzaXplb2Yodi0+YnVzX2luZm8pKTsKLQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKIAl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1JBRElPOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1pLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbWkuYwppbmRleCBiNWE1Zjg5Li4yMmM1NzQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbWkuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbWkuYwpAQCAtMTYsNyArMTYsNiBAQAogICogQ29udmVydGVkIHRvIFY0TDIgQVBJIGJ5IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgogICovCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIF9fc2V0dXAJCQkqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgkvKiBNb2R1bGVzIAkJCSovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgkJLyogSW5pdGRhdGEJCQkqLwpAQCAtMzIsNiArMzEsNyBAQAogTU9EVUxFX0FVVEhPUigiUGV0ciBWYW5kcm92ZWMsIHZhbmRyb3ZlQHZjLmN2dXQuY3ogYW5kIE0uIEtpcmt3b29kIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkEgZHJpdmVyIGZvciB0aGUgU0YxNi1GTUkgYW5kIFNGMTYtRk1QIHJhZGlvLiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjAuMC4zIik7CiAKIHN0YXRpYyBpbnQgaW8gPSAtMTsKIHN0YXRpYyBpbnQgcmFkaW9fbnIgPSAtMTsKQEAgLTQwLDggKzQwLDYgQEAKIE1PRFVMRV9QQVJNX0RFU0MoaW8sICJJL08gYWRkcmVzcyBvZiB0aGUgU0YxNi1GTUkgb3IgU0YxNi1GTVAgY2FyZCAoMHgyODQgb3IgMHgzODQpIik7CiBtb2R1bGVfcGFyYW0ocmFkaW9fbnIsIGludCwgMCk7CiAKLSNkZWZpbmUgUkFESU9fVkVSU0lPTiBLRVJORUxfVkVSU0lPTigwLCAwLCAyKQotCiBzdHJ1Y3QgZm1pCiB7CiAJc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2OwpAQCAtMTM0LDcgKzEzMiw2IEBACiAJc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby1zZjE2Zm1pIiwgc2l6ZW9mKHYtPmRyaXZlcikpOwogCXN0cmxjcHkodi0+Y2FyZCwgIlNGMTYtRk14IHJhZGlvIiwgc2l6ZW9mKHYtPmNhcmQpKTsKIAlzdHJsY3B5KHYtPmJ1c19pbmZvLCAiSVNBIiwgc2l6ZW9mKHYtPmJ1c19pbmZvKSk7Ci0Jdi0+dmVyc2lvbiA9IFJBRElPX1ZFUlNJT047CiAJdi0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVIgfCBWNEwyX0NBUF9SQURJTzsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtcjIuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtcjIuYwppbmRleCA4N2JhZDc2Li4yZGQ0ODU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbXIyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1yMi5jCkBAIC0xLDQ0MSArMSwyMDkgQEAKLS8qIFNGMTZGTVIyIHJhZGlvIGRyaXZlciBmb3IgTGludXggcmFkaW8gc3VwcG9ydAotICogaGVhdmlseSBiYXNlZCBvbiBmbWkgZHJpdmVyLi4uCi0gKiAoYykgMjAwMC0yMDAyIFppZ2xpbyBGcmVkaWFubywgZnJlZGR5NzdAYW5nZWxmaXJlLmNvbQorLyogU0YxNi1GTVIyIHJhZGlvIGRyaXZlciBmb3IgTGludXgKKyAqIENvcHlyaWdodCAoYykgMjAxMSBPbmRyZWogWmFyeQogICoKLSAqIE5vdGVzIG9uIHRoZSBoYXJkd2FyZQotICoKLSAqICBGcmVxdWVuY3kgY29udHJvbCBpcyBkb25lIGRpZ2l0YWxseSAtLSBpZSBvdXQocG9ydCxlbmNvZGVmcmVxKDk1LjgpKTsKLSAqICBObyB2b2x1bWUgY29udHJvbCAtIG9ubHkgbXV0ZS91bm11dGUgLSB5b3UgaGF2ZSB0byB1c2UgbGluZSB2b2x1bWUKLSAqCi0gKiAgRm9yIHJlYWQgc3RlcmVvL21vbm8geW91IG11c3Qgd2FpdCAwLjEgc2VjIGFmdGVyIHNldCBmcmVxdWVuY3kgYW5kCi0gKiAgY2FyZCB1bm11dGVkIHNvIEkgc2V0IGZyZXF1ZW5jeSBvbiB1bm11dGUKLSAqICBTaWduYWwgaGFuZGxpbmcgc2VlbSB0byB3b3JrIG9ubHkgb24gYXV0b3NjYW5uaW5nIChub3QgaW1wbGVtZW50ZWQpCi0gKgotICogIENvbnZlcnRlZCB0byBWNEwyIEFQSSBieSBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KKyAqIE9yaWdpbmFsIGRyaXZlciB3YXMgKGMpIDIwMDAtMjAwMiBaaWdsaW8gRnJlZGlhbm8sIGZyZWRkeTc3QGFuZ2VsZmlyZS5jb20KKyAqIGJ1dCBhbG1vc3Qgbm90aGluZyByZW1haW5lZCBoZXJlIGFmdGVyIGNvbnZlcnNpb24gdG8gZ2VuZXJpYyBURUE1NzV4CisgKiBpbXBsZW1lbnRhdGlvbgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgkvKiBNb2R1bGVzIAkJCSovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgkJLyogSW5pdGRhdGEJCQkqLwogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgkvKiByZXF1ZXN0X3JlZ2lvbgkJKi8KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiB1ZGVsYXkJCQkqLwotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgkvKiBrZXJuZWwgcmFkaW8gc3RydWN0cwkJKi8KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4gICAgICAvKiBmb3IgS0VSTkVMX1ZFUlNJT04gTUFDUk8gICAgICovCiAjaW5jbHVkZSA8bGludXgvaW8uaD4JCS8qIG91dGIsIG91dGJfcAkJCSovCi0jaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CisjaW5jbHVkZSA8c291bmQvdGVhNTc1eC10dW5lci5oPgogCi1NT0RVTEVfQVVUSE9SKCJaaWdsaW8gRnJlZGlhbm8sIGZyZWRkeTc3QGFuZ2VsZmlyZS5jb20iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQSBkcml2ZXIgZm9yIHRoZSBTRjE2Rk1SMiByYWRpby4iKTsKK01PRFVMRV9BVVRIT1IoIk9uZHJlaiBaYXJ5Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1lZGlhRm9ydGUgU0YxNi1GTVIyIEZNIHJhZGlvIGNhcmQgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXN0YXRpYyBpbnQgaW8gPSAweDM4NDsKLXN0YXRpYyBpbnQgcmFkaW9fbnIgPSAtMTsKLQotbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBhZGRyZXNzIG9mIHRoZSBTRjE2Rk1SMiBjYXJkIChzaG91bGQgYmUgMHgzODQsIGlmIGRvIG5vdCB3b3JrIHRyeSAweDI4NCkiKTsKLW1vZHVsZV9wYXJhbShyYWRpb19uciwgaW50LCAwKTsKLQotI2RlZmluZSBSQURJT19WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsMCwyKQotCi0jZGVmaW5lIEFVRF9WT0xfSU5ERVggMQotCi0jdW5kZWYgREVCVUcKLS8vI2RlZmluZSBERUJVRyAxCi0KLSNpZmRlZiBERUJVRwotIyBkZWZpbmUgIGRlYnVnX3ByaW50KHMpIHByaW50ayBzCi0jZWxzZQotIyBkZWZpbmUgIGRlYnVnX3ByaW50KHMpCi0jZW5kaWYKLQotLyogdGhpcyBzaG91bGQgYmUgc3RhdGljIHZhcnMgZm9yIG1vZHVsZSBzaXplICovCi1zdHJ1Y3QgZm1yMgotewotCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZkZXY7Ci0Jc3RydWN0IG11dGV4IGxvY2s7CitzdHJ1Y3QgZm1yMiB7CiAJaW50IGlvOwotCWludCBjdXJ2b2w7IC8qIDAtMTUgKi8KLQlpbnQgbXV0ZTsKLQlpbnQgc3RlcmVvOyAvKiBjYXJkIGlzIHByb2R1Y2luZyBzdGVyZW8gYXVkaW8gKi8KLQl1bnNpZ25lZCBsb25nIGN1cmZyZXE7IC8qIGZyZXEgaW4ga0h6ICovCi0JaW50IGNhcmRfdHlwZTsKKwlzdHJ1Y3Qgc25kX3RlYTU3NXggdGVhOworCXN0cnVjdCB2NGwyX2N0cmwgKnZvbHVtZTsKKwlzdHJ1Y3QgdjRsMl9jdHJsICpiYWxhbmNlOwogfTsKIAorLyogdGhlIHBvcnQgaXMgaGFyZHdpcmVkIHNvIG5vIG5lZWQgdG8gc3VwcG9ydCBtdWx0aXBsZSBjYXJkcyAqLworI2RlZmluZSBGTVIyX1BPUlQJMHgzODQKIHN0YXRpYyBzdHJ1Y3QgZm1yMiBmbXIyX2NhcmQ7CiAKLS8qIGh3IHByZWNpc2lvbiBpcyAxMi41IGtIegotICogSXQgaXMgb25seSB1c2VmdWwgdG8gZ2l2ZSBmcmVxIGluIGludGVydmFsIG9mIDIwMCAoPTAuMDEyNU1oeiksCi0gKiBvdGhlciBiaXRzIHdpbGwgYmUgdHJ1bmNhdGVkCi0gKi8KLSNkZWZpbmUgUlNGMTZfRU5DT0RFKHgpCSgoeCkgLyAyMDAgKyA4NTYpCi0jZGVmaW5lIFJTRjE2X01JTkZSRVEgKDg3ICogMTYwMDApCi0jZGVmaW5lIFJTRjE2X01BWEZSRVEgKDEwOCAqIDE2MDAwKQorLyogVEVBNTc1eCB0dW5lciBwaW5zICovCisjZGVmaW5lIFNUUl9EQVRBCSgxIDw8IDApCisjZGVmaW5lIFNUUl9DTEsJCSgxIDw8IDEpCisjZGVmaW5lIFNUUl9XUkVOCSgxIDw8IDIpCisjZGVmaW5lIFNUUl9NT1NUCSgxIDw8IDMpCisvKiBQVDIyNTRBL1RDOTE1NEEgdm9sdW1lIGNvbnRyb2wgcGlucyAqLworI2RlZmluZSBQVF9TVAkJKDEgPDwgNCkKKyNkZWZpbmUgUFRfQ0sJCSgxIDw8IDUpCisjZGVmaW5lIFBUX0RBVEEJCSgxIDw8IDYpCisvKiB2b2x1bWUgY29udHJvbCBwcmVzZW5jZSBwaW4gKi8KKyNkZWZpbmUgRk1SMl9IQVNWT0wJKDEgPDwgNykKIAotc3RhdGljIGlubGluZSB2b2lkIHdhaXQoaW50IG4sIGludCBpbykKK3N0YXRpYyB2b2lkIGZtcjJfdGVhNTc1eF9zZXRfcGlucyhzdHJ1Y3Qgc25kX3RlYTU3NXggKnRlYSwgdTggcGlucykKIHsKLQlmb3IgKDsgbjsgLS1uKQotCQlpbmIoaW8pOworCXN0cnVjdCBmbXIyICpmbXIyID0gdGVhLT5wcml2YXRlX2RhdGE7CisJdTggYml0cyA9IDA7CisKKwliaXRzIHw9IChwaW5zICYgVEVBNTc1WF9EQVRBKSA/IFNUUl9EQVRBIDogMDsKKwliaXRzIHw9IChwaW5zICYgVEVBNTc1WF9DTEspICA/IFNUUl9DTEsgIDogMDsKKwkvKiBXUklURV9FTkFCTEUgaXMgaW52ZXJ0ZWQsIERBVEEgbXVzdCBiZSBoaWdoIGR1cmluZyByZWFkICovCisJYml0cyB8PSAocGlucyAmIFRFQTU3NVhfV1JFTikgPyAwIDogU1RSX1dSRU4gfCBTVFJfREFUQTsKKworCW91dGIoYml0cywgZm1yMi0+aW8pOwogfQogCi1zdGF0aWMgdm9pZCBvdXRiaXRzKGludCBiaXRzLCB1bnNpZ25lZCBpbnQgZGF0YSwgaW50IG5XYWl0LCBpbnQgaW8pCitzdGF0aWMgdTggZm1yMl90ZWE1NzV4X2dldF9waW5zKHN0cnVjdCBzbmRfdGVhNTc1eCAqdGVhKQogewotCWludCBiaXQ7CisJc3RydWN0IGZtcjIgKmZtcjIgPSB0ZWEtPnByaXZhdGVfZGF0YTsKKwl1OCBiaXRzID0gaW5iKGZtcjItPmlvKTsKIAotCWZvciAoOyAtLWJpdHMgPj0gMDspIHsKLQkJYml0ID0gKGRhdGEgPj4gYml0cykgJiAxOwotCQlvdXRiKGJpdCwgaW8pOwotCQl3YWl0KG5XYWl0LCBpbyk7Ci0JCW91dGIoYml0IHwgMiwgaW8pOwotCQl3YWl0KG5XYWl0LCBpbyk7Ci0JCW91dGIoYml0LCBpbyk7Ci0JCXdhaXQobldhaXQsIGlvKTsKKwlyZXR1cm4gIChiaXRzICYgU1RSX0RBVEEpID8gVEVBNTc1WF9EQVRBIDogMCB8CisJCShiaXRzICYgU1RSX01PU1QpID8gVEVBNTc1WF9NT1NUIDogMDsKK30KKworc3RhdGljIHZvaWQgZm1yMl90ZWE1NzV4X3NldF9kaXJlY3Rpb24oc3RydWN0IHNuZF90ZWE1NzV4ICp0ZWEsIGJvb2wgb3V0cHV0KQoreworfQorCitzdGF0aWMgc3RydWN0IHNuZF90ZWE1NzV4X29wcyBmbXIyX3RlYV9vcHMgPSB7CisJLnNldF9waW5zID0gZm1yMl90ZWE1NzV4X3NldF9waW5zLAorCS5nZXRfcGlucyA9IGZtcjJfdGVhNTc1eF9nZXRfcGlucywKKwkuc2V0X2RpcmVjdGlvbiA9IGZtcjJfdGVhNTc1eF9zZXRfZGlyZWN0aW9uLAorfTsKKworLyogVEM5MTU0QS9QVDIyNTRBIHZvbHVtZSBjb250cm9sICovCisKKy8qIDE4LWJpdCBzaGlmdCByZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVEM5MTU0QV9BVFRfTUFKXzBEQgkoMSA8PCAwKQorI2RlZmluZSBUQzkxNTRBX0FUVF9NQUpfMTBEQgkoMSA8PCAxKQorI2RlZmluZSBUQzkxNTRBX0FUVF9NQUpfMjBEQgkoMSA8PCAyKQorI2RlZmluZSBUQzkxNTRBX0FUVF9NQUpfMzBEQgkoMSA8PCAzKQorI2RlZmluZSBUQzkxNTRBX0FUVF9NQUpfNDBEQgkoMSA8PCA0KQorI2RlZmluZSBUQzkxNTRBX0FUVF9NQUpfNTBEQgkoMSA8PCA1KQorI2RlZmluZSBUQzkxNTRBX0FUVF9NQUpfNjBEQgkoMSA8PCA2KQorCisjZGVmaW5lIFRDOTE1NEFfQVRUX01JTl8wREIJKDEgPDwgNykKKyNkZWZpbmUgVEM5MTU0QV9BVFRfTUlOXzJEQgkoMSA8PCA4KQorI2RlZmluZSBUQzkxNTRBX0FUVF9NSU5fNERCCSgxIDw8IDkpCisjZGVmaW5lIFRDOTE1NEFfQVRUX01JTl82REIJKDEgPDwgMTApCisjZGVmaW5lIFRDOTE1NEFfQVRUX01JTl84REIJKDEgPDwgMTEpCisvKiBiaXQgMTIgaXMgaWdub3JlZCAqLworI2RlZmluZSBUQzkxNTRBX0NIQU5ORUxfTEVGVAkoMSA8PCAxMykKKyNkZWZpbmUgVEM5MTU0QV9DSEFOTkVMX1JJR0hUCSgxIDw8IDE0KQorLyogYml0cyAxNSwgMTYsIDE3IG11c3QgYmUgMCAqLworCisjZGVmaW5lCVRDOTE1NEFfQVRUX01BSih4KQkoMSA8PCB4KQorI2RlZmluZSBUQzkxNTRBX0FUVF9NSU4oeCkJKDEgPDwgKDcgKyB4KSkKKworc3RhdGljIHZvaWQgdGM5MTU0YV9zZXRfcGlucyhzdHJ1Y3QgZm1yMiAqZm1yMiwgdTggcGlucykKK3sKKwlpZiAoIWZtcjItPnRlYS5tdXRlKQorCQlwaW5zIHw9IFNUUl9XUkVOOworCisJb3V0YihwaW5zLCBmbXIyLT5pbyk7Cit9CisKK3N0YXRpYyB2b2lkIHRjOTE1NGFfc2V0X2F0dGVudWF0aW9uKHN0cnVjdCBmbXIyICpmbXIyLCBpbnQgYXR0LCB1MzIgY2hhbm5lbCkKK3sKKwlpbnQgaTsKKwl1MzIgcmVnOworCXU4IGJpdDsKKworCXJlZyA9IFRDOTE1NEFfQVRUX01BSihhdHQgLyAxMCkgfCBUQzkxNTRBX0FUVF9NSU4oKGF0dCAlIDEwKSAvIDIpOworCXJlZyB8PSBjaGFubmVsOworCS8qIHdyaXRlIDE4LWJpdCBzaGlmdCByZWdpc3RlciwgTFNCIGZpcnN0ICovCisJZm9yIChpID0gMDsgaSA8IDE4OyBpKyspIHsKKwkJYml0ID0gcmVnICYgKDEgPDwgaSkgPyBQVF9EQVRBIDogMDsKKwkJdGM5MTU0YV9zZXRfcGlucyhmbXIyLCBiaXQpOworCQl1ZGVsYXkoNSk7CisJCXRjOTE1NGFfc2V0X3BpbnMoZm1yMiwgYml0IHwgUFRfQ0spOworCQl1ZGVsYXkoNSk7CisJCXRjOTE1NGFfc2V0X3BpbnMoZm1yMiwgYml0KTsKIAl9CisKKwkvKiBsYXRjaCByZWdpc3RlciBkYXRhICovCisJdWRlbGF5KDUpOworCXRjOTE1NGFfc2V0X3BpbnMoZm1yMiwgUFRfU1QpOworCXVkZWxheSg1KTsKKwl0YzkxNTRhX3NldF9waW5zKGZtcjIsIDApOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZm1yMl9tdXRlKGludCBpbykKK3N0YXRpYyBpbnQgZm1yMl9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKIHsKLQlvdXRiKDB4MDAsIGlvKTsKLQl3YWl0KDQsIGlvKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGZtcjJfdW5tdXRlKGludCBpbykKLXsKLQlvdXRiKDB4MDQsIGlvKTsKLQl3YWl0KDQsIGlvKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZm1yMl9zdGVyZW9fbW9kZShpbnQgaW8pCi17Ci0JaW50IG4gPSBpbmIoaW8pOwotCi0Jb3V0Yig2LCBpbyk7Ci0JaW5iKGlvKTsKLQluID0gKChuID4+IDMpICYgMSkgXiAxOwotCWRlYnVnX3ByaW50KChLRVJOX0RFQlVHICJzdGVyZW86ICVkXG4iLCBuKSk7Ci0JcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBpbnQgZm1yMl9wcm9kdWN0X2luZm8oc3RydWN0IGZtcjIgKmRldikKLXsKLQlpbnQgbiA9IGluYihkZXYtPmlvKTsKLQotCW4gJj0gMHhDMTsKLQlpZiAobiA9PSAwKSB7Ci0JCS8qIHRoaXMgc2hvdWxkIHN1cHBvcnQgdm9sdW1lIHNldCAqLwotCQlkZXYtPmNhcmRfdHlwZSA9IDEyOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyogbm90IHZvbHVtZSAobWluZSBpcyAxMSkgKi8KLQlkZXYtPmNhcmRfdHlwZSA9IChuID09IDEyOCkgPyAxMSA6IDA7Ci0JcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGZtcjJfZ2V0c2lnc3RyKHN0cnVjdCBmbXIyICpkZXYpCi17Ci0JLyogISEhIHdvcmtzIG9ubHkgaWYgc2Nhbm5pbmcgZnJlcSAqLwotCWludCByZXMgPSAweGZmZmY7Ci0KLQlvdXRiKDUsIGRldi0+aW8pOwotCXdhaXQoNCwgZGV2LT5pbyk7Ci0JaWYgKCEoaW5iKGRldi0+aW8pICYgMSkpCi0JCXJlcyA9IDA7Ci0JZGVidWdfcHJpbnQoKEtFUk5fREVCVUcgInNpZ25hbDogJWRcbiIsIHJlcykpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qIHNldCBmcmVxdWVuY3kgYW5kIHVubXV0ZSBjYXJkICovCi1zdGF0aWMgaW50IGZtcjJfc2V0ZnJlcShzdHJ1Y3QgZm1yMiAqZGV2KQotewotCXVuc2lnbmVkIGxvbmcgZnJlcSA9IGRldi0+Y3VyZnJlcTsKLQotCWZtcjJfbXV0ZShkZXYtPmlvKTsKLQotCS8qIDB4NDIgZm9yIG1vbm8gb3V0cHV0Ci0JICogMHgxMDIgZm9yd2FyZCBzY2FubmluZwotCSAqIDB4MTgyIHNjYW5zaW9uZSBhdmFudGkKLQkgKi8KLQlvdXRiaXRzKDksIDB4MiwgMywgZGV2LT5pbyk7Ci0Jb3V0Yml0cygxNiwgUlNGMTZfRU5DT0RFKGZyZXEpLCAyLCBkZXYtPmlvKTsKLQotCWZtcjJfdW5tdXRlKGRldi0+aW8pOwotCi0JLyogd2FpdCAwLjExIHNlYyAqLwotCW1zbGVlcCgxMTApOwotCi0JLyogTk9URSBpZiBtdXRlIHRoaXMgc3RvcCByYWRpbwotCSAgIHlvdSBtdXN0IHNldCBmcmVxIG9uIHVubXV0ZSAqLwotCWRldi0+c3RlcmVvID0gZm1yMl9zdGVyZW9fbW9kZShkZXYtPmlvKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogISEhIG5vdCB0ZXN0ZWQsIGluIG15IGNhcmQgdGhpcyBkb2Vzbid0IHdvcmsgISEhICovCi1zdGF0aWMgaW50IGZtcjJfc2V0dm9sdW1lKHN0cnVjdCBmbXIyICpkZXYpCi17Ci0JaW50IHZvbFsxNl0gPSB7IDB4MDIxLCAweDA4NCwgMHgwOTAsIDB4MTA0LAotCQkJMHgxMTAsIDB4MjA0LCAweDIxMCwgMHg0MDIsCi0JCQkweDQwNCwgMHg0MDgsIDB4NDEwLCAweDgwMSwKLQkJCTB4ODAyLCAweDgwNCwgMHg4MDgsIDB4ODEwIH07Ci0JaW50IGksIGE7Ci0JaW50IG4gPSB2b2xbZGV2LT5jdXJ2b2wgJiAweDBmXTsKLQotCWlmIChkZXYtPmNhcmRfdHlwZSAhPSAxMSkKLQkJcmV0dXJuIDE7Ci0KLQlmb3IgKGkgPSAxMjsgLS1pID49IDA7ICkgewotCQlhID0gKChuID4+IGkpICYgMSkgPDwgNjsgLyogaWYgKGE9PTApIGEgPSAwOyBlbHNlIGEgPSAweDQwOyAqLwotCQlvdXRiKGEgfCA0LCBkZXYtPmlvKTsKLQkJd2FpdCg0LCBkZXYtPmlvKTsKLQkJb3V0YihhIHwgMHgyNCwgZGV2LT5pbyk7Ci0JCXdhaXQoNCwgZGV2LT5pbyk7Ci0JCW91dGIoYSB8IDQsIGRldi0+aW8pOwotCQl3YWl0KDQsIGRldi0+aW8pOwotCX0KLQlmb3IgKGkgPSA2OyAtLWkgPj0gMDsgKSB7Ci0JCWEgPSAoKDB4MTggPj4gaSkgJiAxKSA8PCA2OwotCQlvdXRiKGEgfCA0LCBkZXYtPmlvKTsKLQkJd2FpdCg0LCBkZXYtPmlvKTsKLQkJb3V0YihhIHwgMHgyNCwgZGV2LT5pbyk7Ci0JCXdhaXQoNCwgZGV2LT5pbyk7Ci0JCW91dGIoYSB8IDQsIGRldi0+aW8pOwotCQl3YWl0KDQsIGRldi0+aW8pOwotCX0KLQl3YWl0KDQsIGRldi0+aW8pOwotCW91dGIoMHgxNCwgZGV2LT5pbyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqdikKLXsKLQlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLXNmMTZmbXIyIiwgc2l6ZW9mKHYtPmRyaXZlcikpOwotCXN0cmxjcHkodi0+Y2FyZCwgIlNGMTYtRk1SMiByYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7Ci0Jc3RybGNweSh2LT5idXNfaW5mbywgIklTQSIsIHNpemVvZih2LT5idXNfaW5mbykpOwotCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwotCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU87Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2dfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2KQotewotCXN0cnVjdCBmbXIyICpmbXIyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKLQotCWlmICh2LT5pbmRleCA+IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3RybGNweSh2LT5uYW1lLCAiRk0iLCBzaXplb2Yodi0+bmFtZSkpOwotCXYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwotCi0Jdi0+cmFuZ2Vsb3cgPSBSU0YxNl9NSU5GUkVROwotCXYtPnJhbmdlaGlnaCA9IFJTRjE2X01BWEZSRVE7Ci0Jdi0+cnhzdWJjaGFucyA9IGZtcjItPnN0ZXJlbyA/IFY0TDJfVFVORVJfU1VCX1NURVJFTyA6Ci0JCQkJCVY0TDJfVFVORVJfU1VCX01PTk87Ci0Jdi0+Y2FwYWJpbGl0eSA9IFY0TDJfVFVORVJfQ0FQX1NURVJFTyB8IFY0TDJfVFVORVJfQ0FQX0xPVzsKLQl2LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKLQltdXRleF9sb2NrKCZmbXIyLT5sb2NrKTsKLQl2LT5zaWduYWwgPSBmbXIyX2dldHNpZ3N0cihmbXIyKTsKLQltdXRleF91bmxvY2soJmZtcjItPmxvY2spOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKLXsKLQlyZXR1cm4gdi0+aW5kZXggPyAtRUlOVkFMIDogMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKLXsKLQlzdHJ1Y3QgZm1yMiAqZm1yMiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0KLQlpZiAoZi0+dHVuZXIgIT0gMCB8fCBmLT50eXBlICE9IFY0TDJfVFVORVJfUkFESU8pCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChmLT5mcmVxdWVuY3kgPCBSU0YxNl9NSU5GUkVRIHx8Ci0JCQlmLT5mcmVxdWVuY3kgPiBSU0YxNl9NQVhGUkVRKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkvKiByb3VuZGluZyBpbiBzdGVwcyBvZiAyMDAgdG8gbWF0Y2ggdGhlIGZyZXEKLQkgICB0aGF0IHdpbGwgYmUgdXNlZCAqLwotCWZtcjItPmN1cmZyZXEgPSAoZi0+ZnJlcXVlbmN5IC8gMjAwKSAqIDIwMDsKLQotCS8qIHNldCBjYXJkIGZyZXEgKGlmIG5vdCBtdXRlZCkgKi8KLQlpZiAoZm1yMi0+Y3Vydm9sICYmICFmbXIyLT5tdXRlKSB7Ci0JCW11dGV4X2xvY2soJmZtcjItPmxvY2spOwotCQlmbXIyX3NldGZyZXEoZm1yMik7Ci0JCW11dGV4X3VubG9jaygmZm1yMi0+bG9jayk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQotewotCXN0cnVjdCBmbXIyICpmbXIyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKLQotCWlmIChmLT50dW5lciAhPSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlmLT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKLQlmLT5mcmVxdWVuY3kgPSBmbXIyLT5jdXJmcmVxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMpCi17Ci0Jc3RydWN0IGZtcjIgKmZtcjIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCi0Jc3dpdGNoIChxYy0+aWQpIHsKLQljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6Ci0JCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxYywgMCwgMSwgMSwgMSk7Ci0JY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6Ci0JCS8qIE9ubHkgY2FyZF90eXBlID09IDExIGltcGxlbWVudHMgdm9sdW1lICovCi0JCWlmIChmbXIyLT5jYXJkX3R5cGUgPT0gMTEpCi0JCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWMsIDAsIDE1LCAxLCAwKTsKLQkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjLCAwLCAxLCAxLCAwKTsKLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKLXsKLQlzdHJ1Y3QgZm1yMiAqZm1yMiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IHNuZF90ZWE1NzV4ICp0ZWEgPSBjb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwgc3RydWN0IHNuZF90ZWE1NzV4LCBjdHJsX2hhbmRsZXIpOworCXN0cnVjdCBmbXIyICpmbXIyID0gdGVhLT5wcml2YXRlX2RhdGE7CisJaW50IHZvbHVtZSwgYmFsYW5jZSwgbGVmdCwgcmlnaHQ7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQljdHJsLT52YWx1ZSA9IGZtcjItPm11dGU7Ci0JCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgotCQljdHJsLT52YWx1ZSA9IGZtcjItPmN1cnZvbDsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IGZtcjIgKmZtcjIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCi0Jc3dpdGNoIChjdHJsLT5pZCkgewotCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKLQkJZm1yMi0+bXV0ZSA9IGN0cmwtPnZhbHVlOworCQl2b2x1bWUgPSBjdHJsLT52YWw7CisJCWJhbGFuY2UgPSBmbXIyLT5iYWxhbmNlLT5jdXIudmFsOwogCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKLQkJZm1yMi0+Y3Vydm9sID0gY3RybC0+dmFsdWU7CisJY2FzZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFOgorCQliYWxhbmNlID0gY3RybC0+dmFsOworCQl2b2x1bWUgPSBmbXIyLT52b2x1bWUtPmN1ci52YWw7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotI2lmZGVmIERFQlVHCi0JaWYgKGZtcjItPmN1cnZvbCAmJiAhZm1yMi0+bXV0ZSkKLQkJcHJpbnRrKEtFUk5fREVCVUcgInVubXV0ZVxuIik7Ci0JZWxzZQotCQlwcmludGsoS0VSTl9ERUJVRyAibXV0ZVxuIik7Ci0jZW5kaWYKKwlsZWZ0ID0gcmlnaHQgPSB2b2x1bWU7CisJaWYgKGJhbGFuY2UgPCAwKQorCQlyaWdodCA9IG1heCgwLCByaWdodCArIGJhbGFuY2UpOworCWlmIChiYWxhbmNlID4gMCkKKwkJbGVmdCA9IG1heCgwLCBsZWZ0IC0gYmFsYW5jZSk7CiAKLQltdXRleF9sb2NrKCZmbXIyLT5sb2NrKTsKLQlpZiAoZm1yMi0+Y3Vydm9sICYmICFmbXIyLT5tdXRlKSB7Ci0JCWZtcjJfc2V0dm9sdW1lKGZtcjIpOwotCQkvKiBTZXQgZnJlcXVlbmN5IGFuZCB1bm11dGUgY2FyZCAqLwotCQlmbXIyX3NldGZyZXEoZm1yMik7Ci0JfSBlbHNlCi0JCWZtcjJfbXV0ZShmbXIyLT5pbyk7Ci0JbXV0ZXhfdW5sb2NrKCZmbXIyLT5sb2NrKTsKKwl0YzkxNTRhX3NldF9hdHRlbnVhdGlvbihmbXIyLCBhYnMobGVmdCAtIDY4KSwgVEM5MTU0QV9DSEFOTkVMX0xFRlQpOworCXRjOTE1NGFfc2V0X2F0dGVudWF0aW9uKGZtcjIsIGFicyhyaWdodCAtIDY4KSwgVEM5MTU0QV9DSEFOTkVMX1JJR0hUKTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHZpZGlvY19nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKmkpCi17Ci0JKmkgPSAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgaSkKLXsKLQlyZXR1cm4gaSA/IC1FSU5WQUwgOiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19nX2F1ZGlvKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSkKLXsKLQlhLT5pbmRleCA9IDA7Ci0Jc3RybGNweShhLT5uYW1lLCAiUmFkaW8iLCBzaXplb2YoYS0+bmFtZSkpOwotCWEtPmNhcGFiaWxpdHkgPSBWNEwyX0FVRENBUF9TVEVSRU87Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3NfYXVkaW8oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2F1ZGlvICphKQotewotCXJldHVybiBhLT5pbmRleCA/IC1FSU5WQUwgOiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIGZtcjJfZm9wcyA9IHsKLQkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKLQkudW5sb2NrZWRfaW9jdGwgPSB2aWRlb19pb2N0bDIsCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgZm1yMl9jdHJsX29wcyA9IHsKKwkuc19jdHJsID0gZm1yMl9zX2N0cmwsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIGZtcjJfaW9jdGxfb3BzID0gewotCS52aWRpb2NfcXVlcnljYXAgICAgPSB2aWRpb2NfcXVlcnljYXAsCi0JLnZpZGlvY19nX3R1bmVyICAgICA9IHZpZGlvY19nX3R1bmVyLAotCS52aWRpb2Nfc190dW5lciAgICAgPSB2aWRpb2Nfc190dW5lciwKLQkudmlkaW9jX2dfYXVkaW8gICAgID0gdmlkaW9jX2dfYXVkaW8sCi0JLnZpZGlvY19zX2F1ZGlvICAgICA9IHZpZGlvY19zX2F1ZGlvLAotCS52aWRpb2NfZ19pbnB1dCAgICAgPSB2aWRpb2NfZ19pbnB1dCwKLQkudmlkaW9jX3NfaW5wdXQgICAgID0gdmlkaW9jX3NfaW5wdXQsCi0JLnZpZGlvY19nX2ZyZXF1ZW5jeSA9IHZpZGlvY19nX2ZyZXF1ZW5jeSwKLQkudmlkaW9jX3NfZnJlcXVlbmN5ID0gdmlkaW9jX3NfZnJlcXVlbmN5LAotCS52aWRpb2NfcXVlcnljdHJsICAgPSB2aWRpb2NfcXVlcnljdHJsLAotCS52aWRpb2NfZ19jdHJsICAgICAgPSB2aWRpb2NfZ19jdHJsLAotCS52aWRpb2Nfc19jdHJsICAgICAgPSB2aWRpb2Nfc19jdHJsLAotfTsKK3N0YXRpYyBpbnQgZm1yMl90ZWFfZXh0X2luaXQoc3RydWN0IHNuZF90ZWE1NzV4ICp0ZWEpCit7CisJc3RydWN0IGZtcjIgKmZtcjIgPSB0ZWEtPnByaXZhdGVfZGF0YTsKKworCWlmIChpbmIoZm1yMi0+aW8pICYgRk1SMl9IQVNWT0wpIHsKKwkJZm1yMi0+dm9sdW1lID0gdjRsMl9jdHJsX25ld19zdGQoJnRlYS0+Y3RybF9oYW5kbGVyLCAmZm1yMl9jdHJsX29wcywgVjRMMl9DSURfQVVESU9fVk9MVU1FLCAwLCA2OCwgMiwgNTYpOworCQlmbXIyLT5iYWxhbmNlID0gdjRsMl9jdHJsX25ld19zdGQoJnRlYS0+Y3RybF9oYW5kbGVyLCAmZm1yMl9jdHJsX29wcywgVjRMMl9DSURfQVVESU9fQkFMQU5DRSwgLTY4LCA2OCwgMiwgMCk7CisJCWlmICh0ZWEtPmN0cmxfaGFuZGxlci5lcnJvcikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJyYWRpby1zZjE2Zm1yMjogY2FuJ3QgaW5pdGlhbGl6ZSBjb250cmxzXG4iKTsKKwkJCXJldHVybiB0ZWEtPmN0cmxfaGFuZGxlci5lcnJvcjsKKwkJfQorCX0KKworCXJldHVybiAwOworfQogCiBzdGF0aWMgaW50IF9faW5pdCBmbXIyX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZm1yMiAqZm1yMiA9ICZmbXIyX2NhcmQ7Ci0Jc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9ICZmbXIyLT52NGwyX2RldjsKLQlpbnQgcmVzOwogCi0Jc3RybGNweSh2NGwyX2Rldi0+bmFtZSwgInNmMTZmbXIyIiwgc2l6ZW9mKHY0bDJfZGV2LT5uYW1lKSk7Ci0JZm1yMi0+aW8gPSBpbzsKLQlmbXIyLT5zdGVyZW8gPSAxOwotCW11dGV4X2luaXQoJmZtcjItPmxvY2spOworCWZtcjItPmlvID0gRk1SMl9QT1JUOwogCi0JaWYgKCFyZXF1ZXN0X3JlZ2lvbihmbXIyLT5pbywgMiwgInNmMTZmbXIyIikpIHsKLQkJdjRsMl9lcnIodjRsMl9kZXYsICJyZXF1ZXN0X3JlZ2lvbiBmYWlsZWQhXG4iKTsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGZtcjItPmlvLCAyLCAiU0YxNi1GTVIyIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyYWRpby1zZjE2Zm1yMjogSS9PIHBvcnQgMHgleCBhbHJlYWR5IGluIHVzZVxuIiwgZm1yMi0+aW8pOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCXJlcyA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKE5VTEwsIHY0bDJfZGV2KTsKLQlpZiAocmVzIDwgMCkgeworCWZtcjItPnRlYS5wcml2YXRlX2RhdGEgPSBmbXIyOworCWZtcjItPnRlYS5vcHMgPSAmZm1yMl90ZWFfb3BzOworCWZtcjItPnRlYS5leHRfaW5pdCA9IGZtcjJfdGVhX2V4dF9pbml0OworCXN0cmxjcHkoZm1yMi0+dGVhLmNhcmQsICJTRjE2LUZNUjIiLCBzaXplb2YoZm1yMi0+dGVhLmNhcmQpKTsKKwlzdHJjcHkoZm1yMi0+dGVhLmJ1c19pbmZvLCAiSVNBIik7CisKKwlpZiAoc25kX3RlYTU3NXhfaW5pdCgmZm1yMi0+dGVhKSkgeworCQlwcmludGsoS0VSTl9FUlIgInJhZGlvLXNmMTZmbXIyOiBVbmFibGUgdG8gZGV0ZWN0IFRFQTU3NXggdHVuZXJcbiIpOwogCQlyZWxlYXNlX3JlZ2lvbihmbXIyLT5pbywgMik7Ci0JCXY0bDJfZXJyKHY0bDJfZGV2LCAiQ291bGQgbm90IHJlZ2lzdGVyIHY0bDJfZGV2aWNlXG4iKTsKLQkJcmV0dXJuIHJlczsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Jc3RybGNweShmbXIyLT52ZGV2Lm5hbWUsIHY0bDJfZGV2LT5uYW1lLCBzaXplb2YoZm1yMi0+dmRldi5uYW1lKSk7Ci0JZm1yMi0+dmRldi52NGwyX2RldiA9IHY0bDJfZGV2OwotCWZtcjItPnZkZXYuZm9wcyA9ICZmbXIyX2ZvcHM7Ci0JZm1yMi0+dmRldi5pb2N0bF9vcHMgPSAmZm1yMl9pb2N0bF9vcHM7Ci0JZm1yMi0+dmRldi5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2VfZW1wdHk7Ci0JdmlkZW9fc2V0X2RydmRhdGEoJmZtcjItPnZkZXYsIGZtcjIpOwotCi0JLyogbXV0ZSBjYXJkIC0gcHJldmVudHMgbm9pc3kgYm9vdHVwcyAqLwotCWZtcjJfbXV0ZShmbXIyLT5pbyk7Ci0JZm1yMl9wcm9kdWN0X2luZm8oZm1yMik7Ci0KLQlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZmbXIyLT52ZGV2LCBWRkxfVFlQRV9SQURJTywgcmFkaW9fbnIpIDwgMCkgewotCQl2NGwyX2RldmljZV91bnJlZ2lzdGVyKHY0bDJfZGV2KTsKLQkJcmVsZWFzZV9yZWdpb24oZm1yMi0+aW8sIDIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQl2NGwyX2luZm8odjRsMl9kZXYsICJTRjE2Rk1SMiByYWRpbyBjYXJkIGRyaXZlciBhdCAweCV4LlxuIiwgZm1yMi0+aW8pOwotCWRlYnVnX3ByaW50KChLRVJOX0RFQlVHICJjYXJkX3R5cGUgJWRcbiIsIGZtcjItPmNhcmRfdHlwZSkpOworCXByaW50ayhLRVJOX0lORk8gInJhZGlvLXNmMTZmbXIyOiBTRjE2LUZNUjIgcmFkaW8gY2FyZCBhdCAweCV4LlxuIiwgZm1yMi0+aW8pOwogCXJldHVybiAwOwogfQogCkBAIC00NDMsMjIgKzIxMSw5IEBACiB7CiAJc3RydWN0IGZtcjIgKmZtcjIgPSAmZm1yMl9jYXJkOwogCi0JdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJmZtcjItPnZkZXYpOwotCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmZtcjItPnY0bDJfZGV2KTsKKwlzbmRfdGVhNTc1eF9leGl0KCZmbXIyLT50ZWEpOwogCXJlbGVhc2VfcmVnaW9uKGZtcjItPmlvLCAyKTsKIH0KIAogbW9kdWxlX2luaXQoZm1yMl9pbml0KTsKIG1vZHVsZV9leGl0KGZtcjJfZXhpdCk7Ci0KLSNpZm5kZWYgTU9EVUxFCi0KLXN0YXRpYyBpbnQgX19pbml0IGZtcjJfc2V0dXBfaW8oY2hhciAqc3RyKQotewotCWdldF9vcHRpb24oJnN0ciwgJmlvKTsKLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgic2YxNmZtcjI9IiwgZm1yMl9zZXR1cF9pbyk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZWE1NzY0LmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRlYTU3NjQuYwppbmRleCAwZTcxZDgxLi45NWRkY2M0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRlYTU3NjQuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRlYTU3NjQuYwpAQCAtMzksMTAgKzM5LDggQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4JCQkvKiBJMkMJCQkJKi8KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+ICAgICAgCS8qIGZvciBLRVJORUxfVkVSU0lPTiBNQUNSTyAgICAgKi8KIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTgkidjAuMDEiCi0jZGVmaW5lIFJBRElPX1ZFUlNJT04JS0VSTkVMX1ZFUlNJT04oMCwgMCwgMSkKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjAuMC4yIgogCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IJIkZhYmlvIEJlbGF2ZW51dG8gPGJlbGF2ZW51dG9AZ21haWwuY29tPiIKICNkZWZpbmUgRFJJVkVSX0RFU0MJIkEgZHJpdmVyIGZvciB0aGUgVEVBNTc2NCByYWRpbyBjaGlwIGZvciBFWlggUGhvbmVzLiIKQEAgLTMwMCw3ICsyOTgsNiBAQAogCXN0cmxjcHkodi0+Y2FyZCwgZGV2LT5uYW1lLCBzaXplb2Yodi0+Y2FyZCkpOwogCXNucHJpbnRmKHYtPmJ1c19pbmZvLCBzaXplb2Yodi0+YnVzX2luZm8pLAogCQkgIkkyQzolcyIsIGRldl9uYW1lKCZkZXYtPmRldikpOwotCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwogCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU87CiAJcmV0dXJuIDA7CiB9CkBAIC01OTUsOCArNTkyLDkgQEAKIE1PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CiBNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJJVkVSX1ZFUlNJT04pOwogCi1tb2R1bGVfcGFyYW0odXNlX3h0YWwsIGludCwgMSk7Cittb2R1bGVfcGFyYW0odXNlX3h0YWwsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHVzZV94dGFsLCAiQ2hpcCBoYXZlIGEgeHRhbCBjb25uZWN0ZWQgaW4gYm9hcmQiKTsKIG1vZHVsZV9wYXJhbShyYWRpb19uciwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MocmFkaW9fbnIsICJ2aWRlbzRsaW51eCBkZXZpY2UgbnVtYmVyIHRvIHVzZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZXJyYXRlYy5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZXJyYXRlYy5jCmluZGV4IGEzMjY2MzkuLmYyZWQ5Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGVycmF0ZWMuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRlcnJhdGVjLmMKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4JLyogcmVxdWVzdF9yZWdpb24JCSovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CS8qIGtlcm5lbCByYWRpbyBzdHJ1Y3RzCQkqLwogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPiAgICAgIC8qIGZvciBLRVJORUxfVkVSU0lPTiBNQUNSTyAgICAgKi8KICNpbmNsdWRlIDxsaW51eC9pby5oPgkJLyogb3V0Yiwgb3V0Yl9wCQkJKi8KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KQEAgLTM3LDYgKzM2LDcgQEAKIE1PRFVMRV9BVVRIT1IoIlIuT0ZGRVJNQU5OUyAmIG90aGVycyIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBIGRyaXZlciBmb3IgdGhlIFRlcnJhVGVjIEFjdGl2ZVJhZGlvIFN0YW5kYWxvbmUgcmFkaW8gY2FyZC4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjAuMyIpOwogCiAjaWZuZGVmIENPTkZJR19SQURJT19URVJSQVRFQ19QT1JUCiAjZGVmaW5lIENPTkZJR19SQURJT19URVJSQVRFQ19QT1JUIDB4NTkwCkBAIC00OSw4ICs0OSw2IEBACiBNT0RVTEVfUEFSTV9ERVNDKGlvLCAiSS9PIGFkZHJlc3Mgb2YgdGhlIFRlcnJhVGVjIEFjdGl2ZVJhZGlvIGNhcmQgKDB4NTkwIG9yIDB4NTkxKSIpOwogbW9kdWxlX3BhcmFtKHJhZGlvX25yLCBpbnQsIDApOwogCi0jZGVmaW5lIFJBRElPX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMCwgMCwgMikKLQogc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCByYWRpb19xY3RybFtdID0gewogCXsKIAkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19NVVRFLApAQCAtMjA1LDcgKzIwMyw2IEBACiAJc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby10ZXJyYXRlYyIsIHNpemVvZih2LT5kcml2ZXIpKTsKIAlzdHJsY3B5KHYtPmNhcmQsICJBY3RpdmVSYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7CiAJc3RybGNweSh2LT5idXNfaW5mbywgIklTQSIsIHNpemVvZih2LT5idXNfaW5mbykpOwotCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwogCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU87CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRpbWIuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGltYi5jCmluZGV4IGExODU2MTAuLmYxN2I1NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGltYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGltYi5jCkBAIC0xNiw3ICsxNiw2IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CkBAIC00NCw3ICs0Myw2IEBACiAJc3RybGNweSh2LT5kcml2ZXIsIERSSVZFUl9OQU1FLCBzaXplb2Yodi0+ZHJpdmVyKSk7CiAJc3RybGNweSh2LT5jYXJkLCAiVGltYmVyZGFsZSBSYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7CiAJc25wcmludGYodi0+YnVzX2luZm8sIHNpemVvZih2LT5idXNfaW5mbyksICJwbGF0Zm9ybToiRFJJVkVSX05BTUUpOwotCXYtPnZlcnNpb24gPSBLRVJORUxfVkVSU0lPTigwLCAwLCAxKTsKIAl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1JBRElPOwogCXJldHVybiAwOwogfQpAQCAtMjQ1LDQgKzI0Myw1IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIlRpbWJlcmRhbGUgUmFkaW8gZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJNb2NlYW4gTGFib3JhdG9yaWVzIDxpbmZvQG1vY2Vhbi1sYWJzLmNvbT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjAuMiIpOwogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiRFJJVkVSX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10cnVzdC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10cnVzdC5jCmluZGV4IDIyZmE5Y2MuLmIzZjQ1YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHJ1c3QuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRydXN0LmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPiAgICAgIC8qIGZvciBLRVJORUxfVkVSU0lPTiBNQUNSTyAgICAgKi8KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CkBAIC0yOCw2ICsyNyw3IEBACiBNT0RVTEVfQVVUSE9SKCJFcmljIExhbW1lcnRzLCBSdXNzZWxsIEtyb2xsLCBRdWF5IEx1LCBEb25hbGQgU29uZywgSmFzb24gTGV3aXMsIFNjb3R0IE1jR3JhdGgsIFdpbGxpYW0gTWNHcmF0aCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBIGRyaXZlciBmb3IgdGhlIFRydXN0IEZNIFJhZGlvIGNhcmQuIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4wLjMiKTsKIAogLyogYWNjZXB0YWJsZSBwb3J0czogMHgzNTAgKEpQMyBzaG9ydGVkKSwgMHgzNTggKEpQMyBvcGVuKSAqLwogCkBAIC00Miw4ICs0Miw2IEBACiBNT0RVTEVfUEFSTV9ERVNDKGlvLCAiSS9PIGFkZHJlc3Mgb2YgdGhlIFRydXN0IEZNIFJhZGlvIGNhcmQgKDB4MzUwIG9yIDB4MzU4KSIpOwogbW9kdWxlX3BhcmFtKHJhZGlvX25yLCBpbnQsIDApOwogCi0jZGVmaW5lIFJBRElPX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMCwgMCwgMikKLQogc3RydWN0IHRydXN0IHsKIAlzdHJ1Y3QgdjRsMl9kZXZpY2UgdjRsMl9kZXY7CiAJc3RydWN0IHZpZGVvX2RldmljZSB2ZGV2OwpAQCAtMTk2LDcgKzE5NCw2IEBACiAJc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby10cnVzdCIsIHNpemVvZih2LT5kcml2ZXIpKTsKIAlzdHJsY3B5KHYtPmNhcmQsICJUcnVzdCBGTSBSYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7CiAJc3RybGNweSh2LT5idXNfaW5mbywgIklTQSIsIHNpemVvZih2LT5idXNfaW5mbykpOwotCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwogCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU87CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXR5cGhvb24uYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHlwaG9vbi5jCmluZGV4IDhkYmJmMDguLjM5ODcyNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHlwaG9vbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHlwaG9vbi5jCkBAIC0zMSwxNSArMzEsMTcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogTW9kdWxlcyAgICAgICAgICAgICAgICAgICAgICAgICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgkJLyogSW5pdGRhdGEgICAgICAgICAgICAgICAgICAgICAgICovCiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CS8qIHJlcXVlc3RfcmVnaW9uCQkgICovCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPiAgICAgIC8qIGZvciBLRVJORUxfVkVSU0lPTiBNQUNSTyAgICAgKi8KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4JLyoga2VybmVsIHJhZGlvIHN0cnVjdHMgICAgICAgICAgICovCiAjaW5jbHVkZSA8bGludXgvaW8uaD4JCS8qIG91dGIsIG91dGJfcCAgICAgICAgICAgICAgICAgICAqLwogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjEuMiIKKwogTU9EVUxFX0FVVEhPUigiRHIuIEhlbnJpayBTZWlkZWwiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQSBkcml2ZXIgZm9yIHRoZSBUeXBob29uIHJhZGlvIGNhcmQgKGEuay5hLiBFY29SYWRpbykuIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7CiAKICNpZm5kZWYgQ09ORklHX1JBRElPX1RZUEhPT05fUE9SVAogI2RlZmluZSBDT05GSUdfUkFESU9fVFlQSE9PTl9QT1JUIC0xCkBAIC02MSw5ICs2Myw3IEBACiBtb2R1bGVfcGFyYW0obXV0ZWZyZXEsIHVsb25nLCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobXV0ZWZyZXEsICJGcmVxdWVuY3kgdXNlZCB3aGVuIG11dGluZyB0aGUgY2FyZCAoaW4ga0h6KSIpOwogCi0jZGVmaW5lIFJBRElPX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMCwgMSwgMSkKLQotI2RlZmluZSBCQU5ORVIgIlR5cGhvb24gUmFkaW8gQ2FyZCBkcml2ZXIgdjAuMS4xXG4iCisjZGVmaW5lIEJBTk5FUiAiVHlwaG9vbiBSYWRpbyBDYXJkIGRyaXZlciB2IiBEUklWRVJfVkVSU0lPTiAiXG4iCiAKIHN0cnVjdCB0eXBob29uIHsKIAlzdHJ1Y3QgdjRsMl9kZXZpY2UgdjRsMl9kZXY7CkBAIC0xNzEsNyArMTcxLDYgQEAKIAlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLXR5cGhvb24iLCBzaXplb2Yodi0+ZHJpdmVyKSk7CiAJc3RybGNweSh2LT5jYXJkLCAiVHlwaG9vbiBSYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7CiAJc3RybGNweSh2LT5idXNfaW5mbywgIklTQSIsIHNpemVvZih2LT5idXNfaW5mbykpOwotCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwogCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU87CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXdsMTI3My5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby13bDEyNzMuYwppbmRleCA0NTlmNzI3Li40NmNhY2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXdsMTI3My5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8td2wxMjczLmMKQEAgLTEzODIsNyArMTM4Miw3IEBACiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSAgVjRMMl9DSURfVFVORV9BTlRFTk5BX0NBUEFDSVRPUjoKLQkJY3RybC0+Y3VyLnZhbCA9IHdsMTI3M19mbV9nZXRfdHhfY3R1bmUocmFkaW8pOworCQljdHJsLT52YWwgPSB3bDEyNzNfZm1fZ2V0X3R4X2N0dW5lKHJhZGlvKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby16b2x0cml4LmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXpvbHRyaXguYwppbmRleCBhZjk5YzViLi5mNTYxM2I5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXpvbHRyaXguYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXpvbHRyaXguYwpAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIHVkZWxheSwgbXNsZWVwICAgICAgICAgICAgICAgICAqLwogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgkvKiBrZXJuZWwgcmFkaW8gc3RydWN0cyAgICAgICAgICAgKi8KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4gICAgICAvKiBmb3IgS0VSTkVMX1ZFUlNJT04gTUFDUk8gICAgICovCiAjaW5jbHVkZSA8bGludXgvaW8uaD4JCS8qIG91dGIsIG91dGJfcCAgICAgICAgICAgICAgICAgICAqLwogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgpAQCAtNDMsNiArNDIsNyBAQAogTU9EVUxFX0FVVEhPUigiQy52YW4gU2NoYWlrIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkEgZHJpdmVyIGZvciB0aGUgWm9sdHJpeCBSYWRpbyBQbHVzLiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjAuMC4zIik7CiAKICNpZm5kZWYgQ09ORklHX1JBRElPX1pPTFRSSVhfUE9SVAogI2RlZmluZSBDT05GSUdfUkFESU9fWk9MVFJJWF9QT1JUIC0xCkBAIC01NSw4ICs1NSw2IEBACiBNT0RVTEVfUEFSTV9ERVNDKGlvLCAiSS9PIGFkZHJlc3Mgb2YgdGhlIFpvbHRyaXggUmFkaW8gUGx1cyAoMHgyMGMgb3IgMHgzMGMpIik7CiBtb2R1bGVfcGFyYW0ocmFkaW9fbnIsIGludCwgMCk7CiAKLSNkZWZpbmUgUkFESU9fVkVSU0lPTiBLRVJORUxfVkVSU0lPTigwLCAwLCAyKQotCiBzdHJ1Y3Qgem9sdHJpeCB7CiAJc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2OwogCXN0cnVjdCB2aWRlb19kZXZpY2UgdmRldjsKQEAgLTIyOCw3ICsyMjYsNiBAQAogCXN0cmxjcHkodi0+ZHJpdmVyLCAicmFkaW8tem9sdHJpeCIsIHNpemVvZih2LT5kcml2ZXIpKTsKIAlzdHJsY3B5KHYtPmNhcmQsICJab2x0cml4IFJhZGlvIiwgc2l6ZW9mKHYtPmNhcmQpKTsKIAlzdHJsY3B5KHYtPmJ1c19pbmZvLCAiSVNBIiwgc2l6ZW9mKHYtPmJ1c19pbmZvKSk7Ci0Jdi0+dmVyc2lvbiA9IFJBRElPX1ZFUlNJT047CiAJdi0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVIgfCBWNEwyX0NBUF9SQURJTzsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC1pMmMuYwppbmRleCBhMmE2Nzc3Li5mZDM1NDFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MHgvcmFkaW8tc2k0NzB4LWkyYy5jCkBAIC0yNCwxMCArMjQsOSBAQAogCiAvKiBkcml2ZXIgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiSm9vbnlvdW5nIFNoaW0gPGp5MDkyMi5zaGltQHNhbXN1bmcuY29tPiI7Ci0jZGVmaW5lIERSSVZFUl9LRVJORUxfVkVSU0lPTiBLRVJORUxfVkVSU0lPTigxLCAwLCAxKQogI2RlZmluZSBEUklWRVJfQ0FSRCAiU2lsaWNvbiBMYWJzIFNpNDcweCBGTSBSYWRpbyBSZWNlaXZlciIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIkkyQyByYWRpbyBkcml2ZXIgZm9yIFNpNDcweCBGTSBSYWRpbyBSZWNlaXZlcnMiCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICIxLjAuMSIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjEuMC4yIgogCiAvKiBrZXJuZWwgaW5jbHVkZXMgKi8KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KQEAgLTI0OCw3ICsyNDcsNiBAQAogewogCXN0cmxjcHkoY2FwYWJpbGl0eS0+ZHJpdmVyLCBEUklWRVJfTkFNRSwgc2l6ZW9mKGNhcGFiaWxpdHktPmRyaXZlcikpOwogCXN0cmxjcHkoY2FwYWJpbGl0eS0+Y2FyZCwgRFJJVkVSX0NBUkQsIHNpemVvZihjYXBhYmlsaXR5LT5jYXJkKSk7Ci0JY2FwYWJpbGl0eS0+dmVyc2lvbiA9IERSSVZFUl9LRVJORUxfVkVSU0lPTjsKIAljYXBhYmlsaXR5LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9IV19GUkVRX1NFRUsgfAogCQlWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1JBRElPOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtdXNiLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtdXNiLmMKaW5kZXggMzkyZTg0Zi4uNGNmNTM3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MHgvcmFkaW8tc2k0NzB4LXVzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC11c2IuYwpAQCAtMjksNyArMjksNiBAQAogCiAvKiBkcml2ZXIgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiVG9iaWFzIExvcmVueiA8dG9iaWFzLmxvcmVuekBnbXgubmV0PiIKLSNkZWZpbmUgRFJJVkVSX0tFUk5FTF9WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDEsIDAsIDEwKQogI2RlZmluZSBEUklWRVJfQ0FSRCAiU2lsaWNvbiBMYWJzIFNpNDcweCBGTSBSYWRpbyBSZWNlaXZlciIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQiByYWRpbyBkcml2ZXIgZm9yIFNpNDcweCBGTSBSYWRpbyBSZWNlaXZlcnMiCiAjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIxLjAuMTAiCkBAIC02MjYsNyArNjI1LDYgQEAKIAlzdHJsY3B5KGNhcGFiaWxpdHktPmNhcmQsIERSSVZFUl9DQVJELCBzaXplb2YoY2FwYWJpbGl0eS0+Y2FyZCkpOwogCXVzYl9tYWtlX3BhdGgocmFkaW8tPnVzYmRldiwgY2FwYWJpbGl0eS0+YnVzX2luZm8sCiAJCQlzaXplb2YoY2FwYWJpbGl0eS0+YnVzX2luZm8pKTsKLQljYXBhYmlsaXR5LT52ZXJzaW9uID0gRFJJVkVSX0tFUk5FTF9WRVJTSU9OOwogCWNhcGFiaWxpdHktPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX0hXX0ZSRVFfU0VFSyB8CiAJCVY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU8gfCBWNEwyX0NBUF9SRFNfQ0FQVFVSRTsKIApAQCAtNjk5LDcgKzY5Nyw3IEBACiAJcmFkaW8tPnZpZGVvZGV2ID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7CiAJaWYgKCFyYWRpby0+dmlkZW9kZXYpIHsKIAkJcmV0dmFsID0gLUVOT01FTTsKLQkJZ290byBlcnJfaW50YnVmZmVyOworCQlnb3RvIGVycl91cmI7CiAJfQogCW1lbWNweShyYWRpby0+dmlkZW9kZXYsICZzaTQ3MHhfdmlkZGV2X3RlbXBsYXRlLAogCQkJc2l6ZW9mKHNpNDcweF92aWRkZXZfdGVtcGxhdGUpKTsKQEAgLTc5MCw2ICs3ODgsOCBAQAogCWtmcmVlKHJhZGlvLT5idWZmZXIpOwogZXJyX3ZpZGVvOgogCXZpZGVvX2RldmljZV9yZWxlYXNlKHJhZGlvLT52aWRlb2Rldik7CitlcnJfdXJiOgorCXVzYl9mcmVlX3VyYihyYWRpby0+aW50X2luX3VyYik7CiBlcnJfaW50YnVmZmVyOgogCWtmcmVlKHJhZGlvLT5pbnRfaW5fYnVmZmVyKTsKIGVycl9yYWRpbzoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC5oIGIvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MHgvcmFkaW8tc2k0NzB4LmgKaW5kZXggNjhkYTAwMS4uZjMwMGE1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MHgvcmFkaW8tc2k0NzB4LmgKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MHgvcmFkaW8tc2k0NzB4LmgKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3dsMTI4eC9mbWRydi5oIGIvZHJpdmVycy9tZWRpYS9yYWRpby93bDEyOHgvZm1kcnYuaAppbmRleCAxYTQ1YTVkLi5kODRhZDlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3dsMTI4eC9mbWRydi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vd2wxMjh4L2ZtZHJ2LmgKQEAgLTI4LDE0ICsyOCwxMSBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgogCi0jZGVmaW5lIEZNX0RSVl9WRVJTSU9OICAgICAgICAgICAgIjAuMTAiCi0vKiBTaG91bGQgbWF0Y2ggd2l0aCBGTV9EUlZfVkVSU0lPTiAqLwotI2RlZmluZSBGTV9EUlZfUkFESU9fVkVSU0lPTiAgICAgIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDEpCisjZGVmaW5lIEZNX0RSVl9WRVJTSU9OICAgICAgICAgICAgIjAuMS4xIgogI2RlZmluZSBGTV9EUlZfTkFNRSAgICAgICAgICAgICAgICJ0aV9mbWRydiIKICNkZWZpbmUgRk1fRFJWX0NBUkRfU0hPUlRfTkFNRSAgICAiVEkgRk0gUmFkaW8iCiAjZGVmaW5lIEZNX0RSVl9DQVJEX0xPTkdfTkFNRSAgICAgIlRleGFzIEluc3RydW1lbnRzIEZNIFJhZGlvIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby93bDEyOHgvZm1kcnZfdjRsMi5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby93bDEyOHgvZm1kcnZfdjRsMi5jCmluZGV4IDg3MDEwNzIuLjhjMGUxOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vd2wxMjh4L2ZtZHJ2X3Y0bDIuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3dsMTI4eC9mbWRydl92NGwyLmMKQEAgLTE3NSw3ICsxNzUsNiBAQAogCXN0cmxjcHkoY2FwYWJpbGl0eS0+Y2FyZCwgRk1fRFJWX0NBUkRfU0hPUlRfTkFNRSwKIAkJCXNpemVvZihjYXBhYmlsaXR5LT5jYXJkKSk7CiAJc3ByaW50ZihjYXBhYmlsaXR5LT5idXNfaW5mbywgIlVBUlQiKTsKLQljYXBhYmlsaXR5LT52ZXJzaW9uID0gRk1fRFJWX1JBRElPX1ZFUlNJT047CiAJY2FwYWJpbGl0eS0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfSFdfRlJFUV9TRUVLIHwgVjRMMl9DQVBfVFVORVIgfAogCQlWNEwyX0NBUF9SQURJTyB8IFY0TDJfQ0FQX01PRFVMQVRPUiB8CiAJCVY0TDJfQ0FQX0FVRElPIHwgVjRMMl9DQVBfUkVBRFdSSVRFIHwKQEAgLTE5MSw3ICsxOTAsNyBAQAogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgIFY0TDJfQ0lEX1RVTkVfQU5URU5OQV9DQVBBQ0lUT1I6Ci0JCWN0cmwtPmN1ci52YWwgPSBmbV90eF9nZXRfdHVuZV9jYXBfdmFsKGZtZGV2KTsKKwkJY3RybC0+dmFsID0gZm1fdHhfZ2V0X3R1bmVfY2FwX3ZhbChmbWRldik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWZtd2FybigiJXM6IFVua25vd24gSU9DVEw6ICVkXG4iLCBfX2Z1bmNfXywgY3RybC0+aWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9yYy9LY29uZmlnCmluZGV4IDdkNGJiYzIuLjg5OWY3ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3JjL0tjb25maWcKQEAgLTg3LDYgKzg3LDE3IEBACiAJICAgdXNlcyBhbiBJUiBwcm90b2NvbCB0aGF0IGlzIGFsbW9zdCBzdGFuZGFyZCBSQy01LCBidXQgbm90IHF1aXRlLAogCSAgIGFzIGl0IHVzZXMgYW4gYWRkaXRpb25hbCBiaXQpLgogCitjb25maWcgSVJfTUNFX0tCRF9ERUNPREVSCisJdHJpc3RhdGUgIkVuYWJsZSBJUiByYXcgZGVjb2RlciBmb3IgdGhlIE1DRSBrZXlib2FyZC9tb3VzZSBwcm90b2NvbCIKKwlkZXBlbmRzIG9uIFJDX0NPUkUKKwlzZWxlY3QgQklUUkVWRVJTRQorCWRlZmF1bHQgeQorCisJLS0taGVscC0tLQorCSAgIEVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhIE1pY3Jvc29mdCBSZW1vdGUgS2V5Ym9hcmQgZm9yCisJICAgV2luZG93cyBNZWRpYSBDZW50ZXIgRWRpdGlvbiwgd2hpY2ggeW91IHdvdWxkIGxpa2UgdG8gdXNlIHdpdGgKKwkgICBhIHJhdyBJUiByZWNlaXZlciBpbiB5b3VyIHN5c3RlbS4KKwogY29uZmlnIElSX0xJUkNfQ09ERUMKIAl0cmlzdGF0ZSAiRW5hYmxlIElSIHRvIExJUkMgYnJpZGdlIgogCWRlcGVuZHMgb24gUkNfQ09SRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvcmMvTWFrZWZpbGUKaW5kZXggNTI4MzBlNS4uZjIyNGRiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3JjL01ha2VmaWxlCkBAIC0xMCw2ICsxMCw3IEBACiBvYmotJChDT05GSUdfSVJfSlZDX0RFQ09ERVIpICs9IGlyLWp2Yy1kZWNvZGVyLm8KIG9iai0kKENPTkZJR19JUl9TT05ZX0RFQ09ERVIpICs9IGlyLXNvbnktZGVjb2Rlci5vCiBvYmotJChDT05GSUdfSVJfUkM1X1NaX0RFQ09ERVIpICs9IGlyLXJjNS1zei1kZWNvZGVyLm8KK29iai0kKENPTkZJR19JUl9NQ0VfS0JEX0RFQ09ERVIpICs9IGlyLW1jZV9rYmQtZGVjb2Rlci5vCiBvYmotJChDT05GSUdfSVJfTElSQ19DT0RFQykgKz0gaXItbGlyYy1jb2RlYy5vCiAKICMgc3RhbmQtYWxvbmUgSVIgcmVjZWl2ZXJzL3RyYW5zbWl0dGVycwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9lbmVfaXIuYyBiL2RyaXZlcnMvbWVkaWEvcmMvZW5lX2lyLmMKaW5kZXggYTQzZWQ2Yy4uMmI5YzI1NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvZW5lX2lyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9lbmVfaXIuYwpAQCAtOTUzLDEzICs5NTMsMTMgQEAKIH0KIAogLyogb3V0c2lkZSBpbnRlcmZhY2U6IHRyYW5zbWl0ICovCi1zdGF0aWMgaW50IGVuZV90cmFuc21pdChzdHJ1Y3QgcmNfZGV2ICpyZGV2LCBpbnQgKmJ1ZiwgdTMyIG4pCitzdGF0aWMgaW50IGVuZV90cmFuc21pdChzdHJ1Y3QgcmNfZGV2ICpyZGV2LCB1bnNpZ25lZCAqYnVmLCB1bnNpZ25lZCBuKQogewogCXN0cnVjdCBlbmVfZGV2aWNlICpkZXYgPSByZGV2LT5wcml2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlkZXYtPnR4X2J1ZmZlciA9IGJ1ZjsKLQlkZXYtPnR4X2xlbiA9IG4gLyBzaXplb2YoaW50KTsKKwlkZXYtPnR4X2xlbiA9IG47CiAJZGV2LT50eF9wb3MgPSAwOwogCWRldi0+dHhfcmVnID0gMDsKIAlkZXYtPnR4X2RvbmUgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9lbmVfaXIuaCBiL2RyaXZlcnMvbWVkaWEvcmMvZW5lX2lyLmgKaW5kZXggMzM3YTQxZC4uMDE3YzIwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9lbmVfaXIuaAorKysgYi9kcml2ZXJzL21lZGlhL3JjL2VuZV9pci5oCkBAIC0yMzUsNyArMjM1LDcgQEAKIAlib29sIHR4X3NhbXBsZV9wdWxzZTsJCQkvKiBjdXJyZW50IHNhbXBsZSBpcyBwdWxzZSAqLwogCiAJLyogVFggYnVmZmVyICovCi0JaW50ICp0eF9idWZmZXI7CQkJCS8qIGlucHV0IHNhbXBsZXMgYnVmZmVyKi8KKwl1bnNpZ25lZCAqdHhfYnVmZmVyOwkJCS8qIGlucHV0IHNhbXBsZXMgYnVmZmVyKi8KIAlpbnQgdHhfcG9zOwkJCQkvKiBwb3NpdGlvbiBpbiB0aGF0IGJ1ZmVyICovCiAJaW50IHR4X2xlbjsJCQkJLyogY3VycmVudCBsZW4gb2YgdHggYnVmZmVyICovCiAJaW50IHR4X2RvbmU7CQkJCS8qIGRvbmUgdHJhbnNtaXR0aW5nICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2lyLWxpcmMtY29kZWMuYyBiL2RyaXZlcnMvbWVkaWEvcmMvaXItbGlyYy1jb2RlYy5jCmluZGV4IDFjNWNjNjUuLmU1ZWVlYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvaXItbGlyYy1jb2RlYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvaXItbGlyYy1jb2RlYy5jCkBAIC0xMDMsMTkgKzEwMywxOSBAQAogewogCXN0cnVjdCBsaXJjX2NvZGVjICpsaXJjOwogCXN0cnVjdCByY19kZXYgKmRldjsKLQlpbnQgKnR4YnVmOyAvKiBidWZmZXIgd2l0aCB2YWx1ZXMgdG8gdHJhbnNtaXQgKi8KLQlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgKnR4YnVmOyAvKiBidWZmZXIgd2l0aCB2YWx1ZXMgdG8gdHJhbnNtaXQgKi8KKwlzc2l6ZV90IHJldCA9IDA7CiAJc2l6ZV90IGNvdW50OwogCiAJbGlyYyA9IGxpcmNfZ2V0X3BkYXRhKGZpbGUpOwogCWlmICghbGlyYykKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpZiAobiAlIHNpemVvZihpbnQpKQorCWlmIChuIDwgc2l6ZW9mKHVuc2lnbmVkKSB8fCBuICUgc2l6ZW9mKHVuc2lnbmVkKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQljb3VudCA9IG4gLyBzaXplb2YoaW50KTsKLQlpZiAoY291bnQgPiBMSVJDQlVGX1NJWkUgfHwgY291bnQgJSAyID09IDAgfHwgbiAlIHNpemVvZihpbnQpICE9IDApCisJY291bnQgPSBuIC8gc2l6ZW9mKHVuc2lnbmVkKTsKKwlpZiAoY291bnQgPiBMSVJDQlVGX1NJWkUgfHwgY291bnQgJSAyID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJdHhidWYgPSBtZW1kdXBfdXNlcihidWYsIG4pOwpAQCAtMTI5LDcgKzEyOSwxMCBAQAogCX0KIAogCWlmIChkZXYtPnR4X2lyKQotCQlyZXQgPSBkZXYtPnR4X2lyKGRldiwgdHhidWYsICh1MzIpbik7CisJCXJldCA9IGRldi0+dHhfaXIoZGV2LCB0eGJ1ZiwgY291bnQpOworCisJaWYgKHJldCA+IDApCisJCXJldCAqPSBzaXplb2YodW5zaWduZWQpOwogCiBvdXQ6CiAJa2ZyZWUodHhidWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9pci1tY2Vfa2JkLWRlY29kZXIuYyBiL2RyaXZlcnMvbWVkaWEvcmMvaXItbWNlX2tiZC1kZWNvZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc4NGViZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvaXItbWNlX2tiZC1kZWNvZGVyLmMKQEAgLTAsMCArMSw0NDkgQEAKKy8qIGlyLW1jZV9rYmQtZGVjb2Rlci5jIC0gQSBkZWNvZGVyIGZvciB0aGUgUkM2LWlzaCBrZXlib2FyZC9tb3VzZSBJUiBwcm90b2NvbAorICogdXNlZCBieSB0aGUgTWljcm9zb2Z0IFJlbW90ZSBLZXlib2FyZCBmb3IgV2luZG93cyBNZWRpYSBDZW50ZXIgRWRpdGlvbiwKKyAqIHJlZmVycmVkIHRvIGJ5IE1pY3Jvc29mdCdzIFdpbmRvd3MgTWVkaWEgQ2VudGVyIHJlbW90ZSBzcGVjaWZpY2F0aW9uIGRvY3MKKyAqIGFzICJhbiBpbnRlcm5hbCBwcm90b2NvbCBjYWxsZWQgTUNJUi0yIi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgYnkgSmFyb2QgV2lsc29uIDxqYXJvZEByZWRoYXQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAicmMtY29yZS1wcml2LmgiCisKKy8qCisgKiBUaGlzIGRlY29kZXIgY3VycmVudGx5IHN1cHBvcnRzOgorICogLSBNQ0lSLTIgMjktYml0IElSIHNpZ25hbHMgdXNlZCBmb3IgbW91c2UgbW92ZW1lbnQgYW5kIGJ1dHRvbnMKKyAqIC0gTUNJUi0yIDMyLWJpdCBJUiBzaWduYWxzIHVzZWQgZm9yIHN0YW5kYXJkIGtleWJvYXJkIGtleXMKKyAqCisgKiBUaGUgbWVkaWEga2V5cyBvbiB0aGUga2V5Ym9hcmQgc2VuZCBSQy02IHNpZ25hbHMgdGhhdCBhcmUgaW5kaXRpbmd1aXNoYWJsZQorICogZnJvbSB0aGUga2V5cyBvZiB0aGUgc2FtZSBuYW1lIG9uIHRoZSBzdG9jayBNQ0UgcmVtb3RlLCBhbmQgd2lsbCBiZSBoYW5kbGVkCisgKiBieSB0aGUgc3RhbmRhcmQgUkMtNiBkZWNvZGVyLCBhbmQgYmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIHN5c3RlbSB2aWEgdGhlCisgKiBpbnB1dCBkZXZpY2UgZm9yIHRoZSByZW1vdGUsIHJhdGhlciB0aGFuIHRoZSBrZXlib2FyZC9tb3VzZSBvbmUuCisgKi8KKworI2RlZmluZSBNQ0lSMl9VTklUCQkzMzMzMzMJLyogbnMgKi8KKyNkZWZpbmUgTUNJUjJfSEVBREVSX05CSVRTCTUKKyNkZWZpbmUgTUNJUjJfTU9VU0VfTkJJVFMJMjkKKyNkZWZpbmUgTUNJUjJfS0VZQk9BUkRfTkJJVFMJMzIKKyNkZWZpbmUgTUNJUjJfUFJFRklYX1BVTFNFCSg4ICogTUNJUjJfVU5JVCkKKyNkZWZpbmUgTUNJUjJfUFJFRklYX1NQQUNFCSgxICogTUNJUjJfVU5JVCkKKyNkZWZpbmUgTUNJUjJfTUFYX0xFTgkJKDMgKiBNQ0lSMl9VTklUKQorI2RlZmluZSBNQ0lSMl9CSVRfU1RBUlQJCSgxICogTUNJUjJfVU5JVCkKKyNkZWZpbmUgTUNJUjJfQklUX0VORAkJKDEgKiBNQ0lSMl9VTklUKQorI2RlZmluZSBNQ0lSMl9CSVRfMAkJKDEgKiBNQ0lSMl9VTklUKQorI2RlZmluZSBNQ0lSMl9CSVRfU0VUCQkoMiAqIE1DSVIyX1VOSVQpCisjZGVmaW5lIE1DSVIyX01PREVfTUFTSwkJMHhmCS8qIGZvciB0aGUgaGVhZGVyIGJpdHMgKi8KKyNkZWZpbmUgTUNJUjJfS0VZQk9BUkRfSEVBREVSCTB4NAorI2RlZmluZSBNQ0lSMl9NT1VTRV9IRUFERVIJMHgxCisjZGVmaW5lIE1DSVIyX01BU0tfS0VZU19TVEFSVAkweGUwCisKK2VudW0gbWNlX2tiZF9tb2RlIHsKKwlNQ0lSMl9NT0RFX0tFWUJPQVJELAorCU1DSVIyX01PREVfTU9VU0UsCisJTUNJUjJfTU9ERV9VTktOT1dOLAorfTsKKworZW51bSBtY2Vfa2JkX3N0YXRlIHsKKwlTVEFURV9JTkFDVElWRSwKKwlTVEFURV9IRUFERVJfQklUX1NUQVJULAorCVNUQVRFX0hFQURFUl9CSVRfRU5ELAorCVNUQVRFX0JPRFlfQklUX1NUQVJULAorCVNUQVRFX0JPRFlfQklUX0VORCwKKwlTVEFURV9GSU5JU0hFRCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGtiZF9rZXljb2Rlc1syNTZdID0geworCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX0EsCisJS0VZX0IsCQlLRVlfQywJCUtFWV9ELAkJS0VZX0UsCQlLRVlfRiwKKwlLRVlfRywJCUtFWV9ILAkJS0VZX0ksCQlLRVlfSiwJCUtFWV9LLAorCUtFWV9MLAkJS0VZX00sCQlLRVlfTiwJCUtFWV9PLAkJS0VZX1AsCisJS0VZX1EsCQlLRVlfUiwJCUtFWV9TLAkJS0VZX1QsCQlLRVlfVSwKKwlLRVlfViwJCUtFWV9XLAkJS0VZX1gsCQlLRVlfWSwJCUtFWV9aLAorCUtFWV8xLAkJS0VZXzIsCQlLRVlfMywJCUtFWV80LAkJS0VZXzUsCisJS0VZXzYsCQlLRVlfNywJCUtFWV84LAkJS0VZXzksCQlLRVlfMCwKKwlLRVlfRU5URVIsCUtFWV9FU0MsCUtFWV9CQUNLU1BBQ0UsCUtFWV9UQUIsCUtFWV9TUEFDRSwKKwlLRVlfTUlOVVMsCUtFWV9FUVVBTCwJS0VZX0xFRlRCUkFDRSwJS0VZX1JJR0hUQlJBQ0UsCUtFWV9CQUNLU0xBU0gsCisJS0VZX1JFU0VSVkVELAlLRVlfU0VNSUNPTE9OLAlLRVlfQVBPU1RST1BIRSwJS0VZX0dSQVZFLAlLRVlfQ09NTUEsCisJS0VZX0RPVCwJS0VZX1NMQVNILAlLRVlfQ0FQU0xPQ0ssCUtFWV9GMSwJCUtFWV9GMiwKKwlLRVlfRjMsCQlLRVlfRjQsCQlLRVlfRjUsCQlLRVlfRjYsCQlLRVlfRjcsCisJS0VZX0Y4LAkJS0VZX0Y5LAkJS0VZX0YxMCwJS0VZX0YxMSwJS0VZX0YxMiwKKwlLRVlfU1lTUlEsCUtFWV9TQ1JPTExMT0NLLAlLRVlfUEFVU0UsCUtFWV9JTlNFUlQsCUtFWV9IT01FLAorCUtFWV9QQUdFVVAsCUtFWV9ERUxFVEUsCUtFWV9FTkQsCUtFWV9QQUdFRE9XTiwJS0VZX1JJR0hULAorCUtFWV9MRUZULAlLRVlfRE9XTiwJS0VZX1VQLAkJS0VZX05VTUxPQ0ssCUtFWV9LUFNMQVNILAorCUtFWV9LUEFTVEVSSVNLLAlLRVlfS1BNSU5VUywJS0VZX0tQUExVUywJS0VZX0tQRU5URVIsCUtFWV9LUDEsCisJS0VZX0tQMiwJS0VZX0tQMywJS0VZX0tQNCwJS0VZX0tQNSwJS0VZX0tQNiwKKwlLRVlfS1A3LAlLRVlfS1A4LAlLRVlfS1A5LAlLRVlfS1AwLAlLRVlfS1BET1QsCisJS0VZXzEwMk5ELAlLRVlfQ09NUE9TRSwJS0VZX1BPV0VSLAlLRVlfS1BFUVVBTCwJS0VZX0YxMywKKwlLRVlfRjE0LAlLRVlfRjE1LAlLRVlfRjE2LAlLRVlfRjE3LAlLRVlfRjE4LAorCUtFWV9GMTksCUtFWV9GMjAsCUtFWV9GMjEsCUtFWV9GMjIsCUtFWV9GMjMsCisJS0VZX0YyNCwJS0VZX09QRU4sCUtFWV9IRUxQLAlLRVlfUFJPUFMsCUtFWV9GUk9OVCwKKwlLRVlfU1RPUCwJS0VZX0FHQUlOLAlLRVlfVU5ETywJS0VZX0NVVCwJS0VZX0NPUFksCisJS0VZX1BBU1RFLAlLRVlfRklORCwJS0VZX01VVEUsCUtFWV9WT0xVTUVVUCwJS0VZX1ZPTFVNRURPV04sCisJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX0tQQ09NTUEsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUk8sCQlLRVlfS0FUQUtBTkFISVJBR0FOQSwgS0VZX1lFTiwJS0VZX0hFTktBTiwJS0VZX01VSEVOS0FOLAorCUtFWV9LUEpQQ09NTUEsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9IQU5HVUVMLAorCUtFWV9IQU5KQSwJS0VZX0tBVEFLQU5BLAlLRVlfSElSQUdBTkEsCUtFWV9aRU5LQUtVSEFOS0FLVSwgS0VZX1JFU0VSVkVELAorCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAorCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAorCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAorCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAorCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAorCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAorCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAorCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAorCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAorCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAorCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAorCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAorCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAorCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAorCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX0xFRlRDVFJMLAorCUtFWV9MRUZUU0hJRlQsCUtFWV9MRUZUQUxULAlLRVlfTEVGVE1FVEEsCUtFWV9SSUdIVENUUkwsCUtFWV9SSUdIVFNISUZULAorCUtFWV9SSUdIVEFMVCwJS0VZX1JJR0hUTUVUQSwJS0VZX1BMQVlQQVVTRSwJS0VZX1NUT1BDRCwJS0VZX1BSRVZJT1VTU09ORywKKwlLRVlfTkVYVFNPTkcsCUtFWV9FSkVDVENELAlLRVlfVk9MVU1FVVAsCUtFWV9WT0xVTUVET1dOLAlLRVlfTVVURSwKKwlLRVlfV1dXLAlLRVlfQkFDSywJS0VZX0ZPUldBUkQsCUtFWV9TVE9QLAlLRVlfRklORCwKKwlLRVlfU0NST0xMVVAsCUtFWV9TQ1JPTExET1dOLAlLRVlfRURJVCwJS0VZX1NMRUVQLAlLRVlfQ09GRkVFLAorCUtFWV9SRUZSRVNILAlLRVlfQ0FMQywJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQKK307CisKK3N0YXRpYyB2b2lkIG1jZV9rYmRfcnhfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG1jZV9rYmRfZGVjICptY2Vfa2JkID0gKHN0cnVjdCBtY2Vfa2JkX2RlYyAqKWRhdGE7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciBtYXNrY29kZTsKKworCUlSX2RwcmludGsoMiwgInRpbWVyIGNhbGxiYWNrIGNsZWFyaW5nIGFsbCBrZXlzXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJbWFza2NvZGUgPSBrYmRfa2V5Y29kZXNbTUNJUjJfTUFTS19LRVlTX1NUQVJUICsgaV07CisJCWlucHV0X3JlcG9ydF9rZXkobWNlX2tiZC0+aWRldiwgbWFza2NvZGUsIDApOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNQ0lSMl9NQVNLX0tFWVNfU1RBUlQ7IGkrKykKKwkJaW5wdXRfcmVwb3J0X2tleShtY2Vfa2JkLT5pZGV2LCBrYmRfa2V5Y29kZXNbaV0sIDApOworfQorCitzdGF0aWMgZW51bSBtY2Vfa2JkX21vZGUgbWNlX2tiZF9tb2RlKHN0cnVjdCBtY2Vfa2JkX2RlYyAqZGF0YSkKK3sKKwlzd2l0Y2ggKGRhdGEtPmhlYWRlciAmIE1DSVIyX01PREVfTUFTSykgeworCWNhc2UgTUNJUjJfS0VZQk9BUkRfSEVBREVSOgorCQlyZXR1cm4gTUNJUjJfTU9ERV9LRVlCT0FSRDsKKwljYXNlIE1DSVIyX01PVVNFX0hFQURFUjoKKwkJcmV0dXJuIE1DSVIyX01PREVfTU9VU0U7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE1DSVIyX01PREVfVU5LTk9XTjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlyX21jZV9rYmRfcHJvY2Vzc19rZXlib2FyZF9kYXRhKHN0cnVjdCBpbnB1dF9kZXYgKmlkZXYsCisJCQkJCSAgICAgdTMyIHNjYW5jb2RlKQoreworCXU4IGtleWRhdGEgICA9IChzY2FuY29kZSA+PiA4KSAmIDB4ZmY7CisJdTggc2hpZnRtYXNrID0gc2NhbmNvZGUgJiAweGZmOworCXVuc2lnbmVkIGNoYXIga2V5Y29kZSwgbWFza2NvZGU7CisJaW50IGksIGtleXN0YXRlOworCisJSVJfZHByaW50aygxLCAia2V5Ym9hcmQ6IGtleWRhdGEgPSAweCUwMngsIHNoaWZ0bWFzayA9IDB4JTAyeFxuIiwKKwkJICAga2V5ZGF0YSwgc2hpZnRtYXNrKTsKKworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJbWFza2NvZGUgPSBrYmRfa2V5Y29kZXNbTUNJUjJfTUFTS19LRVlTX1NUQVJUICsgaV07CisJCWlmIChzaGlmdG1hc2sgJiAoMSA8PCBpKSkKKwkJCWtleXN0YXRlID0gMTsKKwkJZWxzZQorCQkJa2V5c3RhdGUgPSAwOworCQlpbnB1dF9yZXBvcnRfa2V5KGlkZXYsIG1hc2tjb2RlLCBrZXlzdGF0ZSk7CisJfQorCisJaWYgKGtleWRhdGEpIHsKKwkJa2V5Y29kZSA9IGtiZF9rZXljb2Rlc1trZXlkYXRhXTsKKwkJaW5wdXRfcmVwb3J0X2tleShpZGV2LCBrZXljb2RlLCAxKTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgTUNJUjJfTUFTS19LRVlTX1NUQVJUOyBpKyspCisJCQlpbnB1dF9yZXBvcnRfa2V5KGlkZXYsIGtiZF9rZXljb2Rlc1tpXSwgMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpcl9tY2Vfa2JkX3Byb2Nlc3NfbW91c2VfZGF0YShzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2LCB1MzIgc2NhbmNvZGUpCit7CisJLyogcmF3IG1vdXNlIGNvb3JkaW5hdGVzICovCisJdTggeGRhdGEgPSAoc2NhbmNvZGUgPj4gNykgJiAweDdmOworCXU4IHlkYXRhID0gKHNjYW5jb2RlID4+IDE0KSAmIDB4N2Y7CisJaW50IHgsIHk7CisJLyogbW91c2UgYnV0dG9ucyAqLworCWJvb2wgcmlnaHQgPSBzY2FuY29kZSAmIDB4NDA7CisJYm9vbCBsZWZ0ICA9IHNjYW5jb2RlICYgMHgyMDsKKworCWlmICh4ZGF0YSAmIDB4NDApCisJCXggPSAtKCh+eGRhdGEgJiAweDdmKSArIDEpOworCWVsc2UKKwkJeCA9IHhkYXRhOworCisJaWYgKHlkYXRhICYgMHg0MCkKKwkJeSA9IC0oKH55ZGF0YSAmIDB4N2YpICsgMSk7CisJZWxzZQorCQl5ID0geWRhdGE7CisKKwlJUl9kcHJpbnRrKDEsICJtb3VzZTogeCA9ICVkLCB5ID0gJWQsIGJ0bnMgPSAlcyVzXG4iLAorCQkgICB4LCB5LCBsZWZ0ID8gIkwiIDogIiIsIHJpZ2h0ID8gIlIiIDogIiIpOworCisJaW5wdXRfcmVwb3J0X3JlbChpZGV2LCBSRUxfWCwgeCk7CisJaW5wdXRfcmVwb3J0X3JlbChpZGV2LCBSRUxfWSwgeSk7CisKKwlpbnB1dF9yZXBvcnRfa2V5KGlkZXYsIEJUTl9MRUZULCBsZWZ0KTsKKwlpbnB1dF9yZXBvcnRfa2V5KGlkZXYsIEJUTl9SSUdIVCwgcmlnaHQpOworfQorCisvKioKKyAqIGlyX21jZV9rYmRfZGVjb2RlKCkgLSBEZWNvZGUgb25lIG1jZV9rYmQgcHVsc2Ugb3Igc3BhY2UKKyAqIEBkZXY6CXRoZSBzdHJ1Y3QgcmNfZGV2IGRlc2NyaXB0b3Igb2YgdGhlIGRldmljZQorICogQGV2OgkJdGhlIHN0cnVjdCBpcl9yYXdfZXZlbnQgZGVzY3JpcHRvciBvZiB0aGUgcHVsc2Uvc3BhY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgLUVJTlZBTCBpZiB0aGUgcHVsc2UgdmlvbGF0ZXMgdGhlIHN0YXRlIG1hY2hpbmUKKyAqLworc3RhdGljIGludCBpcl9tY2Vfa2JkX2RlY29kZShzdHJ1Y3QgcmNfZGV2ICpkZXYsIHN0cnVjdCBpcl9yYXdfZXZlbnQgZXYpCit7CisJc3RydWN0IG1jZV9rYmRfZGVjICpkYXRhID0gJmRldi0+cmF3LT5tY2Vfa2JkOworCXUzMiBzY2FuY29kZTsKKwl1bnNpZ25lZCBsb25nIGRlbGF5OworCisJaWYgKCEoZGV2LT5yYXctPmVuYWJsZWRfcHJvdG9jb2xzICYgUkNfVFlQRV9NQ0VfS0JEKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWlzX3RpbWluZ19ldmVudChldikpIHsKKwkJaWYgKGV2LnJlc2V0KQorCQkJZGF0YS0+c3RhdGUgPSBTVEFURV9JTkFDVElWRTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFnZXFfbWFyZ2luKGV2LmR1cmF0aW9uLCBNQ0lSMl9VTklULCBNQ0lSMl9VTklUIC8gMikpCisJCWdvdG8gb3V0OworCithZ2FpbjoKKwlJUl9kcHJpbnRrKDIsICJzdGFydGVkIGF0IHN0YXRlICVpICgldXVzICVzKVxuIiwKKwkJICAgZGF0YS0+c3RhdGUsIFRPX1VTKGV2LmR1cmF0aW9uKSwgVE9fU1RSKGV2LnB1bHNlKSk7CisKKwlpZiAoIWdlcV9tYXJnaW4oZXYuZHVyYXRpb24sIE1DSVIyX1VOSVQsIE1DSVIyX1VOSVQgLyAyKSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGRhdGEtPnN0YXRlKSB7CisKKwljYXNlIFNUQVRFX0lOQUNUSVZFOgorCQlpZiAoIWV2LnB1bHNlKQorCQkJYnJlYWs7CisKKwkJLyogTm90ZTogbGFyZ2VyIG1hcmdpbiBvbiBmaXJzdCBwdWxzZSBzaW5jZSBlYWNoIE1DSVIyX1VOSVQKKwkJICAgaXMgcXVpdGUgc2hvcnQgYW5kIHNvbWUgaGFyZHdhcmUgdGFrZXMgc29tZSB0aW1lIHRvCisJCSAgIGFkanVzdCB0byB0aGUgc2lnbmFsICovCisJCWlmICghZXFfbWFyZ2luKGV2LmR1cmF0aW9uLCBNQ0lSMl9QUkVGSVhfUFVMU0UsIE1DSVIyX1VOSVQpKQorCQkJYnJlYWs7CisKKwkJZGF0YS0+c3RhdGUgPSBTVEFURV9IRUFERVJfQklUX1NUQVJUOworCQlkYXRhLT5jb3VudCA9IDA7CisJCWRhdGEtPmhlYWRlciA9IDA7CisJCXJldHVybiAwOworCisJY2FzZSBTVEFURV9IRUFERVJfQklUX1NUQVJUOgorCQlpZiAoZ2VxX21hcmdpbihldi5kdXJhdGlvbiwgTUNJUjJfTUFYX0xFTiwgTUNJUjJfVU5JVCAvIDIpKQorCQkJYnJlYWs7CisKKwkJZGF0YS0+aGVhZGVyIDw8PSAxOworCQlpZiAoZXYucHVsc2UpCisJCQlkYXRhLT5oZWFkZXIgfD0gMTsKKwkJZGF0YS0+Y291bnQrKzsKKwkJZGF0YS0+c3RhdGUgPSBTVEFURV9IRUFERVJfQklUX0VORDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNUQVRFX0hFQURFUl9CSVRfRU5EOgorCQlpZiAoIWlzX3RyYW5zaXRpb24oJmV2LCAmZGV2LT5yYXctPnByZXZfZXYpKQorCQkJYnJlYWs7CisKKwkJZGVjcmVhc2VfZHVyYXRpb24oJmV2LCBNQ0lSMl9CSVRfRU5EKTsKKworCQlpZiAoZGF0YS0+Y291bnQgIT0gTUNJUjJfSEVBREVSX05CSVRTKSB7CisJCQlkYXRhLT5zdGF0ZSA9IFNUQVRFX0hFQURFUl9CSVRfU1RBUlQ7CisJCQlnb3RvIGFnYWluOworCQl9CisKKwkJc3dpdGNoIChtY2Vfa2JkX21vZGUoZGF0YSkpIHsKKwkJY2FzZSBNQ0lSMl9NT0RFX0tFWUJPQVJEOgorCQkJZGF0YS0+d2FudGVkX2JpdHMgPSBNQ0lSMl9LRVlCT0FSRF9OQklUUzsKKwkJCWJyZWFrOworCQljYXNlIE1DSVIyX01PREVfTU9VU0U6CisJCQlkYXRhLT53YW50ZWRfYml0cyA9IE1DSVIyX01PVVNFX05CSVRTOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlJUl9kcHJpbnRrKDEsICJub3Qga2V5Ym9hcmQgb3IgbW91c2UgZGF0YVxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWRhdGEtPmNvdW50ID0gMDsKKwkJZGF0YS0+Ym9keSA9IDA7CisJCWRhdGEtPnN0YXRlID0gU1RBVEVfQk9EWV9CSVRfU1RBUlQ7CisJCWdvdG8gYWdhaW47CisKKwljYXNlIFNUQVRFX0JPRFlfQklUX1NUQVJUOgorCQlpZiAoZ2VxX21hcmdpbihldi5kdXJhdGlvbiwgTUNJUjJfTUFYX0xFTiwgTUNJUjJfVU5JVCAvIDIpKQorCQkJYnJlYWs7CisKKwkJZGF0YS0+Ym9keSA8PD0gMTsKKwkJaWYgKGV2LnB1bHNlKQorCQkJZGF0YS0+Ym9keSB8PSAxOworCQlkYXRhLT5jb3VudCsrOworCQlkYXRhLT5zdGF0ZSA9IFNUQVRFX0JPRFlfQklUX0VORDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNUQVRFX0JPRFlfQklUX0VORDoKKwkJaWYgKCFpc190cmFuc2l0aW9uKCZldiwgJmRldi0+cmF3LT5wcmV2X2V2KSkKKwkJCWJyZWFrOworCisJCWlmIChkYXRhLT5jb3VudCA9PSBkYXRhLT53YW50ZWRfYml0cykKKwkJCWRhdGEtPnN0YXRlID0gU1RBVEVfRklOSVNIRUQ7CisJCWVsc2UKKwkJCWRhdGEtPnN0YXRlID0gU1RBVEVfQk9EWV9CSVRfU1RBUlQ7CisKKwkJZGVjcmVhc2VfZHVyYXRpb24oJmV2LCBNQ0lSMl9CSVRfRU5EKTsKKwkJZ290byBhZ2FpbjsKKworCWNhc2UgU1RBVEVfRklOSVNIRUQ6CisJCWlmIChldi5wdWxzZSkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoZGF0YS0+d2FudGVkX2JpdHMpIHsKKwkJY2FzZSBNQ0lSMl9LRVlCT0FSRF9OQklUUzoKKwkJCXNjYW5jb2RlID0gZGF0YS0+Ym9keSAmIDB4ZmZmZjsKKwkJCUlSX2RwcmludGsoMSwgImtleWJvYXJkIGRhdGEgMHglMDh4XG4iLCBkYXRhLT5ib2R5KTsKKwkJCWlmIChkZXYtPnRpbWVvdXQpCisJCQkJZGVsYXkgPSB1c2Vjc190b19qaWZmaWVzKGRldi0+dGltZW91dCAvIDEwMDApOworCQkJZWxzZQorCQkJCWRlbGF5ID0gbXNlY3NfdG9famlmZmllcygxMDApOworCQkJbW9kX3RpbWVyKCZkYXRhLT5yeF90aW1lb3V0LCBqaWZmaWVzICsgZGVsYXkpOworCQkJLyogUGFzcyBkYXRhIHRvIGtleWJvYXJkIGJ1ZmZlciBwYXJzZXIgKi8KKwkJCWlyX21jZV9rYmRfcHJvY2Vzc19rZXlib2FyZF9kYXRhKGRhdGEtPmlkZXYsIHNjYW5jb2RlKTsKKwkJCWJyZWFrOworCQljYXNlIE1DSVIyX01PVVNFX05CSVRTOgorCQkJc2NhbmNvZGUgPSBkYXRhLT5ib2R5ICYgMHgxZmZmZmY7CisJCQlJUl9kcHJpbnRrKDEsICJtb3VzZSBkYXRhIDB4JTA2eFxuIiwgc2NhbmNvZGUpOworCQkJLyogUGFzcyBkYXRhIHRvIG1vdXNlIGJ1ZmZlciBwYXJzZXIgKi8KKwkJCWlyX21jZV9rYmRfcHJvY2Vzc19tb3VzZV9kYXRhKGRhdGEtPmlkZXYsIHNjYW5jb2RlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJSVJfZHByaW50aygxLCAibm90IGtleWJvYXJkIG9yIG1vdXNlIGRhdGFcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlkYXRhLT5zdGF0ZSA9IFNUQVRFX0lOQUNUSVZFOworCQlpbnB1dF9zeW5jKGRhdGEtPmlkZXYpOworCQlyZXR1cm4gMDsKKwl9CisKK291dDoKKwlJUl9kcHJpbnRrKDEsICJmYWlsZWQgYXQgc3RhdGUgJWkgKCV1dXMgJXMpXG4iLAorCQkgICBkYXRhLT5zdGF0ZSwgVE9fVVMoZXYuZHVyYXRpb24pLCBUT19TVFIoZXYucHVsc2UpKTsKKwlkYXRhLT5zdGF0ZSA9IFNUQVRFX0lOQUNUSVZFOworCWlucHV0X3N5bmMoZGF0YS0+aWRldik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgaXJfbWNlX2tiZF9yZWdpc3RlcihzdHJ1Y3QgcmNfZGV2ICpkZXYpCit7CisJc3RydWN0IG1jZV9rYmRfZGVjICptY2Vfa2JkID0gJmRldi0+cmF3LT5tY2Vfa2JkOworCXN0cnVjdCBpbnB1dF9kZXYgKmlkZXY7CisJaW50IGksIHJldDsKKworCWlkZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWlkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJc25wcmludGYobWNlX2tiZC0+bmFtZSwgc2l6ZW9mKG1jZV9rYmQtPm5hbWUpLAorCQkgIk1DRSBJUiBLZXlib2FyZC9Nb3VzZSAoJXMpIiwgZGV2LT5kcml2ZXJfbmFtZSk7CisJc3RybGNhdChtY2Vfa2JkLT5waHlzLCAiL2lucHV0MCIsIHNpemVvZihtY2Vfa2JkLT5waHlzKSk7CisKKwlpZGV2LT5uYW1lID0gbWNlX2tiZC0+bmFtZTsKKwlpZGV2LT5waHlzID0gbWNlX2tiZC0+cGh5czsKKworCS8qIEtleWJvYXJkIGJpdHMgKi8KKwlzZXRfYml0KEVWX0tFWSwgaWRldi0+ZXZiaXQpOworCXNldF9iaXQoRVZfUkVQLCBpZGV2LT5ldmJpdCk7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihrYmRfa2V5Y29kZXMpOyBpKyspCisJCXNldF9iaXQoa2JkX2tleWNvZGVzW2ldLCBpZGV2LT5rZXliaXQpOworCisJLyogTW91c2UgYml0cyAqLworCXNldF9iaXQoRVZfUkVMLCBpZGV2LT5ldmJpdCk7CisJc2V0X2JpdChSRUxfWCwgaWRldi0+cmVsYml0KTsKKwlzZXRfYml0KFJFTF9ZLCBpZGV2LT5yZWxiaXQpOworCXNldF9iaXQoQlROX0xFRlQsIGlkZXYtPmtleWJpdCk7CisJc2V0X2JpdChCVE5fUklHSFQsIGlkZXYtPmtleWJpdCk7CisKKwkvKiBSZXBvcnQgc2NhbmNvZGVzIHRvbyAqLworCXNldF9iaXQoRVZfTVNDLCBpZGV2LT5ldmJpdCk7CisJc2V0X2JpdChNU0NfU0NBTiwgaWRldi0+bXNjYml0KTsKKworCXNldHVwX3RpbWVyKCZtY2Vfa2JkLT5yeF90aW1lb3V0LCBtY2Vfa2JkX3J4X3RpbWVvdXQsCisJCSAgICAodW5zaWduZWQgbG9uZyltY2Vfa2JkKTsKKworCWlucHV0X3NldF9kcnZkYXRhKGlkZXYsIG1jZV9rYmQpOworCisjaWYgMAorCS8qIEFkZGluZyB0aGlzIHJlZmVyZW5jZSBtZWFucyB0d28gaW5wdXQgZGV2aWNlcyBhcmUgYXNzb2NpYXRlZCB3aXRoCisJICogdGhpcyByYy1jb3JlIGRldmljZSwgd2hpY2ggaXIta2V5dGFibGUgZG9lc24ndCBjb3BlIHdpdGggeWV0ICovCisJaWRldi0+ZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKKyNlbmRpZgorCisJcmV0ID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWlucHV0X2ZyZWVfZGV2aWNlKGlkZXYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltY2Vfa2JkLT5pZGV2ID0gaWRldjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlyX21jZV9rYmRfdW5yZWdpc3RlcihzdHJ1Y3QgcmNfZGV2ICpkZXYpCit7CisJc3RydWN0IG1jZV9rYmRfZGVjICptY2Vfa2JkID0gJmRldi0+cmF3LT5tY2Vfa2JkOworCXN0cnVjdCBpbnB1dF9kZXYgKmlkZXYgPSBtY2Vfa2JkLT5pZGV2OworCisJZGVsX3RpbWVyX3N5bmMoJm1jZV9rYmQtPnJ4X3RpbWVvdXQpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGlkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJfcmF3X2hhbmRsZXIgbWNlX2tiZF9oYW5kbGVyID0geworCS5wcm90b2NvbHMJPSBSQ19UWVBFX01DRV9LQkQsCisJLmRlY29kZQkJPSBpcl9tY2Vfa2JkX2RlY29kZSwKKwkucmF3X3JlZ2lzdGVyCT0gaXJfbWNlX2tiZF9yZWdpc3RlciwKKwkucmF3X3VucmVnaXN0ZXIJPSBpcl9tY2Vfa2JkX3VucmVnaXN0ZXIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpcl9tY2Vfa2JkX2RlY29kZV9pbml0KHZvaWQpCit7CisJaXJfcmF3X2hhbmRsZXJfcmVnaXN0ZXIoJm1jZV9rYmRfaGFuZGxlcik7CisKKwlwcmludGsoS0VSTl9JTkZPICJJUiBNQ0UgS2V5Ym9hcmQvbW91c2UgcHJvdG9jb2wgaGFuZGxlciBpbml0aWFsaXplZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpcl9tY2Vfa2JkX2RlY29kZV9leGl0KHZvaWQpCit7CisJaXJfcmF3X2hhbmRsZXJfdW5yZWdpc3RlcigmbWNlX2tiZF9oYW5kbGVyKTsKK30KKworbW9kdWxlX2luaXQoaXJfbWNlX2tiZF9kZWNvZGVfaW5pdCk7Cittb2R1bGVfZXhpdChpcl9tY2Vfa2JkX2RlY29kZV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSmFyb2QgV2lsc29uIDxqYXJvZEByZWRoYXQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNQ0UgS2V5Ym9hcmQvbW91c2UgSVIgcHJvdG9jb2wgZGVjb2RlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9pci1yYXcuYyBiL2RyaXZlcnMvbWVkaWEvcmMvaXItcmF3LmMKaW5kZXggNDIzZWQ0NS4uMjc4MDhiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9pci1yYXcuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2lyLXJhdy5jCkBAIC0zNTUsNiArMzU1LDcgQEAKIAlsb2FkX3JjNl9kZWNvZGUoKTsKIAlsb2FkX2p2Y19kZWNvZGUoKTsKIAlsb2FkX3NvbnlfZGVjb2RlKCk7CisJbG9hZF9tY2Vfa2JkX2RlY29kZSgpOwogCWxvYWRfbGlyY19jb2RlYygpOwogCiAJLyogSWYgbmVlZGVkLCB3ZSBtYXkgbGF0ZXIgYWRkIHNvbWUgaW5pdCBjb2RlLiBJbiB0aGlzIGNhc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2l0ZS1jaXIuYyBiL2RyaXZlcnMvbWVkaWEvcmMvaXRlLWNpci5jCmluZGV4IGQyMDE2OGYuLjY4MjAwOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvaXRlLWNpci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvaXRlLWNpci5jCkBAIC0zODIsNyArMzgyLDcgQEAKIC8qIHRyYW5zbWl0IG91dCBJUiBwdWxzZXM7IHdoYXQgeW91IGdldCBoZXJlIGlzIGEgYmF0Y2ggb2YgYWx0ZXJuYXRpbmcKICAqIHB1bHNlL3NwYWNlL3B1bHNlL3NwYWNlIGxlbmd0aHMgdGhhdCB3ZSBzaG91bGQgd3JpdGUgb3V0IGNvbXBsZXRlbHkgdGhyb3VnaAogICogdGhlIEZJRk8sIGJsb2NraW5nIG9uIGEgZnVsbCBGSUZPICovCi1zdGF0aWMgaW50IGl0ZV90eF9pcihzdHJ1Y3QgcmNfZGV2ICpyY2RldiwgaW50ICp0eGJ1ZiwgdTMyIG4pCitzdGF0aWMgaW50IGl0ZV90eF9pcihzdHJ1Y3QgcmNfZGV2ICpyY2RldiwgdW5zaWduZWQgKnR4YnVmLCB1bnNpZ25lZCBuKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGl0ZV9kZXYgKmRldiA9IHJjZGV2LT5wcml2OwpAQCAtMzk4LDkgKzM5OCw2IEBACiAJLyogY2xlYXIgdGhlIGFycmF5IGp1c3QgaW4gY2FzZSAqLwogCW1lbXNldChsYXN0X3NlbnQsIDAsIEFSUkFZX1NJWkUobGFzdF9zZW50KSk7CiAKLQkvKiBuIGNvbWVzIGluIGJ5dGVzOyBjb252ZXJ0IHRvIGludHMgKi8KLQluIC89IHNpemVvZihpbnQpOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOwogCiAJLyogbGV0IGV2ZXJ5Ym9keSBrbm93IHdlJ3JlIG5vdyB0cmFuc21pdHRpbmcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1yYzYtbWNlLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcmM2LW1jZS5jCmluZGV4IDAxYjY5YmMuLmMzOTA3ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1yYzYtbWNlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXJjNi1tY2UuYwpAQCAtMjksNyArMjksNyBAQAogCiAJeyAweDgwMGYwNDBhLCBLRVlfREVMRVRFIH0sCiAJeyAweDgwMGYwNDBiLCBLRVlfRU5URVIgfSwKLQl7IDB4ODAwZjA0MGMsIEtFWV9QT1dFUiB9LAkJLyogUEMgUG93ZXIgKi8KKwl7IDB4ODAwZjA0MGMsIEtFWV9TTEVFUCB9LAkJLyogRm9ybWVybHkgUEMgUG93ZXIgKi8KIAl7IDB4ODAwZjA0MGQsIEtFWV9NRURJQSB9LAkJLyogV2luZG93cyBNQ0UgYnV0dG9uICovCiAJeyAweDgwMGYwNDBlLCBLRVlfTVVURSB9LAogCXsgMHg4MDBmMDQwZiwgS0VZX0lORk8gfSwKQEAgLTQ0LDcgKzQ0LDYgQEAKIAl7IDB4ODAwZjA0MTYsIEtFWV9QTEFZIH0sCiAJeyAweDgwMGYwNDE3LCBLRVlfUkVDT1JEIH0sCiAJeyAweDgwMGYwNDE4LCBLRVlfUEFVU0UgfSwKLQl7IDB4ODAwZjA0NmUsIEtFWV9QTEFZUEFVU0UgfSwKIAl7IDB4ODAwZjA0MTksIEtFWV9TVE9QIH0sCiAJeyAweDgwMGYwNDFhLCBLRVlfTkVYVCB9LAogCXsgMHg4MDBmMDQxYiwgS0VZX1BSRVZJT1VTIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL21jZXVzYi5jIGIvZHJpdmVycy9tZWRpYS9yYy9tY2V1c2IuYwppbmRleCBlYzk3MmRjLi44NWZmOWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL21jZXVzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvbWNldXNiLmMKQEAgLTY5MiwyMCArNjkyLDE4IEBACiB9CiAKIC8qIFNlbmQgZGF0YSBvdXQgdGhlIElSIGJsYXN0ZXIgcG9ydChzKSAqLwotc3RhdGljIGludCBtY2V1c2JfdHhfaXIoc3RydWN0IHJjX2RldiAqZGV2LCBpbnQgKnR4YnVmLCB1MzIgbikKK3N0YXRpYyBpbnQgbWNldXNiX3R4X2lyKHN0cnVjdCByY19kZXYgKmRldiwgdW5zaWduZWQgKnR4YnVmLCB1bnNpZ25lZCBjb3VudCkKIHsKIAlzdHJ1Y3QgbWNldXNiX2RldiAqaXIgPSBkZXYtPnByaXY7CiAJaW50IGksIHJldCA9IDA7Ci0JaW50IGNvdW50LCBjbWRjb3VudCA9IDA7CisJaW50IGNtZGNvdW50ID0gMDsKIAl1bnNpZ25lZCBjaGFyICpjbWRidWY7IC8qIE1DRSBjb21tYW5kIGJ1ZmZlciAqLwogCWxvbmcgc2lnbmFsX2R1cmF0aW9uID0gMDsgLyogU2luZ25hbCBsZW5ndGggaW4gdXMgKi8KIAlzdHJ1Y3QgdGltZXZhbCBzdGFydF90aW1lLCBlbmRfdGltZTsKIAogCWRvX2dldHRpbWVvZmRheSgmc3RhcnRfdGltZSk7CiAKLQljb3VudCA9IG4gLyBzaXplb2YoaW50KTsKLQotCWNtZGJ1ZiA9IGt6YWxsb2Moc2l6ZW9mKGludCkgKiBNQ0VfQ01EQlVGX1NJWkUsIEdGUF9LRVJORUwpOworCWNtZGJ1ZiA9IGt6YWxsb2Moc2l6ZW9mKHVuc2lnbmVkKSAqIE1DRV9DTURCVUZfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjbWRidWYpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC03NzQsNyArNzcyLDcgQEAKIAogb3V0OgogCWtmcmVlKGNtZGJ1Zik7Ci0JcmV0dXJuIHJldCA/IHJldCA6IG47CisJcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OwogfQogCiAvKiBTZXRzIGFjdGl2ZSBJUiBvdXRwdXRzIC0tIG1jZSBkZXZpY2VzIHR5cGljYWxseSBoYXZlIHR3byAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9udXZvdG9uLWNpci5jIGIvZHJpdmVycy9tZWRpYS9yYy9udXZvdG9uLWNpci5jCmluZGV4IGNlNTk1ZjkuLmVhZTA1YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvbnV2b3Rvbi1jaXIuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL251dm90b24tY2lyLmMKQEAgLTU0NiwyNCArNTQ2LDE4IEBACiAgKiBudW1iZXIgbWF5IGxhcmdlciB0aGFuIFRYRkNPTlQgKDB4ZmYpLiBTbyBpbiBpbnRlcnJ1cHRfaGFuZGxlciwgaXQgaGFzIHRvCiAgKiBzZXQgVFhGQ09OVCBhcyAweGZmLCB1bnRpbCBidWZfY291bnQgbGVzcyB0aGFuIDB4ZmYuCiAgKi8KLXN0YXRpYyBpbnQgbnZ0X3R4X2lyKHN0cnVjdCByY19kZXYgKmRldiwgaW50ICp0eGJ1ZiwgdTMyIG4pCitzdGF0aWMgaW50IG52dF90eF9pcihzdHJ1Y3QgcmNfZGV2ICpkZXYsIHVuc2lnbmVkICp0eGJ1ZiwgdW5zaWduZWQgbikKIHsKIAlzdHJ1Y3QgbnZ0X2RldiAqbnZ0ID0gZGV2LT5wcml2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc2l6ZV90IGN1cl9jb3VudDsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1OCBpcmVuOwogCWludCByZXQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbnZ0LT50eC5sb2NrLCBmbGFncyk7CiAKLQlpZiAobiA+PSBUWF9CVUZfTEVOKSB7Ci0JCW52dC0+dHguYnVmX2NvdW50ID0gY3VyX2NvdW50ID0gVFhfQlVGX0xFTjsKLQkJcmV0ID0gVFhfQlVGX0xFTjsKLQl9IGVsc2UgewotCQludnQtPnR4LmJ1Zl9jb3VudCA9IGN1cl9jb3VudCA9IG47Ci0JCXJldCA9IG47Ci0JfQorCXJldCA9IG1pbigodW5zaWduZWQpKFRYX0JVRl9MRU4gLyBzaXplb2YodW5zaWduZWQpKSwgbik7CisJbnZ0LT50eC5idWZfY291bnQgPSAocmV0ICogc2l6ZW9mKHVuc2lnbmVkKSk7CiAKIAltZW1jcHkobnZ0LT50eC5idWYsIHR4YnVmLCBudnQtPnR4LmJ1Zl9jb3VudCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvcmMtY29yZS1wcml2LmggYi9kcml2ZXJzL21lZGlhL3JjL3JjLWNvcmUtcHJpdi5oCmluZGV4IDg3M2IzODcuLjA0YzJjNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvcmMtY29yZS1wcml2LmgKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9yYy1jb3JlLXByaXYuaApAQCAtODQsNiArODQsMTcgQEAKIAkJdW5zaWduZWQgY291bnQ7CiAJCXVuc2lnbmVkIHdhbnRlZF9iaXRzOwogCX0gcmM1X3N6OworCXN0cnVjdCBtY2Vfa2JkX2RlYyB7CisJCXN0cnVjdCBpbnB1dF9kZXYgKmlkZXY7CisJCXN0cnVjdCB0aW1lcl9saXN0IHJ4X3RpbWVvdXQ7CisJCWNoYXIgbmFtZVs2NF07CisJCWNoYXIgcGh5c1s2NF07CisJCWludCBzdGF0ZTsKKwkJdTggaGVhZGVyOworCQl1MzIgYm9keTsKKwkJdW5zaWduZWQgY291bnQ7CisJCXVuc2lnbmVkIHdhbnRlZF9iaXRzOworCX0gbWNlX2tiZDsKIAlzdHJ1Y3QgbGlyY19jb2RlYyB7CiAJCXN0cnVjdCByY19kZXYgKmRldjsKIAkJc3RydWN0IGxpcmNfZHJpdmVyICpkcnY7CkBAIC0xODIsNiArMTkzLDEzIEBACiAjZGVmaW5lIGxvYWRfc29ueV9kZWNvZGUoKQkwCiAjZW5kaWYKIAorLyogZnJvbSBpci1tY2Vfa2JkLWRlY29kZXIuYyAqLworI2lmZGVmIENPTkZJR19JUl9NQ0VfS0JEX0RFQ09ERVJfTU9EVUxFCisjZGVmaW5lIGxvYWRfbWNlX2tiZF9kZWNvZGUoKQlyZXF1ZXN0X21vZHVsZSgiaXItbWNlX2tiZC1kZWNvZGVyIikKKyNlbHNlCisjZGVmaW5lIGxvYWRfbWNlX2tiZF9kZWNvZGUoKQkwCisjZW5kaWYKKwogLyogZnJvbSBpci1saXJjLWNvZGVjLmMgKi8KICNpZmRlZiBDT05GSUdfSVJfTElSQ19DT0RFQ19NT0RVTEUKICNkZWZpbmUgbG9hZF9saXJjX2NvZGVjKCkJcmVxdWVzdF9tb2R1bGUoImlyLWxpcmMtY29kZWMiKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9yYy1sb29wYmFjay5jIGIvZHJpdmVycy9tZWRpYS9yYy9yYy1sb29wYmFjay5jCmluZGV4IGNjODQ2YjIuLmVmYzZhNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvcmMtbG9vcGJhY2suYworKysgYi9kcml2ZXJzL21lZGlhL3JjL3JjLWxvb3BiYWNrLmMKQEAgLTEwMSwyMSArMTAxLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbG9vcF90eF9pcihzdHJ1Y3QgcmNfZGV2ICpkZXYsIGludCAqdHhidWYsIHUzMiBuKQorc3RhdGljIGludCBsb29wX3R4X2lyKHN0cnVjdCByY19kZXYgKmRldiwgdW5zaWduZWQgKnR4YnVmLCB1bnNpZ25lZCBjb3VudCkKIHsKIAlzdHJ1Y3QgbG9vcGJhY2tfZGV2ICpsb2RldiA9IGRldi0+cHJpdjsKIAl1MzIgcnhtYXNrOwotCXVuc2lnbmVkIGNvdW50OwogCXVuc2lnbmVkIHRvdGFsX2R1cmF0aW9uID0gMDsKIAl1bnNpZ25lZCBpOwogCURFRklORV9JUl9SQVdfRVZFTlQocmF3aXIpOwogCi0JaWYgKG4gPT0gMCB8fCBuICUgc2l6ZW9mKGludCkpIHsKLQkJZHByaW50aygiaW52YWxpZCB0eCBidWZmZXIgc2l6ZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNvdW50ID0gbiAvIHNpemVvZihpbnQpOwogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQogCQl0b3RhbF9kdXJhdGlvbiArPSBhYnModHhidWZbaV0pOwogCkBAIC0xNDIsNyArMTM1LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAJCXJhd2lyLnB1bHNlID0gaSAlIDIgPyBmYWxzZSA6IHRydWU7Ci0JCXJhd2lyLmR1cmF0aW9uID0gYWJzKHR4YnVmW2ldKSAqIDEwMDA7CisJCXJhd2lyLmR1cmF0aW9uID0gdHhidWZbaV0gKiAxMDAwOwogCQlpZiAocmF3aXIuZHVyYXRpb24pCiAJCQlpcl9yYXdfZXZlbnRfc3RvcmVfd2l0aF9maWx0ZXIoZGV2LCAmcmF3aXIpOwogCX0KQEAgLTE1OCw3ICsxNTEsNyBAQAogCS8qIExpcmMgZXhwZWN0cyB0aGlzIGZ1bmN0aW9uIHRvIHRha2UgYXMgbG9uZyBhcyB0aGUgdG90YWwgZHVyYXRpb24gKi8KIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCXNjaGVkdWxlX3RpbWVvdXQodXNlY3NfdG9famlmZmllcyh0b3RhbF9kdXJhdGlvbikpOwotCXJldHVybiBuOworCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljIHZvaWQgbG9vcF9zZXRfaWRsZShzdHJ1Y3QgcmNfZGV2ICpkZXYsIGJvb2wgZW5hYmxlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9yYy1tYWluLmMgYi9kcml2ZXJzL21lZGlhL3JjL3JjLW1haW4uYwppbmRleCAzMTg2YWM3Li41MWEyM2Y0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL3JjLW1haW4uYworKysgYi9kcml2ZXJzL21lZGlhL3JjL3JjLW1haW4uYwpAQCAtNzM1LDYgKzczNSw3IEBACiAJeyBSQ19UWVBFX0pWQywJCSJqdmMiCQl9LAogCXsgUkNfVFlQRV9TT05ZLAkJInNvbnkiCQl9LAogCXsgUkNfVFlQRV9SQzVfU1osCSJyYy01LXN6Igl9LAorCXsgUkNfVFlQRV9NQ0VfS0JELAkibWNlX2tiZCIJfSwKIAl7IFJDX1RZUEVfTElSQywJCSJsaXJjIgkJfSwKIAl7IFJDX1RZUEVfT1RIRVIsCSJvdGhlciIJCX0sCiB9OwpAQCAtMTA5OSw3ICsxMTAwLDYgQEAKIAkJaWYgKHJjIDwgMCkKIAkJCWdvdG8gb3V0X2lucHV0OwogCX0KLQltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAKIAlpZiAoZGV2LT5jaGFuZ2VfcHJvdG9jb2wpIHsKIAkJcmMgPSBkZXYtPmNoYW5nZV9wcm90b2NvbChkZXYsIHJjX21hcC0+cmNfdHlwZSk7CkBAIC0xMTA3LDYgKzExMDcsOCBAQAogCQkJZ290byBvdXRfcmF3OwogCX0KIAorCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKwogCUlSX2RwcmludGsoMSwgIlJlZ2lzdGVyZWQgcmMlbGQgKGRyaXZlcjogJXMsIHJlbW90ZTogJXMsIG1vZGUgJXMpXG4iLAogCQkgICBkZXYtPmRldm5vLAogCQkgICBkZXYtPmRyaXZlcl9uYW1lID8gZGV2LT5kcml2ZXJfbmFtZSA6ICJ1bmtub3duIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvcmVkcmF0My5jIGIvZHJpdmVycy9tZWRpYS9yYy9yZWRyYXQzLmMKaW5kZXggNTE0Nzc2Ny4uYTE2NjA0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9yZWRyYXQzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9yZWRyYXQzLmMKQEAgLTIwNSw2ICsyMDUsNyBAQAogCiAJLyogcnggc2lnbmFsIHRpbWVvdXQgdGltZXIgKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdCByeF90aW1lb3V0OworCXUzMiBod190aW1lb3V0OwogCiAJLyogSXMgdGhlIGRldmljZSBjdXJyZW50bHkgcmVjZWl2aW5nPyAqLwogCWJvb2wgcmVjdl9pbl9wcm9ncmVzczsKQEAgLTQxNCwyMCArNDE1LDEwIEBACiAKIH0KIAotLyogdGltZXIgY2FsbGJhY2sgdG8gc2VuZCBsb25nIHRyYWlsaW5nIHNwYWNlIG9uIHJlY2VpdmUgdGltZW91dCAqLworLyogdGltZXIgY2FsbGJhY2sgdG8gc2VuZCByZXNldCBldmVudCAqLwogc3RhdGljIHZvaWQgcmVkcmF0M19yeF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgcmVkcmF0M19kZXYgKnJyMyA9IChzdHJ1Y3QgcmVkcmF0M19kZXYgKilkYXRhOwotCURFRklORV9JUl9SQVdfRVZFTlQocmF3aXIpOwotCi0JcmF3aXIucHVsc2UgPSBmYWxzZTsKLQlyYXdpci5kdXJhdGlvbiA9IHJyMy0+cmMtPnRpbWVvdXQ7Ci0JcnIzX2RiZyhycjMtPmRldiwgInN0b3JpbmcgdHJhaWxpbmcgc3BhY2Ugd2l0aCBkdXJhdGlvbiAlZFxuIiwKLQkJcmF3aXIuZHVyYXRpb24pOwotCWlyX3Jhd19ldmVudF9zdG9yZV93aXRoX2ZpbHRlcihycjMtPnJjLCAmcmF3aXIpOwotCi0JcnIzX2RiZyhycjMtPmRldiwgImNhbGxpbmcgaXJfcmF3X2V2ZW50X2hhbmRsZVxuIik7Ci0JaXJfcmF3X2V2ZW50X2hhbmRsZShycjMtPnJjKTsKIAogCXJyM19kYmcocnIzLT5kZXYsICJjYWxsaW5nIGlyX3Jhd19ldmVudF9yZXNldFxuIik7CiAJaXJfcmF3X2V2ZW50X3Jlc2V0KHJyMy0+cmMpOwpAQCAtNDM4LDcgKzQyOSw3IEBACiAJREVGSU5FX0lSX1JBV19FVkVOVChyYXdpcik7CiAJc3RydWN0IHJlZHJhdDNfc2lnbmFsX2hlYWRlciBoZWFkZXI7CiAJc3RydWN0IGRldmljZSAqZGV2OwotCWludCBpOworCWludCBpLCB0cmFpbGVyID0gMDsKIAl1bnNpZ25lZCBsb25nIGRlbGF5OwogCXUzMiBtb2RfZnJlcSwgc2luZ2xlX2xlbjsKIAl1MTYgKmxlbl92YWxzOwpAQCAtNDY0LDcgKzQ1NSw4IEBACiAJaWYgKCEoaGVhZGVyLmxlbmd0aCA+PSBSUjNfSEVBREVSX0xFTkdUSCkpCiAJCWRldl93YXJuKGRldiwgInJlYWQgcmV0dXJuZWQgbGVzcyB0aGFuIHJyMyBoZWFkZXIgbGVuXG4iKTsKIAotCWRlbGF5ID0gdXNlY3NfdG9famlmZmllcyhycjMtPnJjLT50aW1lb3V0IC8gMTAwMCk7CisJLyogTWFrZSBzdXJlIHdlIHJlc2V0IHRoZSBJUiBrZmlmbyBhZnRlciBhIGJpdCBvZiBpbmFjdGl2aXR5ICovCisJZGVsYXkgPSB1c2Vjc190b19qaWZmaWVzKHJyMy0+aHdfdGltZW91dCk7CiAJbW9kX3RpbWVyKCZycjMtPnJ4X3RpbWVvdXQsIGppZmZpZXMgKyBkZWxheSk7CiAKIAltZW1jcHkoJnRtcDMyLCBzaWdfZGF0YSArIFJSM19QQVVTRV9PRkZTRVQsIHNpemVvZih0bXAzMikpOwpAQCAtNTA2LDkgKzQ5OCw2IEBACiAJCXUxNiB2YWwgPSBsZW5fdmFsc1tkYXRhX3ZhbHNbaV1dOwogCQlzaW5nbGVfbGVuID0gcmVkcmF0M19sZW5fdG9fdXMoKHUzMiliZTE2X3RvX2NwdSh2YWwpKTsKIAotCQkvKiBjYXAgdGhlIHZhbHVlIHRvIElSX01BWF9EVVJBVElPTiAqLwotCQlzaW5nbGVfbGVuICY9IElSX01BWF9EVVJBVElPTjsKLQogCQkvKiB3ZSBzaG91bGQgYWx3YXlzIGdldCBwdWxzZS9zcGFjZS9wdWxzZS9zcGFjZSBzYW1wbGVzICovCiAJCWlmIChpICUgMikKIAkJCXJhd2lyLnB1bHNlID0gZmFsc2U7CkBAIC01MTYsNiArNTA1LDEyIEBACiAJCQlyYXdpci5wdWxzZSA9IHRydWU7CiAKIAkJcmF3aXIuZHVyYXRpb24gPSBVU19UT19OUyhzaW5nbGVfbGVuKTsKKwkJLyogU2F2ZSBpbml0aWFsIHB1bHNlIGxlbmd0aCB0byBmdWRnZSB0cmFpbGVyICovCisJCWlmIChpID09IDApCisJCQl0cmFpbGVyID0gcmF3aXIuZHVyYXRpb247CisJCS8qIGNhcCB0aGUgdmFsdWUgdG8gSVJfTUFYX0RVUkFUSU9OICovCisJCXJhd2lyLmR1cmF0aW9uICY9IElSX01BWF9EVVJBVElPTjsKKwogCQlycjNfZGJnKGRldiwgInN0b3JpbmcgJXMgd2l0aCBkdXJhdGlvbiAlZCAoaTogJWQpXG4iLAogCQkJcmF3aXIucHVsc2UgPyAicHVsc2UiIDogInNwYWNlIiwgcmF3aXIuZHVyYXRpb24sIGkpOwogCQlpcl9yYXdfZXZlbnRfc3RvcmVfd2l0aF9maWx0ZXIocnIzLT5yYywgJnJhd2lyKTsKQEAgLTUyNSw3ICs1MjAsMTAgQEAKIAlpZiAoaSAlIDIpIHsKIAkJcmF3aXIucHVsc2UgPSBmYWxzZTsKIAkJLyogdGhpcyBkdXJhdGlvbiBpcyBtYWRlIHVwLCBhbmQgbWF5IG5vdCBiZSBpZGVhbC4uLiAqLwotCQlyYXdpci5kdXJhdGlvbiA9IHJyMy0+cmMtPnRpbWVvdXQgLyAyOworCQlpZiAodHJhaWxlciA8IFVTX1RPX05TKDEwMDApKQorCQkJcmF3aXIuZHVyYXRpb24gPSBVU19UT19OUygyODAwKTsKKwkJZWxzZQorCQkJcmF3aXIuZHVyYXRpb24gPSB0cmFpbGVyOwogCQlycjNfZGJnKGRldiwgInN0b3JpbmcgdHJhaWxpbmcgc3BhY2Ugd2l0aCBkdXJhdGlvbiAlZFxuIiwKIAkJCXJhd2lyLmR1cmF0aW9uKTsKIAkJaXJfcmF3X2V2ZW50X3N0b3JlX3dpdGhfZmlsdGVyKHJyMy0+cmMsICZyYXdpcik7CkBAIC02MjksMzYgKzYyNywzMSBAQAogCWtmcmVlKHJyMyk7CiB9CiAKLXN0YXRpYyB1MzIgcmVkcmF0M19nZXRfdGltZW91dChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IHJjX2RldiAqcmMsIHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQorc3RhdGljIHUzMiByZWRyYXQzX2dldF90aW1lb3V0KHN0cnVjdCByZWRyYXQzX2RldiAqcnIzKQogewogCXUzMiAqdG1wOwotCXUzMiB0aW1lb3V0ID0gTVNfVE9fTlMoMTUwKTsgLyogYSBzYW5lIGRlZmF1bHQsIGlmIHRoaW5ncyBnbyBoYXl3aXJlICovCisJdTMyIHRpbWVvdXQgPSBNU19UT19VUygxNTApOyAvKiBhIHNhbmUgZGVmYXVsdCwgaWYgdGhpbmdzIGdvIGhheXdpcmUgKi8KIAlpbnQgbGVuLCByZXQsIHBpcGU7CiAKIAlsZW4gPSBzaXplb2YoKnRtcCk7CiAJdG1wID0ga3phbGxvYyhsZW4sIEdGUF9LRVJORUwpOwogCWlmICghdG1wKSB7Ci0JCWRldl93YXJuKGRldiwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxsdXJlXG4iKTsKKwkJZGV2X3dhcm4ocnIzLT5kZXYsICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsbHVyZVxuIik7CiAJCXJldHVybiB0aW1lb3V0OwogCX0KIAotCXBpcGUgPSB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCk7Ci0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHBpcGUsIFJSM19HRVRfSVJfUEFSQU0sCisJcGlwZSA9IHVzYl9yY3ZjdHJscGlwZShycjMtPnVkZXYsIDApOworCXJldCA9IHVzYl9jb250cm9sX21zZyhycjMtPnVkZXYsIHBpcGUsIFJSM19HRVRfSVJfUEFSQU0sCiAJCQkgICAgICBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFIHwgVVNCX0RJUl9JTiwKIAkJCSAgICAgIFJSM19JUl9JT19TSUdfVElNRU9VVCwgMCwgdG1wLCBsZW4sIEhaICogNSk7CiAJaWYgKHJldCAhPSBsZW4pIHsKLQkJZGV2X3dhcm4oZGV2LCAiRmFpbGVkIHRvIHJlYWQgdGltZW91dCBmcm9tIGhhcmR3YXJlXG4iKTsKKwkJZGV2X3dhcm4ocnIzLT5kZXYsICJGYWlsZWQgdG8gcmVhZCB0aW1lb3V0IGZyb20gaGFyZHdhcmVcbiIpOwogCQlyZXR1cm4gdGltZW91dDsKIAl9CiAKLQl0aW1lb3V0ID0gVVNfVE9fTlMocmVkcmF0M19sZW5fdG9fdXMoYmUzMl90b19jcHUoKnRtcCkpKTsKLQlpZiAodGltZW91dCA8IHJjLT5taW5fdGltZW91dCkKLQkJdGltZW91dCA9IHJjLT5taW5fdGltZW91dDsKLQllbHNlIGlmICh0aW1lb3V0ID4gcmMtPm1heF90aW1lb3V0KQotCQl0aW1lb3V0ID0gcmMtPm1heF90aW1lb3V0OworCXRpbWVvdXQgPSByZWRyYXQzX2xlbl90b191cyhiZTMyX3RvX2NwdSgqdG1wKSk7CiAKLQlycjNfZGJnKGRldiwgIkdvdCB0aW1lb3V0IG9mICVkIG1zXG4iLCB0aW1lb3V0IC8gKDEwMDAgKiAxMDAwKSk7CisJcnIzX2RiZyhycjMtPmRldiwgIkdvdCB0aW1lb3V0IG9mICVkIG1zXG4iLCB0aW1lb3V0IC8gMTAwMCk7CiAJcmV0dXJuIHRpbWVvdXQ7CiB9CiAKQEAgLTExMTAsOSArMTEwMyw3IEBACiAJcmMtPnByaXYgPSBycjM7CiAJcmMtPmRyaXZlcl90eXBlID0gUkNfRFJJVkVSX0lSX1JBVzsKIAlyYy0+YWxsb3dlZF9wcm90b3MgPSBSQ19UWVBFX0FMTDsKLQlyYy0+bWluX3RpbWVvdXQgPSBNU19UT19OUyhSUjNfUlhfTUlOX1RJTUVPVVQpOwotCXJjLT5tYXhfdGltZW91dCA9IE1TX1RPX05TKFJSM19SWF9NQVhfVElNRU9VVCk7Ci0JcmMtPnRpbWVvdXQgPSByZWRyYXQzX2dldF90aW1lb3V0KGRldiwgcmMsIHJyMy0+dWRldik7CisJcmMtPnRpbWVvdXQgPSBVU19UT19OUygyNzUwKTsKIAlyYy0+dHhfaXIgPSByZWRyYXQzX3RyYW5zbWl0X2lyOwogCXJjLT5zX3R4X2NhcnJpZXIgPSByZWRyYXQzX3NldF90eF9jYXJyaWVyOwogCXJjLT5kcml2ZXJfbmFtZSA9IERSSVZFUl9OQU1FOwpAQCAtMTE4Niw3ICsxMTc3LDcgQEAKIAlycjMgPSBremFsbG9jKHNpemVvZigqcnIzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJyMyA9PSBOVUxMKSB7CiAJCWRldl9lcnIoZGV2LCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIik7Ci0JCWdvdG8gZXJyb3I7CisJCWdvdG8gbm9fZW5kcG9pbnRzOwogCX0KIAogCXJyMy0+ZGV2ID0gJmludGYtPmRldjsKQEAgLTEyNDIsNiArMTIzMyw5IEBACiAJaWYgKHJldHZhbCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKKwkvKiBzdG9yZSBjdXJyZW50IGhhcmR3YXJlIHRpbWVvdXQsIGluIHVzLCB3aWxsIHVzZSBmb3Iga2ZpZm8gcmVzZXRzICovCisJcnIzLT5od190aW1lb3V0ID0gcmVkcmF0M19nZXRfdGltZW91dChycjMpOworCiAJLyogZGVmYXVsdC4uIHdpbGwgZ2V0IG92ZXJyaWRkZW4gYnkgYW55IHNlbmRzIHdpdGggYSBmcmVxIGRlZmluZWQgKi8KIAlycjMtPmNhcnJpZXIgPSAzODAwMDsKIApAQCAtMTI4MCw2ICsxMjc0LDcgQEAKIAogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CiAJcmNfdW5yZWdpc3Rlcl9kZXZpY2UocnIzLT5yYyk7CisJZGVsX3RpbWVyX3N5bmMoJnJyMy0+cnhfdGltZW91dCk7CiAJcmVkcmF0M19kZWxldGUocnIzLCB1ZGV2KTsKIAogCXJyM19mdHIoJmludGYtPmRldiwgIlJlZFJhdDMgSVIgVHJhbnNjZWl2ZXIgbm93IGRpc2Nvbm5lY3RlZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL3dpbmJvbmQtY2lyLmMgYi9kcml2ZXJzL21lZGlhL3JjL3dpbmJvbmQtY2lyLmMKaW5kZXggNWQwNmI4OS4uYmVjOGFiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy93aW5ib25kLWNpci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvd2luYm9uZC1jaXIuYwpAQCAtNiw4ICs2LDggQEAKICAqICBjb3VsZCBwcm9iYWJseSBzdXBwb3J0IG90aGVycyAoV2luYm9uZCBXRUMxMDJYLCBOYXRTZW1pLCBldGMpCiAgKiAgd2l0aCBtaW5vciBtb2RpZmljYXRpb25zLgogICoKLSAqICBPcmlnaW5hbCBBdXRob3I6IERhdmlkIEjkcmRlbWFuIDxkYXZpZEBoYXJkZW1hbi5udT4KLSAqICAgICBDb3B5cmlnaHQgKEMpIDIwMDkgLSAyMDEwIERhdmlkIEjkcmRlbWFuIDxkYXZpZEBoYXJkZW1hbi5udT4KKyAqICBPcmlnaW5hbCBBdXRob3I6IERhdmlkIEjDpHJkZW1hbiA8ZGF2aWRAaGFyZGVtYW4ubnU+CisgKiAgICAgQ29weXJpZ2h0IChDKSAyMDA5IC0gMjAxMSBEYXZpZCBIw6RyZGVtYW4gPGRhdmlkQGhhcmRlbWFuLm51PgogICoKICAqICBEZWRpY2F0ZWQgdG8gbXkgZGF1Z2h0ZXIgTWF0aWxkYSwgd2l0aG91dCB3aG9zZSBsb3ZpbmcgYXR0ZW50aW9uIHRoaXMKICAqICBkcml2ZXIgd291bGQgaGF2ZSBiZWVuIGZpbmlzaGVkIGluIGhhbGYgdGhlIHRpbWUgYW5kIHdpdGggYSBmcmFjdGlvbgpAQCAtNTc3LDE2ICs1NzcsMTIgQEAKIH0KIAogc3RhdGljIGludAotd2JjaXJfdHgoc3RydWN0IHJjX2RldiAqZGV2LCBpbnQgKmJ1ZiwgdTMyIGJ1ZnNpemUpCit3YmNpcl90eChzdHJ1Y3QgcmNfZGV2ICpkZXYsIHVuc2lnbmVkICpidWYsIHVuc2lnbmVkIGNvdW50KQogewogCXN0cnVjdCB3YmNpcl9kYXRhICpkYXRhID0gZGV2LT5wcml2OwotCXUzMiBjb3VudDsKIAl1bnNpZ25lZCBpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkvKiBidWZzaXplIGhhcyBiZWVuIHNhbml0eSBjaGVja2VkIGJ5IHRoZSBjYWxsZXIgKi8KLQljb3VudCA9IGJ1ZnNpemUgLyBzaXplb2YoaW50KTsKLQogCS8qIE5vdCBzdXJlIGlmIHRoaXMgaXMgcG9zc2libGUsIGJ1dCBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGEtPnNwaW5sb2NrLCBmbGFncyk7CiAJaWYgKGRhdGEtPnR4c3RhdGUgIT0gV0JDSVJfVFhTVEFURV9JTkFDVElWRSkgewpAQCAtODc2LDE4ICs4NzIsOCBAQAogCS8qIHByZXNjYWxlciAxLjAsIHR4L3J4IGZpZm8gbHZsIDE2ICovCiAJb3V0YigweDMwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfRVhDUjIpOwogCi0JLyogU2V0IGJhdWQgZGl2aXNvciB0byBnZW5lcmF0ZSBvbmUgYnl0ZSBwZXIgYml0L2NlbGwgKi8KLQlzd2l0Y2ggKHByb3RvY29sKSB7Ci0JY2FzZSBJUl9QUk9UT0NPTF9SQzU6Ci0JCW91dGIoMHhBNywgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0JHREwpOwotCQlicmVhazsKLQljYXNlIElSX1BST1RPQ09MX1JDNjoKLQkJb3V0YigweDUzLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQkdETCk7Ci0JCWJyZWFrOwotCWNhc2UgSVJfUFJPVE9DT0xfTkVDOgotCQlvdXRiKDB4NjksIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19CR0RMKTsKLQkJYnJlYWs7Ci0JfQorCS8qIFNldCBiYXVkIGRpdmlzb3IgdG8gc2FtcGxlIGV2ZXJ5IDEwIHVzICovCisJb3V0YigweDBGLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQkdETCk7CiAJb3V0YigweDAwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQkdESCk7CiAKIAkvKiBTZXQgQ0VJUiBtb2RlICovCkBAIC04OTYsOSArODgyLDkgQEAKIAlpbmIoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0xTUik7IC8qIENsZWFyIExTUiAqLwogCWluYihkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfTVNSKTsgLyogQ2xlYXIgTVNSICovCiAKLQkvKiBEaXNhYmxlIFJYIGRlbW9kLCBydW4tbGVuZ3RoIGVuY29kaW5nL2RlY29kaW5nLCBzZXQgZnJlcSBzcGFuICovCisJLyogRGlzYWJsZSBSWCBkZW1vZCwgZW5hYmxlIHJ1bi1sZW5ndGggZW5jL2RlYywgc2V0IGZyZXEgc3BhbiAqLwogCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfNyk7Ci0Jb3V0YigweDEwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfUkNDRkcpOworCW91dGIoMHg5MCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX1JDQ0ZHKTsKIAogCS8qIERpc2FibGUgdGltZXIgKi8KIAl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCmluZGV4IGJiNTNkZTcuLmY1NzRkYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKQEAgLTQ4OSw2ICs0ODksMTUgQEAKIAkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBUb3NoaWJhIFRDTTgyNXggVkdBIGNhbWVyYSBzZW5zb3IuCiAJICBJdCBpcyB1c2VkIGZvciBleGFtcGxlIGluIE5va2lhIE44MDAuCiAKK2NvbW1lbnQgIkZsYXNoIGRldmljZXMiCisKK2NvbmZpZyBWSURFT19BRFAxNjUzCisJdHJpc3RhdGUgIkFEUDE2NTMgZmxhc2ggc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEkyQyAmJiBWSURFT19WNEwyICYmIE1FRElBX0NPTlRST0xMRVIKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgQURQMTY1MyBmbGFzaCBjb250cm9sbGVyLiBJdCBpcyB1c2VkIGZvcgorCSAgZXhhbXBsZSBpbiBOb2tpYSBOOTAwLgorCiBjb21tZW50ICJWaWRlbyBpbXByb3ZlbWVudCBjaGlwcyIKIAogY29uZmlnIFZJREVPX1VQRDY0MDMxQQpAQCAtNzA3LDYgKzcxNiw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvS2NvbmZpZyIKKwogY29uZmlnIFZJREVPX00zMlJfQVIKIAl0cmlzdGF0ZSAiQVIgZGV2aWNlcyIKIAlkZXBlbmRzIG9uIE0zMlIgJiYgVklERU9fVjRMMgpAQCAtNzI2LDE1ICs3MzcsNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYXJ2LgogCi1jb25maWcgVklERU9fQ0FGRV9DQ0lDCi0JdHJpc3RhdGUgIk1hcnZlbGwgODhBTFAwMSAoQ2FmZSkgQ01PUyBDYW1lcmEgQ29udHJvbGxlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gUENJICYmIEkyQyAmJiBWSURFT19WNEwyCi0Jc2VsZWN0IFZJREVPX09WNzY3MAotCS0tLWhlbHAtLS0KLQkgIFRoaXMgaXMgYSB2aWRlbzRsaW51eDIgZHJpdmVyIGZvciB0aGUgTWFydmVsbCA4OEFMUDAxIGludGVncmF0ZWQKLQkgIENNT1MgY2FtZXJhIGNvbnRyb2xsZXIuICBUaGlzIGlzIHRoZSBjb250cm9sbGVyIGZvdW5kIG9uIGZpcnN0LQotCSAgZ2VuZXJhdGlvbiBPTFBDIHN5c3RlbXMuCi0KIGNvbmZpZyBWSURFT19TUjAzMFBDMzAKIAl0cmlzdGF0ZSAiU1IwMzBQQzMwIFZHQSBjYW1lcmEgc2Vuc29yIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJMkMgJiYgVklERU9fVjRMMgpAQCAtODQ2LDYgKzg0OCwxMiBAQAogCWhlbHAKIAkgIFRoaXMgaXMgYSBvdjI2NDAgY2FtZXJhIGRyaXZlcgogCitjb25maWcgU09DX0NBTUVSQV9PVjU2NDIKKwl0cmlzdGF0ZSAib3Y1NjQyIGNhbWVyYSBzdXBwb3J0IgorCWRlcGVuZHMgb24gU09DX0NBTUVSQSAmJiBJMkMKKwloZWxwCisJICBUaGlzIGlzIGEgVjRMMiBjYW1lcmEgZHJpdmVyIGZvciB0aGUgT21uaVZpc2lvbiBPVjU2NDIgc2Vuc29yCisKIGNvbmZpZyBTT0NfQ0FNRVJBX09WNjY1MAogCXRyaXN0YXRlICJvdjY2NTAgc2Vuc29yIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTT0NfQ0FNRVJBICYmIEkyQwpAQCAtOTUyLDYgKzk2MCwxNCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgczVwLWZpbWMuCiAKK2NvbmZpZyBWSURFT19BVE1FTF9JU0kKKwl0cmlzdGF0ZSAiQVRNRUwgSW1hZ2UgU2Vuc29yIEludGVyZmFjZSAoSVNJKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVklERU9fREVWICYmIFNPQ19DQU1FUkEgJiYgQVJDSF9BVDkxCisJc2VsZWN0IFZJREVPQlVGMl9ETUFfQ09OVElHCisJLS0taGVscC0tLQorCSAgVGhpcyBtb2R1bGUgbWFrZXMgdGhlIEFUTUVMIEltYWdlIFNlbnNvciBJbnRlcmZhY2UgYXZhaWxhYmxlCisJICBhcyBhIHY0bDIgZGV2aWNlLgorCiBjb25maWcgVklERU9fUzVQX01JUElfQ1NJUwogCXRyaXN0YXRlICJTYW1zdW5nIFM1UCBhbmQgRVhZTk9TNCBNSVBJIENTSSByZWNlaXZlciBkcml2ZXIiCiAJZGVwZW5kcyBvbiBWSURFT19WNEwyICYmIFBNX1JVTlRJTUUgJiYgUExBVF9TNVAgJiYgVklERU9fVjRMMl9TVUJERVZfQVBJCkBAIC05NjEsNiArOTc3LDggQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHM1cC1jc2lzLgogCitzb3VyY2UgImRyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L0tjb25maWciCisKICMKICMgVVNCIE11bHRpbWVkaWEgZGV2aWNlIGNvbmZpZ3VyYXRpb24KICMKQEAgLTEwNTYsNCArMTA3NCwxMiBAQAogCSAgZnJhbWV3b3JrLgogCiAKK2NvbmZpZyBWSURFT19TQU1TVU5HX1M1UF9NRkMKKwl0cmlzdGF0ZSAiU2Ftc3VuZyBTNVAgTUZDIDUuMSBWaWRlbyBDb2RlYyIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBWSURFT19WNEwyICYmIFBMQVRfUzVQCisJc2VsZWN0IFZJREVPQlVGMl9ETUFfQ09OVElHCisJZGVmYXVsdCBuCisJaGVscAorCSAgICBNRkMgNS4xIGRyaXZlciBmb3IgVjRMMi4KKwogZW5kaWYgIyBWNExfTUVNMk1FTV9EUklWRVJTCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZQppbmRleCBmMGZlY2Q2Li4yNzIzOTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUKQEAgLTcwLDYgKzcwLDcgQEAKIG9iai0kKENPTkZJR19WSURFT19TUjAzMFBDMzApCSs9IHNyMDMwcGMzMC5vCiBvYmotJChDT05GSUdfVklERU9fTk9PTjAxMFBDMzApCSs9IG5vb24wMTBwYzMwLm8KIG9iai0kKENPTkZJR19WSURFT19NNU1PTFMpCSs9IG01bW9scy8KK29iai0kKENPTkZJR19WSURFT19BRFAxNjUzKQkrPSBhZHAxNjUzLm8KIAogb2JqLSQoQ09ORklHX1NPQ19DQU1FUkFfSU1YMDc0KQkJKz0gaW14MDc0Lm8KIG9iai0kKENPTkZJR19TT0NfQ0FNRVJBX01UOU0wMDEpCSs9IG10OW0wMDEubwpAQCAtNzgsNiArNzksNyBAQAogb2JqLSQoQ09ORklHX1NPQ19DQU1FUkFfTVQ5VDExMikJKz0gbXQ5dDExMi5vCiBvYmotJChDT05GSUdfU09DX0NBTUVSQV9NVDlWMDIyKQkrPSBtdDl2MDIyLm8KIG9iai0kKENPTkZJR19TT0NfQ0FNRVJBX09WMjY0MCkJCSs9IG92MjY0MC5vCitvYmotJChDT05GSUdfU09DX0NBTUVSQV9PVjU2NDIpCQkrPSBvdjU2NDIubwogb2JqLSQoQ09ORklHX1NPQ19DQU1FUkFfT1Y2NjUwKQkJKz0gb3Y2NjUwLm8KIG9iai0kKENPTkZJR19TT0NfQ0FNRVJBX09WNzcyWCkJCSs9IG92NzcyeC5vCiBvYmotJChDT05GSUdfU09DX0NBTUVSQV9PVjk2NDApCQkrPSBvdjk2NDAubwpAQCAtMTI3LDcgKzEyOSw4IEBACiAKIG9iai0kKENPTkZJR19WSURFT19DWDIzNDFYKSArPSBjeDIzNDF4Lm8KIAotb2JqLSQoQ09ORklHX1ZJREVPX0NBRkVfQ0NJQykgKz0gY2FmZV9jY2ljLm8KK29iai0kKENPTkZJR19WSURFT19DQUZFX0NDSUMpICs9IG1hcnZlbGwtY2NpYy8KK29iai0kKENPTkZJR19WSURFT19NTVBfQ0FNRVJBKSArPSBtYXJ2ZWxsLWNjaWMvCiAKIG9iai0kKENPTkZJR19WSURFT19WSUFfQ0FNRVJBKSArPSB2aWEtY2FtZXJhLm8KIApAQCAtMTY2LDggKzE2OSwxMSBAQAogb2JqLSQoQ09ORklHX1ZJREVPX1NIX01PQklMRV9DU0kyKQkrPSBzaF9tb2JpbGVfY3NpMi5vCiBvYmotJChDT05GSUdfVklERU9fU0hfTU9CSUxFX0NFVSkJKz0gc2hfbW9iaWxlX2NldV9jYW1lcmEubwogb2JqLSQoQ09ORklHX1ZJREVPX09NQVAxKQkJKz0gb21hcDFfY2FtZXJhLm8KK29iai0kKENPTkZJR19WSURFT19BVE1FTF9JU0kpCQkrPSBhdG1lbC1pc2kubwogCiBvYmotJChDT05GSUdfVklERU9fU0FNU1VOR19TNVBfRklNQykgCSs9IHM1cC1maW1jLworb2JqLSQoQ09ORklHX1ZJREVPX1NBTVNVTkdfUzVQX01GQykJKz0gczVwLW1mYy8KK29iai0kKENPTkZJR19WSURFT19TQU1TVU5HX1M1UF9UVikJKz0gczVwLXR2LwogCiBvYmotJChDT05GSUdfQVJDSF9EQVZJTkNJKQkJKz0gZGF2aW5jaS8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9hZHAxNjUzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkcDE2NTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTdiZWZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9hZHAxNjUzLmMKQEAgLTAsMCArMSw0OTEgQEAKKy8qCisgKiBkcml2ZXJzL21lZGlhL3ZpZGVvL2FkcDE2NTMuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0tMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIENvbnRhY3Q6IFNha2FyaSBBaWx1cyA8c2FrYXJpLmFpbHVzQG1heHdlbGwucmVzZWFyY2gubm9raWEuY29tPgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqCVNha2FyaSBBaWx1cyA8c2FrYXJpLmFpbHVzQG1heHdlbGwucmVzZWFyY2gubm9raWEuY29tPgorICoJVHV1a2thIFRvaXZvbmVuIDx0dXVra2F0NzZAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqCisgKiBUT0RPOgorICogLSBmYXVsdCBpbnRlcnJ1cHQgaGFuZGxpbmcKKyAqIC0gaGFyZHdhcmUgc3Ryb2JlCisgKiAtIHBvd2VyIGRvZXNuJ3QgbmVlZCB0byBiZSBPTiBpZiBhbGwgbGlnaHRzIGFyZSBvZmYKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9hZHAxNjUzLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKworI2RlZmluZSBUSU1FT1VUX01BWAkJODIwMDAwCisjZGVmaW5lIFRJTUVPVVRfU1RFUAkJNTQ2MDAKKyNkZWZpbmUgVElNRU9VVF9NSU4JCShUSU1FT1VUX01BWCAtIEFEUDE2NTNfUkVHX0NPTkZJR19UTVJfU0VUX01BWCBcCisJCQkJICogVElNRU9VVF9TVEVQKQorI2RlZmluZSBUSU1FT1VUX1VTX1RPX0NPREUodCkJKChUSU1FT1VUX01BWCArIChUSU1FT1VUX1NURVAgLyAyKSAtICh0KSkgXAorCQkJCSAvIFRJTUVPVVRfU1RFUCkKKyNkZWZpbmUgVElNRU9VVF9DT0RFX1RPX1VTKGMpCShUSU1FT1VUX01BWCAtIChjKSAqIFRJTUVPVVRfU1RFUCkKKworLyogV3JpdGUgdmFsdWVzIGludG8gQURQMTY1MyByZWdpc3RlcnMuICovCitzdGF0aWMgaW50IGFkcDE2NTNfdXBkYXRlX2h3KHN0cnVjdCBhZHAxNjUzX2ZsYXNoICpmbGFzaCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmZmxhc2gtPnN1YmRldik7CisJdTggb3V0X3NlbDsKKwl1OCBjb25maWcgPSAwOworCWludCBydmFsOworCisJb3V0X3NlbCA9IEFEUDE2NTNfSU5ESUNBVE9SX0lOVEVOU0lUWV91QV9UT19SRUcoCisJCWZsYXNoLT5pbmRpY2F0b3JfaW50ZW5zaXR5LT52YWwpCisJCTw8IEFEUDE2NTNfUkVHX09VVF9TRUxfSUxFRF9TSElGVDsKKworCXN3aXRjaCAoZmxhc2gtPmxlZF9tb2RlLT52YWwpIHsKKwljYXNlIFY0TDJfRkxBU0hfTEVEX01PREVfTk9ORToKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0ZMQVNIX0xFRF9NT0RFX0ZMQVNIOgorCQkvKiBGbGFzaCBtb2RlLCBsaWdodCBvbiB3aXRoIHN0cm9iZSwgZHVyYXRpb24gZnJvbSB0aW1lciAqLworCQljb25maWcgPSBBRFAxNjUzX1JFR19DT05GSUdfVE1SX0NGRzsKKwkJY29uZmlnIHw9IFRJTUVPVVRfVVNfVE9fQ09ERShmbGFzaC0+Zmxhc2hfdGltZW91dC0+dmFsKQorCQkJICA8PCBBRFAxNjUzX1JFR19DT05GSUdfVE1SX1NFVF9TSElGVDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0ZMQVNIX0xFRF9NT0RFX1RPUkNIOgorCQkvKiBUb3JjaCBtb2RlLCBsaWdodCBpbW1lZGlhdGVseSBvbiwgZHVyYXRpb24gaW5kZWZpbml0ZSAqLworCQlvdXRfc2VsIHw9IEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX21BX1RPX1JFRygKKwkJCWZsYXNoLT50b3JjaF9pbnRlbnNpdHktPnZhbCkKKwkJCTw8IEFEUDE2NTNfUkVHX09VVF9TRUxfSFBMRURfU0hJRlQ7CisJCWJyZWFrOworCX0KKworCXJ2YWwgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURQMTY1M19SRUdfT1VUX1NFTCwgb3V0X3NlbCk7CisJaWYgKHJ2YWwgPCAwKQorCQlyZXR1cm4gcnZhbDsKKworCXJ2YWwgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURQMTY1M19SRUdfQ09ORklHLCBjb25maWcpOworCWlmIChydmFsIDwgMCkKKwkJcmV0dXJuIHJ2YWw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHAxNjUzX2dldF9mYXVsdChzdHJ1Y3QgYWRwMTY1M19mbGFzaCAqZmxhc2gpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJmZsYXNoLT5zdWJkZXYpOworCWludCBmYXVsdDsKKwlpbnQgcnZhbDsKKworCWZhdWx0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQURQMTY1M19SRUdfRkFVTFQpOworCWlmIChJU19FUlJfVkFMVUUoZmF1bHQpKQorCQlyZXR1cm4gZmF1bHQ7CisKKwlmbGFzaC0+ZmF1bHQgfD0gZmF1bHQ7CisKKwlpZiAoIWZsYXNoLT5mYXVsdCkKKwkJcmV0dXJuIDA7CisKKwkvKiBDbGVhciBmYXVsdHMuICovCisJcnZhbCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFAxNjUzX1JFR19PVVRfU0VMLCAwKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJ2YWwpKQorCQlyZXR1cm4gcnZhbDsKKworCWZsYXNoLT5sZWRfbW9kZS0+dmFsID0gVjRMMl9GTEFTSF9MRURfTU9ERV9OT05FOworCisJcnZhbCA9IGFkcDE2NTNfdXBkYXRlX2h3KGZsYXNoKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJ2YWwpKQorCQlyZXR1cm4gcnZhbDsKKworCXJldHVybiBmbGFzaC0+ZmF1bHQ7Cit9CisKK3N0YXRpYyBpbnQgYWRwMTY1M19zdHJvYmUoc3RydWN0IGFkcDE2NTNfZmxhc2ggKmZsYXNoLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZmbGFzaC0+c3ViZGV2KTsKKwl1OCBvdXRfc2VsID0gQURQMTY1M19JTkRJQ0FUT1JfSU5URU5TSVRZX3VBX1RPX1JFRygKKwkJZmxhc2gtPmluZGljYXRvcl9pbnRlbnNpdHktPnZhbCkKKwkJPDwgQURQMTY1M19SRUdfT1VUX1NFTF9JTEVEX1NISUZUOworCWludCBydmFsOworCisJaWYgKGZsYXNoLT5sZWRfbW9kZS0+dmFsICE9IFY0TDJfRkxBU0hfTEVEX01PREVfRkxBU0gpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoIWVuYWJsZSkKKwkJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFAxNjUzX1JFR19PVVRfU0VMLAorCQkJCQkJIG91dF9zZWwpOworCisJb3V0X3NlbCB8PSBBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9tQV9UT19SRUcoCisJCWZsYXNoLT5mbGFzaF9pbnRlbnNpdHktPnZhbCkKKwkJPDwgQURQMTY1M19SRUdfT1VUX1NFTF9IUExFRF9TSElGVDsKKwlydmFsID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEUDE2NTNfUkVHX09VVF9TRUwsIG91dF9zZWwpOworCWlmIChydmFsKQorCQlyZXR1cm4gcnZhbDsKKworCS8qIFNvZnR3YXJlIHN0cm9iZSB1c2luZyBpMmMgKi8KKwlydmFsID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEUDE2NTNfUkVHX1NXX1NUUk9CRSwKKwkJQURQMTY1M19SRUdfU1dfU1RST0JFX1NXX1NUUk9CRSk7CisJaWYgKHJ2YWwpCisJCXJldHVybiBydmFsOworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURQMTY1M19SRUdfU1dfU1RST0JFLCAwKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFY0TDIgY29udHJvbHMKKyAqLworCitzdGF0aWMgaW50IGFkcDE2NTNfZ2V0X2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKK3sKKwlzdHJ1Y3QgYWRwMTY1M19mbGFzaCAqZmxhc2ggPQorCQljb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwgc3RydWN0IGFkcDE2NTNfZmxhc2gsIGN0cmxzKTsKKwlpbnQgcnZhbDsKKworCXJ2YWwgPSBhZHAxNjUzX2dldF9mYXVsdChmbGFzaCk7CisJaWYgKElTX0VSUl9WQUxVRShydmFsKSkKKwkJcmV0dXJuIHJ2YWw7CisKKwljdHJsLT5jdXIudmFsID0gMDsKKworCWlmIChmbGFzaC0+ZmF1bHQgJiBBRFAxNjUzX1JFR19GQVVMVF9GTFRfU0NQKQorCQljdHJsLT5jdXIudmFsIHw9IFY0TDJfRkxBU0hfRkFVTFRfU0hPUlRfQ0lSQ1VJVDsKKwlpZiAoZmxhc2gtPmZhdWx0ICYgQURQMTY1M19SRUdfRkFVTFRfRkxUX09UKQorCQljdHJsLT5jdXIudmFsIHw9IFY0TDJfRkxBU0hfRkFVTFRfT1ZFUl9URU1QRVJBVFVSRTsKKwlpZiAoZmxhc2gtPmZhdWx0ICYgQURQMTY1M19SRUdfRkFVTFRfRkxUX1RNUikKKwkJY3RybC0+Y3VyLnZhbCB8PSBWNEwyX0ZMQVNIX0ZBVUxUX1RJTUVPVVQ7CisJaWYgKGZsYXNoLT5mYXVsdCAmIEFEUDE2NTNfUkVHX0ZBVUxUX0ZMVF9PVikKKwkJY3RybC0+Y3VyLnZhbCB8PSBWNEwyX0ZMQVNIX0ZBVUxUX09WRVJfVk9MVEFHRTsKKworCWZsYXNoLT5mYXVsdCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZHAxNjUzX3NldF9jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCit7CisJc3RydWN0IGFkcDE2NTNfZmxhc2ggKmZsYXNoID0KKwkJY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsIHN0cnVjdCBhZHAxNjUzX2ZsYXNoLCBjdHJscyk7CisJaW50IHJ2YWw7CisKKwlydmFsID0gYWRwMTY1M19nZXRfZmF1bHQoZmxhc2gpOworCWlmIChJU19FUlJfVkFMVUUocnZhbCkpCisJCXJldHVybiBydmFsOworCWlmICgocnZhbCAmIChBRFAxNjUzX1JFR19GQVVMVF9GTFRfU0NQIHwKKwkJICAgICBBRFAxNjUzX1JFR19GQVVMVF9GTFRfT1QgfAorCQkgICAgIEFEUDE2NTNfUkVHX0ZBVUxUX0ZMVF9PVikpICYmCisJICAgIChjdHJsLT5pZCA9PSBWNEwyX0NJRF9GTEFTSF9TVFJPQkUgfHwKKwkgICAgIGN0cmwtPmlkID09IFY0TDJfQ0lEX0ZMQVNIX1RPUkNIX0lOVEVOU0lUWSB8fAorCSAgICAgY3RybC0+aWQgPT0gVjRMMl9DSURfRkxBU0hfTEVEX01PREUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfRkxBU0hfU1RST0JFOgorCQlyZXR1cm4gYWRwMTY1M19zdHJvYmUoZmxhc2gsIDEpOworCWNhc2UgVjRMMl9DSURfRkxBU0hfU1RST0JFX1NUT1A6CisJCXJldHVybiBhZHAxNjUzX3N0cm9iZShmbGFzaCwgMCk7CisJfQorCisJcmV0dXJuIGFkcDE2NTNfdXBkYXRlX2h3KGZsYXNoKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfb3BzIGFkcDE2NTNfY3RybF9vcHMgPSB7CisJLmdfdm9sYXRpbGVfY3RybCA9IGFkcDE2NTNfZ2V0X2N0cmwsCisJLnNfY3RybCA9IGFkcDE2NTNfc2V0X2N0cmwsCit9OworCitzdGF0aWMgaW50IGFkcDE2NTNfaW5pdF9jb250cm9scyhzdHJ1Y3QgYWRwMTY1M19mbGFzaCAqZmxhc2gpCit7CisJc3RydWN0IHY0bDJfY3RybCAqZmF1bHQ7CisKKwl2NGwyX2N0cmxfaGFuZGxlcl9pbml0KCZmbGFzaC0+Y3RybHMsIDkpOworCisJZmxhc2gtPmxlZF9tb2RlID0KKwkJdjRsMl9jdHJsX25ld19zdGRfbWVudSgmZmxhc2gtPmN0cmxzLCAmYWRwMTY1M19jdHJsX29wcywKKwkJCQkgICAgICAgVjRMMl9DSURfRkxBU0hfTEVEX01PREUsCisJCQkJICAgICAgIFY0TDJfRkxBU0hfTEVEX01PREVfVE9SQ0gsIH4weDcsIDApOworCXY0bDJfY3RybF9uZXdfc3RkX21lbnUoJmZsYXNoLT5jdHJscywgJmFkcDE2NTNfY3RybF9vcHMsCisJCQkgICAgICAgVjRMMl9DSURfRkxBU0hfU1RST0JFX1NPVVJDRSwKKwkJCSAgICAgICBWNEwyX0ZMQVNIX1NUUk9CRV9TT1VSQ0VfU09GVFdBUkUsIH4weDEsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKCZmbGFzaC0+Y3RybHMsICZhZHAxNjUzX2N0cmxfb3BzLAorCQkJICBWNEwyX0NJRF9GTEFTSF9TVFJPQkUsIDAsIDAsIDAsIDApOworCXY0bDJfY3RybF9uZXdfc3RkKCZmbGFzaC0+Y3RybHMsICZhZHAxNjUzX2N0cmxfb3BzLAorCQkJICBWNEwyX0NJRF9GTEFTSF9TVFJPQkVfU1RPUCwgMCwgMCwgMCwgMCk7CisJZmxhc2gtPmZsYXNoX3RpbWVvdXQgPQorCQl2NGwyX2N0cmxfbmV3X3N0ZCgmZmxhc2gtPmN0cmxzLCAmYWRwMTY1M19jdHJsX29wcywKKwkJCQkgIFY0TDJfQ0lEX0ZMQVNIX1RJTUVPVVQsIFRJTUVPVVRfTUlOLAorCQkJCSAgZmxhc2gtPnBsYXRmb3JtX2RhdGEtPm1heF9mbGFzaF90aW1lb3V0LAorCQkJCSAgVElNRU9VVF9TVEVQLAorCQkJCSAgZmxhc2gtPnBsYXRmb3JtX2RhdGEtPm1heF9mbGFzaF90aW1lb3V0KTsKKwlmbGFzaC0+Zmxhc2hfaW50ZW5zaXR5ID0KKwkJdjRsMl9jdHJsX25ld19zdGQoJmZsYXNoLT5jdHJscywgJmFkcDE2NTNfY3RybF9vcHMsCisJCQkJICBWNEwyX0NJRF9GTEFTSF9JTlRFTlNJVFksCisJCQkJICBBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9NSU4sCisJCQkJICBmbGFzaC0+cGxhdGZvcm1fZGF0YS0+bWF4X2ZsYXNoX2ludGVuc2l0eSwKKwkJCQkgIDEsIGZsYXNoLT5wbGF0Zm9ybV9kYXRhLT5tYXhfZmxhc2hfaW50ZW5zaXR5KTsKKwlmbGFzaC0+dG9yY2hfaW50ZW5zaXR5ID0KKwkJdjRsMl9jdHJsX25ld19zdGQoJmZsYXNoLT5jdHJscywgJmFkcDE2NTNfY3RybF9vcHMsCisJCQkJICBWNEwyX0NJRF9GTEFTSF9UT1JDSF9JTlRFTlNJVFksCisJCQkJICBBRFAxNjUzX1RPUkNIX0lOVEVOU0lUWV9NSU4sCisJCQkJICBmbGFzaC0+cGxhdGZvcm1fZGF0YS0+bWF4X3RvcmNoX2ludGVuc2l0eSwKKwkJCQkgIEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX1NURVAsCisJCQkJICBmbGFzaC0+cGxhdGZvcm1fZGF0YS0+bWF4X3RvcmNoX2ludGVuc2l0eSk7CisJZmxhc2gtPmluZGljYXRvcl9pbnRlbnNpdHkgPQorCQl2NGwyX2N0cmxfbmV3X3N0ZCgmZmxhc2gtPmN0cmxzLCAmYWRwMTY1M19jdHJsX29wcywKKwkJCQkgIFY0TDJfQ0lEX0ZMQVNIX0lORElDQVRPUl9JTlRFTlNJVFksCisJCQkJICBBRFAxNjUzX0lORElDQVRPUl9JTlRFTlNJVFlfTUlOLAorCQkJCSAgZmxhc2gtPnBsYXRmb3JtX2RhdGEtPm1heF9pbmRpY2F0b3JfaW50ZW5zaXR5LAorCQkJCSAgQURQMTY1M19JTkRJQ0FUT1JfSU5URU5TSVRZX1NURVAsCisJCQkJICBBRFAxNjUzX0lORElDQVRPUl9JTlRFTlNJVFlfTUlOKTsKKwlmYXVsdCA9IHY0bDJfY3RybF9uZXdfc3RkKCZmbGFzaC0+Y3RybHMsICZhZHAxNjUzX2N0cmxfb3BzLAorCQkJCSAgVjRMMl9DSURfRkxBU0hfRkFVTFQsIDAsCisJCQkJICBWNEwyX0ZMQVNIX0ZBVUxUX09WRVJfVk9MVEFHRQorCQkJCSAgfCBWNEwyX0ZMQVNIX0ZBVUxUX09WRVJfVEVNUEVSQVRVUkUKKwkJCQkgIHwgVjRMMl9GTEFTSF9GQVVMVF9TSE9SVF9DSVJDVUlULCAwLCAwKTsKKworCWlmIChmbGFzaC0+Y3RybHMuZXJyb3IpCisJCXJldHVybiBmbGFzaC0+Y3RybHMuZXJyb3I7CisKKwlmYXVsdC0+aXNfdm9sYXRpbGUgPSAxOworCisJZmxhc2gtPnN1YmRldi5jdHJsX2hhbmRsZXIgPSAmZmxhc2gtPmN0cmxzOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVjRMMiBzdWJkZXYgb3BlcmF0aW9ucworICovCisKK3N0YXRpYyBpbnQKK2FkcDE2NTNfaW5pdF9kZXZpY2Uoc3RydWN0IGFkcDE2NTNfZmxhc2ggKmZsYXNoKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZmbGFzaC0+c3ViZGV2KTsKKwlpbnQgcnZhbDsKKworCS8qIENsZWFyIEZBVUxUIHJlZ2lzdGVyIGJ5IHdyaXRpbmcgemVybyB0byBPVVRfU0VMICovCisJcnZhbCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFAxNjUzX1JFR19PVVRfU0VMLCAwKTsKKwlpZiAocnZhbCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgd3JpdGluZyBmYXVsdCByZWdpc3RlclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCW11dGV4X2xvY2soJmZsYXNoLT5jdHJscy5sb2NrKTsKKwkvKiBSZXNldCBmYXVsdHMgYmVmb3JlIHJlYWRpbmcgbmV3IG9uZXMuICovCisJZmxhc2gtPmZhdWx0ID0gMDsKKwlydmFsID0gYWRwMTY1M19nZXRfZmF1bHQoZmxhc2gpOworCW11dGV4X3VubG9jaygmZmxhc2gtPmN0cmxzLmxvY2spOworCWlmIChydmFsID4gMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhdWx0cyBkZXRlY3RlZDogMHglMS4xeFxuIiwgcnZhbCk7CisJCXJldHVybiAtRUlPOworCX0KKworCW11dGV4X2xvY2soJmZsYXNoLT5jdHJscy5sb2NrKTsKKwlydmFsID0gYWRwMTY1M191cGRhdGVfaHcoZmxhc2gpOworCW11dGV4X3VubG9jaygmZmxhc2gtPmN0cmxzLmxvY2spOworCWlmIChydmFsKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJImFkcDE2NTNfdXBkYXRlX2h3IGZhaWxlZCBhdCAlc1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorX19hZHAxNjUzX3NldF9wb3dlcihzdHJ1Y3QgYWRwMTY1M19mbGFzaCAqZmxhc2gsIGludCBvbikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZmxhc2gtPnBsYXRmb3JtX2RhdGEtPnBvd2VyKCZmbGFzaC0+c3ViZGV2LCBvbik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoIW9uKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGFkcDE2NTNfaW5pdF9kZXZpY2UoZmxhc2gpOworCWlmIChyZXQgPCAwKQorCQlmbGFzaC0+cGxhdGZvcm1fZGF0YS0+cG93ZXIoJmZsYXNoLT5zdWJkZXYsIDApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorYWRwMTY1M19zZXRfcG93ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsIGludCBvbikKK3sKKwlzdHJ1Y3QgYWRwMTY1M19mbGFzaCAqZmxhc2ggPSB0b19hZHAxNjUzX2ZsYXNoKHN1YmRldik7CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZmbGFzaC0+cG93ZXJfbG9jayk7CisKKwkvKiBJZiB0aGUgcG93ZXIgY291bnQgaXMgbW9kaWZpZWQgZnJvbSAwIHRvICE9IDAgb3IgZnJvbSAhPSAwIHRvIDAsCisJICogdXBkYXRlIHRoZSBwb3dlciBzdGF0ZS4KKwkgKi8KKwlpZiAoZmxhc2gtPnBvd2VyX2NvdW50ID09ICFvbikgeworCQlyZXQgPSBfX2FkcDE2NTNfc2V0X3Bvd2VyKGZsYXNoLCAhIW9uKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGRvbmU7CisJfQorCisJLyogVXBkYXRlIHRoZSBwb3dlciBjb3VudC4gKi8KKwlmbGFzaC0+cG93ZXJfY291bnQgKz0gb24gPyAxIDogLTE7CisJV0FSTl9PTihmbGFzaC0+cG93ZXJfY291bnQgPCAwKTsKKworZG9uZToKKwltdXRleF91bmxvY2soJmZsYXNoLT5wb3dlcl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkcDE2NTNfb3BlbihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoKQoreworCXJldHVybiBhZHAxNjUzX3NldF9wb3dlcihzZCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgYWRwMTY1M19jbG9zZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9zdWJkZXZfZmggKmZoKQoreworCXJldHVybiBhZHAxNjUzX3NldF9wb3dlcihzZCwgMCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgYWRwMTY1M19jb3JlX29wcyA9IHsKKwkuc19wb3dlciA9IGFkcDE2NTNfc2V0X3Bvd2VyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgYWRwMTY1M19vcHMgPSB7CisJLmNvcmUgPSAmYWRwMTY1M19jb3JlX29wcywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfaW50ZXJuYWxfb3BzIGFkcDE2NTNfaW50ZXJuYWxfb3BzID0geworCS5vcGVuID0gYWRwMTY1M19vcGVuLAorCS5jbG9zZSA9IGFkcDE2NTNfY2xvc2UsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogSTJDIGRyaXZlcgorICovCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgYWRwMTY1M19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGFkcDE2NTNfZmxhc2ggKmZsYXNoID0gdG9fYWRwMTY1M19mbGFzaChzdWJkZXYpOworCisJaWYgKCFmbGFzaC0+cG93ZXJfY291bnQpCisJCXJldHVybiAwOworCisJcmV0dXJuIF9fYWRwMTY1M19zZXRfcG93ZXIoZmxhc2gsIDApOworfQorCitzdGF0aWMgaW50IGFkcDE2NTNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGFkcDE2NTNfZmxhc2ggKmZsYXNoID0gdG9fYWRwMTY1M19mbGFzaChzdWJkZXYpOworCisJaWYgKCFmbGFzaC0+cG93ZXJfY291bnQpCisJCXJldHVybiAwOworCisJcmV0dXJuIF9fYWRwMTY1M19zZXRfcG93ZXIoZmxhc2gsIDEpOworfQorCisjZWxzZQorCisjZGVmaW5lIGFkcDE2NTNfc3VzcGVuZAlOVUxMCisjZGVmaW5lIGFkcDE2NTNfcmVzdW1lCU5VTEwKKworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgaW50IGFkcDE2NTNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqZGV2aWQpCit7CisJc3RydWN0IGFkcDE2NTNfZmxhc2ggKmZsYXNoOworCWludCByZXQ7CisKKwlmbGFzaCA9IGt6YWxsb2Moc2l6ZW9mKCpmbGFzaCksIEdGUF9LRVJORUwpOworCWlmIChmbGFzaCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZsYXNoLT5wbGF0Zm9ybV9kYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCW11dGV4X2luaXQoJmZsYXNoLT5wb3dlcl9sb2NrKTsKKworCXY0bDJfaTJjX3N1YmRldl9pbml0KCZmbGFzaC0+c3ViZGV2LCBjbGllbnQsICZhZHAxNjUzX29wcyk7CisJZmxhc2gtPnN1YmRldi5pbnRlcm5hbF9vcHMgPSAmYWRwMTY1M19pbnRlcm5hbF9vcHM7CisJZmxhc2gtPnN1YmRldi5mbGFncyB8PSBWNEwyX1NVQkRFVl9GTF9IQVNfREVWTk9ERTsKKworCWFkcDE2NTNfaW5pdF9jb250cm9scyhmbGFzaCk7CisKKwlyZXQgPSBtZWRpYV9lbnRpdHlfaW5pdCgmZmxhc2gtPnN1YmRldi5lbnRpdHksIDAsIE5VTEwsIDApOworCWlmIChyZXQgPCAwKQorCQlrZnJlZShmbGFzaCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCBhZHAxNjUzX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGFkcDE2NTNfZmxhc2ggKmZsYXNoID0gdG9fYWRwMTY1M19mbGFzaChzdWJkZXYpOworCisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcl9zdWJkZXYoJmZsYXNoLT5zdWJkZXYpOworCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJmZsYXNoLT5jdHJscyk7CisJbWVkaWFfZW50aXR5X2NsZWFudXAoJmZsYXNoLT5zdWJkZXYuZW50aXR5KTsKKwlrZnJlZShmbGFzaCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZHAxNjUzX2lkX3RhYmxlW10gPSB7CisJeyBBRFAxNjUzX05BTUUsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWRwMTY1M19pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZGV2X3BtX29wcyBhZHAxNjUzX3BtX29wcyA9IHsKKwkuc3VzcGVuZAk9IGFkcDE2NTNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGFkcDE2NTNfcmVzdW1lLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkcDE2NTNfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBBRFAxNjUzX05BTUUsCisJCS5wbQk9ICZhZHAxNjUzX3BtX29wcywKKwl9LAorCS5wcm9iZQkJPSBhZHAxNjUzX3Byb2JlLAorCS5yZW1vdmUJCT0gX19leGl0X3AoYWRwMTY1M19yZW1vdmUpLAorCS5pZF90YWJsZQk9IGFkcDE2NTNfaWRfdGFibGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZHAxNjUzX2luaXQodm9pZCkKK3sKKwlpbnQgcnZhbDsKKworCXJ2YWwgPSBpMmNfYWRkX2RyaXZlcigmYWRwMTY1M19pMmNfZHJpdmVyKTsKKwlpZiAocnZhbCkKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIiVzOiBmYWlsZWQgYXQgaTJjX2FkZF9kcml2ZXJcbiIsIF9fZnVuY19fKTsKKworCXJldHVybiBydmFsOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWRwMTY1M19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmFkcDE2NTNfaTJjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFkcDE2NTNfaW5pdCk7Cittb2R1bGVfZXhpdChhZHAxNjUzX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTYWthcmkgQWlsdXMgPHNha2FyaS5haWx1c0Bub2tpYS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFEUDE2NTMgTEVEIGZsYXNoIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9hcnYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXJ2LmMKaW5kZXggZjk4OWYyOC4uYjZlZDQ0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9hcnYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2Fydi5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgpAQCAtNTQsNyArNTMsNyBAQAogICovCiAjZGVmaW5lIFVTRV9JTlQJCTAJLyogRG9uJ3QgbW9kaWZ5ICovCiAKLSNkZWZpbmUgVkVSU0lPTgkiMC4wNCIKKyNkZWZpbmUgVkVSU0lPTgkiMC4wLjUiCiAKICNkZWZpbmUgYXJfaW5sKGFkZHIpIAkJaW5sKCh1bnNpZ25lZCBsb25nKShhZGRyKSkKICNkZWZpbmUgYXJfb3V0bCh2YWwsIGFkZHIpCW91dGwoKHVuc2lnbmVkIGxvbmcpKHZhbCksICh1bnNpZ25lZCBsb25nKShhZGRyKSkKQEAgLTQwNCw3ICs0MDMsNiBAQAogCXN0cmxjcHkodmNhcC0+ZHJpdmVyLCBhci0+dmRldi5uYW1lLCBzaXplb2YodmNhcC0+ZHJpdmVyKSk7CiAJc3RybGNweSh2Y2FwLT5jYXJkLCAiQ29sb3VyIEFSIFZHQSIsIHNpemVvZih2Y2FwLT5jYXJkKSk7CiAJc3RybGNweSh2Y2FwLT5idXNfaW5mbywgIlBsYXRmb3JtIiwgc2l6ZW9mKHZjYXAtPmJ1c19pbmZvKSk7Ci0JdmNhcC0+dmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKDAsIDAsIDQpOwogCXZjYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9SRUFEV1JJVEU7CiAJcmV0dXJuIDA7CiB9CkBAIC04NzksMyArODc3LDQgQEAKIE1PRFVMRV9BVVRIT1IoIlRha2VvIFRha2FoYXNoaSA8dGFrYWhhc2hpLnRha2VvQHJlbmVzYXMuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJDb2xvdXIgQVIgTTY0Mjc4KFZHQSkgZm9yIFZpZGVvNExpbnV4Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihWRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXRtZWwtaXNpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2F0bWVsLWlzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiODlmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2F0bWVsLWlzaS5jCkBAIC0wLDAgKzEsMTA0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBBdG1lbCBDb3Jwb3JhdGlvbgorICogSm9zaCBXdSwgPGpvc2gud3VAYXRtZWwuY29tPgorICoKKyAqIEJhc2VkIG9uIHByZXZpb3VzIHdvcmsgYnkgTGFycyBIYXJpbmcsIDxsYXJzLmhhcmluZ0BhdG1lbC5jb20+CisgKiBhbmQgU2VkamkgR2FvdWFvdQorICogQmFzZWQgb24gdGhlIGJ0dHYgZHJpdmVyIGZvciBCdDg0OCB3aXRoIHJlc3BlY3RpdmUgY29weXJpZ2h0IGhvbGRlcnMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9hdG1lbC1pc2kuaD4KKyNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CisjaW5jbHVkZSA8bWVkaWEvc29jX21lZGlhYnVzLmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWRtYS1jb250aWcuaD4KKworI2RlZmluZSBNQVhfQlVGRkVSX05VTQkJCTMyCisjZGVmaW5lIE1BWF9TVVBQT1JUX1dJRFRICQkyMDQ4CisjZGVmaW5lIE1BWF9TVVBQT1JUX0hFSUdIVAkJMjA0OAorI2RlZmluZSBWSURfTElNSVRfQllURVMJCQkoMTYgKiAxMDI0ICogMTAyNCkKKyNkZWZpbmUgTUlOX0ZSQU1FX1JBVEUJCQkxNQorI2RlZmluZSBGUkFNRV9JTlRFUlZBTF9NSUxMSV9TRUMJKDEwMDAgLyBNSU5fRlJBTUVfUkFURSkKKworLyogSVNJIHN0YXRlcyAqLworZW51bSB7CisJSVNJX1NUQVRFX0lETEUgPSAwLAorCUlTSV9TVEFURV9SRUFEWSwKKwlJU0lfU1RBVEVfV0FJVF9TT0YsCit9OworCisvKiBGcmFtZSBidWZmZXIgZGVzY3JpcHRvciAqLworc3RydWN0IGZiZCB7CisJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgZnJhbWUgYnVmZmVyICovCisJdTMyIGZiX2FkZHJlc3M7CisJLyogRE1BIENvbnRyb2wgUmVnaXN0ZXIob25seSBpbiBISVNJMikgKi8KKwl1MzIgZG1hX2N0cmw7CisJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgbmV4dCBmYmQgKi8KKwl1MzIgbmV4dF9mYmRfYWRkcmVzczsKK307CisKK3N0YXRpYyB2b2lkIHNldF9kbWFfY3RybChzdHJ1Y3QgZmJkICpmYl9kZXNjLCB1MzIgY3RybCkKK3sKKwlmYl9kZXNjLT5kbWFfY3RybCA9IGN0cmw7Cit9CisKK3N0cnVjdCBpc2lfZG1hX2Rlc2MgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZmJkICpwX2ZiZDsKKwl1MzIgZmJkX3BoeXM7Cit9OworCisvKiBGcmFtZSBidWZmZXIgZGF0YSAqLworc3RydWN0IGZyYW1lX2J1ZmZlciB7CisJc3RydWN0IHZiMl9idWZmZXIgdmI7CisJc3RydWN0IGlzaV9kbWFfZGVzYyAqcF9kbWFfZGVzYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3QgYXRtZWxfaXNpIHsKKwkvKiBQcm90ZWN0cyB0aGUgYWNjZXNzIG9mIHZhcmlhYmxlcyBzaGFyZWQgd2l0aCB0aGUgSVNSICovCisJc3BpbmxvY2tfdAkJCWxvY2s7CisJdm9pZCBfX2lvbWVtCQkJKnJlZ3M7CisKKwlpbnQJCQkJc2VxdWVuY2U7CisJLyogU3RhdGUgb2YgdGhlIElTSSBtb2R1bGUgaW4gY2FwdHVyaW5nIG1vZGUgKi8KKwlpbnQJCQkJc3RhdGU7CisKKwkvKiBXYWl0IHF1ZXVlIGZvciB3YWl0aW5nIGZvciBTT0YgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAkJdnN5bmNfd3E7CisKKwlzdHJ1Y3QgdmIyX2FsbG9jX2N0eAkJKmFsbG9jX2N0eDsKKworCS8qIEFsbG9jYXRlIGRlc2NyaXB0b3JzIGZvciBkbWEgYnVmZmVyIHVzZSAqLworCXN0cnVjdCBmYmQJCQkqcF9mYl9kZXNjcmlwdG9yczsKKwl1MzIJCQkJZmJfZGVzY3JpcHRvcnNfcGh5czsKKwlzdHJ1Y3QJCQkJbGlzdF9oZWFkIGRtYV9kZXNjX2hlYWQ7CisJc3RydWN0IGlzaV9kbWFfZGVzYwkJZG1hX2Rlc2NbTUFYX0JVRkZFUl9OVU1dOworCisJc3RydWN0IGNvbXBsZXRpb24JCWNvbXBsZXRlOworCXN0cnVjdCBjbGsJCQkqcGNsazsKKwl1bnNpZ25lZCBpbnQJCQlpcnE7CisKKwlzdHJ1Y3QgaXNpX3BsYXRmb3JtX2RhdGEJKnBkYXRhOworCisJc3RydWN0IGxpc3RfaGVhZAkJdmlkZW9fYnVmZmVyX2xpc3Q7CisJc3RydWN0IGZyYW1lX2J1ZmZlcgkJKmFjdGl2ZTsKKworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZQkqaWNkOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QJCXNvY19ob3N0OworfTsKKworc3RhdGljIHZvaWQgaXNpX3dyaXRlbChzdHJ1Y3QgYXRtZWxfaXNpICppc2ksIHUzMiByZWcsIHUzMiB2YWwpCit7CisJd3JpdGVsKHZhbCwgaXNpLT5yZWdzICsgcmVnKTsKK30KK3N0YXRpYyB1MzIgaXNpX3JlYWRsKHN0cnVjdCBhdG1lbF9pc2kgKmlzaSwgdTMyIHJlZykKK3sKKwlyZXR1cm4gcmVhZGwoaXNpLT5yZWdzICsgcmVnKTsKK30KKworc3RhdGljIGludCBjb25maWd1cmVfZ2VvbWV0cnkoc3RydWN0IGF0bWVsX2lzaSAqaXNpLCB1MzIgd2lkdGgsCisJCQl1MzIgaGVpZ2h0LCBlbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgY29kZSkKK3sKKwl1MzIgY2ZnMiwgY3I7CisKKwlzd2l0Y2ggKGNvZGUpIHsKKwkvKiBZVVYsIGluY2x1ZGluZyBncmV5ICovCisJY2FzZSBWNEwyX01CVVNfRk1UX1k4XzFYODoKKwkJY3IgPSBJU0lfQ0ZHMl9HUkFZU0NBTEU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9NQlVTX0ZNVF9VWVZZOF8yWDg6CisJCWNyID0gSVNJX0NGRzJfWUNDX1NXQVBfTU9ERV8zOworCQlicmVhazsKKwljYXNlIFY0TDJfTUJVU19GTVRfVllVWThfMlg4OgorCQljciA9IElTSV9DRkcyX1lDQ19TV0FQX01PREVfMjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYODoKKwkJY3IgPSBJU0lfQ0ZHMl9ZQ0NfU1dBUF9NT0RFXzE7CisJCWJyZWFrOworCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZVllVOF8yWDg6CisJCWNyID0gSVNJX0NGRzJfWUNDX1NXQVBfREVGQVVMVDsKKwkJYnJlYWs7CisJLyogUkdCLCBUT0RPICovCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaXNpX3dyaXRlbChpc2ksIElTSV9DVFJMLCBJU0lfQ1RSTF9ESVMpOworCisJY2ZnMiA9IGlzaV9yZWFkbChpc2ksIElTSV9DRkcyKTsKKwljZmcyIHw9IGNyOworCS8qIFNldCB3aWR0aCAqLworCWNmZzIgJj0gfihJU0lfQ0ZHMl9JTV9IU0laRV9NQVNLKTsKKwljZmcyIHw9ICgod2lkdGggLSAxKSA8PCBJU0lfQ0ZHMl9JTV9IU0laRV9PRkZTRVQpICYKKwkJCUlTSV9DRkcyX0lNX0hTSVpFX01BU0s7CisJLyogU2V0IGhlaWdodCAqLworCWNmZzIgJj0gfihJU0lfQ0ZHMl9JTV9WU0laRV9NQVNLKTsKKwljZmcyIHw9ICgoaGVpZ2h0IC0gMSkgPDwgSVNJX0NGRzJfSU1fVlNJWkVfT0ZGU0VUKQorCQkJJiBJU0lfQ0ZHMl9JTV9WU0laRV9NQVNLOworCWlzaV93cml0ZWwoaXNpLCBJU0lfQ0ZHMiwgY2ZnMik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IGF0bWVsX2lzaV9oYW5kbGVfc3RyZWFtaW5nKHN0cnVjdCBhdG1lbF9pc2kgKmlzaSkKK3sKKwlpZiAoaXNpLT5hY3RpdmUpIHsKKwkJc3RydWN0IHZiMl9idWZmZXIgKnZiID0gJmlzaS0+YWN0aXZlLT52YjsKKwkJc3RydWN0IGZyYW1lX2J1ZmZlciAqYnVmID0gaXNpLT5hY3RpdmU7CisKKwkJbGlzdF9kZWxfaW5pdCgmYnVmLT5saXN0KTsKKwkJZG9fZ2V0dGltZW9mZGF5KCZ2Yi0+djRsMl9idWYudGltZXN0YW1wKTsKKwkJdmItPnY0bDJfYnVmLnNlcXVlbmNlID0gaXNpLT5zZXF1ZW5jZSsrOworCQl2YjJfYnVmZmVyX2RvbmUodmIsIFZCMl9CVUZfU1RBVEVfRE9ORSk7CisJfQorCisJaWYgKGxpc3RfZW1wdHkoJmlzaS0+dmlkZW9fYnVmZmVyX2xpc3QpKSB7CisJCWlzaS0+YWN0aXZlID0gTlVMTDsKKwl9IGVsc2UgeworCQkvKiBzdGFydCBuZXh0IGRtYSBmcmFtZS4gKi8KKwkJaXNpLT5hY3RpdmUgPSBsaXN0X2VudHJ5KGlzaS0+dmlkZW9fYnVmZmVyX2xpc3QubmV4dCwKKwkJCQkJc3RydWN0IGZyYW1lX2J1ZmZlciwgbGlzdCk7CisJCWlzaV93cml0ZWwoaXNpLCBJU0lfRE1BX0NfRFNDUiwKKwkJCWlzaS0+YWN0aXZlLT5wX2RtYV9kZXNjLT5mYmRfcGh5cyk7CisJCWlzaV93cml0ZWwoaXNpLCBJU0lfRE1BX0NfQ1RSTCwKKwkJCUlTSV9ETUFfQ1RSTF9GRVRDSCB8IElTSV9ETUFfQ1RSTF9ET05FKTsKKwkJaXNpX3dyaXRlbChpc2ksIElTSV9ETUFfQ0hFUiwgSVNJX0RNQV9DSFNSX0NfQ0gpOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIElTSSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lICovCitzdGF0aWMgaXJxcmV0dXJuX3QgaXNpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGF0bWVsX2lzaSAqaXNpID0gZGV2X2lkOworCXUzMiBzdGF0dXMsIG1hc2ssIHBlbmRpbmc7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CisKKwlzcGluX2xvY2soJmlzaS0+bG9jayk7CisKKwlzdGF0dXMgPSBpc2lfcmVhZGwoaXNpLCBJU0lfU1RBVFVTKTsKKwltYXNrID0gaXNpX3JlYWRsKGlzaSwgSVNJX0lOVE1BU0spOworCXBlbmRpbmcgPSBzdGF0dXMgJiBtYXNrOworCisJaWYgKHBlbmRpbmcgJiBJU0lfQ1RSTF9TUlNUKSB7CisJCWNvbXBsZXRlKCZpc2ktPmNvbXBsZXRlKTsKKwkJaXNpX3dyaXRlbChpc2ksIElTSV9JTlRESVMsIElTSV9DVFJMX1NSU1QpOworCQlyZXQgPSBJUlFfSEFORExFRDsKKwl9IGVsc2UgaWYgKHBlbmRpbmcgJiBJU0lfQ1RSTF9ESVMpIHsKKwkJY29tcGxldGUoJmlzaS0+Y29tcGxldGUpOworCQlpc2lfd3JpdGVsKGlzaSwgSVNJX0lOVERJUywgSVNJX0NUUkxfRElTKTsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJfSBlbHNlIHsKKwkJaWYgKChwZW5kaW5nICYgSVNJX1NSX1ZTWU5DKSAmJgorCQkJCShpc2ktPnN0YXRlID09IElTSV9TVEFURV9JRExFKSkgeworCQkJaXNpLT5zdGF0ZSA9IElTSV9TVEFURV9SRUFEWTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaXNpLT52c3luY193cSk7CisJCQlyZXQgPSBJUlFfSEFORExFRDsKKwkJfQorCQlpZiAobGlrZWx5KHBlbmRpbmcgJiBJU0lfU1JfQ1hGUl9ET05FKSkKKwkJCXJldCA9IGF0bWVsX2lzaV9oYW5kbGVfc3RyZWFtaW5nKGlzaSk7CisJfQorCisJc3Bpbl91bmxvY2soJmlzaS0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZQlXQUlUX0lTSV9SRVNFVAkJMQorI2RlZmluZQlXQUlUX0lTSV9ESVNBQkxFCTAKK3N0YXRpYyBpbnQgYXRtZWxfaXNpX3dhaXRfc3RhdHVzKHN0cnVjdCBhdG1lbF9pc2kgKmlzaSwgaW50IHdhaXRfcmVzZXQpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCS8qCisJICogVGhlIHJlc2V0IG9yIGRpc2FibGUgd2lsbCBvbmx5IHN1Y2NlZWQgaWYgd2UgaGF2ZSBhCisJICogcGl4ZWwgY2xvY2sgZnJvbSB0aGUgY2FtZXJhLgorCSAqLworCWluaXRfY29tcGxldGlvbigmaXNpLT5jb21wbGV0ZSk7CisKKwlpZiAod2FpdF9yZXNldCkgeworCQlpc2lfd3JpdGVsKGlzaSwgSVNJX0lOVEVOLCBJU0lfQ1RSTF9TUlNUKTsKKwkJaXNpX3dyaXRlbChpc2ksIElTSV9DVFJMLCBJU0lfQ1RSTF9TUlNUKTsKKwl9IGVsc2UgeworCQlpc2lfd3JpdGVsKGlzaSwgSVNJX0lOVEVOLCBJU0lfQ1RSTF9ESVMpOworCQlpc2lfd3JpdGVsKGlzaSwgSVNJX0NUUkwsIElTSV9DVFJMX0RJUyk7CisJfQorCisJdGltZW91dCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaXNpLT5jb21wbGV0ZSwKKwkJCW1zZWNzX3RvX2ppZmZpZXMoMTAwKSk7CisJaWYgKHRpbWVvdXQgPT0gMCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJVmlkZW9idWYgb3BlcmF0aW9ucworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqdnEsIHVuc2lnbmVkIGludCAqbmJ1ZmZlcnMsCisJCQkJdW5zaWduZWQgaW50ICpucGxhbmVzLCB1bnNpZ25lZCBsb25nIHNpemVzW10sCisJCQkJdm9pZCAqYWxsb2NfY3R4c1tdKQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gc29jX2NhbWVyYV9mcm9tX3ZiMnEodnEpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CisJc3RydWN0IGF0bWVsX2lzaSAqaXNpID0gaWNpLT5wcml2OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgcmV0LCBieXRlc19wZXJfbGluZTsKKworCS8qIFJlc2V0IElTSSAqLworCXJldCA9IGF0bWVsX2lzaV93YWl0X3N0YXR1cyhpc2ksIFdBSVRfSVNJX1JFU0VUKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGljZC0+cGFyZW50LCAiUmVzZXQgSVNJIHRpbWVkIG91dFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlpc2lfd3JpdGVsKGlzaSwgSVNJX0lOVERJUywgfjBVTCk7CisKKwlieXRlc19wZXJfbGluZSA9IHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKGljZC0+dXNlcl93aWR0aCwKKwkJCQkJCWljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10KTsKKworCWlmIChieXRlc19wZXJfbGluZSA8IDApCisJCXJldHVybiBieXRlc19wZXJfbGluZTsKKworCXNpemUgPSBieXRlc19wZXJfbGluZSAqIGljZC0+dXNlcl9oZWlnaHQ7CisKKwlpZiAoISpuYnVmZmVycyB8fCAqbmJ1ZmZlcnMgPiBNQVhfQlVGRkVSX05VTSkKKwkJKm5idWZmZXJzID0gTUFYX0JVRkZFUl9OVU07CisKKwlpZiAoc2l6ZSAqICpuYnVmZmVycyA+IFZJRF9MSU1JVF9CWVRFUykKKwkJKm5idWZmZXJzID0gVklEX0xJTUlUX0JZVEVTIC8gc2l6ZTsKKworCSpucGxhbmVzID0gMTsKKwlzaXplc1swXSA9IHNpemU7CisJYWxsb2NfY3R4c1swXSA9IGlzaS0+YWxsb2NfY3R4OworCisJaXNpLT5zZXF1ZW5jZSA9IDA7CisJaXNpLT5hY3RpdmUgPSBOVUxMOworCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIiVzLCBjb3VudD0lZCwgc2l6ZT0lbGRcbiIsIF9fZnVuY19fLAorCQkqbmJ1ZmZlcnMsIHNpemUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnVmZmVyX2luaXQoc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBmcmFtZV9idWZmZXIgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IGZyYW1lX2J1ZmZlciwgdmIpOworCisJYnVmLT5wX2RtYV9kZXNjID0gTlVMTDsKKwlJTklUX0xJU1RfSEVBRCgmYnVmLT5saXN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ1ZmZlcl9wcmVwYXJlKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHNvY19jYW1lcmFfZnJvbV92YjJxKHZiLT52YjJfcXVldWUpOworCXN0cnVjdCBmcmFtZV9idWZmZXIgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IGZyYW1lX2J1ZmZlciwgdmIpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CisJc3RydWN0IGF0bWVsX2lzaSAqaXNpID0gaWNpLT5wcml2OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlzdHJ1Y3QgaXNpX2RtYV9kZXNjICpkZXNjOworCWludCBieXRlc19wZXJfbGluZSA9IHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKGljZC0+dXNlcl93aWR0aCwKKwkJCQkJCWljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10KTsKKworCWlmIChieXRlc19wZXJfbGluZSA8IDApCisJCXJldHVybiBieXRlc19wZXJfbGluZTsKKworCXNpemUgPSBieXRlc19wZXJfbGluZSAqIGljZC0+dXNlcl9oZWlnaHQ7CisKKwlpZiAodmIyX3BsYW5lX3NpemUodmIsIDApIDwgc2l6ZSkgeworCQlkZXZfZXJyKGljZC0+cGFyZW50LCAiJXMgZGF0YSB3aWxsIG5vdCBmaXQgaW50byBwbGFuZSAoJWx1IDwgJWx1KVxuIiwKKwkJCQlfX2Z1bmNfXywgdmIyX3BsYW5lX3NpemUodmIsIDApLCBzaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdmIyX3NldF9wbGFuZV9wYXlsb2FkKCZidWYtPnZiLCAwLCBzaXplKTsKKworCWlmICghYnVmLT5wX2RtYV9kZXNjKSB7CisJCWlmIChsaXN0X2VtcHR5KCZpc2ktPmRtYV9kZXNjX2hlYWQpKSB7CisJCQlkZXZfZXJyKGljZC0+cGFyZW50LCAiTm90IGVub3VnaCBkbWEgZGVzY3JpcHRvcnMuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgeworCQkJLyogR2V0IGFuIGF2YWlsYWJsZSBkZXNjcmlwdG9yICovCisJCQlkZXNjID0gbGlzdF9lbnRyeShpc2ktPmRtYV9kZXNjX2hlYWQubmV4dCwKKwkJCQkJCXN0cnVjdCBpc2lfZG1hX2Rlc2MsIGxpc3QpOworCQkJLyogRGVsZXRlIHRoZSBkZXNjcmlwdG9yIHNpbmNlIG5vdyBpdCBpcyB1c2VkICovCisJCQlsaXN0X2RlbF9pbml0KCZkZXNjLT5saXN0KTsKKworCQkJLyogSW5pdGlhbGl6ZSB0aGUgZG1hIGRlc2NyaXB0b3IgKi8KKwkJCWRlc2MtPnBfZmJkLT5mYl9hZGRyZXNzID0KKwkJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIodmIsIDApOworCQkJZGVzYy0+cF9mYmQtPm5leHRfZmJkX2FkZHJlc3MgPSAwOworCQkJc2V0X2RtYV9jdHJsKGRlc2MtPnBfZmJkLCBJU0lfRE1BX0NUUkxfV0IpOworCisJCQlidWYtPnBfZG1hX2Rlc2MgPSBkZXNjOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBidWZmZXJfY2xlYW51cChzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBzb2NfY2FtZXJhX2Zyb21fdmIycSh2Yi0+dmIyX3F1ZXVlKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOworCXN0cnVjdCBhdG1lbF9pc2kgKmlzaSA9IGljaS0+cHJpdjsKKwlzdHJ1Y3QgZnJhbWVfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBmcmFtZV9idWZmZXIsIHZiKTsKKworCS8qIFRoaXMgZGVzY3JpcHRvciBpcyBhdmFpbGFibGUgbm93IGFuZCB3ZSBhZGQgdG8gaGVhZCBsaXN0ICovCisJaWYgKGJ1Zi0+cF9kbWFfZGVzYykKKwkJbGlzdF9hZGQoJmJ1Zi0+cF9kbWFfZGVzYy0+bGlzdCwgJmlzaS0+ZG1hX2Rlc2NfaGVhZCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X2RtYShzdHJ1Y3QgYXRtZWxfaXNpICppc2ksIHN0cnVjdCBmcmFtZV9idWZmZXIgKmJ1ZmZlcikKK3sKKwl1MzIgY3RybCwgY2ZnMTsKKworCWNmZzEgPSBpc2lfcmVhZGwoaXNpLCBJU0lfQ0ZHMSk7CisJLyogRW5hYmxlIGlycTogY3hmciBmb3IgdGhlIGNvZGVjIHBhdGgsIHB4ZnIgZm9yIHRoZSBwcmV2aWV3IHBhdGggKi8KKwlpc2lfd3JpdGVsKGlzaSwgSVNJX0lOVEVOLAorCQkJSVNJX1NSX0NYRlJfRE9ORSB8IElTSV9TUl9QWEZSX0RPTkUpOworCisJLyogQ2hlY2sgaWYgYWxyZWFkeSBpbiBhIGZyYW1lICovCisJaWYgKGlzaV9yZWFkbChpc2ksIElTSV9TVEFUVVMpICYgSVNJX0NUUkxfQ0RDKSB7CisJCWRldl9lcnIoaXNpLT5pY2QtPnBhcmVudCwgIkFscmVhZHkgaW4gZnJhbWUgaGFuZGxpbmcuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlzaV93cml0ZWwoaXNpLCBJU0lfRE1BX0NfRFNDUiwgYnVmZmVyLT5wX2RtYV9kZXNjLT5mYmRfcGh5cyk7CisJaXNpX3dyaXRlbChpc2ksIElTSV9ETUFfQ19DVFJMLCBJU0lfRE1BX0NUUkxfRkVUQ0ggfCBJU0lfRE1BX0NUUkxfRE9ORSk7CisJaXNpX3dyaXRlbChpc2ksIElTSV9ETUFfQ0hFUiwgSVNJX0RNQV9DSFNSX0NfQ0gpOworCisJLyogRW5hYmxlIGxpbmtlZCBsaXN0ICovCisJY2ZnMSB8PSBpc2ktPnBkYXRhLT5mcmF0ZSB8IElTSV9DRkcxX0RJU0NSOworCisJLyogRW5hYmxlIGNvZGVjIHBhdGggYW5kIElTSSAqLworCWN0cmwgPSBJU0lfQ1RSTF9DREMgfCBJU0lfQ1RSTF9FTjsKKwlpc2lfd3JpdGVsKGlzaSwgSVNJX0NUUkwsIGN0cmwpOworCWlzaV93cml0ZWwoaXNpLCBJU0lfQ0ZHMSwgY2ZnMSk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1ZmZlcl9xdWV1ZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBzb2NfY2FtZXJhX2Zyb21fdmIycSh2Yi0+dmIyX3F1ZXVlKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOworCXN0cnVjdCBhdG1lbF9pc2kgKmlzaSA9IGljaS0+cHJpdjsKKwlzdHJ1Y3QgZnJhbWVfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBmcmFtZV9idWZmZXIsIHZiKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpc2ktPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZidWYtPmxpc3QsICZpc2ktPnZpZGVvX2J1ZmZlcl9saXN0KTsKKworCWlmIChpc2ktPmFjdGl2ZSA9PSBOVUxMKSB7CisJCWlzaS0+YWN0aXZlID0gYnVmOworCQlzdGFydF9kbWEoaXNpLCBidWYpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2ktPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBzdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqdnEpCit7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBzb2NfY2FtZXJhX2Zyb21fdmIycSh2cSk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKKwlzdHJ1Y3QgYXRtZWxfaXNpICppc2kgPSBpY2ktPnByaXY7CisKKwl1MzIgc3IgPSAwOworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaXJxKCZpc2ktPmxvY2spOworCWlzaS0+c3RhdGUgPSBJU0lfU1RBVEVfSURMRTsKKwkvKiBDbGVhciBhbnkgcGVuZGluZyBTT0YgaW50ZXJydXB0ICovCisJc3IgPSBpc2lfcmVhZGwoaXNpLCBJU0lfU1RBVFVTKTsKKwkvKiBFbmFibGUgVlNZTkMgaW50ZXJydXB0IGZvciBTT0YgKi8KKwlpc2lfd3JpdGVsKGlzaSwgSVNJX0lOVEVOLCBJU0lfU1JfVlNZTkMpOworCWlzaV93cml0ZWwoaXNpLCBJU0lfQ1RSTCwgSVNJX0NUUkxfRU4pOworCXNwaW5fdW5sb2NrX2lycSgmaXNpLT5sb2NrKTsKKworCWRldl9kYmcoaWNkLT5wYXJlbnQsICJXYWl0aW5nIGZvciBTT0ZcbiIpOworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShpc2ktPnZzeW5jX3dxLAorCQkJCSAgICAgICBpc2ktPnN0YXRlICE9IElTSV9TVEFURV9JRExFKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGlzaS0+c3RhdGUgIT0gSVNJX1NUQVRFX1JFQURZKQorCQlyZXR1cm4gLUVJTzsKKworCXNwaW5fbG9ja19pcnEoJmlzaS0+bG9jayk7CisJaXNpLT5zdGF0ZSA9IElTSV9TVEFURV9XQUlUX1NPRjsKKwlpc2lfd3JpdGVsKGlzaSwgSVNJX0lOVERJUywgSVNJX1NSX1ZTWU5DKTsKKwlzcGluX3VubG9ja19pcnEoJmlzaS0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyogYWJvcnQgc3RyZWFtaW5nIGFuZCB3YWl0IGZvciBsYXN0IGJ1ZmZlciAqLworc3RhdGljIGludCBzdG9wX3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICp2cSkKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHNvY19jYW1lcmFfZnJvbV92YjJxKHZxKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOworCXN0cnVjdCBhdG1lbF9pc2kgKmlzaSA9IGljaS0+cHJpdjsKKwlzdHJ1Y3QgZnJhbWVfYnVmZmVyICpidWYsICpub2RlOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCXNwaW5fbG9ja19pcnEoJmlzaS0+bG9jayk7CisJaXNpLT5hY3RpdmUgPSBOVUxMOworCS8qIFJlbGVhc2UgYWxsIGFjdGl2ZSBidWZmZXJzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJ1Ziwgbm9kZSwgJmlzaS0+dmlkZW9fYnVmZmVyX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmYnVmLT5saXN0KTsKKwkJdmIyX2J1ZmZlcl9kb25lKCZidWYtPnZiLCBWQjJfQlVGX1NUQVRFX0VSUk9SKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZpc2ktPmxvY2spOworCisJdGltZW91dCA9IGppZmZpZXMgKyBGUkFNRV9JTlRFUlZBTF9NSUxMSV9TRUMgKiBIWjsKKwkvKiBXYWl0IHVudGlsIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZnJhbWUuICovCisJd2hpbGUgKChpc2lfcmVhZGwoaXNpLCBJU0lfU1RBVFVTKSAmIElTSV9DVFJMX0NEQykgJiYKKwkJCXRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKQorCQltc2xlZXAoMSk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlkZXZfZXJyKGljZC0+cGFyZW50LAorCQkJIlRpbWVvdXQgd2FpdGluZyBmb3IgZmluaXNoaW5nIGNvZGVjIHJlcXVlc3RcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwlpc2lfd3JpdGVsKGlzaSwgSVNJX0lOVERJUywKKwkJCUlTSV9TUl9DWEZSX0RPTkUgfCBJU0lfU1JfUFhGUl9ET05FKTsKKworCS8qIERpc2FibGUgSVNJIGFuZCB3YWl0IGZvciBpdCBpcyBkb25lICovCisJcmV0ID0gYXRtZWxfaXNpX3dhaXRfc3RhdHVzKGlzaSwgV0FJVF9JU0lfRElTQUJMRSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoaWNkLT5wYXJlbnQsICJEaXNhYmxlIElTSSB0aW1lZCBvdXRcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCB2YjJfb3BzIGlzaV92aWRlb19xb3BzID0geworCS5xdWV1ZV9zZXR1cAkJPSBxdWV1ZV9zZXR1cCwKKwkuYnVmX2luaXQJCT0gYnVmZmVyX2luaXQsCisJLmJ1Zl9wcmVwYXJlCQk9IGJ1ZmZlcl9wcmVwYXJlLAorCS5idWZfY2xlYW51cAkJPSBidWZmZXJfY2xlYW51cCwKKwkuYnVmX3F1ZXVlCQk9IGJ1ZmZlcl9xdWV1ZSwKKwkuc3RhcnRfc3RyZWFtaW5nCT0gc3RhcnRfc3RyZWFtaW5nLAorCS5zdG9wX3N0cmVhbWluZwkJPSBzdG9wX3N0cmVhbWluZywKKwkud2FpdF9wcmVwYXJlCQk9IHNvY19jYW1lcmFfdW5sb2NrLAorCS53YWl0X2ZpbmlzaAkJPSBzb2NfY2FtZXJhX2xvY2ssCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlTT0MgY2FtZXJhIG9wZXJhdGlvbnMgZm9yIHRoZSBkZXZpY2UKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IGlzaV9jYW1lcmFfaW5pdF92aWRlb2J1ZihzdHJ1Y3QgdmIyX3F1ZXVlICpxLAorCQkJCSAgICAgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJcS0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwlxLT5pb19tb2RlcyA9IFZCMl9NTUFQOworCXEtPmRydl9wcml2ID0gaWNkOworCXEtPmJ1Zl9zdHJ1Y3Rfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZnJhbWVfYnVmZmVyKTsKKwlxLT5vcHMgPSAmaXNpX3ZpZGVvX3FvcHM7CisJcS0+bWVtX29wcyA9ICZ2YjJfZG1hX2NvbnRpZ19tZW1vcHM7CisKKwlyZXR1cm4gdmIyX3F1ZXVlX2luaXQocSk7Cit9CisKK3N0YXRpYyBpbnQgaXNpX2NhbWVyYV9zZXRfZm10KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJICAgICAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CisJc3RydWN0IGF0bWVsX2lzaSAqaXNpID0gaWNpLT5wcml2OworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOworCWNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqeGxhdGU7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmYtPmZtdC5waXg7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBtZjsKKwlpbnQgcmV0OworCisJeGxhdGUgPSBzb2NfY2FtZXJhX3hsYXRlX2J5X2ZvdXJjYyhpY2QsIHBpeC0+cGl4ZWxmb3JtYXQpOworCWlmICgheGxhdGUpIHsKKwkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsICJGb3JtYXQgJXggbm90IGZvdW5kXG4iLAorCQkJIHBpeC0+cGl4ZWxmb3JtYXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiUGxhbiB0byBzZXQgZm9ybWF0ICVkeCVkXG4iLAorCQkJcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQpOworCisJbWYud2lkdGgJPSBwaXgtPndpZHRoOworCW1mLmhlaWdodAk9IHBpeC0+aGVpZ2h0OworCW1mLmZpZWxkCT0gcGl4LT5maWVsZDsKKwltZi5jb2xvcnNwYWNlCT0gcGl4LT5jb2xvcnNwYWNlOworCW1mLmNvZGUJCT0geGxhdGUtPmNvZGU7CisKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgc19tYnVzX2ZtdCwgJm1mKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChtZi5jb2RlICE9IHhsYXRlLT5jb2RlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGNvbmZpZ3VyZV9nZW9tZXRyeShpc2ksIHBpeC0+d2lkdGgsIHBpeC0+aGVpZ2h0LCB4bGF0ZS0+Y29kZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlwaXgtPndpZHRoCQk9IG1mLndpZHRoOworCXBpeC0+aGVpZ2h0CQk9IG1mLmhlaWdodDsKKwlwaXgtPmZpZWxkCQk9IG1mLmZpZWxkOworCXBpeC0+Y29sb3JzcGFjZQkJPSBtZi5jb2xvcnNwYWNlOworCWljZC0+Y3VycmVudF9mbXQJPSB4bGF0ZTsKKworCWRldl9kYmcoaWNkLT5wYXJlbnQsICJGaW5hbGx5IHNldCBmb3JtYXQgJWR4JWRcbiIsCisJCXBpeC0+d2lkdGgsIHBpeC0+aGVpZ2h0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXNpX2NhbWVyYV90cnlfZm10KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJICAgICAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOworCWNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqeGxhdGU7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmYtPmZtdC5waXg7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBtZjsKKwl1MzIgcGl4Zm10ID0gcGl4LT5waXhlbGZvcm1hdDsKKwlpbnQgcmV0OworCisJeGxhdGUgPSBzb2NfY2FtZXJhX3hsYXRlX2J5X2ZvdXJjYyhpY2QsIHBpeGZtdCk7CisJaWYgKHBpeGZtdCAmJiAheGxhdGUpIHsKKwkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsICJGb3JtYXQgJXggbm90IGZvdW5kXG4iLCBwaXhmbXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBsaW1pdCB0byBBdG1lbCBJU0kgaGFyZHdhcmUgY2FwYWJpbGl0aWVzICovCisJaWYgKHBpeC0+aGVpZ2h0ID4gTUFYX1NVUFBPUlRfSEVJR0hUKQorCQlwaXgtPmhlaWdodCA9IE1BWF9TVVBQT1JUX0hFSUdIVDsKKwlpZiAocGl4LT53aWR0aCA+IE1BWF9TVVBQT1JUX1dJRFRIKQorCQlwaXgtPndpZHRoID0gTUFYX1NVUFBPUlRfV0lEVEg7CisKKwkvKiBsaW1pdCB0byBzZW5zb3IgY2FwYWJpbGl0aWVzICovCisJbWYud2lkdGgJPSBwaXgtPndpZHRoOworCW1mLmhlaWdodAk9IHBpeC0+aGVpZ2h0OworCW1mLmZpZWxkCT0gcGl4LT5maWVsZDsKKwltZi5jb2xvcnNwYWNlCT0gcGl4LT5jb2xvcnNwYWNlOworCW1mLmNvZGUJCT0geGxhdGUtPmNvZGU7CisKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgdHJ5X21idXNfZm10LCAmbWYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcGl4LT53aWR0aAk9IG1mLndpZHRoOworCXBpeC0+aGVpZ2h0CT0gbWYuaGVpZ2h0OworCXBpeC0+Y29sb3JzcGFjZQk9IG1mLmNvbG9yc3BhY2U7CisKKwlzd2l0Y2ggKG1mLmZpZWxkKSB7CisJY2FzZSBWNEwyX0ZJRUxEX0FOWToKKwkJcGl4LT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0ZJRUxEX05PTkU6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoaWNkLT5wYXJlbnQsICJGaWVsZCB0eXBlICVkIHVuc3VwcG9ydGVkLlxuIiwKKwkJCW1mLmZpZWxkKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19tYnVzX3BpeGVsZm10IGlzaV9jYW1lcmFfZm9ybWF0c1tdID0geworCXsKKwkJLmZvdXJjYwkJCT0gVjRMMl9QSVhfRk1UX1lVWVYsCisJCS5uYW1lCQkJPSAiUGFja2VkIFlVVjQyMiAxNiBiaXQiLAorCQkuYml0c19wZXJfc2FtcGxlCT0gOCwKKwkJLnBhY2tpbmcJCT0gU09DX01CVVNfUEFDS0lOR18yWDhfUEFESEksCisJCS5vcmRlcgkJCT0gU09DX01CVVNfT1JERVJfTEUsCisJfSwKK307CisKKy8qIFRoaXMgd2lsbCBiZSBjb3JyZWN0ZWQgYXMgd2UgZ2V0IG1vcmUgZm9ybWF0cyAqLworc3RhdGljIGJvb2wgaXNpX2NhbWVyYV9wYWNraW5nX3N1cHBvcnRlZChjb25zdCBzdHJ1Y3Qgc29jX21idXNfcGl4ZWxmbXQgKmZtdCkKK3sKKwlyZXR1cm4JZm10LT5wYWNraW5nID09IFNPQ19NQlVTX1BBQ0tJTkdfTk9ORSB8fAorCQkoZm10LT5iaXRzX3Blcl9zYW1wbGUgPT0gOCAmJgorCQkgZm10LT5wYWNraW5nID09IFNPQ19NQlVTX1BBQ0tJTkdfMlg4X1BBREhJKSB8fAorCQkoZm10LT5iaXRzX3Blcl9zYW1wbGUgPiA4ICYmCisJCSBmbXQtPnBhY2tpbmcgPT0gU09DX01CVVNfUEFDS0lOR19FWFRFTkQxNik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1ha2VfYnVzX3BhcmFtKHN0cnVjdCBhdG1lbF9pc2kgKmlzaSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCS8qCisJICogUGxhdGZvcm0gc3BlY2lmaWVkIHN5bmNocm9uaXphdGlvbiBhbmQgcGl4ZWwgY2xvY2sgcG9sYXJpdGllcyBhcmUKKwkgKiBvbmx5IGEgcmVjb21tZW5kYXRpb24gYW5kIGFyZSBvbmx5IHVzZWQgZHVyaW5nIHByb2JpbmcuIEF0bWVsIElTSQorCSAqIGNhbWVyYSBpbnRlcmZhY2Ugb25seSB3b3JrcyBpbiBtYXN0ZXIgbW9kZSwgaS5lLiwgdXNlcyBIU1lOQyBhbmQKKwkgKiBWU1lOQyBzaWduYWxzIGZyb20gdGhlIHNlbnNvcgorCSAqLworCWZsYWdzID0gU09DQU1fTUFTVEVSIHwKKwkJU09DQU1fSFNZTkNfQUNUSVZFX0hJR0ggfAorCQlTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XIHwKKwkJU09DQU1fVlNZTkNfQUNUSVZFX0hJR0ggfAorCQlTT0NBTV9WU1lOQ19BQ1RJVkVfTE9XIHwKKwkJU09DQU1fUENMS19TQU1QTEVfUklTSU5HIHwKKwkJU09DQU1fUENMS19TQU1QTEVfRkFMTElORyB8CisJCVNPQ0FNX0RBVEFfQUNUSVZFX0hJR0g7CisKKwlpZiAoaXNpLT5wZGF0YS0+ZGF0YV93aWR0aF9mbGFncyAmIElTSV9EQVRBV0lEVEhfMTApCisJCWZsYWdzIHw9IFNPQ0FNX0RBVEFXSURUSF8xMDsKKworCWlmIChpc2ktPnBkYXRhLT5kYXRhX3dpZHRoX2ZsYWdzICYgSVNJX0RBVEFXSURUSF84KQorCQlmbGFncyB8PSBTT0NBTV9EQVRBV0lEVEhfODsKKworCWlmIChmbGFncyAmIFNPQ0FNX0RBVEFXSURUSF9NQVNLKQorCQlyZXR1cm4gZmxhZ3M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc2lfY2FtZXJhX3RyeV9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkJICAgIHVuc2lnbmVkIGNoYXIgYnVzd2lkdGgpCit7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKKwlzdHJ1Y3QgYXRtZWxfaXNpICppc2kgPSBpY2ktPnByaXY7CisJdW5zaWduZWQgbG9uZyBjYW1lcmFfZmxhZ3M7CisJaW50IHJldDsKKworCWNhbWVyYV9mbGFncyA9IGljZC0+b3BzLT5xdWVyeV9idXNfcGFyYW0oaWNkKTsKKwlyZXQgPSBzb2NfY2FtZXJhX2J1c19wYXJhbV9jb21wYXRpYmxlKGNhbWVyYV9mbGFncywKKwkJCQkJbWFrZV9idXNfcGFyYW0oaXNpKSk7CisJaWYgKCFyZXQpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaXNpX2NhbWVyYV9nZXRfZm9ybWF0cyhzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCQkgIHVuc2lnbmVkIGludCBpZHgsCisJCQkJICBzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnhsYXRlKQoreworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOworCWludCBmb3JtYXRzID0gMCwgcmV0OworCS8qIHNlbnNvciBmb3JtYXQgKi8KKwllbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgY29kZTsKKwkvKiBzb2MgY2FtZXJhIGhvc3QgZm9ybWF0ICovCisJY29uc3Qgc3RydWN0IHNvY19tYnVzX3BpeGVsZm10ICpmbXQ7CisKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgZW51bV9tYnVzX2ZtdCwgaWR4LCAmY29kZSk7CisJaWYgKHJldCA8IDApCisJCS8qIE5vIG1vcmUgZm9ybWF0cyAqLworCQlyZXR1cm4gMDsKKworCWZtdCA9IHNvY19tYnVzX2dldF9mbXRkZXNjKGNvZGUpOworCWlmICghZm10KSB7CisJCWRldl9lcnIoaWNkLT5wYXJlbnQsCisJCQkiSW52YWxpZCBmb3JtYXQgY29kZSAjJXU6ICVkXG4iLCBpZHgsIGNvZGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBUaGlzIGFsc28gY2hlY2tzIHN1cHBvcnQgZm9yIHRoZSByZXF1ZXN0ZWQgYml0cy1wZXItc2FtcGxlICovCisJcmV0ID0gaXNpX2NhbWVyYV90cnlfYnVzX3BhcmFtKGljZCwgZm10LT5iaXRzX3Blcl9zYW1wbGUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoaWNkLT5wYXJlbnQsCisJCQkiRmFpbCB0byB0cnkgdGhlIGJ1cyBwYXJhbWV0ZXJzLlxuIik7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAoY29kZSkgeworCWNhc2UgVjRMMl9NQlVTX0ZNVF9VWVZZOF8yWDg6CisJY2FzZSBWNEwyX01CVVNfRk1UX1ZZVVk4XzJYODoKKwljYXNlIFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4OgorCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZVllVOF8yWDg6CisJCWZvcm1hdHMrKzsKKwkJaWYgKHhsYXRlKSB7CisJCQl4bGF0ZS0+aG9zdF9mbXQJPSAmaXNpX2NhbWVyYV9mb3JtYXRzWzBdOworCQkJeGxhdGUtPmNvZGUJPSBjb2RlOworCQkJeGxhdGUrKzsKKwkJCWRldl9kYmcoaWNkLT5wYXJlbnQsICJQcm92aWRpbmcgZm9ybWF0ICVzIHVzaW5nIGNvZGUgJWRcbiIsCisJCQkJaXNpX2NhbWVyYV9mb3JtYXRzWzBdLm5hbWUsIGNvZGUpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmICghaXNpX2NhbWVyYV9wYWNraW5nX3N1cHBvcnRlZChmbXQpKQorCQkJcmV0dXJuIDA7CisJCWlmICh4bGF0ZSkKKwkJCWRldl9kYmcoaWNkLT5wYXJlbnQsCisJCQkJIlByb3ZpZGluZyBmb3JtYXQgJXMgaW4gcGFzcy10aHJvdWdoIG1vZGVcbiIsCisJCQkJZm10LT5uYW1lKTsKKwl9CisKKwkvKiBHZW5lcmljIHBhc3MtdGhyb3VnaCAqLworCWZvcm1hdHMrKzsKKwlpZiAoeGxhdGUpIHsKKwkJeGxhdGUtPmhvc3RfZm10CT0gZm10OworCQl4bGF0ZS0+Y29kZQk9IGNvZGU7CisJCXhsYXRlKys7CisJfQorCisJcmV0dXJuIGZvcm1hdHM7Cit9CisKKy8qIENhbGxlZCB3aXRoIC52aWRlb19sb2NrIGhlbGQgKi8KK3N0YXRpYyBpbnQgaXNpX2NhbWVyYV9hZGRfZGV2aWNlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CisJc3RydWN0IGF0bWVsX2lzaSAqaXNpID0gaWNpLT5wcml2OworCWludCByZXQ7CisKKwlpZiAoaXNpLT5pY2QpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXQgPSBjbGtfZW5hYmxlKGlzaS0+cGNsayk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlzaS0+aWNkID0gaWNkOworCWRldl9kYmcoaWNkLT5wYXJlbnQsICJBdG1lbCBJU0kgQ2FtZXJhIGRyaXZlciBhdHRhY2hlZCB0byBjYW1lcmEgJWRcbiIsCisJCSBpY2QtPmRldm51bSk7CisJcmV0dXJuIDA7Cit9CisvKiBDYWxsZWQgd2l0aCAudmlkZW9fbG9jayBoZWxkICovCitzdGF0aWMgdm9pZCBpc2lfY2FtZXJhX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKKwlzdHJ1Y3QgYXRtZWxfaXNpICppc2kgPSBpY2ktPnByaXY7CisKKwlCVUdfT04oaWNkICE9IGlzaS0+aWNkKTsKKworCWNsa19kaXNhYmxlKGlzaS0+cGNsayk7CisJaXNpLT5pY2QgPSBOVUxMOworCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIkF0bWVsIElTSSBDYW1lcmEgZHJpdmVyIGRldGFjaGVkIGZyb20gY2FtZXJhICVkXG4iLAorCQkgaWNkLT5kZXZudW0pOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGlzaV9jYW1lcmFfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqcHQpCit7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlyZXR1cm4gdmIyX3BvbGwoJmljZC0+dmIyX3ZpZHEsIGZpbGUsIHB0KTsKK30KKworc3RhdGljIGludCBpc2lfY2FtZXJhX3F1ZXJ5Y2FwKHN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCit7CisJc3RyY3B5KGNhcC0+ZHJpdmVyLCAiYXRtZWwtaXNpIik7CisJc3RyY3B5KGNhcC0+Y2FyZCwgIkF0bWVsIEltYWdlIFNlbnNvciBJbnRlcmZhY2UiKTsKKwljYXAtPmNhcGFiaWxpdGllcyA9IChWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKKwkJCQlWNEwyX0NBUF9TVFJFQU1JTkcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlzaV9jYW1lcmFfc2V0X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwgdTMyIHBpeGZtdCkKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOworCXN0cnVjdCBhdG1lbF9pc2kgKmlzaSA9IGljaS0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGJ1c19mbGFncywgY2FtZXJhX2ZsYWdzLCBjb21tb25fZmxhZ3M7CisJaW50IHJldDsKKwl1MzIgY2ZnMSA9IDA7CisKKwljYW1lcmFfZmxhZ3MgPSBpY2QtPm9wcy0+cXVlcnlfYnVzX3BhcmFtKGljZCk7CisKKwlidXNfZmxhZ3MgPSBtYWtlX2J1c19wYXJhbShpc2kpOworCWNvbW1vbl9mbGFncyA9IHNvY19jYW1lcmFfYnVzX3BhcmFtX2NvbXBhdGlibGUoY2FtZXJhX2ZsYWdzLCBidXNfZmxhZ3MpOworCWRldl9kYmcoaWNkLT5wYXJlbnQsICJGbGFncyBjYW06IDB4JWx4IGhvc3Q6IDB4JWx4IGNvbW1vbjogMHglbHhcbiIsCisJCWNhbWVyYV9mbGFncywgYnVzX2ZsYWdzLCBjb21tb25fZmxhZ3MpOworCWlmICghY29tbW9uX2ZsYWdzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE1ha2UgY2hvaXNlcywgYmFzZWQgb24gcGxhdGZvcm0gcHJlZmVyZW5jZXMgKi8KKwlpZiAoKGNvbW1vbl9mbGFncyAmIFNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIKSAmJgorCSAgICAoY29tbW9uX2ZsYWdzICYgU09DQU1fSFNZTkNfQUNUSVZFX0xPVykpIHsKKwkJaWYgKGlzaS0+cGRhdGEtPmhzeW5jX2FjdF9sb3cpCisJCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIOworCQllbHNlCisJCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX0hTWU5DX0FDVElWRV9MT1c7CisJfQorCisJaWYgKChjb21tb25fZmxhZ3MgJiBTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCkgJiYKKwkgICAgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1ZTWU5DX0FDVElWRV9MT1cpKSB7CisJCWlmIChpc2ktPnBkYXRhLT52c3luY19hY3RfbG93KQorCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9WU1lOQ19BQ1RJVkVfSElHSDsKKwkJZWxzZQorCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9WU1lOQ19BQ1RJVkVfTE9XOworCX0KKworCWlmICgoY29tbW9uX2ZsYWdzICYgU09DQU1fUENMS19TQU1QTEVfUklTSU5HKSAmJgorCSAgICAoY29tbW9uX2ZsYWdzICYgU09DQU1fUENMS19TQU1QTEVfRkFMTElORykpIHsKKwkJaWYgKGlzaS0+cGRhdGEtPnBjbGtfYWN0X2ZhbGxpbmcpCisJCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORzsKKwkJZWxzZQorCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HOworCX0KKworCXJldCA9IGljZC0+b3BzLT5zZXRfYnVzX3BhcmFtKGljZCwgY29tbW9uX2ZsYWdzKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZGJnKGljZC0+cGFyZW50LCAiQ2FtZXJhIHNldF9idXNfcGFyYW0oJWx4KSByZXR1cm5lZCAlZFxuIiwKKwkJCWNvbW1vbl9mbGFncywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBzZXQgYnVzIHBhcmFtIGZvciBJU0kgKi8KKwlpZiAoY29tbW9uX2ZsYWdzICYgU09DQU1fSFNZTkNfQUNUSVZFX0xPVykKKwkJY2ZnMSB8PSBJU0lfQ0ZHMV9IU1lOQ19QT0xfQUNUSVZFX0xPVzsKKwlpZiAoY29tbW9uX2ZsYWdzICYgU09DQU1fVlNZTkNfQUNUSVZFX0xPVykKKwkJY2ZnMSB8PSBJU0lfQ0ZHMV9WU1lOQ19QT0xfQUNUSVZFX0xPVzsKKwlpZiAoY29tbW9uX2ZsYWdzICYgU09DQU1fUENMS19TQU1QTEVfRkFMTElORykKKwkJY2ZnMSB8PSBJU0lfQ0ZHMV9QSVhDTEtfUE9MX0FDVElWRV9GQUxMSU5HOworCisJaWYgKGlzaS0+cGRhdGEtPmhhc19lbWJfc3luYykKKwkJY2ZnMSB8PSBJU0lfQ0ZHMV9FTUJfU1lOQzsKKwlpZiAoaXNpLT5wZGF0YS0+aXNpX2Z1bGxfbW9kZSkKKwkJY2ZnMSB8PSBJU0lfQ0ZHMV9GVUxMX01PREU7CisKKwlpc2lfd3JpdGVsKGlzaSwgSVNJX0NUUkwsIElTSV9DVFJMX0RJUyk7CisJaXNpX3dyaXRlbChpc2ksIElTSV9DRkcxLCBjZmcxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNvY19jYW1lcmFfaG9zdF9vcHMgaXNpX3NvY19jYW1lcmFfaG9zdF9vcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5hZGQJCT0gaXNpX2NhbWVyYV9hZGRfZGV2aWNlLAorCS5yZW1vdmUJCT0gaXNpX2NhbWVyYV9yZW1vdmVfZGV2aWNlLAorCS5zZXRfZm10CT0gaXNpX2NhbWVyYV9zZXRfZm10LAorCS50cnlfZm10CT0gaXNpX2NhbWVyYV90cnlfZm10LAorCS5nZXRfZm9ybWF0cwk9IGlzaV9jYW1lcmFfZ2V0X2Zvcm1hdHMsCisJLmluaXRfdmlkZW9idWYyCT0gaXNpX2NhbWVyYV9pbml0X3ZpZGVvYnVmLAorCS5wb2xsCQk9IGlzaV9jYW1lcmFfcG9sbCwKKwkucXVlcnljYXAJPSBpc2lfY2FtZXJhX3F1ZXJ5Y2FwLAorCS5zZXRfYnVzX3BhcmFtCT0gaXNpX2NhbWVyYV9zZXRfYnVzX3BhcmFtLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBfX2RldmV4aXQgYXRtZWxfaXNpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKnNvY19ob3N0ID0gdG9fc29jX2NhbWVyYV9ob3N0KCZwZGV2LT5kZXYpOworCXN0cnVjdCBhdG1lbF9pc2kgKmlzaSA9IGNvbnRhaW5lcl9vZihzb2NfaG9zdCwKKwkJCQkJc3RydWN0IGF0bWVsX2lzaSwgc29jX2hvc3QpOworCisJZnJlZV9pcnEoaXNpLT5pcnEsIGlzaSk7CisJc29jX2NhbWVyYV9ob3N0X3VucmVnaXN0ZXIoc29jX2hvc3QpOworCXZiMl9kbWFfY29udGlnX2NsZWFudXBfY3R4KGlzaS0+YWxsb2NfY3R4KTsKKwlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LAorCQkJc2l6ZW9mKHN0cnVjdCBmYmQpICogTUFYX0JVRkZFUl9OVU0sCisJCQlpc2ktPnBfZmJfZGVzY3JpcHRvcnMsCisJCQlpc2ktPmZiX2Rlc2NyaXB0b3JzX3BoeXMpOworCisJaW91bm1hcChpc2ktPnJlZ3MpOworCWNsa19wdXQoaXNpLT5wY2xrKTsKKwlrZnJlZShpc2kpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGF0bWVsX2lzaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXVuc2lnbmVkIGludCBpcnE7CisJc3RydWN0IGF0bWVsX2lzaSAqaXNpOworCXN0cnVjdCBjbGsgKnBjbGs7CisJc3RydWN0IHJlc291cmNlICpyZWdzOworCWludCByZXQsIGk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICpzb2NfaG9zdDsKKwlzdHJ1Y3QgaXNpX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCisJcGRhdGEgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJaWYgKCFwZGF0YSB8fCAhcGRhdGEtPmRhdGFfd2lkdGhfZmxhZ3MpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIk5vIGNvbmZpZyBhdmFpbGFibGUgZm9yIEF0bWVsIElTSVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlZ3MgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVncykKKwkJcmV0dXJuIC1FTlhJTzsKKworCXBjbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJpc2lfY2xrIik7CisJaWYgKElTX0VSUihwY2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIocGNsayk7CisKKwlpc2kgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXRtZWxfaXNpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpc2kpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgYWxsb2NhdGUgaW50ZXJmYWNlIVxuIik7CisJCWdvdG8gZXJyX2FsbG9jX2lzaTsKKwl9CisKKwlpc2ktPnBjbGsgPSBwY2xrOworCWlzaS0+cGRhdGEgPSBwZGF0YTsKKwlpc2ktPmFjdGl2ZSA9IE5VTEw7CisJc3Bpbl9sb2NrX2luaXQoJmlzaS0+bG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaXNpLT52c3luY193cSk7CisJSU5JVF9MSVNUX0hFQUQoJmlzaS0+dmlkZW9fYnVmZmVyX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZpc2ktPmRtYV9kZXNjX2hlYWQpOworCisJaXNpLT5wX2ZiX2Rlc2NyaXB0b3JzID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwZGV2LT5kZXYsCisJCQkJc2l6ZW9mKHN0cnVjdCBmYmQpICogTUFYX0JVRkZFUl9OVU0sCisJCQkJJmlzaS0+ZmJfZGVzY3JpcHRvcnNfcGh5cywKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWlzaS0+cF9mYl9kZXNjcmlwdG9ycykgeworCQlyZXQgPSAtRU5PTUVNOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBhbGxvY2F0ZSBkZXNjcmlwdG9ycyFcbiIpOworCQlnb3RvIGVycl9hbGxvY19kZXNjcmlwdG9yczsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0JVRkZFUl9OVU07IGkrKykgeworCQlpc2ktPmRtYV9kZXNjW2ldLnBfZmJkID0gaXNpLT5wX2ZiX2Rlc2NyaXB0b3JzICsgaTsKKwkJaXNpLT5kbWFfZGVzY1tpXS5mYmRfcGh5cyA9IGlzaS0+ZmJfZGVzY3JpcHRvcnNfcGh5cyArCisJCQkJCWkgKiBzaXplb2Yoc3RydWN0IGZiZCk7CisJCWxpc3RfYWRkKCZpc2ktPmRtYV9kZXNjW2ldLmxpc3QsICZpc2ktPmRtYV9kZXNjX2hlYWQpOworCX0KKworCWlzaS0+YWxsb2NfY3R4ID0gdmIyX2RtYV9jb250aWdfaW5pdF9jdHgoJnBkZXYtPmRldik7CisJaWYgKElTX0VSUihpc2ktPmFsbG9jX2N0eCkpIHsKKwkJcmV0ID0gUFRSX0VSUihpc2ktPmFsbG9jX2N0eCk7CisJCWdvdG8gZXJyX2FsbG9jX2N0eDsKKwl9CisKKwlpc2ktPnJlZ3MgPSBpb3JlbWFwKHJlZ3MtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlZ3MpKTsKKwlpZiAoIWlzaS0+cmVncykgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9pb3JlbWFwOworCX0KKworCWlzaV93cml0ZWwoaXNpLCBJU0lfQ1RSTCwgSVNJX0NUUkxfRElTKTsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApIHsKKwkJcmV0ID0gaXJxOworCQlnb3RvIGVycl9yZXFfaXJxOworCX0KKworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgaXNpX2ludGVycnVwdCwgMCwgImlzaSIsIGlzaSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gcmVxdWVzdCBpcnEgJWRcbiIsIGlycSk7CisJCWdvdG8gZXJyX3JlcV9pcnE7CisJfQorCWlzaS0+aXJxID0gaXJxOworCisJc29jX2hvc3QJCT0gJmlzaS0+c29jX2hvc3Q7CisJc29jX2hvc3QtPmRydl9uYW1lCT0gImlzaS1jYW1lcmEiOworCXNvY19ob3N0LT5vcHMJCT0gJmlzaV9zb2NfY2FtZXJhX2hvc3Rfb3BzOworCXNvY19ob3N0LT5wcml2CQk9IGlzaTsKKwlzb2NfaG9zdC0+djRsMl9kZXYuZGV2CT0gJnBkZXYtPmRldjsKKwlzb2NfaG9zdC0+bnIJCT0gcGRldi0+aWQ7CisKKwlyZXQgPSBzb2NfY2FtZXJhX2hvc3RfcmVnaXN0ZXIoc29jX2hvc3QpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIHJlZ2lzdGVyIHNvYyBjYW1lcmEgaG9zdFxuIik7CisJCWdvdG8gZXJyX3JlZ2lzdGVyX3NvY19jYW1lcmFfaG9zdDsKKwl9CisJcmV0dXJuIDA7CisKK2Vycl9yZWdpc3Rlcl9zb2NfY2FtZXJhX2hvc3Q6CisJZnJlZV9pcnEoaXNpLT5pcnEsIGlzaSk7CitlcnJfcmVxX2lycToKKwlpb3VubWFwKGlzaS0+cmVncyk7CitlcnJfaW9yZW1hcDoKKwl2YjJfZG1hX2NvbnRpZ19jbGVhbnVwX2N0eChpc2ktPmFsbG9jX2N0eCk7CitlcnJfYWxsb2NfY3R4OgorCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsCisJCQlzaXplb2Yoc3RydWN0IGZiZCkgKiBNQVhfQlVGRkVSX05VTSwKKwkJCWlzaS0+cF9mYl9kZXNjcmlwdG9ycywKKwkJCWlzaS0+ZmJfZGVzY3JpcHRvcnNfcGh5cyk7CitlcnJfYWxsb2NfZGVzY3JpcHRvcnM6CisJa2ZyZWUoaXNpKTsKK2Vycl9hbGxvY19pc2k6CisJY2xrX3B1dChpc2ktPnBjbGspOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXRtZWxfaXNpX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gYXRtZWxfaXNpX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYXRtZWxfaXNpX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lID0gImF0bWVsX2lzaSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdG1lbF9pc2lfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmYXRtZWxfaXNpX2RyaXZlciwgJmF0bWVsX2lzaV9wcm9iZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhdG1lbF9pc2lfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhdG1lbF9pc2lfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGF0bWVsX2lzaV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChhdG1lbF9pc2lfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkpvc2ggV3UgPGpvc2gud3VAYXRtZWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUaGUgVjRMMiBkcml2ZXIgZm9yIEF0bWVsIExpbnV4Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgidmlkZW8iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L2F1MDgyOC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjgtY29yZS5jCmluZGV4IGNhMzQyZTQuLjFlNGNlNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L2F1MDgyOC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvYXUwODI4LWNvcmUuYwpAQCAtMjkyLDMgKzI5Miw0IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgQXV2aXRlayBBVTA4MjggYmFzZWQgcHJvZHVjdHMiKTsKIE1PRFVMRV9BVVRIT1IoIlN0ZXZlbiBUb3RoIDxzdG90aEBsaW51eHR2Lm9yZz4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjAuMiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvYXUwODI4LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjgtdmlkZW8uYwppbmRleCBjMDNlYjI5Li4wYjNlNDgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjgtdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjgtdmlkZW8uYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgpAQCAtNDMsOCArNDIsNiBAQAogCiBzdGF0aWMgREVGSU5FX01VVEVYKGF1MDgyOF9zeXNmc19sb2NrKTsKIAotI2RlZmluZSBBVTA4MjhfVkVSU0lPTl9DT0RFIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDEpCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCVZpZGVvYnVmIG9wZXJhdGlvbnMKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0xMjU0LDggKzEyNTEsNiBAQAogCXN0cmxjcHkoY2FwLT5jYXJkLCBkZXYtPmJvYXJkLm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKIAlzdHJsY3B5KGNhcC0+YnVzX2luZm8sIGRldi0+djRsMl9kZXYubmFtZSwgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKIAotCWNhcC0+dmVyc2lvbiA9IEFVMDgyOF9WRVJTSU9OX0NPREU7Ci0KIAkvKnNldCB0aGUgZGV2aWNlIGNhcGFiaWxpdGllcyAqLwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CiAJCVY0TDJfQ0FQX1ZCSV9DQVBUVVJFIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWNhcmRzLmMKaW5kZXggM2M5ZTZjNy4uNWIxNWY2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWNhcmRzLmMKQEAgLTI4OTIsMTMgKzI4OTIsMTAgQEAKIHsKIAl1bnNpZ25lZCBpbnQgZ3Bpb2JpdHM7CiAJaW50IGksdHlwZTsKLQl1bnNpZ25lZCBzaG9ydCB0bXA7CiAKIAkvKiByZWFkIFBDSSBzdWJzeXN0ZW0gSUQgKi8KLQlwY2lfcmVhZF9jb25maWdfd29yZChidHYtPmMucGNpLCBQQ0lfU1VCU1lTVEVNX0lELCAmdG1wKTsKLQlidHYtPmNhcmRpZCA9IHRtcCA8PCAxNjsKLQlwY2lfcmVhZF9jb25maWdfd29yZChidHYtPmMucGNpLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnRtcCk7Ci0JYnR2LT5jYXJkaWQgfD0gdG1wOworCWJ0di0+Y2FyZGlkICA9IGJ0di0+Yy5wY2ktPnN1YnN5c3RlbV9kZXZpY2UgPDwgMTY7CisJYnR2LT5jYXJkaWQgfD0gYnR2LT5jLnBjaS0+c3Vic3lzdGVtX3ZlbmRvcjsKIAogCWlmICgwICE9IGJ0di0+Y2FyZGlkICYmIDB4ZmZmZmZmZmYgIT0gYnR2LT5jYXJkaWQpIHsKIAkJLyogbG9vayBmb3IgdGhlIGNhcmQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1kcml2ZXIuYwppbmRleCA4MzRhNDgzLi4xNDQ0NGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWRyaXZlci5jCkBAIC01Nyw2ICs1Nyw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zYWE2NTg4Lmg+CiAKKyNkZWZpbmUgQlRUVl9WRVJTSU9OICIwLjkuMTkiCiAKIHVuc2lnbmVkIGludCBidHR2X251bTsJCQkvKiBudW1iZXIgb2YgQnQ4NDhzIGluIHVzZSAqLwogc3RydWN0IGJ0dHYgKmJ0dHZzW0JUVFZfTUFYXTsKQEAgLTE2Myw2ICsxNjQsNyBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJidHR2IC0gdjRsL3Y0bDIgZHJpdmVyIG1vZHVsZSBmb3IgYnQ4NDgvODc4IGJhc2VkIGNhcmRzIik7CiBNT0RVTEVfQVVUSE9SKCJSYWxwaCBNZXR6bGVyICYgTWFyY3VzIE1ldHpsZXIgJiBHZXJkIEtub3JyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihCVFRWX1ZFUlNJT04pOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogc3lzZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTI2MTYsNyArMjYxOCw2IEBACiAJc3RybGNweShjYXAtPmNhcmQsIGJ0di0+dmlkZW9fZGV2LT5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSk7CiAJc25wcmludGYoY2FwLT5idXNfaW5mbywgc2l6ZW9mKGNhcC0+YnVzX2luZm8pLAogCQkgIlBDSTolcyIsIHBjaV9uYW1lKGJ0di0+Yy5wY2kpKTsKLQljYXAtPnZlcnNpb24gPSBCVFRWX1ZFUlNJT05fQ09ERTsKIAljYXAtPmNhcGFiaWxpdGllcyA9CiAJCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAogCQlWNEwyX0NBUF9WQklfQ0FQVFVSRSB8CkBAIC0zNDE2LDcgKzM0MTcsNiBAQAogCXN0cmNweShjYXAtPmRyaXZlciwgImJ0dHYiKTsKIAlzdHJsY3B5KGNhcC0+Y2FyZCwgYnR2LT5yYWRpb19kZXYtPm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKIAlzcHJpbnRmKGNhcC0+YnVzX2luZm8sICJQQ0k6JXMiLCBwY2lfbmFtZShidHYtPmMucGNpKSk7Ci0JY2FwLT52ZXJzaW9uID0gQlRUVl9WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUjsKIAogCXJldHVybiAwOwpAQCAtNDU4NSwxNCArNDU4NSw4IEBACiAKIAlidHR2X251bSA9IDA7CiAKLQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBkcml2ZXIgdmVyc2lvbiAlZC4lZC4lZCBsb2FkZWRcbiIsCi0JICAgICAgIChCVFRWX1ZFUlNJT05fQ09ERSA+PiAxNikgJiAweGZmLAotCSAgICAgICAoQlRUVl9WRVJTSU9OX0NPREUgPj4gOCkgJiAweGZmLAotCSAgICAgICBCVFRWX1ZFUlNJT05fQ09ERSAmIDB4ZmYpOwotI2lmZGVmIFNOQVBTSE9UCi0JcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogc25hcHNob3QgZGF0ZSAlMDRkLSUwMmQtJTAyZFxuIiwKLQkgICAgICAgU05BUFNIT1QvMTAwMDAsIChTTkFQU0hPVC8xMDApJTEwMCwgU05BUFNIT1QlMTAwKTsKLSNlbmRpZgorCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IGRyaXZlciB2ZXJzaW9uICVzIGxvYWRlZFxuIiwKKwkgICAgICAgQlRUVl9WRVJTSU9OKTsKIAlpZiAoZ2J1ZmZlcnMgPCAyIHx8IGdidWZmZXJzID4gVklERU9fTUFYX0ZSQU1FKQogCQlnYnVmZmVycyA9IDI7CiAJaWYgKGdidWZzaXplID4gQlRUVl9NQVhfRkJVRikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0dnAuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0dnAuaAppbmRleCA5Yjc3NmZhLi4zMThlZGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHZwLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2cC5oCkBAIC0yNSw5ICsyNSw2IEBACiAjaWZuZGVmIF9CVFRWUF9IXwogI2RlZmluZSBfQlRUVlBfSF8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNkZWZpbmUgQlRUVl9WRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oMCw5LDE4KQotCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J3LXFjYW0uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnctcWNhbS5jCmluZGV4IGMxMTkzNTAuLmYwOWRmOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnctcWNhbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnctcWNhbS5jCkBAIC03MSw3ICs3MSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNjQ3LDcgKzY0Niw2IEBACiAJc3RybGNweSh2Y2FwLT5kcml2ZXIsIHFjYW0tPnY0bDJfZGV2Lm5hbWUsIHNpemVvZih2Y2FwLT5kcml2ZXIpKTsKIAlzdHJsY3B5KHZjYXAtPmNhcmQsICJCJlcgUXVpY2tjYW0iLCBzaXplb2YodmNhcC0+Y2FyZCkpOwogCXN0cmxjcHkodmNhcC0+YnVzX2luZm8sICJwYXJwb3J0Iiwgc2l6ZW9mKHZjYXAtPmJ1c19pbmZvKSk7Ci0JdmNhcC0+dmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKDAsIDAsIDIpOwogCXZjYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9SRUFEV1JJVEU7CiAJcmV0dXJuIDA7CiB9CkBAIC04OTUsNiArODkzLDcgQEAKIAogCWlmICh2NGwyX2RldmljZV9yZWdpc3RlcihOVUxMLCB2NGwyX2RldikgPCAwKSB7CiAJCXY0bDJfZXJyKHY0bDJfZGV2LCAiQ291bGQgbm90IHJlZ2lzdGVyIHY0bDJfZGV2aWNlXG4iKTsKKwkJa2ZyZWUocWNhbSk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMTA5MiwzICsxMDkxLDQgQEAKIG1vZHVsZV9leGl0KGV4aXRfYndfcWNhbXMpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4wLjMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYy1xY2FtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2MtcWNhbS5jCmluZGV4IDI0ZmMwMDkuLmNkOGZmMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYy1xY2FtLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jLXFjYW0uYwpAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KQEAgLTUxNyw3ICs1MTYsNiBAQAogCXN0cmxjcHkodmNhcC0+ZHJpdmVyLCBxY2FtLT52NGwyX2Rldi5uYW1lLCBzaXplb2YodmNhcC0+ZHJpdmVyKSk7CiAJc3RybGNweSh2Y2FwLT5jYXJkLCAiQ29sb3IgUXVpY2tjYW0iLCBzaXplb2YodmNhcC0+Y2FyZCkpOwogCXN0cmxjcHkodmNhcC0+YnVzX2luZm8sICJwYXJwb3J0Iiwgc2l6ZW9mKHZjYXAtPmJ1c19pbmZvKSk7Ci0JdmNhcC0+dmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKDAsIDAsIDMpOwogCXZjYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9SRUFEV1JJVEU7CiAJcmV0dXJuIDA7CiB9CkBAIC03NTIsNiArNzUwLDcgQEAKIAogCWlmICh2NGwyX2RldmljZV9yZWdpc3RlcihOVUxMLCB2NGwyX2RldikgPCAwKSB7CiAJCXY0bDJfZXJyKHY0bDJfZGV2LCAiQ291bGQgbm90IHJlZ2lzdGVyIHY0bDJfZGV2aWNlXG4iKTsKKwkJa2ZyZWUocWNhbSk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtODg2LDYgKzg4NSw3IEBACiBNT0RVTEVfQVVUSE9SKCJQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oQkFOTkVSKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjAuNCIpOwogCiBtb2R1bGVfaW5pdChjcWNhbV9pbml0KTsKIG1vZHVsZV9leGl0KGNxY2FtX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jYWZlX2NjaWMtcmVncy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jYWZlX2NjaWMtcmVncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTJhODdjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY2FmZV9jY2ljLXJlZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKgotICogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBtODhhbHAwMSBjYW1lcmEgaW50ZXJmYWNlLiAgT2Zmc2V0cyBpbiBieXRlcwotICogYXMgZ2l2ZW4gaW4gdGhlIHNwZWMuCi0gKgotICogQ29weXJpZ2h0IDIwMDYgT25lIExhcHRvcCBQZXIgQ2hpbGQgQXNzb2NpYXRpb24sIEluYy4KLSAqCi0gKiBXcml0dGVuIGJ5IEpvbmF0aGFuIENvcmJldCwgY29yYmV0QGx3bi5uZXQuCi0gKgotICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsCi0gKiBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgotICovCi0jZGVmaW5lIFJFR19ZMEJBUgkweDAwCi0jZGVmaW5lIFJFR19ZMUJBUgkweDA0Ci0jZGVmaW5lIFJFR19ZMkJBUgkweDA4Ci0vKiAuLi4gKi8KLQotI2RlZmluZSBSRUdfSU1HUElUQ0gJMHgyNAkvKiBJbWFnZSBwaXRjaCByZWdpc3RlciAqLwotI2RlZmluZSAgIElNR1BfWVBfU0hGVAkgIDIJCS8qIFkgcGl0Y2ggcGFyYW1zICovCi0jZGVmaW5lICAgSU1HUF9ZUF9NQVNLCSAgMHgwMDAwM2ZmYwkvKiBZIHBpdGNoIGZpZWxkICovCi0jZGVmaW5lCSAgSU1HUF9VVlBfU0hGVAkgIDE4CQkvKiBVViBwaXRjaCAocGxhbmFyKSAqLwotI2RlZmluZSAgIElNR1BfVVZQX01BU0sgICAweDNmZmMwMDAwCi0jZGVmaW5lIFJFR19JUlFTVEFUUkFXCTB4MjgJLyogUkFXIElSUSBTdGF0dXMgKi8KLSNkZWZpbmUgICBJUlFfRU9GMAkgIDB4MDAwMDAwMDEJLyogRW5kIG9mIGZyYW1lIDAgKi8KLSNkZWZpbmUgICBJUlFfRU9GMQkgIDB4MDAwMDAwMDIJLyogRW5kIG9mIGZyYW1lIDEgKi8KLSNkZWZpbmUgICBJUlFfRU9GMgkgIDB4MDAwMDAwMDQJLyogRW5kIG9mIGZyYW1lIDIgKi8KLSNkZWZpbmUgICBJUlFfU09GMAkgIDB4MDAwMDAwMDgJLyogU3RhcnQgb2YgZnJhbWUgMCAqLwotI2RlZmluZSAgIElSUV9TT0YxCSAgMHgwMDAwMDAxMAkvKiBTdGFydCBvZiBmcmFtZSAxICovCi0jZGVmaW5lICAgSVJRX1NPRjIJICAweDAwMDAwMDIwCS8qIFN0YXJ0IG9mIGZyYW1lIDIgKi8KLSNkZWZpbmUgICBJUlFfT1ZFUkZMT1cJICAweDAwMDAwMDQwCS8qIEZJRk8gb3ZlcmZsb3cgKi8KLSNkZWZpbmUgICBJUlFfVFdTSVcJICAweDAwMDEwMDAwCS8qIFRXU0kgKHNtYnVzKSB3cml0ZSAqLwotI2RlZmluZSAgIElSUV9UV1NJUgkgIDB4MDAwMjAwMDAJLyogVFdTSSByZWFkICovCi0jZGVmaW5lICAgSVJRX1RXU0lFCSAgMHgwMDA0MDAwMAkvKiBUV1NJIGVycm9yICovCi0jZGVmaW5lICAgVFdTSUlSUVMgKElSUV9UV1NJV3xJUlFfVFdTSVJ8SVJRX1RXU0lFKQotI2RlZmluZSAgIEZSQU1FSVJRUyAoSVJRX0VPRjB8SVJRX0VPRjF8SVJRX0VPRjJ8SVJRX1NPRjB8SVJRX1NPRjF8SVJRX1NPRjIpCi0jZGVmaW5lICAgQUxMSVJRUyAoVFdTSUlSUVN8RlJBTUVJUlFTfElSUV9PVkVSRkxPVykKLSNkZWZpbmUgUkVHX0lSUU1BU0sJMHgyYwkvKiBJUlEgbWFzayAtIHNhbWUgYml0cyBhcyBJUlFTVEFUICovCi0jZGVmaW5lIFJFR19JUlFTVEFUCTB4MzAJLyogSVJRIHN0YXR1cyAvIGNsZWFyICovCi0KLSNkZWZpbmUgUkVHX0lNR1NJWkUJMHgzNAkvKiBJbWFnZSBzaXplICovCi0jZGVmaW5lICBJTUdTWl9WX01BU0sJICAweDFmZmYwMDAwCi0jZGVmaW5lICBJTUdTWl9WX1NISUZUCSAgMTYKLSNkZWZpbmUJIElNR1NaX0hfTUFTSwkgIDB4MDAwMDNmZmYKLSNkZWZpbmUgUkVHX0lNR09GRlNFVAkweDM4CS8qIElNYWdlIG9mZnNldCAqLwotCi0jZGVmaW5lIFJFR19DVFJMMAkweDNjCS8qIENvbnRyb2wgMCAqLwotI2RlZmluZSAgIEMwX0VOQUJMRQkgIDB4MDAwMDAwMDEJLyogTWFrZXMgdGhlIHdob2xlIHRoaW5nIGdvICovCi0KLS8qIE1hc2sgZm9yIGFsbCB0aGUgZm9ybWF0IGJpdHMgKi8KLSNkZWZpbmUgICBDMF9ERl9NQVNLCSAgMHgwMGZmZmZmYyAgICAvKiBCaXRzIDItMjMgKi8KLQotLyogUkdCIG9yZGVyaW5nICovCi0jZGVmaW5lICAgQzBfUkdCNF9SR0JYCSAgMHgwMDAwMDAwMAotI2RlZmluZQkgIEMwX1JHQjRfWFJHQgkgIDB4MDAwMDAwMDQKLSNkZWZpbmUJICBDMF9SR0I0X0JHUlgJICAweDAwMDAwMDA4Ci0jZGVmaW5lICAgQzBfUkdCNF9YQkdSCSAgMHgwMDAwMDAwYwotI2RlZmluZSAgIEMwX1JHQjVfUkdHQgkgIDB4MDAwMDAwMDAKLSNkZWZpbmUJICBDMF9SR0I1X0dSQkcJICAweDAwMDAwMDA0Ci0jZGVmaW5lCSAgQzBfUkdCNV9HQlJHCSAgMHgwMDAwMDAwOAotI2RlZmluZSAgIEMwX1JHQjVfQkdHUgkgIDB4MDAwMDAwMGMKLQotLyogU3BlYyBoYXMgdHdvIGZpZWxkcyBmb3IgRElOIGFuZCBET1VULCBidXQgdGhleSBtdXN0IG1hdGNoLCBzbwotICAgY29tYmluZSB0aGVtIGhlcmUuICovCi0jZGVmaW5lICAgQzBfREZfWVVWCSAgMHgwMDAwMDAwMCAgICAvKiBEYXRhIGlzIFlVVgkgICAgKi8KLSNkZWZpbmUgICBDMF9ERl9SR0IJICAweDAwMDAwMGEwCS8qIC4uLiBSR0IJCSAgICAqLwotI2RlZmluZSAgIEMwX0RGX0JBWUVSICAgICAweDAwMDAwMTQwCS8qIC4uLiBCYXllciAgICAgICAgICAgICAgICAqLwotLyogOC04LTggbXVzdCBiZSBtaXNzaW5nIGZyb20gdGhlIGJlbG93IC0gYXNrICovCi0jZGVmaW5lICAgQzBfUkdCRl81NjUJICAweDAwMDAwMDAwCi0jZGVmaW5lICAgQzBfUkdCRl80NDQJICAweDAwMDAwODAwCi0jZGVmaW5lICAgQzBfUkdCX0JHUgkgIDB4MDAwMDEwMDAJLyogQmx1ZSBjb21lcyBmaXJzdCAqLwotI2RlZmluZSAgIEMwX1lVVl9QTEFOQVIJICAweDAwMDAwMDAwCS8qIFlVViA0MjIgcGxhbmFyIGZvcm1hdCAqLwotI2RlZmluZSAgIEMwX1lVVl9QQUNLRUQJICAweDAwMDA4MDAwCS8qIFlVViA0MjIgcGFja2VkCSovCi0jZGVmaW5lICAgQzBfWVVWXzQyMFBMCSAgMHgwMDAwYTAwMAkvKiBZVVYgNDIwIHBsYW5hcgkqLwotLyogVGhpbmsgdGhhdCA0MjAgcGFja2VkIG11c3QgYmUgMTExIC0gYXNrICovCi0jZGVmaW5lCSAgQzBfWVVWRV9ZVVlWCSAgMHgwMDAwMDAwMAkvKiBZMUNiWTBDciAJCSovCi0jZGVmaW5lCSAgQzBfWVVWRV9ZVllVCSAgMHgwMDAxMDAwMAkvKiBZMUNyWTBDYiAJCSovCi0jZGVmaW5lCSAgQzBfWVVWRV9WWVVZCSAgMHgwMDAyMDAwMAkvKiBDclkxQ2JZMCAJCSovCi0jZGVmaW5lCSAgQzBfWVVWRV9VWVZZCSAgMHgwMDAzMDAwMAkvKiBDYlkxQ3JZMCAJCSovCi0jZGVmaW5lICAgQzBfWVVWRV9YWVVWCSAgMHgwMDAwMDAwMCAgICAvKiA0MjA6IC5ZVVYJCSovCi0jZGVmaW5lCSAgQzBfWVVWRV9YWVZVCSAgMHgwMDAxMDAwMAkvKiA0MjA6IC5ZVlUgCQkqLwotI2RlZmluZQkgIEMwX1lVVkVfWFVWWQkgIDB4MDAwMjAwMDAJLyogNDIwOiAuVVZZIAkJKi8KLSNkZWZpbmUJICBDMF9ZVVZFX1hWVVkJICAweDAwMDMwMDAwCS8qIDQyMDogLlZVWSAJCSovCi0vKiBCYXllciBiaXRzIDE4LDE5IGlmIG5lZWRlZCAqLwotI2RlZmluZSAgIEMwX0hQT0xfTE9XCSAgMHgwMTAwMDAwMAkvKiBIU1lOQyBwb2xhcml0eSBhY3RpdmUgbG93ICovCi0jZGVmaW5lICAgQzBfVlBPTF9MT1cJICAweDAyMDAwMDAwCS8qIFZTWU5DIHBvbGFyaXR5IGFjdGl2ZSBsb3cgKi8KLSNkZWZpbmUgICBDMF9WQ0xLX0xPVwkgIDB4MDQwMDAwMDAJLyogVkNMSyBvbiBmYWxsaW5nIGVkZ2UgKi8KLSNkZWZpbmUgICBDMF9ET1dOU0NBTEUJICAweDA4MDAwMDAwCS8qIEVuYWJsZSBkb3duc2NhbGVyICovCi0jZGVmaW5lCSAgQzBfU0lGTV9NQVNLCSAgMHhjMDAwMDAwMAkvKiBTSUYgbW9kZSBiaXRzICovCi0jZGVmaW5lICAgQzBfU0lGX0hWU1lOQwkgIDB4MDAwMDAwMDAJLyogVXNlIEgvVlNZTkMgKi8KLSNkZWZpbmUgICBDT19TT0ZfTk9TWU5DCSAgMHg0MDAwMDAwMAkvKiBVc2UgaW5iYW5kIGFjdGl2ZSBzaWduYWxpbmcgKi8KLQotCi0jZGVmaW5lIFJFR19DVFJMMQkweDQwCS8qIENvbnRyb2wgMSAqLwotI2RlZmluZSAgIEMxXzQ0NEFMUEhBCSAgMHgwMGYwMDAwMAkvKiBBbHBoYSBmaWVsZCBpbiBSR0I0NDQgKi8KLSNkZWZpbmUgICBDMV9BTFBIQV9TSEZUCSAgMjAKLSNkZWZpbmUgICBDMV9ETUFCMzIJICAweDAwMDAwMDAwCS8qIDMyLWJ5dGUgRE1BIGJ1cnN0ICovCi0jZGVmaW5lICAgQzFfRE1BQjE2CSAgMHgwMjAwMDAwMAkvKiAxNi1ieXRlIERNQSBidXJzdCAqLwotI2RlZmluZQkgIEMxX0RNQUI2NAkgIDB4MDQwMDAwMDAJLyogNjQtYnl0ZSBETUEgYnVyc3QgKi8KLSNkZWZpbmUJICBDMV9ETUFCX01BU0sJICAweDA2MDAwMDAwCi0jZGVmaW5lICAgQzFfVFdPQlVGUwkgIDB4MDgwMDAwMDAJLyogVXNlIG9ubHkgdHdvIERNQSBidWZmZXJzICovCi0jZGVmaW5lICAgQzFfUFdSRFdOCSAgMHgxMDAwMDAwMAkvKiBQb3dlciBkb3duICovCi0KLSNkZWZpbmUgUkVHX0NMS0NUUkwJMHg4OAkvKiBDbG9jayBjb250cm9sICovCi0jZGVmaW5lICAgQ0xLX0RJVl9NQVNLCSAgMHgwMDAwZmZmZgkvKiBVcHBlciBiaXRzIFJXICJyZXNlcnZlZCIgKi8KLQotI2RlZmluZSBSRUdfR1BSCQkweGI0CS8qIEdlbmVyYWwgcHVycG9zZSByZWdpc3Rlci4gIFRoaXMKLQkJCQkgICBjb250cm9scyBpbnB1dHMgdG8gdGhlIHBvd2VyIGFuZCByZXNldAotCQkJCSAgIHBpbnMgb24gdGhlIE9WNzY3MCB1c2VkIHdpdGggT0xQQzsKLQkJCQkgICBvdGhlciBkZXBsb3ltZW50cyBjb3VsZCBkaWZmZXIuICAqLwotI2RlZmluZSAgIEdQUl9DMUVOCSAgMHgwMDAwMDAyMAkvKiBQYWQgMSAocG93ZXIgZG93bikgZW5hYmxlICovCi0jZGVmaW5lICAgR1BSX0MwRU4JICAweDAwMDAwMDEwCS8qIFBhZCAwIChyZXNldCkgZW5hYmxlICovCi0jZGVmaW5lCSAgR1BSX0MxCSAgMHgwMDAwMDAwMgkvKiBDb250cm9sIDEgdmFsdWUgKi8KLS8qCi0gKiBDb250cm9sIDAgaXMgd2lyZWQgdG8gcmVzZXQgb24gT0xQQyBtYWNoaW5lcy4gIEZvciBvdjd4IHNlbnNvcnMsCi0gKiBpdCBpcyBhY3RpdmUgbG93LCBmb3IgMHY2eCwgaW5zdGVhZCwgaXQncyBhY3RpdmUgaGlnaC4gIFdoYXQKLSAqIGZ1bi4KLSAqLwotI2RlZmluZSAgIEdQUl9DMAkgIDB4MDAwMDAwMDEJLyogQ29udHJvbCAwIHZhbHVlICovCi0KLSNkZWZpbmUgUkVHX1RXU0lDMAkweGI4CS8qIFRXU0kgKHNtYnVzKSBjb250cm9sIDAgKi8KLSNkZWZpbmUgICBUV1NJQzBfRU4gICAgICAgMHgwMDAwMDAwMQkvKiBUV1NJIGVuYWJsZSAqLwotI2RlZmluZSAgIFRXU0lDMF9NT0RFCSAgMHgwMDAwMDAwMgkvKiAxID0gMTYtYml0LCAwID0gOC1iaXQgKi8KLSNkZWZpbmUgICBUV1NJQzBfU0lECSAgMHgwMDAwMDNmYwkvKiBTbGF2ZSBJRCAqLwotI2RlZmluZSAgIFRXU0lDMF9TSURfU0hJRlQgMgotI2RlZmluZSAgIFRXU0lDMF9DTEtESVYgICAweDAwMDdmYzAwCS8qIENsb2NrIGRpdmlkZXIgKi8KLSNkZWZpbmUgICBUV1NJQzBfTUFTS0FDSyAgMHgwMDQwMDAwMAkvKiBNYXNrIGFjayBmcm9tIHNlbnNvciAqLwotI2RlZmluZSAgIFRXU0lDMF9PVk1BR0lDICAweDAwODAwMDAwCS8qIE1ha2UgaXQgd29yayBvbiBPViBzZW5zb3JzICovCi0KLSNkZWZpbmUgUkVHX1RXU0lDMQkweGJjCS8qIFRXU0kgY29udHJvbCAxICovCi0jZGVmaW5lICAgVFdTSUMxX0RBVEEJICAweDAwMDBmZmZmCS8qIERhdGEgdG8vZnJvbSBjYW1jaGlwICovCi0jZGVmaW5lICAgVFdTSUMxX0FERFIJICAweDAwZmYwMDAwCS8qIEFkZHJlc3MgKHJlZ2lzdGVyKSAqLwotI2RlZmluZSAgIFRXU0lDMV9BRERSX1NISUZUIDE2Ci0jZGVmaW5lICAgVFdTSUMxX1JFQUQJICAweDAxMDAwMDAwCS8qIFNldCBmb3IgcmVhZCBvcCAqLwotI2RlZmluZSAgIFRXU0lDMV9XU1RBVAkgIDB4MDIwMDAwMDAJLyogV3JpdGUgc3RhdHVzICovCi0jZGVmaW5lICAgVFdTSUMxX1JWQUxJRAkgIDB4MDQwMDAwMDAJLyogUmVhZCBkYXRhIHZhbGlkICovCi0jZGVmaW5lICAgVFdTSUMxX0VSUk9SCSAgMHgwODAwMDAwMAkvKiBTb21ldGhpbmcgc2NyZXdlZCB1cCAqLwotCi0KLSNkZWZpbmUgUkVHX1VCQVIJMHhjNAkvKiBVcHBlciBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgKi8KLQotLyoKLSAqIEhlcmUncyB0aGUgd2VpcmQgZ2xvYmFsIGNvbnRyb2wgcmVnaXN0ZXJzIHdoaWNoIGFyZSBzYWlkIHRvIGxpdmUKLSAqIHdheSB1cCBoZXJlLgotICovCi0jZGVmaW5lIFJFR19HTF9DU1IgICAgIDB4MzAwNCAgLyogQ29udHJvbC9zdGF0dXMgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgICBHQ1NSX1NSUwkgMHgwMDAwMDAwMQkvKiBTVyBSZXNldCBzZXQgKi8KLSNkZWZpbmUgICBHQ1NSX1NSQyAgCSAweDAwMDAwMDAyCS8qIFNXIFJlc2V0IGNsZWFyICovCi0jZGVmaW5lCSAgR0NTUl9NUlMJIDB4MDAwMDAwMDQJLyogTWFzdGVyIHJlc2V0IHNldCAqLwotI2RlZmluZQkgIEdDU1JfTVJDCSAweDAwMDAwMDA4CS8qIEhXIFJlc2V0IGNsZWFyICovCi0jZGVmaW5lICAgR0NTUl9DQ0lDX0VOICAgMHgwMDAwNDAwMCAgICAvKiBDQ0lDIENsb2NrIGVuYWJsZSAqLwotI2RlZmluZSBSRUdfR0xfSU1BU0sgICAweDMwMGMgIC8qIEludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCi0jZGVmaW5lICAgR0lNU0tfQ0NJQ19FTiAgICAgICAgICAweDAwMDAwMDA0ICAgIC8qIENDSUMgSW50ZXJydXB0IGVuYWJsZSAqLwotCi0jZGVmaW5lIFJFR19HTF9GQ1IJMHgzMDM4ICAvKiBHUElPIGZ1bmN0aW9uYWwgY29udHJvbCByZWdpc3RlciAqLwotI2RlZmluZQkgIEdGQ1JfR1BJT19PTgkgIDB4MDgJCS8qIENhbWVyYSBHUElPIGVuYWJsZWQgKi8KLSNkZWZpbmUgUkVHX0dMX0dQSU9SCTB4MzE1YwkvKiBHUElPIHJlZ2lzdGVyICovCi0jZGVmaW5lICAgR0dQSU9fT1VUICAJCTB4ODAwMDAJLyogR1BJTyBvdXRwdXQgKi8KLSNkZWZpbmUgICBHR1BJT19WQUwgIAkJMHgwMDAwOAkvKiBPdXRwdXQgcGluIHZhbHVlICovCi0KLSNkZWZpbmUgUkVHX0xFTiAgICAgICAgICAgICAgICBSRUdfR0xfSU1BU0sgKyA0Ci0KLQotLyoKLSAqIFVzZWZ1bCBzdHVmZiB0aGF0IHByb2JhYmx5IGJlbG9uZ3Mgc29tZXdoZXJlIGdsb2JhbC4KLSAqLwotI2RlZmluZSBWR0FfV0lEVEgJNjQwCi0jZGVmaW5lIFZHQV9IRUlHSFQJNDgwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NhZmVfY2NpYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jYWZlX2NjaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY0NzAzMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NhZmVfY2NpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI2NyArMCwwIEBACi0vKgotICogQSBkcml2ZXIgZm9yIHRoZSBDTU9TIGNhbWVyYSBjb250cm9sbGVyIGluIHRoZSBNYXJ2ZWxsIDg4QUxQMDEgImNhZmUiCi0gKiBtdWx0aWZ1bmN0aW9uIGNoaXAuICBDdXJyZW50bHkgd29ya3Mgd2l0aCB0aGUgT21uaXZpc2lvbiBPVjc2NzAKLSAqIHNlbnNvci4KLSAqCi0gKiBUaGUgZGF0YSBzaGVldCBmb3IgdGhpcyBkZXZpY2UgY2FuIGJlIGZvdW5kIGF0OgotICogICAgaHR0cDovL3d3dy5tYXJ2ZWxsLmNvbS9wcm9kdWN0cy9wY19jb25uZWN0aXZpdHkvODhhbHAwMS8gCi0gKgotICogQ29weXJpZ2h0IDIwMDYgT25lIExhcHRvcCBQZXIgQ2hpbGQgQXNzb2NpYXRpb24sIEluYy4KLSAqIENvcHlyaWdodCAyMDA2LTcgSm9uYXRoYW4gQ29yYmV0IDxjb3JiZXRAbHduLm5ldD4KLSAqCi0gKiBXcml0dGVuIGJ5IEpvbmF0aGFuIENvcmJldCwgY29yYmV0QGx3bi5uZXQuCi0gKgotICogdjRsMl9kZXZpY2UvdjRsMl9zdWJkZXYgY29udmVyc2lvbiBieToKLSAqIENvcHlyaWdodCAoQykgMjAwOSBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KLSAqCi0gKiBOb3RlOiB0aGlzIGNvbnZlcnNpb24gaXMgdW50ZXN0ZWQhIFBsZWFzZSBjb250YWN0IHRoZSBsaW51eC1tZWRpYQotICogbWFpbGluZ2xpc3QgaWYgeW91IGNhbiB0ZXN0IHRoaXMsIHRvZ2V0aGVyIHdpdGggdGhlIHRlc3QgcmVzdWx0cy4KLSAqCi0gKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwKLSAqIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLQotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLSNpbmNsdWRlICJvdjc2NzAuaCIKLSNpbmNsdWRlICJjYWZlX2NjaWMtcmVncy5oIgotCi0jZGVmaW5lIENBRkVfVkVSU0lPTiAweDAwMDAwMgotCi0KLS8qCi0gKiBQYXJhbWV0ZXJzLgotICovCi1NT0RVTEVfQVVUSE9SKCJKb25hdGhhbiBDb3JiZXQgPGNvcmJldEBsd24ubmV0PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXJ2ZWxsIDg4QUxQMDEgQ01PUyBDYW1lcmEgQ29udHJvbGxlciBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9TVVBQT1JURURfREVWSUNFKCJWaWRlbyIpOwotCi0vKgotICogSW50ZXJuYWwgRE1BIGJ1ZmZlciBtYW5hZ2VtZW50LiAgU2luY2UgdGhlIGNvbnRyb2xsZXIgY2Fubm90IGRvIFMvRyBJL08sCi0gKiB3ZSBtdXN0IGhhdmUgcGh5c2ljYWxseSBjb250aWd1b3VzIGJ1ZmZlcnMgdG8gYnJpbmcgZnJhbWVzIGludG8uCi0gKiBUaGVzZSBwYXJhbWV0ZXJzIGNvbnRyb2wgaG93IG1hbnkgYnVmZmVycyB3ZSB1c2UsIHdoZXRoZXIgd2UKLSAqIGFsbG9jYXRlIHRoZW0gYXQgbG9hZCB0aW1lIChiZXR0ZXIgY2hhbmNlIG9mIHN1Y2Nlc3MsIGJ1dCBuYWlscyBkb3duCi0gKiBtZW1vcnkpIG9yIHdoZW4gc29tZWJvZHkgdHJpZXMgdG8gdXNlIHRoZSBjYW1lcmEgKHJpc2tpZXIpLCBhbmQsCi0gKiBmb3IgbG9hZC10aW1lIGFsbG9jYXRpb24sIGhvdyBiaWcgdGhleSBzaG91bGQgYmUuCi0gKgotICogVGhlIGNvbnRyb2xsZXIgY2FuIGN5Y2xlIHRocm91Z2ggdGhyZWUgYnVmZmVycy4gIFdlIGNvdWxkIHVzZQotICogbW9yZSBieSBmbGlwcGluZyBwb2ludGVycyBhcm91bmQsIGJ1dCBpdCBwcm9iYWJseSBtYWtlcyBsaXR0bGUKLSAqIHNlbnNlLgotICovCi0KLSNkZWZpbmUgTUFYX0RNQV9CVUZTIDMKLXN0YXRpYyBpbnQgYWxsb2NfYnVmc19hdF9yZWFkOwotbW9kdWxlX3BhcmFtKGFsbG9jX2J1ZnNfYXRfcmVhZCwgYm9vbCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGFsbG9jX2J1ZnNfYXRfcmVhZCwKLQkJIk5vbi16ZXJvIHZhbHVlIGNhdXNlcyBETUEgYnVmZmVycyB0byBiZSBhbGxvY2F0ZWQgd2hlbiB0aGUgIgotCQkidmlkZW8gY2FwdHVyZSBkZXZpY2UgaXMgcmVhZCwgcmF0aGVyIHRoYW4gYXQgbW9kdWxlIGxvYWQgIgotCQkidGltZS4gIFRoaXMgc2F2ZXMgbWVtb3J5LCBidXQgZGVjcmVhc2VzIHRoZSBjaGFuY2VzIG9mICIKLQkJInN1Y2Nlc3NmdWxseSBnZXR0aW5nIHRob3NlIGJ1ZmZlcnMuIik7Ci0KLXN0YXRpYyBpbnQgbl9kbWFfYnVmcyA9IDM7Ci1tb2R1bGVfcGFyYW0obl9kbWFfYnVmcywgdWludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG5fZG1hX2J1ZnMsCi0JCSJUaGUgbnVtYmVyIG9mIERNQSBidWZmZXJzIHRvIGFsbG9jYXRlLiAgQ2FuIGJlIGVpdGhlciB0d28gIgotCQkiKHNhdmVzIG1lbW9yeSwgbWFrZXMgdGltaW5nIHRpZ2h0ZXIpIG9yIHRocmVlLiIpOwotCi1zdGF0aWMgaW50IGRtYV9idWZfc2l6ZSA9IFZHQV9XSURUSCAqIFZHQV9IRUlHSFQgKiAyOyAgLyogV29yc3QgY2FzZSAqLwotbW9kdWxlX3BhcmFtKGRtYV9idWZfc2l6ZSwgdWludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRtYV9idWZfc2l6ZSwKLQkJIlRoZSBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgRE1BIGJ1ZmZlcnMuICBJZiBhY3R1YWwgb3BlcmF0aW5nICIKLQkJInBhcmFtZXRlcnMgcmVxdWlyZSBsYXJnZXIgYnVmZmVycywgYW4gYXR0ZW1wdCB0byByZWFsbG9jYXRlICIKLQkJIndpbGwgYmUgbWFkZS4iKTsKLQotc3RhdGljIGludCBtaW5fYnVmZmVycyA9IDE7Ci1tb2R1bGVfcGFyYW0obWluX2J1ZmZlcnMsIHVpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhtaW5fYnVmZmVycywKLQkJIlRoZSBtaW5pbXVtIG51bWJlciBvZiBzdHJlYW1pbmcgSS9PIGJ1ZmZlcnMgd2UgYXJlIHdpbGxpbmcgIgotCQkidG8gd29yayB3aXRoLiIpOwotCi1zdGF0aWMgaW50IG1heF9idWZmZXJzID0gMTA7Ci1tb2R1bGVfcGFyYW0obWF4X2J1ZmZlcnMsIHVpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhtYXhfYnVmZmVycywKLQkJIlRoZSBtYXhpbXVtIG51bWJlciBvZiBzdHJlYW1pbmcgSS9PIGJ1ZmZlcnMgYW4gYXBwbGljYXRpb24gIgotCQkid2lsbCBiZSBhbGxvd2VkIHRvIGFsbG9jYXRlLiAgVGhlc2UgYnVmZmVycyBhcmUgYmlnIGFuZCBsaXZlICIKLQkJImluIHZtYWxsb2Mgc3BhY2UuIik7Ci0KLXN0YXRpYyBpbnQgZmxpcDsKLW1vZHVsZV9wYXJhbShmbGlwLCBib29sLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZmxpcCwKLQkJIklmIHNldCwgdGhlIHNlbnNvciB3aWxsIGJlIGluc3RydWN0ZWQgdG8gZmxpcCB0aGUgaW1hZ2UgIgotCQkidmVydGljYWxseS4iKTsKLQotCi1lbnVtIGNhZmVfc3RhdGUgewotCVNfTk9UUkVBRFksCS8qIE5vdCB5ZXQgaW5pdGlhbGl6ZWQgKi8KLQlTX0lETEUsCQkvKiBKdXN0IGhhbmdpbmcgYXJvdW5kICovCi0JU19GTEFLRUQsCS8qIFNvbWUgc29ydCBvZiBwcm9ibGVtICovCi0JU19TSU5HTEVSRUFELAkvKiBJbiByZWFkKCkgKi8KLQlTX1NQRUNSRUFELCAgIAkvKiBTcGVjdWxhdGl2ZSByZWFkIChmb3IgZnV0dXJlIHJlYWQoKSkgKi8KLQlTX1NUUkVBTUlORwkvKiBTdHJlYW1pbmcgZGF0YSAqLwotfTsKLQotLyoKLSAqIFRyYWNraW5nIG9mIHN0cmVhbWluZyBJL08gYnVmZmVycy4KLSAqLwotc3RydWN0IGNhZmVfc2lvX2J1ZmZlciB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCB2NGwyX2J1ZmZlciB2NGxidWY7Ci0JY2hhciAqYnVmZmVyOyAgIC8qIFdoZXJlIGl0IGxpdmVzIGluIGtlcm5lbCBzcGFjZSAqLwotCWludCBtYXBjb3VudDsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbTsKLX07Ci0KLS8qCi0gKiBBIGRlc2NyaXB0aW9uIG9mIG9uZSBvZiBvdXIgZGV2aWNlcy4KLSAqIExvY2tpbmc6IGNvbnRyb2xsZWQgYnkgc19tdXRleC4gIENlcnRhaW4gZmllbGRzLCBob3dldmVyLCByZXF1aXJlCi0gKiAJICAgIHRoZSBkZXZfbG9jayBzcGlubG9jazsgdGhleSBhcmUgbWFya2VkIGFzIHN1Y2ggYnkgY29tbWVudHMuCi0gKgkgICAgZGV2X2xvY2sgaXMgYWxzbyByZXF1aXJlZCBmb3IgYWNjZXNzIHRvIGRldmljZSByZWdpc3RlcnMuCi0gKi8KLXN0cnVjdCBjYWZlX2NhbWVyYQotewotCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKLQllbnVtIGNhZmVfc3RhdGUgc3RhdGU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsgICAJCS8qIEJ1ZmZlciBzdGF0dXMsIG1haW5seSAoZGV2X2xvY2spICovCi0JaW50IHVzZXJzOwkJCS8qIEhvdyBtYW55IG9wZW4gRkRzICovCi0Jc3RydWN0IGZpbGUgKm93bmVyOwkJLyogV2hvIGhhcyBkYXRhIGFjY2VzcyAodjRsMikgKi8KLQotCS8qCi0JICogU3Vic3lzdGVtIHN0cnVjdHVyZXMuCi0JICovCi0Jc3RydWN0IHBjaV9kZXYgKnBkZXY7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSB2ZGV2OwotCXN0cnVjdCBpMmNfYWRhcHRlciBpMmNfYWRhcHRlcjsKLQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNlbnNvcjsKLQl1bnNpZ25lZCBzaG9ydCBzZW5zb3JfYWRkcjsKLQotCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqcmVnczsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGRldl9saXN0OwkvKiBsaW5rIHRvIG90aGVyIGRldmljZXMgKi8KLQotCS8qIERNQSBidWZmZXJzICovCi0JdW5zaWduZWQgaW50IG5idWZzOwkJLyogSG93IG1hbnkgYXJlIGFsbG9jJ2QgKi8KLQlpbnQgbmV4dF9idWY7CQkJLyogTmV4dCB0byBjb25zdW1lIChkZXZfbG9jaykgKi8KLQl1bnNpZ25lZCBpbnQgZG1hX2J1Zl9zaXplOyAgCS8qIGFsbG9jYXRlZCBzaXplICovCi0Jdm9pZCAqZG1hX2J1ZnNbTUFYX0RNQV9CVUZTXTsJLyogSW50ZXJuYWwgYnVmZmVyIGFkZHJlc3NlcyAqLwotCWRtYV9hZGRyX3QgZG1hX2hhbmRsZXNbTUFYX0RNQV9CVUZTXTsgLyogQnVmZmVyIGJ1cyBhZGRyZXNzZXMgKi8KLQl1bnNpZ25lZCBpbnQgc3BlY2ZyYW1lczsJLyogVW5jb25zdW1lZCBzcGVjIGZyYW1lcyAoZGV2X2xvY2spICovCi0JdW5zaWduZWQgaW50IHNlcXVlbmNlOwkJLyogRnJhbWUgc2VxdWVuY2UgbnVtYmVyICovCi0JdW5zaWduZWQgaW50IGJ1Zl9zZXFbTUFYX0RNQV9CVUZTXTsgLyogU2VxdWVuY2UgZm9yIGluZGl2aWR1YWwgYnVmZmVycyAqLwotCi0JLyogU3RyZWFtaW5nIGJ1ZmZlcnMgKi8KLQl1bnNpZ25lZCBpbnQgbl9zYnVmczsJCS8qIEhvdyBtYW55IHdlIGhhdmUgKi8KLQlzdHJ1Y3QgY2FmZV9zaW9fYnVmZmVyICpzYl9idWZzOyAvKiBUaGUgYXJyYXkgb2YgaG91c2VrZWVwaW5nIHN0cnVjdHMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIHNiX2F2YWlsOwkvKiBBdmFpbGFibGUgZm9yIGRhdGEgKHdlIG93bikgKGRldl9sb2NrKSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgc2JfZnVsbDsJLyogV2l0aCBkYXRhICh1c2VyIHNwYWNlIG93bnMpIChkZXZfbG9jaykgKi8KLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3Qgc190YXNrbGV0OwotCi0JLyogQ3VycmVudCBvcGVyYXRpbmcgcGFyYW1ldGVycyAqLwotCXUzMiBzZW5zb3JfdHlwZTsJCS8qIEN1cnJlbnRseSBvdjc2NzAgb25seSAqLwotCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgcGl4X2Zvcm1hdDsKLQllbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgbWJ1c19jb2RlOwotCi0JLyogTG9ja3MgKi8KLQlzdHJ1Y3QgbXV0ZXggc19tdXRleDsgLyogQWNjZXNzIHRvIHRoaXMgc3RydWN0dXJlICovCi0Jc3BpbmxvY2tfdCBkZXZfbG9jazsgIC8qIEFjY2VzcyB0byBkZXZpY2UgKi8KLQotCS8qIE1pc2MgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBzbWJ1c193YWl0OwkvKiBXYWl0aW5nIG9uIGkyYyBldmVudHMgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBpb3dhaXQ7CS8qIFdhaXRpbmcgb24gZnJhbWUgZGF0YSAqLwotfTsKLQotLyoKLSAqIFN0YXR1cyBmbGFncy4gIEFsd2F5cyBtYW5pcHVsYXRlZCB3aXRoIGJpdCBvcGVyYXRpb25zLgotICovCi0jZGVmaW5lIENGX0JVRjBfVkFMSUQJIDAJLyogQnVmZmVycyB2YWxpZCAtIGZpcnN0IHRocmVlICovCi0jZGVmaW5lIENGX0JVRjFfVkFMSUQJIDEKLSNkZWZpbmUgQ0ZfQlVGMl9WQUxJRAkgMgotI2RlZmluZSBDRl9ETUFfQUNUSVZFCSAzCS8qIEEgZnJhbWUgaXMgaW5jb21pbmcgKi8KLSNkZWZpbmUgQ0ZfQ09ORklHX05FRURFRCA0CS8qIE11c3QgY29uZmlndXJlIGhhcmR3YXJlICovCi0KLSNkZWZpbmUgc2Vuc29yX2NhbGwoY2FtLCBvLCBmLCBhcmdzLi4uKSBcCi0JdjRsMl9zdWJkZXZfY2FsbChjYW0tPnNlbnNvciwgbywgZiwgIyNhcmdzKQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBjYWZlX2NhbWVyYSAqdG9fY2FtKHN0cnVjdCB2NGwyX2RldmljZSAqZGV2KQotewotCXJldHVybiBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgY2FmZV9jYW1lcmEsIHY0bDJfZGV2KTsKLX0KLQotc3RhdGljIHN0cnVjdCBjYWZlX2Zvcm1hdF9zdHJ1Y3QgewotCV9fdTggKmRlc2M7Ci0JX191MzIgcGl4ZWxmb3JtYXQ7Ci0JaW50IGJwcDsgICAvKiBCeXRlcyBwZXIgcGl4ZWwgKi8KLQllbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgbWJ1c19jb2RlOwotfSBjYWZlX2Zvcm1hdHNbXSA9IHsKLQl7Ci0JCS5kZXNjCQk9ICJZVVlWIDQ6MjoyIiwKLQkJLnBpeGVsZm9ybWF0CT0gVjRMMl9QSVhfRk1UX1lVWVYsCi0JCS5tYnVzX2NvZGUJPSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOCwKLQkJLmJwcAkJPSAyLAotCX0sCi0JewotCQkuZGVzYwkJPSAiUkdCIDQ0NCIsCi0JCS5waXhlbGZvcm1hdAk9IFY0TDJfUElYX0ZNVF9SR0I0NDQsCi0JCS5tYnVzX2NvZGUJPSBWNEwyX01CVVNfRk1UX1JHQjQ0NF8yWDhfUEFESElfTEUsCi0JCS5icHAJCT0gMiwKLQl9LAotCXsKLQkJLmRlc2MJCT0gIlJHQiA1NjUiLAotCQkucGl4ZWxmb3JtYXQJPSBWNEwyX1BJWF9GTVRfUkdCNTY1LAotCQkubWJ1c19jb2RlCT0gVjRMMl9NQlVTX0ZNVF9SR0I1NjVfMlg4X0xFLAotCQkuYnBwCQk9IDIsCi0JfSwKLQl7Ci0JCS5kZXNjCQk9ICJSYXcgUkdCIEJheWVyIiwKLQkJLnBpeGVsZm9ybWF0CT0gVjRMMl9QSVhfRk1UX1NCR0dSOCwKLQkJLm1idXNfY29kZQk9IFY0TDJfTUJVU19GTVRfU0JHR1I4XzFYOCwKLQkJLmJwcAkJPSAxCi0JfSwKLX07Ci0jZGVmaW5lIE5fQ0FGRV9GTVRTIEFSUkFZX1NJWkUoY2FmZV9mb3JtYXRzKQotCi1zdGF0aWMgc3RydWN0IGNhZmVfZm9ybWF0X3N0cnVjdCAqY2FmZV9maW5kX2Zvcm1hdCh1MzIgcGl4ZWxmb3JtYXQpCi17Ci0JdW5zaWduZWQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBOX0NBRkVfRk1UUzsgaSsrKQotCQlpZiAoY2FmZV9mb3JtYXRzW2ldLnBpeGVsZm9ybWF0ID09IHBpeGVsZm9ybWF0KQotCQkJcmV0dXJuIGNhZmVfZm9ybWF0cyArIGk7Ci0JLyogTm90IGZvdW5kPyBUaGVuIHJldHVybiB0aGUgZmlyc3QgZm9ybWF0LiAqLwotCXJldHVybiBjYWZlX2Zvcm1hdHM7Ci19Ci0KLS8qCi0gKiBTdGFydCBvdmVyIHdpdGggRE1BIGJ1ZmZlcnMgLSBkZXZfbG9jayBuZWVkZWQuCi0gKi8KLXN0YXRpYyB2b2lkIGNhZmVfcmVzZXRfYnVmZmVycyhzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQlpbnQgaTsKLQotCWNhbS0+bmV4dF9idWYgPSAtMTsKLQlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uYnVmczsgaSsrKQotCQljbGVhcl9iaXQoaSwgJmNhbS0+ZmxhZ3MpOwotCWNhbS0+c3BlY2ZyYW1lcyA9IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGNhZmVfbmVlZHNfY29uZmlnKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCXJldHVybiB0ZXN0X2JpdChDRl9DT05GSUdfTkVFREVELCAmY2FtLT5mbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNhZmVfc2V0X2NvbmZpZ19uZWVkZWQoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0sIGludCBuZWVkZWQpCi17Ci0JaWYgKG5lZWRlZCkKLQkJc2V0X2JpdChDRl9DT05GSUdfTkVFREVELCAmY2FtLT5mbGFncyk7Ci0JZWxzZQotCQljbGVhcl9iaXQoQ0ZfQ09ORklHX05FRURFRCwgJmNhbS0+ZmxhZ3MpOwotfQotCi0KLQotCi0vKgotICogRGVidWdnaW5nIGFuZCByZWxhdGVkLgotICovCi0jZGVmaW5lIGNhbV9lcnIoY2FtLCBmbXQsIGFyZy4uLikgXAotCWRldl9lcnIoJihjYW0pLT5wZGV2LT5kZXYsIGZtdCwgIyNhcmcpOwotI2RlZmluZSBjYW1fd2FybihjYW0sIGZtdCwgYXJnLi4uKSBcCi0JZGV2X3dhcm4oJihjYW0pLT5wZGV2LT5kZXYsIGZtdCwgIyNhcmcpOwotI2RlZmluZSBjYW1fZGJnKGNhbSwgZm10LCBhcmcuLi4pIFwKLQlkZXZfZGJnKCYoY2FtKS0+cGRldi0+ZGV2LCBmbXQsICMjYXJnKTsKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotICogRGV2aWNlIHJlZ2lzdGVyIEkvTwotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgY2FmZV9yZWdfd3JpdGUoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0sIHVuc2lnbmVkIGludCByZWcsCi0JCXVuc2lnbmVkIGludCB2YWwpCi17Ci0JaW93cml0ZTMyKHZhbCwgY2FtLT5yZWdzICsgcmVnKTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2FmZV9yZWdfcmVhZChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSwKLQkJdW5zaWduZWQgaW50IHJlZykKLXsKLQlyZXR1cm4gaW9yZWFkMzIoY2FtLT5yZWdzICsgcmVnKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2FmZV9yZWdfd3JpdGVfbWFzayhzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSwgdW5zaWduZWQgaW50IHJlZywKLQkJdW5zaWduZWQgaW50IHZhbCwgdW5zaWduZWQgaW50IG1hc2spCi17Ci0JdW5zaWduZWQgaW50IHYgPSBjYWZlX3JlZ19yZWFkKGNhbSwgcmVnKTsKLQotCXYgPSAodiAmIH5tYXNrKSB8ICh2YWwgJiBtYXNrKTsKLQljYWZlX3JlZ193cml0ZShjYW0sIHJlZywgdik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjYWZlX3JlZ19jbGVhcl9iaXQoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0sCi0JCXVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWwpCi17Ci0JY2FmZV9yZWdfd3JpdGVfbWFzayhjYW0sIHJlZywgMCwgdmFsKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNhZmVfcmVnX3NldF9iaXQoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0sCi0JCXVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWwpCi17Ci0JY2FmZV9yZWdfd3JpdGVfbWFzayhjYW0sIHJlZywgdmFsLCB2YWwpOwotfQotCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBUaGUgSTJDL1NNQlVTIGludGVyZmFjZSB0byB0aGUgY2FtZXJhIGl0c2VsZiBzdGFydHMgaGVyZS4gIFRoZQotICogY29udHJvbGxlciBoYW5kbGVzIFNNQlVTIGl0c2VsZiwgcHJlc2VudGluZyBhIHJlbGF0aXZlbHkgc2ltcGxlIHJlZ2lzdGVyCi0gKiBpbnRlcmZhY2U7IGFsbCB3ZSBoYXZlIHRvIGRvIGlzIHRvIHRlbGwgaXQgd2hlcmUgdG8gcm91dGUgdGhlIGRhdGEuCi0gKi8KLSNkZWZpbmUgQ0FGRV9TTUJVU19USU1FT1VUIChIWikgIC8qIGdlbmVyb3VzICovCi0KLXN0YXRpYyBpbnQgY2FmZV9zbWJ1c193cml0ZV9kb25lKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGMxOwotCi0JLyoKLQkgKiBXZSBtdXN0IGRlbGF5IGFmdGVyIHRoZSBpbnRlcnJ1cHQsIG9yIHRoZSBjb250cm9sbGVyIGdldHMgY29uZnVzZWQKLQkgKiBhbmQgbmV2ZXIgZG9lcyBnaXZlIHVzIGdvb2Qgc3RhdHVzLiAgRm9ydHVuYXRlbHksIHdlIGRvbid0IGRvIHRoaXMKLQkgKiBvZnRlbi4KLQkgKi8KLQl1ZGVsYXkoMjApOwotCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JYzEgPSBjYWZlX3JlZ19yZWFkKGNhbSwgUkVHX1RXU0lDMSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCXJldHVybiAoYzEgJiAoVFdTSUMxX1dTVEFUfFRXU0lDMV9FUlJPUikpICE9IFRXU0lDMV9XU1RBVDsKLX0KLQotc3RhdGljIGludCBjYWZlX3NtYnVzX3dyaXRlX2RhdGEoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0sCi0JCXUxNiBhZGRyLCB1OCBjb21tYW5kLCB1OCB2YWx1ZSkKLXsKLQl1bnNpZ25lZCBpbnQgcnZhbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQlydmFsID0gVFdTSUMwX0VOIHwgKChhZGRyIDw8IFRXU0lDMF9TSURfU0hJRlQpICYgVFdTSUMwX1NJRCk7Ci0JcnZhbCB8PSBUV1NJQzBfT1ZNQUdJQzsgIC8qIE1ha2UgT1Ygc2Vuc29ycyB3b3JrICovCi0JLyoKLQkgKiBNYXJ2ZWxsIHNleiBzZXQgY2xrZGl2IHRvIGFsbCAxJ3MgZm9yIG5vdy4KLQkgKi8KLQlydmFsIHw9IFRXU0lDMF9DTEtESVY7Ci0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfVFdTSUMwLCBydmFsKTsKLQkodm9pZCkgY2FmZV9yZWdfcmVhZChjYW0sIFJFR19UV1NJQzEpOyAvKiBmb3JjZSB3cml0ZSAqLwotCXJ2YWwgPSB2YWx1ZSB8ICgoY29tbWFuZCA8PCBUV1NJQzFfQUREUl9TSElGVCkgJiBUV1NJQzFfQUREUik7Ci0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfVFdTSUMxLCBydmFsKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0KLQkvKiBVbmZvcnR1bmF0ZWx5LCByZWFkaW5nIFRXU0lDMSB0b28gc29vbiBhZnRlciBzZW5kaW5nIGEgY29tbWFuZAotCSAqIGNhdXNlcyB0aGUgZGV2aWNlIHRvIGRpZS4KLQkgKiBVc2UgYSBidXN5LXdhaXQgYmVjYXVzZSB3ZSBvZnRlbiBzZW5kIGEgbGFyZ2UgcXVhbnRpdHkgb2Ygc21hbGwKLQkgKiBjb21tYW5kcyBhdC1vbmNlOyB1c2luZyBtc2xlZXAoKSB3b3VsZCBjYXVzZSBhIGxvdCBvZiBjb250ZXh0Ci0JICogc3dpdGNoZXMgd2hpY2ggdGFrZSBsb25nZXIgdGhhbiAybXMsIHJlc3VsdGluZyBpbiBhIG5vdGljZWFibGUKLQkgKiBib290LXRpbWUgYW5kIGNhcHR1cmUtc3RhcnQgZGVsYXlzLgotCSAqLwotCW1kZWxheSgyKTsKLQotCS8qCi0JICogQW5vdGhlciBzYWQgZmFjdCBpcyB0aGF0IHNvbWV0aW1lcywgY29tbWFuZHMgc2lsZW50bHkgY29tcGxldGUgYnV0Ci0JICogY2FmZV9zbWJ1c193cml0ZV9kb25lKCkgbmV2ZXIgYmVjb21lcyBhd2FyZSBvZiB0aGlzLgotCSAqIFRoaXMgaGFwcGVucyBhdCByYW5kb20gYW5kIGFwcGVhcnMgdG8gcG9zc2libGUgb2NjdXIgd2l0aCBhbnkKLQkgKiBjb21tYW5kLgotCSAqIFdlIGRvbid0IHVuZGVyc3RhbmQgd2h5IHRoaXMgaXMuIFdlIHdvcmsgYXJvdW5kIHRoaXMgaXNzdWUKLQkgKiB3aXRoIHRoZSB0aW1lb3V0IGluIHRoZSB3YWl0IGJlbG93LCBhc3N1bWluZyB0aGF0IGFsbCBjb21tYW5kcwotCSAqIGNvbXBsZXRlIHdpdGhpbiB0aGUgdGltZW91dC4KLQkgKi8KLQl3YWl0X2V2ZW50X3RpbWVvdXQoY2FtLT5zbWJ1c193YWl0LCBjYWZlX3NtYnVzX3dyaXRlX2RvbmUoY2FtKSwKLQkJCUNBRkVfU01CVVNfVElNRU9VVCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCXJ2YWwgPSBjYWZlX3JlZ19yZWFkKGNhbSwgUkVHX1RXU0lDMSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCi0JaWYgKHJ2YWwgJiBUV1NJQzFfV1NUQVQpIHsKLQkJY2FtX2VycihjYW0sICJTTUJVUyB3cml0ZSAoJTAyeC8lMDJ4LyUwMngpIHRpbWVkIG91dFxuIiwgYWRkciwKLQkJCQljb21tYW5kLCB2YWx1ZSk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlpZiAocnZhbCAmIFRXU0lDMV9FUlJPUikgewotCQljYW1fZXJyKGNhbSwgIlNNQlVTIHdyaXRlICglMDJ4LyUwMngvJTAyeCkgZXJyb3JcbiIsIGFkZHIsCi0JCQkJY29tbWFuZCwgdmFsdWUpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLQotCi1zdGF0aWMgaW50IGNhZmVfc21idXNfcmVhZF9kb25lKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGMxOwotCi0JLyoKLQkgKiBXZSBtdXN0IGRlbGF5IGFmdGVyIHRoZSBpbnRlcnJ1cHQsIG9yIHRoZSBjb250cm9sbGVyIGdldHMgY29uZnVzZWQKLQkgKiBhbmQgbmV2ZXIgZG9lcyBnaXZlIHVzIGdvb2Qgc3RhdHVzLiAgRm9ydHVuYXRlbHksIHdlIGRvbid0IGRvIHRoaXMKLQkgKiBvZnRlbi4KLQkgKi8KLQl1ZGVsYXkoMjApOwotCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JYzEgPSBjYWZlX3JlZ19yZWFkKGNhbSwgUkVHX1RXU0lDMSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCXJldHVybiBjMSAmIChUV1NJQzFfUlZBTElEfFRXU0lDMV9FUlJPUik7Ci19Ci0KLQotCi1zdGF0aWMgaW50IGNhZmVfc21idXNfcmVhZF9kYXRhKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLAotCQl1MTYgYWRkciwgdTggY29tbWFuZCwgdTggKnZhbHVlKQotewotCXVuc2lnbmVkIGludCBydmFsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCXJ2YWwgPSBUV1NJQzBfRU4gfCAoKGFkZHIgPDwgVFdTSUMwX1NJRF9TSElGVCkgJiBUV1NJQzBfU0lEKTsKLQlydmFsIHw9IFRXU0lDMF9PVk1BR0lDOyAvKiBNYWtlIE9WIHNlbnNvcnMgd29yayAqLwotCS8qCi0JICogTWFydmVsIHNleiBzZXQgY2xrZGl2IHRvIGFsbCAxJ3MgZm9yIG5vdy4KLQkgKi8KLQlydmFsIHw9IFRXU0lDMF9DTEtESVY7Ci0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfVFdTSUMwLCBydmFsKTsKLQkodm9pZCkgY2FmZV9yZWdfcmVhZChjYW0sIFJFR19UV1NJQzEpOyAvKiBmb3JjZSB3cml0ZSAqLwotCXJ2YWwgPSBUV1NJQzFfUkVBRCB8ICgoY29tbWFuZCA8PCBUV1NJQzFfQUREUl9TSElGVCkgJiBUV1NJQzFfQUREUik7Ci0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfVFdTSUMxLCBydmFsKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0KLQl3YWl0X2V2ZW50X3RpbWVvdXQoY2FtLT5zbWJ1c193YWl0LAotCQkJY2FmZV9zbWJ1c19yZWFkX2RvbmUoY2FtKSwgQ0FGRV9TTUJVU19USU1FT1VUKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCXJ2YWwgPSBjYWZlX3JlZ19yZWFkKGNhbSwgUkVHX1RXU0lDMSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCi0JaWYgKHJ2YWwgJiBUV1NJQzFfRVJST1IpIHsKLQkJY2FtX2VycihjYW0sICJTTUJVUyByZWFkICglMDJ4LyUwMngpIGVycm9yXG4iLCBhZGRyLCBjb21tYW5kKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCWlmICghIChydmFsICYgVFdTSUMxX1JWQUxJRCkpIHsKLQkJY2FtX2VycihjYW0sICJTTUJVUyByZWFkICglMDJ4LyUwMngpIHRpbWVkIG91dFxuIiwgYWRkciwKLQkJCQljb21tYW5kKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCSp2YWx1ZSA9IHJ2YWwgJiAweGZmOwotCXJldHVybiAwOwotfQotCi0vKgotICogUGVyZm9ybSBhIHRyYW5zZmVyIG92ZXIgU01CVVMuICBUaGlzIHRoaW5nIGlzIGNhbGxlZCB1bmRlcgotICogdGhlIGkyYyBidXMgbG9jaywgc28gd2Ugc2hvdWxkbid0IHJhY2Ugd2l0aCBvdXJzZWx2ZXMuLi4KLSAqLwotc3RhdGljIGludCBjYWZlX3NtYnVzX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCB1MTYgYWRkciwKLQkJdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGNoYXIgcncsIHU4IGNvbW1hbmQsCi0JCWludCBzaXplLCB1bmlvbiBpMmNfc21idXNfZGF0YSAqZGF0YSkKLXsKLQlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2ID0gaTJjX2dldF9hZGFwZGF0YShhZGFwdGVyKTsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHRvX2NhbSh2NGwyX2Rldik7Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0KLQkvKgotCSAqIFRoaXMgaW50ZXJmYWNlIHdvdWxkIGFwcGVhciB0byBvbmx5IGRvIGJ5dGUgZGF0YSBvcHMuICBPSwotCSAqIGl0IGNhbiBkbyB3b3JkIHRvbywgYnV0IHRoZSBjYW0gY2hpcCBoYXMgbm8gdXNlIGZvciB0aGF0LgotCSAqLwotCWlmIChzaXplICE9IEkyQ19TTUJVU19CWVRFX0RBVEEpIHsKLQkJY2FtX2VycihjYW0sICJmdW5reSB4ZmVyIHNpemUgJWRcbiIsIHNpemUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAocncgPT0gSTJDX1NNQlVTX1dSSVRFKQotCQlyZXQgPSBjYWZlX3NtYnVzX3dyaXRlX2RhdGEoY2FtLCBhZGRyLCBjb21tYW5kLCBkYXRhLT5ieXRlKTsKLQllbHNlIGlmIChydyA9PSBJMkNfU01CVVNfUkVBRCkKLQkJcmV0ID0gY2FmZV9zbWJ1c19yZWFkX2RhdGEoY2FtLCBhZGRyLCBjb21tYW5kLCAmZGF0YS0+Ynl0ZSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgdm9pZCBjYWZlX3NtYnVzX2VuYWJsZV9pcnEoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JY2FmZV9yZWdfc2V0X2JpdChjYW0sIFJFR19JUlFNQVNLLCBUV1NJSVJRUyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdTMyIGNhZmVfc21idXNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JcmV0dXJuIEkyQ19GVU5DX1NNQlVTX1JFQURfQllURV9EQVRBICB8Ci0JICAgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEVfREFUQTsKLX0KLQotc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGNhZmVfc21idXNfYWxnbyA9IHsKLQkuc21idXNfeGZlciA9IGNhZmVfc21idXNfeGZlciwKLQkuZnVuY3Rpb25hbGl0eSA9IGNhZmVfc21idXNfZnVuYwotfTsKLQotLyogU29tZWJvZHkgaXMgb24gdGhlIGJ1cyAqLwotc3RhdGljIHZvaWQgY2FmZV9jdGxyX3N0b3BfZG1hKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKTsKLXN0YXRpYyB2b2lkIGNhZmVfY3Rscl9wb3dlcl9kb3duKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKTsKLQotc3RhdGljIGludCBjYWZlX3NtYnVzX3NldHVwKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCA9ICZjYW0tPmkyY19hZGFwdGVyOwotCWludCByZXQ7Ci0KLQljYWZlX3NtYnVzX2VuYWJsZV9pcnEoY2FtKTsKLQlhZGFwLT5vd25lciA9IFRISVNfTU9EVUxFOwotCWFkYXAtPmFsZ28gPSAmY2FmZV9zbWJ1c19hbGdvOwotCXN0cmNweShhZGFwLT5uYW1lLCAiY2FmZV9jY2ljIik7Ci0JYWRhcC0+ZGV2LnBhcmVudCA9ICZjYW0tPnBkZXYtPmRldjsKLQlpMmNfc2V0X2FkYXBkYXRhKGFkYXAsICZjYW0tPnY0bDJfZGV2KTsKLQlyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoYWRhcCk7Ci0JaWYgKHJldCkKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcmVnaXN0ZXIgY2FmZSBpMmMgYWRhcHRlclxuIik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgY2FmZV9zbWJ1c19zaHV0ZG93bihzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQlpMmNfZGVsX2FkYXB0ZXIoJmNhbS0+aTJjX2FkYXB0ZXIpOwotfQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBEZWFsIHdpdGggdGhlIGNvbnRyb2xsZXIuCi0gKi8KLQotLyoKLSAqIERvIGV2ZXJ5dGhpbmcgd2UgdGhpbmsgd2UgbmVlZCB0byBoYXZlIHRoZSBpbnRlcmZhY2Ugb3BlcmF0aW5nCi0gKiBhY2NvcmRpbmcgdG8gdGhlIGRlc2lyZWQgZm9ybWF0LgotICovCi1zdGF0aWMgdm9pZCBjYWZlX2N0bHJfZG1hKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCS8qCi0JICogU3RvcmUgdGhlIGZpcnN0IHR3byBZIGJ1ZmZlcnMgKHdlIGFyZW4ndCBzdXBwb3J0aW5nCi0JICogcGxhbmFyIGZvcm1hdHMgZm9yIG5vdywgc28gbm8gVVYgYnVmcykuICBUaGVuIGVpdGhlcgotCSAqIHNldCB0aGUgdGhpcmQgaWYgaXQgZXhpc3RzLCBvciB0ZWxsIHRoZSBjb250cm9sbGVyCi0JICogdG8ganVzdCB1c2UgdHdvLgotCSAqLwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX1kwQkFSLCBjYW0tPmRtYV9oYW5kbGVzWzBdKTsKLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19ZMUJBUiwgY2FtLT5kbWFfaGFuZGxlc1sxXSk7Ci0JaWYgKGNhbS0+bmJ1ZnMgPiAyKSB7Ci0JCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX1kyQkFSLCBjYW0tPmRtYV9oYW5kbGVzWzJdKTsKLQkJY2FmZV9yZWdfY2xlYXJfYml0KGNhbSwgUkVHX0NUUkwxLCBDMV9UV09CVUZTKTsKLQl9Ci0JZWxzZQotCQljYWZlX3JlZ19zZXRfYml0KGNhbSwgUkVHX0NUUkwxLCBDMV9UV09CVUZTKTsKLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19VQkFSLCAwKTsgLyogMzIgYml0cyBvbmx5IGZvciBub3cgKi8KLX0KLQotc3RhdGljIHZvaWQgY2FmZV9jdGxyX2ltYWdlKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCWludCBpbWdzejsKLQlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpmbXQgPSAmY2FtLT5waXhfZm9ybWF0OwotCi0JaW1nc3ogPSAoKGZtdC0+aGVpZ2h0IDw8IElNR1NaX1ZfU0hJRlQpICYgSU1HU1pfVl9NQVNLKSB8Ci0JCShmbXQtPmJ5dGVzcGVybGluZSAmIElNR1NaX0hfTUFTSyk7Ci0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfSU1HU0laRSwgaW1nc3opOwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0lNR09GRlNFVCwgMCk7Ci0JLyogWVBJVENIIGp1c3QgZHJvcHMgdGhlIGxhc3QgdHdvIGJpdHMgKi8KLQljYWZlX3JlZ193cml0ZV9tYXNrKGNhbSwgUkVHX0lNR1BJVENILCBmbXQtPmJ5dGVzcGVybGluZSwKLQkJCUlNR1BfWVBfTUFTSyk7Ci0JLyoKLQkgKiBUZWxsIHRoZSBjb250cm9sbGVyIGFib3V0IHRoZSBpbWFnZSBmb3JtYXQgd2UgYXJlIHVzaW5nLgotCSAqLwotCXN3aXRjaCAoY2FtLT5waXhfZm9ybWF0LnBpeGVsZm9ybWF0KSB7Ci0JY2FzZSBWNEwyX1BJWF9GTVRfWVVZVjoKLQkgICAgY2FmZV9yZWdfd3JpdGVfbWFzayhjYW0sIFJFR19DVFJMMCwKLQkJCSAgICBDMF9ERl9ZVVZ8QzBfWVVWX1BBQ0tFRHxDMF9ZVVZFX1lVWVYsCi0JCQkgICAgQzBfREZfTUFTSyk7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBWNEwyX1BJWF9GTVRfUkdCNDQ0OgotCSAgICBjYWZlX3JlZ193cml0ZV9tYXNrKGNhbSwgUkVHX0NUUkwwLAotCQkJICAgIEMwX0RGX1JHQnxDMF9SR0JGXzQ0NHxDMF9SR0I0X1hSR0IsCi0JCQkgICAgQzBfREZfTUFTSyk7Ci0JCS8qIEFscGhhIHZhbHVlPyAqLwotCSAgICBicmVhazsKLQotCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU2NToKLQkgICAgY2FmZV9yZWdfd3JpdGVfbWFzayhjYW0sIFJFR19DVFJMMCwKLQkJCSAgICBDMF9ERl9SR0J8QzBfUkdCRl81NjV8QzBfUkdCNV9CR0dSLAotCQkJICAgIEMwX0RGX01BU0spOwotCSAgICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAgIGNhbV9lcnIoY2FtLCAiVW5rbm93biBmb3JtYXQgJXhcbiIsIGNhbS0+cGl4X2Zvcm1hdC5waXhlbGZvcm1hdCk7Ci0JICAgIGJyZWFrOwotCX0KLQkvKgotCSAqIE1ha2Ugc3VyZSBpdCBrbm93cyB3ZSB3YW50IHRvIHVzZSBoc3luYy92c3luYy4KLQkgKi8KLQljYWZlX3JlZ193cml0ZV9tYXNrKGNhbSwgUkVHX0NUUkwwLCBDMF9TSUZfSFZTWU5DLAotCQkJQzBfU0lGTV9NQVNLKTsKLX0KLQotCi0vKgotICogQ29uZmlndXJlIHRoZSBjb250cm9sbGVyIGZvciBvcGVyYXRpb247IGNhbGxlciBob2xkcyB0aGUKLSAqIGRldmljZSBtdXRleC4KLSAqLwotc3RhdGljIGludCBjYWZlX2N0bHJfY29uZmlndXJlKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCWNhZmVfY3Rscl9kbWEoY2FtKTsKLQljYWZlX2N0bHJfaW1hZ2UoY2FtKTsKLQljYWZlX3NldF9jb25maWdfbmVlZGVkKGNhbSwgMCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBjYWZlX2N0bHJfaXJxX2VuYWJsZShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQkvKgotCSAqIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdHMsIHNpbmNlIHdlIGRvIG5vdAotCSAqIGV4cGVjdCB0byBoYXZlIEkvTyBhY3RpdmUgcHJpb3IgdG8gZW5hYmxpbmcuCi0JICovCi0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfSVJRU1RBVCwgRlJBTUVJUlFTKTsKLQljYWZlX3JlZ19zZXRfYml0KGNhbSwgUkVHX0lSUU1BU0ssIEZSQU1FSVJRUyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNhZmVfY3Rscl9pcnFfZGlzYWJsZShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQljYWZlX3JlZ19jbGVhcl9iaXQoY2FtLCBSRUdfSVJRTUFTSywgRlJBTUVJUlFTKTsKLX0KLQotLyoKLSAqIE1ha2UgdGhlIGNvbnRyb2xsZXIgc3RhcnQgZ3JhYmJpbmcgaW1hZ2VzLiAgRXZlcnl0aGluZyBtdXN0Ci0gKiBiZSBzZXQgdXAgYmVmb3JlIGRvaW5nIHRoaXMuCi0gKi8KLXN0YXRpYyB2b2lkIGNhZmVfY3Rscl9zdGFydChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQkvKiBzZXRfYml0IHBlcmZvcm1zIGEgcmVhZCwgc28gbm8gb3RoZXIgYmFycmllciBzaG91bGQgYmUKLQkgICBuZWVkZWQgaGVyZSAqLwotCWNhZmVfcmVnX3NldF9iaXQoY2FtLCBSRUdfQ1RSTDAsIEMwX0VOQUJMRSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNhZmVfY3Rscl9zdG9wKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCWNhZmVfcmVnX2NsZWFyX2JpdChjYW0sIFJFR19DVFJMMCwgQzBfRU5BQkxFKTsKLX0KLQotc3RhdGljIHZvaWQgY2FmZV9jdGxyX2luaXQoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JLyoKLQkgKiBBZGRlZCBtYWdpYyB0byBicmluZyB1cCB0aGUgaGFyZHdhcmUgb24gdGhlIEItVGVzdCBib2FyZAotCSAqLwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgMHgzMDM4LCAweDgpOwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgMHgzMTVjLCAweDgwMDA4KTsKLQkvKgotCSAqIEdvIHRocm91Z2ggdGhlIGRhbmNlIG5lZWRlZCB0byB3YWtlIHRoZSBkZXZpY2UgdXAuCi0JICogTm90ZSB0aGF0IHRoZXNlIHJlZ2lzdGVycyBhcmUgZ2xvYmFsIGFuZCBzaGFyZWQKLQkgKiB3aXRoIHRoZSBOQU5EIGFuZCBTRCBkZXZpY2VzLiAgSW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUKLQkgKiB0aHJlZSBzdGlsbCBuZWVkcyB0byBiZSBleGFtaW5lZC4KLQkgKi8KLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19HTF9DU1IsIEdDU1JfU1JTfEdDU1JfTVJTKTsgLyogTmVlZGVkPyAqLwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0dMX0NTUiwgR0NTUl9TUkN8R0NTUl9NUkMpOwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0dMX0NTUiwgR0NTUl9TUkN8R0NTUl9NUlMpOwotCS8qCi0JICogSGVyZSB3ZSBtdXN0IHdhaXQgYSBiaXQgZm9yIHRoZSBjb250cm9sbGVyIHRvIGNvbWUgYXJvdW5kLgotCSAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQltc2xlZXAoNSk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0dMX0NTUiwgR0NTUl9DQ0lDX0VOfEdDU1JfU1JDfEdDU1JfTVJDKTsKLQljYWZlX3JlZ19zZXRfYml0KGNhbSwgUkVHX0dMX0lNQVNLLCBHSU1TS19DQ0lDX0VOKTsKLQkvKgotCSAqIE1ha2Ugc3VyZSBpdCdzIG5vdCBwb3dlcmVkIGRvd24uCi0JICovCi0JY2FmZV9yZWdfY2xlYXJfYml0KGNhbSwgUkVHX0NUUkwxLCBDMV9QV1JEV04pOwotCS8qCi0JICogVHVybiBvZmYgdGhlIGVuYWJsZSBiaXQuICBJdCBzdXJlIHNob3VsZCBiZSBvZmYgYW55d2F5LAotCSAqIGJ1dCBpdCdzIGdvb2QgdG8gYmUgc3VyZS4KLQkgKi8KLQljYWZlX3JlZ19jbGVhcl9iaXQoY2FtLCBSRUdfQ1RSTDAsIEMwX0VOQUJMRSk7Ci0JLyoKLQkgKiBNYXNrIGFsbCBpbnRlcnJ1cHRzLgotCSAqLwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0lSUU1BU0ssIDApOwotCS8qCi0JICogQ2xvY2sgdGhlIHNlbnNvciBhcHByb3ByaWF0ZWx5LiAgQ29udHJvbGxlciBjbG9jayBzaG91bGQKLQkgKiBiZSA0OE1Ieiwgc2Vuc29yICJ0eXBpY2FsIiB2YWx1ZSBpcyBoYWxmIHRoYXQuCi0JICovCi0JY2FmZV9yZWdfd3JpdGVfbWFzayhjYW0sIFJFR19DTEtDVFJMLCAyLCBDTEtfRElWX01BU0spOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLX0KLQotCi0vKgotICogU3RvcCB0aGUgY29udHJvbGxlciwgYW5kIGRvbid0IHJldHVybiB1bnRpbCB3ZSdyZSByZWFsbHkgc3VyZSB0aGF0IG5vCi0gKiBmdXJ0aGVyIERNQSBpcyBnb2luZyBvbi4KLSAqLwotc3RhdGljIHZvaWQgY2FmZV9jdGxyX3N0b3BfZG1hKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKgotCSAqIFRoZW9yeTogc3RvcCB0aGUgY2FtZXJhIGNvbnRyb2xsZXIgKHdoZXRoZXIgaXQgaXMgb3BlcmF0aW5nCi0JICogb3Igbm90KS4gIERlbGF5IGJyaWVmbHkganVzdCBpbiBjYXNlIHdlIHJhY2Ugd2l0aCB0aGUgU09GCi0JICogaW50ZXJydXB0LCB0aGVuIHdhaXQgdW50aWwgbm8gRE1BIGlzIGFjdGl2ZS4KLQkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCWNhZmVfY3Rscl9zdG9wKGNhbSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCW1kZWxheSgxKTsKLQl3YWl0X2V2ZW50X3RpbWVvdXQoY2FtLT5pb3dhaXQsCi0JCQkhdGVzdF9iaXQoQ0ZfRE1BX0FDVElWRSwgJmNhbS0+ZmxhZ3MpLCBIWik7Ci0JaWYgKHRlc3RfYml0KENGX0RNQV9BQ1RJVkUsICZjYW0tPmZsYWdzKSkKLQkJY2FtX2VycihjYW0sICJUaW1lb3V0IHdhaXRpbmcgZm9yIERNQSB0byBlbmRcbiIpOwotCQkvKiBUaGlzIHdvdWxkIGJlIGJhZCBuZXdzIC0gd2hhdCBub3c/ICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQljYW0tPnN0YXRlID0gU19JRExFOwotCWNhZmVfY3Rscl9pcnFfZGlzYWJsZShjYW0pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLX0KLQotLyoKLSAqIFBvd2VyIHVwIGFuZCBkb3duLgotICovCi1zdGF0aWMgdm9pZCBjYWZlX2N0bHJfcG93ZXJfdXAoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JY2FmZV9yZWdfY2xlYXJfYml0KGNhbSwgUkVHX0NUUkwxLCBDMV9QV1JEV04pOwotCS8qCi0JICogUGFydCBvbmUgb2YgdGhlIHNlbnNvciBkYW5jZTogdHVybiB0aGUgZ2xvYmFsCi0JICogR1BJTyBzaWduYWwgb24uCi0JICovCi0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfR0xfRkNSLCBHRkNSX0dQSU9fT04pOwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0dMX0dQSU9SLCBHR1BJT19PVVR8R0dQSU9fVkFMKTsKLQkvKgotCSAqIFB1dCB0aGUgc2Vuc29yIGludG8gb3BlcmF0aW9uYWwgbW9kZSAoYXNzdW1lcyBPTFBDLXN0eWxlCi0JICogd2lyaW5nKS4gIENvbnRyb2wgMCBpcyByZXNldCAtIHNldCB0byAxIHRvIG9wZXJhdGUuCi0JICogQ29udHJvbCAxIGlzIHBvd2VyIGRvd24sIHNldCB0byAwIHRvIG9wZXJhdGUuCi0JICovCi0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfR1BSLCBHUFJfQzFFTnxHUFJfQzBFTik7IC8qIHB3ciB1cCwgcmVzZXQgKi8KLS8qCW1kZWxheSgxKTsgKi8gLyogTWFydmVsbCBzYXlzIDFtcyB3aWxsIGRvIGl0ICovCi0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfR1BSLCBHUFJfQzFFTnxHUFJfQzBFTnxHUFJfQzApOwotLyoJbWRlbGF5KDEpOyAqLyAvKiBFbm91Z2g/ICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCW1zbGVlcCg1KTsgLyogSnVzdCB0byBiZSBzdXJlICovCi19Ci0KLXN0YXRpYyB2b2lkIGNhZmVfY3Rscl9wb3dlcl9kb3duKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0dQUiwgR1BSX0MxRU58R1BSX0MwRU58R1BSX0MxKTsKLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19HTF9GQ1IsIEdGQ1JfR1BJT19PTik7Ci0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfR0xfR1BJT1IsIEdHUElPX09VVCk7Ci0JY2FmZV9yZWdfc2V0X2JpdChjYW0sIFJFR19DVFJMMSwgQzFfUFdSRFdOKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogQ29tbXVuaWNhdGlvbnMgd2l0aCB0aGUgc2Vuc29yLgotICovCi0KLXN0YXRpYyBpbnQgX19jYWZlX2NhbV9yZXNldChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQlyZXR1cm4gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCByZXNldCwgMCk7Ci19Ci0KLS8qCi0gKiBXZSBoYXZlIGZvdW5kIHRoZSBzZW5zb3Igb24gdGhlIGkyYy4gIExldCdzIHRyeSB0byBoYXZlIGEKLSAqIGNvbnZlcnNhdGlvbi4KLSAqLwotc3RhdGljIGludCBjYWZlX2NhbV9pbml0KHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCXN0cnVjdCB2NGwyX2RiZ19jaGlwX2lkZW50IGNoaXA7Ci0JaW50IHJldDsKLQotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JaWYgKGNhbS0+c3RhdGUgIT0gU19OT1RSRUFEWSkKLQkJY2FtX3dhcm4oY2FtLCAiQ2FtIGluaXQgd2l0aCBkZXZpY2UgaW4gZnVua3kgc3RhdGUgJWQiLAotCQkJCWNhbS0+c3RhdGUpOwotCXJldCA9IF9fY2FmZV9jYW1fcmVzZXQoY2FtKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQljaGlwLmlkZW50ID0gVjRMMl9JREVOVF9OT05FOwotCWNoaXAubWF0Y2gudHlwZSA9IFY0TDJfQ0hJUF9NQVRDSF9JMkNfQUREUjsKLQljaGlwLm1hdGNoLmFkZHIgPSBjYW0tPnNlbnNvcl9hZGRyOwotCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgZ19jaGlwX2lkZW50LCAmY2hpcCk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0JY2FtLT5zZW5zb3JfdHlwZSA9IGNoaXAuaWRlbnQ7Ci0JaWYgKGNhbS0+c2Vuc29yX3R5cGUgIT0gVjRMMl9JREVOVF9PVjc2NzApIHsKLQkJY2FtX2VycihjYW0sICJVbnN1cHBvcnRlZCBzZW5zb3IgdHlwZSAweCV4IiwgY2FtLT5zZW5zb3JfdHlwZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLS8qIEdldC9zZXQgcGFyYW1ldGVycz8gKi8KLQlyZXQgPSAwOwotCWNhbS0+c3RhdGUgPSBTX0lETEU7Ci0gIG91dDoKLQljYWZlX2N0bHJfcG93ZXJfZG93bihjYW0pOwotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogQ29uZmlndXJlIHRoZSBzZW5zb3IgdG8gbWF0Y2ggdGhlIHBhcmFtZXRlcnMgd2UgaGF2ZS4gIENhbGxlciBzaG91bGQKLSAqIGhvbGQgc19tdXRleAotICovCi1zdGF0aWMgaW50IGNhZmVfY2FtX3NldF9mbGlwKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCXN0cnVjdCB2NGwyX2NvbnRyb2wgY3RybDsKLQotCW1lbXNldCgmY3RybCwgMCwgc2l6ZW9mKGN0cmwpKTsKLQljdHJsLmlkID0gVjRMMl9DSURfVkZMSVA7Ci0JY3RybC52YWx1ZSA9IGZsaXA7Ci0JcmV0dXJuIHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgc19jdHJsLCAmY3RybCk7Ci19Ci0KLQotc3RhdGljIGludCBjYWZlX2NhbV9jb25maWd1cmUoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0Jc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBtYnVzX2ZtdDsKLQlpbnQgcmV0OwotCi0JdjRsMl9maWxsX21idXNfZm9ybWF0KCZtYnVzX2ZtdCwgJmNhbS0+cGl4X2Zvcm1hdCwgY2FtLT5tYnVzX2NvZGUpOwotCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgaW5pdCwgMCk7Ci0JaWYgKHJldCA9PSAwKQotCQlyZXQgPSBzZW5zb3JfY2FsbChjYW0sIHZpZGVvLCBzX21idXNfZm10LCAmbWJ1c19mbXQpOwotCS8qCi0JICogT1Y3NjcwIGRvZXMgd2VpcmQgdGhpbmdzIGlmIGZsaXAgaXMgc2V0ICpiZWZvcmUqIGZvcm1hdC4uLgotCSAqLwotCXJldCArPSBjYWZlX2NhbV9zZXRfZmxpcChjYW0pOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogRE1BIGJ1ZmZlciBtYW5hZ2VtZW50LiAgVGhlc2UgZnVuY3Rpb25zIG5lZWQgc19tdXRleCBoZWxkLgotICovCi0KLS8qIEZJWE1FOiB0aGlzIGlzIGluZWZmaWNpZW50IGFzIGhlbGwsIHNpbmNlIGRtYV9hbGxvY19jb2hlcmVudCBqdXN0Ci0gKiBkb2VzIGEgZ2V0X2ZyZWVfcGFnZXMoKSBjYWxsLCBhbmQgd2Ugd2FzdGUgYSBnb29kIGNodW5rIG9mIGFuIG9yZGVyTgotICogYWxsb2NhdGlvbi4gIFNob3VsZCB0cnkgdG8gYWxsb2NhdGUgdGhlIHdob2xlIHNldCBpbiBvbmUgY2h1bmsuCi0gKi8KLXN0YXRpYyBpbnQgY2FmZV9hbGxvY19kbWFfYnVmcyhzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSwgaW50IGxvYWR0aW1lKQotewotCWludCBpOwotCi0JY2FmZV9zZXRfY29uZmlnX25lZWRlZChjYW0sIDEpOwotCWlmIChsb2FkdGltZSkKLQkJY2FtLT5kbWFfYnVmX3NpemUgPSBkbWFfYnVmX3NpemU7Ci0JZWxzZQotCQljYW0tPmRtYV9idWZfc2l6ZSA9IGNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2U7Ci0JaWYgKG5fZG1hX2J1ZnMgPiAzKQotCQluX2RtYV9idWZzID0gMzsKLQotCWNhbS0+bmJ1ZnMgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBuX2RtYV9idWZzOyBpKyspIHsKLQkJY2FtLT5kbWFfYnVmc1tpXSA9IGRtYV9hbGxvY19jb2hlcmVudCgmY2FtLT5wZGV2LT5kZXYsCi0JCQkJY2FtLT5kbWFfYnVmX3NpemUsIGNhbS0+ZG1hX2hhbmRsZXMgKyBpLAotCQkJCUdGUF9LRVJORUwpOwotCQlpZiAoY2FtLT5kbWFfYnVmc1tpXSA9PSBOVUxMKSB7Ci0JCQljYW1fd2FybihjYW0sICJGYWlsZWQgdG8gYWxsb2NhdGUgRE1BIGJ1ZmZlclxuIik7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBGb3IgZGVidWcsIHJlbW92ZSBldmVudHVhbGx5ICovCi0JCW1lbXNldChjYW0tPmRtYV9idWZzW2ldLCAweGNjLCBjYW0tPmRtYV9idWZfc2l6ZSk7Ci0JCShjYW0tPm5idWZzKSsrOwotCX0KLQotCXN3aXRjaCAoY2FtLT5uYnVmcykgewotCWNhc2UgMToKLQkgICAgZG1hX2ZyZWVfY29oZXJlbnQoJmNhbS0+cGRldi0+ZGV2LCBjYW0tPmRtYV9idWZfc2l6ZSwKLQkJCSAgICBjYW0tPmRtYV9idWZzWzBdLCBjYW0tPmRtYV9oYW5kbGVzWzBdKTsKLQkgICAgY2FtLT5uYnVmcyA9IDA7Ci0JY2FzZSAwOgotCSAgICBjYW1fZXJyKGNhbSwgIkluc3VmZmljaWVudCBETUEgYnVmZmVycywgY2Fubm90IG9wZXJhdGVcbiIpOwotCSAgICByZXR1cm4gLUVOT01FTTsKLQotCWNhc2UgMjoKLQkgICAgaWYgKG5fZG1hX2J1ZnMgPiAyKQotCQkgICAgY2FtX3dhcm4oY2FtLCAiV2lsbCBsaW1wIGFsb25nIHdpdGggb25seSAyIGJ1ZmZlcnNcbiIpOwotCSAgICBicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNhZmVfZnJlZV9kbWFfYnVmcyhzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5idWZzOyBpKyspIHsKLQkJZG1hX2ZyZWVfY29oZXJlbnQoJmNhbS0+cGRldi0+ZGV2LCBjYW0tPmRtYV9idWZfc2l6ZSwKLQkJCQljYW0tPmRtYV9idWZzW2ldLCBjYW0tPmRtYV9oYW5kbGVzW2ldKTsKLQkJY2FtLT5kbWFfYnVmc1tpXSA9IE5VTEw7Ci0JfQotCWNhbS0+bmJ1ZnMgPSAwOwotfQotCi0KLQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogSGVyZSBzdGFydHMgdGhlIFY0TDIgaW50ZXJmYWNlIGNvZGUuCi0gKi8KLQotLyoKLSAqIFJlYWQgYW4gaW1hZ2UgZnJvbSB0aGUgZGV2aWNlLgotICovCi1zdGF0aWMgc3NpemVfdCBjYWZlX2RlbGl2ZXJfYnVmZmVyKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLAotCQljaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBvcykKLXsKLQlpbnQgYnVmbm87Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JaWYgKGNhbS0+bmV4dF9idWYgPCAwKSB7Ci0JCWNhbV9lcnIoY2FtLCAiZGVsaXZlcl9idWZmZXI6IE5vIG5leHQgYnVmZmVyXG4iKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JYnVmbm8gPSBjYW0tPm5leHRfYnVmOwotCWNsZWFyX2JpdChidWZubywgJmNhbS0+ZmxhZ3MpOwotCWlmICgrKyhjYW0tPm5leHRfYnVmKSA+PSBjYW0tPm5idWZzKQotCQljYW0tPm5leHRfYnVmID0gMDsKLQlpZiAoISB0ZXN0X2JpdChjYW0tPm5leHRfYnVmLCAmY2FtLT5mbGFncykpCi0JCWNhbS0+bmV4dF9idWYgPSAtMTsKLQljYW0tPnNwZWNmcmFtZXMgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQotCWlmIChsZW4gPiBjYW0tPnBpeF9mb3JtYXQuc2l6ZWltYWdlKQotCQlsZW4gPSBjYW0tPnBpeF9mb3JtYXQuc2l6ZWltYWdlOwotCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBjYW0tPmRtYV9idWZzW2J1Zm5vXSwgbGVuKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JKCpwb3MpICs9IGxlbjsKLQlyZXR1cm4gbGVuOwotfQotCi0vKgotICogR2V0IGV2ZXJ5dGhpbmcgcmVhZHksIGFuZCBzdGFydCBncmFiYmluZyBmcmFtZXMuCi0gKi8KLXN0YXRpYyBpbnQgY2FmZV9yZWFkX3NldHVwKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLCBlbnVtIGNhZmVfc3RhdGUgc3RhdGUpCi17Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyoKLQkgKiBDb25maWd1cmF0aW9uLiAgSWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBETUEgYnVmZmVycywKLQkgKiBtYWtlIG9uZSBsYXN0LCBkZXNwZXJhdGUgYXR0ZW1wdC4KLQkgKi8KLQlpZiAoY2FtLT5uYnVmcyA9PSAwKQotCQlpZiAoY2FmZV9hbGxvY19kbWFfYnVmcyhjYW0sIDApKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAoY2FmZV9uZWVkc19jb25maWcoY2FtKSkgewotCQljYWZlX2NhbV9jb25maWd1cmUoY2FtKTsKLQkJcmV0ID0gY2FmZV9jdGxyX2NvbmZpZ3VyZShjYW0pOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKgotCSAqIFR1cm4gaXQgbG9vc2UuCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQljYWZlX3Jlc2V0X2J1ZmZlcnMoY2FtKTsKLQljYWZlX2N0bHJfaXJxX2VuYWJsZShjYW0pOwotCWNhbS0+c3RhdGUgPSBzdGF0ZTsKLQljYWZlX2N0bHJfc3RhcnQoY2FtKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHNzaXplX3QgY2FmZV92NGxfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGxlbiwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJldCA9IDA7Ci0KLQkvKgotCSAqIFBlcmhhcHMgd2UncmUgaW4gc3BlY3VsYXRpdmUgcmVhZCBtb2RlIGFuZCBhbHJlYWR5Ci0JICogaGF2ZSBkYXRhPwotCSAqLwotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JaWYgKGNhbS0+c3RhdGUgPT0gU19TUEVDUkVBRCkgewotCQlpZiAoY2FtLT5uZXh0X2J1ZiA+PSAwKSB7Ci0JCQlyZXQgPSBjYWZlX2RlbGl2ZXJfYnVmZmVyKGNhbSwgYnVmZmVyLCBsZW4sIHBvcyk7Ci0JCQlpZiAocmV0ICE9IDApCi0JCQkJZ290byBvdXRfdW5sb2NrOwotCQl9Ci0JfSBlbHNlIGlmIChjYW0tPnN0YXRlID09IFNfRkxBS0VEIHx8IGNhbS0+c3RhdGUgPT0gU19OT1RSRUFEWSkgewotCQlyZXQgPSAtRUlPOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfSBlbHNlIGlmIChjYW0tPnN0YXRlICE9IFNfSURMRSkgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KLQkvKgotCSAqIHY0bDI6IG11bHRpcGxlIHByb2Nlc3NlcyBjYW4gb3BlbiB0aGUgZGV2aWNlLCBidXQgb25seQotCSAqIG9uZSBnZXRzIHRvIGdyYWIgZGF0YSBmcm9tIGl0LgotCSAqLwotCWlmIChjYW0tPm93bmVyICYmIGNhbS0+b3duZXIgIT0gZmlscCkgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0JY2FtLT5vd25lciA9IGZpbHA7Ci0KLQkvKgotCSAqIERvIHNldHVwIGlmIG5lZWQgYmUuCi0JICovCi0JaWYgKGNhbS0+c3RhdGUgIT0gU19TUEVDUkVBRCkgewotCQlyZXQgPSBjYWZlX3JlYWRfc2V0dXAoY2FtLCBTX1NJTkdMRVJFQUQpOwotCQlpZiAocmV0KQotCQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQkvKgotCSAqIFdhaXQgZm9yIHNvbWV0aGluZyB0byBoYXBwZW4uICBUaGlzIHNob3VsZCBwcm9iYWJseQotCSAqIGJlIGludGVycnVwdGlibGUgKEZJWE1FKS4KLQkgKi8KLQl3YWl0X2V2ZW50X3RpbWVvdXQoY2FtLT5pb3dhaXQsIGNhbS0+bmV4dF9idWYgPj0gMCwgSFopOwotCWlmIChjYW0tPm5leHRfYnVmIDwgMCkgewotCQljYW1fZXJyKGNhbSwgInJlYWQoKSBvcGVyYXRpb24gdGltZWQgb3V0XG4iKTsKLQkJY2FmZV9jdGxyX3N0b3BfZG1hKGNhbSk7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0JLyoKLQkgKiBHaXZlIHRoZW0gdGhlaXIgZGF0YSBhbmQgd2Ugc2hvdWxkIGJlIGRvbmUuCi0JICovCi0JcmV0ID0gY2FmZV9kZWxpdmVyX2J1ZmZlcihjYW0sIGJ1ZmZlciwgbGVuLCBwb3MpOwotCi0gIG91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLQotCi0KLQotCi0KLQotLyoKLSAqIFN0cmVhbWluZyBJL08gc3VwcG9ydC4KLSAqLwotCi0KLQotc3RhdGljIGludCBjYWZlX3ZpZGlvY19zdHJlYW1vbihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKLQkJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0KLQlpZiAodHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCWdvdG8gb3V0OwotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JaWYgKGNhbS0+c3RhdGUgIT0gU19JRExFIHx8IGNhbS0+bl9zYnVmcyA9PSAwKQotCQlnb3RvIG91dF91bmxvY2s7Ci0KLQljYW0tPnNlcXVlbmNlID0gMDsKLQlyZXQgPSBjYWZlX3JlYWRfc2V0dXAoY2FtLCBTX1NUUkVBTUlORyk7Ci0KLSAgb3V0X3VubG9jazoKLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0gIG91dDoKLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAotCQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQotCWlmICh0eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJZ290byBvdXQ7Ci0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQlpZiAoY2FtLT5zdGF0ZSAhPSBTX1NUUkVBTUlORykKLQkJZ290byBvdXRfdW5sb2NrOwotCi0JY2FmZV9jdGxyX3N0b3BfZG1hKGNhbSk7Ci0JcmV0ID0gMDsKLQotICBvdXRfdW5sb2NrOgotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLSAgb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLQotCi1zdGF0aWMgaW50IGNhZmVfc2V0dXBfc2lvYnVmKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLCBpbnQgaW5kZXgpCi17Ci0Jc3RydWN0IGNhZmVfc2lvX2J1ZmZlciAqYnVmID0gY2FtLT5zYl9idWZzICsgaW5kZXg7Ci0KLQlJTklUX0xJU1RfSEVBRCgmYnVmLT5saXN0KTsKLQlidWYtPnY0bGJ1Zi5sZW5ndGggPSBQQUdFX0FMSUdOKGNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2UpOwotCWJ1Zi0+YnVmZmVyID0gdm1hbGxvY191c2VyKGJ1Zi0+djRsYnVmLmxlbmd0aCk7Ci0JaWYgKGJ1Zi0+YnVmZmVyID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCWJ1Zi0+bWFwY291bnQgPSAwOwotCWJ1Zi0+Y2FtID0gY2FtOwotCi0JYnVmLT52NGxidWYuaW5kZXggPSBpbmRleDsKLQlidWYtPnY0bGJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCWJ1Zi0+djRsYnVmLmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwotCWJ1Zi0+djRsYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7Ci0JLyoKLQkgKiBPZmZzZXQ6IG11c3QgYmUgMzItYml0IGV2ZW4gb24gYSA2NC1iaXQgc3lzdGVtLiAgdmlkZW9idWYtZG1hLXNnCi0JICoganVzdCB1c2VzIHRoZSBsZW5ndGggdGltZXMgdGhlIGluZGV4LCBidXQgdGhlIHNwZWMgd2FybnMKLQkgKiBhZ2FpbnN0IGRvaW5nIGp1c3QgdGhhdCAtIHZtYSBtZXJnaW5nIHByb2JsZW1zLiAgU28gd2UKLQkgKiBsZWF2ZSBhIGdhcCBiZXR3ZWVuIGVhY2ggcGFpciBvZiBidWZmZXJzLgotCSAqLwotCWJ1Zi0+djRsYnVmLm0ub2Zmc2V0ID0gMippbmRleCpidWYtPnY0bGJ1Zi5sZW5ndGg7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2FmZV9mcmVlX3Npb19idWZmZXJzKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCWludCBpOwotCi0JLyoKLQkgKiBJZiBhbnkgYnVmZmVycyBhcmUgbWFwcGVkLCB3ZSBjYW5ub3QgZnJlZSB0aGVtIGF0IGFsbC4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uX3NidWZzOyBpKyspCi0JCWlmIChjYW0tPnNiX2J1ZnNbaV0ubWFwY291bnQgPiAwKQotCQkJcmV0dXJuIC1FQlVTWTsKLQkvKgotCSAqIE9LLCBsZXQncyBkbyBpdC4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uX3NidWZzOyBpKyspCi0JCXZmcmVlKGNhbS0+c2JfYnVmc1tpXS5idWZmZXIpOwotCWNhbS0+bl9zYnVmcyA9IDA7Ci0Ja2ZyZWUoY2FtLT5zYl9idWZzKTsKLQljYW0tPnNiX2J1ZnMgPSBOVUxMOwotCUlOSVRfTElTVF9IRUFEKCZjYW0tPnNiX2F2YWlsKTsKLQlJTklUX0xJU1RfSEVBRCgmY2FtLT5zYl9mdWxsKTsKLQlyZXR1cm4gMDsKLX0KLQotCi0KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2NfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKLQkJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcSkKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmV0ID0gMDsgIC8qIFNpbGVuY2Ugd2FybmluZyAqLwotCi0JLyoKLQkgKiBNYWtlIHN1cmUgaXQncyBzb21ldGhpbmcgd2UgY2FuIGRvLiAgVXNlciBwb2ludGVycyBjb3VsZCBiZQotCSAqIGltcGxlbWVudGVkIHdpdGhvdXQgZ3JlYXQgcGFpbiwgYnV0IHRoYXQncyBub3QgYmVlbiBkb25lIHlldC4KLQkgKi8KLQlpZiAocmVxLT5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JLyoKLQkgKiBJZiB0aGV5IGFzayBmb3IgemVybyBidWZmZXJzLCB0aGV5IHJlYWxseSB3YW50IHVzIHRvIHN0b3Agc3RyZWFtaW5nCi0JICogKGlmIGl0J3MgaGFwcGVuaW5nKSBhbmQgZnJlZSBldmVyeXRoaW5nLiAgU2hvdWxkIHdlIGNoZWNrIG93bmVyPwotCSAqLwotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JaWYgKHJlcS0+Y291bnQgPT0gMCkgewotCQlpZiAoY2FtLT5zdGF0ZSA9PSBTX1NUUkVBTUlORykKLQkJCWNhZmVfY3Rscl9zdG9wX2RtYShjYW0pOwotCQlyZXQgPSBjYWZlX2ZyZWVfc2lvX2J1ZmZlcnMgKGNhbSk7Ci0JCWdvdG8gb3V0OwotCX0KLQkvKgotCSAqIERldmljZSBuZWVkcyB0byBiZSBpZGxlIGFuZCB3b3JraW5nLiAgV2UgKmNvdWxkKiB0cnkgdG8gZG8gdGhlCi0JICogcmlnaHQgdGhpbmcgaW4gU19TUEVDUkVBRCBieSBzaHV0dGluZyB0aGluZ3MgZG93biwgYnV0IGl0Ci0JICogcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIuCi0JICovCi0JaWYgKGNhbS0+c3RhdGUgIT0gU19JRExFIHx8IChjYW0tPm93bmVyICYmIGNhbS0+b3duZXIgIT0gZmlscCkpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9Ci0JY2FtLT5vd25lciA9IGZpbHA7Ci0KLQlpZiAocmVxLT5jb3VudCA8IG1pbl9idWZmZXJzKQotCQlyZXEtPmNvdW50ID0gbWluX2J1ZmZlcnM7Ci0JZWxzZSBpZiAocmVxLT5jb3VudCA+IG1heF9idWZmZXJzKQotCQlyZXEtPmNvdW50ID0gbWF4X2J1ZmZlcnM7Ci0JaWYgKGNhbS0+bl9zYnVmcyA+IDApIHsKLQkJcmV0ID0gY2FmZV9mcmVlX3Npb19idWZmZXJzKGNhbSk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQljYW0tPnNiX2J1ZnMgPSBremFsbG9jKHJlcS0+Y291bnQqc2l6ZW9mKHN0cnVjdCBjYWZlX3Npb19idWZmZXIpLAotCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKGNhbS0+c2JfYnVmcyA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQlmb3IgKGNhbS0+bl9zYnVmcyA9IDA7IGNhbS0+bl9zYnVmcyA8IHJlcS0+Y291bnQ7IChjYW0tPm5fc2J1ZnMrKykpIHsKLQkJcmV0ID0gY2FmZV9zZXR1cF9zaW9idWYoY2FtLCBjYW0tPm5fc2J1ZnMpOwotCQlpZiAocmV0KQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGNhbS0+bl9zYnVmcyA9PSAwKSAgLyogbm8gbHVjayBhdCBhbGwgLSByZXQgYWxyZWFkeSBzZXQgKi8KLQkJa2ZyZWUoY2FtLT5zYl9idWZzKTsKLQlyZXEtPmNvdW50ID0gY2FtLT5uX3NidWZzOyAgLyogSW4gY2FzZSBvZiBwYXJ0aWFsIHN1Y2Nlc3MgKi8KLQotICBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIGludCBjYWZlX3ZpZGlvY19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKLQkJc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCWlmIChidWYtPmluZGV4ID49IGNhbS0+bl9zYnVmcykKLQkJZ290byBvdXQ7Ci0JKmJ1ZiA9IGNhbS0+c2JfYnVmc1tidWYtPmluZGV4XS52NGxidWY7Ci0JcmV0ID0gMDsKLSAgb3V0OgotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX3FidWYoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCi0JCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjYWZlX3Npb19idWZmZXIgKnNidWY7Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JaWYgKGJ1Zi0+aW5kZXggPj0gY2FtLT5uX3NidWZzKQotCQlnb3RvIG91dDsKLQlzYnVmID0gY2FtLT5zYl9idWZzICsgYnVmLT5pbmRleDsKLQlpZiAoc2J1Zi0+djRsYnVmLmZsYWdzICYgVjRMMl9CVUZfRkxBR19RVUVVRUQpIHsKLQkJcmV0ID0gMDsgLyogQWxyZWFkeSBxdWV1ZWQ/PyAqLwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKHNidWYtPnY0bGJ1Zi5mbGFncyAmIFY0TDJfQlVGX0ZMQUdfRE9ORSkgewotCQkvKiBTcGVjIGRvZXNuJ3Qgc2F5IGFueXRoaW5nLCBzZWVtcyBhcHByb3ByaWF0ZSB0aG8gKi8KLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9Ci0Jc2J1Zi0+djRsYnVmLmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfUVVFVUVEOwotCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGQoJnNidWYtPmxpc3QsICZjYW0tPnNiX2F2YWlsKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JcmV0ID0gMDsKLSAgb3V0OgotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAotCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY2FmZV9zaW9fYnVmZmVyICpzYnVmOwotCWludCByZXQgPSAtRUlOVkFMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCWlmIChjYW0tPnN0YXRlICE9IFNfU1RSRUFNSU5HKQotCQlnb3RvIG91dF91bmxvY2s7Ci0JaWYgKGxpc3RfZW1wdHkoJmNhbS0+c2JfZnVsbCkgJiYgZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKLQkJcmV0ID0gLUVBR0FJTjsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQotCXdoaWxlIChsaXN0X2VtcHR5KCZjYW0tPnNiX2Z1bGwpICYmIGNhbS0+c3RhdGUgPT0gU19TVFJFQU1JTkcpIHsKLQkJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGNhbS0+aW93YWl0LAotCQkJCQkJIWxpc3RfZW1wdHkoJmNhbS0+c2JfZnVsbCkpKSB7Ci0JCQlyZXQgPSAtRVJFU1RBUlRTWVM7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCX0KLQotCWlmIChjYW0tPnN0YXRlICE9IFNfU1RSRUFNSU5HKQotCQlyZXQgPSAtRUlOVFI7Ci0JZWxzZSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JCS8qIFNob3VsZCBwcm9iYWJseSByZWNoZWNrICFsaXN0X2VtcHR5KCkgaGVyZSAqLwotCQlzYnVmID0gbGlzdF9lbnRyeShjYW0tPnNiX2Z1bGwubmV4dCwKLQkJCQlzdHJ1Y3QgY2FmZV9zaW9fYnVmZmVyLCBsaXN0KTsKLQkJbGlzdF9kZWxfaW5pdCgmc2J1Zi0+bGlzdCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQkJc2J1Zi0+djRsYnVmLmZsYWdzICY9IH5WNEwyX0JVRl9GTEFHX0RPTkU7Ci0JCSpidWYgPSBzYnVmLT52NGxidWY7Ci0JCXJldCA9IDA7Ci0JfQotCi0gIG91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotICBvdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotCi0KLXN0YXRpYyB2b2lkIGNhZmVfdjRsX3ZtX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0Jc3RydWN0IGNhZmVfc2lvX2J1ZmZlciAqc2J1ZiA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOwotCS8qCi0JICogTG9ja2luZzogZG9uZSB1bmRlciBtbWFwX3NlbSwgc28gd2UgZG9uJ3QgbmVlZCB0bwotCSAqIGdvIGJhY2sgdG8gdGhlIGNhbWVyYSBsb2NrIGhlcmUuCi0JICovCi0Jc2J1Zi0+bWFwY291bnQrKzsKLX0KLQotCi1zdGF0aWMgdm9pZCBjYWZlX3Y0bF92bV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgY2FmZV9zaW9fYnVmZmVyICpzYnVmID0gdm1hLT52bV9wcml2YXRlX2RhdGE7Ci0KLQltdXRleF9sb2NrKCZzYnVmLT5jYW0tPnNfbXV0ZXgpOwotCXNidWYtPm1hcGNvdW50LS07Ci0JLyogRG9jcyBzYXkgd2Ugc2hvdWxkIHN0b3AgSS9PIHRvby4uLiAqLwotCWlmIChzYnVmLT5tYXBjb3VudCA9PSAwKQotCQlzYnVmLT52NGxidWYuZmxhZ3MgJj0gflY0TDJfQlVGX0ZMQUdfTUFQUEVEOwotCW11dGV4X3VubG9jaygmc2J1Zi0+Y2FtLT5zX211dGV4KTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBjYWZlX3Y0bF92bV9vcHMgPSB7Ci0JLm9wZW4gPSBjYWZlX3Y0bF92bV9vcGVuLAotCS5jbG9zZSA9IGNhZmVfdjRsX3ZtX2Nsb3NlCi19OwotCi0KLXN0YXRpYyBpbnQgY2FmZV92NGxfbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQgPSB2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0JaW50IGk7Ci0Jc3RydWN0IGNhZmVfc2lvX2J1ZmZlciAqc2J1ZiA9IE5VTEw7Ci0KLQlpZiAoISAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB8fCAhICh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JLyoKLQkgKiBGaW5kIHRoZSBidWZmZXIgdGhleSBhcmUgbG9va2luZyBmb3IuCi0JICovCi0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uX3NidWZzOyBpKyspCi0JCWlmIChjYW0tPnNiX2J1ZnNbaV0udjRsYnVmLm0ub2Zmc2V0ID09IG9mZnNldCkgewotCQkJc2J1ZiA9IGNhbS0+c2JfYnVmcyArIGk7Ci0JCQlicmVhazsKLQkJfQotCWlmIChzYnVmID09IE5VTEwpCi0JCWdvdG8gb3V0OwotCi0JcmV0ID0gcmVtYXBfdm1hbGxvY19yYW5nZSh2bWEsIHNidWYtPmJ1ZmZlciwgMCk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0Jdm1hLT52bV9mbGFncyB8PSBWTV9ET05URVhQQU5EOwotCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gc2J1ZjsKLQl2bWEtPnZtX29wcyA9ICZjYWZlX3Y0bF92bV9vcHM7Ci0Jc2J1Zi0+djRsYnVmLmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEOwotCWNhZmVfdjRsX3ZtX29wZW4odm1hKTsKLQlyZXQgPSAwOwotICBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLQotCi1zdGF0aWMgaW50IGNhZmVfdjRsX29wZW4oc3RydWN0IGZpbGUgKmZpbHApCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSB2aWRlb19kcnZkYXRhKGZpbHApOwotCi0JZmlscC0+cHJpdmF0ZV9kYXRhID0gY2FtOwotCi0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQlpZiAoY2FtLT51c2VycyA9PSAwKSB7Ci0JCWNhZmVfY3Rscl9wb3dlcl91cChjYW0pOwotCQlfX2NhZmVfY2FtX3Jlc2V0KGNhbSk7Ci0JCWNhZmVfc2V0X2NvbmZpZ19uZWVkZWQoY2FtLCAxKTsKLQkvKiBGSVhNRSBtYWtlIHN1cmUgdGhpcyBpcyBjb21wbGV0ZSAqLwotCX0KLQkoY2FtLT51c2VycykrKzsKLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCBjYWZlX3Y0bF9yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxwKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCi0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQkoY2FtLT51c2VycyktLTsKLQlpZiAoZmlscCA9PSBjYW0tPm93bmVyKSB7Ci0JCWNhZmVfY3Rscl9zdG9wX2RtYShjYW0pOwotCQljYWZlX2ZyZWVfc2lvX2J1ZmZlcnMoY2FtKTsKLQkJY2FtLT5vd25lciA9IE5VTEw7Ci0JfQotCWlmIChjYW0tPnVzZXJzID09IDApIHsKLQkJY2FmZV9jdGxyX3Bvd2VyX2Rvd24oY2FtKTsKLQkJaWYgKGFsbG9jX2J1ZnNfYXRfcmVhZCkKLQkJCWNhZmVfZnJlZV9kbWFfYnVmcyhjYW0pOwotCX0KLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGNhZmVfdjRsX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsCi0JCXN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqcHQpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0KLQlwb2xsX3dhaXQoZmlscCwgJmNhbS0+aW93YWl0LCBwdCk7Ci0JaWYgKGNhbS0+bmV4dF9idWYgPj0gMCkKLQkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07Ci0JcmV0dXJuIDA7Ci19Ci0KLQotCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKLQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHByaXY7Ci0JaW50IHJldDsKLQotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCBxdWVyeWN0cmwsIHFjKTsKLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKLQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHByaXY7Ci0JaW50IHJldDsKLQotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCBnX2N0cmwsIGN0cmwpOwotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAotCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gcHJpdjsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXQgPSBzZW5zb3JfY2FsbChjYW0sIGNvcmUsIHNfY3RybCwgY3RybCk7Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLQotCi0KLQotc3RhdGljIGludCBjYWZlX3ZpZGlvY19xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQotewotCXN0cmNweShjYXAtPmRyaXZlciwgImNhZmVfY2NpYyIpOwotCXN0cmNweShjYXAtPmNhcmQsICJjYWZlX2NjaWMiKTsKLQljYXAtPnZlcnNpb24gPSBDQUZFX1ZFUlNJT047Ci0JY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKLQkJVjRMMl9DQVBfUkVBRFdSSVRFIHwgVjRMMl9DQVBfU1RSRUFNSU5HOwotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBUaGUgZGVmYXVsdCBmb3JtYXQgd2UgdXNlIHVudGlsIHNvbWVib2R5IHNheXMgb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBjYWZlX2RlZl9waXhfZm9ybWF0ID0gewotCS53aWR0aAkJPSBWR0FfV0lEVEgsCi0JLmhlaWdodAkJPSBWR0FfSEVJR0hULAotCS5waXhlbGZvcm1hdAk9IFY0TDJfUElYX0ZNVF9ZVVlWLAotCS5maWVsZAkJPSBWNEwyX0ZJRUxEX05PTkUsCi0JLmJ5dGVzcGVybGluZQk9IFZHQV9XSURUSCoyLAotCS5zaXplaW1hZ2UJPSBWR0FfV0lEVEgqVkdBX0hFSUdIVCoyLAotfTsKLQotc3RhdGljIGNvbnN0IGVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBjYWZlX2RlZl9tYnVzX2NvZGUgPQotCQkJCQlWNEwyX01CVVNfRk1UX1lVWVY4XzJYODsKLQotc3RhdGljIGludCBjYWZlX3ZpZGlvY19lbnVtX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxwLAotCQl2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmbXQpCi17Ci0JaWYgKGZtdC0+aW5kZXggPj0gTl9DQUZFX0ZNVFMpCi0JCXJldHVybiAtRUlOVkFMOwotCXN0cmxjcHkoZm10LT5kZXNjcmlwdGlvbiwgY2FmZV9mb3JtYXRzW2ZtdC0+aW5kZXhdLmRlc2MsCi0JCQlzaXplb2YoZm10LT5kZXNjcmlwdGlvbikpOwotCWZtdC0+cGl4ZWxmb3JtYXQgPSBjYWZlX2Zvcm1hdHNbZm10LT5pbmRleF0ucGl4ZWxmb3JtYXQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAotCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHByaXY7Ci0Jc3RydWN0IGNhZmVfZm9ybWF0X3N0cnVjdCAqZjsKLQlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXggPSAmZm10LT5mbXQucGl4OwotCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgbWJ1c19mbXQ7Ci0JaW50IHJldDsKLQotCWYgPSBjYWZlX2ZpbmRfZm9ybWF0KHBpeC0+cGl4ZWxmb3JtYXQpOwotCXBpeC0+cGl4ZWxmb3JtYXQgPSBmLT5waXhlbGZvcm1hdDsKLQl2NGwyX2ZpbGxfbWJ1c19mb3JtYXQoJm1idXNfZm10LCBwaXgsIGYtPm1idXNfY29kZSk7Ci0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXQgPSBzZW5zb3JfY2FsbChjYW0sIHZpZGVvLCB0cnlfbWJ1c19mbXQsICZtYnVzX2ZtdCk7Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXY0bDJfZmlsbF9waXhfZm9ybWF0KHBpeCwgJm1idXNfZm10KTsKLQlwaXgtPmJ5dGVzcGVybGluZSA9IHBpeC0+d2lkdGggKiBmLT5icHA7Ci0JcGl4LT5zaXplaW1hZ2UgPSBwaXgtPmhlaWdodCAqIHBpeC0+Ynl0ZXNwZXJsaW5lOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2Nfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKLQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBwcml2OwotCXN0cnVjdCBjYWZlX2Zvcm1hdF9zdHJ1Y3QgKmY7Ci0JaW50IHJldDsKLQotCS8qCi0JICogQ2FuJ3QgZG8gYW55dGhpbmcgaWYgdGhlIGRldmljZSBpcyBub3QgaWRsZQotCSAqIEFsc28gY2FuJ3QgaWYgdGhlcmUgYXJlIHN0cmVhbWluZyBidWZmZXJzIGluIHBsYWNlLgotCSAqLwotCWlmIChjYW0tPnN0YXRlICE9IFNfSURMRSB8fCBjYW0tPm5fc2J1ZnMgPiAwKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JZiA9IGNhZmVfZmluZF9mb3JtYXQoZm10LT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKLQotCS8qCi0JICogU2VlIGlmIHRoZSBmb3JtYXR0aW5nIHdvcmtzIGluIHByaW5jaXBsZS4KLQkgKi8KLQlyZXQgPSBjYWZlX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAoZmlscCwgcHJpdiwgZm10KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCS8qCi0JICogTm93IHdlIHN0YXJ0IHRvIGNoYW5nZSB0aGluZ3MgZm9yIHJlYWwsIHNvIGxldCdzIGRvIGl0Ci0JICogdW5kZXIgbG9jay4KLQkgKi8KLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCWNhbS0+cGl4X2Zvcm1hdCA9IGZtdC0+Zm10LnBpeDsKLQljYW0tPm1idXNfY29kZSA9IGYtPm1idXNfY29kZTsKLQotCS8qCi0JICogTWFrZSBzdXJlIHdlIGhhdmUgYXBwcm9wcmlhdGUgRE1BIGJ1ZmZlcnMuCi0JICovCi0JcmV0ID0gLUVOT01FTTsKLQlpZiAoY2FtLT5uYnVmcyA+IDAgJiYgY2FtLT5kbWFfYnVmX3NpemUgPCBjYW0tPnBpeF9mb3JtYXQuc2l6ZWltYWdlKQotCQljYWZlX2ZyZWVfZG1hX2J1ZnMoY2FtKTsKLQlpZiAoY2FtLT5uYnVmcyA9PSAwKSB7Ci0JCWlmIChjYWZlX2FsbG9jX2RtYV9idWZzKGNhbSwgMCkpCi0JCQlnb3RvIG91dDsKLQl9Ci0JLyoKLQkgKiBJdCBsb29rcyBsaWtlIHRoaXMgbWlnaHQgd29yaywgc28gbGV0J3MgcHJvZ3JhbSB0aGUgc2Vuc29yLgotCSAqLwotCXJldCA9IGNhZmVfY2FtX2NvbmZpZ3VyZShjYW0pOwotCWlmICghIHJldCkKLQkJcmV0ID0gY2FmZV9jdGxyX2NvbmZpZ3VyZShjYW0pOwotICBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBSZXR1cm4gb3VyIHN0b3JlZCBub3Rpb24gb2YgaG93IHRoZSBjYW1lcmEgaXMvc2hvdWxkIGJlIGNvbmZpZ3VyZWQuCi0gKiBUaGUgVjRsMiBzcGVjIHdhbnRzIHVzIHRvIGJlIHNtYXJ0ZXIsIGFuZCBhY3R1YWxseSBnZXQgdGhpcyBmcm9tCi0gKiB0aGUgY2FtZXJhIChhbmQgbm90IG1lc3Mgd2l0aCBpdCBhdCBvcGVuIHRpbWUpLiAgU29tZWRheS4KLSAqLwotc3RhdGljIGludCBjYWZlX3ZpZGlvY19nX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAotCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBwcml2OwotCi0JZi0+Zm10LnBpeCA9IGNhbS0+cGl4X2Zvcm1hdDsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFdlIG9ubHkgaGF2ZSBvbmUgaW5wdXQgLSB0aGUgc2Vuc29yIC0gc28gbWluaW1pemUgdGhlIG5vbnNlbnNlIGhlcmUuCi0gKi8KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2NfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKLQkJc3RydWN0IHY0bDJfaW5wdXQgKmlucHV0KQotewotCWlmIChpbnB1dC0+aW5kZXggIT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpbnB1dC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7Ci0JaW5wdXQtPnN0ZCA9IFY0TDJfU1REX0FMTDsgLyogTm90IHN1cmUgd2hhdCBzaG91bGQgZ28gaGVyZSAqLwotCXN0cmNweShpbnB1dC0+bmFtZSwgIkNhbWVyYSIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCAqaSkKLXsKLQkqaSA9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2Nfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGkpCi17Ci0JaWYgKGkgIT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIGZyb20gdml2aS5jICovCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX3Nfc3RkKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCAqYSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEcvU19QQVJNLiAgTW9zdCBvZiB0aGlzIGlzIGRvbmUgYnkgdGhlIHNlbnNvciwgYnV0IHdlIGFyZQotICogdGhlIGxldmVsIHdoaWNoIGNvbnRyb2xzIHRoZSBudW1iZXIgb2YgcmVhZCBidWZmZXJzLgotICovCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX2dfcGFybShzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKLQkJc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybXMpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBwcml2OwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgdmlkZW8sIGdfcGFybSwgcGFybXMpOwotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLQlwYXJtcy0+cGFybS5jYXB0dXJlLnJlYWRidWZmZXJzID0gbl9kbWFfYnVmczsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX3NfcGFybShzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKLQkJc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybXMpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBwcml2OwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgdmlkZW8sIHNfcGFybSwgcGFybXMpOwotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLQlwYXJtcy0+cGFybS5jYXB0dXJlLnJlYWRidWZmZXJzID0gbl9kbWFfYnVmczsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX2dfY2hpcF9pZGVudChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJc3RydWN0IHY0bDJfZGJnX2NoaXBfaWRlbnQgKmNoaXApCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBwcml2OwotCi0JY2hpcC0+aWRlbnQgPSBWNEwyX0lERU5UX05PTkU7Ci0JY2hpcC0+cmV2aXNpb24gPSAwOwotCWlmICh2NGwyX2NoaXBfbWF0Y2hfaG9zdCgmY2hpcC0+bWF0Y2gpKSB7Ci0JCWNoaXAtPmlkZW50ID0gVjRMMl9JREVOVF9DQUZFOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgZ19jaGlwX2lkZW50LCBjaGlwKTsKLX0KLQotc3RhdGljIGludCBjYWZlX3ZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCi0JCXN0cnVjdCB2NGwyX2ZybXNpemVlbnVtICpzaXplcykKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHByaXY7Ci0JaW50IHJldDsKLQotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCB2aWRlbywgZW51bV9mcmFtZXNpemVzLCBzaXplcyk7Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2NfZW51bV9mcmFtZWludGVydmFscyhzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKLQkJc3RydWN0IHY0bDJfZnJtaXZhbGVudW0gKmludGVydmFsKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gcHJpdjsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXQgPSBzZW5zb3JfY2FsbChjYW0sIHZpZGVvLCBlbnVtX2ZyYW1laW50ZXJ2YWxzLCBpbnRlcnZhbCk7Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLSNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX2dfcmVnaXN0ZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCXN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcmVnKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gcHJpdjsKLQotCWlmICh2NGwyX2NoaXBfbWF0Y2hfaG9zdCgmcmVnLT5tYXRjaCkpIHsKLQkJcmVnLT52YWwgPSBjYWZlX3JlZ19yZWFkKGNhbSwgcmVnLT5yZWcpOwotCQlyZWctPnNpemUgPSA0OwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgZ19yZWdpc3RlciwgcmVnKTsKLX0KLQotc3RhdGljIGludCBjYWZlX3ZpZGlvY19zX3JlZ2lzdGVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQlzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZykKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHByaXY7Ci0KLQlpZiAodjRsMl9jaGlwX21hdGNoX2hvc3QoJnJlZy0+bWF0Y2gpKSB7Ci0JCWNhZmVfcmVnX3dyaXRlKGNhbSwgcmVnLT5yZWcsIHJlZy0+dmFsKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiBzZW5zb3JfY2FsbChjYW0sIGNvcmUsIHNfcmVnaXN0ZXIsIHJlZyk7Ci19Ci0jZW5kaWYKLQotLyoKLSAqIFRoaXMgdGVtcGxhdGUgZGV2aWNlIGhvbGRzIGFsbCBvZiB0aG9zZSB2NGwyIG1ldGhvZHM7IHdlCi0gKiBjbG9uZSBpdCBmb3Igc3BlY2lmaWMgcmVhbCBkZXZpY2VzLgotICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgY2FmZV92NGxfZm9wcyA9IHsKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkub3BlbiA9IGNhZmVfdjRsX29wZW4sCi0JLnJlbGVhc2UgPSBjYWZlX3Y0bF9yZWxlYXNlLAotCS5yZWFkID0gY2FmZV92NGxfcmVhZCwKLQkucG9sbCA9IGNhZmVfdjRsX3BvbGwsCi0JLm1tYXAgPSBjYWZlX3Y0bF9tbWFwLAotCS51bmxvY2tlZF9pb2N0bCA9IHZpZGVvX2lvY3RsMiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgY2FmZV92NGxfaW9jdGxfb3BzID0gewotCS52aWRpb2NfcXVlcnljYXAgCT0gY2FmZV92aWRpb2NfcXVlcnljYXAsCi0JLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwID0gY2FmZV92aWRpb2NfZW51bV9mbXRfdmlkX2NhcCwKLQkudmlkaW9jX3RyeV9mbXRfdmlkX2NhcAk9IGNhZmVfdmlkaW9jX3RyeV9mbXRfdmlkX2NhcCwKLQkudmlkaW9jX3NfZm10X3ZpZF9jYXAJPSBjYWZlX3ZpZGlvY19zX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfZ19mbXRfdmlkX2NhcAk9IGNhZmVfdmlkaW9jX2dfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19lbnVtX2lucHV0CT0gY2FmZV92aWRpb2NfZW51bV9pbnB1dCwKLQkudmlkaW9jX2dfaW5wdXQJCT0gY2FmZV92aWRpb2NfZ19pbnB1dCwKLQkudmlkaW9jX3NfaW5wdXQJCT0gY2FmZV92aWRpb2Nfc19pbnB1dCwKLQkudmlkaW9jX3Nfc3RkCQk9IGNhZmVfdmlkaW9jX3Nfc3RkLAotCS52aWRpb2NfcmVxYnVmcwkJPSBjYWZlX3ZpZGlvY19yZXFidWZzLAotCS52aWRpb2NfcXVlcnlidWYJPSBjYWZlX3ZpZGlvY19xdWVyeWJ1ZiwKLQkudmlkaW9jX3FidWYJCT0gY2FmZV92aWRpb2NfcWJ1ZiwKLQkudmlkaW9jX2RxYnVmCQk9IGNhZmVfdmlkaW9jX2RxYnVmLAotCS52aWRpb2Nfc3RyZWFtb24JPSBjYWZlX3ZpZGlvY19zdHJlYW1vbiwKLQkudmlkaW9jX3N0cmVhbW9mZgk9IGNhZmVfdmlkaW9jX3N0cmVhbW9mZiwKLQkudmlkaW9jX3F1ZXJ5Y3RybAk9IGNhZmVfdmlkaW9jX3F1ZXJ5Y3RybCwKLQkudmlkaW9jX2dfY3RybAkJPSBjYWZlX3ZpZGlvY19nX2N0cmwsCi0JLnZpZGlvY19zX2N0cmwJCT0gY2FmZV92aWRpb2Nfc19jdHJsLAotCS52aWRpb2NfZ19wYXJtCQk9IGNhZmVfdmlkaW9jX2dfcGFybSwKLQkudmlkaW9jX3NfcGFybQkJPSBjYWZlX3ZpZGlvY19zX3Bhcm0sCi0JLnZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMgPSBjYWZlX3ZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMsCi0JLnZpZGlvY19lbnVtX2ZyYW1laW50ZXJ2YWxzID0gY2FmZV92aWRpb2NfZW51bV9mcmFtZWludGVydmFscywKLQkudmlkaW9jX2dfY2hpcF9pZGVudCAgICA9IGNhZmVfdmlkaW9jX2dfY2hpcF9pZGVudCwKLSNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCi0JLnZpZGlvY19nX3JlZ2lzdGVyIAk9IGNhZmVfdmlkaW9jX2dfcmVnaXN0ZXIsCi0JLnZpZGlvY19zX3JlZ2lzdGVyIAk9IGNhZmVfdmlkaW9jX3NfcmVnaXN0ZXIsCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGNhZmVfdjRsX3RlbXBsYXRlID0gewotCS5uYW1lID0gImNhZmUiLAotCS50dm5vcm1zID0gVjRMMl9TVERfTlRTQ19NLAotCS5jdXJyZW50X25vcm0gPSBWNEwyX1NURF9OVFNDX00sICAvKiBtYWtlIG1wbGF5ZXIgaGFwcHkgKi8KLQotCS5mb3BzID0gJmNhZmVfdjRsX2ZvcHMsCi0JLmlvY3RsX29wcyA9ICZjYWZlX3Y0bF9pb2N0bF9vcHMsCi0JLnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZV9lbXB0eSwKLX07Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIEludGVycnVwdCBoYW5kbGVyIHN0dWZmCi0gKi8KLQotCi0KLXN0YXRpYyB2b2lkIGNhZmVfZnJhbWVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSAoc3RydWN0IGNhZmVfY2FtZXJhICopIGRhdGE7Ci0JaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgY2FmZV9zaW9fYnVmZmVyICpzYnVmOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uYnVmczsgaSsrKSB7Ci0JCWludCBidWZubyA9IGNhbS0+bmV4dF9idWY7Ci0JCWlmIChidWZubyA8IDApIHsgIC8qICJ3aWxsIG5ldmVyIGhhcHBlbiIgKi8KLQkJCWNhbV9lcnIoY2FtLCAiTm8gdmFsaWQgYnVmcyBpbiB0YXNrbGV0IVxuIik7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoKysoY2FtLT5uZXh0X2J1ZikgPj0gY2FtLT5uYnVmcykKLQkJCWNhbS0+bmV4dF9idWYgPSAwOwotCQlpZiAoISB0ZXN0X2JpdChidWZubywgJmNhbS0+ZmxhZ3MpKQotCQkJY29udGludWU7Ci0JCWlmIChsaXN0X2VtcHR5KCZjYW0tPnNiX2F2YWlsKSkKLQkJCWJyZWFrOyAgLyogTGVhdmUgaXQgdmFsaWQsIGhvcGUgZm9yIGJldHRlciBsYXRlciAqLwotCQljbGVhcl9iaXQoYnVmbm8sICZjYW0tPmZsYWdzKTsKLQkJc2J1ZiA9IGxpc3RfZW50cnkoY2FtLT5zYl9hdmFpbC5uZXh0LAotCQkJCXN0cnVjdCBjYWZlX3Npb19idWZmZXIsIGxpc3QpOwotCQkvKgotCQkgKiBEcm9wIHRoZSBsb2NrIGR1cmluZyB0aGUgYmlnIGNvcHkuICBUaGlzICpzaG91bGQqIGJlIHNhZmUuLi4KLQkJICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQkJbWVtY3B5KHNidWYtPmJ1ZmZlciwgY2FtLT5kbWFfYnVmc1tidWZub10sCi0JCQkJY2FtLT5waXhfZm9ybWF0LnNpemVpbWFnZSk7Ci0JCXNidWYtPnY0bGJ1Zi5ieXRlc3VzZWQgPSBjYW0tPnBpeF9mb3JtYXQuc2l6ZWltYWdlOwotCQlzYnVmLT52NGxidWYuc2VxdWVuY2UgPSBjYW0tPmJ1Zl9zZXFbYnVmbm9dOwotCQlzYnVmLT52NGxidWYuZmxhZ3MgJj0gflY0TDJfQlVGX0ZMQUdfUVVFVUVEOwotCQlzYnVmLT52NGxidWYuZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19ET05FOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCQlsaXN0X21vdmVfdGFpbCgmc2J1Zi0+bGlzdCwgJmNhbS0+c2JfZnVsbCk7Ci0JfQotCWlmICghIGxpc3RfZW1wdHkoJmNhbS0+c2JfZnVsbCkpCi0JCXdha2VfdXAoJmNhbS0+aW93YWl0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci19Ci0KLQotCi1zdGF0aWMgdm9pZCBjYWZlX2ZyYW1lX2NvbXBsZXRlKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLCBpbnQgZnJhbWUpCi17Ci0JLyoKLQkgKiBCYXNpYyBmcmFtZSBob3VzZWtlZXBpbmcuCi0JICovCi0JaWYgKHRlc3RfYml0KGZyYW1lLCAmY2FtLT5mbGFncykgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQotCQljYW1fZXJyKGNhbSwgIkZyYW1lIG92ZXJydW4gb24gJWQsIGZyYW1lcyBsb3N0XG4iLCBmcmFtZSk7Ci0Jc2V0X2JpdChmcmFtZSwgJmNhbS0+ZmxhZ3MpOwotCWNsZWFyX2JpdChDRl9ETUFfQUNUSVZFLCAmY2FtLT5mbGFncyk7Ci0JaWYgKGNhbS0+bmV4dF9idWYgPCAwKQotCQljYW0tPm5leHRfYnVmID0gZnJhbWU7Ci0JY2FtLT5idWZfc2VxW2ZyYW1lXSA9ICsrKGNhbS0+c2VxdWVuY2UpOwotCi0Jc3dpdGNoIChjYW0tPnN0YXRlKSB7Ci0JLyoKLQkgKiBJZiBpbiBzaW5nbGUgcmVhZCBtb2RlLCB0cnkgZ29pbmcgc3BlY3VsYXRpdmUuCi0JICovCi0JICAgIGNhc2UgU19TSU5HTEVSRUFEOgotCQljYW0tPnN0YXRlID0gU19TUEVDUkVBRDsKLQkJY2FtLT5zcGVjZnJhbWVzID0gMDsKLQkJd2FrZV91cCgmY2FtLT5pb3dhaXQpOwotCQlicmVhazsKLQotCS8qCi0JICogSWYgd2UgYXJlIGFscmVhZHkgZG9pbmcgc3BlY3VsYXRpdmUgcmVhZHMsIGFuZCBub2JvZHkgaXMKLQkgKiByZWFkaW5nIHRoZW0sIGp1c3Qgc3RvcC4KLQkgKi8KLQkgICAgY2FzZSBTX1NQRUNSRUFEOgotCQlpZiAoKysoY2FtLT5zcGVjZnJhbWVzKSA+PSBjYW0tPm5idWZzKSB7Ci0JCQljYWZlX2N0bHJfc3RvcChjYW0pOwotCQkJY2FmZV9jdGxyX2lycV9kaXNhYmxlKGNhbSk7Ci0JCQljYW0tPnN0YXRlID0gU19JRExFOwotCQl9Ci0JCXdha2VfdXAoJmNhbS0+aW93YWl0KTsKLQkJYnJlYWs7Ci0JLyoKLQkgKiBGb3IgdGhlIHN0cmVhbWluZyBjYXNlLCB3ZSBkZWZlciB0aGUgcmVhbCB3b3JrIHRvIHRoZQotCSAqIGNhbWVyYSB0YXNrbGV0LgotCSAqCi0JICogRklYTUU6IGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBub3QgY29uc3VtaW5nIHRoZSBidWZmZXJzLAotCSAqIHdlIHNob3VsZCBldmVudHVhbGx5IHB1dCB0aGluZ3Mgb24gaG9sZCBhbmQgcmVzdGFydCBpbgotCSAqIHZpZGlvY19kcWJ1ZigpLgotCSAqLwotCSAgICBjYXNlIFNfU1RSRUFNSU5HOgotCQl0YXNrbGV0X3NjaGVkdWxlKCZjYW0tPnNfdGFza2xldCk7Ci0JCWJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JCWNhbV9lcnIoY2FtLCAiRnJhbWUgaW50ZXJydXB0IGluIG5vbi1vcGVyYXRpb25hbCBzdGF0ZVxuIik7Ci0JCWJyZWFrOwotCX0KLX0KLQotCi0KLQotc3RhdGljIHZvaWQgY2FmZV9mcmFtZV9pcnEoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0sIHVuc2lnbmVkIGludCBpcnFzKQotewotCXVuc2lnbmVkIGludCBmcmFtZTsKLQotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0lSUVNUQVQsIEZSQU1FSVJRUyk7IC8qIENsZWFyJ2VtIGFsbCAqLwotCS8qCi0JICogSGFuZGxlIGFueSBmcmFtZSBjb21wbGV0aW9ucy4gIFRoZXJlIHJlYWxseSBzaG91bGQKLQkgKiBub3QgYmUgbW9yZSB0aGFuIG9uZSBvZiB0aGVzZSwgb3Igd2UgaGF2ZSBmYWxsZW4KLQkgKiBmYXIgYmVoaW5kLgotCSAqLwotCWZvciAoZnJhbWUgPSAwOyBmcmFtZSA8IGNhbS0+bmJ1ZnM7IGZyYW1lKyspCi0JCWlmIChpcnFzICYgKElSUV9FT0YwIDw8IGZyYW1lKSkKLQkJCWNhZmVfZnJhbWVfY29tcGxldGUoY2FtLCBmcmFtZSk7Ci0JLyoKLQkgKiBJZiBhIGZyYW1lIHN0YXJ0cywgbm90ZSB0aGF0IHdlIGhhdmUgRE1BIGFjdGl2ZS4gIFRoaXMKLQkgKiBjb2RlIGFzc3VtZXMgdGhhdCB3ZSB3b24ndCBnZXQgbXVsdGlwbGUgZnJhbWUgaW50ZXJydXB0cwotCSAqIGF0IG9uY2U7IG1heSB3YW50IHRvIHJldGhpbmsgdGhhdC4KLQkgKi8KLQlpZiAoaXJxcyAmIChJUlFfU09GMCB8IElSUV9TT0YxIHwgSVJRX1NPRjIpKQotCQlzZXRfYml0KENGX0RNQV9BQ1RJVkUsICZjYW0tPmZsYWdzKTsKLX0KLQotCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBjYWZlX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gZGF0YTsKLQl1bnNpZ25lZCBpbnQgaXJxczsKLQotCXNwaW5fbG9jaygmY2FtLT5kZXZfbG9jayk7Ci0JaXJxcyA9IGNhZmVfcmVnX3JlYWQoY2FtLCBSRUdfSVJRU1RBVCk7Ci0JaWYgKChpcnFzICYgQUxMSVJRUykgPT0gMCkgewotCQlzcGluX3VubG9jaygmY2FtLT5kZXZfbG9jayk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0JaWYgKGlycXMgJiBGUkFNRUlSUVMpCi0JCWNhZmVfZnJhbWVfaXJxKGNhbSwgaXJxcyk7Ci0JaWYgKGlycXMgJiBUV1NJSVJRUykgewotCQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19JUlFTVEFULCBUV1NJSVJRUyk7Ci0JCXdha2VfdXAoJmNhbS0+c21idXNfd2FpdCk7Ci0JfQotCXNwaW5fdW5sb2NrKCZjYW0tPmRldl9sb2NrKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBQQ0kgaW50ZXJmYWNlIHN0dWZmLgotICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBvbHBjX3hvMV9kbWlbXSA9IHsKLQl7Ci0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiT0xQQyIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJYTyIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX1ZFUlNJT04sICIxIiksCi0JCX0sCi0JfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyBpbnQgY2FmZV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtOwotCXN0cnVjdCBvdjc2NzBfY29uZmlnIHNlbnNvcl9jZmcgPSB7Ci0JCS8qIFRoaXMgY29udHJvbGxlciBvbmx5IGRvZXMgU01CVVMgKi8KLQkJLnVzZV9zbWJ1cyA9IHRydWUsCi0KLQkJLyoKLQkJICogRXhjbHVkZSBRQ0lGIG1vZGUsIGJlY2F1c2UgaXQgb25seSBjYXB0dXJlcyBhIHRpbnkgcG9ydGlvbgotCQkgKiBvZiB0aGUgc2Vuc29yIEZPVgotCQkgKi8KLQkJLm1pbl93aWR0aCA9IDMyMCwKLQkJLm1pbl9oZWlnaHQgPSAyNDAsCi0JfTsKLQlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gb3Y3NjcwX2luZm8gPSB7Ci0JCS50eXBlID0gIm92NzY3MCIsCi0JCS5hZGRyID0gMHg0MiwKLQkJLnBsYXRmb3JtX2RhdGEgPSAmc2Vuc29yX2NmZywKLQl9OwotCi0JLyoKLQkgKiBTdGFydCBwdXR0aW5nIHRvZ2V0aGVyIG9uZSBvZiBvdXIgYmlnIGNhbWVyYSBzdHJ1Y3R1cmVzLgotCSAqLwotCXJldCA9IC1FTk9NRU07Ci0JY2FtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNhZmVfY2FtZXJhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGNhbSA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmY2FtLT52NGwyX2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBvdXRfZnJlZTsKLQotCW11dGV4X2luaXQoJmNhbS0+c19tdXRleCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmNhbS0+ZGV2X2xvY2spOwotCWNhbS0+c3RhdGUgPSBTX05PVFJFQURZOwotCWNhZmVfc2V0X2NvbmZpZ19uZWVkZWQoY2FtLCAxKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYW0tPnNtYnVzX3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhbS0+aW93YWl0KTsKLQljYW0tPnBkZXYgPSBwZGV2OwotCWNhbS0+cGl4X2Zvcm1hdCA9IGNhZmVfZGVmX3BpeF9mb3JtYXQ7Ci0JY2FtLT5tYnVzX2NvZGUgPSBjYWZlX2RlZl9tYnVzX2NvZGU7Ci0JSU5JVF9MSVNUX0hFQUQoJmNhbS0+ZGV2X2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZjYW0tPnNiX2F2YWlsKTsKLQlJTklUX0xJU1RfSEVBRCgmY2FtLT5zYl9mdWxsKTsKLQl0YXNrbGV0X2luaXQoJmNhbS0+c190YXNrbGV0LCBjYWZlX2ZyYW1lX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKSBjYW0pOwotCS8qCi0JICogR2V0IHNldCB1cCBvbiB0aGUgUENJIGJ1cy4KLQkgKi8KLQlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF91bnJlZzsKLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKLQotCXJldCA9IC1FSU87Ci0JY2FtLT5yZWdzID0gcGNpX2lvbWFwKHBkZXYsIDAsIDApOwotCWlmICghIGNhbS0+cmVncykgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBpb3JlbWFwIGNhZmUtY2NpYyByZWdzXG4iKTsKLQkJZ290byBvdXRfdW5yZWc7Ci0JfQotCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgY2FmZV9pcnEsIElSUUZfU0hBUkVELCAiY2FmZS1jY2ljIiwgY2FtKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF9pb3VubWFwOwotCS8qCi0JICogSW5pdGlhbGl6ZSB0aGUgY29udHJvbGxlciBhbmQgbGVhdmUgaXQgcG93ZXJlZCB1cC4gIEl0IHdpbGwKLQkgKiBzdGF5IHRoYXQgd2F5IHVudGlsIHRoZSBzZW5zb3IgZHJpdmVyIHNob3dzIHVwLgotCSAqLwotCWNhZmVfY3Rscl9pbml0KGNhbSk7Ci0JY2FmZV9jdGxyX3Bvd2VyX3VwKGNhbSk7Ci0JLyoKLQkgKiBTZXQgdXAgSTJDL1NNQlVTIGNvbW11bmljYXRpb25zLiAgV2UgaGF2ZSB0byBkcm9wIHRoZSBtdXRleCBoZXJlCi0JICogYmVjYXVzZSB0aGUgc2Vuc29yIGNvdWxkIGF0dGFjaCBpbiB0aGlzIGNhbGwgY2hhaW4sIGxlYWRpbmcgdG8KLQkgKiB1bnNpZ2h0bHkgZGVhZGxvY2tzLgotCSAqLwotCXJldCA9IGNhZmVfc21idXNfc2V0dXAoY2FtKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF9mcmVlaXJxOwotCi0JLyogQXBwbHkgWE8tMSBjbG9jayBzcGVlZCAqLwotCWlmIChkbWlfY2hlY2tfc3lzdGVtKG9scGNfeG8xX2RtaSkpCi0JCXNlbnNvcl9jZmcuY2xvY2tfc3BlZWQgPSA0NTsKLQotCWNhbS0+c2Vuc29yX2FkZHIgPSBvdjc2NzBfaW5mby5hZGRyOwotCWNhbS0+c2Vuc29yID0gdjRsMl9pMmNfbmV3X3N1YmRldl9ib2FyZCgmY2FtLT52NGwyX2RldiwgJmNhbS0+aTJjX2FkYXB0ZXIsCi0JCQkmb3Y3NjcwX2luZm8sIE5VTEwpOwotCWlmIChjYW0tPnNlbnNvciA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X3NtYnVzOwotCX0KLQotCXJldCA9IGNhZmVfY2FtX2luaXQoY2FtKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF9zbWJ1czsKLQotCS8qCi0JICogR2V0IHRoZSB2NGwyIHNldHVwIGRvbmUuCi0JICovCi0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQljYW0tPnZkZXYgPSBjYWZlX3Y0bF90ZW1wbGF0ZTsKLQljYW0tPnZkZXYuZGVidWcgPSAwOwotLyoJY2FtLT52ZGV2LmRlYnVnID0gVjRMMl9ERUJVR19JT0NUTF9BUkc7Ki8KLQljYW0tPnZkZXYudjRsMl9kZXYgPSAmY2FtLT52NGwyX2RldjsKLQlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJmNhbS0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X3VubG9jazsKLQl2aWRlb19zZXRfZHJ2ZGF0YSgmY2FtLT52ZGV2LCBjYW0pOwotCi0JLyoKLQkgKiBJZiBzbyByZXF1ZXN0ZWQsIHRyeSB0byBnZXQgb3VyIERNQSBidWZmZXJzIG5vdy4KLQkgKi8KLQlpZiAoIWFsbG9jX2J1ZnNfYXRfcmVhZCkgewotCQlpZiAoY2FmZV9hbGxvY19kbWFfYnVmcyhjYW0sIDEpKQotCQkJY2FtX3dhcm4oY2FtLCAiVW5hYmxlIHRvIGFsbG9jIERNQSBidWZmZXJzIGF0IGxvYWQiCi0JCQkJCSIgd2lsbCB0cnkgYWdhaW4gbGF0ZXIuIik7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldHVybiAwOwotCi1vdXRfdW5sb2NrOgotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLW91dF9zbWJ1czoKLQljYWZlX3NtYnVzX3NodXRkb3duKGNhbSk7Ci1vdXRfZnJlZWlycToKLQljYWZlX2N0bHJfcG93ZXJfZG93bihjYW0pOwotCWZyZWVfaXJxKHBkZXYtPmlycSwgY2FtKTsKLW91dF9pb3VubWFwOgotCXBjaV9pb3VubWFwKHBkZXYsIGNhbS0+cmVncyk7Ci1vdXRfZnJlZToKLQl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZjYW0tPnY0bDJfZGV2KTsKLW91dF91bnJlZzoKLQlrZnJlZShjYW0pOwotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLQotLyoKLSAqIFNodXQgZG93biBhbiBpbml0aWFsaXplZCBkZXZpY2UKLSAqLwotc3RhdGljIHZvaWQgY2FmZV9zaHV0ZG93bihzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLS8qIEZJWE1FOiBNYWtlIHN1cmUgd2UgdGFrZSBjYXJlIG9mIGV2ZXJ5dGhpbmcgaGVyZSAqLwotCWlmIChjYW0tPm5fc2J1ZnMgPiAwKQotCQkvKiBXaGF0IGlmIHRoZXkgYXJlIHN0aWxsIG1hcHBlZD8gIFNob3VsZG4ndCBiZSwgYnV0Li4uICovCi0JCWNhZmVfZnJlZV9zaW9fYnVmZmVycyhjYW0pOwotCWNhZmVfY3Rscl9zdG9wX2RtYShjYW0pOwotCWNhZmVfY3Rscl9wb3dlcl9kb3duKGNhbSk7Ci0JY2FmZV9zbWJ1c19zaHV0ZG93bihjYW0pOwotCWNhZmVfZnJlZV9kbWFfYnVmcyhjYW0pOwotCWZyZWVfaXJxKGNhbS0+cGRldi0+aXJxLCBjYW0pOwotCXBjaV9pb3VubWFwKGNhbS0+cGRldiwgY2FtLT5yZWdzKTsKLQl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmY2FtLT52ZGV2KTsKLX0KLQotCi1zdGF0aWMgdm9pZCBjYWZlX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHRvX2NhbSh2NGwyX2Rldik7Ci0KLQlpZiAoY2FtID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicGNpX3JlbW92ZSBvbiB1bmtub3duIHBkZXYgJXBcbiIsIHBkZXYpOwotCQlyZXR1cm47Ci0JfQotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JaWYgKGNhbS0+dXNlcnMgPiAwKQotCQljYW1fd2FybihjYW0sICJSZW1vdmluZyBhIGRldmljZSB3aXRoIHVzZXJzIVxuIik7Ci0JY2FmZV9zaHV0ZG93bihjYW0pOwotCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmNhbS0+djRsMl9kZXYpOwotCWtmcmVlKGNhbSk7Ci0vKiBObyB1bmxvY2sgLSBpdCBubyBsb25nZXIgZXhpc3RzICovCi19Ci0KLQotI2lmZGVmIENPTkZJR19QTQotLyoKLSAqIEJhc2ljIHBvd2VyIG1hbmFnZW1lbnQuCi0gKi8KLXN0YXRpYyBpbnQgY2FmZV9wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSB0b19jYW0odjRsMl9kZXYpOwotCWludCByZXQ7Ci0JZW51bSBjYWZlX3N0YXRlIGNzdGF0ZTsKLQotCXJldCA9IHBjaV9zYXZlX3N0YXRlKHBkZXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JY3N0YXRlID0gY2FtLT5zdGF0ZTsgLyogSEFDSyAtIHN0b3BfZG1hIHNldHMgdG8gaWRsZSAqLwotCWNhZmVfY3Rscl9zdG9wX2RtYShjYW0pOwotCWNhZmVfY3Rscl9wb3dlcl9kb3duKGNhbSk7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCWNhbS0+c3RhdGUgPSBjc3RhdGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCBjYWZlX3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHRvX2NhbSh2NGwyX2Rldik7Ci0JaW50IHJldCA9IDA7Ci0KLQlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKLQlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQotCWlmIChyZXQpIHsKLQkJY2FtX3dhcm4oY2FtLCAiVW5hYmxlIHRvIHJlLWVuYWJsZSBkZXZpY2Ugb24gcmVzdW1lIVxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWNhZmVfY3Rscl9pbml0KGNhbSk7Ci0KLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCWlmIChjYW0tPnVzZXJzID4gMCkgewotCQljYWZlX2N0bHJfcG93ZXJfdXAoY2FtKTsKLQkJX19jYWZlX2NhbV9yZXNldChjYW0pOwotCX0gZWxzZSB7Ci0JCWNhZmVfY3Rscl9wb3dlcl9kb3duKGNhbSk7Ci0JfQotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLQotCXNldF9iaXQoQ0ZfQ09ORklHX05FRURFRCwgJmNhbS0+ZmxhZ3MpOwotCWlmIChjYW0tPnN0YXRlID09IFNfU1BFQ1JFQUQpCi0JCWNhbS0+c3RhdGUgPSBTX0lETEU7ICAvKiBEb24ndCBib3RoZXIgcmVzdGFydGluZyAqLwotCWVsc2UgaWYgKGNhbS0+c3RhdGUgPT0gU19TSU5HTEVSRUFEIHx8IGNhbS0+c3RhdGUgPT0gU19TVFJFQU1JTkcpCi0JCXJldCA9IGNhZmVfcmVhZF9zZXR1cChjYW0sIGNhbS0+c3RhdGUpOwotCXJldHVybiByZXQ7Ci19Ci0KLSNlbmRpZiAgLyogQ09ORklHX1BNICovCi0KLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGNhZmVfaWRzW10gPSB7Ci0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwKLQkJICAgICBQQ0lfREVWSUNFX0lEX01BUlZFTExfODhBTFAwMV9DQ0lDKSB9LAotCXsgMCwgfQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGNhZmVfaWRzKTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGNhZmVfcGNpX2RyaXZlciA9IHsKLQkubmFtZSA9ICJjYWZlMTAwMC1jY2ljIiwKLQkuaWRfdGFibGUgPSBjYWZlX2lkcywKLQkucHJvYmUgPSBjYWZlX3BjaV9wcm9iZSwKLQkucmVtb3ZlID0gY2FmZV9wY2lfcmVtb3ZlLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kID0gY2FmZV9wY2lfc3VzcGVuZCwKLQkucmVzdW1lID0gY2FmZV9wY2lfcmVzdW1lLAotI2VuZGlmCi19OwotCi0KLQotCi1zdGF0aWMgaW50IF9faW5pdCBjYWZlX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JcHJpbnRrKEtFUk5fTk9USUNFICJNYXJ2ZWxsIE04OEFMUDAxICdDQUZFJyBDYW1lcmEgQ29udHJvbGxlciB2ZXJzaW9uICVkXG4iLAotCQkJQ0FGRV9WRVJTSU9OKTsKLQlyZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZjYWZlX3BjaV9kcml2ZXIpOwotCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcmVnaXN0ZXIgY2FmZV9jY2ljIGRyaXZlclxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQlyZXQgPSAwOwotCi0gIG91dDoKLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjYWZlX2V4aXQodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmNhZmVfcGNpX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGNhZmVfaW5pdCk7Ci1tb2R1bGVfZXhpdChjYWZlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMi5oCmluZGV4IDZkNmQxODQuLmFiMjUyMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTIuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyLmgKQEAgLTMxLDcgKzMxLDYgQEAKICNpZm5kZWYgX19DUElBMl9IX18KICNkZWZpbmUgX19DUElBMl9IX18KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgpAQCAtNDMsMTAgKzQyLDYgQEAKIC8qIGRlZmluZSBmb3IgdmVyYm9zZSBkZWJ1ZyBvdXRwdXQgKi8KIC8vI2RlZmluZSBfQ1BJQTJfREVCVUdfCiAKLSNkZWZpbmUgQ1BJQTJfTUFKX1ZFUgkzCi0jZGVmaW5lIENQSUEyX01JTl9WRVIgICAwCi0jZGVmaW5lIENQSUEyX1BBVENIX1ZFUgkwCi0KIC8qKioKICAqIEltYWdlIGRlZmluZXMKICAqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyX3Y0bC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMl92NGwuYwppbmRleCA0MGViNjMyLi4wNzdlYjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyX3Y0bC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTJfdjRsLmMKQEAgLTI5LDggKzI5LDcgQEAKICAqCQlBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0KKyNkZWZpbmUgQ1BJQV9WRVJTSU9OICIzLjAuMSIKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KQEAgLTgwLDYgKzc5LDcgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiVjRMLWRyaXZlciBmb3IgU1RNaWNyb2VsZWN0cm9uaWNzIENQaUEyIGJhc2VkIGNhbWVyYXMiKTsKIE1PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ2aWRlbyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oQ1BJQV9WRVJTSU9OKTsKIAogI2RlZmluZSBBQk9VVCAiVjRMLURyaXZlciBmb3IgVmlzaW9uIENQaUEyIGJhc2VkIGNhbWVyYXMiCiAKQEAgLTQ2NSw5ICs0NjUsNiBAQAogCWlmICh1c2JfbWFrZV9wYXRoKGNhbS0+ZGV2LCB2Yy0+YnVzX2luZm8sIHNpemVvZih2Yy0+YnVzX2luZm8pKSA8MCkKIAkJbWVtc2V0KHZjLT5idXNfaW5mbywwLCBzaXplb2YodmMtPmJ1c19pbmZvKSk7CiAKLQl2Yy0+dmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKENQSUEyX01BSl9WRVIsIENQSUEyX01JTl9WRVIsCi0JCQkJICAgICBDUElBMl9QQVRDSF9WRVIpOwotCiAJdmMtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAogCQkJICAgVjRMMl9DQVBfUkVBRFdSSVRFIHwKIAkJCSAgIFY0TDJfQ0FQX1NUUkVBTUlORzsKQEAgLTE1NTgsOCArMTU1NSw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgaW50IF9faW5pdCBjcGlhMl9pbml0KHZvaWQpCiB7Ci0JTE9HKCIlcyB2JWQuJWQuJWRcbiIsCi0JICAgIEFCT1VULCBDUElBMl9NQUpfVkVSLCBDUElBMl9NSU5fVkVSLCBDUElBMl9QQVRDSF9WRVIpOworCUxPRygiJXMgdiVzXG4iLAorCSAgICBBQk9VVCwgQ1BJQV9WRVJTSU9OKTsKIAljaGVja19wYXJhbWV0ZXJzKCk7CiAJY3BpYTJfdXNiX2luaXQoKTsKIAlyZXR1cm4gMDsKQEAgLTE1NzksNCArMTU3NiwzIEBACiAKIG1vZHVsZV9pbml0KGNwaWEyX2luaXQpOwogbW9kdWxlX2V4aXQoY3BpYTJfZXhpdCk7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWFsc2EtbWFpbi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtYWxzYS1tYWluLmMKaW5kZXggZDUwZDY5ZC4uYTFlNmMyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtYWxzYS1tYWluLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtYWxzYS1tYWluLmMKQEAgLTE5Miw2ICsxOTIsNyBAQAogZXJyX2V4aXRfZnJlZToKIAlpZiAoc2MgIT0gTlVMTCkKIAkJc25kX2NhcmRfZnJlZShzYyk7CisJa2ZyZWUoY3hzYyk7CiBlcnJfZXhpdDoKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZHJpdmVyLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kcml2ZXIuaAppbmRleCAwODY0MjcyLi4xODM0MjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kcml2ZXIuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kcml2ZXIuaApAQCAtMjUsNyArMjUsNiBAQAogI2lmbmRlZiBDWDE4X0RSSVZFUl9ICiAjZGVmaW5lIENYMThfRFJJVkVSX0gKIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlvY3RsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pb2N0bC5jCmluZGV4IGU4MDEzNGYuLmFmZTBhMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlvY3RsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW9jdGwuYwpAQCAtNDY5LDcgKzQ2OSw2IEBACiAJc3RybGNweSh2Y2FwLT5jYXJkLCBjeC0+Y2FyZF9uYW1lLCBzaXplb2YodmNhcC0+Y2FyZCkpOwogCXNucHJpbnRmKHZjYXAtPmJ1c19pbmZvLCBzaXplb2YodmNhcC0+YnVzX2luZm8pLAogCQkgIlBDSTolcyIsIHBjaV9uYW1lKGN4LT5wY2lfZGV2KSk7Ci0JdmNhcC0+dmVyc2lvbiA9IENYMThfRFJJVkVSX1ZFUlNJT047IAkgICAgLyogdmVyc2lvbiAqLwogCXZjYXAtPmNhcGFiaWxpdGllcyA9IGN4LT52NGwyX2NhcDsgCSAgICAvKiBjYXBhYmlsaXRpZXMgKi8KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXZlcnNpb24uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXZlcnNpb24uaAppbmRleCBjZDE4OWI2Li5mZWQ0OGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC12ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtdmVyc2lvbi5oCkBAIC0yMywxMiArMjMsNiBAQAogI2RlZmluZSBDWDE4X1ZFUlNJT05fSAogCiAjZGVmaW5lIENYMThfRFJJVkVSX05BTUUgImN4MTgiCi0jZGVmaW5lIENYMThfRFJJVkVSX1ZFUlNJT05fTUFKT1IgMQotI2RlZmluZSBDWDE4X0RSSVZFUl9WRVJTSU9OX01JTk9SIDUKLSNkZWZpbmUgQ1gxOF9EUklWRVJfVkVSU0lPTl9QQVRDSExFVkVMIDAKLQotI2RlZmluZSBDWDE4X1ZFUlNJT04gX19zdHJpbmdpZnkoQ1gxOF9EUklWRVJfVkVSU0lPTl9NQUpPUikgIi4iIF9fc3RyaW5naWZ5KENYMThfRFJJVkVSX1ZFUlNJT05fTUlOT1IpICIuIiBfX3N0cmluZ2lmeShDWDE4X0RSSVZFUl9WRVJTSU9OX1BBVENITEVWRUwpCi0jZGVmaW5lIENYMThfRFJJVkVSX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oQ1gxOF9EUklWRVJfVkVSU0lPTl9NQUpPUiwgXAotCUNYMThfRFJJVkVSX1ZFUlNJT05fTUlOT1IsIENYMThfRFJJVkVSX1ZFUlNJT05fUEFUQ0hMRVZFTCkKKyNkZWZpbmUgQ1gxOF9WRVJTSU9OICIxLjUuMSIKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC1hdmNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LWF2Y29yZS5jCmluZGV4IDhkNzgxMzQuLjUzZmYyNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LWF2Y29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LWF2Y29yZS5jCkBAIC0zNTUsNiArMzU1LDggQEAKIAljYXNlIENYMjMxWFhfQk9BUkRfSEFVUFBBVUdFX0VYRVRFUjoKIAljYXNlIENYMjMxWFhfQk9BUkRfSEFVUFBBVUdFX1VTQkxJVkUyOgogCWNhc2UgQ1gyMzFYWF9CT0FSRF9QVl9QTEFZVFZfVVNCX0hZQlJJRDoKKwljYXNlIENYMjMxWFhfQk9BUkRfSEFVUFBBVUdFX1VTQjJfRk1fUEFMOgorCWNhc2UgQ1gyMzFYWF9CT0FSRF9IQVVQUEFVR0VfVVNCMl9GTV9OVFNDOgogCQlpZiAoYXZtb2RlID09IFBPTEFSSVNfQVZNT0RFX0FOQUxPR1RfVFYpIHsKIAkJCXdoaWxlIChhZmVfcG93ZXJfc3RhdHVzICE9IChGTERfUFdSRE5fVFVOSU5HX0JJQVMgfAogCQkJCQkJRkxEX1BXUkROX0VOQUJMRV9QTEwpKSB7CkBAIC0xNzMzLDYgKzE3MzUsOCBAQAogCQlicmVhazsKIAljYXNlIENYMjMxWFhfQk9BUkRfQ05YVF9SREVfMjUzUzoKIAljYXNlIENYMjMxWFhfQk9BUkRfQ05YVF9SRFVfMjUzUzoKKwljYXNlIENYMjMxWFhfQk9BUkRfSEFVUFBBVUdFX1VTQjJfRk1fUEFMOgorCWNhc2UgQ1gyMzFYWF9CT0FSRF9IQVVQUEFVR0VfVVNCMl9GTV9OVFNDOgogCQlmdW5jX21vZGUgPSAweDAxOwogCQlicmVhazsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHgtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LWNhcmRzLmMKaW5kZXggMjI3MDM4MS4uNTNkYWUyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHgtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC1jYXJkcy5jCkBAIC0zODcsNiArMzg3LDcgQEAKIAkJLm5vcm0gPSBWNEwyX1NURF9OVFNDLAogCQkubm9fYWx0X3ZhbmMgPSAxLAogCQkuZXh0ZXJuYWxfYXYgPSAxLAorCQkuZG9udF91c2VfcG9ydF8zID0gMSwKIAkJLmlucHV0ID0ge3sKIAkJCS50eXBlID0gQ1gyMzFYWF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eCA9IENYMjMxWFhfVklOXzJfMSwKQEAgLTUzMiw2ICs1MzMsNzYgQEAKIAkJCS5ncGlvID0gTlVMTCwKIAkJfSB9LAogCX0sCisJW0NYMjMxWFhfQk9BUkRfSEFVUFBBVUdFX1VTQjJfRk1fUEFMXSA9IHsKKwkJLm5hbWUgPSAiSGF1cHBhdWdlIFdpblRWIFVTQjIgRk0gKFBBTCkiLAorCQkudHVuZXJfdHlwZSA9IFRVTkVSX05YUF9UREExODI3MSwKKwkJLnR1bmVyX2FkZHIgPSAweDYwLAorCQkudHVuZXJfZ3BpbyA9IFJERTI1MF9YQ1ZfVFVORVIsCisJCS50dW5lcl9zaWZfZ3BpbyA9IDB4MDUsCisJCS50dW5lcl9zY2xfZ3BpbyA9IDB4MWEsCisJCS50dW5lcl9zZGFfZ3BpbyA9IDB4MWIsCisJCS5kZWNvZGVyID0gQ1gyMzFYWF9BVkRFQ09ERVIsCisJCS5vdXRwdXRfbW9kZSA9IE9VVF9NT0RFX1ZJUDExLAorCQkuY3RsX3Bpbl9zdGF0dXNfbWFzayA9IDB4RkZGRkZGQzQsCisJCS5hZ2NfYW5hbG9nX2RpZ2l0YWxfc2VsZWN0X2dwaW8gPSAweDBjLAorCQkuZ3Bpb19waW5fc3RhdHVzX21hc2sgPSAweDQwMDEwMDAsCisJCS50dW5lcl9pMmNfbWFzdGVyID0gMSwKKwkJLm5vcm0gPSBWNEwyX1NURF9QQUwsCisKKwkJLmlucHV0ID0ge3sKKwkJCS50eXBlID0gQ1gyMzFYWF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eCA9IENYMjMxWFhfVklOXzNfMSwKKwkJCS5hbXV4ID0gQ1gyMzFYWF9BTVVYX1ZJREVPLAorCQkJLmdwaW8gPSBOVUxMLAorCQl9LCB7CisJCQkudHlwZSA9IENYMjMxWFhfVk1VWF9DT01QT1NJVEUxLAorCQkJLnZtdXggPSBDWDIzMVhYX1ZJTl8yXzEsCisJCQkuYW11eCA9IENYMjMxWFhfQU1VWF9MSU5FX0lOLAorCQkJLmdwaW8gPSBOVUxMLAorCQl9LCB7CisJCQkudHlwZSA9IENYMjMxWFhfVk1VWF9TVklERU8sCisJCQkudm11eCA9IENYMjMxWFhfVklOXzFfMSB8CisJCQkJKENYMjMxWFhfVklOXzFfMiA8PCA4KSB8CisJCQkJQ1gyNTg0MF9TVklERU9fT04sCisJCQkuYW11eCA9IENYMjMxWFhfQU1VWF9MSU5FX0lOLAorCQkJLmdwaW8gPSBOVUxMLAorCQl9IH0sCisJfSwKKwlbQ1gyMzFYWF9CT0FSRF9IQVVQUEFVR0VfVVNCMl9GTV9OVFNDXSA9IHsKKwkJLm5hbWUgPSAiSGF1cHBhdWdlIFdpblRWIFVTQjIgRk0gKE5UU0MpIiwKKwkJLnR1bmVyX3R5cGUgPSBUVU5FUl9OWFBfVERBMTgyNzEsCisJCS50dW5lcl9hZGRyID0gMHg2MCwKKwkJLnR1bmVyX2dwaW8gPSBSREUyNTBfWENWX1RVTkVSLAorCQkudHVuZXJfc2lmX2dwaW8gPSAweDA1LAorCQkudHVuZXJfc2NsX2dwaW8gPSAweDFhLAorCQkudHVuZXJfc2RhX2dwaW8gPSAweDFiLAorCQkuZGVjb2RlciA9IENYMjMxWFhfQVZERUNPREVSLAorCQkub3V0cHV0X21vZGUgPSBPVVRfTU9ERV9WSVAxMSwKKwkJLmN0bF9waW5fc3RhdHVzX21hc2sgPSAweEZGRkZGRkM0LAorCQkuYWdjX2FuYWxvZ19kaWdpdGFsX3NlbGVjdF9ncGlvID0gMHgwYywKKwkJLmdwaW9fcGluX3N0YXR1c19tYXNrID0gMHg0MDAxMDAwLAorCQkudHVuZXJfaTJjX21hc3RlciA9IDEsCisJCS5ub3JtID0gVjRMMl9TVERfTlRTQywKKworCQkuaW5wdXQgPSB7eworCQkJLnR5cGUgPSBDWDIzMVhYX1ZNVVhfVEVMRVZJU0lPTiwKKwkJCS52bXV4ID0gQ1gyMzFYWF9WSU5fM18xLAorCQkJLmFtdXggPSBDWDIzMVhYX0FNVVhfVklERU8sCisJCQkuZ3BpbyA9IE5VTEwsCisJCX0sIHsKKwkJCS50eXBlID0gQ1gyMzFYWF9WTVVYX0NPTVBPU0lURTEsCisJCQkudm11eCA9IENYMjMxWFhfVklOXzJfMSwKKwkJCS5hbXV4ID0gQ1gyMzFYWF9BTVVYX0xJTkVfSU4sCisJCQkuZ3BpbyA9IE5VTEwsCisJCX0sIHsKKwkJCS50eXBlID0gQ1gyMzFYWF9WTVVYX1NWSURFTywKKwkJCS52bXV4ID0gQ1gyMzFYWF9WSU5fMV8xIHwKKwkJCQkoQ1gyMzFYWF9WSU5fMV8yIDw8IDgpIHwKKwkJCQlDWDI1ODQwX1NWSURFT19PTiwKKwkJCS5hbXV4ID0gQ1gyMzFYWF9BTVVYX0xJTkVfSU4sCisJCQkuZ3BpbyA9IE5VTEwsCisJCX0gfSwKKwl9LAogfTsKIGNvbnN0IHVuc2lnbmVkIGludCBjeDIzMXh4X2Jjb3VudCA9IEFSUkFZX1NJWkUoY3gyMzF4eF9ib2FyZHMpOwogCkBAIC01NTMsNiArNjI0LDEwIEBACiAJIC5kcml2ZXJfaW5mbyA9IENYMjMxWFhfQk9BUkRfQ05YVF9SREVfMjUwfSwKIAl7VVNCX0RFVklDRSgweDA1NzIsIDB4NThBMCksCiAJIC5kcml2ZXJfaW5mbyA9IENYMjMxWFhfQk9BUkRfQ05YVF9SRFVfMjUwfSwKKwl7VVNCX0RFVklDRSgweDIwNDAsIDB4YjExMCksCisJIC5kcml2ZXJfaW5mbyA9IENYMjMxWFhfQk9BUkRfSEFVUFBBVUdFX1VTQjJfRk1fUEFMfSwKKwl7VVNCX0RFVklDRSgweDIwNDAsIDB4YjExMSksCisJIC5kcml2ZXJfaW5mbyA9IENYMjMxWFhfQk9BUkRfSEFVUFBBVUdFX1VTQjJfRk1fTlRTQ30sCiAJe1VTQl9ERVZJQ0UoMHgyMDQwLCAweGIxMjApLAogCSAuZHJpdmVyX2luZm8gPSBDWDIzMVhYX0JPQVJEX0hBVVBQQVVHRV9FWEVURVJ9LAogCXtVU0JfREVWSUNFKDB4MjA0MCwgMHhiMTQwKSwKQEAgLTEwNTEsNiArMTEyNiw5IEBACiAJaWYgKGFzc29jX2Rlc2MtPmJGaXJzdEludGVyZmFjZSAhPSBpZm51bSkgewogCQljeDIzMXh4X2VycihEUklWRVJfTkFNRSAiOiBOb3QgZm91bmQgIgogCQkJICAgICJtYXRjaGluZyBJQUQgaW50ZXJmYWNlXG4iKTsKKwkJY3gyMzF4eF9kZXZ1c2VkICY9IH4oMSA8PCBucik7CisJCWtmcmVlKGRldik7CisJCWRldiA9IE5VTEw7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHgtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHgtY29yZS5jCmluZGV4IGFiZTUwMGYuLmQ0NDU3ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC1jb3JlLmMKQEAgLTc0Miw2ICs3NDIsOCBAQAogCQljYXNlIENYMjMxWFhfQk9BUkRfQ05YVF9SRFVfMjUzUzoKIAkJY2FzZSBDWDIzMVhYX0JPQVJEX0hBVVBQQVVHRV9FWEVURVI6CiAJCWNhc2UgQ1gyMzFYWF9CT0FSRF9QVl9QTEFZVFZfVVNCX0hZQlJJRDoKKwkJY2FzZSBDWDIzMVhYX0JPQVJEX0hBVVBQQVVHRV9VU0IyX0ZNX1BBTDoKKwkJY2FzZSBDWDIzMVhYX0JPQVJEX0hBVVBQQVVHRV9VU0IyX0ZNX05UU0M6CiAJCWVyckNvZGUgPSBjeDIzMXh4X3NldF9hZ2NfYW5hbG9nX2RpZ2l0YWxfbXV4X3NlbGVjdChkZXYsIDApOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CkBAIC0xMzgxLDYgKzEzODMsOCBAQAogCWNhc2UgQ1gyMzFYWF9CT0FSRF9DTlhUX1JEVV8yNTNTOgogCWNhc2UgQ1gyMzFYWF9CT0FSRF9IQVVQUEFVR0VfRVhFVEVSOgogCWNhc2UgQ1gyMzFYWF9CT0FSRF9QVl9QTEFZVFZfVVNCX0hZQlJJRDoKKwljYXNlIENYMjMxWFhfQk9BUkRfSEFVUFBBVUdFX1VTQjJfRk1fUEFMOgorCWNhc2UgQ1gyMzFYWF9CT0FSRF9IQVVQUEFVR0VfVVNCMl9GTV9OVFNDOgogCWVyckNvZGUgPSBjeDIzMXh4X3NldF9hZ2NfYW5hbG9nX2RpZ2l0YWxfbXV4X3NlbGVjdChkZXYsIDApOwogCQlicmVhazsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHgtdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LXZpZGVvLmMKaW5kZXggYTY5YzI0ZC4uNmU4MWY5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHgtdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC12aWRlby5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC00NSw3ICs0NCw3IEBACiAjaW5jbHVkZSAiY3gyMzF4eC5oIgogI2luY2x1ZGUgImN4MjMxeHgtdmJpLmgiCiAKLSNkZWZpbmUgQ1gyMzFYWF9WRVJTSU9OX0NPREUgICAgICAgICAgICBLRVJORUxfVkVSU0lPTigwLCAwLCAxKQorI2RlZmluZSBDWDIzMVhYX1ZFUlNJT04gIjAuMC4yIgogCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgICAiU3Jpbml2YXNhIERlZXZpIDxzcmluaXZhc2EuZGVldmlAY29uZXhhbnQuY29tPiIKICNkZWZpbmUgRFJJVkVSX0RFU0MgICAgICJDb25leGFudCBjeDIzMXh4IGJhc2VkIFVTQiB2aWRlbyBkZXZpY2UgZHJpdmVyIgpAQCAtNzAsNiArNjksNyBAQAogTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihDWDIzMVhYX1ZFUlNJT04pOwogCiBzdGF0aWMgdW5zaWduZWQgaW50IGNhcmRbXSAgICAgPSB7WzAgLi4uIChDWDIzMVhYX01BWEJPQVJEUyAtIDEpXSA9IFVOU0VUIH07CiBzdGF0aWMgdW5zaWduZWQgaW50IHZpZGVvX25yW10gPSB7WzAgLi4uIChDWDIzMVhYX01BWEJPQVJEUyAtIDEpXSA9IFVOU0VUIH07CkBAIC0xMTc5LDcgKzExNzksOCBAQAogewogCXN0cnVjdCBjeDIzMXh4X2ZoICpmaCA9IHByaXY7CiAJc3RydWN0IGN4MjMxeHggKmRldiA9IGZoLT5kZXY7Ci0JdW5zaWduZWQgaW50IG47CisJdTMyIGdlbl9zdGF0OworCXVuc2lnbmVkIGludCByZXQsIG47CiAKIAluID0gaS0+aW5kZXg7CiAJaWYgKG4gPj0gTUFYX0NYMjMxWFhfSU5QVVQpCkBAIC0xMTk4LDYgKzExOTksMTggQEAKIAogCWktPnN0ZCA9IGRldi0+dmRldi0+dHZub3JtczsKIAorCS8qIElmIHRoZXkgYXJlIGFza2luZyBhYm91dCB0aGUgYWN0aXZlIGlucHV0LCByZWFkIHNpZ25hbCBzdGF0dXMgKi8KKwlpZiAobiA9PSBkZXYtPnZpZGVvX2lucHV0KSB7CisJCXJldCA9IGN4MjMxeHhfcmVhZF9pMmNfZGF0YShkZXYsIFZJRF9CTEtfSTJDX0FERFJFU1MsCisJCQkJCSAgICBHRU5fU1RBVCwgMiwgJmdlbl9zdGF0LCA0KTsKKwkJaWYgKHJldCA+IDApIHsKKwkJCWlmICgoZ2VuX3N0YXQgJiBGTERfVlBSRVMpID09IDB4MDApCisJCQkJaS0+c3RhdHVzIHw9IFY0TDJfSU5fU1RfTk9fU0lHTkFMOworCQkJaWYgKChnZW5fc3RhdCAmIEZMRF9ITE9DSykgPT0gMHgwMCkKKwkJCQlpLT5zdGF0dXMgfD0gVjRMMl9JTl9TVF9OT19IX0xPQ0s7CisJCX0KKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTg2OSw4ICsxODgyLDYgQEAKIAlzdHJsY3B5KGNhcC0+Y2FyZCwgY3gyMzF4eF9ib2FyZHNbZGV2LT5tb2RlbF0ubmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkpOwogCXVzYl9tYWtlX3BhdGgoZGV2LT51ZGV2LCBjYXAtPmJ1c19pbmZvLCBzaXplb2YoY2FwLT5idXNfaW5mbykpOwogCi0JY2FwLT52ZXJzaW9uID0gQ1gyMzFYWF9WRVJTSU9OX0NPREU7Ci0KIAljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZCSV9DQVBUVVJFIHwKICNpZiAwCiAJCVY0TDJfQ0FQX1NMSUNFRF9WQklfQ0FQVFVSRSB8CkBAIC0yMDU3LDcgKzIwNjgsNiBAQAogCXN0cmxjcHkoY2FwLT5jYXJkLCBjeDIzMXh4X2JvYXJkc1tkZXYtPm1vZGVsXS5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSk7CiAJdXNiX21ha2VfcGF0aChkZXYtPnVkZXYsIGNhcC0+YnVzX2luZm8sIHNpemVvZihjYXAtPmJ1c19pbmZvKSk7CiAKLQljYXAtPnZlcnNpb24gPSBDWDIzMVhYX1ZFUlNJT05fQ09ERTsKIAljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSOwogCXJldHVybiAwOwogfQpAQCAtMjU3MCwxMSArMjU4MCw4IEBACiB7CiAJaW50IHJldDsKIAotCWN4MjMxeHhfaW5mbygiJXM6IHY0bDIgZHJpdmVyIHZlcnNpb24gJWQuJWQuJWRcbiIsCi0JCSAgICAgZGV2LT5uYW1lLAotCQkgICAgIChDWDIzMVhYX1ZFUlNJT05fQ09ERSA+PiAxNikgJiAweGZmLAotCQkgICAgIChDWDIzMVhYX1ZFUlNJT05fQ09ERSA+PiA4KSAmIDB4ZmYsCi0JCSAgICAgQ1gyMzFYWF9WRVJTSU9OX0NPREUgJiAweGZmKTsKKwljeDIzMXh4X2luZm8oIiVzOiB2NGwyIGRyaXZlciB2ZXJzaW9uICVzXG4iLAorCQkgICAgIGRldi0+bmFtZSwgQ1gyMzFYWF9WRVJTSU9OKTsKIAogCS8qIHNldCBkZWZhdWx0IG5vcm0gKi8KIAkvKmRldi0+bm9ybSA9IGN4MjMxeHhfdmlkZW9fdGVtcGxhdGUuY3VycmVudF9ub3JtOyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHguaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LmgKaW5kZXggNDZkZDg0MC4uMjAwMGJjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHguaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC5oCkBAIC00Myw3ICs0Myw3IEBACiAjaW5jbHVkZSAiY3gyMzF4eC1jb25mLXJlZy5oIgogCiAjZGVmaW5lIERSSVZFUl9OQU1FICAgICAgICAgICAgICAgICAgICAgImN4MjMxeHgiCi0jZGVmaW5lIFBXUl9TTEVFUF9JTlRFUlZBTCAgICAgICAgICAgICAgNQorI2RlZmluZSBQV1JfU0xFRVBfSU5URVJWQUwgICAgICAgICAgICAgIDEwCiAKIC8qIEkyQyBhZGRyZXNzZXMgZm9yIGNvbnRyb2wgYmxvY2sgaW4gQ3gyMzF4eCAqLwogI2RlZmluZSAgICAgQUZFX0RFVklDRV9BRERSRVNTCQkweDYwCkBAIC02Nyw2ICs2Nyw4IEBACiAjZGVmaW5lIENYMjMxWFhfQk9BUkRfUFZfWENBUFRVUkVfVVNCIDExCiAjZGVmaW5lIENYMjMxWFhfQk9BUkRfS1dPUkxEX1VCNDMwX1VTQl9IWUJSSUQgMTIKICNkZWZpbmUgQ1gyMzFYWF9CT0FSRF9JQ09OQklUX1UxMDAgMTMKKyNkZWZpbmUgQ1gyMzFYWF9CT0FSRF9IQVVQUEFVR0VfVVNCMl9GTV9QQUwgMTQKKyNkZWZpbmUgQ1gyMzFYWF9CT0FSRF9IQVVQUEFVR0VfVVNCMl9GTV9OVFNDIDE1CiAKIC8qIExpbWl0cyBtaW5pbXVtIGFuZCBkZWZhdWx0IG51bWJlciBvZiBidWZmZXJzICovCiAjZGVmaW5lIENYMjMxWFhfTUlOX0JVRiAgICAgICAgICAgICAgICAgNApAQCAtMTEyLDcgKzExNCw2IEBACiAJVjRMMl9TVERfUEFMX0JHIHwgIFY0TDJfU1REX1BBTF9ESyAgICB8ICBWNEwyX1NURF9QQUxfSSAgICB8IFwKIAlWNEwyX1NURF9QQUxfTSAgfCAgVjRMMl9TVERfUEFMX04gICAgIHwgIFY0TDJfU1REX1BBTF9OYyAgIHwgXAogCVY0TDJfU1REX1BBTF82MCB8ICBWNEwyX1NURF9TRUNBTV9MICAgfCAgVjRMMl9TVERfU0VDQU1fREspCi0jZGVmaW5lIENYMjMxeHhfVkVSU0lPTl9DT0RFIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDIpCiAKICNkZWZpbmUgU0xFRVBfUzVIMTQzMiAgICAzMAogI2RlZmluZSBDWDIzNDE3X09TQ19FTiAgIDgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9hbHRlcmEtY2kuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9hbHRlcmEtY2kuYwppbmRleCA2Nzg1MzliLi4xZmE4OTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvYWx0ZXJhLWNpLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2FsdGVyYS1jaS5jCkBAIC01Miw3ICs1Miw2IEBACiAgKiB8ICBEQVRBN3wgIERBVEE2fCAgREFUQTV8ICBEQVRBNHwgIERBVEEzfCAgREFUQTJ8ICBEQVRBMXwgIERBVEEwfAogICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKICAqLwotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi1kbWEtc2cuaD4KICNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi1kdmIuaD4KICNpbmNsdWRlICJhbHRlcmEtY2kuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LTQxNy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtNDE3LmMKaW5kZXggOWE5OGRjNS4uNjdjNGE1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtNDE3LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtNDE3LmMKQEAgLTEzNTksNyArMTM1OSw2IEBACiAJc3RybGNweShjYXAtPmNhcmQsIGN4MjM4ODVfYm9hcmRzW3RzcG9ydC0+ZGV2LT5ib2FyZF0ubmFtZSwKIAkJc2l6ZW9mKGNhcC0+Y2FyZCkpOwogCXNwcmludGYoY2FwLT5idXNfaW5mbywgIlBDSTolcyIsIHBjaV9uYW1lKGRldi0+cGNpKSk7Ci0JY2FwLT52ZXJzaW9uID0gQ1gyMzg4NV9WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPQogCQlWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKIAkJVjRMMl9DQVBfUkVBRFdSSVRFICAgICB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY2FyZHMuYwppbmRleCA5MzQxODVjLi43NmI3NTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNhcmRzLmMKQEAgLTI5LDExICsyOSwxNyBAQAogI2luY2x1ZGUgIi4uLy4uLy4uL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL2FsdGVyYS5oIgogI2luY2x1ZGUgImN4MjM4ODUuaCIKICNpbmNsdWRlICJ0dW5lci14YzIwMjguaCIKKyNpbmNsdWRlICJuZXR1cC1lZXByb20uaCIKICNpbmNsdWRlICJuZXR1cC1pbml0LmgiCiAjaW5jbHVkZSAiYWx0ZXJhLWNpLmgiCisjaW5jbHVkZSAieGM0MDAwLmgiCiAjaW5jbHVkZSAieGM1MDAwLmgiCiAjaW5jbHVkZSAiY3gyMzg4OC1pci5oIgogCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldHVwX2NhcmRfcmV2ID0gMTsKK21vZHVsZV9wYXJhbShuZXR1cF9jYXJkX3JldiwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobmV0dXBfY2FyZF9yZXYsCisJCSJOZXRVUCBEdWFsIERWQi1UL0MgQ0kgY2FyZCByZXZpc2lvbiIpOwogc3RhdGljIHVuc2lnbmVkIGludCBlbmFibGVfODg1X2lyOwogbW9kdWxlX3BhcmFtKGVuYWJsZV84ODVfaXIsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV84ODVfaXIsCkBAIC0xNzUsNiArMTgxLDM0IEBACiAJCS5uYW1lCQk9ICJMZWFkdGVrIFdpbmZhc3QgUHhEVlIzMjAwIEgiLAogCQkucG9ydGMJCT0gQ1gyMzg4NV9NUEVHX0RWQiwKIAl9LAorCVtDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSF9YQzQwMDBdID0geworCQkubmFtZQkJPSAiTGVhZHRlayBXaW5mYXN0IFB4RFZSMzIwMCBIIFhDNDAwMCIsCisJCS5wb3J0YQkJPSBDWDIzODg1X0FOQUxPR19WSURFTywKKwkJLnBvcnRjCQk9IENYMjM4ODVfTVBFR19EVkIsCisJCS50dW5lcl90eXBlCT0gVFVORVJfWEM0MDAwLAorCQkudHVuZXJfYWRkcgk9IDB4NjEsCisJCS5yYWRpb190eXBlCT0gVFVORVJfWEM0MDAwLAorCQkucmFkaW9fYWRkcgk9IDB4NjEsCisJCS5pbnB1dAkJPSB7eworCQkJLnR5cGUJPSBDWDIzODg1X1ZNVVhfVEVMRVZJU0lPTiwKKwkJCS52bXV4CT0gQ1gyNTg0MF9WSU4yX0NIMSB8CisJCQkJICBDWDI1ODQwX1ZJTjVfQ0gyIHwKKwkJCQkgIENYMjU4NDBfTk9ORTBfQ0gzLAorCQl9LCB7CisJCQkudHlwZQk9IENYMjM4ODVfVk1VWF9DT01QT1NJVEUxLAorCQkJLnZtdXgJPSBDWDI1ODQwX0NPTVBPU0lURTEsCisJCX0sIHsKKwkJCS50eXBlCT0gQ1gyMzg4NV9WTVVYX1NWSURFTywKKwkJCS52bXV4CT0gQ1gyNTg0MF9TVklERU9fTFVNQTMgfAorCQkJCSAgQ1gyNTg0MF9TVklERU9fQ0hST01BNCwKKwkJfSwgeworCQkJLnR5cGUJPSBDWDIzODg1X1ZNVVhfQ09NUE9ORU5ULAorCQkJLnZtdXgJPSBDWDI1ODQwX1ZJTjdfQ0gxIHwKKwkJCQkgIENYMjU4NDBfVklONl9DSDIgfAorCQkJCSAgQ1gyNTg0MF9WSU44X0NIMyB8CisJCQkJICBDWDI1ODQwX0NPTVBPTkVOVF9PTiwKKwkJfSB9LAorCX0sCiAJW0NYMjM4ODVfQk9BUkRfQ09NUFJPX1ZJREVPTUFURV9FNjUwRl0gPSB7CiAJCS5uYW1lCQk9ICJDb21wcm8gVmlkZW9NYXRlIEU2NTBGIiwKIAkJLnBvcnRjCQk9IENYMjM4ODVfTVBFR19EVkIsCkBAIC00MzMsNiArNDY3LDEwIEBACiAJCS5zdWJkZXZpY2UgPSAweDY2ODEsCiAJCS5jYXJkICAgICAgPSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSCwKIAl9LCB7CisJCS5zdWJ2ZW5kb3IgPSAweDEwN2QsCisJCS5zdWJkZXZpY2UgPSAweDZmMzksCisJCS5jYXJkCSAgID0gQ1gyMzg4NV9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfUFhEVlIzMjAwX0hfWEM0MDAwLAorCX0sIHsKIAkJLnN1YnZlbmRvciA9IDB4MTg1YiwKIAkJLnN1YmRldmljZSA9IDB4ZTgwMCwKIAkJLmNhcmQgICAgICA9IENYMjM4ODVfQk9BUkRfQ09NUFJPX1ZJREVPTUFURV9FNjUwRiwKQEAgLTc0OSw2ICs3ODcsNyBAQAogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTUwMDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE1MDBROgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfUFhEVlIzMjAwX0g6CisJY2FzZSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSF9YQzQwMDA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0NPTVBST19WSURFT01BVEVfRTY1MEY6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0NPTVBST19WSURFT01BVEVfRTgwMDoKIAljYXNlIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYVFYxMjAwOgpAQCAtOTA5LDYgKzk0OCw3IEBACiAJCWN4X3NldChHUDBfSU8sIDB4MDAwZjAwMGYpOwogCQlicmVhazsKIAljYXNlIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYRFZSMzIwMF9IOgorCWNhc2UgQ1gyMzg4NV9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfUFhEVlIzMjAwX0hfWEM0MDAwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9DT01QUk9fVklERU9NQVRFX0U2NTBGOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9DT01QUk9fVklERU9NQVRFX0U4MDA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWFRWMTIwMDoKQEAgLTEwOTcsMTIgKzExMzcsMTkgQEAKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE4MDA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjAwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTQwMDoKLQljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyNzA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjc1OgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI1NToKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyMTA6CiAJCS8qIEZJWE1FOiBJbXBsZW1lbnQgbWUgKi8KIAkJYnJlYWs7CisJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjcwOgorCQlyZXQgPSBjeDIzODg4X2lyX3Byb2JlKGRldik7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJZGV2LT5zZF9pciA9IGN4MjM4ODVfZmluZF9odyhkZXYsIENYMjM4ODVfSFdfODg4X0lSKTsKKwkJdjRsMl9zdWJkZXZfY2FsbChkZXYtPnNkX2N4MjU4NDAsIGNvcmUsIHNfaW9fcGluX2NvbmZpZywKKwkJCQkgaXJfcnhfcGluX2NmZ19jb3VudCwgaXJfcnhfcGluX2NmZyk7CisJCWJyZWFrOwogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTg1MDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyOTA6CiAJCXJldCA9IGN4MjM4ODhfaXJfcHJvYmUoZGV2KTsKQEAgLTExNTYsNiArMTIwMyw3IEBACiB2b2lkIGN4MjM4ODVfaXJfZmluaShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldikKIHsKIAlzd2l0Y2ggKGRldi0+Ym9hcmQpIHsKKwljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyNzA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxODUwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI5MDoKIAkJY3gyMzg4NV9pcnFfcmVtb3ZlKGRldiwgUENJX01TS19JUik7CkBAIC0xMTk5LDYgKzEyNDcsNyBAQAogdm9pZCBjeDIzODg1X2lyX3BjaV9pbnRfZW5hYmxlKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2KQogewogCXN3aXRjaCAoZGV2LT5ib2FyZCkgeworCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI3MDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE4NTA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjkwOgogCQlpZiAoZGV2LT5zZF9pcikKQEAgLTEzMjUsNiArMTM3NCw3IEBACiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxNzAwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTQwMDoKIAljYXNlIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYRFZSMzIwMF9IOgorCWNhc2UgQ1gyMzg4NV9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfUFhEVlIzMjAwX0hfWEM0MDAwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9DT01QUk9fVklERU9NQVRFX0U2NTBGOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI3MDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyNzU6CkBAIC0xMzUzLDEwICsxNDAzLDEyIEBACiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxODAwbHA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxNzAwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfUFhEVlIzMjAwX0g6CisJY2FzZSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSF9YQzQwMDA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0NPTVBST19WSURFT01BVEVfRTY1MEY6CiAJY2FzZSBDWDIzODg1X0JPQVJEX05FVFVQX0RVQUxfRFZCUzJfQ0k6CiAJY2FzZSBDWDIzODg1X0JPQVJEX05FVFVQX0RVQUxfRFZCX1RfQ19DSV9SRjoKIAljYXNlIENYMjM4ODVfQk9BUkRfQ09NUFJPX1ZJREVPTUFURV9FODAwOgorCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI3MDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE4NTA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX01ZR0lDQV9YODUwNjoKIAljYXNlIENYMjM4ODVfQk9BUkRfTUFHSUNQUk9fUFJPSERUVkUyOgpAQCAtMTM4Myw2ICsxNDM1LDcgQEAKIAkJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKIAkJY29uc3QgY2hhciAqZmlsZW5hbWUgPSAiZHZiLW5ldHVwLWFsdGVyYS0wMS5mdyI7CiAJCWNoYXIgKmFjdGlvbiA9ICJjb25maWd1cmUiOworCQlzdGF0aWMgc3RydWN0IG5ldHVwX2NhcmRfaW5mbyBjaW5mbzsKIAkJc3RydWN0IGFsdGVyYV9jb25maWcgbmV0dXBfY29uZmlnID0gewogCQkJLmRldiA9IGRldiwKIAkJCS5hY3Rpb24gPSBhY3Rpb24sCkBAIC0xMzkxLDYgKzE0NDQsMjEgQEAKIAogCQluZXR1cF9pbml0aWFsaXplKGRldik7CiAKKwkJbmV0dXBfZ2V0X2NhcmRfaW5mbygmZGV2LT5pMmNfYnVzWzBdLmkyY19hZGFwLCAmY2luZm8pOworCQlpZiAobmV0dXBfY2FyZF9yZXYpCisJCQljaW5mby5yZXYgPSBuZXR1cF9jYXJkX3JldjsKKworCQlzd2l0Y2ggKGNpbmZvLnJldikgeworCQljYXNlIDB4NDoKKwkJCWZpbGVuYW1lID0gImR2Yi1uZXR1cC1hbHRlcmEtMDQuZnciOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmaWxlbmFtZSA9ICJkdmItbmV0dXAtYWx0ZXJhLTAxLmZ3IjsKKwkJCWJyZWFrOworCQl9CisJCXByaW50ayhLRVJOX0lORk8gIk5ldFVQIGNhcmQgcmV2PTB4JXggZndfZmlsZW5hbWU9JXNcbiIsCisJCQkJY2luZm8ucmV2LCBmaWxlbmFtZSk7CisKIAkJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZpbGVuYW1lLCAmZGV2LT5wY2ktPmRldik7CiAJCWlmIChyZXQgIT0gMCkKIAkJCXByaW50ayhLRVJOX0VSUiAiZGlkIG5vdCBmaW5kIHRoZSBmaXJtd2FyZSBmaWxlLiAoJXMpICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNvcmUuYwppbmRleCA0MTk3NzdhLi5lZTQxYTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY29yZS5jCkBAIC00Miw2ICs0Miw3IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgY3gyMzg4NSBiYXNlZCBUViBjYXJkcyIpOwogTU9EVUxFX0FVVEhPUigiU3RldmVuIFRvdGggPHN0b3RoQGxpbnV4dHYub3JnPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oQ1gyMzg4NV9WRVJTSU9OKTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1ZzsKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKQEAgLTIxNDcsMTQgKzIxNDgsOCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBjeDIzODg1X2luaXQodm9pZCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICJjeDIzODg1IGRyaXZlciB2ZXJzaW9uICVkLiVkLiVkIGxvYWRlZFxuIiwKLQkgICAgICAgKENYMjM4ODVfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4ZmYsCi0JICAgICAgIChDWDIzODg1X1ZFUlNJT05fQ09ERSA+PiAgOCkgJiAweGZmLAotCSAgICAgICBDWDIzODg1X1ZFUlNJT05fQ09ERSAmIDB4ZmYpOwotI2lmZGVmIFNOQVBTSE9UCi0JcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzg4NTogc25hcHNob3QgZGF0ZSAlMDRkLSUwMmQtJTAyZFxuIiwKLQkgICAgICAgU05BUFNIT1QvMTAwMDAsIChTTkFQU0hPVC8xMDApJTEwMCwgU05BUFNIT1QlMTAwKTsKLSNlbmRpZgorCXByaW50ayhLRVJOX0lORk8gImN4MjM4ODUgZHJpdmVyIHZlcnNpb24gJXMgbG9hZGVkXG4iLAorCQlDWDIzODg1X1ZFUlNJT04pOwogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZjeDIzODg1X3BjaV9kcml2ZXIpOwogfQogCkBAIC0yMTY1LDUgKzIxNjAsMyBAQAogCiBtb2R1bGVfaW5pdChjeDIzODg1X2luaXQpOwogbW9kdWxlX2V4aXQoY3gyMzg4NV9maW5pKTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtZHZiLmMKaW5kZXggM2MzMTVmOS4uYWE4M2YwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtZHZiLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlICJ0ZGE4MjkwLmgiCiAjaW5jbHVkZSAidGRhMTgyNzEuaCIKICNpbmNsdWRlICJsZ2R0MzMweC5oIgorI2luY2x1ZGUgInhjNDAwMC5oIgogI2luY2x1ZGUgInhjNTAwMC5oIgogI2luY2x1ZGUgIm1heDIxNjUuaCIKICNpbmNsdWRlICJ0ZGExMDA0OC5oIgpAQCAtOTIxLDYgKzkyMiwyNiBAQAogCQkJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9jb25maWcoZmUsICZjdGwpOwogCQl9CiAJCWJyZWFrOworCWNhc2UgQ1gyMzg4NV9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfUFhEVlIzMjAwX0hfWEM0MDAwOgorCQlpMmNfYnVzID0gJmRldi0+aTJjX2J1c1swXTsKKworCQlmZTAtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsCisJCQkJCSAgICAgICAmZHZpY29fZnVzaW9uaGR0dl94YzMwMjgsCisJCQkJCSAgICAgICAmaTJjX2J1cy0+aTJjX2FkYXApOworCQlpZiAoZmUwLT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgeworCQkJc3RydWN0IGR2Yl9mcm9udGVuZAkqZmU7CisJCQlzdHJ1Y3QgeGM0MDAwX2NvbmZpZwljZmcgPSB7CisJCQkJLmkyY19hZGRyZXNzCSAgPSAweDYxLAorCQkJCS5kZWZhdWx0X3BtCSAgPSAwLAorCQkJCS5kdmJfYW1wbGl0dWRlCSAgPSAxMzQsCisJCQkJLnNldF9zbW9vdGhlZGN2YnMgPSAxLAorCQkJCS5pZl9raHoJCSAgPSA0NTYwCisJCQl9OworCisJCQlmZSA9IGR2Yl9hdHRhY2goeGM0MDAwX2F0dGFjaCwgZmUwLT5kdmIuZnJvbnRlbmQsCisJCQkJCSZkZXYtPmkyY19idXNbMV0uaTJjX2FkYXAsICZjZmcpOworCQl9CisJCWJyZWFrOwogCWNhc2UgQ1gyMzg4NV9CT0FSRF9UQlNfNjkyMDoKIAkJaTJjX2J1cyA9ICZkZXYtPmkyY19idXNbMV07CiAKQEAgLTEyNDksNyArMTI3MCw3IEBACiAJICogaW1wbGVtZW50IE1GRSBzdXBwb3J0LgogCSAqLwogCWZlMCA9IHZpZGVvYnVmX2R2Yl9nZXRfZnJvbnRlbmQoJnBvcnQtPmZyb250ZW5kcywgMSk7Ci0JaWYgKGZlMC0+ZHZiLmZyb250ZW5kKQorCWlmIChmZTAgJiYgZmUwLT5kdmIuZnJvbnRlbmQpCiAJCXZpZGVvYnVmX2R2Yl91bnJlZ2lzdGVyX2J1cygmcG9ydC0+ZnJvbnRlbmRzKTsKIAogCXN3aXRjaCAocG9ydC0+ZGV2LT5ib2FyZCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWlucHV0LmMKaW5kZXggZTk3Y2FmZC4uY2U3NjVlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtaW5wdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1pbnB1dC5jCkBAIC04Miw2ICs4Miw3IEBACiAJCXJldHVybjsKIAogCXN3aXRjaCAoZGV2LT5ib2FyZCkgeworCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI3MDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE4NTA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjkwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9URVZJSV9TNDcwOgpAQCAtMTMzLDYgKzEzNCw3IEBACiAKIAl2NGwyX3N1YmRldl9jYWxsKGRldi0+c2RfaXIsIGlyLCByeF9nX3BhcmFtZXRlcnMsICZwYXJhbXMpOwogCXN3aXRjaCAoZGV2LT5ib2FyZCkgeworCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI3MDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE4NTA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjkwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI1MDoKQEAgLTIyOSw2ICsyMzEsOSBAQAogCQl2NGwyX3N1YmRldl9jYWxsKGRldi0+c2RfaXIsIGlyLCByeF9zX3BhcmFtZXRlcnMsICZwYXJhbXMpOwogCQl2NGwyX3N1YmRldl9jYWxsKGRldi0+c2RfaXIsIGlyLCByeF9nX3BhcmFtZXRlcnMsICZwYXJhbXMpOwogCX0KKwlmbHVzaF93b3JrX3N5bmMoJmRldi0+Y3gyNTg0MF93b3JrKTsKKwlmbHVzaF93b3JrX3N5bmMoJmRldi0+aXJfcnhfd29yayk7CisJZmx1c2hfd29ya19zeW5jKCZkZXYtPmlyX3R4X3dvcmspOwogfQogCiBzdGF0aWMgdm9pZCBjeDIzODg1X2lucHV0X2lyX2Nsb3NlKHN0cnVjdCByY19kZXYgKnJjKQpAQCAtMjU3LDYgKzI2Miw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJc3dpdGNoIChkZXYtPmJvYXJkKSB7CisJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjcwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTg1MDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyOTA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjUwOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LXZpZGVvLmMKaW5kZXggZWU1N2Y2Yi4uODk2YmIzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS12aWRlby5jCkBAIC0xMDAwLDcgKzEwMDAsNiBAQAogCXN0cmxjcHkoY2FwLT5jYXJkLCBjeDIzODg1X2JvYXJkc1tkZXYtPmJvYXJkXS5uYW1lLAogCQlzaXplb2YoY2FwLT5jYXJkKSk7CiAJc3ByaW50ZihjYXAtPmJ1c19pbmZvLCAiUENJZTolcyIsIHBjaV9uYW1lKGRldi0+cGNpKSk7Ci0JY2FwLT52ZXJzaW9uID0gQ1gyMzg4NV9WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPQogCQlWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKIAkJVjRMMl9DQVBfUkVBRFdSSVRFICAgICB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUuaAppbmRleCBjMTg2NDczLi5kODZiYzBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LmgKQEAgLTM2LDEwICszNiw5IEBACiAjaW5jbHVkZSAiY3gyMzg4NS1yZWcuaCIKICNpbmNsdWRlICJtZWRpYS9jeDIzNDF4LmgiCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAotI2RlZmluZSBDWDIzODg1X1ZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTigwLCAwLCAyKQorI2RlZmluZSBDWDIzODg1X1ZFUlNJT04gIjAuMC4zIgogCiAjZGVmaW5lIFVOU0VUICgtMVUpCiAKQEAgLTg2LDYgKzg1LDcgQEAKICNkZWZpbmUgQ1gyMzg4NV9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfUFhUVjEyMDAgMjgKICNkZWZpbmUgQ1gyMzg4NV9CT0FSRF9HT1RWSUVXX1g1XzNEX0hZQlJJRCAgICAgMjkKICNkZWZpbmUgQ1gyMzg4NV9CT0FSRF9ORVRVUF9EVUFMX0RWQl9UX0NfQ0lfUkYgMzAKKyNkZWZpbmUgQ1gyMzg4NV9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfUFhEVlIzMjAwX0hfWEM0MDAwIDMxCiAKICNkZWZpbmUgR1BJT18wIDB4MDAwMDAwMDEKICNkZWZpbmUgR1BJT18xIDB4MDAwMDAwMDIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWFsc2EuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWFsc2EuYwppbmRleCA0MjNjMWFmLi42OGQxMjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1hbHNhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYWxzYS5jCkBAIC0xMTMsNiArMTEzLDggQEAKIE1PRFVMRV9BVVRIT1IoIlJpY2FyZG8gQ2VycXVlaXJhIik7CiBNT0RVTEVfQVVUSE9SKCJNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKENYODhfVkVSU0lPTik7CisKIE1PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7e0NvbmV4YW50LDIzODgxfSwiCiAJCQkie3tDb25leGFudCwyMzg4Mn0sIgogCQkJInt7Q29uZXhhbnQsMjM4ODN9Iik7CkBAIC05NzMsMTQgKzk3NSw4IEBACiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IGN4ODhfYXVkaW9faW5pdCh2b2lkKQogewotCXByaW50ayhLRVJOX0lORk8gImN4MjM4OHggYWxzYSBkcml2ZXIgdmVyc2lvbiAlZC4lZC4lZCBsb2FkZWRcbiIsCi0JICAgICAgIChDWDg4X1ZFUlNJT05fQ09ERSA+PiAxNikgJiAweGZmLAotCSAgICAgICAoQ1g4OF9WRVJTSU9OX0NPREUgPj4gIDgpICYgMHhmZiwKLQkgICAgICAgQ1g4OF9WRVJTSU9OX0NPREUgJiAweGZmKTsKLSNpZmRlZiBTTkFQU0hPVAotCXByaW50ayhLRVJOX0lORk8gImN4MjM4OHg6IHNuYXBzaG90IGRhdGUgJTA0ZC0lMDJkLSUwMmRcbiIsCi0JICAgICAgIFNOQVBTSE9ULzEwMDAwLCAoU05BUFNIT1QvMTAwKSUxMDAsIFNOQVBTSE9UJTEwMCk7Ci0jZW5kaWYKKwlwcmludGsoS0VSTl9JTkZPICJjeDIzODh4IGFsc2EgZHJpdmVyIHZlcnNpb24gJXMgbG9hZGVkXG4iLAorCSAgICAgICBDWDg4X1ZFUlNJT04pOwogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZjeDg4X2F1ZGlvX3BjaV9kcml2ZXIpOwogfQogCkBAIC05OTQsMTAgKzk5MCwzIEBACiAKIG1vZHVsZV9pbml0KGN4ODhfYXVkaW9faW5pdCk7CiBtb2R1bGVfZXhpdChjeDg4X2F1ZGlvX2ZpbmkpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWJsYWNrYmlyZC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKaW5kZXggMTFlNDliYi4uZTQ2NDQ2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKQEAgLTQyLDYgKzQyLDcgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiZHJpdmVyIGZvciBjeDIzODh4L2N4MjM0MTYgYmFzZWQgbXBlZyBlbmNvZGVyIGNhcmRzIik7CiBNT0RVTEVfQVVUSE9SKCJKZWxsZSBGb2tzIDxqZWxsZUBmb2tzLnVzPiwgR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPiBbU3VTRSBMYWJzXSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oQ1g4OF9WRVJTSU9OKTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBtcGVnYnVmcyA9IDMyOwogbW9kdWxlX3BhcmFtKG1wZWdidWZzLGludCwwNjQ0KTsKQEAgLTczMCw3ICs3MzEsNiBAQAogCXN0cmNweShjYXAtPmRyaXZlciwgImN4ODhfYmxhY2tiaXJkIik7CiAJc3RybGNweShjYXAtPmNhcmQsIGNvcmUtPmJvYXJkLm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKIAlzcHJpbnRmKGNhcC0+YnVzX2luZm8sIlBDSTolcyIscGNpX25hbWUoZGV2LT5wY2kpKTsKLQljYXAtPnZlcnNpb24gPSBDWDg4X1ZFUlNJT05fQ09ERTsKIAljYXAtPmNhcGFiaWxpdGllcyA9CiAJCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAogCQlWNEwyX0NBUF9SRUFEV1JJVEUgICAgIHwKQEAgLTEzNjgsMTQgKzEzNjgsOCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBibGFja2JpcmRfaW5pdCh2b2lkKQogewotCXByaW50ayhLRVJOX0lORk8gImN4MjM4OHggYmxhY2tiaXJkIGRyaXZlciB2ZXJzaW9uICVkLiVkLiVkIGxvYWRlZFxuIiwKLQkgICAgICAgKENYODhfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4ZmYsCi0JICAgICAgIChDWDg4X1ZFUlNJT05fQ09ERSA+PiAgOCkgJiAweGZmLAotCSAgICAgICBDWDg4X1ZFUlNJT05fQ09ERSAmIDB4ZmYpOwotI2lmZGVmIFNOQVBTSE9UCi0JcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzg4eDogc25hcHNob3QgZGF0ZSAlMDRkLSUwMmQtJTAyZFxuIiwKLQkgICAgICAgU05BUFNIT1QvMTAwMDAsIChTTkFQU0hPVC8xMDApJTEwMCwgU05BUFNIT1QlMTAwKTsKLSNlbmRpZgorCXByaW50ayhLRVJOX0lORk8gImN4MjM4OHggYmxhY2tiaXJkIGRyaXZlciB2ZXJzaW9uICVzIGxvYWRlZFxuIiwKKwkgICAgICAgQ1g4OF9WRVJTSU9OKTsKIAlyZXR1cm4gY3g4ODAyX3JlZ2lzdGVyX2RyaXZlcigmY3g4ODAyX2JsYWNrYmlyZF9kcml2ZXIpOwogfQogCkBAIC0xMzg5LDExICsxMzgzLDMgQEAKIAogbW9kdWxlX3BhcmFtX25hbWVkKHZpZGVvX2RlYnVnLGN4ODgwMl9tcGVnX3RlbXBsYXRlLmRlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIFt2aWRlb10iKTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWJhc2ljLW9mZnNldDogOAotICogRW5kOgotICoga2F0ZTogZW9sICJ1bml4IjsgaW5kZW50LXdpZHRoIDM7IHJlbW92ZS10cmFpbGluZy1zcGFjZSBvbjsgcmVwbGFjZS10cmFpbGluZy1zcGFjZS1zYXZlIG9uOyB0YWItd2lkdGggODsgcmVwbGFjZS10YWJzIG9mZjsgc3BhY2UtaW5kZW50IG9mZjsgbWl4ZWQtaW5kZW50IG9mZgotICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYwppbmRleCAyNzIyMmM5Li4wZDcxOWZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMKQEAgLTI4LDYgKzI4LDcgQEAKIAogI2luY2x1ZGUgImN4ODguaCIKICNpbmNsdWRlICJ0ZWE1NzY3LmgiCisjaW5jbHVkZSAieGM0MDAwLmgiCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdHVuZXJbXSA9IHtbMCAuLi4gKENYODhfTUFYQk9BUkRTIC0gMSldID0gVU5TRVQgfTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcmFkaW9bXSA9IHtbMCAuLi4gKENYODhfTUFYQk9BUkRTIC0gMSldID0gVU5TRVQgfTsKQEAgLTIxMTksNiArMjEyMCw5OSBAQAogCQl9LAogCQkubXBlZyAgICAgICAgICAgPSBDWDg4X01QRUdfRFZCLAogCX0sCisJW0NYODhfQk9BUkRfV0lORkFTVF9EVFYxODAwSF9YQzQwMDBdID0geworCQkubmFtZQkJPSAiTGVhZHRlayBXaW5GYXN0IERUVjE4MDAgSCAoWEM0MDAwKSIsCisJCS50dW5lcl90eXBlCT0gVFVORVJfWEM0MDAwLAorCQkucmFkaW9fdHlwZQk9IFRVTkVSX1hDNDAwMCwKKwkJLnR1bmVyX2FkZHIJPSAweDYxLAorCQkucmFkaW9fYWRkcgk9IDB4NjEsCisJCS8qCisJCSAqIEdQSU8gc2V0dGluZworCQkgKgorCQkgKiAgMjogbXV0ZSAoMD1vZmYsMT1vbikKKwkJICogMTI6IHR1bmVyIHJlc2V0IHBpbgorCQkgKiAxMzogYXVkaW8gc291cmNlICgwPXR1bmVyIGF1ZGlvLDE9bGluZSBpbikKKwkJICogMTQ6IEZNICgwPW9uLDE9b2ZmID8/PykKKwkJICovCisJCS5pbnB1dAkJPSB7eworCQkJLnR5cGUJPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKKwkJCS52bXV4CT0gMCwKKwkJCS5ncGlvMAk9IDB4MDQwMCwJLyogcGluIDIgPSAwICovCisJCQkuZ3BpbzEJPSAweDYwNDAsCS8qIHBpbiAxMyA9IDAsIHBpbiAxNCA9IDEgKi8KKwkJCS5ncGlvMgk9IDB4MDAwMCwKKwkJfSwgeworCQkJLnR5cGUJPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4CT0gMSwKKwkJCS5ncGlvMAk9IDB4MDQwMCwJLyogcGluIDIgPSAwICovCisJCQkuZ3BpbzEJPSAweDYwNjAsCS8qIHBpbiAxMyA9IDEsIHBpbiAxNCA9IDEgKi8KKwkJCS5ncGlvMgk9IDB4MDAwMCwKKwkJfSwgeworCQkJLnR5cGUJPSBDWDg4X1ZNVVhfU1ZJREVPLAorCQkJLnZtdXgJPSAyLAorCQkJLmdwaW8wCT0gMHgwNDAwLAkvKiBwaW4gMiA9IDAgKi8KKwkJCS5ncGlvMQk9IDB4NjA2MCwJLyogcGluIDEzID0gMSwgcGluIDE0ID0gMSAqLworCQkJLmdwaW8yCT0gMHgwMDAwLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLnR5cGUJPSBDWDg4X1JBRElPLAorCQkJLmdwaW8wCT0gMHgwNDAwLAkvKiBwaW4gMiA9IDAgKi8KKwkJCS5ncGlvMQk9IDB4NjAwMCwJLyogcGluIDEzID0gMCwgcGluIDE0ID0gMCAqLworCQkJLmdwaW8yCT0gMHgwMDAwLAorCQl9LAorCQkubXBlZwkJPSBDWDg4X01QRUdfRFZCLAorCX0sCisJW0NYODhfQk9BUkRfV0lORkFTVF9EVFYyMDAwSF9QTFVTXSA9IHsKKwkJLm5hbWUJCT0gIkxlYWR0ZWsgV2luRmFzdCBEVFYyMDAwIEggUExVUyIsCisJCS50dW5lcl90eXBlCT0gVFVORVJfWEM0MDAwLAorCQkucmFkaW9fdHlwZQk9IFRVTkVSX1hDNDAwMCwKKwkJLnR1bmVyX2FkZHIJPSAweDYxLAorCQkucmFkaW9fYWRkcgk9IDB4NjEsCisJCS8qCisJCSAqIEdQSU8KKwkJICogICAyOiAxOiBtdXRlIGF1ZGlvCisJCSAqICAxMjogMDogcmVzZXQgWEM0MDAwCisJCSAqICAxMzogMTogYXVkaW8gaW5wdXQgaXMgbGluZSBpbiAoMDogdHVuZXIpCisJCSAqICAxNDogMDogRk0gcmFkaW8KKwkJICogIDE2OiAwOiBSRiBpbnB1dCBpcyBjYWJsZQorCQkgKi8KKwkJLmlucHV0CQk9IHt7CisJCQkudHlwZQk9IENYODhfVk1VWF9URUxFVklTSU9OLAorCQkJLnZtdXgJPSAwLAorCQkJLmdwaW8wCT0gMHgwNDAzLAorCQkJLmdwaW8xCT0gMHhGMEQ3LAorCQkJLmdwaW8yCT0gMHgwMTAxLAorCQkJLmdwaW8zCT0gMHgwMDAwLAorCQl9LCB7CisJCQkudHlwZQk9IENYODhfVk1VWF9DQUJMRSwKKwkJCS52bXV4CT0gMCwKKwkJCS5ncGlvMAk9IDB4MDQwMywKKwkJCS5ncGlvMQk9IDB4RjBENywKKwkJCS5ncGlvMgk9IDB4MDEwMCwKKwkJCS5ncGlvMwk9IDB4MDAwMCwKKwkJfSwgeworCQkJLnR5cGUJPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4CT0gMSwKKwkJCS5ncGlvMAk9IDB4MDQwMywJLyogd2FzIDB4MDQwNyAqLworCQkJLmdwaW8xCT0gMHhGMEY3LAorCQkJLmdwaW8yCT0gMHgwMTAxLAorCQkJLmdwaW8zCT0gMHgwMDAwLAorCQl9LCB7CisJCQkudHlwZQk9IENYODhfVk1VWF9TVklERU8sCisJCQkudm11eAk9IDIsCisJCQkuZ3BpbzAJPSAweDA0MDMsCS8qIHdhcyAweDA0MDcgKi8KKwkJCS5ncGlvMQk9IDB4RjBGNywKKwkJCS5ncGlvMgk9IDB4MDEwMSwKKwkJCS5ncGlvMwk9IDB4MDAwMCwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS50eXBlCT0gQ1g4OF9SQURJTywKKwkJCS5ncGlvMAk9IDB4MDQwMywKKwkJCS5ncGlvMQk9IDB4RjA5NywKKwkJCS5ncGlvMgk9IDB4MDEwMCwKKwkJCS5ncGlvMwk9IDB4MDAwMCwKKwkJfSwKKwkJLm1wZWcJCT0gQ1g4OF9NUEVHX0RWQiwKKwl9LAogCVtDWDg4X0JPQVJEX1BST0ZfNzMwMV0gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJQcm9mIDczMDEgRFZCLVMvUzIiLAogCQkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKQEAgLTI1ODEsNiArMjY3NSwxNSBAQAogCQkuc3ViZGV2aWNlID0gMHg2NjU0LAogCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjE4MDBILAogCX0sIHsKKwkJLyogV2luRmFzdCBEVFYxODAwIEggd2l0aCBYQzQwMDAgdHVuZXIgKi8KKwkJLnN1YnZlbmRvciA9IDB4MTA3ZCwKKwkJLnN1YmRldmljZSA9IDB4NmYzOCwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfV0lORkFTVF9EVFYxODAwSF9YQzQwMDAsCisJfSwgeworCQkuc3VidmVuZG9yID0gMHgxMDdkLAorCQkuc3ViZGV2aWNlID0gMHg2ZjQyLAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjIwMDBIX1BMVVMsCisJfSwgewogCQkvKiBQVlIyMDAwIFBBTCBNb2RlbCBbMTA3ZDo2NjMwXSAqLwogCQkuc3VidmVuZG9yID0gMHgxMDdkLAogCQkuc3ViZGV2aWNlID0gMHg2NjMwLApAQCAtMjg0Niw2ICsyOTQ5LDIzIEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKK3N0YXRpYyBpbnQgY3g4OF94YzQwMDBfd2luZmFzdDIwMDBoX3BsdXNfY2FsbGJhY2soc3RydWN0IGN4ODhfY29yZSAqY29yZSwKKwkJCQkJCSAgaW50IGNvbW1hbmQsIGludCBhcmcpCit7CisJc3dpdGNoIChjb21tYW5kKSB7CisJY2FzZSBYQzQwMDBfVFVORVJfUkVTRVQ6CisJCS8qIEdQSU8gMTIgKHhjNDAwMCB0dW5lciByZXNldCkgKi8KKwkJY3hfc2V0KE1PX0dQMV9JTywgMHgxMDEwKTsKKwkJbWRlbGF5KDUwKTsKKwkJY3hfY2xlYXIoTU9fR1AxX0lPLCAweDEwKTsKKwkJbWRlbGF5KDc1KTsKKwkJY3hfc2V0KE1PX0dQMV9JTywgMHgxMCk7CisJCW1kZWxheSg3NSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogc29tZSBEaXZjbyBzcGVjaWZpYyBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogc3RhdGljIGludCBjeDg4X3B2XzgwMDBndF9jYWxsYmFjayhzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLApAQCAtMjk0OCw2ICszMDY4LDE5IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKK3N0YXRpYyBpbnQgY3g4OF94YzQwMDBfdHVuZXJfY2FsbGJhY2soc3RydWN0IGN4ODhfY29yZSAqY29yZSwKKwkJCQkgICAgICBpbnQgY29tbWFuZCwgaW50IGFyZykKK3sKKwkvKiBCb2FyZC1zcGVjaWZpYyBjYWxsYmFja3MgKi8KKwlzd2l0Y2ggKGNvcmUtPmJvYXJkbnIpIHsKKwljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYxODAwSF9YQzQwMDA6CisJY2FzZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMjAwMEhfUExVUzoKKwkJcmV0dXJuIGN4ODhfeGM0MDAwX3dpbmZhc3QyMDAwaF9wbHVzX2NhbGxiYWNrKGNvcmUsCisJCQkJCQkJICAgICAgY29tbWFuZCwgYXJnKTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBUdW5lciBjYWxsYmFjayBmdW5jdGlvbi4gQ3VycmVudGx5IG9ubHkgbmVlZGVkIGZvciB0aGUgUGlubmFjbGUgCSAgICoKICAqIFBDVFYgSEQgODAwaSB3aXRoIGFuIHhjNTAwMCBzaWxsaWNvbiB0dW5lci4gVGhpcyBpcyB1c2VkIGZvciBib3RoCSAgICoKQEAgLTMwMjIsNiArMzE1NSw5IEBACiAJCWNhc2UgVFVORVJfWEMyMDI4OgogCQkJaW5mb19wcmludGsoY29yZSwgIkNhbGxpbmcgWEMyMDI4LzMwMjggY2FsbGJhY2tcbiIpOwogCQkJcmV0dXJuIGN4ODhfeGMyMDI4X3R1bmVyX2NhbGxiYWNrKGNvcmUsIGNvbW1hbmQsIGFyZyk7CisJCWNhc2UgVFVORVJfWEM0MDAwOgorCQkJaW5mb19wcmludGsoY29yZSwgIkNhbGxpbmcgWEM0MDAwIGNhbGxiYWNrXG4iKTsKKwkJCXJldHVybiBjeDg4X3hjNDAwMF90dW5lcl9jYWxsYmFjayhjb3JlLCBjb21tYW5kLCBhcmcpOwogCQljYXNlIFRVTkVSX1hDNTAwMDoKIAkJCWluZm9fcHJpbnRrKGNvcmUsICJDYWxsaW5nIFhDNTAwMCBjYWxsYmFja1xuIik7CiAJCQlyZXR1cm4gY3g4OF94YzUwMDBfdHVuZXJfY2FsbGJhY2soY29yZSwgY29tbWFuZCwgYXJnKTsKQEAgLTMxMDksMTMgKzMyNDUsMTMgQEAKIAogCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX1RWMjAwMF9YUF9HTE9CQUw6CiAJY2FzZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMTgwMEg6Ci0JCS8qIEdQSU8gMTIgKHhjMzAyOCB0dW5lciByZXNldCkgKi8KLQkJY3hfc2V0KE1PX0dQMV9JTywgMHgxMDEwKTsKLQkJbWRlbGF5KDUwKTsKLQkJY3hfY2xlYXIoTU9fR1AxX0lPLCAweDEwKTsKLQkJbWRlbGF5KDUwKTsKLQkJY3hfc2V0KE1PX0dQMV9JTywgMHgxMCk7Ci0JCW1kZWxheSg1MCk7CisJCWN4ODhfeGMzMDI4X3dpbmZhc3QxODAwaF9jYWxsYmFjayhjb3JlLCBYQzIwMjhfVFVORVJfUkVTRVQsIDApOworCQlicmVhazsKKworCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjE4MDBIX1hDNDAwMDoKKwljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYyMDAwSF9QTFVTOgorCQljeDg4X3hjNDAwMF93aW5mYXN0MjAwMGhfcGx1c19jYWxsYmFjayhjb3JlLAorCQkJCQkJICAgICAgIFhDNDAwMF9UVU5FUl9SRVNFVCwgMCk7CiAJCWJyZWFrOwogCiAJY2FzZSBDWDg4X0JPQVJEX1RXSU5IQU5fVlAxMDI3X0RWQlM6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMKaW5kZXggMmUxNDVmMC4uZmJjYWExYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYwpAQCAtNjM2LDYgKzYzNiw5IEBACiAJY3hfd3JpdGUoTU9fUENJX0lOVFNUQVQsICAgMHhGRkZGRkZGRik7IC8vIENsZWFyIFBDSSBpbnQKIAljeF93cml0ZShNT19JTlQxX1NUQVQsICAgICAweEZGRkZGRkZGKTsgLy8gQ2xlYXIgUklTQyBpbnQKIAorCS8qIHNldCBkZWZhdWx0IG5vdGNoIGZpbHRlciAqLworCWN4X2FuZG9yKE1PX0hUT1RBTCwgMHgxODAwLCAoSExOb3RjaEZpbHRlcjR4RnNjIDw8IDExKSk7CisKIAkvKiBSZXNldCBvbi1ib2FyZCBwYXJ0cyAqLwogCWN4X3dyaXRlKE1PX1NSU1RfSU8sIDApOwogCW1zbGVlcCgxMCk7CkBAIC03NTksOCArNzYyLDggQEAKIAlpZiAobm9jb21iKQogCQl2YWx1ZSB8PSAoMyA8PCA1KTsgLy8gZGlzYWJsZSBjb21iIGZpbHRlcgogCi0JY3hfd3JpdGUoTU9fRklMVEVSX0VWRU4sICB2YWx1ZSk7Ci0JY3hfd3JpdGUoTU9fRklMVEVSX09ERCwgICB2YWx1ZSk7CisJY3hfYW5kb3IoTU9fRklMVEVSX0VWRU4sICAweDdmZmM3ZiwgdmFsdWUpOyAvKiBwcmVzZXJ2ZSBQRUFLRU4sIFBTRUwgKi8KKwljeF9hbmRvcihNT19GSUxURVJfT0RELCAgIDB4N2ZmYzdmLCB2YWx1ZSk7CiAJZHByaW50aygxLCJzZXRfc2NhbGU6IGZpbHRlciAgMHglMDR4XG4iLCB2YWx1ZSk7CiAKIAlyZXR1cm4gMDsKQEAgLTk5NCwxMCArOTk3LDEwIEBACiAJLy8gaHRvdGFsCiAJdG1wNjQgPSBub3JtX2h0b3RhbChub3JtKSAqICh1NjQpdmRlY19jbG9jazsKIAlkb19kaXYodG1wNjQsIGZzYzgpOwotCWh0b3RhbCA9ICh1MzIpdG1wNjQgfCAoSExOb3RjaEZpbHRlcjR4RnNjIDw8IDExKTsKKwlodG90YWwgPSAodTMyKXRtcDY0OwogCWRwcmludGsoMSwic2V0X3R2bm9ybTogTU9fSFRPVEFMICAgICAgICAweCUwOHggW29sZD0weCUwOHgsaHRvdGFsPSVkXVxuIiwKIAkJaHRvdGFsLCBjeF9yZWFkKE1PX0hUT1RBTCksICh1MzIpdG1wNjQpOwotCWN4X3dyaXRlKE1PX0hUT1RBTCwgaHRvdGFsKTsKKwljeF9hbmRvcihNT19IVE9UQUwsIDB4MDdmZiwgaHRvdGFsKTsKIAogCS8vIHZiaSBzdHVmZiwgc2V0IHZiaSBvZmZzZXQgdG8gMTAgKGZvciAyMCBDbGsqMiBwaXhlbHMpLCB0aGlzIG1ha2VzCiAJLy8gdGhlIGVmZmVjdGl2ZSB2Ymkgb2Zmc2V0IH4yNDQgc2FtcGxlcywgdGhlIHNhbWUgYXMgdGhlIEJ0OHg4CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCmluZGV4IGM2OWRmN2UuLmNmM2QzM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSAib3I1MTEzMi5oIgogI2luY2x1ZGUgImxnZHQzMzB4LmgiCiAjaW5jbHVkZSAiczVoMTQwOS5oIgorI2luY2x1ZGUgInhjNDAwMC5oIgogI2luY2x1ZGUgInhjNTAwMC5oIgogI2luY2x1ZGUgIm54dDIwMHguaCIKICNpbmNsdWRlICJjeDI0MTIzLmgiCkBAIC02Myw2ICs2NCw3IEBACiBNT0RVTEVfQVVUSE9SKCJDaHJpcyBQYXNjb2UgPGMucGFzY29lQGl0ZWUudXEuZWR1LmF1PiIpOwogTU9EVUxFX0FVVEhPUigiR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPiBbU3VTRSBMYWJzXSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oQ1g4OF9WRVJTSU9OKTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1ZzsKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKQEAgLTYwNSw2ICs2MDcsMzkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBhdHRhY2hfeGM0MDAwKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYsIHN0cnVjdCB4YzQwMDBfY29uZmlnICpjZmcpCit7CisJc3RydWN0IGR2Yl9mcm9udGVuZCAqZmU7CisJc3RydWN0IHZpZGVvYnVmX2R2Yl9mcm9udGVuZCAqZmUwID0gTlVMTDsKKworCS8qIEdldCB0aGUgZmlyc3QgZnJvbnRlbmQgKi8KKwlmZTAgPSB2aWRlb2J1Zl9kdmJfZ2V0X2Zyb250ZW5kKCZkZXYtPmZyb250ZW5kcywgMSk7CisJaWYgKCFmZTApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFmZTAtPmR2Yi5mcm9udGVuZCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzLzI6IGR2YiBmcm9udGVuZCBub3QgYXR0YWNoZWQuICIKKwkJCQkiQ2FuJ3QgYXR0YWNoIHhjNDAwMFxuIiwKKwkJICAgICAgIGRldi0+Y29yZS0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZlID0gZHZiX2F0dGFjaCh4YzQwMDBfYXR0YWNoLCBmZTAtPmR2Yi5mcm9udGVuZCwgJmRldi0+Y29yZS0+aTJjX2FkYXAsCisJCQljZmcpOworCWlmICghZmUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlcy8yOiB4YzQwMDAgYXR0YWNoIGZhaWxlZFxuIiwKKwkJICAgICAgIGRldi0+Y29yZS0+bmFtZSk7CisJCWR2Yl9mcm9udGVuZF9kZXRhY2goZmUwLT5kdmIuZnJvbnRlbmQpOworCQlkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChmZTAtPmR2Yi5mcm9udGVuZCk7CisJCWZlMC0+ZHZiLmZyb250ZW5kID0gTlVMTDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMvMjogeGM0MDAwIGF0dGFjaGVkXG4iLCBkZXYtPmNvcmUtPm5hbWUpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgY3gyNDExNl9zZXRfdHNfcGFyYW0oc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCiAJaW50IGlzX3B1bmN0dXJlZCkKIHsKQEAgLTEyOTQsNyArMTMyOSwyNSBAQAogCQkJCWdvdG8gZnJvbnRlbmRfZGV0YWNoOwogCQl9CiAJCWJyZWFrOwotCSBjYXNlIENYODhfQk9BUkRfR0VOSUFURUNIX1g4MDAwX01UOgorCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjE4MDBIX1hDNDAwMDoKKwljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYyMDAwSF9QTFVTOgorCQlmZTAtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsCisJCQkJCSAgICAgICAmY3g4OF9waW5uYWNsZV9oeWJyaWRfcGN0diwKKwkJCQkJICAgICAgICZjb3JlLT5pMmNfYWRhcCk7CisJCWlmIChmZTAtPmR2Yi5mcm9udGVuZCkgeworCQkJc3RydWN0IHhjNDAwMF9jb25maWcgY2ZnID0geworCQkJCS5pMmNfYWRkcmVzcwkgID0gMHg2MSwKKwkJCQkuZGVmYXVsdF9wbQkgID0gMCwKKwkJCQkuZHZiX2FtcGxpdHVkZQkgID0gMTM0LAorCQkJCS5zZXRfc21vb3RoZWRjdmJzID0gMSwKKwkJCQkuaWZfa2h6CQkgID0gNDU2MAorCQkJfTsKKwkJCWZlMC0+ZHZiLmZyb250ZW5kLT5vcHMuaTJjX2dhdGVfY3RybCA9IE5VTEw7CisJCQlpZiAoYXR0YWNoX3hjNDAwMChkZXYsICZjZmcpIDwgMCkKKwkJCQlnb3RvIGZyb250ZW5kX2RldGFjaDsKKwkJfQorCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfR0VOSUFURUNIX1g4MDAwX01UOgogCQlkZXYtPnRzX2dlbl9jbnRybCA9IDB4MDA7CiAKIAkJZmUwLT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLApAQCAtMTU3Nyw2ICsxNjMwLDExIEBACiAJCXVkZWxheSgxMDAwKTsKIAkJYnJlYWs7CiAKKwljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYyMDAwSF9QTFVTOgorCQkvKiBzZXQgUkYgaW5wdXQgdG8gQUlSIGZvciBEVkItVCAoR1BJTyAxNikgKi8KKwkJY3hfd3JpdGUoTU9fR1AyX0lPLCAweDAxMDEpOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCWVyciA9IC1FTk9ERVY7CiAJfQpAQCAtMTY5MiwxNCArMTc1MCw4IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGR2Yl9pbml0KHZvaWQpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiY3g4OC8yOiBjeDIzODh4IGR2YiBkcml2ZXIgdmVyc2lvbiAlZC4lZC4lZCBsb2FkZWRcbiIsCi0JICAgICAgIChDWDg4X1ZFUlNJT05fQ09ERSA+PiAxNikgJiAweGZmLAotCSAgICAgICAoQ1g4OF9WRVJTSU9OX0NPREUgPj4gIDgpICYgMHhmZiwKLQkgICAgICAgQ1g4OF9WRVJTSU9OX0NPREUgJiAweGZmKTsKLSNpZmRlZiBTTkFQU0hPVAotCXByaW50ayhLRVJOX0lORk8gImN4MjM4OHg6IHNuYXBzaG90IGRhdGUgJTA0ZC0lMDJkLSUwMmRcbiIsCi0JICAgICAgIFNOQVBTSE9ULzEwMDAwLCAoU05BUFNIT1QvMTAwKSUxMDAsIFNOQVBTSE9UJTEwMCk7Ci0jZW5kaWYKKwlwcmludGsoS0VSTl9JTkZPICJjeDg4LzI6IGN4MjM4OHggZHZiIGRyaXZlciB2ZXJzaW9uICVzIGxvYWRlZFxuIiwKKwkgICAgICAgQ1g4OF9WRVJTSU9OKTsKIAlyZXR1cm4gY3g4ODAyX3JlZ2lzdGVyX2RyaXZlcigmY3g4ODAyX2R2Yl9kcml2ZXIpOwogfQogCkBAIC0xNzEwLDEwICsxNzYyLDMgQEAKIAogbW9kdWxlX2luaXQoZHZiX2luaXQpOwogbW9kdWxlX2V4aXQoZHZiX2ZpbmkpOwotCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1iYXNpYy1vZmZzZXQ6IDgKLSAqIGNvbXBpbGUtY29tbWFuZDogIm1ha2UgRFZCPTEiCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jCmluZGV4IDNmNDQyMDAuLmU2MTQyMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaW5wdXQuYwpAQCAtMTAwLDYgKzEwMCw4IEBACiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjEwMDA6CiAJY2FzZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMTgwMEg6CisJY2FzZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMTgwMEhfWEM0MDAwOgorCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjIwMDBIX1BMVVM6CiAJY2FzZSBDWDg4X0JPQVJEX1dJTkZBU1RfVFYyMDAwX1hQX0dMT0JBTDoKIAkJZ3BpbyA9IChncGlvICYgMHg2ZmYpIHwgKChjeF9yZWFkKE1PX0dQMV9JTykgPDwgOCkgJiAweDkwMCk7CiAJCWF1eGdwaW8gPSBncGlvOwpAQCAtMjg5LDYgKzI5MSw4IEBACiAJY2FzZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMjAwMEg6CiAJY2FzZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMjAwMEhfSjoKIAljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYxODAwSDoKKwljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYxODAwSF9YQzQwMDA6CisJY2FzZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMjAwMEhfUExVUzoKIAkJaXJfY29kZXMgPSBSQ19NQVBfV0lORkFTVDsKIAkJaXItPmdwaW9fYWRkciA9IE1PX0dQMF9JTzsKIAkJaXItPm1hc2tfa2V5Y29kZSA9IDB4OGY4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCmluZGV4IDFhN2I5ODMuLmNkNTM4NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMKQEAgLTM5LDYgKzM5LDcgQEAKIE1PRFVMRV9BVVRIT1IoIkNocmlzIFBhc2NvZSA8Yy5wYXNjb2VAaXRlZS51cS5lZHUuYXU+Iik7CiBNT0RVTEVfQVVUSE9SKCJHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihDWDg4X1ZFUlNJT04pOwogCiBzdGF0aWMgdW5zaWduZWQgaW50IGRlYnVnOwogbW9kdWxlX3BhcmFtKGRlYnVnLGludCwwNjQ0KTsKQEAgLTYxMywxMyArNjE0LDE3IEBACiAJICAgIGNvcmUtPmFjdGl2ZV90eXBlX2lkICE9IGRydi0+dHlwZV9pZCkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCWNvcmUtPmlucHV0ID0gMDsKLQlmb3IgKGkgPSAwOwotCSAgICAgaSA8IChzaXplb2YoY29yZS0+Ym9hcmQuaW5wdXQpIC8gc2l6ZW9mKHN0cnVjdCBjeDg4X2lucHV0KSk7Ci0JICAgICBpKyspIHsKLQkJaWYgKGNvcmUtPmJvYXJkLmlucHV0W2ldLnR5cGUgPT0gQ1g4OF9WTVVYX0RWQikgewotCQkJY29yZS0+aW5wdXQgPSBpOwotCQkJYnJlYWs7CisJaWYgKGRydi0+dHlwZV9pZCA9PSBDWDg4X01QRUdfRFZCKSB7CisJCS8qIFdoZW4gc3dpdGNoaW5nIHRvIERWQiwgYWx3YXlzIHNldCB0aGUgaW5wdXQgdG8gdGhlIHR1bmVyICovCisJCWNvcmUtPmxhc3RfYW5hbG9nX2lucHV0ID0gY29yZS0+aW5wdXQ7CisJCWNvcmUtPmlucHV0ID0gMDsKKwkJZm9yIChpID0gMDsKKwkJICAgICBpIDwgKHNpemVvZihjb3JlLT5ib2FyZC5pbnB1dCkgLyBzaXplb2Yoc3RydWN0IGN4ODhfaW5wdXQpKTsKKwkJICAgICBpKyspIHsKKwkJCWlmIChjb3JlLT5ib2FyZC5pbnB1dFtpXS50eXBlID09IENYODhfVk1VWF9EVkIpIHsKKwkJCQljb3JlLT5pbnB1dCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTY0NCw2ICs2NDksMTIgQEAKIAogCWlmIChkcnYtPmFkdmlzZV9yZWxlYXNlICYmIC0tY29yZS0+YWN0aXZlX3JlZiA9PSAwKQogCXsKKwkJaWYgKGRydi0+dHlwZV9pZCA9PSBDWDg4X01QRUdfRFZCKSB7CisJCQkvKiBJZiB0aGUgRFZCIGRyaXZlciBpcyByZWxlYXNpbmcsIHJlc2V0IHRoZSBpbnB1dAorCQkJICAgc3RhdGUgdG8gdGhlIGxhc3QgY29uZmlndXJlZCBhbmFsb2cgaW5wdXQgKi8KKwkJCWNvcmUtPmlucHV0ID0gY29yZS0+bGFzdF9hbmFsb2dfaW5wdXQ7CisJCX0KKwogCQlkcnYtPmFkdmlzZV9yZWxlYXNlKGRydik7CiAJCWNvcmUtPmFjdGl2ZV90eXBlX2lkID0gQ1g4OF9CT0FSRF9OT05FOwogCQltcGVnX2RiZygxLCIlcygpIFBvc3QgcmVsZWFzZSBHUElPPSV4XG4iLCBfX2Z1bmNfXywgY3hfcmVhZChNT19HUDBfSU8pKTsKQEAgLTg5MCwxNCArOTAxLDggQEAKIAogc3RhdGljIGludCBfX2luaXQgY3g4ODAyX2luaXQodm9pZCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICJjeDg4LzI6IGN4MjM4OHggTVBFRy1UUyBEcml2ZXIgTWFuYWdlciB2ZXJzaW9uICVkLiVkLiVkIGxvYWRlZFxuIiwKLQkgICAgICAgKENYODhfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4ZmYsCi0JICAgICAgIChDWDg4X1ZFUlNJT05fQ09ERSA+PiAgOCkgJiAweGZmLAotCSAgICAgICBDWDg4X1ZFUlNJT05fQ09ERSAmIDB4ZmYpOwotI2lmZGVmIFNOQVBTSE9UCi0JcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzg4eDogc25hcHNob3QgZGF0ZSAlMDRkLSUwMmQtJTAyZFxuIiwKLQkgICAgICAgU05BUFNIT1QvMTAwMDAsIChTTkFQU0hPVC8xMDApJTEwMCwgU05BUFNIT1QlMTAwKTsKLSNlbmRpZgorCXByaW50ayhLRVJOX0lORk8gImN4ODgvMjogY3gyMzg4eCBNUEVHLVRTIERyaXZlciBNYW5hZ2VyIHZlcnNpb24gJXMgbG9hZGVkXG4iLAorCSAgICAgICBDWDg4X1ZFUlNJT04pOwogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZjeDg4MDJfcGNpX2RyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jCmluZGV4IGNlZjRmMjguLjYwZDI4ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYwpAQCAtNDUsNiArNDUsNyBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJ2NGwyIGRyaXZlciBtb2R1bGUgZm9yIGN4MjM4OHggYmFzZWQgVFYgY2FyZHMiKTsKIE1PRFVMRV9BVVRIT1IoIkdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4gW1N1U0UgTGFic10iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKENYODhfVkVSU0lPTik7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0yMjAsNyArMjIxLDIzIEBACiAJCS5yZWcgICAgICAgICAgICAgICAgICAgPSBNT19VVl9TQVRVUkFUSU9OLAogCQkubWFzayAgICAgICAgICAgICAgICAgID0gMHgwMGZmLAogCQkuc2hpZnQgICAgICAgICAgICAgICAgID0gMCwKLQl9LHsKKwl9LCB7CisJCS52ID0geworCQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9TSEFSUE5FU1MsCisJCQkubmFtZSAgICAgICAgICA9ICJTaGFycG5lc3MiLAorCQkJLm1pbmltdW0gICAgICAgPSAwLAorCQkJLm1heGltdW0gICAgICAgPSA0LAorCQkJLnN0ZXAgICAgICAgICAgPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAsCisJCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCX0sCisJCS5vZmYgICAgICAgICAgICAgICAgICAgPSAwLAorCQkvKiBOT1RFOiB0aGUgdmFsdWUgaXMgY29udmVydGVkIGFuZCB3cml0dGVuIHRvIGJvdGggZXZlbgorCQkgICBhbmQgb2RkIHJlZ2lzdGVycyBpbiB0aGUgY29kZSAqLworCQkucmVnICAgICAgICAgICAgICAgICAgID0gTU9fRklMVEVSX09ERCwKKwkJLm1hc2sgICAgICAgICAgICAgICAgICA9IDcgPDwgNywKKwkJLnNoaWZ0ICAgICAgICAgICAgICAgICA9IDcsCisJfSwgewogCQkudiA9IHsKIAkJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQ0hST01BX0FHQywKIAkJCS5uYW1lICAgICAgICAgID0gIkNocm9tYSBBR0MiLApAQCAtMjQ1LDYgKzI2MiwyMCBAQAogCQkubWFzayAgICAgICAgICAgICAgICAgID0gMSA8PCA5LAogCQkuc2hpZnQgICAgICAgICAgICAgICAgID0gOSwKIAl9LCB7CisJCS52ID0geworCQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9CQU5EX1NUT1BfRklMVEVSLAorCQkJLm5hbWUgICAgICAgICAgPSAiTm90Y2ggZmlsdGVyIiwKKwkJCS5taW5pbXVtICAgICAgID0gMCwKKwkJCS5tYXhpbXVtICAgICAgID0gMywKKwkJCS5zdGVwICAgICAgICAgID0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwLAorCQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQl9LAorCQkub2ZmICAgICAgICAgICAgICAgICAgID0gMCwKKwkJLnJlZyAgICAgICAgICAgICAgICAgICA9IE1PX0hUT1RBTCwKKwkJLm1hc2sgICAgICAgICAgICAgICAgICA9IDMgPDwgMTEsCisJCS5zaGlmdCAgICAgICAgICAgICAgICAgPSAxMSwKKwl9LCB7CiAJLyogLS0tIGF1ZGlvIC0tLSAqLwogCQkudiA9IHsKIAkJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fTVVURSwKQEAgLTMwMCw4ICszMzEsMTAgQEAKIAlWNEwyX0NJRF9BVURJT19WT0xVTUUsCiAJVjRMMl9DSURfQVVESU9fQkFMQU5DRSwKIAlWNEwyX0NJRF9BVURJT19NVVRFLAorCVY0TDJfQ0lEX1NIQVJQTkVTUywKIAlWNEwyX0NJRF9DSFJPTUFfQUdDLAogCVY0TDJfQ0lEX0NPTE9SX0tJTExFUiwKKwlWNEwyX0NJRF9CQU5EX1NUT1BfRklMVEVSLAogCTAKIH07CiBFWFBPUlRfU1lNQk9MKGN4ODhfdXNlcl9jdHJscyk7CkBAIC05NjIsNiArOTk1LDEwIEBACiAJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CiAJCWN0bC0+dmFsdWUgPSAweDNmIC0gKHZhbHVlICYgMHgzZik7CiAJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfU0hBUlBORVNTOgorCQljdGwtPnZhbHVlID0gKCh2YWx1ZSAmIDB4MDIwMCkgPyAoKCh2YWx1ZSAmIDB4MDE4MCkgPj4gNykgKyAxKQorCQkJCQkJIDogMCk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWN0bC0+dmFsdWUgPSAoKHZhbHVlICsgKGMtPm9mZiA8PCBjLT5zaGlmdCkpICYgYy0+bWFzaykgPj4gYy0+c2hpZnQ7CiAJCWJyZWFrOwpAQCAtMTAzOSw2ICsxMDc2LDEyIEBACiAJCX0KIAkJbWFzaz0weGZmZmY7CiAJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfU0hBUlBORVNTOgorCQkvKiAwYjAwMCwgMGIxMDAsIDBiMTAxLCAwYjExMCwgb3IgMGIxMTEgKi8KKwkJdmFsdWUgPSAoY3RsLT52YWx1ZSA8IDEgPyAwIDogKChjdGwtPnZhbHVlICsgMykgPDwgNykpOworCQkvKiBuZWVkcyB0byBiZSBzZXQgZm9yIGJvdGggZmllbGRzICovCisJCWN4X2FuZG9yKE1PX0ZJTFRFUl9FVkVOLCBtYXNrLCB2YWx1ZSk7CisJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfQ0hST01BX0FHQzoKIAkJLyogRG8gbm90IGFsbG93IGNocm9tYSBBR0MgdG8gYmUgZW5hYmxlZCBmb3IgU0VDQU0gKi8KIAkJdmFsdWUgPSAoKGN0bC0+dmFsdWUgLSBjLT5vZmYpIDw8IGMtPnNoaWZ0KSAmIGMtPm1hc2s7CkBAIC0xMTYxLDcgKzEyMDQsNiBAQAogCXN0cmNweShjYXAtPmRyaXZlciwgImN4ODgwMCIpOwogCXN0cmxjcHkoY2FwLT5jYXJkLCBjb3JlLT5ib2FyZC5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSk7CiAJc3ByaW50ZihjYXAtPmJ1c19pbmZvLCJQQ0k6JXMiLHBjaV9uYW1lKGRldi0+cGNpKSk7Ci0JY2FwLT52ZXJzaW9uID0gQ1g4OF9WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPQogCQlWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKIAkJVjRMMl9DQVBfUkVBRFdSSVRFICAgICB8CkBAIC0xNDgwLDcgKzE1MjIsNiBAQAogCXN0cmNweShjYXAtPmRyaXZlciwgImN4ODgwMCIpOwogCXN0cmxjcHkoY2FwLT5jYXJkLCBjb3JlLT5ib2FyZC5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSk7CiAJc3ByaW50ZihjYXAtPmJ1c19pbmZvLCJQQ0k6JXMiLCBwY2lfbmFtZShkZXYtPnBjaSkpOwotCWNhcC0+dmVyc2lvbiA9IENYODhfVkVSU0lPTl9DT0RFOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVI7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMTM5LDE0ICsyMTgwLDggQEAKIAogc3RhdGljIGludCBfX2luaXQgY3g4ODAwX2luaXQodm9pZCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICJjeDg4LzA6IGN4MjM4OHggdjRsMiBkcml2ZXIgdmVyc2lvbiAlZC4lZC4lZCBsb2FkZWRcbiIsCi0JICAgICAgIChDWDg4X1ZFUlNJT05fQ09ERSA+PiAxNikgJiAweGZmLAotCSAgICAgICAoQ1g4OF9WRVJTSU9OX0NPREUgPj4gIDgpICYgMHhmZiwKLQkgICAgICAgQ1g4OF9WRVJTSU9OX0NPREUgJiAweGZmKTsKLSNpZmRlZiBTTkFQU0hPVAotCXByaW50ayhLRVJOX0lORk8gImN4MjM4OHg6IHNuYXBzaG90IGRhdGUgJTA0ZC0lMDJkLSUwMmRcbiIsCi0JICAgICAgIFNOQVBTSE9ULzEwMDAwLCAoU05BUFNIT1QvMTAwKSUxMDAsIFNOQVBTSE9UJTEwMCk7Ci0jZW5kaWYKKwlwcmludGsoS0VSTl9JTkZPICJjeDg4LzA6IGN4MjM4OHggdjRsMiBkcml2ZXIgdmVyc2lvbiAlcyBsb2FkZWRcbiIsCisJICAgICAgIENYODhfVkVSU0lPTik7CiAJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmN4ODgwMF9wY2lfZHJpdmVyKTsKIH0KIApAQCAtMjE1NywxMSArMjE5MiwzIEBACiAKIG1vZHVsZV9pbml0KGN4ODgwMF9pbml0KTsKIG1vZHVsZV9leGl0KGN4ODgwMF9maW5pKTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWJhc2ljLW9mZnNldDogOAotICogRW5kOgotICoga2F0ZTogZW9sICJ1bml4IjsgaW5kZW50LXdpZHRoIDM7IHJlbW92ZS10cmFpbGluZy1zcGFjZSBvbjsgcmVwbGFjZS10cmFpbGluZy1zcGFjZS1zYXZlIG9uOyB0YWItd2lkdGggODsgcmVwbGFjZS10YWJzIG9mZjsgc3BhY2UtaW5kZW50IG9mZjsgbWl4ZWQtaW5kZW50IG9mZgotICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaAppbmRleCBhMzk5YThiLi5mYThkMzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKQEAgLTM5LDkgKzM5LDkgQEAKICNpbmNsdWRlICJjeDg4LXJlZy5oIgogI2luY2x1ZGUgInR1bmVyLXhjMjAyOC5oIgogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jZGVmaW5lIENYODhfVkVSU0lPTl9DT0RFIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDgpCisKKyNkZWZpbmUgQ1g4OF9WRVJTSU9OICIwLjAuOSIKIAogI2RlZmluZSBVTlNFVCAoLTFVKQogCkBAIC0yNDIsNiArMjQyLDggQEAKICNkZWZpbmUgQ1g4OF9CT0FSRF9TQU1TVU5HX1NNVF83MDIwICAgICAgICA4NAogI2RlZmluZSBDWDg4X0JPQVJEX1RXSU5IQU5fVlAxMDI3X0RWQlMgICAgIDg1CiAjZGVmaW5lIENYODhfQk9BUkRfVEVWSUlfUzQ2NCAgICAgICAgICAgICAgODYKKyNkZWZpbmUgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjIwMDBIX1BMVVMgICA4NworI2RlZmluZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMTgwMEhfWEM0MDAwIDg4CiAKIGVudW0gY3g4OF9pdHlwZSB7CiAJQ1g4OF9WTVVYX0NPTVBPU0lURTEgPSAxLApAQCAtMzc1LDYgKzM3Nyw3IEBACiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9tb2RlX21hbnVhbDsKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb21vZGVfY3VycmVudDsKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDsKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2FuYWxvZ19pbnB1dDsKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICBhc3RhdDsKIAl1MzIJCQkgICB1c2VfbmljYW07CiAJdW5zaWduZWQgbG9uZwkJICAgbGFzdF9jaGFuZ2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS9LY29uZmlnCmluZGV4IDZiMTk1NDAuLjYwYTQ1NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS9LY29uZmlnCkBAIC05MSwzICs5MSwyNiBAQAogCiAJICAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHZwZmUuCisKK2NvbmZpZyBWSURFT19ETTY0NFhfVlBCRQorCXRyaXN0YXRlICJETTY0NFggVlBCRSBIVyBtb2R1bGUiCisJZGVwZW5kcyBvbiBBUkNIX0RBVklOQ0lfRE02NDR4CisJc2VsZWN0IFZJREVPX1ZQU1NfU1lTVEVNCisJc2VsZWN0IFZJREVPQlVGX0RNQV9DT05USUcKKwloZWxwCisJICAgIEVuYWJsZXMgVlBCRSBtb2R1bGVzIHVzZWQgZm9yIGRpc3BsYXkgb24gYSBETTY0NHgKKwkgICAgU29DLgorCisJICAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdnBiZS4KKworCitjb25maWcgVklERU9fVlBCRV9ESVNQTEFZCisJdHJpc3RhdGUgIlZQQkUgVjRMMiBEaXNwbGF5IGRyaXZlciIKKwlkZXBlbmRzIG9uIEFSQ0hfREFWSU5DSV9ETTY0NHgKKwlzZWxlY3QgVklERU9fRE02NDRYX1ZQQkUKKwloZWxwCisJICAgIEVuYWJsZXMgVlBCRSBWNEwyIERpc3BsYXkgZHJpdmVyIG9uIGEgRE02NDR4IGRldmljZQorCisJICAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdnBiZV9kaXNwbGF5LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL01ha2VmaWxlCmluZGV4IGEzNzk1NTcuLmFlN2RhZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvTWFrZWZpbGUKQEAgLTE2LDMgKzE2LDUgQEAKIG9iai0kKENPTkZJR19WSURFT19ETTY0NDZfQ0NEQykgKz0gZG02NDR4X2NjZGMubwogb2JqLSQoQ09ORklHX1ZJREVPX0RNMzU1X0NDREMpICs9IGRtMzU1X2NjZGMubwogb2JqLSQoQ09ORklHX1ZJREVPX0lTSUYpICs9IGlzaWYubworb2JqLSQoQ09ORklHX1ZJREVPX0RNNjQ0WF9WUEJFKSArPSB2cGJlLm8gdnBiZV9vc2QubyB2cGJlX3ZlbmMubworb2JqLSQoQ09ORklHX1ZJREVPX1ZQQkVfRElTUExBWSkgKz0gdnBiZV9kaXNwbGF5Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NzNkMzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZS5jCkBAIC0wLDAgKzEsODY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRleGFzIEluc3RydW1lbnRzIEluYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cGJlX3R5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cGJlLmg+CisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cHNzLmg+CisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cGJlX3ZlbmMuaD4KKworI2RlZmluZSBWUEJFX0RFRkFVTFRfT1VUUFVUCSJDb21wb3NpdGUiCisjZGVmaW5lIFZQQkVfREVGQVVMVF9NT0RFCSJudHNjIgorCitzdGF0aWMgY2hhciAqZGVmX291dHB1dCA9IFZQQkVfREVGQVVMVF9PVVRQVVQ7CitzdGF0aWMgY2hhciAqZGVmX21vZGUgPSBWUEJFX0RFRkFVTFRfTU9ERTsKK3N0YXRpYyBpbnQgZGVidWc7CisKK21vZHVsZV9wYXJhbShkZWZfb3V0cHV0LCBjaGFycCwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW0oZGVmX21vZGUsIGNoYXJwLCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKKworTU9EVUxFX1BBUk1fREVTQyhkZWZfb3V0cHV0LCAidnBiZSBvdXRwdXQgbmFtZSAoZGVmYXVsdDpDb21wb3NpdGUpIik7CitNT0RVTEVfUEFSTV9ERVNDKGRlZl9tb2RlLCAidnBiZSBvdXRwdXQgbW9kZSBuYW1lIChkZWZhdWx0Om50c2MiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbCAwLTEiKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJUSSBETVhYWCBWUEJFIERpc3BsYXkgY29udHJvbGxlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiVGV4YXMgSW5zdHJ1bWVudHMiKTsKKworLyoqCisgKiB2cGJlX2N1cnJlbnRfZW5jb2Rlcl9pbmZvIC0gR2V0IGNvbmZpZyBpbmZvIGZvciBjdXJyZW50IGVuY29kZXIKKyAqIEB2cGJlX2RldiAtIHZwYmUgZGV2aWNlIHB0cgorICoKKyAqIFJldHVybiBwdHIgdG8gY3VycmVudCBlbmNvZGVyIGNvbmZpZyBpbmZvCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZW5jb2Rlcl9jb25maWdfaW5mbyoKK3ZwYmVfY3VycmVudF9lbmNvZGVyX2luZm8oc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldikKK3sKKwlzdHJ1Y3QgdnBiZV9jb25maWcgKmNmZyA9IHZwYmVfZGV2LT5jZmc7CisJaW50IGluZGV4ID0gdnBiZV9kZXYtPmN1cnJlbnRfc2RfaW5kZXg7CisKKwlyZXR1cm4gKChpbmRleCA9PSAwKSA/ICZjZmctPnZlbmMgOgorCQkJCSZjZmctPmV4dF9lbmNvZGVyc1tpbmRleC0xXSk7Cit9CisKKy8qKgorICogdnBiZV9maW5kX2VuY29kZXJfc2RfaW5kZXggLSBHaXZlbiBhIG5hbWUgZmluZCBlbmNvZGVyIHNkIGluZGV4CisgKgorICogQHZwYmVfY29uZmlnIC0gcHRyIHRvIHZwYmUgY2ZnCisgKiBAb3V0cHV0X2luZGV4IC0gaW5kZXggdXNlZCBieSBhcHBsaWNhdGlvbgorICoKKyAqIFJldHVybiBzZCBpbmRleCBvZiB0aGUgZW5jb2RlcgorICovCitzdGF0aWMgaW50IHZwYmVfZmluZF9lbmNvZGVyX3NkX2luZGV4KHN0cnVjdCB2cGJlX2NvbmZpZyAqY2ZnLAorCQkJICAgICBpbnQgaW5kZXgpCit7CisJY2hhciAqZW5jb2Rlcl9uYW1lID0gY2ZnLT5vdXRwdXRzW2luZGV4XS5zdWJkZXZfbmFtZTsKKwlpbnQgaTsKKworCS8qIFZlbmMgaXMgYWx3YXlzIGZpcnN0CSovCisJaWYgKCFzdHJjbXAoZW5jb2Rlcl9uYW1lLCBjZmctPnZlbmMubW9kdWxlX25hbWUpKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBjZmctPm51bV9leHRfZW5jb2RlcnM7IGkrKykgeworCQlpZiAoIXN0cmNtcChlbmNvZGVyX25hbWUsCisJCSAgICAgY2ZnLT5leHRfZW5jb2RlcnNbaV0ubW9kdWxlX25hbWUpKQorCQkJcmV0dXJuIGkrMTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiB2cGJlX2dfY3JvcGNhcCAtIEdldCBjcm9wIGNhcGFiaWxpdGllcyBvZiB0aGUgZGlzcGxheQorICogQHZwYmVfZGV2IC0gdnBiZSBkZXZpY2UgcHRyCisgKiBAY3JvcGNhcCAtIGNyb3BjYXAgaXMgYSBwdHIgdG8gc3RydWN0IHY0bDJfY3JvcGNhcAorICoKKyAqIFVwZGF0ZSB0aGUgY3JvcCBjYXBhYmlsaXRpZXMgaW4gY3JvcCBjYXAgZm9yIGN1cnJlbnQKKyAqIG1vZGUKKyAqLworc3RhdGljIGludCB2cGJlX2dfY3JvcGNhcChzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkJICBzdHJ1Y3QgdjRsMl9jcm9wY2FwICpjcm9wY2FwKQoreworCWlmIChOVUxMID09IGNyb3BjYXApCisJCXJldHVybiAtRUlOVkFMOworCWNyb3BjYXAtPmJvdW5kcy5sZWZ0ID0gMDsKKwljcm9wY2FwLT5ib3VuZHMudG9wID0gMDsKKwljcm9wY2FwLT5ib3VuZHMud2lkdGggPSB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnhyZXM7CisJY3JvcGNhcC0+Ym91bmRzLmhlaWdodCA9IHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MueXJlczsKKwljcm9wY2FwLT5kZWZyZWN0ID0gY3JvcGNhcC0+Ym91bmRzOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdnBiZV9lbnVtX291dHB1dHMgLSBlbnVtZXJhdGUgb3V0cHV0cworICogQHZwYmVfZGV2IC0gdnBiZSBkZXZpY2UgcHRyCisgKiBAb3V0cHV0IC0gcHRyIHRvIHY0bDJfb3V0cHV0IHN0cnVjdHVyZQorICoKKyAqIEVudW1lcmF0ZXMgdGhlIG91dHB1dHMgYXZhaWxhYmxlIGF0IHRoZSB2cGJlIGRpc3BsYXkKKyAqIHJldHVybnMgdGhlIHN0YXR1cywgLUVJTlZBTCBpZiBlbmQgb2Ygb3V0cHV0IGxpc3QKKyAqLworc3RhdGljIGludCB2cGJlX2VudW1fb3V0cHV0cyhzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkJICAgICBzdHJ1Y3QgdjRsMl9vdXRwdXQgKm91dHB1dCkKK3sKKwlzdHJ1Y3QgdnBiZV9jb25maWcgKmNmZyA9IHZwYmVfZGV2LT5jZmc7CisJaW50IHRlbXBfaW5kZXggPSBvdXRwdXQtPmluZGV4OworCisJaWYgKHRlbXBfaW5kZXggPj0gY2ZnLT5udW1fb3V0cHV0cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqb3V0cHV0ID0gY2ZnLT5vdXRwdXRzW3RlbXBfaW5kZXhdLm91dHB1dDsKKwlvdXRwdXQtPmluZGV4ID0gdGVtcF9pbmRleDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwYmVfZ2V0X21vZGVfaW5mbyhzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LCBjaGFyICptb2RlKQoreworCXN0cnVjdCB2cGJlX2NvbmZpZyAqY2ZnID0gdnBiZV9kZXYtPmNmZzsKKwlzdHJ1Y3QgdnBiZV9lbmNfbW9kZV9pbmZvIHZhcjsKKwlpbnQgY3Vycl9vdXRwdXQgPSB2cGJlX2Rldi0+Y3VycmVudF9vdXRfaW5kZXg7CisJaW50IGk7CisKKwlpZiAoTlVMTCA9PSBtb2RlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBjZmctPm91dHB1dHNbY3Vycl9vdXRwdXRdLm51bV9tb2RlczsgaSsrKSB7CisJCXZhciA9IGNmZy0+b3V0cHV0c1tjdXJyX291dHB1dF0ubW9kZXNbaV07CisJCWlmICghc3RyY21wKG1vZGUsIHZhci5uYW1lKSkgeworCQkJdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncyA9IHZhcjsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9nZXRfY3VycmVudF9tb2RlX2luZm8oc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwKKwkJCQkgICAgICBzdHJ1Y3QgdnBiZV9lbmNfbW9kZV9pbmZvICptb2RlX2luZm8pCit7CisJaWYgKE5VTEwgPT0gbW9kZV9pbmZvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSptb2RlX2luZm8gPSB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9nZXRfZHZfcHJlc2V0X2luZm8oc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwKKwkJCQkgICB1bnNpZ25lZCBpbnQgZHZfcHJlc2V0KQoreworCXN0cnVjdCB2cGJlX2NvbmZpZyAqY2ZnID0gdnBiZV9kZXYtPmNmZzsKKwlzdHJ1Y3QgdnBiZV9lbmNfbW9kZV9pbmZvIHZhcjsKKwlpbnQgY3Vycl9vdXRwdXQgPSB2cGJlX2Rldi0+Y3VycmVudF9vdXRfaW5kZXg7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdnBiZV9kZXYtPmNmZy0+b3V0cHV0c1tjdXJyX291dHB1dF0ubnVtX21vZGVzOyBpKyspIHsKKwkJdmFyID0gY2ZnLT5vdXRwdXRzW2N1cnJfb3V0cHV0XS5tb2Rlc1tpXTsKKwkJaWYgKCh2YXIudGltaW5nc190eXBlICYgVlBCRV9FTkNfRFZfUFJFU0VUKSAmJgorCQkgICh2YXIudGltaW5ncy5kdl9wcmVzZXQgPT0gZHZfcHJlc2V0KSkgeworCQkJdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncyA9IHZhcjsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qIEdldCBzdGQgYnkgc3RkIGlkICovCitzdGF0aWMgaW50IHZwYmVfZ2V0X3N0ZF9pbmZvKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsCisJCQkgICAgIHY0bDJfc3RkX2lkIHN0ZF9pZCkKK3sKKwlzdHJ1Y3QgdnBiZV9jb25maWcgKmNmZyA9IHZwYmVfZGV2LT5jZmc7CisJc3RydWN0IHZwYmVfZW5jX21vZGVfaW5mbyB2YXI7CisJaW50IGN1cnJfb3V0cHV0ID0gdnBiZV9kZXYtPmN1cnJlbnRfb3V0X2luZGV4OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHZwYmVfZGV2LT5jZmctPm91dHB1dHNbY3Vycl9vdXRwdXRdLm51bV9tb2RlczsgaSsrKSB7CisJCXZhciA9IGNmZy0+b3V0cHV0c1tjdXJyX291dHB1dF0ubW9kZXNbaV07CisJCWlmICgodmFyLnRpbWluZ3NfdHlwZSAmIFZQQkVfRU5DX1NURCkgJiYKKwkJICAodmFyLnRpbWluZ3Muc3RkX2lkICYgc3RkX2lkKSkgeworCQkJdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncyA9IHZhcjsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9nZXRfc3RkX2luZm9fYnlfbmFtZShzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkJCWNoYXIgKnN0ZF9uYW1lKQoreworCXN0cnVjdCB2cGJlX2NvbmZpZyAqY2ZnID0gdnBiZV9kZXYtPmNmZzsKKwlzdHJ1Y3QgdnBiZV9lbmNfbW9kZV9pbmZvIHZhcjsKKwlpbnQgY3Vycl9vdXRwdXQgPSB2cGJlX2Rldi0+Y3VycmVudF9vdXRfaW5kZXg7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdnBiZV9kZXYtPmNmZy0+b3V0cHV0c1tjdXJyX291dHB1dF0ubnVtX21vZGVzOyBpKyspIHsKKwkJdmFyID0gY2ZnLT5vdXRwdXRzW2N1cnJfb3V0cHV0XS5tb2Rlc1tpXTsKKwkJaWYgKCFzdHJjbXAodmFyLm5hbWUsIHN0ZF9uYW1lKSkgeworCQkJdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncyA9IHZhcjsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICogdnBiZV9zZXRfb3V0cHV0IC0gU2V0IG91dHB1dAorICogQHZwYmVfZGV2IC0gdnBiZSBkZXZpY2UgcHRyCisgKiBAaW5kZXggLSBpbmRleCBvZiBvdXRwdXQKKyAqCisgKiBTZXQgdnBiZSBvdXRwdXQgdG8gdGhlIG91dHB1dCBzcGVjaWZpZWQgYnkgdGhlIGluZGV4CisgKi8KK3N0YXRpYyBpbnQgdnBiZV9zZXRfb3V0cHV0KHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgZW5jb2Rlcl9jb25maWdfaW5mbyAqY3Vycl9lbmNfaW5mbyA9CisJCQl2cGJlX2N1cnJlbnRfZW5jb2Rlcl9pbmZvKHZwYmVfZGV2KTsKKwlzdHJ1Y3QgdnBiZV9jb25maWcgKmNmZyA9IHZwYmVfZGV2LT5jZmc7CisJaW50IGVuY19vdXRfaW5kZXg7CisJaW50IHNkX2luZGV4OworCWludCByZXQgPSAwOworCisJaWYgKGluZGV4ID49IGNmZy0+bnVtX291dHB1dHMpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmdnBiZV9kZXYtPmxvY2spOworCisJc2RfaW5kZXggPSB2cGJlX2Rldi0+Y3VycmVudF9zZF9pbmRleDsKKwllbmNfb3V0X2luZGV4ID0gY2ZnLT5vdXRwdXRzW2luZGV4XS5vdXRwdXQuaW5kZXg7CisJLyoKKwkgKiBDdXJyZW50bHkgd2Ugc3dpdGNoIHRoZSBlbmNvZGVyIGJhc2VkIG9uIG91dHB1dCBzZWxlY3RlZAorCSAqIGJ5IHRoZSBhcHBsaWNhdGlvbi4gSWYgbWVkaWEgY29udHJvbGxlciBpcyBpbXBsZW1lbnRlZCBsYXRlcgorCSAqIHRoZXJlIGlzIHdpbGwgYmUgYW4gQVBJIGFkZGVkIHRvIHNldHVwX2xpbmsgYmV0d2VlbiB2ZW5jCisJICogYW5kIGV4dGVybmFsIGVuY29kZXIuIFNvIGluIHRoYXQgY2FzZSBiZWxvdyBjb21wYXJpc29uIGFsd2F5cworCSAqIG1hdGNoIGFuZCBlbmNvZGVyIHdpbGwgbm90IGJlIHN3aXRjaGVkLiBCdXQgaWYgYXBwbGljYXRpb24KKwkgKiBjaG9zZSBub3QgdG8gdXNlIG1lZGlhIGNvbnRyb2xsZXIsIHRoZW4gdGhpcyBwcm92aWRlcyBjdXJyZW50CisJICogd2F5IG9mIHN3aXRjaGluZyBlbmNvZGVyIGF0IHRoZSB2ZW5jIG91dHB1dC4KKwkgKi8KKwlpZiAoc3RyY21wKGN1cnJfZW5jX2luZm8tPm1vZHVsZV9uYW1lLAorCQkgICBjZmctPm91dHB1dHNbaW5kZXhdLnN1YmRldl9uYW1lKSkgeworCQkvKiBOZWVkIHRvIHN3aXRjaCB0aGUgZW5jb2RlciBhdCB0aGUgb3V0cHV0ICovCisJCXNkX2luZGV4ID0gdnBiZV9maW5kX2VuY29kZXJfc2RfaW5kZXgoY2ZnLCBpbmRleCk7CisJCWlmIChzZF9pbmRleCA8IDApIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisKKwkvKiBTZXQgb3V0cHV0IGF0IHRoZSBlbmNvZGVyICovCisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbCh2cGJlX2Rldi0+ZW5jb2RlcnNbc2RfaW5kZXhdLCB2aWRlbywKKwkJCQkgICAgICAgc19yb3V0aW5nLCAwLCBlbmNfb3V0X2luZGV4LCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qCisJICogSXQgaXMgYXNzdW1lZCB0aGF0IHZlbmMgb3IgZXh0ZW5hbCBlbmNvZGVyIHdpbGwgc2V0IGEgZGVmYXVsdAorCSAqIG1vZGUgaW4gdGhlIHN1YiBkZXZpY2UuIEZvciBleHRlcm5hbCBlbmNvZGVyIG9yIExDRCBwYW5uZWwgb3V0cHV0LAorCSAqIHdlIGFsc28gbmVlZCB0byBzZXQgdXAgdGhlIGxjZCBwb3J0IGZvciB0aGUgcmVxdWlyZWQgbW9kZS4gU28gc2V0dXAKKwkgKiB0aGUgbGNkIHBvcnQgZm9yIHRoZSBkZWZhdWx0IG1vZGUgdGhhdCBpcyBjb25maWd1cmVkIGluIHRoZSBib2FyZAorCSAqIGFyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTM1NS1ldm0uc2V0dXAgZmlsZSBmb3IgdGhlIGV4dGVybmFsCisJICogZW5jb2Rlci4KKwkgKi8KKwlyZXQgPSB2cGJlX2dldF9tb2RlX2luZm8odnBiZV9kZXYsCisJCQkJIGNmZy0+b3V0cHV0c1tpbmRleF0uZGVmYXVsdF9tb2RlKTsKKwlpZiAoIXJldCkgeworCQlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2RfZGV2aWNlID0gdnBiZV9kZXYtPm9zZF9kZXZpY2U7CisKKwkJb3NkX2RldmljZS0+b3BzLnNldF9sZWZ0X21hcmdpbihvc2RfZGV2aWNlLAorCQkJdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy5sZWZ0X21hcmdpbik7CisJCW9zZF9kZXZpY2UtPm9wcy5zZXRfdG9wX21hcmdpbihvc2RfZGV2aWNlLAorCQl2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnVwcGVyX21hcmdpbik7CisJCXZwYmVfZGV2LT5jdXJyZW50X3NkX2luZGV4ID0gc2RfaW5kZXg7CisJCXZwYmVfZGV2LT5jdXJyZW50X291dF9pbmRleCA9IGluZGV4OworCX0KK291dDoKKwltdXRleF91bmxvY2soJnZwYmVfZGV2LT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZwYmVfc2V0X2RlZmF1bHRfb3V0cHV0KHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYpCit7CisJc3RydWN0IHZwYmVfY29uZmlnICpjZmcgPSB2cGJlX2Rldi0+Y2ZnOworCWludCByZXQgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNmZy0+bnVtX291dHB1dHM7IGkrKykgeworCQlpZiAoIXN0cmNtcChkZWZfb3V0cHV0LAorCQkJICAgIGNmZy0+b3V0cHV0c1tpXS5vdXRwdXQubmFtZSkpIHsKKwkJCXJldCA9IHZwYmVfc2V0X291dHB1dCh2cGJlX2RldiwgaSk7CisJCQlpZiAoIXJldCkKKwkJCQl2cGJlX2Rldi0+Y3VycmVudF9vdXRfaW5kZXggPSBpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHZwYmVfZ2V0X291dHB1dCAtIEdldCBvdXRwdXQKKyAqIEB2cGJlX2RldiAtIHZwYmUgZGV2aWNlIHB0cgorICoKKyAqIHJldHVybiBjdXJyZW50IHZwYmUgb3V0cHV0IHRvIHRoZSB0aGUgaW5kZXgKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCB2cGJlX2dldF9vdXRwdXQoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldikKK3sKKwlyZXR1cm4gdnBiZV9kZXYtPmN1cnJlbnRfb3V0X2luZGV4OworfQorCisvKioKKyAqIHZwYmVfc19kdl9wcmVzZXQgLSBTZXQgdGhlIGdpdmVuIHByZXNldCB0aW1pbmdzIGluIHRoZSBlbmNvZGVyCisgKgorICogU2V0cyB0aGUgcHJlc2V0IGlmIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBlbmNvZGVyLiBSZXR1cm4gdGhlIHN0YXR1cy4KKyAqIDAgLSBzdWNjZXNzICYgLUVJTlZBTCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IHZwYmVfc19kdl9wcmVzZXQoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwKKwkJICAgICBzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQgKmR2X3ByZXNldCkKK3sKKwlzdHJ1Y3QgdnBiZV9jb25maWcgKmNmZyA9IHZwYmVfZGV2LT5jZmc7CisJaW50IG91dF9pbmRleCA9IHZwYmVfZGV2LT5jdXJyZW50X291dF9pbmRleDsKKwlpbnQgc2RfaW5kZXggPSB2cGJlX2Rldi0+Y3VycmVudF9zZF9pbmRleDsKKwlpbnQgcmV0OworCisKKwlpZiAoIShjZmctPm91dHB1dHNbb3V0X2luZGV4XS5vdXRwdXQuY2FwYWJpbGl0aWVzICYKKwkgICAgVjRMMl9PVVRfQ0FQX1BSRVNFVFMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHZwYmVfZ2V0X2R2X3ByZXNldF9pbmZvKHZwYmVfZGV2LCBkdl9wcmVzZXQtPnByZXNldCk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmdnBiZV9kZXYtPmxvY2spOworCisKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHZwYmVfZGV2LT5lbmNvZGVyc1tzZF9pbmRleF0sIHZpZGVvLAorCQkJCQlzX2R2X3ByZXNldCwgZHZfcHJlc2V0KTsKKwkvKiBzZXQgdGhlIGxjZCBjb250cm9sbGVyIG91dHB1dCBmb3IgdGhlIGdpdmVuIG1vZGUgKi8KKwlpZiAoIXJldCkgeworCQlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2RfZGV2aWNlID0gdnBiZV9kZXYtPm9zZF9kZXZpY2U7CisKKwkJb3NkX2RldmljZS0+b3BzLnNldF9sZWZ0X21hcmdpbihvc2RfZGV2aWNlLAorCQl2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLmxlZnRfbWFyZ2luKTsKKwkJb3NkX2RldmljZS0+b3BzLnNldF90b3BfbWFyZ2luKG9zZF9kZXZpY2UsCisJCXZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MudXBwZXJfbWFyZ2luKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ2cGJlX2Rldi0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHZwYmVfZ19kdl9wcmVzZXQgLSBHZXQgdGhlIHByZXNldCBpbiB0aGUgY3VycmVudCBlbmNvZGVyCisgKgorICogR2V0IHRoZSBwcmVzZXQgaW4gdGhlIGN1cnJlbnQgZW5jb2Rlci4gUmV0dXJuIHRoZSBzdGF0dXMuIDAgLSBzdWNjZXNzCisgKiAtRUlOVkFMIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9nX2R2X3ByZXNldChzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkgICAgIHN0cnVjdCB2NGwyX2R2X3ByZXNldCAqZHZfcHJlc2V0KQoreworCWlmICh2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnRpbWluZ3NfdHlwZSAmCisJICBWUEJFX0VOQ19EVl9QUkVTRVQpIHsKKwkJZHZfcHJlc2V0LT5wcmVzZXQgPSB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnRpbWluZ3MuZHZfcHJlc2V0OworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiB2cGJlX2VudW1fZHZfcHJlc2V0cyAtIEVudW1lcmF0ZSB0aGUgZHYgcHJlc2V0cyBpbiB0aGUgY3VycmVudCBlbmNvZGVyCisgKgorICogR2V0IHRoZSBwcmVzZXQgaW4gdGhlIGN1cnJlbnQgZW5jb2Rlci4gUmV0dXJuIHRoZSBzdGF0dXMuIDAgLSBzdWNjZXNzCisgKiAtRUlOVkFMIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9lbnVtX2R2X3ByZXNldHMoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwKKwkJCSBzdHJ1Y3QgdjRsMl9kdl9lbnVtX3ByZXNldCAqcHJlc2V0X2luZm8pCit7CisJc3RydWN0IHZwYmVfY29uZmlnICpjZmcgPSB2cGJlX2Rldi0+Y2ZnOworCWludCBvdXRfaW5kZXggPSB2cGJlX2Rldi0+Y3VycmVudF9vdXRfaW5kZXg7CisJc3RydWN0IHZwYmVfb3V0cHV0ICpvdXRwdXQgPSAmY2ZnLT5vdXRwdXRzW291dF9pbmRleF07CisJaW50IGogPSAwOworCWludCBpOworCisJaWYgKCEob3V0cHV0LT5vdXRwdXQuY2FwYWJpbGl0aWVzICYgVjRMMl9PVVRfQ0FQX1BSRVNFVFMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBvdXRwdXQtPm51bV9tb2RlczsgaSsrKSB7CisJCWlmIChvdXRwdXQtPm1vZGVzW2ldLnRpbWluZ3NfdHlwZSA9PSBWUEJFX0VOQ19EVl9QUkVTRVQpIHsKKwkJCWlmIChqID09IHByZXNldF9pbmZvLT5pbmRleCkKKwkJCQlicmVhazsKKwkJCWorKzsKKwkJfQorCX0KKworCWlmIChpID09IG91dHB1dC0+bnVtX21vZGVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiB2NGxfZmlsbF9kdl9wcmVzZXRfaW5mbyhvdXRwdXQtPm1vZGVzW2ldLnRpbWluZ3MuZHZfcHJlc2V0LAorCQkJCQlwcmVzZXRfaW5mbyk7Cit9CisKKy8qKgorICogdnBiZV9zX3N0ZCAtIFNldCB0aGUgZ2l2ZW4gc3RhbmRhcmQgaW4gdGhlIGVuY29kZXIKKyAqCisgKiBTZXRzIHRoZSBzdGFuZGFyZCBpZiBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgZW5jb2Rlci4gUmV0dXJuIHRoZSBzdGF0dXMuCisgKiAwIC0gc3VjY2VzcyAmIC1FSU5WQUwgb24gZXJyb3IKKyAqLworc3RhdGljIGludCB2cGJlX3Nfc3RkKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsIHY0bDJfc3RkX2lkICpzdGRfaWQpCit7CisJc3RydWN0IHZwYmVfY29uZmlnICpjZmcgPSB2cGJlX2Rldi0+Y2ZnOworCWludCBvdXRfaW5kZXggPSB2cGJlX2Rldi0+Y3VycmVudF9vdXRfaW5kZXg7CisJaW50IHNkX2luZGV4ID0gdnBiZV9kZXYtPmN1cnJlbnRfc2RfaW5kZXg7CisJaW50IHJldDsKKworCWlmICghKGNmZy0+b3V0cHV0c1tvdXRfaW5kZXhdLm91dHB1dC5jYXBhYmlsaXRpZXMgJgorCQlWNEwyX09VVF9DQVBfU1REKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSB2cGJlX2dldF9zdGRfaW5mbyh2cGJlX2RldiwgKnN0ZF9pZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJnZwYmVfZGV2LT5sb2NrKTsKKworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwodnBiZV9kZXYtPmVuY29kZXJzW3NkX2luZGV4XSwgdmlkZW8sCisJCQkgICAgICAgc19zdGRfb3V0cHV0LCAqc3RkX2lkKTsKKwkvKiBzZXQgdGhlIGxjZCBjb250cm9sbGVyIG91dHB1dCBmb3IgdGhlIGdpdmVuIG1vZGUgKi8KKwlpZiAoIXJldCkgeworCQlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2RfZGV2aWNlID0gdnBiZV9kZXYtPm9zZF9kZXZpY2U7CisKKwkJb3NkX2RldmljZS0+b3BzLnNldF9sZWZ0X21hcmdpbihvc2RfZGV2aWNlLAorCQl2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLmxlZnRfbWFyZ2luKTsKKwkJb3NkX2RldmljZS0+b3BzLnNldF90b3BfbWFyZ2luKG9zZF9kZXZpY2UsCisJCXZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MudXBwZXJfbWFyZ2luKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ2cGJlX2Rldi0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHZwYmVfZ19zdGQgLSBHZXQgdGhlIHN0YW5kYXJkIGluIHRoZSBjdXJyZW50IGVuY29kZXIKKyAqCisgKiBHZXQgdGhlIHN0YW5kYXJkIGluIHRoZSBjdXJyZW50IGVuY29kZXIuIFJldHVybiB0aGUgc3RhdHVzLiAwIC0gc3VjY2VzcworICogLUVJTlZBTCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IHZwYmVfZ19zdGQoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwgdjRsMl9zdGRfaWQgKnN0ZF9pZCkKK3sKKwlzdHJ1Y3QgdnBiZV9lbmNfbW9kZV9pbmZvIGN1cl90aW1pbmdzID0gdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5nczsKKworCWlmIChjdXJfdGltaW5ncy50aW1pbmdzX3R5cGUgJiBWUEJFX0VOQ19TVEQpIHsKKwkJKnN0ZF9pZCA9IGN1cl90aW1pbmdzLnRpbWluZ3Muc3RkX2lkOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiB2cGJlX3NldF9tb2RlIC0gU2V0IG1vZGUgaW4gdGhlIGN1cnJlbnQgZW5jb2RlciB1c2luZyBtb2RlIGluZm8KKyAqCisgKiBVc2UgdGhlIG1vZGUgc3RyaW5nIHRvIGRlY2lkZSB3aGF0IHRpbWluZ3MgdG8gc2V0IGluIHRoZSBlbmNvZGVyCisgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VmdWwgd2hlbiBmYnNldCBjb21tYW5kIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBjdXJyZW50CisgKiB0aW1pbmdzIGJ5IHNwZWNpZnlpbmcgYSBzdHJpbmcgdG8gaW5kaWNhdGUgdGhlIHRpbWluZ3MuCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9zZXRfbW9kZShzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkJIHN0cnVjdCB2cGJlX2VuY19tb2RlX2luZm8gKm1vZGVfaW5mbykKK3sKKwlzdHJ1Y3QgdnBiZV9lbmNfbW9kZV9pbmZvICpwcmVzZXRfbW9kZSA9IE5VTEw7CisJc3RydWN0IHZwYmVfY29uZmlnICpjZmcgPSB2cGJlX2Rldi0+Y2ZnOworCXN0cnVjdCB2NGwyX2R2X3ByZXNldCBkdl9wcmVzZXQ7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkX2RldmljZTsKKwlpbnQgb3V0X2luZGV4ID0gdnBiZV9kZXYtPmN1cnJlbnRfb3V0X2luZGV4OworCWludCByZXQgPSAwOworCWludCBpOworCisJaWYgKChOVUxMID09IG1vZGVfaW5mbykgfHwgKE5VTEwgPT0gbW9kZV9pbmZvLT5uYW1lKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5vdXRwdXRzW291dF9pbmRleF0ubnVtX21vZGVzOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAobW9kZV9pbmZvLT5uYW1lLAorCQkgICAgIGNmZy0+b3V0cHV0c1tvdXRfaW5kZXhdLm1vZGVzW2ldLm5hbWUpKSB7CisJCQlwcmVzZXRfbW9kZSA9ICZjZmctPm91dHB1dHNbb3V0X2luZGV4XS5tb2Rlc1tpXTsKKwkJCS8qCisJCQkgKiBpdCBtYXkgYmUgb25lIG9mIHRoZSAzIHRpbWluZ3MgdHlwZS4gQ2hlY2sgYW5kCisJCQkgKiBpbnZva2UgcmlnaHQgQVBJCisJCQkgKi8KKwkJCWlmIChwcmVzZXRfbW9kZS0+dGltaW5nc190eXBlICYgVlBCRV9FTkNfU1REKQorCQkJCXJldHVybiB2cGJlX3Nfc3RkKHZwYmVfZGV2LAorCQkJCQkJICZwcmVzZXRfbW9kZS0+dGltaW5ncy5zdGRfaWQpOworCQkJaWYgKHByZXNldF9tb2RlLT50aW1pbmdzX3R5cGUgJiBWUEJFX0VOQ19EVl9QUkVTRVQpIHsKKwkJCQlkdl9wcmVzZXQucHJlc2V0ID0KKwkJCQkJcHJlc2V0X21vZGUtPnRpbWluZ3MuZHZfcHJlc2V0OworCQkJCXJldHVybiB2cGJlX3NfZHZfcHJlc2V0KHZwYmVfZGV2LCAmZHZfcHJlc2V0KTsKKwkJCX0KKwkJfQorCX0KKworCS8qIE9ubHkgY3VzdG9tIHRpbWluZyBzaG91bGQgcmVhY2ggaGVyZSAqLworCWlmIChwcmVzZXRfbW9kZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJnZwYmVfZGV2LT5sb2NrKTsKKworCW9zZF9kZXZpY2UgPSB2cGJlX2Rldi0+b3NkX2RldmljZTsKKwl2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzID0gKnByZXNldF9tb2RlOworCW9zZF9kZXZpY2UtPm9wcy5zZXRfbGVmdF9tYXJnaW4ob3NkX2RldmljZSwKKwkJdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy5sZWZ0X21hcmdpbik7CisJb3NkX2RldmljZS0+b3BzLnNldF90b3BfbWFyZ2luKG9zZF9kZXZpY2UsCisJCXZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MudXBwZXJfbWFyZ2luKTsKKworCW11dGV4X3VubG9jaygmdnBiZV9kZXYtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2cGJlX3NldF9kZWZhdWx0X21vZGUoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gdnBiZV9nZXRfc3RkX2luZm9fYnlfbmFtZSh2cGJlX2RldiwgZGVmX21vZGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBzZXQgdGhlIGRlZmF1bHQgbW9kZSBpbiB0aGUgZW5jb2RlciAqLworCXJldHVybiB2cGJlX3NldF9tb2RlKHZwYmVfZGV2LCAmdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncyk7Cit9CisKK3N0YXRpYyBpbnQgcGxhdGZvcm1fZGV2aWNlX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBkYXRhOworCisJaWYgKHN0cmNtcCgidnBiZS1vc2QiLCBwZGV2LT5uYW1lKSA9PSAwKQorCQl2cGJlX2Rldi0+b3NkX2RldmljZSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdnBiZV9pbml0aWFsaXplKCkgLSBJbml0aWFsaXplIHRoZSB2cGJlIGRpc3BsYXkgY29udHJvbGxlcgorICogQHZwYmVfZGV2IC0gdnBiZSBkZXZpY2UgcHRyCisgKgorICogTWFzdGVyIGZyYW1lIGJ1ZmZlciBkZXZpY2UgZHJpdmVycyBjYWxscyB0aGlzIHRvIGluaXRpYWxpemUgdnBiZQorICogZGlzcGxheSBjb250cm9sbGVyLiBUaGlzIHdpbGwgdGhlbiByZWdpc3RlcnMgdjRsMiBkZXZpY2UgYW5kIHRoZSBzdWIKKyAqIGRldmljZXMgYW5kIHNldHMgYSBjdXJyZW50IGVuY29kZXIgc3ViIGRldmljZSBmb3IgZGlzcGxheS4gdjRsMiBkaXNwbGF5CisgKiBkZXZpY2UgZHJpdmVyIGlzIHRoZSBtYXN0ZXIgYW5kIGZyYW1lIGJ1ZmZlciBkaXNwbGF5IGRldmljZSBkcml2ZXIgaXMKKyAqIHRoZSBzbGF2ZS4gRnJhbWUgYnVmZmVyIGRpc3BsYXkgZHJpdmVyIGNoZWNrcyB0aGUgaW5pdGlhbGl6ZWQgZHVyaW5nCisgKiBwcm9iZSBhbmQgZXhpdCBpZiBub3QgaW5pdGlhbGl6ZWQuIFJldHVybnMgc3RhdHVzLgorICovCitzdGF0aWMgaW50IHZwYmVfaW5pdGlhbGl6ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYpCit7CisJc3RydWN0IGVuY29kZXJfY29uZmlnX2luZm8gKmVuY19pbmZvOworCXN0cnVjdCB2NGwyX3N1YmRldiAqKmVuY19zdWJkZXY7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkX2RldmljZTsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwOworCWludCBvdXRwdXRfaW5kZXg7CisJaW50IG51bV9lbmNvZGVyczsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgZXJyOworCWludCBpOworCisJLyoKKwkgKiB2NGwyIGFiZCBGQkRldiBmcmFtZSBidWZmZXIgZGV2aWNlcyB3aWxsIGdldCB0aGUgdnBiZV9kZXYgcG9pbnRlcgorCSAqIGZyb20gdGhlIHBsYXRmb3JtIGRldmljZSBieSBpdGVyYXRpb24gb2YgcGxhdGZvcm0gZHJpdmVycyBhbmQKKwkgKiBtYXRjaGluZyB3aXRoIGRldmljZSBuYW1lCisJICovCisJaWYgKE5VTEwgPT0gdnBiZV9kZXYgfHwgTlVMTCA9PSBkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJOdWxsIGRldmljZSBwb2ludGVycy5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAodnBiZV9kZXYtPmluaXRpYWxpemVkKQorCQlyZXR1cm4gMDsKKworCW11dGV4X2xvY2soJnZwYmVfZGV2LT5sb2NrKTsKKworCWlmIChzdHJjbXAodnBiZV9kZXYtPmNmZy0+bW9kdWxlX25hbWUsICJkbTY0NHgtdnBiZS1kaXNwbGF5IikgIT0gMCkgeworCQkvKiBXZSBoYXZlIGRhYyBjbG9jayBhdmFpbGFibGUgZm9yIHBsYXRmb3JtICovCisJCXZwYmVfZGV2LT5kYWNfY2xrID0gY2xrX2dldCh2cGJlX2Rldi0+cGRldiwgInZwc3NfZGFjIik7CisJCWlmIChJU19FUlIodnBiZV9kZXYtPmRhY19jbGspKSB7CisJCQlyZXQgPSAgUFRSX0VSUih2cGJlX2Rldi0+ZGFjX2Nsayk7CisJCQlnb3RvIHZwYmVfdW5sb2NrOworCQl9CisJCWlmIChjbGtfZW5hYmxlKHZwYmVfZGV2LT5kYWNfY2xrKSkgeworCQkJcmV0ID0gIC1FTk9ERVY7CisJCQlnb3RvIHZwYmVfdW5sb2NrOworCQl9CisJfQorCisJLyogZmlyc3QgZW5hYmxlIHZwc3MgY2xvY2tzICovCisJdnBzc19lbmFibGVfY2xvY2soVlBTU19WUEJFX0NMT0NLLCAxKTsKKworCS8qIEZpcnN0IHJlZ2lzdGVyIGEgdjRsMiBkZXZpY2UgKi8KKwlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3RlcihkZXYsICZ2cGJlX2Rldi0+djRsMl9kZXYpOworCWlmIChyZXQpIHsKKwkJdjRsMl9lcnIoZGV2LT5kcml2ZXIsCisJCQkiVW5hYmxlIHRvIHJlZ2lzdGVyIHY0bDIgZGV2aWNlLlxuIik7CisJCWdvdG8gdnBiZV9mYWlsX2Nsb2NrOworCX0KKwl2NGwyX2luZm8oJnZwYmVfZGV2LT52NGwyX2RldiwgInZwYmUgdjRsMiBkZXZpY2UgcmVnaXN0ZXJlZFxuIik7CisKKwllcnIgPSBidXNfZm9yX2VhY2hfZGV2KCZwbGF0Zm9ybV9idXNfdHlwZSwgTlVMTCwgdnBiZV9kZXYsCisJCQkgICAgICAgcGxhdGZvcm1fZGV2aWNlX2dldCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwl2cGJlX2Rldi0+dmVuYyA9IHZlbmNfc3ViX2Rldl9pbml0KCZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkJCSAgIHZwYmVfZGV2LT5jZmctPnZlbmMubW9kdWxlX25hbWUpOworCS8qIHJlZ2lzdGVyIHZlbmMgc3ViIGRldmljZSAqLworCWlmICh2cGJlX2Rldi0+dmVuYyA9PSBOVUxMKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkidnBiZSB1bmFibGUgdG8gaW5pdCB2ZW5jIHN1YiBkZXZpY2VcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIHZwYmVfZmFpbF92NGwyX2RldmljZTsKKwl9CisJLyogaW5pdGlhbGl6ZSBvc2QgZGV2aWNlICovCisJb3NkX2RldmljZSA9IHZwYmVfZGV2LT5vc2RfZGV2aWNlOworCisJaWYgKE5VTEwgIT0gb3NkX2RldmljZS0+b3BzLmluaXRpYWxpemUpIHsKKwkJZXJyID0gb3NkX2RldmljZS0+b3BzLmluaXRpYWxpemUob3NkX2RldmljZSk7CisJCWlmIChlcnIpIHsKKwkJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkJICJ1bmFibGUgdG8gaW5pdGlhbGl6ZSB0aGUgT1NEIGRldmljZSIpOworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gdnBiZV9mYWlsX3Y0bDJfZGV2aWNlOworCQl9CisJfQorCisJLyoKKwkgKiBSZWdpc3RlciBhbnkgZXh0ZXJuYWwgZW5jb2RlcnMgdGhhdCBhcmUgY29uZmlndXJlZC4gQXQgaW5kZXggMCB3ZQorCSAqIHN0b3JlIHZlbmMgc2QgaW5kZXguCisJICovCisJbnVtX2VuY29kZXJzID0gdnBiZV9kZXYtPmNmZy0+bnVtX2V4dF9lbmNvZGVycyArIDE7CisJdnBiZV9kZXYtPmVuY29kZXJzID0ga21hbGxvYygKKwkJCQlzaXplb2Yoc3RydWN0IHY0bDJfc3ViZGV2ICopKm51bV9lbmNvZGVycywKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoTlVMTCA9PSB2cGJlX2Rldi0+ZW5jb2RlcnMpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBlbmNvZGVycyBzdWIgZGV2aWNlcyIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHZwYmVfZmFpbF92NGwyX2RldmljZTsKKwl9CisKKwlpMmNfYWRhcCA9IGkyY19nZXRfYWRhcHRlcih2cGJlX2Rldi0+Y2ZnLT5pMmNfYWRhcHRlcl9pZCk7CisJZm9yIChpID0gMDsgaSA8ICh2cGJlX2Rldi0+Y2ZnLT5udW1fZXh0X2VuY29kZXJzICsgMSk7IGkrKykgeworCQlpZiAoaSA9PSAwKSB7CisJCQkvKiB2ZW5jIGlzIGF0IGluZGV4IDAgKi8KKwkJCWVuY19zdWJkZXYgPSAmdnBiZV9kZXYtPmVuY29kZXJzW2ldOworCQkJKmVuY19zdWJkZXYgPSB2cGJlX2Rldi0+dmVuYzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVuY19pbmZvID0gJnZwYmVfZGV2LT5jZmctPmV4dF9lbmNvZGVyc1tpXTsKKwkJaWYgKGVuY19pbmZvLT5pc19pMmMpIHsKKwkJCWVuY19zdWJkZXYgPSAmdnBiZV9kZXYtPmVuY29kZXJzW2ldOworCQkJKmVuY19zdWJkZXYgPSB2NGwyX2kyY19uZXdfc3ViZGV2X2JvYXJkKAorCQkJCQkJJnZwYmVfZGV2LT52NGwyX2RldiwgaTJjX2FkYXAsCisJCQkJCQkmZW5jX2luZm8tPmJvYXJkX2luZm8sIE5VTEwpOworCQkJaWYgKCplbmNfc3ViZGV2KQorCQkJCXY0bDJfaW5mbygmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJCQkgICJ2NGwyIHN1YiBkZXZpY2UgJXMgcmVnaXN0ZXJlZFxuIiwKKwkJCQkJICBlbmNfaW5mby0+bW9kdWxlX25hbWUpOworCQkJZWxzZSB7CisJCQkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgImVuY29kZXIgJXMiCisJCQkJCSAiIGZhaWxlZCB0byByZWdpc3RlciIsCisJCQkJCSBlbmNfaW5mby0+bW9kdWxlX25hbWUpOworCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJZ290byB2cGJlX2ZhaWxfc2RfcmVnaXN0ZXI7CisJCQl9CisJCX0gZWxzZQorCQkJdjRsMl93YXJuKCZ2cGJlX2Rldi0+djRsMl9kZXYsICJub24taTJjIGVuY29kZXJzIgorCQkJCSAiIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIik7CisJfQorCisJLyogc2V0IHRoZSBjdXJyZW50IGVuY29kZXIgYW5kIG91dHB1dCB0byB0aGF0IG9mIHZlbmMgYnkgZGVmYXVsdCAqLworCXZwYmVfZGV2LT5jdXJyZW50X3NkX2luZGV4ID0gMDsKKwl2cGJlX2Rldi0+Y3VycmVudF9vdXRfaW5kZXggPSAwOworCW91dHB1dF9pbmRleCA9IDA7CisKKwltdXRleF91bmxvY2soJnZwYmVfZGV2LT5sb2NrKTsKKworCXByaW50ayhLRVJOX05PVElDRSAiU2V0dGluZyBkZWZhdWx0IG91dHB1dCB0byAlc1xuIiwgZGVmX291dHB1dCk7CisJcmV0ID0gdnBiZV9zZXRfZGVmYXVsdF9vdXRwdXQodnBiZV9kZXYpOworCWlmIChyZXQpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIkZhaWxlZCB0byBzZXQgZGVmYXVsdCBvdXRwdXQgJXMiLAorCQkJIGRlZl9vdXRwdXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXByaW50ayhLRVJOX05PVElDRSAiU2V0dGluZyBkZWZhdWx0IG1vZGUgdG8gJXNcbiIsIGRlZl9tb2RlKTsKKwlyZXQgPSB2cGJlX3NldF9kZWZhdWx0X21vZGUodnBiZV9kZXYpOworCWlmIChyZXQpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIkZhaWxlZCB0byBzZXQgZGVmYXVsdCBtb2RlICVzIiwKKwkJCSBkZWZfbW9kZSk7CisJCXJldHVybiByZXQ7CisJfQorCXZwYmVfZGV2LT5pbml0aWFsaXplZCA9IDE7CisJLyogVEJEIGhhbmRsaW5nIG9mIGJvb3RhcmdzIGZvciBkZWZhdWx0IG91dHB1dCBhbmQgbW9kZSAqLworCXJldHVybiAwOworCit2cGJlX2ZhaWxfc2RfcmVnaXN0ZXI6CisJa2ZyZWUodnBiZV9kZXYtPmVuY29kZXJzKTsKK3ZwYmVfZmFpbF92NGwyX2RldmljZToKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZ2cGJlX2Rldi0+djRsMl9kZXYpOwordnBiZV9mYWlsX2Nsb2NrOgorCWlmIChzdHJjbXAodnBiZV9kZXYtPmNmZy0+bW9kdWxlX25hbWUsICJkbTY0NHgtdnBiZS1kaXNwbGF5IikgIT0gMCkKKwkJY2xrX3B1dCh2cGJlX2Rldi0+ZGFjX2Nsayk7Cit2cGJlX3VubG9jazoKKwltdXRleF91bmxvY2soJnZwYmVfZGV2LT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHZwYmVfZGVpbml0aWFsaXplKCkgLSBkZS1pbml0aWFsaXplIHRoZSB2cGJlIGRpc3BsYXkgY29udHJvbGxlcgorICogQGRldiAtIE1hc3RlciBhbmQgc2xhdmUgZGV2aWNlIHB0cgorICoKKyAqIHZwYmVfbWFzdGVyIGFuZCBzbGF2ZSBmcmFtZSBidWZmZXIgZGV2aWNlcyBjYWxscyB0aGlzIHRvIGRlLWluaXRpYWxpemUKKyAqIHRoZSBkaXNwbGF5IGNvbnRyb2xsZXIuIEl0IGlzIGNhbGxlZCB3aGVuIG1hc3RlciBhbmQgc2xhdmUgZGV2aWNlCisgKiBkcml2ZXIgbW9kdWxlcyBhcmUgcmVtb3ZlZCBhbmQgbm8gbG9uZ2VyIHJlcXVpcmVzIHRoZSBkaXNwbGF5IGNvbnRyb2xsZXIuCisgKi8KK3N0YXRpYyB2b2lkIHZwYmVfZGVpbml0aWFsaXplKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldikKK3sKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZ2cGJlX2Rldi0+djRsMl9kZXYpOworCWlmIChzdHJjbXAodnBiZV9kZXYtPmNmZy0+bW9kdWxlX25hbWUsICJkbTY0NHgtdnBiZS1kaXNwbGF5IikgIT0gMCkKKwkJY2xrX3B1dCh2cGJlX2Rldi0+ZGFjX2Nsayk7CisKKwlrZnJlZSh2cGJlX2Rldi0+ZW5jb2RlcnMpOworCXZwYmVfZGV2LT5pbml0aWFsaXplZCA9IDA7CisJLyogZGlzYWJsZSB2cHNzIGNsb2NrcyAqLworCXZwc3NfZW5hYmxlX2Nsb2NrKFZQU1NfVlBCRV9DTE9DSywgMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdnBiZV9kZXZpY2Vfb3BzIHZwYmVfZGV2X29wcyA9IHsKKwkuZ19jcm9wY2FwID0gdnBiZV9nX2Nyb3BjYXAsCisJLmVudW1fb3V0cHV0cyA9IHZwYmVfZW51bV9vdXRwdXRzLAorCS5zZXRfb3V0cHV0ID0gdnBiZV9zZXRfb3V0cHV0LAorCS5nZXRfb3V0cHV0ID0gdnBiZV9nZXRfb3V0cHV0LAorCS5zX2R2X3ByZXNldCA9IHZwYmVfc19kdl9wcmVzZXQsCisJLmdfZHZfcHJlc2V0ID0gdnBiZV9nX2R2X3ByZXNldCwKKwkuZW51bV9kdl9wcmVzZXRzID0gdnBiZV9lbnVtX2R2X3ByZXNldHMsCisJLnNfc3RkID0gdnBiZV9zX3N0ZCwKKwkuZ19zdGQgPSB2cGJlX2dfc3RkLAorCS5pbml0aWFsaXplID0gdnBiZV9pbml0aWFsaXplLAorCS5kZWluaXRpYWxpemUgPSB2cGJlX2RlaW5pdGlhbGl6ZSwKKwkuZ2V0X21vZGVfaW5mbyA9IHZwYmVfZ2V0X2N1cnJlbnRfbW9kZV9pbmZvLAorCS5zZXRfbW9kZSA9IHZwYmVfc2V0X21vZGUsCit9OworCitzdGF0aWMgX19kZXZpbml0IGludCB2cGJlX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldjsKKwlzdHJ1Y3QgdnBiZV9jb25maWcgKmNmZzsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWlmIChwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9PSBOVUxMKSB7CisJCXY0bDJfZXJyKHBkZXYtPmRldi5kcml2ZXIsICJObyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWNmZyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJaWYgKCFjZmctPm1vZHVsZV9uYW1lWzBdIHx8CisJICAgICFjZmctPm9zZC5tb2R1bGVfbmFtZVswXSB8fAorCSAgICAhY2ZnLT52ZW5jLm1vZHVsZV9uYW1lWzBdKSB7CisJCXY0bDJfZXJyKHBkZXYtPmRldi5kcml2ZXIsICJ2cGJlIGRpc3BsYXkgbW9kdWxlIG5hbWVzIG5vdCIKKwkJCSAiIGRlZmluZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXZwYmVfZGV2ID0ga3phbGxvYyhzaXplb2YoKnZwYmVfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHZwYmVfZGV2ID09IE5VTEwpIHsKKwkJdjRsMl9lcnIocGRldi0+ZGV2LmRyaXZlciwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkiCisJCQkgIiBmb3IgdnBiZV9kZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJdnBiZV9kZXYtPmNmZyA9IGNmZzsKKwl2cGJlX2Rldi0+b3BzID0gdnBiZV9kZXZfb3BzOworCXZwYmVfZGV2LT5wZGV2ID0gJnBkZXYtPmRldjsKKworCWlmIChjZmctPm91dHB1dHMtPm51bV9tb2RlcyA+IDApCisJCXZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MgPSB2cGJlX2Rldi0+Y2ZnLT5vdXRwdXRzWzBdLm1vZGVzWzBdOworCWVsc2UKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBzZXQgdGhlIGRyaXZlciBkYXRhIGluIHBsYXRmb3JtIGRldmljZSAqLworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHZwYmVfZGV2KTsKKwltdXRleF9pbml0KCZ2cGJlX2Rldi0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cGJlX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldmljZSk7CisKKwlrZnJlZSh2cGJlX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdnBiZV9kcml2ZXIgPSB7CisJLmRyaXZlcgk9IHsKKwkJLm5hbWUJPSAidnBiZV9jb250cm9sbGVyIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSB2cGJlX3Byb2JlLAorCS5yZW1vdmUgPSB2cGJlX3JlbW92ZSwKK307CisKKy8qKgorICogdnBiZV9pbml0OiBpbml0aWFsaXplIHRoZSB2cGJlIGRyaXZlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIGRldmljZSBhbmQgZHJpdmVyIHRvIHRoZSBrZXJuZWwKKyAqLworc3RhdGljIF9faW5pdCBpbnQgdnBiZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdnBiZV9kcml2ZXIpOworfQorCisvKioKKyAqIHZwYmVfY2xlYW51cCA6IGNsZWFudXAgZnVuY3Rpb24gZm9yIHZwYmUgZHJpdmVyCisgKgorICogVGhpcyB3aWxsIHVuLXJlZ2lzdGVycyB0aGUgZGV2aWNlIGFuZCBkcml2ZXIgdG8gdGhlIGtlcm5lbAorICovCitzdGF0aWMgdm9pZCB2cGJlX2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdnBiZV9kcml2ZXIpOworfQorCisvKiBGdW5jdGlvbiBmb3IgbW9kdWxlIGluaXRpYWxpemF0aW9uIGFuZCBjbGVhbnVwICovCittb2R1bGVfaW5pdCh2cGJlX2luaXQpOworbW9kdWxlX2V4aXQodnBiZV9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX2Rpc3BsYXkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX2Rpc3BsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjFkODNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfZGlzcGxheS5jCkBAIC0wLDAgKzEsMTg2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBXSVRIT1VUIEFOWSBXQVJSQU5UWSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPG1hY2gvY3B1dHlwZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL2RhdmluY2kvdnBiZV9kaXNwbGF5Lmg+CisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cGJlX3R5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cGJlLmg+CisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cGJlX3ZlbmMuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfb3NkLmg+CisjaW5jbHVkZSAidnBiZV92ZW5jX3JlZ3MuaCIKKworI2RlZmluZSBWUEJFX0RJU1BMQVlfRFJJVkVSICJ2cGJlLXY0bDIiCisKK3N0YXRpYyBpbnQgZGVidWc7CisKKyNkZWZpbmUgVlBCRV9ESVNQTEFZX1NEX0JVRl9TSVpFICg3MjAqNTc2KjIpCisjZGVmaW5lIFZQQkVfREVGQVVMVF9OVU1fQlVGUyAzCisKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKKworc3RhdGljIGludCB2ZW5jX2lzX3NlY29uZF9maWVsZChzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldikKK3sKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZGlzcF9kZXYtPnZwYmVfZGV2OworCWludCByZXQ7CisJaW50IHZhbDsKKworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwodnBiZV9kZXYtPnZlbmMsCisJCQkgICAgICAgY29yZSwKKwkJCSAgICAgICBpb2N0bCwKKwkJCSAgICAgICBWRU5DX0dFVF9GTEQsCisJCQkgICAgICAgJnZhbCk7CisJaWYgKHJldCA8IDApIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCSAiRXJyb3IgaW4gZ2V0dGluZyBGaWVsZCBJRCAwXG4iKTsKKwl9CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgdnBiZV9pc3JfZXZlbl9maWVsZChzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX29iaiwKKwkJCQlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIpCit7CisJc3RydWN0IHRpbWVzcGVjIHRpbWV2YWx1ZTsKKworCWlmIChsYXllci0+Y3VyX2ZybSA9PSBsYXllci0+bmV4dF9mcm0pCisJCXJldHVybjsKKwlrdGltZV9nZXRfdHMoJnRpbWV2YWx1ZSk7CisJbGF5ZXItPmN1cl9mcm0tPnRzLnR2X3NlYyA9IHRpbWV2YWx1ZS50dl9zZWM7CisJbGF5ZXItPmN1cl9mcm0tPnRzLnR2X3VzZWMgPSB0aW1ldmFsdWUudHZfbnNlYyAvIE5TRUNfUEVSX1VTRUM7CisJbGF5ZXItPmN1cl9mcm0tPnN0YXRlID0gVklERU9CVUZfRE9ORTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmxheWVyLT5jdXJfZnJtLT5kb25lKTsKKwkvKiBNYWtlIGN1cl9mcm0gcG9pbnRpbmcgdG8gbmV4dF9mcm0gKi8KKwlsYXllci0+Y3VyX2ZybSA9IGxheWVyLT5uZXh0X2ZybTsKK30KKworc3RhdGljIHZvaWQgdnBiZV9pc3Jfb2RkX2ZpZWxkKHN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3Bfb2JqLAorCQkJCXN0cnVjdCB2cGJlX2xheWVyICpsYXllcikKK3sKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2RfZGV2aWNlID0gZGlzcF9vYmotPm9zZF9kZXZpY2U7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJc3Bpbl9sb2NrKCZkaXNwX29iai0+ZG1hX3F1ZXVlX2xvY2spOworCWlmIChsaXN0X2VtcHR5KCZsYXllci0+ZG1hX3F1ZXVlKSB8fAorCQkobGF5ZXItPmN1cl9mcm0gIT0gbGF5ZXItPm5leHRfZnJtKSkgeworCQlzcGluX3VubG9jaygmZGlzcF9vYmotPmRtYV9xdWV1ZV9sb2NrKTsKKwkJcmV0dXJuOworCX0KKwkvKgorCSAqIG9uZSBmaWVsZCBpcyBkaXNwbGF5ZWQgY29uZmlndXJlCisJICogdGhlIG5leHQgZnJhbWUgaWYgaXQgaXMgYXZhaWxhYmxlCisJICogb3RoZXJ3aXNlIGhvbGQgb24gY3VycmVudCBmcmFtZQorCSAqIEdldCBuZXh0IGZyb20gdGhlIGJ1ZmZlciBxdWV1ZQorCSAqLworCWxheWVyLT5uZXh0X2ZybSA9IGxpc3RfZW50cnkoCisJCQkJbGF5ZXItPmRtYV9xdWV1ZS5uZXh0LAorCQkJCXN0cnVjdCAgdmlkZW9idWZfYnVmZmVyLAorCQkJCXF1ZXVlKTsKKwkvKiBSZW1vdmUgdGhhdCBmcm9tIHRoZSBidWZmZXIgcXVldWUgKi8KKwlsaXN0X2RlbCgmbGF5ZXItPm5leHRfZnJtLT5xdWV1ZSk7CisJc3Bpbl91bmxvY2soJmRpc3Bfb2JqLT5kbWFfcXVldWVfbG9jayk7CisJLyogTWFyayBzdGF0ZSBvZiB0aGUgZnJhbWUgdG8gYWN0aXZlICovCisJbGF5ZXItPm5leHRfZnJtLT5zdGF0ZSA9IFZJREVPQlVGX0FDVElWRTsKKwlhZGRyID0gdmlkZW9idWZfdG9fZG1hX2NvbnRpZyhsYXllci0+bmV4dF9mcm0pOworCW9zZF9kZXZpY2UtPm9wcy5zdGFydF9sYXllcihvc2RfZGV2aWNlLAorCQkJbGF5ZXItPmxheWVyX2luZm8uaWQsCisJCQlhZGRyLAorCQkJZGlzcF9vYmotPmNiY3Jfb2ZzdCk7Cit9CisKKy8qIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB2ZW5jX2lzcihpbnQgaXJxLCB2b2lkICphcmcpCit7CisJc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcF9kZXYgPSAoc3RydWN0IHZwYmVfZGlzcGxheSAqKWFyZzsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXI7CisJc3RhdGljIHVuc2lnbmVkIGxhc3RfZXZlbnQ7CisJdW5zaWduZWQgZXZlbnQgPSAwOworCWludCBmaWQ7CisJaW50IGk7CisKKwlpZiAoKE5VTEwgPT0gYXJnKSB8fCAoTlVMTCA9PSBkaXNwX2Rldi0+ZGV2WzBdKSkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJaWYgKHZlbmNfaXNfc2Vjb25kX2ZpZWxkKGRpc3BfZGV2KSkKKwkJZXZlbnQgfD0gVkVOQ19TRUNPTkRfRklFTEQ7CisJZWxzZQorCQlldmVudCB8PSBWRU5DX0ZJUlNUX0ZJRUxEOworCisJaWYgKGV2ZW50ID09IChsYXN0X2V2ZW50ICYgflZFTkNfRU5EX09GX0ZSQU1FKSkgeworCQkvKgorCQkqIElmIHRoZSBkaXNwbGF5IGlzIG5vbi1pbnRlcmxhY2VkLCB0aGVuIHdlIG5lZWQgdG8gZmxhZyB0aGUKKwkJKiBlbmQtb2YtZnJhbWUgZXZlbnQgYXQgZXZlcnkgaW50ZXJydXB0IHJlZ2FyZGxlc3Mgb2YgdGhlCisJCSogdmFsdWUgb2YgdGhlIEZJRFNUIGJpdC4gIFdlIGNhbiBjb25jbHVkZSB0aGF0IHRoZSBkaXNwbGF5IGlzCisJCSogbm9uLWludGVybGFjZWQgaWYgdGhlIHZhbHVlIG9mIHRoZSBGSURTVCBiaXQgaXMgdW5jaGFuZ2VkCisJCSogZnJvbSB0aGUgcHJldmlvdXMgaW50ZXJydXB0LgorCQkqLworCQlldmVudCB8PSBWRU5DX0VORF9PRl9GUkFNRTsKKwl9IGVsc2UgaWYgKGV2ZW50ID09IFZFTkNfU0VDT05EX0ZJRUxEKSB7CisJCS8qIGVuZC1vZi1mcmFtZSBmb3IgaW50ZXJsYWNlZCBkaXNwbGF5ICovCisJCWV2ZW50IHw9IFZFTkNfRU5EX09GX0ZSQU1FOworCX0KKwlsYXN0X2V2ZW50ID0gZXZlbnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgVlBCRV9ESVNQTEFZX01BWF9ERVZJQ0VTOyBpKyspIHsKKwkJbGF5ZXIgPSBkaXNwX2Rldi0+ZGV2W2ldOworCQkvKiBJZiBzdHJlYW1pbmcgaXMgc3RhcnRlZCBpbiB0aGlzIGxheWVyICovCisJCWlmICghbGF5ZXItPnN0YXJ0ZWQpCisJCQljb250aW51ZTsKKworCQlpZiAobGF5ZXItPmxheWVyX2ZpcnN0X2ludCkgeworCQkJbGF5ZXItPmxheWVyX2ZpcnN0X2ludCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBDaGVjayB0aGUgZmllbGQgZm9ybWF0ICovCisJCWlmICgoVjRMMl9GSUVMRF9OT05FID09IGxheWVyLT5waXhfZm10LmZpZWxkKSAmJgorCQkJKGV2ZW50ICYgVkVOQ19FTkRfT0ZfRlJBTUUpKSB7CisJCQkvKiBQcm9ncmVzc2l2ZSBtb2RlICovCisKKwkJCXZwYmVfaXNyX2V2ZW5fZmllbGQoZGlzcF9kZXYsIGxheWVyKTsKKwkJCXZwYmVfaXNyX29kZF9maWVsZChkaXNwX2RldiwgbGF5ZXIpOworCQl9IGVsc2UgeworCQkvKiBJbnRlcmxhY2VkIG1vZGUgKi8KKworCQkJbGF5ZXItPmZpZWxkX2lkIF49IDE7CisJCQlpZiAoZXZlbnQgJiBWRU5DX0ZJUlNUX0ZJRUxEKQorCQkJCWZpZCA9IDA7CisJCQllbHNlCisJCQkJZmlkID0gMTsKKworCQkJLyoKKwkJCSogSWYgZmllbGQgaWQgZG9lcyBub3QgbWF0Y2ggd2l0aCBzdG9yZQorCQkJKiBmaWVsZCBpZAorCQkJKi8KKwkJCWlmIChmaWQgIT0gbGF5ZXItPmZpZWxkX2lkKSB7CisJCQkJLyogTWFrZSB0aGVtIGluIHN5bmMgKi8KKwkJCQlsYXllci0+ZmllbGRfaWQgPSBmaWQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKgorCQkJKiBkZXZpY2UgZmllbGQgaWQgYW5kIGxvY2FsIGZpZWxkIGlkIGFyZQorCQkJKiBpbiBzeW5jLiBJZiB0aGlzIGlzIGV2ZW4gZmllbGQKKwkJCSovCisJCQlpZiAoMCA9PSBmaWQpCisJCQkJdnBiZV9pc3JfZXZlbl9maWVsZChkaXNwX2RldiwgbGF5ZXIpOworCQkJZWxzZSAgLyogb2RkIGZpZWxkICovCisJCQkJdnBiZV9pc3Jfb2RkX2ZpZWxkKGRpc3BfZGV2LCBsYXllcik7CisJCX0KKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiB2cGJlX2J1ZmZlcl9wcmVwYXJlKCkKKyAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIHZpZGVvYnVmX3FidWYoKSBmdW5jdGlvbgorICogdGhlIGJ1ZmZlciBpcyBwcmVwYXJlZCBhbmQgdXNlciBzcGFjZSB2aXJ0dWFsIGFkZHJlc3MgaXMgY29udmVydGVkIGludG8KKyAqIHBoeXNpY2FsIGFkZHJlc3MKKyAqLworc3RhdGljIGludCB2cGJlX2J1ZmZlcl9wcmVwYXJlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwKKwkJCQkgIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiLAorCQkJCSAgZW51bSB2NGwyX2ZpZWxkIGZpZWxkKQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IHEtPnByaXZfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCWludCByZXQ7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCQkidnBiZV9idWZmZXJfcHJlcGFyZVxuIik7CisKKwkvKiBJZiBidWZmZXIgaXMgbm90IGluaXRpYWxpemVkLCBpbml0aWFsaXplIGl0ICovCisJaWYgKFZJREVPQlVGX05FRURTX0lOSVQgPT0gdmItPnN0YXRlKSB7CisJCXZiLT53aWR0aCA9IGxheWVyLT5waXhfZm10LndpZHRoOworCQl2Yi0+aGVpZ2h0ID0gbGF5ZXItPnBpeF9mbXQuaGVpZ2h0OworCQl2Yi0+c2l6ZSA9IGxheWVyLT5waXhfZm10LnNpemVpbWFnZTsKKwkJdmItPmZpZWxkID0gZmllbGQ7CisKKwkJcmV0ID0gdmlkZW9idWZfaW9sb2NrKHEsIHZiLCBOVUxMKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsICJGYWlsZWQgdG8gbWFwIFwKKwkJCQl1c2VyIGFkZHJlc3NcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlhZGRyID0gdmlkZW9idWZfdG9fZG1hX2NvbnRpZyh2Yik7CisKKwkJaWYgKHEtPnN0cmVhbWluZykgeworCQkJaWYgKCFJU19BTElHTkVEKGFkZHIsIDgpKSB7CisJCQkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCQkJImJ1ZmZlcl9wcmVwYXJlOm9mZnNldCBpcyBcCisJCQkJCW5vdCBhbGlnbmVkIHRvIDMyIGJ5dGVzXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCQl2Yi0+c3RhdGUgPSBWSURFT0JVRl9QUkVQQVJFRDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB2cGJlX2J1ZmZlcl9zZXR1cCgpCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoZSBidWZmZXJzCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9idWZmZXJfc2V0dXAoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLAorCQkJCXVuc2lnbmVkIGludCAqY291bnQsCisJCQkJdW5zaWduZWQgaW50ICpzaXplKQoreworCS8qIEdldCB0aGUgZmlsZSBoYW5kbGUgb2JqZWN0IGFuZCBsYXllciBvYmplY3QgKi8KKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBxLT5wcml2X2RhdGE7CisJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyID0gZmgtPmxheWVyOworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBmaC0+ZGlzcF9kZXYtPnZwYmVfZGV2OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsICJ2cGJlX2J1ZmZlcl9zZXR1cFxuIik7CisKKwkqc2l6ZSA9IGxheWVyLT5waXhfZm10LnNpemVpbWFnZTsKKworCS8qIFN0b3JlIG51bWJlciBvZiBidWZmZXJzIGFsbG9jYXRlZCBpbiBudW1idWZmZXIgbWVtYmVyICovCisJaWYgKCpjb3VudCA8IFZQQkVfREVGQVVMVF9OVU1fQlVGUykKKwkJKmNvdW50ID0gbGF5ZXItPm51bWJ1ZmZlcnMgPSBWUEJFX0RFRkFVTFRfTlVNX0JVRlM7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHZwYmVfYnVmZmVyX3F1ZXVlKCkKKyAqIFRoaXMgZnVuY3Rpb24gYWRkcyB0aGUgYnVmZmVyIHRvIERNQSBxdWV1ZQorICovCitzdGF0aWMgdm9pZCB2cGJlX2J1ZmZlcl9xdWV1ZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsCisJCQkJIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworCS8qIEdldCB0aGUgZmlsZSBoYW5kbGUgb2JqZWN0IGFuZCBsYXllciBvYmplY3QgKi8KKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBxLT5wcml2X2RhdGE7CisJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyID0gZmgtPmxheWVyOworCXN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3AgPSBmaC0+ZGlzcF9kZXY7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJInZwYmVfYnVmZmVyX3F1ZXVlXG4iKTsKKworCS8qIGFkZCB0aGUgYnVmZmVyIHRvIHRoZSBETUEgcXVldWUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGlzcC0+ZG1hX3F1ZXVlX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZ2Yi0+cXVldWUsICZsYXllci0+ZG1hX3F1ZXVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaXNwLT5kbWFfcXVldWVfbG9jaywgZmxhZ3MpOworCS8qIENoYW5nZSBzdGF0ZSBvZiB0aGUgYnVmZmVyICovCisJdmItPnN0YXRlID0gVklERU9CVUZfUVVFVUVEOworfQorCisvKgorICogdnBiZV9idWZmZXJfcmVsZWFzZSgpCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSB2aWRlb2J1ZiBsYXllciB0byBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgdG8KKyAqIHRoZSBidWZmZXJzCisgKi8KK3N0YXRpYyB2b2lkIHZwYmVfYnVmZmVyX3JlbGVhc2Uoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLAorCQkJCSAgIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworCS8qIEdldCB0aGUgZmlsZSBoYW5kbGUgb2JqZWN0IGFuZCBsYXllciBvYmplY3QgKi8KKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBxLT5wcml2X2RhdGE7CisJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyID0gZmgtPmxheWVyOworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBmaC0+ZGlzcF9kZXYtPnZwYmVfZGV2OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkidnBiZV9idWZmZXJfcmVsZWFzZVxuIik7CisKKwlpZiAoVjRMMl9NRU1PUllfVVNFUlBUUiAhPSBsYXllci0+bWVtb3J5KQorCQl2aWRlb2J1Zl9kbWFfY29udGlnX2ZyZWUocSwgdmIpOworCisJdmItPnN0YXRlID0gVklERU9CVUZfTkVFRFNfSU5JVDsKK30KKworc3RhdGljIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgdmlkZW9fcW9wcyA9IHsKKwkuYnVmX3NldHVwID0gdnBiZV9idWZmZXJfc2V0dXAsCisJLmJ1Zl9wcmVwYXJlID0gdnBiZV9idWZmZXJfcHJlcGFyZSwKKwkuYnVmX3F1ZXVlID0gdnBiZV9idWZmZXJfcXVldWUsCisJLmJ1Zl9yZWxlYXNlID0gdnBiZV9idWZmZXJfcmVsZWFzZSwKK307CisKK3N0YXRpYworc3RydWN0IHZwYmVfbGF5ZXIqCitfdnBiZV9kaXNwbGF5X2dldF9vdGhlcl93aW5fbGF5ZXIoc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcF9kZXYsCisJCQlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIpCit7CisJZW51bSB2cGJlX2Rpc3BsYXlfZGV2aWNlX2lkIHRoaXN3aW4sIG90aGVyd2luOworCXRoaXN3aW4gPSBsYXllci0+ZGV2aWNlX2lkOworCisJb3RoZXJ3aW4gPSAodGhpc3dpbiA9PSBWUEJFX0RJU1BMQVlfREVWSUNFXzApID8KKwlWUEJFX0RJU1BMQVlfREVWSUNFXzEgOiBWUEJFX0RJU1BMQVlfREVWSUNFXzA7CisJcmV0dXJuIGRpc3BfZGV2LT5kZXZbb3RoZXJ3aW5dOworfQorCitzdGF0aWMgaW50IHZwYmVfc2V0X29zZF9kaXNwbGF5X3BhcmFtcyhzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiwKKwkJCXN0cnVjdCB2cGJlX2xheWVyICpsYXllcikKK3sKKwlzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyAqY2ZnICA9ICZsYXllci0+bGF5ZXJfaW5mby5jb25maWc7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkX2RldmljZSA9IGRpc3BfZGV2LT5vc2RfZGV2aWNlOworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBkaXNwX2Rldi0+dnBiZV9kZXY7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCWludCByZXQ7CisKKwlhZGRyID0gdmlkZW9idWZfdG9fZG1hX2NvbnRpZyhsYXllci0+Y3VyX2ZybSk7CisJLyogU2V0IGFkZHJlc3MgaW4gdGhlIGRpc3BsYXkgcmVnaXN0ZXJzICovCisJb3NkX2RldmljZS0+b3BzLnN0YXJ0X2xheWVyKG9zZF9kZXZpY2UsCisJCQkJICAgIGxheWVyLT5sYXllcl9pbmZvLmlkLAorCQkJCSAgICBhZGRyLAorCQkJCSAgICBkaXNwX2Rldi0+Y2Jjcl9vZnN0KTsKKworCXJldCA9IG9zZF9kZXZpY2UtPm9wcy5lbmFibGVfbGF5ZXIob3NkX2RldmljZSwKKwkJCQlsYXllci0+bGF5ZXJfaW5mby5pZCwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCSJFcnJvciBpbiBlbmFibGluZyBvc2Qgd2luZG93IGxheWVyIDBcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogRW5hYmxlIHRoZSB3aW5kb3cgKi8KKwlsYXllci0+bGF5ZXJfaW5mby5lbmFibGUgPSAxOworCWlmIChjZmctPnBpeGZtdCA9PSBQSVhGTVRfTlYxMikgeworCQlzdHJ1Y3QgdnBiZV9sYXllciAqb3RoZXJsYXllciA9CisJCQlfdnBiZV9kaXNwbGF5X2dldF9vdGhlcl93aW5fbGF5ZXIoZGlzcF9kZXYsIGxheWVyKTsKKworCQlyZXQgPSBvc2RfZGV2aWNlLT5vcHMuZW5hYmxlX2xheWVyKG9zZF9kZXZpY2UsCisJCQkJb3RoZXJsYXllci0+bGF5ZXJfaW5mby5pZCwgMSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJCSJFcnJvciBpbiBlbmFibGluZyBvc2Qgd2luZG93IGxheWVyIDFcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCW90aGVybGF5ZXItPmxheWVyX2luZm8uZW5hYmxlID0gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit2cGJlX2Rpc3BfY2FsY3VsYXRlX3NjYWxlX2ZhY3RvcihzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiwKKwkJCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciwKKwkJCWludCBleHBlY3RlZF94c2l6ZSwgaW50IGV4cGVjdGVkX3lzaXplKQoreworCXN0cnVjdCBkaXNwbGF5X2xheWVyX2luZm8gKmxheWVyX2luZm8gPSAmbGF5ZXItPmxheWVyX2luZm87CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4Zm10ID0gJmxheWVyLT5waXhfZm10OworCXN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnICpjZmcgID0gJmxheWVyLT5sYXllcl9pbmZvLmNvbmZpZzsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZGlzcF9kZXYtPnZwYmVfZGV2OworCWludCBjYWxjdWxhdGVkX3hzaXplOworCWludCBoX2V4cCA9IDA7CisJaW50IHZfZXhwID0gMDsKKwlpbnQgaF9zY2FsZTsKKwlpbnQgdl9zY2FsZTsKKworCXY0bDJfc3RkX2lkIHN0YW5kYXJkX2lkID0gdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy50aW1pbmdzLnN0ZF9pZDsKKworCS8qCisJICogQXBwbGljYXRpb24gaW5pdGlhbGx5IHNldCB0aGUgaW1hZ2UgZm9ybWF0LiBDdXJyZW50IGRpc3BsYXkKKwkgKiBzaXplIGlzIG9idGFpbmVkIGZyb20gdGhlIHZwYmUgZGlzcGxheSBjb250cm9sbGVyLiBleHBlY3RlZF94c2l6ZQorCSAqIGFuZCBleHBlY3RlZF95c2l6ZSBhcmUgc2V0IHRocm91Z2ggU19DUk9QIGlvY3RsLiBCYXNlZCBvbiB0aGlzLAorCSAqIGRyaXZlciB3aWxsIGNhbGN1bGF0ZSB0aGUgc2NhbGUgZmFjdG9ycyBmb3IgdmVydGljYWwgYW5kCisJICogaG9yaXpvbnRhbCBkaXJlY3Rpb24gc28gdGhhdCB0aGUgaW1hZ2UgaXMgZGlzcGxheWVkIHNjYWxlZAorCSAqIGFuZCBleHBhbmRlZC4gQXBwbGljYXRpb24gdXNlcyBleHBhbnNpb24gdG8gZGlzcGxheSB0aGUgaW1hZ2UKKwkgKiBpbiBhIHNxdWFyZSBwaXhlbC4gT3RoZXJ3aXNlIGl0IGlzIGRpc3BsYXllZCB1c2luZyBkaXNwbGF5cworCSAqIHBpeGVsIGFzcGVjdCByYXRpby5JdCBpcyBleHBlY3RlZCB0aGF0IGFwcGxpY2F0aW9uIGNob29zZXMKKwkgKiB0aGUgY3JvcCBjb29yZGluYXRlcyBmb3IgY3JvcHBlZCBvciBzY2FsZWQgZGlzcGxheS4gaWYgY3JvcAorCSAqIHNpemUgaXMgbGVzcyB0aGFuIHRoZSBpbWFnZSBzaXplLCBpdCBpcyBkaXNwbGF5ZWQgY3JvcHBlZCBvcgorCSAqIGl0IGlzIGRpc3BsYXllZCBzY2FsZWQgYW5kL29yIGV4cGFuZGVkLgorCSAqCisJICogdG8gYmVnaW4gd2l0aCwgc2V0IHRoZSBjcm9wIHdpbmRvdyBzYW1lIGFzIGV4cGVjdGVkLiBMYXRlciB3ZQorCSAqIHdpbGwgb3ZlcnJpZGUgd2l0aCBzY2FsZWQgd2luZG93IHNpemUKKwkgKi8KKworCWNmZy0+eHNpemUgPSBwaXhmbXQtPndpZHRoOworCWNmZy0+eXNpemUgPSBwaXhmbXQtPmhlaWdodDsKKwlsYXllcl9pbmZvLT5oX3pvb20gPSBaT09NX1gxOwkvKiBubyBob3Jpem9udGFsIHpvb20gKi8KKwlsYXllcl9pbmZvLT52X3pvb20gPSBaT09NX1gxOwkvKiBubyBob3Jpem9udGFsIHpvb20gKi8KKwlsYXllcl9pbmZvLT5oX2V4cCA9IEhfRVhQX09GRjsJLyogbm8gaG9yaXpvbnRhbCB6b29tICovCisJbGF5ZXJfaW5mby0+dl9leHAgPSBWX0VYUF9PRkY7CS8qIG5vIGhvcml6b250YWwgem9vbSAqLworCisJaWYgKHBpeGZtdC0+d2lkdGggPCBleHBlY3RlZF94c2l6ZSkgeworCQloX3NjYWxlID0gdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy54cmVzIC8gcGl4Zm10LT53aWR0aDsKKwkJaWYgKGhfc2NhbGUgPCAyKQorCQkJaF9zY2FsZSA9IDE7CisJCWVsc2UgaWYgKGhfc2NhbGUgPj0gNCkKKwkJCWhfc2NhbGUgPSA0OworCQllbHNlCisJCQloX3NjYWxlID0gMjsKKwkJY2ZnLT54c2l6ZSAqPSBoX3NjYWxlOworCQlpZiAoY2ZnLT54c2l6ZSA8IGV4cGVjdGVkX3hzaXplKSB7CisJCQlpZiAoKHN0YW5kYXJkX2lkICYgVjRMMl9TVERfNTI1XzYwKSB8fAorCQkJKHN0YW5kYXJkX2lkICYgVjRMMl9TVERfNjI1XzUwKSkgeworCQkJCWNhbGN1bGF0ZWRfeHNpemUgPSAoY2ZnLT54c2l6ZSAqCisJCQkJCVZQQkVfRElTUExBWV9IX0VYUF9SQVRJT19OKSAvCisJCQkJCVZQQkVfRElTUExBWV9IX0VYUF9SQVRJT19EOworCQkJCWlmIChjYWxjdWxhdGVkX3hzaXplIDw9IGV4cGVjdGVkX3hzaXplKSB7CisJCQkJCWhfZXhwID0gMTsKKwkJCQkJY2ZnLT54c2l6ZSA9IGNhbGN1bGF0ZWRfeHNpemU7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChoX3NjYWxlID09IDIpCisJCQlsYXllcl9pbmZvLT5oX3pvb20gPSBaT09NX1gyOworCQllbHNlIGlmIChoX3NjYWxlID09IDQpCisJCQlsYXllcl9pbmZvLT5oX3pvb20gPSBaT09NX1g0OworCQlpZiAoaF9leHApCisJCQlsYXllcl9pbmZvLT5oX2V4cCA9IEhfRVhQXzlfT1ZFUl84OworCX0gZWxzZSB7CisJCS8qIG5vIHNjYWxpbmcsIG9ubHkgY3JvcHBpbmcuIFNldCBkaXNwbGF5IGFyZWEgdG8gY3JvcCBhcmVhICovCisJCWNmZy0+eHNpemUgPSBleHBlY3RlZF94c2l6ZTsKKwl9CisKKwlpZiAocGl4Zm10LT5oZWlnaHQgPCBleHBlY3RlZF95c2l6ZSkgeworCQl2X3NjYWxlID0gZXhwZWN0ZWRfeXNpemUgLyBwaXhmbXQtPmhlaWdodDsKKwkJaWYgKHZfc2NhbGUgPCAyKQorCQkJdl9zY2FsZSA9IDE7CisJCWVsc2UgaWYgKHZfc2NhbGUgPj0gNCkKKwkJCXZfc2NhbGUgPSA0OworCQllbHNlCisJCQl2X3NjYWxlID0gMjsKKwkJY2ZnLT55c2l6ZSAqPSB2X3NjYWxlOworCQlpZiAoY2ZnLT55c2l6ZSA8IGV4cGVjdGVkX3lzaXplKSB7CisJCQlpZiAoKHN0YW5kYXJkX2lkICYgVjRMMl9TVERfNjI1XzUwKSkgeworCQkJCWNhbGN1bGF0ZWRfeHNpemUgPSAoY2ZnLT55c2l6ZSAqCisJCQkJCVZQQkVfRElTUExBWV9WX0VYUF9SQVRJT19OKSAvCisJCQkJCVZQQkVfRElTUExBWV9WX0VYUF9SQVRJT19EOworCQkJCWlmIChjYWxjdWxhdGVkX3hzaXplIDw9IGV4cGVjdGVkX3lzaXplKSB7CisJCQkJCXZfZXhwID0gMTsKKwkJCQkJY2ZnLT55c2l6ZSA9IGNhbGN1bGF0ZWRfeHNpemU7CisJCQkJfQorCQkJfQorCQl9CisJCWlmICh2X3NjYWxlID09IDIpCisJCQlsYXllcl9pbmZvLT52X3pvb20gPSBaT09NX1gyOworCQllbHNlIGlmICh2X3NjYWxlID09IDQpCisJCQlsYXllcl9pbmZvLT52X3pvb20gPSBaT09NX1g0OworCQlpZiAodl9leHApCisJCQlsYXllcl9pbmZvLT5oX2V4cCA9IFZfRVhQXzZfT1ZFUl81OworCX0gZWxzZSB7CisJCS8qIG5vIHNjYWxpbmcsIG9ubHkgY3JvcHBpbmcuIFNldCBkaXNwbGF5IGFyZWEgdG8gY3JvcCBhcmVhICovCisJCWNmZy0+eXNpemUgPSBleHBlY3RlZF95c2l6ZTsKKwl9CisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCSJjcm9wIGRpc3BsYXkgeHNpemUgPSAlZCwgeXNpemUgPSAlZFxuIiwKKwkJY2ZnLT54c2l6ZSwgY2ZnLT55c2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHZwYmVfZGlzcF9hZGpfcG9zaXRpb24oc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcF9kZXYsCisJCQlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIsCisJCQlpbnQgdG9wLCBpbnQgbGVmdCkKK3sKKwlzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyAqY2ZnID0gJmxheWVyLT5sYXllcl9pbmZvLmNvbmZpZzsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZGlzcF9kZXYtPnZwYmVfZGV2OworCisJY2ZnLT54cG9zID0gbWluKCh1bnNpZ25lZCBpbnQpbGVmdCwKKwkJCXZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MueHJlcyAtIGNmZy0+eHNpemUpOworCWNmZy0+eXBvcyA9IG1pbigodW5zaWduZWQgaW50KXRvcCwKKwkJCXZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MueXJlcyAtIGNmZy0+eXNpemUpOworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCSJuZXcgeHBvcyA9ICVkLCB5cG9zID0gJWRcbiIsCisJCWNmZy0+eHBvcywgY2ZnLT55cG9zKTsKK30KKworc3RhdGljIHZvaWQgdnBiZV9kaXNwX2NoZWNrX3dpbmRvd19wYXJhbXMoc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcF9kZXYsCisJCQlzdHJ1Y3QgdjRsMl9yZWN0ICpjKQoreworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBkaXNwX2Rldi0+dnBiZV9kZXY7CisKKwlpZiAoKGMtPndpZHRoID09IDApIHx8CisJICAoKGMtPndpZHRoICsgYy0+bGVmdCkgPiB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnhyZXMpKQorCQljLT53aWR0aCA9IHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MueHJlcyAtIGMtPmxlZnQ7CisKKwlpZiAoKGMtPmhlaWdodCA9PSAwKSB8fCAoKGMtPmhlaWdodCArIGMtPnRvcCkgPgorCSAgdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy55cmVzKSkKKwkJYy0+aGVpZ2h0ID0gdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy55cmVzIC0gYy0+dG9wOworCisJLyogd2luZG93IGhlaWdodCBtdXN0IGJlIGV2ZW4gZm9yIGludGVybGFjZWQgZGlzcGxheSAqLworCWlmICh2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLmludGVybGFjZWQpCisJCWMtPmhlaWdodCAmPSAofjB4MDEpOworCit9CisKKy8qKgorICogdnBiZV90cnlfZm9ybWF0KCkKKyAqIElmIHVzZXIgYXBwbGljYXRpb24gcHJvdmlkZXMgd2lkdGggYW5kIGhlaWdodCwgYW5kIGhhdmUgYnl0ZXNwZXJsaW5lIHNldAorICogdG8gemVybywgZHJpdmVyIGNhbGN1bGF0ZXMgYnl0ZXNwZXJsaW5lIGFuZCBzaXplaW1hZ2UgYmFzZWQgb24gaGFyZHdhcmUKKyAqIGxpbWl0cy4KKyAqLworc3RhdGljIGludCB2cGJlX3RyeV9mb3JtYXQoc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcF9kZXYsCisJCQlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXhmbXQsIGludCBjaGVjaykKK3sKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZGlzcF9kZXYtPnZwYmVfZGV2OworCWludCBtaW5faGVpZ2h0ID0gMTsKKwlpbnQgbWluX3dpZHRoID0gMzI7CisJaW50IG1heF9oZWlnaHQ7CisJaW50IG1heF93aWR0aDsKKwlpbnQgYnBwOworCisJaWYgKChwaXhmbXQtPnBpeGVsZm9ybWF0ICE9IFY0TDJfUElYX0ZNVF9VWVZZKSAmJgorCSAgICAocGl4Zm10LT5waXhlbGZvcm1hdCAhPSBWNEwyX1BJWF9GTVRfTlYxMikpCisJCS8qIGNob29zZSBkZWZhdWx0IGFzIFY0TDJfUElYX0ZNVF9VWVZZICovCisJCXBpeGZtdC0+cGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfVVlWWTsKKworCS8qIENoZWNrIHRoZSBmaWVsZCBmb3JtYXQgKi8KKwlpZiAoKHBpeGZtdC0+ZmllbGQgIT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEKSAmJgorCQkocGl4Zm10LT5maWVsZCAhPSBWNEwyX0ZJRUxEX05PTkUpKSB7CisJCWlmICh2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLmludGVybGFjZWQpCisJCQlwaXhmbXQtPmZpZWxkID0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOworCQllbHNlCisJCQlwaXhmbXQtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCX0KKworCWlmIChwaXhmbXQtPmZpZWxkID09IFY0TDJfRklFTERfSU5URVJMQUNFRCkKKwkJbWluX2hlaWdodCA9IDI7CisKKwlpZiAocGl4Zm10LT5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfTlYxMikKKwkJYnBwID0gMTsKKwllbHNlCisJCWJwcCA9IDI7CisKKwltYXhfd2lkdGggPSB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnhyZXM7CisJbWF4X2hlaWdodCA9IHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MueXJlczsKKworCW1pbl93aWR0aCAvPSBicHA7CisKKwlpZiAoIXBpeGZtdC0+d2lkdGggfHwgKHBpeGZtdC0+d2lkdGggPCBtaW5fd2lkdGgpIHx8CisJCShwaXhmbXQtPndpZHRoID4gbWF4X3dpZHRoKSkgeworCQlwaXhmbXQtPndpZHRoID0gdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy54cmVzOworCX0KKworCWlmICghcGl4Zm10LT5oZWlnaHQgfHwgKHBpeGZtdC0+aGVpZ2h0ICA8IG1pbl9oZWlnaHQpIHx8CisJCShwaXhmbXQtPmhlaWdodCAgPiBtYXhfaGVpZ2h0KSkgeworCQlwaXhmbXQtPmhlaWdodCA9IHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MueXJlczsKKwl9CisKKwlpZiAocGl4Zm10LT5ieXRlc3BlcmxpbmUgPCAocGl4Zm10LT53aWR0aCAqIGJwcCkpCisJCXBpeGZtdC0+Ynl0ZXNwZXJsaW5lID0gcGl4Zm10LT53aWR0aCAqIGJwcDsKKworCS8qIE1ha2UgdGhlIGJ5dGVzcGVybGluZSAzMiBieXRlIGFsaWduZWQgKi8KKwlwaXhmbXQtPmJ5dGVzcGVybGluZSA9ICgocGl4Zm10LT53aWR0aCAqIGJwcCArIDMxKSAmIH4zMSk7CisKKwlpZiAocGl4Zm10LT5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfTlYxMikKKwkJcGl4Zm10LT5zaXplaW1hZ2UgPSBwaXhmbXQtPmJ5dGVzcGVybGluZSAqIHBpeGZtdC0+aGVpZ2h0ICsKKwkJCQkocGl4Zm10LT5ieXRlc3BlcmxpbmUgKiBwaXhmbXQtPmhlaWdodCA+PiAxKTsKKwllbHNlCisJCXBpeGZtdC0+c2l6ZWltYWdlID0gcGl4Zm10LT5ieXRlc3BlcmxpbmUgKiBwaXhmbXQtPmhlaWdodDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9nX3ByaW9yaXR5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCWVudW0gdjRsMl9wcmlvcml0eSAqcCkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyID0gZmgtPmxheWVyOworCisJKnAgPSB2NGwyX3ByaW9fbWF4KCZsYXllci0+cHJpbyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfc19wcmlvcml0eShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQllbnVtIHY0bDJfcHJpb3JpdHkgcCkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyID0gZmgtPmxheWVyOworCWludCByZXQ7CisKKwlyZXQgPSB2NGwyX3ByaW9fY2hhbmdlKCZsYXllci0+cHJpbywgJmZoLT5wcmlvLCBwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBmaC0+ZGlzcF9kZXYtPnZwYmVfZGV2OworCisJY2FwLT52ZXJzaW9uID0gVlBCRV9ESVNQTEFZX1ZFUlNJT05fQ09ERTsKKwljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX09VVFBVVCB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKKwlzdHJsY3B5KGNhcC0+ZHJpdmVyLCBWUEJFX0RJU1BMQVlfRFJJVkVSLCBzaXplb2YoY2FwLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGNhcC0+YnVzX2luZm8sICJwbGF0Zm9ybSIsIHNpemVvZihjYXAtPmJ1c19pbmZvKSk7CisJc3RybGNweShjYXAtPmNhcmQsIHZwYmVfZGV2LT5jZmctPm1vZHVsZV9uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfc19jcm9wKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgICBzdHJ1Y3QgdjRsMl9jcm9wICpjcm9wKQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcF9kZXYgPSBmaC0+ZGlzcF9kZXY7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGRpc3BfZGV2LT52cGJlX2RldjsKKwlzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyAqY2ZnID0gJmxheWVyLT5sYXllcl9pbmZvLmNvbmZpZzsKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2RfZGV2aWNlID0gZGlzcF9kZXYtPm9zZF9kZXZpY2U7CisJc3RydWN0IHY0bDJfcmVjdCAqcmVjdCA9ICZjcm9wLT5jOworCWludCByZXQ7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJIlZJRElPQ19TX0NST1AsIGxheWVyIGlkID0gJWRcbiIsIGxheWVyLT5kZXZpY2VfaWQpOworCisJaWYgKGNyb3AtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIkludmFsaWQgYnVmIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocmVjdC0+dG9wIDwgMCkKKwkJcmVjdC0+dG9wID0gMDsKKwlpZiAocmVjdC0+bGVmdCA8IDApCisJCXJlY3QtPmxlZnQgPSAwOworCisJdnBiZV9kaXNwX2NoZWNrX3dpbmRvd19wYXJhbXMoZGlzcF9kZXYsIHJlY3QpOworCisJb3NkX2RldmljZS0+b3BzLmdldF9sYXllcl9jb25maWcob3NkX2RldmljZSwKKwkJCWxheWVyLT5sYXllcl9pbmZvLmlkLCBjZmcpOworCisJdnBiZV9kaXNwX2NhbGN1bGF0ZV9zY2FsZV9mYWN0b3IoZGlzcF9kZXYsIGxheWVyLAorCQkJCQlyZWN0LT53aWR0aCwKKwkJCQkJcmVjdC0+aGVpZ2h0KTsKKwl2cGJlX2Rpc3BfYWRqX3Bvc2l0aW9uKGRpc3BfZGV2LCBsYXllciwgcmVjdC0+dG9wLAorCQkJCQlyZWN0LT5sZWZ0KTsKKwlyZXQgPSBvc2RfZGV2aWNlLT5vcHMuc2V0X2xheWVyX2NvbmZpZyhvc2RfZGV2aWNlLAorCQkJCWxheWVyLT5sYXllcl9pbmZvLmlkLCBjZmcpOworCWlmIChyZXQgPCAwKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkiRXJyb3IgaW4gc2V0IGxheWVyIGNvbmZpZzpcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBhcHBseSB6b29taW5nIGFuZCBoIG9yIHYgZXhwYW5zaW9uICovCisJb3NkX2RldmljZS0+b3BzLnNldF96b29tKG9zZF9kZXZpY2UsCisJCQlsYXllci0+bGF5ZXJfaW5mby5pZCwKKwkJCWxheWVyLT5sYXllcl9pbmZvLmhfem9vbSwKKwkJCWxheWVyLT5sYXllcl9pbmZvLnZfem9vbSk7CisJcmV0ID0gb3NkX2RldmljZS0+b3BzLnNldF92aWRfZXhwYW5zaW9uKG9zZF9kZXZpY2UsCisJCQlsYXllci0+bGF5ZXJfaW5mby5oX2V4cCwKKwkJCWxheWVyLT5sYXllcl9pbmZvLnZfZXhwKTsKKwlpZiAocmV0IDwgMCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkiRXJyb3IgaW4gc2V0IHZpZCBleHBhbnNpb246XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChsYXllci0+bGF5ZXJfaW5mby5oX3pvb20gIT0gWk9PTV9YMSkgfHwKKwkJKGxheWVyLT5sYXllcl9pbmZvLnZfem9vbSAhPSBaT09NX1gxKSB8fAorCQkobGF5ZXItPmxheWVyX2luZm8uaF9leHAgIT0gSF9FWFBfT0ZGKSB8fAorCQkobGF5ZXItPmxheWVyX2luZm8udl9leHAgIT0gVl9FWFBfT0ZGKSkKKwkJLyogRW5hYmxlIGV4cGFuc2lvbiBmaWx0ZXIgKi8KKwkJb3NkX2RldmljZS0+b3BzLnNldF9pbnRlcnBvbGF0aW9uX2ZpbHRlcihvc2RfZGV2aWNlLCAxKTsKKwllbHNlCisJCW9zZF9kZXZpY2UtPm9wcy5zZXRfaW50ZXJwb2xhdGlvbl9maWx0ZXIob3NkX2RldmljZSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfZ19jcm9wKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgICBzdHJ1Y3QgdjRsMl9jcm9wICpjcm9wKQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IG9zZF9sYXllcl9jb25maWcgKmNmZyA9ICZsYXllci0+bGF5ZXJfaW5mby5jb25maWc7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkX2RldmljZSA9IGZoLT5kaXNwX2Rldi0+b3NkX2RldmljZTsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0ID0gJmNyb3AtPmM7CisJaW50IHJldDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJIlZJRElPQ19HX0NST1AsIGxheWVyIGlkID0gJWRcbiIsCisJCQlsYXllci0+ZGV2aWNlX2lkKTsKKworCWlmIChjcm9wLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsICJJbnZhbGlkIGJ1ZiB0eXBlXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJb3NkX2RldmljZS0+b3BzLmdldF9sYXllcl9jb25maWcob3NkX2RldmljZSwKKwkJCQlsYXllci0+bGF5ZXJfaW5mby5pZCwgY2ZnKTsKKwlyZWN0LT50b3AgPSBjZmctPnlwb3M7CisJcmVjdC0+bGVmdCA9IGNmZy0+eHBvczsKKwlyZWN0LT53aWR0aCA9IGNmZy0+eHNpemU7CisJcmVjdC0+aGVpZ2h0ID0gY2ZnLT55c2l6ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9jcm9wY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgICAgc3RydWN0IHY0bDJfY3JvcGNhcCAqY3JvcGNhcCkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwgIlZJRElPQ19DUk9QQ0FQIGlvY3RsXG4iKTsKKworCWNyb3BjYXAtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDsKKwljcm9wY2FwLT5ib3VuZHMubGVmdCA9IDA7CisJY3JvcGNhcC0+Ym91bmRzLnRvcCA9IDA7CisJY3JvcGNhcC0+Ym91bmRzLndpZHRoID0gdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy54cmVzOworCWNyb3BjYXAtPmJvdW5kcy5oZWlnaHQgPSB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnlyZXM7CisJY3JvcGNhcC0+cGl4ZWxhc3BlY3QgPSB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLmFzcGVjdDsKKwljcm9wY2FwLT5kZWZyZWN0ID0gY3JvcGNhcC0+Ym91bmRzOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9nX2ZtdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyID0gZmgtPmxheWVyOworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBmaC0+ZGlzcF9kZXYtPnZwYmVfZGV2OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkiVklESU9DX0dfRk1ULCBsYXllciBpZCA9ICVkXG4iLAorCQkJbGF5ZXItPmRldmljZV9pZCk7CisKKwkvKiBJZiBidWZmZXIgdHlwZSBpcyB2aWRlbyBvdXRwdXQgKi8KKwlpZiAoVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgIT0gZm10LT50eXBlKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsICJpbnZhbGlkIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogRmlsbCBpbiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgZm9ybWF0ICovCisJZm10LT5mbXQucGl4ID0gbGF5ZXItPnBpeF9mbXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfZW51bV9mbXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgICpwcml2LAorCQkJCSAgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmZtdCkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyID0gZmgtPmxheWVyOworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBmaC0+ZGlzcF9kZXYtPnZwYmVfZGV2OworCXVuc2lnbmVkIGludCBpbmRleCA9IDA7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCQkiVklESU9DX0VOVU1fRk1ULCBsYXllciBpZCA9ICVkXG4iLAorCQkJCWxheWVyLT5kZXZpY2VfaWQpOworCWlmIChmbXQtPmluZGV4ID4gMSkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiSW52YWxpZCBmb3JtYXQgaW5kZXhcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBGaWxsIGluIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBmb3JtYXQgKi8KKwlpbmRleCA9IGZtdC0+aW5kZXg7CisJbWVtc2V0KGZtdCwgMCwgc2l6ZW9mKCpmbXQpKTsKKwlmbXQtPmluZGV4ID0gaW5kZXg7CisJZm10LT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ7CisJaWYgKGluZGV4ID09IDApIHsKKwkJc3RyY3B5KGZtdC0+ZGVzY3JpcHRpb24sICJZVVYgNDoyOjIgLSBVWVZZIik7CisJCWZtdC0+cGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfVVlWWTsKKwl9IGVsc2UgeworCQlzdHJjcHkoZm10LT5kZXNjcmlwdGlvbiwgIlkvQ2JDciA0OjI6MCIpOworCQlmbXQtPnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX05WMTI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X3NfZm10KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcF9kZXYgPSBmaC0+ZGlzcF9kZXY7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGRpc3BfZGV2LT52cGJlX2RldjsKKwlzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyAqY2ZnICA9ICZsYXllci0+bGF5ZXJfaW5mby5jb25maWc7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4Zm10ID0gJmZtdC0+Zm10LnBpeDsKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2RfZGV2aWNlID0gZGlzcF9kZXYtPm9zZF9kZXZpY2U7CisJaW50IHJldDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJIlZJRElPQ19TX0ZNVCwgbGF5ZXIgaWQgPSAlZFxuIiwKKwkJCWxheWVyLT5kZXZpY2VfaWQpOworCisJLyogSWYgc3RyZWFtaW5nIGlzIHN0YXJ0ZWQsIHJldHVybiBlcnJvciAqLworCWlmIChsYXllci0+c3RhcnRlZCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiU3RyZWFtaW5nIGlzIHN0YXJ0ZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlpZiAoVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgIT0gZm10LT50eXBlKSB7CisJCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LCAiaW52YWxpZCB0eXBlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIENoZWNrIGZvciB2YWxpZCBwaXhlbCBmb3JtYXQgKi8KKwlyZXQgPSB2cGJlX3RyeV9mb3JtYXQoZGlzcF9kZXYsIHBpeGZtdCwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFlVVjQyMCBpcyByZXF1ZXN0ZWQsIGNoZWNrIGF2YWlsYWJpbGl0eSBvZiB0aGUKKwlvdGhlciB2aWRlbyB3aW5kb3cgKi8KKworCWxheWVyLT5waXhfZm10ID0gKnBpeGZtdDsKKworCS8qIEdldCBvc2QgbGF5ZXIgY29uZmlnICovCisJb3NkX2RldmljZS0+b3BzLmdldF9sYXllcl9jb25maWcob3NkX2RldmljZSwKKwkJCWxheWVyLT5sYXllcl9pbmZvLmlkLCBjZmcpOworCS8qIFN0b3JlIHRoZSBwaXhlbCBmb3JtYXQgaW4gdGhlIGxheWVyIG9iamVjdCAqLworCWNmZy0+eHNpemUgPSBwaXhmbXQtPndpZHRoOworCWNmZy0+eXNpemUgPSBwaXhmbXQtPmhlaWdodDsKKwljZmctPmxpbmVfbGVuZ3RoID0gcGl4Zm10LT5ieXRlc3BlcmxpbmU7CisJY2ZnLT55cG9zID0gMDsKKwljZmctPnhwb3MgPSAwOworCWNmZy0+aW50ZXJsYWNlZCA9IHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MuaW50ZXJsYWNlZDsKKworCWlmIChWNEwyX1BJWF9GTVRfVVlWWSA9PSBwaXhmbXQtPnBpeGVsZm9ybWF0KQorCQljZmctPnBpeGZtdCA9IFBJWEZNVF9ZQ2JDckk7CisKKwkvKiBDaGFuZ2Ugb2YgdGhlIGRlZmF1bHQgcGl4ZWwgZm9ybWF0IGZvciBib3RoIHZpZGVvIHdpbmRvd3MgKi8KKwlpZiAoVjRMMl9QSVhfRk1UX05WMTIgPT0gcGl4Zm10LT5waXhlbGZvcm1hdCkgeworCQlzdHJ1Y3QgdnBiZV9sYXllciAqb3RoZXJsYXllcjsKKwkJY2ZnLT5waXhmbXQgPSBQSVhGTVRfTlYxMjsKKwkJb3RoZXJsYXllciA9IF92cGJlX2Rpc3BsYXlfZ2V0X290aGVyX3dpbl9sYXllcihkaXNwX2RldiwKKwkJCQkJCQkJbGF5ZXIpOworCQlvdGhlcmxheWVyLT5sYXllcl9pbmZvLmNvbmZpZy5waXhmbXQgPSBQSVhGTVRfTlYxMjsKKwl9CisKKwkvKiBTZXQgdGhlIGxheWVyIGNvbmZpZyBpbiB0aGUgb3NkIHdpbmRvdyAqLworCXJldCA9IG9zZF9kZXZpY2UtPm9wcy5zZXRfbGF5ZXJfY29uZmlnKG9zZF9kZXZpY2UsCisJCQkJbGF5ZXItPmxheWVyX2luZm8uaWQsIGNmZyk7CisJaWYgKHJldCA8IDApIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCQkiRXJyb3IgaW4gU19GTVQgcGFyYW1zOlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFJlYWRiYWNrIGFuZCBmaWxsIHRoZSBsb2NhbCBjb3B5IG9mIGN1cnJlbnQgcGl4IGZvcm1hdCAqLworCW9zZF9kZXZpY2UtPm9wcy5nZXRfbGF5ZXJfY29uZmlnKG9zZF9kZXZpY2UsCisJCQlsYXllci0+bGF5ZXJfaW5mby5pZCwgY2ZnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV90cnlfZm10KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCSAgc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3BfZGV2ID0gZmgtPmRpc3BfZGV2OworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBmaC0+ZGlzcF9kZXYtPnZwYmVfZGV2OworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeGZtdCA9ICZmbXQtPmZtdC5waXg7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwgIlZJRElPQ19UUllfRk1UXG4iKTsKKworCWlmIChWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAhPSBmbXQtPnR5cGUpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgImludmFsaWQgdHlwZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENoZWNrIGZvciB2YWxpZCBmaWVsZCBmb3JtYXQgKi8KKwlyZXR1cm4gIHZwYmVfdHJ5X2Zvcm1hdChkaXNwX2RldiwgcGl4Zm10LCAwKTsKKworfQorCisvKioKKyAqIHZwYmVfZGlzcGxheV9zX3N0ZCAtIFNldCB0aGUgZ2l2ZW4gc3RhbmRhcmQgaW4gdGhlIGVuY29kZXIKKyAqCisgKiBTZXRzIHRoZSBzdGFuZGFyZCBpZiBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnQgZW5jb2Rlci4gUmV0dXJuIHRoZSBzdGF0dXMuCisgKiAwIC0gc3VjY2VzcyAmIC1FSU5WQUwgb24gZXJyb3IKKyAqLworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfc19zdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJdjRsMl9zdGRfaWQgKnN0ZF9pZCkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBwcml2OworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciA9IGZoLT5sYXllcjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKwlpbnQgcmV0OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsICJWSURJT0NfU19TVERcbiIpOworCisJLyogSWYgc3RyZWFtaW5nIGlzIHN0YXJ0ZWQsIHJldHVybiBlcnJvciAqLworCWlmIChsYXllci0+c3RhcnRlZCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiU3RyZWFtaW5nIGlzIHN0YXJ0ZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlpZiAoTlVMTCAhPSB2cGJlX2Rldi0+b3BzLnNfc3RkKSB7CisJCXJldCA9IHZwYmVfZGV2LT5vcHMuc19zdGQodnBiZV9kZXYsIHN0ZF9pZCk7CisJCWlmIChyZXQpIHsKKwkJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkiRmFpbGVkIHRvIHNldCBzdGFuZGFyZCBmb3Igc3ViIGRldmljZXNcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2cGJlX2Rpc3BsYXlfZ19zdGQgLSBHZXQgdGhlIHN0YW5kYXJkIGluIHRoZSBjdXJyZW50IGVuY29kZXIKKyAqCisgKiBHZXQgdGhlIHN0YW5kYXJkIGluIHRoZSBjdXJyZW50IGVuY29kZXIuIFJldHVybiB0aGUgc3RhdHVzLiAwIC0gc3VjY2VzcworICogLUVJTlZBTCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9nX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQl2NGwyX3N0ZF9pZCAqc3RkX2lkKQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwJIlZJRElPQ19HX1NURFxuIik7CisKKwkvKiBHZXQgdGhlIHN0YW5kYXJkIGZyb20gdGhlIGN1cnJlbnQgZW5jb2RlciAqLworCWlmICh2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnRpbWluZ3NfdHlwZSAmIFZQQkVfRU5DX1NURCkgeworCQkqc3RkX2lkID0gdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy50aW1pbmdzLnN0ZF9pZDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICogdnBiZV9kaXNwbGF5X2VudW1fb3V0cHV0IC0gZW51bWVyYXRlIG91dHB1dHMKKyAqCisgKiBFbnVtZXJhdGVzIHRoZSBvdXRwdXRzIGF2YWlsYWJsZSBhdCB0aGUgdnBiZSBkaXNwbGF5CisgKiByZXR1cm5zIHRoZSBzdGF0dXMsIC1FSU5WQUwgaWYgZW5kIG9mIG91dHB1dCBsaXN0CisgKi8KK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X2VudW1fb3V0cHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCSAgICBzdHJ1Y3QgdjRsMl9vdXRwdXQgKm91dHB1dCkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBwcml2OworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBmaC0+ZGlzcF9kZXYtPnZwYmVfZGV2OworCWludCByZXQ7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwJIlZJRElPQ19FTlVNX09VVFBVVFxuIik7CisKKwkvKiBFbnVtZXJhdGUgb3V0cHV0cyAqLworCisJaWYgKE5VTEwgPT0gdnBiZV9kZXYtPm9wcy5lbnVtX291dHB1dHMpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gdnBiZV9kZXYtPm9wcy5lbnVtX291dHB1dHModnBiZV9kZXYsIG91dHB1dCk7CisJaWYgKHJldCkgeworCQl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCSJGYWlsZWQgdG8gZW51bWVyYXRlIG91dHB1dHNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2cGJlX2Rpc3BsYXlfc19vdXRwdXQgLSBTZXQgb3V0cHV0IHRvCisgKiB0aGUgb3V0cHV0IHNwZWNpZmllZCBieSB0aGUgaW5kZXgKKyAqLworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfc19vdXRwdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJdW5zaWduZWQgaW50IGkpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisJaW50IHJldDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAkiVklESU9DX1NfT1VUUFVUXG4iKTsKKwkvKiBJZiBzdHJlYW1pbmcgaXMgc3RhcnRlZCwgcmV0dXJuIGVycm9yICovCisJaWYgKGxheWVyLT5zdGFydGVkKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsICJTdHJlYW1pbmcgaXMgc3RhcnRlZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmIChOVUxMID09IHZwYmVfZGV2LT5vcHMuc2V0X291dHB1dCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSB2cGJlX2Rldi0+b3BzLnNldF9vdXRwdXQodnBiZV9kZXYsIGkpOworCWlmIChyZXQpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCSJGYWlsZWQgdG8gc2V0IG91dHB1dCBmb3Igc3ViIGRldmljZXNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2cGJlX2Rpc3BsYXlfZ19vdXRwdXQgLSBHZXQgb3V0cHV0IGZyb20gc3ViZGV2aWNlCisgKiBmb3IgYSBnaXZlbiBieSB0aGUgaW5kZXgKKyAqLworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfZ19vdXRwdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJdW5zaWduZWQgaW50ICppKQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwgIlZJRElPQ19HX09VVFBVVFxuIik7CisJLyogR2V0IHRoZSBzdGFuZGFyZCBmcm9tIHRoZSBjdXJyZW50IGVuY29kZXIgKi8KKwkqaSA9IHZwYmVfZGV2LT5jdXJyZW50X291dF9pbmRleDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHZwYmVfZGlzcGxheV9lbnVtX2R2X3ByZXNldHMgLSBFbnVtZXJhdGUgdGhlIGR2IHByZXNldHMKKyAqCisgKiBlbnVtIHRoZSBwcmVzZXQgaW4gdGhlIGN1cnJlbnQgZW5jb2Rlci4gUmV0dXJuIHRoZSBzdGF0dXMuIDAgLSBzdWNjZXNzCisgKiAtRUlOVkFMIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQKK3ZwYmVfZGlzcGxheV9lbnVtX2R2X3ByZXNldHMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQlzdHJ1Y3QgdjRsMl9kdl9lbnVtX3ByZXNldCAqcHJlc2V0KQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisJaW50IHJldDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LCAiVklESU9DX0VOVU1fRFZfUFJFU0VUU1xuIik7CisKKwkvKiBFbnVtZXJhdGUgb3V0cHV0cyAqLworCWlmIChOVUxMID09IHZwYmVfZGV2LT5vcHMuZW51bV9kdl9wcmVzZXRzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHZwYmVfZGV2LT5vcHMuZW51bV9kdl9wcmVzZXRzKHZwYmVfZGV2LCBwcmVzZXQpOworCWlmIChyZXQpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCSJGYWlsZWQgdG8gZW51bWVyYXRlIGR2IHByZXNldHMgaW5mb1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHZwYmVfZGlzcGxheV9zX2R2X3ByZXNldCAtIFNldCB0aGUgZHYgcHJlc2V0cworICoKKyAqIFNldCB0aGUgcHJlc2V0IGluIHRoZSBjdXJyZW50IGVuY29kZXIuIFJldHVybiB0aGUgc3RhdHVzLiAwIC0gc3VjY2VzcworICogLUVJTlZBTCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50Cit2cGJlX2Rpc3BsYXlfc19kdl9wcmVzZXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfZHZfcHJlc2V0ICpwcmVzZXQpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisJaW50IHJldDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LCAiVklESU9DX1NfRFZfUFJFU0VUU1xuIik7CisKKworCS8qIElmIHN0cmVhbWluZyBpcyBzdGFydGVkLCByZXR1cm4gZXJyb3IgKi8KKwlpZiAobGF5ZXItPnN0YXJ0ZWQpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIlN0cmVhbWluZyBpcyBzdGFydGVkXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBTZXQgdGhlIGdpdmVuIHN0YW5kYXJkIGluIHRoZSBlbmNvZGVyICovCisJaWYgKE5VTEwgIT0gdnBiZV9kZXYtPm9wcy5zX2R2X3ByZXNldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSB2cGJlX2Rldi0+b3BzLnNfZHZfcHJlc2V0KHZwYmVfZGV2LCBwcmVzZXQpOworCWlmIChyZXQpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCSJGYWlsZWQgdG8gc2V0IHRoZSBkdiBwcmVzZXRzIGluZm9cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogc2V0IHRoZSBjdXJyZW50IG5vcm0gdG8gemVybyB0byBiZSBjb25zaXN0ZW50LiBJZiBTVEQgaXMgdXNlZAorCSAqIHY0bDIgbGF5ZXIgd2lsbCBzZXQgdGhlIG5vcm0gcHJvcGVybHkgb24gc3VjY2Vzc2Z1bCBzX3N0ZCBjYWxsCisJICovCisJbGF5ZXItPnZpZGVvX2Rldi5jdXJyZW50X25vcm0gPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdnBiZV9kaXNwbGF5X2dfZHZfcHJlc2V0IC0gU2V0IHRoZSBkdiBwcmVzZXRzCisgKgorICogR2V0IHRoZSBwcmVzZXQgaW4gdGhlIGN1cnJlbnQgZW5jb2Rlci4gUmV0dXJuIHRoZSBzdGF0dXMuIDAgLSBzdWNjZXNzCisgKiAtRUlOVkFMIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQKK3ZwYmVfZGlzcGxheV9nX2R2X3ByZXNldChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQgKmR2X3ByZXNldCkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBwcml2OworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBmaC0+ZGlzcF9kZXYtPnZwYmVfZGV2OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsICJWSURJT0NfR19EVl9QUkVTRVRTXG4iKTsKKworCS8qIEdldCB0aGUgZ2l2ZW4gc3RhbmRhcmQgaW4gdGhlIGVuY29kZXIgKi8KKworCWlmICh2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnRpbWluZ3NfdHlwZSAmCisJCQkJVlBCRV9FTkNfRFZfUFJFU0VUKSB7CisJCWR2X3ByZXNldC0+cHJlc2V0ID0KKwkJCXZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MudGltaW5ncy5kdl9wcmVzZXQ7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X3N0cmVhbW9mZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQllbnVtIHY0bDJfYnVmX3R5cGUgYnVmX3R5cGUpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciA9IGZoLT5sYXllcjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2RfZGV2aWNlID0gZmgtPmRpc3BfZGV2LT5vc2RfZGV2aWNlOworCWludCByZXQ7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCSJWSURJT0NfU1RSRUFNT0ZGLGxheWVyIGlkID0gJWRcbiIsCisJCQlsYXllci0+ZGV2aWNlX2lkKTsKKworCWlmIChWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAhPSBidWZfdHlwZSkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiSW52YWxpZCBidWZmZXIgdHlwZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIElmIGlvIGlzIGFsbG93ZWQgZm9yIHRoaXMgZmlsZSBoYW5kbGUsIHJldHVybiBlcnJvciAqLworCWlmICghZmgtPmlvX2FsbG93ZWQpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIk5vIGlvX2FsbG93ZWRcbiIpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwkvKiBJZiBzdHJlYW1pbmcgaXMgbm90IHN0YXJ0ZWQsIHJldHVybiBlcnJvciAqLworCWlmICghbGF5ZXItPnN0YXJ0ZWQpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgInN0cmVhbWluZyBub3Qgc3RhcnRlZCBpbiBsYXllciIKKwkJCSIgaWQgPSAlZFxuIiwgbGF5ZXItPmRldmljZV9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW9zZF9kZXZpY2UtPm9wcy5kaXNhYmxlX2xheWVyKG9zZF9kZXZpY2UsCisJCQlsYXllci0+bGF5ZXJfaW5mby5pZCk7CisJbGF5ZXItPnN0YXJ0ZWQgPSAwOworCXJldCA9IHZpZGVvYnVmX3N0cmVhbW9mZigmbGF5ZXItPmJ1ZmZlcl9xdWV1ZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9zdHJlYW1vbihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSBlbnVtIHY0bDJfYnVmX3R5cGUgYnVmX3R5cGUpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciA9IGZoLT5sYXllcjsKKwlzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiA9IGZoLT5kaXNwX2RldjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2RfZGV2aWNlID0gZGlzcF9kZXYtPm9zZF9kZXZpY2U7CisJaW50IHJldDsKKworCW9zZF9kZXZpY2UtPm9wcy5kaXNhYmxlX2xheWVyKG9zZF9kZXZpY2UsCisJCQlsYXllci0+bGF5ZXJfaW5mby5pZCk7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwgIlZJRElPQ19TVFJFQU1PTiwgbGF5ZXJpZD0lZFxuIiwKKwkJCQkJCWxheWVyLT5kZXZpY2VfaWQpOworCisJaWYgKFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUICE9IGJ1Zl90eXBlKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsICJJbnZhbGlkIGJ1ZmZlciB0eXBlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogSWYgZmlsZSBoYW5kbGUgaXMgbm90IGFsbG93ZWQgSU8sIHJldHVybiBlcnJvciAqLworCWlmICghZmgtPmlvX2FsbG93ZWQpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIk5vIGlvX2FsbG93ZWRcbiIpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisJLyogSWYgU3RyZWFtaW5nIGlzIGFscmVhZHkgc3RhcnRlZCwgcmV0dXJuIGVycm9yICovCisJaWYgKGxheWVyLT5zdGFydGVkKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsICJsYXllciBpcyBhbHJlYWR5IHN0cmVhbWluZ1xuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyoKKwkgKiBDYWxsIHZpZGVvYnVmX3N0cmVhbW9uIHRvIHN0YXJ0IHN0cmVhbWluZworCSAqIGluIHZpZGVvYnVmCisJICovCisJcmV0ID0gdmlkZW9idWZfc3RyZWFtb24oJmxheWVyLT5idWZmZXJfcXVldWUpOworCWlmIChyZXQpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJImVycm9yIGluIHZpZGVvYnVmX3N0cmVhbW9uXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJLyogSWYgYnVmZmVyIHF1ZXVlIGlzIGVtcHR5LCByZXR1cm4gZXJyb3IgKi8KKwlpZiAobGlzdF9lbXB0eSgmbGF5ZXItPmRtYV9xdWV1ZSkpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgImJ1ZmZlciBxdWV1ZSBpcyBlbXB0eVxuIik7CisJCWdvdG8gc3RyZWFtb2ZmOworCX0KKwkvKiBHZXQgdGhlIG5leHQgZnJhbWUgZnJvbSB0aGUgYnVmZmVyIHF1ZXVlICovCisJbGF5ZXItPm5leHRfZnJtID0gbGF5ZXItPmN1cl9mcm0gPSBsaXN0X2VudHJ5KGxheWVyLT5kbWFfcXVldWUubmV4dCwKKwkJCQlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyLCBxdWV1ZSk7CisJLyogUmVtb3ZlIGJ1ZmZlciBmcm9tIHRoZSBidWZmZXIgcXVldWUgKi8KKwlsaXN0X2RlbCgmbGF5ZXItPmN1cl9mcm0tPnF1ZXVlKTsKKwkvKiBNYXJrIHN0YXRlIG9mIHRoZSBjdXJyZW50IGZyYW1lIHRvIGFjdGl2ZSAqLworCWxheWVyLT5jdXJfZnJtLT5zdGF0ZSA9IFZJREVPQlVGX0FDVElWRTsKKwkvKiBJbml0aWFsaXplIGZpZWxkX2lkIGFuZCBzdGFydGVkIG1lbWJlciAqLworCWxheWVyLT5maWVsZF9pZCA9IDA7CisKKwkvKiBTZXQgcGFyYW1ldGVycyBpbiBPU0QgYW5kIFZFTkMgKi8KKwlyZXQgPSB2cGJlX3NldF9vc2RfZGlzcGxheV9wYXJhbXMoZGlzcF9kZXYsIGxheWVyKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBzdHJlYW1vZmY7CisKKwkvKgorCSAqIGlmIHJlcXVlc3QgZm9ybWF0IGlzIHl1djQyMCBzZW1pcGxhbmFyLCBuZWVkIHRvCisJICogZW5hYmxlIGJvdGggdmlkZW8gd2luZG93cworCSAqLworCWxheWVyLT5zdGFydGVkID0gMTsKKworCWxheWVyLT5sYXllcl9maXJzdF9pbnQgPSAxOworCisJcmV0dXJuIHJldDsKK3N0cmVhbW9mZjoKKwlyZXQgPSB2aWRlb2J1Zl9zdHJlYW1vZmYoJmxheWVyLT5idWZmZXJfcXVldWUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkgICAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyID0gZmgtPmxheWVyOworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBmaC0+ZGlzcF9kZXYtPnZwYmVfZGV2OworCWludCByZXQ7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJIlZJRElPQ19EUUJVRiwgbGF5ZXIgaWQgPSAlZFxuIiwKKwkJbGF5ZXItPmRldmljZV9pZCk7CisKKwlpZiAoVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgIT0gYnVmLT50eXBlKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsICJJbnZhbGlkIGJ1ZmZlciB0eXBlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIElmIHRoaXMgZmlsZSBoYW5kbGUgaXMgbm90IGFsbG93ZWQgdG8gZG8gSU8sIHJldHVybiBlcnJvciAqLworCWlmICghZmgtPmlvX2FsbG93ZWQpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIk5vIGlvX2FsbG93ZWRcbiIpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkvKiBDYWxsIHZpZGVvYnVmX2RxYnVmIGZvciBub24gYmxvY2tpbmcgbW9kZSAqLworCQlyZXQgPSB2aWRlb2J1Zl9kcWJ1ZigmbGF5ZXItPmJ1ZmZlcl9xdWV1ZSwgYnVmLCAxKTsKKwllbHNlCisJCS8qIENhbGwgdmlkZW9idWZfZHFidWYgZm9yIGJsb2NraW5nIG1vZGUgKi8KKwkJcmV0ID0gdmlkZW9idWZfZHFidWYoJmxheWVyLT5idWZmZXJfcXVldWUsIGJ1ZiwgMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9xYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkgICAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqcCkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyID0gZmgtPmxheWVyOworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBmaC0+ZGlzcF9kZXYtPnZwYmVfZGV2OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCSJWSURJT0NfUUJVRiwgbGF5ZXIgaWQgPSAlZFxuIiwKKwkJbGF5ZXItPmRldmljZV9pZCk7CisKKwlpZiAoVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgIT0gcC0+dHlwZSkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiSW52YWxpZCBidWZmZXIgdHlwZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIElmIHRoaXMgZmlsZSBoYW5kbGUgaXMgbm90IGFsbG93ZWQgdG8gZG8gSU8sIHJldHVybiBlcnJvciAqLworCWlmICghZmgtPmlvX2FsbG93ZWQpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIk5vIGlvX2FsbG93ZWRcbiIpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwlyZXR1cm4gdmlkZW9idWZfcWJ1ZigmbGF5ZXItPmJ1ZmZlcl9xdWV1ZSwgcCk7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisJaW50IHJldDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkiVklESU9DX1FVRVJZQlVGLCBsYXllciBpZCA9ICVkXG4iLAorCQlsYXllci0+ZGV2aWNlX2lkKTsKKworCWlmIChWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAhPSBidWYtPnR5cGUpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIkludmFsaWQgYnVmZmVyIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDYWxsIHZpZGVvYnVmX3F1ZXJ5YnVmIHRvIGdldCBpbmZvcm1hdGlvbiAqLworCXJldCA9IHZpZGVvYnVmX3F1ZXJ5YnVmKCZsYXllci0+YnVmZmVyX3F1ZXVlLCBidWYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCXN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyZXFfYnVmKQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisJaW50IHJldDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LCAidnBiZV9kaXNwbGF5X3JlcWJ1ZnNcbiIpOworCisJaWYgKFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUICE9IHJlcV9idWYtPnR5cGUpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIkludmFsaWQgYnVmZmVyIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJZiBpbyB1c2VycyBvZiB0aGUgbGF5ZXIgaXMgbm90IHplcm8sIHJldHVybiBlcnJvciAqLworCWlmICgwICE9IGxheWVyLT5pb191c3JzKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsICJub3QgSU8gdXNlclxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCS8qIEluaXRpYWxpemUgdmlkZW9idWYgcXVldWUgYXMgcGVyIHRoZSBidWZmZXIgdHlwZSAqLworCXZpZGVvYnVmX3F1ZXVlX2RtYV9jb250aWdfaW5pdCgmbGF5ZXItPmJ1ZmZlcl9xdWV1ZSwKKwkJCQkmdmlkZW9fcW9wcywKKwkJCQl2cGJlX2Rldi0+cGRldiwKKwkJCQkmbGF5ZXItPmlycWxvY2ssCisJCQkJVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQsCisJCQkJbGF5ZXItPnBpeF9mbXQuZmllbGQsCisJCQkJc2l6ZW9mKHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIpLAorCQkJCWZoLCBOVUxMKTsKKworCS8qIFNldCBpbyBhbGxvd2VkIG1lbWJlciBvZiBmaWxlIGhhbmRsZSB0byBUUlVFICovCisJZmgtPmlvX2FsbG93ZWQgPSAxOworCS8qIEluY3JlbWVudCBpbyB1c3JzIG1lbWJlciBvZiBsYXllciBvYmplY3QgdG8gMSAqLworCWxheWVyLT5pb191c3JzID0gMTsKKwkvKiBTdG9yZSB0eXBlIG9mIG1lbW9yeSByZXF1ZXN0ZWQgaW4gbGF5ZXIgb2JqZWN0ICovCisJbGF5ZXItPm1lbW9yeSA9IHJlcV9idWYtPm1lbW9yeTsKKwkvKiBJbml0aWFsaXplIGJ1ZmZlciBxdWV1ZSAqLworCUlOSVRfTElTVF9IRUFEKCZsYXllci0+ZG1hX3F1ZXVlKTsKKwkvKiBBbGxvY2F0ZSBidWZmZXJzICovCisJcmV0ID0gdmlkZW9idWZfcmVxYnVmcygmbGF5ZXItPmJ1ZmZlcl9xdWV1ZSwgcmVxX2J1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogdnBiZV9kaXNwbGF5X21tYXAoKQorICogSXQgaXMgdXNlZCB0byBtYXAga2VybmVsIHNwYWNlIGJ1ZmZlcnMgaW50byB1c2VyIHNwYWNlcworICovCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlcCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJLyogR2V0IHRoZSBsYXllciBvYmplY3QgYW5kIGZpbGUgaGFuZGxlIG9iamVjdCAqLworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGVwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyID0gZmgtPmxheWVyOworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBmaC0+ZGlzcF9kZXYtPnZwYmVfZGV2OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsICJ2cGJlX2Rpc3BsYXlfbW1hcFxuIik7CisKKwlyZXR1cm4gdmlkZW9idWZfbW1hcF9tYXBwZXIoJmxheWVyLT5idWZmZXJfcXVldWUsIHZtYSk7Cit9CisKKy8qIHZwYmVfZGlzcGxheV9wb2xsKCk6IEl0IGlzIHVzZWQgZm9yIHNlbGVjdC9wb2xsIHN5c3RlbSBjYWxsCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdnBiZV9kaXNwbGF5X3BvbGwoc3RydWN0IGZpbGUgKmZpbGVwLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGVwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyID0gZmgtPmxheWVyOworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBmaC0+ZGlzcF9kZXYtPnZwYmVfZGV2OworCXVuc2lnbmVkIGludCBlcnIgPSAwOworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsICJ2cGJlX2Rpc3BsYXlfcG9sbFxuIik7CisJaWYgKGxheWVyLT5zdGFydGVkKQorCQllcnIgPSB2aWRlb2J1Zl9wb2xsX3N0cmVhbShmaWxlcCwgJmxheWVyLT5idWZmZXJfcXVldWUsIHdhaXQpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiB2cGJlX2Rpc3BsYXlfb3BlbigpCisgKiBJdCBjcmVhdGVzIG9iamVjdCBvZiBmaWxlIGhhbmRsZSBzdHJ1Y3R1cmUgYW5kIHN0b3JlcyBpdCBpbiBwcml2YXRlX2RhdGEKKyAqIG1lbWJlciBvZiBmaWxlcG9pbnRlcgorICovCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IE5VTEw7CisJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiA9IGxheWVyLT5kaXNwX2RldjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZGlzcF9kZXYtPnZwYmVfZGV2OworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZF9kZXZpY2UgPSBkaXNwX2Rldi0+b3NkX2RldmljZTsKKwlpbnQgZXJyOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZmlsZSBoYW5kbGUgb2JqZWN0ICovCisJZmggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdnBiZV9maCksIEdGUF9LRVJORUwpOworCWlmIChmaCA9PSBOVUxMKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkidW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZmlsZSBoYW5kbGUgb2JqZWN0XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJInZwYmUgZGlzcGxheSBvcGVuIHBsYW5lID0gJWRcbiIsCisJCQlsYXllci0+ZGV2aWNlX2lkKTsKKworCS8qIHN0b3JlIHBvaW50ZXIgdG8gZmggaW4gcHJpdmF0ZV9kYXRhIG1lbWJlciBvZiBmaWxlcCAqLworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGZoOworCWZoLT5sYXllciA9IGxheWVyOworCWZoLT5kaXNwX2RldiA9IGRpc3BfZGV2OworCisJaWYgKCFsYXllci0+dXNycykgeworCisJCS8qIEZpcnN0IGNsYWltIHRoZSBsYXllciBmb3IgdGhpcyBkZXZpY2UgKi8KKwkJZXJyID0gb3NkX2RldmljZS0+b3BzLnJlcXVlc3RfbGF5ZXIob3NkX2RldmljZSwKKwkJCQkJCWxheWVyLT5sYXllcl9pbmZvLmlkKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCS8qIENvdWxkbid0IGdldCBsYXllciAqLworCQkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCQkiRGlzcGxheSBNYW5hZ2VyIGZhaWxlZCB0byBhbGxvY2F0ZSBsYXllclxuIik7CisJCQlrZnJlZShmaCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwkvKiBJbmNyZW1lbnQgbGF5ZXIgdXNycyBjb3VudGVyICovCisJbGF5ZXItPnVzcnMrKzsKKwkvKiBTZXQgaW9fYWxsb3dlZCBtZW1iZXIgdG8gZmFsc2UgKi8KKwlmaC0+aW9fYWxsb3dlZCA9IDA7CisJLyogSW5pdGlhbGl6ZSBwcmlvcml0eSBvZiB0aGlzIGluc3RhbmNlIHRvIGRlZmF1bHQgcHJpb3JpdHkgKi8KKwlmaC0+cHJpbyA9IFY0TDJfUFJJT1JJVFlfVU5TRVQ7CisJdjRsMl9wcmlvX29wZW4oJmxheWVyLT5wcmlvLCAmZmgtPnByaW8pOworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJInZwYmUgZGlzcGxheSBkZXZpY2Ugb3BlbmVkIHN1Y2Nlc3NmdWxseVxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB2cGJlX2Rpc3BsYXlfcmVsZWFzZSgpCisgKiBUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgYnVmZmVyIHF1ZXVlLCBmcmVlcyB0aGUgYnVmZmVycyBhbmQgdGhlIGRhdmluY2kKKyAqIGRpc3BsYXkgZmlsZSAqIGhhbmRsZQorICovCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIEdldCB0aGUgbGF5ZXIgb2JqZWN0IGFuZCBmaWxlIGhhbmRsZSBvYmplY3QgKi8KKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyID0gZmgtPmxheWVyOworCXN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnICpjZmcgID0gJmxheWVyLT5sYXllcl9pbmZvLmNvbmZpZzsKKwlzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiA9IGZoLT5kaXNwX2RldjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZGlzcF9kZXYtPnZwYmVfZGV2OworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZF9kZXZpY2UgPSBkaXNwX2Rldi0+b3NkX2RldmljZTsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LCAidnBiZV9kaXNwbGF5X3JlbGVhc2VcbiIpOworCisJLyogaWYgdGhpcyBpbnN0YW5jZSBpcyBkb2luZyBJTyAqLworCWlmIChmaC0+aW9fYWxsb3dlZCkgeworCQkvKiBSZXNldCBpb191c3JzIG1lbWJlciBvZiBsYXllciBvYmplY3QgKi8KKwkJbGF5ZXItPmlvX3VzcnMgPSAwOworCisJCW9zZF9kZXZpY2UtPm9wcy5kaXNhYmxlX2xheWVyKG9zZF9kZXZpY2UsCisJCQkJbGF5ZXItPmxheWVyX2luZm8uaWQpOworCQlsYXllci0+c3RhcnRlZCA9IDA7CisJCS8qIEZyZWUgYnVmZmVycyBhbGxvY2F0ZWQgKi8KKwkJdmlkZW9idWZfcXVldWVfY2FuY2VsKCZsYXllci0+YnVmZmVyX3F1ZXVlKTsKKwkJdmlkZW9idWZfbW1hcF9mcmVlKCZsYXllci0+YnVmZmVyX3F1ZXVlKTsKKwl9CisKKwkvKiBEZWNyZW1lbnQgbGF5ZXIgdXNycyBjb3VudGVyICovCisJbGF5ZXItPnVzcnMtLTsKKwkvKiBJZiB0aGlzIGZpbGUgaGFuZGxlIGhhcyBpbml0aWFsaXplIGVuY29kZXIgZGV2aWNlLCByZXNldCBpdCAqLworCWlmICghbGF5ZXItPnVzcnMpIHsKKwkJaWYgKGNmZy0+cGl4Zm10ID09IFBJWEZNVF9OVjEyKSB7CisJCQlzdHJ1Y3QgdnBiZV9sYXllciAqb3RoZXJsYXllcjsKKwkJCW90aGVybGF5ZXIgPQorCQkJX3ZwYmVfZGlzcGxheV9nZXRfb3RoZXJfd2luX2xheWVyKGRpc3BfZGV2LCBsYXllcik7CisJCQlvc2RfZGV2aWNlLT5vcHMuZGlzYWJsZV9sYXllcihvc2RfZGV2aWNlLAorCQkJCQlvdGhlcmxheWVyLT5sYXllcl9pbmZvLmlkKTsKKwkJCW9zZF9kZXZpY2UtPm9wcy5yZWxlYXNlX2xheWVyKG9zZF9kZXZpY2UsCisJCQkJCW90aGVybGF5ZXItPmxheWVyX2luZm8uaWQpOworCQl9CisJCW9zZF9kZXZpY2UtPm9wcy5kaXNhYmxlX2xheWVyKG9zZF9kZXZpY2UsCisJCQkJbGF5ZXItPmxheWVyX2luZm8uaWQpOworCQlvc2RfZGV2aWNlLT5vcHMucmVsZWFzZV9sYXllcihvc2RfZGV2aWNlLAorCQkJCWxheWVyLT5sYXllcl9pbmZvLmlkKTsKKwl9CisJLyogQ2xvc2UgdGhlIHByaW9yaXR5ICovCisJdjRsMl9wcmlvX2Nsb3NlKCZsYXllci0+cHJpbywgZmgtPnByaW8pOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisKKwkvKiBGcmVlIG1lbW9yeSBhbGxvY2F0ZWQgdG8gZmlsZSBoYW5kbGUgb2JqZWN0ICovCisJa2ZyZWUoZmgpOworCisJZGlzcF9kZXYtPmNiY3Jfb2ZzdCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X2dfcmVnaXN0ZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQlzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZykKK3sKKwlzdHJ1Y3QgdjRsMl9kYmdfbWF0Y2ggKm1hdGNoID0gJnJlZy0+bWF0Y2g7CisKKwlpZiAobWF0Y2gtPnR5cGUgPj0gMikgeworCQl2NGwyX3N1YmRldl9jYWxsKHZwYmVfZGV2LT52ZW5jLAorCQkJCSBjb3JlLAorCQkJCSBnX3JlZ2lzdGVyLAorCQkJCSByZWcpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9zX3JlZ2lzdGVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyogdnBiZSBjYXB0dXJlIGlvY3RsIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgdnBiZV9pb2N0bF9vcHMgPSB7CisJLnZpZGlvY19xdWVyeWNhcAkgPSB2cGJlX2Rpc3BsYXlfcXVlcnljYXAsCisJLnZpZGlvY19nX2ZtdF92aWRfb3V0ICAgID0gdnBiZV9kaXNwbGF5X2dfZm10LAorCS52aWRpb2NfZW51bV9mbXRfdmlkX291dCA9IHZwYmVfZGlzcGxheV9lbnVtX2ZtdCwKKwkudmlkaW9jX3NfZm10X3ZpZF9vdXQgICAgPSB2cGJlX2Rpc3BsYXlfc19mbXQsCisJLnZpZGlvY190cnlfZm10X3ZpZF9vdXQgID0gdnBiZV9kaXNwbGF5X3RyeV9mbXQsCisJLnZpZGlvY19yZXFidWZzCQkgPSB2cGJlX2Rpc3BsYXlfcmVxYnVmcywKKwkudmlkaW9jX3F1ZXJ5YnVmCSA9IHZwYmVfZGlzcGxheV9xdWVyeWJ1ZiwKKwkudmlkaW9jX3FidWYJCSA9IHZwYmVfZGlzcGxheV9xYnVmLAorCS52aWRpb2NfZHFidWYJCSA9IHZwYmVfZGlzcGxheV9kcWJ1ZiwKKwkudmlkaW9jX3N0cmVhbW9uCSA9IHZwYmVfZGlzcGxheV9zdHJlYW1vbiwKKwkudmlkaW9jX3N0cmVhbW9mZgkgPSB2cGJlX2Rpc3BsYXlfc3RyZWFtb2ZmLAorCS52aWRpb2NfY3JvcGNhcAkJID0gdnBiZV9kaXNwbGF5X2Nyb3BjYXAsCisJLnZpZGlvY19nX2Nyb3AJCSA9IHZwYmVfZGlzcGxheV9nX2Nyb3AsCisJLnZpZGlvY19zX2Nyb3AJCSA9IHZwYmVfZGlzcGxheV9zX2Nyb3AsCisJLnZpZGlvY19nX3ByaW9yaXR5CSA9IHZwYmVfZGlzcGxheV9nX3ByaW9yaXR5LAorCS52aWRpb2Nfc19wcmlvcml0eQkgPSB2cGJlX2Rpc3BsYXlfc19wcmlvcml0eSwKKwkudmlkaW9jX3Nfc3RkCQkgPSB2cGJlX2Rpc3BsYXlfc19zdGQsCisJLnZpZGlvY19nX3N0ZAkJID0gdnBiZV9kaXNwbGF5X2dfc3RkLAorCS52aWRpb2NfZW51bV9vdXRwdXQJID0gdnBiZV9kaXNwbGF5X2VudW1fb3V0cHV0LAorCS52aWRpb2Nfc19vdXRwdXQJID0gdnBiZV9kaXNwbGF5X3Nfb3V0cHV0LAorCS52aWRpb2NfZ19vdXRwdXQJID0gdnBiZV9kaXNwbGF5X2dfb3V0cHV0LAorCS52aWRpb2Nfc19kdl9wcmVzZXQJID0gdnBiZV9kaXNwbGF5X3NfZHZfcHJlc2V0LAorCS52aWRpb2NfZ19kdl9wcmVzZXQJID0gdnBiZV9kaXNwbGF5X2dfZHZfcHJlc2V0LAorCS52aWRpb2NfZW51bV9kdl9wcmVzZXRzCSA9IHZwYmVfZGlzcGxheV9lbnVtX2R2X3ByZXNldHMsCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworCS52aWRpb2NfZ19yZWdpc3RlcgkgPSB2cGJlX2Rpc3BsYXlfZ19yZWdpc3RlciwKKwkudmlkaW9jX3NfcmVnaXN0ZXIJID0gdnBiZV9kaXNwbGF5X3NfcmVnaXN0ZXIsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgdnBiZV9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gdnBiZV9kaXNwbGF5X29wZW4sCisJLnJlbGVhc2UgPSB2cGJlX2Rpc3BsYXlfcmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwgPSB2aWRlb19pb2N0bDIsCisJLm1tYXAgPSB2cGJlX2Rpc3BsYXlfbW1hcCwKKwkucG9sbCA9IHZwYmVfZGlzcGxheV9wb2xsCit9OworCitzdGF0aWMgaW50IHZwYmVfZGV2aWNlX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCB2cGJlX2Rpc3BsYXkgKnZwYmVfZGlzcCAgPSBkYXRhOworCisJaWYgKHN0cmNtcCgidnBiZV9jb250cm9sbGVyIiwgcGRldi0+bmFtZSkgPT0gMCkKKwkJdnBiZV9kaXNwLT52cGJlX2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKHN0cmNtcCgidnBiZS1vc2QiLCBwZGV2LT5uYW1lKSA9PSAwKQorCQl2cGJlX2Rpc3AtPm9zZF9kZXZpY2UgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19kZXZpbml0IGludCBpbml0X3ZwYmVfbGF5ZXIoaW50IGksIHN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3BfZGV2LAorCQkJCSAgICAgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdnBiZV9sYXllciAqdnBiZV9kaXNwbGF5X2xheWVyID0gTlVMTDsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2YmQgPSBOVUxMOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBmb3VyIHBsYW5lIGRpc3BsYXkgb2JqZWN0cyAqLworCisJZGlzcF9kZXYtPmRldltpXSA9CisJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2cGJlX2xheWVyKSwgR0ZQX0tFUk5FTCk7CisKKwkvKiBJZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscywgcmV0dXJuIGVycm9yICovCisJaWYgKCFkaXNwX2Rldi0+ZGV2W2ldKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmFuIG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gIC1FTk9NRU07CisJfQorCXNwaW5fbG9ja19pbml0KCZkaXNwX2Rldi0+ZGV2W2ldLT5pcnFsb2NrKTsKKwltdXRleF9pbml0KCZkaXNwX2Rldi0+ZGV2W2ldLT5vcHNsb2NrKTsKKworCS8qIEdldCB0aGUgcG9pbnRlciB0byB0aGUgbGF5ZXIgb2JqZWN0ICovCisJdnBiZV9kaXNwbGF5X2xheWVyID0gZGlzcF9kZXYtPmRldltpXTsKKwl2YmQgPSAmdnBiZV9kaXNwbGF5X2xheWVyLT52aWRlb19kZXY7CisJLyogSW5pdGlhbGl6ZSBmaWVsZCBvZiB2aWRlbyBkZXZpY2UgKi8KKwl2YmQtPnJlbGVhc2UJPSB2aWRlb19kZXZpY2VfcmVsZWFzZV9lbXB0eTsKKwl2YmQtPmZvcHMJPSAmdnBiZV9mb3BzOworCXZiZC0+aW9jdGxfb3BzCT0gJnZwYmVfaW9jdGxfb3BzOworCXZiZC0+bWlub3IJPSAtMTsKKwl2YmQtPnY0bDJfZGV2ICAgPSAmZGlzcF9kZXYtPnZwYmVfZGV2LT52NGwyX2RldjsKKwl2YmQtPmxvY2sJPSAmdnBiZV9kaXNwbGF5X2xheWVyLT5vcHNsb2NrOworCisJaWYgKGRpc3BfZGV2LT52cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnRpbWluZ3NfdHlwZSAmCisJCQlWUEJFX0VOQ19TVEQpIHsKKwkJdmJkLT50dm5vcm1zID0gKFY0TDJfU1REXzUyNV82MCB8IFY0TDJfU1REXzYyNV81MCk7CisJCXZiZC0+Y3VycmVudF9ub3JtID0KKwkJCWRpc3BfZGV2LT52cGJlX2Rldi0+CisJCQljdXJyZW50X3RpbWluZ3MudGltaW5ncy5zdGRfaWQ7CisJfSBlbHNlCisJCXZiZC0+Y3VycmVudF9ub3JtID0gMDsKKworCXNucHJpbnRmKHZiZC0+bmFtZSwgc2l6ZW9mKHZiZC0+bmFtZSksCisJCQkiRGFWaW5jaV9WUEJFIERpc3BsYXlfRFJJVkVSX1YlZC4lZC4lZCIsCisJCQkoVlBCRV9ESVNQTEFZX1ZFUlNJT05fQ09ERSA+PiAxNikgJiAweGZmLAorCQkJKFZQQkVfRElTUExBWV9WRVJTSU9OX0NPREUgPj4gOCkgJiAweGZmLAorCQkJKFZQQkVfRElTUExBWV9WRVJTSU9OX0NPREUpICYgMHhmZik7CisKKwl2cGJlX2Rpc3BsYXlfbGF5ZXItPmRldmljZV9pZCA9IGk7CisKKwl2cGJlX2Rpc3BsYXlfbGF5ZXItPmxheWVyX2luZm8uaWQgPQorCQkoKGkgPT0gVlBCRV9ESVNQTEFZX0RFVklDRV8wKSA/IFdJTl9WSUQwIDogV0lOX1ZJRDEpOworCisJLyogSW5pdGlhbGl6ZSBwcmlvIG1lbWJlciBvZiBsYXllciBvYmplY3QgKi8KKwl2NGwyX3ByaW9faW5pdCgmdnBiZV9kaXNwbGF5X2xheWVyLT5wcmlvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19kZXZpbml0IGludCByZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHZwYmVfbGF5ZXIgKnZwYmVfZGlzcGxheV9sYXllciwKKwkJCQkJc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcF9kZXYsCisJCQkJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpIHsKKwlpbnQgZXJyOworCisJdjRsMl9pbmZvKCZkaXNwX2Rldi0+dnBiZV9kZXYtPnY0bDJfZGV2LAorCQkgICJUcnlpbmcgdG8gcmVnaXN0ZXIgVlBCRSBkaXNwbGF5IGRldmljZS5cbiIpOworCXY0bDJfaW5mbygmZGlzcF9kZXYtPnZwYmVfZGV2LT52NGwyX2RldiwKKwkJICAibGF5ZXI9JXgsbGF5ZXItPnZpZGVvX2Rldj0leFxuIiwKKwkJICAoaW50KXZwYmVfZGlzcGxheV9sYXllciwKKwkJICAoaW50KSZ2cGJlX2Rpc3BsYXlfbGF5ZXItPnZpZGVvX2Rldik7CisKKwllcnIgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJnZwYmVfZGlzcGxheV9sYXllci0+dmlkZW9fZGV2LAorCQkJCSAgICBWRkxfVFlQRV9HUkFCQkVSLAorCQkJCSAgICAtMSk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl2cGJlX2Rpc3BsYXlfbGF5ZXItPmRpc3BfZGV2ID0gZGlzcF9kZXY7CisJLyogc2V0IHRoZSBkcml2ZXIgZGF0YSBpbiBwbGF0Zm9ybSBkZXZpY2UgKi8KKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkaXNwX2Rldik7CisJdmlkZW9fc2V0X2RydmRhdGEoJnZwYmVfZGlzcGxheV9sYXllci0+dmlkZW9fZGV2LAorCQkJICB2cGJlX2Rpc3BsYXlfbGF5ZXIpOworCisJcmV0dXJuIDA7Cit9CisKKworCisvKgorICogdnBiZV9kaXNwbGF5X3Byb2JlKCkKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBkZXZpY2UgZW50cmllcyBieSByZWdpc3RlciBpdHNlbGYgdG8gdGhlIFY0TDIgZHJpdmVyCisgKiBhbmQgaW5pdGlhbGl6ZXMgZmllbGRzIG9mIGVhY2ggbGF5ZXIgb2JqZWN0cworICovCitzdGF0aWMgX19kZXZpbml0IGludCB2cGJlX2Rpc3BsYXlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdnBiZV9sYXllciAqdnBiZV9kaXNwbGF5X2xheWVyOworCXN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3BfZGV2OworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gTlVMTDsKKwlpbnQgazsKKwlpbnQgaTsKKwlpbnQgZXJyOworCWludCBpcnE7CisKKwlwcmludGsoS0VSTl9ERUJVRyAidnBiZV9kaXNwbGF5X3Byb2JlXG4iKTsKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHZwYmVfZGlzcGxheSAqLworCWRpc3BfZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZwYmVfZGlzcGxheSksIEdGUF9LRVJORUwpOworCWlmICghZGlzcF9kZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyYW4gb3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNwaW5fbG9ja19pbml0KCZkaXNwX2Rldi0+ZG1hX3F1ZXVlX2xvY2spOworCS8qCisJICogU2NhbiBhbGwgdGhlIHBsYXRmb3JtIGRldmljZXMgdG8gZmluZCB0aGUgdnBiZQorCSAqIGNvbnRyb2xsZXIgZGV2aWNlIGFuZCBnZXQgdGhlIHZwYmVfZGV2IG9iamVjdAorCSAqLworCWVyciA9IGJ1c19mb3JfZWFjaF9kZXYoJnBsYXRmb3JtX2J1c190eXBlLCBOVUxMLCBkaXNwX2RldiwKKwkJCXZwYmVfZGV2aWNlX2dldCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJLyogSW5pdGlhbGl6ZSB0aGUgdnBiZSBkaXNwbGF5IGNvbnRyb2xsZXIgKi8KKwlpZiAoTlVMTCAhPSBkaXNwX2Rldi0+dnBiZV9kZXYtPm9wcy5pbml0aWFsaXplKSB7CisJCWVyciA9IGRpc3BfZGV2LT52cGJlX2Rldi0+b3BzLmluaXRpYWxpemUoJnBkZXYtPmRldiwKKwkJCQkJCQkgZGlzcF9kZXYtPnZwYmVfZGV2KTsKKwkJaWYgKGVycikgeworCQkJdjRsMl9lcnIoJmRpc3BfZGV2LT52cGJlX2Rldi0+djRsMl9kZXYsCisJCQkJCSJFcnJvciBpbml0aW5nIHZwYmVcbiIpOworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gcHJvYmVfb3V0OworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IFZQQkVfRElTUExBWV9NQVhfREVWSUNFUzsgaSsrKSB7CisJCWlmIChpbml0X3ZwYmVfbGF5ZXIoaSwgZGlzcF9kZXYsIHBkZXYpKSB7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBwcm9iZV9vdXQ7CisJCX0KKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOworCWlmICghcmVzKSB7CisJCXY0bDJfZXJyKCZkaXNwX2Rldi0+dnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJICJVbmFibGUgdG8gZ2V0IFZFTkMgaW50ZXJydXB0IHJlc291cmNlXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBwcm9iZV9vdXQ7CisJfQorCisJaXJxID0gcmVzLT5zdGFydDsKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCB2ZW5jX2lzciwgIElSUUZfRElTQUJMRUQsIFZQQkVfRElTUExBWV9EUklWRVIsCisJCWRpc3BfZGV2KSkgeworCQl2NGwyX2VycigmZGlzcF9kZXYtPnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCQkiVW5hYmxlIHRvIHJlcXVlc3QgaW50ZXJydXB0XG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBwcm9iZV9vdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFZQQkVfRElTUExBWV9NQVhfREVWSUNFUzsgaSsrKSB7CisJCWlmIChyZWdpc3Rlcl9kZXZpY2UoZGlzcF9kZXYtPmRldltpXSwgZGlzcF9kZXYsIHBkZXYpKSB7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBwcm9iZV9vdXQ7CisJCX0KKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAiU3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCB0aGUgcHJvYmluZyBvZiB2cGJlIHY0bDIgZGV2aWNlXG4iKTsKKwlyZXR1cm4gMDsKKworcHJvYmVfb3V0OgorCWZyZWVfaXJxKHJlcy0+c3RhcnQsIGRpc3BfZGV2KTsKKwlmb3IgKGsgPSAwOyBrIDwgVlBCRV9ESVNQTEFZX01BWF9ERVZJQ0VTOyBrKyspIHsKKwkJLyogR2V0IHRoZSBwb2ludGVyIHRvIHRoZSBsYXllciBvYmplY3QgKi8KKwkJdnBiZV9kaXNwbGF5X2xheWVyID0gZGlzcF9kZXYtPmRldltrXTsKKwkJLyogVW5yZWdpc3RlciB2aWRlbyBkZXZpY2UgKi8KKwkJaWYgKHZwYmVfZGlzcGxheV9sYXllcikgeworCQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoCisJCQkJJnZwYmVfZGlzcGxheV9sYXllci0+dmlkZW9fZGV2KTsKKwkJCQlrZnJlZShkaXNwX2Rldi0+ZGV2W2tdKTsKKwkJfQorCX0KKwlrZnJlZShkaXNwX2Rldik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIHZwYmVfZGlzcGxheV9yZW1vdmUoKQorICogSXQgdW4tcmVnaXN0ZXIgaGFyZHdhcmUgbGF5ZXIgZnJvbSBWNEwyIGRyaXZlcgorICovCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdnBiZV9sYXllciAqdnBiZV9kaXNwbGF5X2xheWVyOworCXN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3BfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGRpc3BfZGV2LT52cGJlX2RldjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaTsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LCAidnBiZV9kaXNwbGF5X3JlbW92ZVxuIik7CisKKwkvKiB1bnJlZ2lzdGVyIGlycSAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMCk7CisJZnJlZV9pcnEocmVzLT5zdGFydCwgZGlzcF9kZXYpOworCisJLyogZGVpbml0aWFsaXplIHRoZSB2cGJlIGRpc3BsYXkgY29udHJvbGxlciAqLworCWlmIChOVUxMICE9IHZwYmVfZGV2LT5vcHMuZGVpbml0aWFsaXplKQorCQl2cGJlX2Rldi0+b3BzLmRlaW5pdGlhbGl6ZSgmcGRldi0+ZGV2LCB2cGJlX2Rldik7CisJLyogdW4tcmVnaXN0ZXIgZGV2aWNlICovCisJZm9yIChpID0gMDsgaSA8IFZQQkVfRElTUExBWV9NQVhfREVWSUNFUzsgaSsrKSB7CisJCS8qIEdldCB0aGUgcG9pbnRlciB0byB0aGUgbGF5ZXIgb2JqZWN0ICovCisJCXZwYmVfZGlzcGxheV9sYXllciA9IGRpc3BfZGV2LT5kZXZbaV07CisJCS8qIFVucmVnaXN0ZXIgdmlkZW8gZGV2aWNlICovCisJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZ2cGJlX2Rpc3BsYXlfbGF5ZXItPnZpZGVvX2Rldik7CisKKwl9CisJZm9yIChpID0gMDsgaSA8IFZQQkVfRElTUExBWV9NQVhfREVWSUNFUzsgaSsrKSB7CisJCWtmcmVlKGRpc3BfZGV2LT5kZXZbaV0pOworCQlkaXNwX2Rldi0+ZGV2W2ldID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdnBiZV9kaXNwbGF5X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IFZQQkVfRElTUExBWV9EUklWRVIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkuYnVzID0gJnBsYXRmb3JtX2J1c190eXBlLAorCX0sCisJLnByb2JlID0gdnBiZV9kaXNwbGF5X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh2cGJlX2Rpc3BsYXlfcmVtb3ZlKSwKK307CisKKy8qCisgKiB2cGJlX2Rpc3BsYXlfaW5pdCgpCisgKiBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyBkZXZpY2UgYW5kIGRyaXZlciB0byB0aGUga2VybmVsLCByZXF1ZXN0cyBpcnEKKyAqIGhhbmRsZXIgYW5kIGFsbG9jYXRlcyBtZW1vcnkgZm9yIGxheWVyIG9iamVjdHMKKyAqLworc3RhdGljIF9fZGV2aW5pdCBpbnQgdnBiZV9kaXNwbGF5X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJcHJpbnRrKEtFUk5fREVCVUcgInZwYmVfZGlzcGxheV9pbml0XG4iKTsKKworCS8qIFJlZ2lzdGVyIGRyaXZlciB0byB0aGUga2VybmVsICovCisJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ2cGJlX2Rpc3BsYXlfZHJpdmVyKTsKKwlpZiAoMCAhPSBlcnIpCisJCXJldHVybiBlcnI7CisKKwlwcmludGsoS0VSTl9ERUJVRyAidnBiZV9kaXNwbGF5X2luaXQ6IgorCQkJIlZQQkUgVjRMMiBEaXNwbGF5IERyaXZlciBWMS4wIGxvYWRlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB2cGJlX2Rpc3BsYXlfY2xlYW51cCgpCisgKiBUaGlzIGZ1bmN0aW9uIHVuLXJlZ2lzdGVycyBkZXZpY2UgYW5kIGRyaXZlciB0byB0aGUga2VybmVsLCBmcmVlcyByZXF1ZXN0ZWQKKyAqIGlycSBoYW5kbGVyIGFuZCBkZS1hbGxvY2F0ZXMgbWVtb3J5IGFsbG9jYXRlZCBmb3IgbGF5ZXIgb2JqZWN0cy4KKyAqLworc3RhdGljIHZvaWQgdnBiZV9kaXNwbGF5X2NsZWFudXAodm9pZCkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAidnBiZV9kaXNwbGF5X2NsZWFudXBcbiIpOworCisJLyogcGxhdGZvcm0gZHJpdmVyIHVucmVnaXN0ZXIgKi8KKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdnBiZV9kaXNwbGF5X2RyaXZlcik7Cit9CisKKy8qIEZ1bmN0aW9uIGZvciBtb2R1bGUgaW5pdGlhbGl6YXRpb24gYW5kIGNsZWFudXAgKi8KK21vZHVsZV9pbml0KHZwYmVfZGlzcGxheV9pbml0KTsKK21vZHVsZV9leGl0KHZwYmVfZGlzcGxheV9jbGVhbnVwKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJUSSBETTY0NHgvRE0zNTUvRE0zNjUgVlBCRSBEaXNwbGF5IGNvbnRyb2xsZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlRleGFzIEluc3RydW1lbnRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV9vc2QuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX29zZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNTI4ODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV9vc2QuYwpAQCAtMCwwICsxLDEyMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBUZXhhcyBJbnN0cnVtZW50cyBJbmMKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogQW5keSBMb3dlIChhbG93ZUBtdmlzdGEuY29tKSwgTW9udGFWaXN0YSBTb2Z0d2FyZQorICogLSBJbml0aWFsIHZlcnNpb24KKyAqIE11cmFsaSBLYXJpY2hlcmkgKG1rYXJpY2hlcmlAZ21haWwuY29tKSwgVGV4YXMgSW5zdHJ1bWVudHMgTHRkLgorICogLSBwb3J0ZWQgdG8gc3ViIGRldmljZSBpbnRlcmZhY2UKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bWFjaC9pby5oPgorI2luY2x1ZGUgPG1hY2gvY3B1dHlwZS5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKworI2luY2x1ZGUgPG1lZGlhL2RhdmluY2kvdnBzcy5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cGJlX3R5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cGJlX29zZC5oPgorCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlICJ2cGJlX29zZF9yZWdzLmgiCisKKyNkZWZpbmUgTU9EVUxFX05BTUUJVlBCRV9PU0RfU1VCREVWX05BTUUKKworLyogcmVnaXN0ZXIgYWNjZXNzIHJvdXRpbmVzICovCitzdGF0aWMgaW5saW5lIHUzMiBvc2RfcmVhZChzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgdTMyIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2QgPSBzZDsKKworCXJldHVybiByZWFkbChvc2QtPm9zZF9iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgb3NkX3dyaXRlKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCB1MzIgdmFsLCB1MzIgb2Zmc2V0KQoreworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZCA9IHNkOworCisJd3JpdGVsKHZhbCwgb3NkLT5vc2RfYmFzZSArIG9mZnNldCk7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBvc2Rfc2V0KHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCB1MzIgbWFzaywgdTMyIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2QgPSBzZDsKKworCXUzMiBhZGRyID0gb3NkLT5vc2RfYmFzZSArIG9mZnNldDsKKwl1MzIgdmFsID0gcmVhZGwoYWRkcikgfCBtYXNrOworCisJd3JpdGVsKHZhbCwgYWRkcik7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBvc2RfY2xlYXIoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIHUzMiBtYXNrLCB1MzIgb2Zmc2V0KQoreworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZCA9IHNkOworCisJdTMyIGFkZHIgPSBvc2QtPm9zZF9iYXNlICsgb2Zmc2V0OworCXUzMiB2YWwgPSByZWFkbChhZGRyKSAmIH5tYXNrOworCisJd3JpdGVsKHZhbCwgYWRkcik7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBvc2RfbW9kaWZ5KHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCB1MzIgbWFzaywgdTMyIHZhbCwKKwkJCQkgdTMyIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2QgPSBzZDsKKworCXUzMiBhZGRyID0gb3NkLT5vc2RfYmFzZSArIG9mZnNldDsKKwl1MzIgbmV3X3ZhbCA9IChyZWFkbChhZGRyKSAmIH5tYXNrKSB8ICh2YWwgJiBtYXNrKTsKKworCXdyaXRlbChuZXdfdmFsLCBhZGRyKTsKKworCXJldHVybiBuZXdfdmFsOworfQorCisvKiBkZWZpbmUgc29tZSBtYWNyb3MgZm9yIGxheWVyIGFuZCBwaXhmbXQgY2xhc3NpZmljYXRpb24gKi8KKyNkZWZpbmUgaXNfb3NkX3dpbihsYXllcikgKCgobGF5ZXIpID09IFdJTl9PU0QwKSB8fCAoKGxheWVyKSA9PSBXSU5fT1NEMSkpCisjZGVmaW5lIGlzX3ZpZF93aW4obGF5ZXIpICgoKGxheWVyKSA9PSBXSU5fVklEMCkgfHwgKChsYXllcikgPT0gV0lOX1ZJRDEpKQorI2RlZmluZSBpc19yZ2JfcGl4Zm10KHBpeGZtdCkgXAorCSgoKHBpeGZtdCkgPT0gUElYRk1UX1JHQjU2NSkgfHwgKChwaXhmbXQpID09IFBJWEZNVF9SR0I4ODgpKQorI2RlZmluZSBpc195Y19waXhmbXQocGl4Zm10KSBcCisJKCgocGl4Zm10KSA9PSBQSVhGTVRfWUNiQ3JJKSB8fCAoKHBpeGZtdCkgPT0gUElYRk1UX1lDckNiSSkgfHwgXAorCSgocGl4Zm10KSA9PSBQSVhGTVRfTlYxMikpCisjZGVmaW5lIE1BWF9XSU5fU0laRSBPU0RfVklEV0lOMFhQX1YwWAorI2RlZmluZSBNQVhfTElORV9MRU5HVEggKE9TRF9WSURXSU4wT0ZTVF9WMExPIDw8IDUpCisKKy8qKgorICogX29zZF9kbTY0NDZfdmlkMF9waW5ncG9uZygpIC0gZmllbGQgaW52ZXJzaW9uIGZpeCBmb3IgRE02NDQ2CisgKiBAc2QgLSBwdHIgdG8gc3RydWN0IG9zZF9zdGF0ZQorICogQGZpZWxkX2ludmVyc2lvbiAtIGludmVyc2lvbiBmbGFnCisgKiBAZmJfYmFzZV9waHlzIC0gZnJhbWUgYnVmZmVyIGFkZHJlc3MKKyAqIEBsY29uZmlnIC0gcHRyIHRvIGxheWVyIGNvbmZpZworICoKKyAqIFRoaXMgcm91dGluZSBpbXBsZW1lbnRzIGEgd29ya2Fyb3VuZCBmb3IgdGhlIGZpZWxkIHNpZ25hbCBpbnZlcnNpb24gc2lsaWNvbgorICogZXJyYXR1bSBkZXNjcmliZWQgaW4gQWR2aXNvcnkgMS4zLjggZm9yIHRoZSBETTY0NDYuICBUaGUgZmJfYmFzZV9waHlzIGFuZAorICogbGNvbmZpZyBwYXJhbWV0ZXJzIGFwcGx5IHRvIHRoZSB2aWQwIHdpbmRvdy4gIFRoaXMgcm91dGluZSBzaG91bGQgYmUgY2FsbGVkCisgKiB3aGVuZXZlciB0aGUgdmlkMCBsYXllciBjb25maWd1cmF0aW9uIG9yIHN0YXJ0IGFkZHJlc3MgaXMgbW9kaWZpZWQsIG9yIHdoZW4KKyAqIHRoZSBPU0QgZmllbGQgaW52ZXJzaW9uIHNldHRpbmcgaXMgbW9kaWZpZWQuCisgKiBSZXR1cm5zOiAxIGlmIHRoZSBwaW5nLXBvbmcgYnVmZmVycyBuZWVkIHRvIGJlIHRvZ2dsZWQgaW4gdGhlIHZzeW5jIGlzciwgb3IKKyAqICAgICAgICAgIDAgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgX29zZF9kbTY0NDZfdmlkMF9waW5ncG9uZyhzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwKKwkJCQkgICAgIGludCBmaWVsZF9pbnZlcnNpb24sCisJCQkJICAgICB1bnNpZ25lZCBsb25nIGZiX2Jhc2VfcGh5cywKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnICpsY29uZmlnKQoreworCXN0cnVjdCBvc2RfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisKKwlwZGF0YSA9IChzdHJ1Y3Qgb3NkX3BsYXRmb3JtX2RhdGEgKilzZC0+ZGV2LT5wbGF0Zm9ybV9kYXRhOworCWlmIChwZGF0YS0+ZmllbGRfaW52X3dhX2VuYWJsZSkgeworCisJCWlmICghZmllbGRfaW52ZXJzaW9uIHx8ICFsY29uZmlnLT5pbnRlcmxhY2VkKSB7CisJCQlvc2Rfd3JpdGUoc2QsIGZiX2Jhc2VfcGh5cyAmIH4weDFGLCBPU0RfVklEV0lOMEFEUik7CisJCQlvc2Rfd3JpdGUoc2QsIGZiX2Jhc2VfcGh5cyAmIH4weDFGLCBPU0RfUFBWV0lOMEFEUik7CisJCQlvc2RfbW9kaWZ5KHNkLCBPU0RfTUlTQ0NUTF9QUFNXIHwgT1NEX01JU0NDVExfUFBSViwgMCwKKwkJCQkgICBPU0RfTUlTQ0NUTCk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIG1pc2NjdGwgPSBPU0RfTUlTQ0NUTF9QUFJWOworCisJCQlvc2Rfd3JpdGUoc2QsCisJCQkJKGZiX2Jhc2VfcGh5cyAmIH4weDFGKSAtIGxjb25maWctPmxpbmVfbGVuZ3RoLAorCQkJCU9TRF9WSURXSU4wQURSKTsKKwkJCW9zZF93cml0ZShzZCwKKwkJCQkoZmJfYmFzZV9waHlzICYgfjB4MUYpICsgbGNvbmZpZy0+bGluZV9sZW5ndGgsCisJCQkJT1NEX1BQVldJTjBBRFIpOworCQkJb3NkX21vZGlmeShzZCwKKwkJCQlPU0RfTUlTQ0NUTF9QUFNXIHwgT1NEX01JU0NDVExfUFBSViwgbWlzY2N0bCwKKwkJCQlPU0RfTUlTQ0NUTCk7CisKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9vc2Rfc2V0X2ZpZWxkX2ludmVyc2lvbihzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgaW50IGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBmc2ludiA9IDA7CisKKwlpZiAoZW5hYmxlKQorCQlmc2ludiA9IE9TRF9NT0RFX0ZTSU5WOworCisJb3NkX21vZGlmeShzZCwgT1NEX01PREVfRlNJTlYsIGZzaW52LCBPU0RfTU9ERSk7Cit9CisKK3N0YXRpYyB2b2lkIF9vc2Rfc2V0X2JsaW5rX2F0dHJpYnV0ZShzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgaW50IGVuYWJsZSwKKwkJCQkgICAgIGVudW0gb3NkX2JsaW5rX2ludGVydmFsIGJsaW5rKQoreworCXUzMiBvc2RhdHJtZCA9IDA7CisKKwlpZiAoZW5hYmxlKSB7CisJCW9zZGF0cm1kIHw9IE9TRF9PU0RBVFJNRF9CTE5LOworCQlvc2RhdHJtZCB8PSBibGluayA8PCBPU0RfT1NEQVRSTURfQkxOS0lOVF9TSElGVDsKKwl9CisJLyogY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgT1NEMSBpcyBjb25maWd1cmVkIGluIGF0dHJpYnV0ZSBtb2RlICovCisJb3NkX21vZGlmeShzZCwgT1NEX09TREFUUk1EX0JMTktJTlQgfCBPU0RfT1NEQVRSTURfQkxOSywgb3NkYXRybWQsCisJCSAgT1NEX09TREFUUk1EKTsKK30KKworc3RhdGljIHZvaWQgX29zZF9zZXRfcm9tX2NsdXQoc3RydWN0IG9zZF9zdGF0ZSAqc2QsCisJCQkgICAgICBlbnVtIG9zZF9yb21fY2x1dCByb21fY2x1dCkKK3sKKwlpZiAocm9tX2NsdXQgPT0gUk9NX0NMVVQwKQorCQlvc2RfY2xlYXIoc2QsIE9TRF9NSVNDQ1RMX1JTRUwsIE9TRF9NSVNDQ1RMKTsKKwllbHNlCisJCW9zZF9zZXQoc2QsIE9TRF9NSVNDQ1RMX1JTRUwsIE9TRF9NSVNDQ1RMKTsKK30KKworc3RhdGljIHZvaWQgX29zZF9zZXRfcGFsZXR0ZV9tYXAoc3RydWN0IG9zZF9zdGF0ZSAqc2QsCisJCQkJIGVudW0gb3NkX3dpbl9sYXllciBvc2R3aW4sCisJCQkJIHVuc2lnbmVkIGNoYXIgcGl4ZWxfdmFsdWUsCisJCQkJIHVuc2lnbmVkIGNoYXIgY2x1dF9pbmRleCwKKwkJCQkgZW51bSBvc2RfcGl4X2Zvcm1hdCBwaXhmbXQpCit7CisJc3RhdGljIGNvbnN0IGludCBtYXBfMmJwcFtdID0geyAwLCA1LCAxMCwgMTUgfTsKKwlzdGF0aWMgY29uc3QgaW50IG1hcF8xYnBwW10gPSB7IDAsIDE1IH07CisJaW50IGJtcF9vZmZzZXQ7CisJaW50IGJtcF9zaGlmdDsKKwlpbnQgYm1wX21hc2s7CisJaW50IGJtcF9yZWc7CisKKwlzd2l0Y2ggKHBpeGZtdCkgeworCWNhc2UgUElYRk1UXzFCUFA6CisJCWJtcF9yZWcgPSBtYXBfMWJwcFtwaXhlbF92YWx1ZSAmIDB4MV07CisJCWJyZWFrOworCWNhc2UgUElYRk1UXzJCUFA6CisJCWJtcF9yZWcgPSBtYXBfMmJwcFtwaXhlbF92YWx1ZSAmIDB4M107CisJCWJyZWFrOworCWNhc2UgUElYRk1UXzRCUFA6CisJCWJtcF9yZWcgPSBwaXhlbF92YWx1ZSAmIDB4ZjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAob3Nkd2luKSB7CisJY2FzZSBPU0RXSU5fT1NEMDoKKwkJYm1wX29mZnNldCA9IE9TRF9XMEJNUDAxICsgKGJtcF9yZWcgPj4gMSkgKiBzaXplb2YodTMyKTsKKwkJYnJlYWs7CisJY2FzZSBPU0RXSU5fT1NEMToKKwkJYm1wX29mZnNldCA9IE9TRF9XMUJNUDAxICsgKGJtcF9yZWcgPj4gMSkgKiBzaXplb2YodTMyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCWlmIChibXBfcmVnICYgMSkgeworCQlibXBfc2hpZnQgPSA4OworCQlibXBfbWFzayA9IDB4ZmYgPDwgODsKKwl9IGVsc2UgeworCQlibXBfc2hpZnQgPSAwOworCQlibXBfbWFzayA9IDB4ZmY7CisJfQorCisJb3NkX21vZGlmeShzZCwgYm1wX21hc2ssIGNsdXRfaW5kZXggPDwgYm1wX3NoaWZ0LCBibXBfb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgX29zZF9zZXRfcmVjNjAxX2F0dGVudWF0aW9uKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLAorCQkJCQllbnVtIG9zZF93aW5fbGF5ZXIgb3Nkd2luLCBpbnQgZW5hYmxlKQoreworCXN3aXRjaCAob3Nkd2luKSB7CisJY2FzZSBPU0RXSU5fT1NEMDoKKwkJb3NkX21vZGlmeShzZCwgT1NEX09TRFdJTjBNRF9BVE4wRSwKKwkJCSAgZW5hYmxlID8gT1NEX09TRFdJTjBNRF9BVE4wRSA6IDAsCisJCQkgIE9TRF9PU0RXSU4wTUQpOworCQlicmVhazsKKwljYXNlIE9TRFdJTl9PU0QxOgorCQlvc2RfbW9kaWZ5KHNkLCBPU0RfT1NEV0lOMU1EX0FUTjFFLAorCQkJICBlbmFibGUgPyBPU0RfT1NEV0lOMU1EX0FUTjFFIDogMCwKKwkJCSAgT1NEX09TRFdJTjFNRCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgX29zZF9zZXRfYmxlbmRpbmdfZmFjdG9yKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLAorCQkJCSAgICAgZW51bSBvc2Rfd2luX2xheWVyIG9zZHdpbiwKKwkJCQkgICAgIGVudW0gb3NkX2JsZW5kaW5nX2ZhY3RvciBibGVuZCkKK3sKKwlzd2l0Y2ggKG9zZHdpbikgeworCWNhc2UgT1NEV0lOX09TRDA6CisJCW9zZF9tb2RpZnkoc2QsIE9TRF9PU0RXSU4wTURfQkxORDAsCisJCQkgIGJsZW5kIDw8IE9TRF9PU0RXSU4wTURfQkxORDBfU0hJRlQsIE9TRF9PU0RXSU4wTUQpOworCQlicmVhazsKKwljYXNlIE9TRFdJTl9PU0QxOgorCQlvc2RfbW9kaWZ5KHNkLCBPU0RfT1NEV0lOMU1EX0JMTkQxLAorCQkJICBibGVuZCA8PCBPU0RfT1NEV0lOMU1EX0JMTkQxX1NISUZULCBPU0RfT1NEV0lOMU1EKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBfb3NkX2VuYWJsZV9jb2xvcl9rZXkoc3RydWN0IG9zZF9zdGF0ZSAqc2QsCisJCQkJICBlbnVtIG9zZF93aW5fbGF5ZXIgb3Nkd2luLAorCQkJCSAgdW5zaWduZWQgY29sb3JrZXksCisJCQkJICBlbnVtIG9zZF9waXhfZm9ybWF0IHBpeGZtdCkKK3sKKwlzd2l0Y2ggKHBpeGZtdCkgeworCWNhc2UgUElYRk1UX1JHQjU2NToKKwkJb3NkX3dyaXRlKHNkLCBjb2xvcmtleSAmIE9TRF9UUkFOU1BWQUxfUkdCVFJBTlMsCisJCQkgIE9TRF9UUkFOU1BWQUwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKG9zZHdpbikgeworCWNhc2UgT1NEV0lOX09TRDA6CisJCW9zZF9zZXQoc2QsIE9TRF9PU0RXSU4wTURfVEUwLCBPU0RfT1NEV0lOME1EKTsKKwkJYnJlYWs7CisJY2FzZSBPU0RXSU5fT1NEMToKKwkJb3NkX3NldChzZCwgT1NEX09TRFdJTjFNRF9URTEsIE9TRF9PU0RXSU4xTUQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9vc2RfZGlzYWJsZV9jb2xvcl9rZXkoc3RydWN0IG9zZF9zdGF0ZSAqc2QsCisJCQkJICAgZW51bSBvc2Rfd2luX2xheWVyIG9zZHdpbikKK3sKKwlzd2l0Y2ggKG9zZHdpbikgeworCWNhc2UgT1NEV0lOX09TRDA6CisJCW9zZF9jbGVhcihzZCwgT1NEX09TRFdJTjBNRF9URTAsIE9TRF9PU0RXSU4wTUQpOworCQlicmVhazsKKwljYXNlIE9TRFdJTl9PU0QxOgorCQlvc2RfY2xlYXIoc2QsIE9TRF9PU0RXSU4xTURfVEUxLCBPU0RfT1NEV0lOMU1EKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBfb3NkX3NldF9vc2RfY2x1dChzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwKKwkJCSAgICAgIGVudW0gb3NkX3dpbl9sYXllciBvc2R3aW4sCisJCQkgICAgICBlbnVtIG9zZF9jbHV0IGNsdXQpCit7CisJdTMyIHdpbm1kID0gMDsKKworCXN3aXRjaCAob3Nkd2luKSB7CisJY2FzZSBPU0RXSU5fT1NEMDoKKwkJaWYgKGNsdXQgPT0gUkFNX0NMVVQpCisJCQl3aW5tZCB8PSBPU0RfT1NEV0lOME1EX0NMVVRTMDsKKwkJb3NkX21vZGlmeShzZCwgT1NEX09TRFdJTjBNRF9DTFVUUzAsIHdpbm1kLCBPU0RfT1NEV0lOME1EKTsKKwkJYnJlYWs7CisJY2FzZSBPU0RXSU5fT1NEMToKKwkJaWYgKGNsdXQgPT0gUkFNX0NMVVQpCisJCQl3aW5tZCB8PSBPU0RfT1NEV0lOMU1EX0NMVVRTMTsKKwkJb3NkX21vZGlmeShzZCwgT1NEX09TRFdJTjFNRF9DTFVUUzEsIHdpbm1kLCBPU0RfT1NEV0lOMU1EKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBfb3NkX3NldF96b29tKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllciwKKwkJCSAgZW51bSBvc2Rfem9vbV9mYWN0b3IgaF96b29tLAorCQkJICBlbnVtIG9zZF96b29tX2ZhY3RvciB2X3pvb20pCit7CisJdTMyIHdpbm1kID0gMDsKKworCXN3aXRjaCAobGF5ZXIpIHsKKwljYXNlIFdJTl9PU0QwOgorCQl3aW5tZCB8PSAoaF96b29tIDw8IE9TRF9PU0RXSU4wTURfT0haMF9TSElGVCk7CisJCXdpbm1kIHw9ICh2X3pvb20gPDwgT1NEX09TRFdJTjBNRF9PVlowX1NISUZUKTsKKwkJb3NkX21vZGlmeShzZCwgT1NEX09TRFdJTjBNRF9PSFowIHwgT1NEX09TRFdJTjBNRF9PVlowLCB3aW5tZCwKKwkJCSAgT1NEX09TRFdJTjBNRCk7CisJCWJyZWFrOworCWNhc2UgV0lOX1ZJRDA6CisJCXdpbm1kIHw9IChoX3pvb20gPDwgT1NEX1ZJRFdJTk1EX1ZIWjBfU0hJRlQpOworCQl3aW5tZCB8PSAodl96b29tIDw8IE9TRF9WSURXSU5NRF9WVlowX1NISUZUKTsKKwkJb3NkX21vZGlmeShzZCwgT1NEX1ZJRFdJTk1EX1ZIWjAgfCBPU0RfVklEV0lOTURfVlZaMCwgd2lubWQsCisJCQkgIE9TRF9WSURXSU5NRCk7CisJCWJyZWFrOworCWNhc2UgV0lOX09TRDE6CisJCXdpbm1kIHw9IChoX3pvb20gPDwgT1NEX09TRFdJTjFNRF9PSFoxX1NISUZUKTsKKwkJd2lubWQgfD0gKHZfem9vbSA8PCBPU0RfT1NEV0lOMU1EX09WWjFfU0hJRlQpOworCQlvc2RfbW9kaWZ5KHNkLCBPU0RfT1NEV0lOMU1EX09IWjEgfCBPU0RfT1NEV0lOMU1EX09WWjEsIHdpbm1kLAorCQkJICBPU0RfT1NEV0lOMU1EKTsKKwkJYnJlYWs7CisJY2FzZSBXSU5fVklEMToKKwkJd2lubWQgfD0gKGhfem9vbSA8PCBPU0RfVklEV0lOTURfVkhaMV9TSElGVCk7CisJCXdpbm1kIHw9ICh2X3pvb20gPDwgT1NEX1ZJRFdJTk1EX1ZWWjFfU0hJRlQpOworCQlvc2RfbW9kaWZ5KHNkLCBPU0RfVklEV0lOTURfVkhaMSB8IE9TRF9WSURXSU5NRF9WVloxLCB3aW5tZCwKKwkJCSAgT1NEX1ZJRFdJTk1EKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBfb3NkX2Rpc2FibGVfbGF5ZXIoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyKQoreworCXN3aXRjaCAobGF5ZXIpIHsKKwljYXNlIFdJTl9PU0QwOgorCQlvc2RfY2xlYXIoc2QsIE9TRF9PU0RXSU4wTURfT0FDVDAsIE9TRF9PU0RXSU4wTUQpOworCQlicmVhazsKKwljYXNlIFdJTl9WSUQwOgorCQlvc2RfY2xlYXIoc2QsIE9TRF9WSURXSU5NRF9BQ1QwLCBPU0RfVklEV0lOTUQpOworCQlicmVhazsKKwljYXNlIFdJTl9PU0QxOgorCQkvKiBkaXNhYmxlIGF0dHJpYnV0ZSBtb2RlIGFzIHdlbGwgYXMgZGlzYWJsaW5nIHRoZSB3aW5kb3cgKi8KKwkJb3NkX2NsZWFyKHNkLCBPU0RfT1NEV0lOMU1EX09BU1cgfCBPU0RfT1NEV0lOMU1EX09BQ1QxLAorCQkJICBPU0RfT1NEV0lOMU1EKTsKKwkJYnJlYWs7CisJY2FzZSBXSU5fVklEMToKKwkJb3NkX2NsZWFyKHNkLCBPU0RfVklEV0lOTURfQUNUMSwgT1NEX1ZJRFdJTk1EKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBvc2RfZGlzYWJsZV9sYXllcihzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgZW51bSBvc2RfbGF5ZXIgbGF5ZXIpCit7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkID0gc2Q7CisJc3RydWN0IG9zZF93aW5kb3dfc3RhdGUgKndpbiA9ICZvc2QtPndpbltsYXllcl07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvc2QtPmxvY2ssIGZsYWdzKTsKKworCWlmICghd2luLT5pc19lbmFibGVkKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCXdpbi0+aXNfZW5hYmxlZCA9IDA7CisKKwlfb3NkX2Rpc2FibGVfbGF5ZXIoc2QsIGxheWVyKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9zZC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBfb3NkX2VuYWJsZV9hdHRyaWJ1dGVfbW9kZShzdHJ1Y3Qgb3NkX3N0YXRlICpzZCkKK3sKKwkvKiBlbmFibGUgYXR0cmlidXRlIG1vZGUgZm9yIE9TRDEgKi8KKwlvc2Rfc2V0KHNkLCBPU0RfT1NEV0lOMU1EX09BU1csIE9TRF9PU0RXSU4xTUQpOworfQorCitzdGF0aWMgdm9pZCBfb3NkX2VuYWJsZV9sYXllcihzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgZW51bSBvc2RfbGF5ZXIgbGF5ZXIpCit7CisJc3dpdGNoIChsYXllcikgeworCWNhc2UgV0lOX09TRDA6CisJCW9zZF9zZXQoc2QsIE9TRF9PU0RXSU4wTURfT0FDVDAsIE9TRF9PU0RXSU4wTUQpOworCQlicmVhazsKKwljYXNlIFdJTl9WSUQwOgorCQlvc2Rfc2V0KHNkLCBPU0RfVklEV0lOTURfQUNUMCwgT1NEX1ZJRFdJTk1EKTsKKwkJYnJlYWs7CisJY2FzZSBXSU5fT1NEMToKKwkJLyogZW5hYmxlIE9TRDEgYW5kIGRpc2FibGUgYXR0cmlidXRlIG1vZGUgKi8KKwkJb3NkX21vZGlmeShzZCwgT1NEX09TRFdJTjFNRF9PQVNXIHwgT1NEX09TRFdJTjFNRF9PQUNUMSwKKwkJCSAgT1NEX09TRFdJTjFNRF9PQUNUMSwgT1NEX09TRFdJTjFNRCk7CisJCWJyZWFrOworCWNhc2UgV0lOX1ZJRDE6CisJCW9zZF9zZXQoc2QsIE9TRF9WSURXSU5NRF9BQ1QxLCBPU0RfVklEV0lOTUQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgb3NkX2VuYWJsZV9sYXllcihzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgZW51bSBvc2RfbGF5ZXIgbGF5ZXIsCisJCQkgICAgaW50IG90aGVyd2luKQoreworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZCA9IHNkOworCXN0cnVjdCBvc2Rfd2luZG93X3N0YXRlICp3aW4gPSAmb3NkLT53aW5bbGF5ZXJdOworCXN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnICpjZmcgPSAmd2luLT5sY29uZmlnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3NkLT5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIHVzZSBvdGhlcndpbiBmbGFnIHRvIGtub3cgdGhpcyBpcyB0aGUgb3RoZXIgdmlkIHdpbmRvdworCSAqIGluIFlVVjQyMCBtb2RlLCBpZiBpcywgc2tpcCB0aGlzIGNoZWNrCisJICovCisJaWYgKCFvdGhlcndpbiAmJiAoIXdpbi0+aXNfYWxsb2NhdGVkIHx8CisJCQkhd2luLT5mYl9iYXNlX3BoeXMgfHwKKwkJCSFjZmctPmxpbmVfbGVuZ3RoIHx8CisJCQkhY2ZnLT54c2l6ZSB8fAorCQkJIWNmZy0+eXNpemUpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHdpbi0+aXNfZW5hYmxlZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvc2QtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCXdpbi0+aXNfZW5hYmxlZCA9IDE7CisKKwlpZiAoY2ZnLT5waXhmbXQgIT0gUElYRk1UX09TRF9BVFRSKQorCQlfb3NkX2VuYWJsZV9sYXllcihzZCwgbGF5ZXIpOworCWVsc2UgeworCQlfb3NkX2VuYWJsZV9hdHRyaWJ1dGVfbW9kZShzZCk7CisJCV9vc2Rfc2V0X2JsaW5rX2F0dHJpYnV0ZShzZCwgb3NkLT5pc19ibGlua2luZywgb3NkLT5ibGluayk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3NkLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX29zZF9zdGFydF9sYXllcihzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgZW51bSBvc2RfbGF5ZXIgbGF5ZXIsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgZmJfYmFzZV9waHlzLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGNiY3Jfb2ZzdCkKK3sKKwlzd2l0Y2ggKGxheWVyKSB7CisJY2FzZSBXSU5fT1NEMDoKKwkJb3NkX3dyaXRlKHNkLCBmYl9iYXNlX3BoeXMgJiB+MHgxRiwgT1NEX09TRFdJTjBBRFIpOworCQlicmVhazsKKwljYXNlIFdJTl9WSUQwOgorCQlvc2Rfd3JpdGUoc2QsIGZiX2Jhc2VfcGh5cyAmIH4weDFGLCBPU0RfVklEV0lOMEFEUik7CisJCWJyZWFrOworCWNhc2UgV0lOX09TRDE6CisJCW9zZF93cml0ZShzZCwgZmJfYmFzZV9waHlzICYgfjB4MUYsIE9TRF9PU0RXSU4xQURSKTsKKwkJYnJlYWs7CisJY2FzZSBXSU5fVklEMToKKwkJb3NkX3dyaXRlKHNkLCBmYl9iYXNlX3BoeXMgJiB+MHgxRiwgT1NEX1ZJRFdJTjFBRFIpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9zZF9zdGFydF9sYXllcihzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgZW51bSBvc2RfbGF5ZXIgbGF5ZXIsCisJCQkgICAgdW5zaWduZWQgbG9uZyBmYl9iYXNlX3BoeXMsCisJCQkgICAgdW5zaWduZWQgbG9uZyBjYmNyX29mc3QpCit7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkID0gc2Q7CisJc3RydWN0IG9zZF93aW5kb3dfc3RhdGUgKndpbiA9ICZvc2QtPndpbltsYXllcl07CisJc3RydWN0IG9zZF9sYXllcl9jb25maWcgKmNmZyA9ICZ3aW4tPmxjb25maWc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvc2QtPmxvY2ssIGZsYWdzKTsKKworCXdpbi0+ZmJfYmFzZV9waHlzID0gZmJfYmFzZV9waHlzICYgfjB4MUY7CisJX29zZF9zdGFydF9sYXllcihzZCwgbGF5ZXIsIGZiX2Jhc2VfcGh5cywgY2Jjcl9vZnN0KTsKKworCWlmIChsYXllciA9PSBXSU5fVklEMCkgeworCQlvc2QtPnBpbmdwb25nID0KKwkJICAgIF9vc2RfZG02NDQ2X3ZpZDBfcGluZ3Bvbmcoc2QsIG9zZC0+ZmllbGRfaW52ZXJzaW9uLAorCQkJCQkJICAgICAgIHdpbi0+ZmJfYmFzZV9waHlzLAorCQkJCQkJICAgICAgIGNmZyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3NkLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG9zZF9nZXRfbGF5ZXJfY29uZmlnKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllciwKKwkJCQkgc3RydWN0IG9zZF9sYXllcl9jb25maWcgKmxjb25maWcpCit7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkID0gc2Q7CisJc3RydWN0IG9zZF93aW5kb3dfc3RhdGUgKndpbiA9ICZvc2QtPndpbltsYXllcl07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvc2QtPmxvY2ssIGZsYWdzKTsKKworCSpsY29uZmlnID0gd2luLT5sY29uZmlnOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3NkLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogdHJ5X2xheWVyX2NvbmZpZygpIC0gVHJ5IGEgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmb3IgdGhlIGxheWVyCisgKiBAc2QgIC0gcHRyIHRvIHN0cnVjdCBvc2Rfc3RhdGUKKyAqIEBsYXllciAtIGxheWVyIHRvIGNvbmZpZ3VyZQorICogQGxjb25maWcgLSBsYXllciBjb25maWd1cmF0aW9uIHRvIHRyeQorICoKKyAqIElmIHRoZSByZXF1ZXN0ZWQgbGNvbmZpZyBpcyBjb21wbGV0ZWx5IHJlamVjdGVkIGFuZCB0aGUgdmFsdWUgb2YgbGNvbmZpZyBvbgorICogZXhpdCBpcyB0aGUgY3VycmVudCBsY29uZmlnLCB0aGVuIHRyeV9sYXllcl9jb25maWcoKSByZXR1cm5zIDEuICBPdGhlcndpc2UsCisgKiB0cnlfbGF5ZXJfY29uZmlnKCkgcmV0dXJucyAwLiAgQSByZXR1cm4gdmFsdWUgb2YgMCBkb2VzIG5vdCBuZWNlc3NhcmlseSBtZWFuCisgKiB0aGF0IHRoZSB2YWx1ZSBvZiBsY29uZmlnIG9uIGV4aXQgaXMgaWRlbnRpY2FsIHRvIHRoZSB2YWx1ZSBvZiBsY29uZmlnIG9uCisgKiBlbnRyeSwgYnV0IG1lcmVseSB0aGF0IGl0IHJlcHJlc2VudHMgYSBjaGFuZ2UgZnJvbSB0aGUgY3VycmVudCBsY29uZmlnLgorICovCitzdGF0aWMgaW50IHRyeV9sYXllcl9jb25maWcoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyLAorCQkJICAgIHN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnICpsY29uZmlnKQoreworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZCA9IHNkOworCXN0cnVjdCBvc2Rfd2luZG93X3N0YXRlICp3aW4gPSAmb3NkLT53aW5bbGF5ZXJdOworCWludCBiYWRfY29uZmlnOworCisJLyogdmVyaWZ5IHRoYXQgdGhlIHBpeGVsIGZvcm1hdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGxheWVyICovCisJc3dpdGNoIChsY29uZmlnLT5waXhmbXQpIHsKKwljYXNlIFBJWEZNVF8xQlBQOgorCWNhc2UgUElYRk1UXzJCUFA6CisJY2FzZSBQSVhGTVRfNEJQUDoKKwljYXNlIFBJWEZNVF84QlBQOgorCWNhc2UgUElYRk1UX1JHQjU2NToKKwkJYmFkX2NvbmZpZyA9ICFpc19vc2Rfd2luKGxheWVyKTsKKwkJYnJlYWs7CisJY2FzZSBQSVhGTVRfWUNiQ3JJOgorCWNhc2UgUElYRk1UX1lDckNiSToKKwkJYmFkX2NvbmZpZyA9ICFpc192aWRfd2luKGxheWVyKTsKKwkJYnJlYWs7CisJY2FzZSBQSVhGTVRfUkdCODg4OgorCQliYWRfY29uZmlnID0gIWlzX3ZpZF93aW4obGF5ZXIpOworCQlicmVhazsKKwljYXNlIFBJWEZNVF9OVjEyOgorCQliYWRfY29uZmlnID0gMTsKKwkJYnJlYWs7CisJY2FzZSBQSVhGTVRfT1NEX0FUVFI6CisJCWJhZF9jb25maWcgPSAobGF5ZXIgIT0gV0lOX09TRDEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQliYWRfY29uZmlnID0gMTsKKwkJYnJlYWs7CisJfQorCWlmIChiYWRfY29uZmlnKSB7CisJCS8qCisJCSAqIFRoZSByZXF1ZXN0ZWQgcGl4ZWwgZm9ybWF0IGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBsYXllciwKKwkJICogc28ga2VlcCB0aGUgY3VycmVudCBsYXllciBjb25maWd1cmF0aW9uLgorCQkgKi8KKwkJKmxjb25maWcgPSB3aW4tPmxjb25maWc7CisJCXJldHVybiBiYWRfY29uZmlnOworCX0KKworCS8qIERNNjQ0NjogKi8KKwkvKiBvbmx5IG9uZSBPU0Qgd2luZG93IGF0IGEgdGltZSBjYW4gdXNlIFJHQiBwaXhlbCBmb3JtYXRzICovCisJaWYgKGlzX29zZF93aW4obGF5ZXIpICYmIGlzX3JnYl9waXhmbXQobGNvbmZpZy0+cGl4Zm10KSkgeworCQllbnVtIG9zZF9waXhfZm9ybWF0IHBpeGZtdDsKKwkJaWYgKGxheWVyID09IFdJTl9PU0QwKQorCQkJcGl4Zm10ID0gb3NkLT53aW5bV0lOX09TRDFdLmxjb25maWcucGl4Zm10OworCQllbHNlCisJCQlwaXhmbXQgPSBvc2QtPndpbltXSU5fT1NEMF0ubGNvbmZpZy5waXhmbXQ7CisKKwkJaWYgKGlzX3JnYl9waXhmbXQocGl4Zm10KSkgeworCQkJLyoKKwkJCSAqIFRoZSBvdGhlciBPU0Qgd2luZG93IGlzIGFscmVhZHkgY29uZmlndXJlZCBmb3IgYW4KKwkJCSAqIFJHQiwgc28ga2VlcCB0aGUgY3VycmVudCBsYXllciBjb25maWd1cmF0aW9uLgorCQkJICovCisJCQkqbGNvbmZpZyA9IHdpbi0+bGNvbmZpZzsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJLyogRE02NDQ2OiBvbmx5IG9uZSB2aWRlbyB3aW5kb3cgYXQgYSB0aW1lIGNhbiB1c2UgUkdCODg4ICovCisJaWYgKGlzX3ZpZF93aW4obGF5ZXIpICYmIGxjb25maWctPnBpeGZtdCA9PSBQSVhGTVRfUkdCODg4KSB7CisJCWVudW0gb3NkX3BpeF9mb3JtYXQgcGl4Zm10OworCisJCWlmIChsYXllciA9PSBXSU5fVklEMCkKKwkJCXBpeGZtdCA9IG9zZC0+d2luW1dJTl9WSUQxXS5sY29uZmlnLnBpeGZtdDsKKwkJZWxzZQorCQkJcGl4Zm10ID0gb3NkLT53aW5bV0lOX1ZJRDBdLmxjb25maWcucGl4Zm10OworCisJCWlmIChwaXhmbXQgPT0gUElYRk1UX1JHQjg4OCkgeworCQkJLyoKKwkJCSAqIFRoZSBvdGhlciB2aWRlbyB3aW5kb3cgaXMgYWxyZWFkeSBjb25maWd1cmVkIGZvcgorCQkJICogUkdCODg4LCBzbyBrZWVwIHRoZSBjdXJyZW50IGxheWVyIGNvbmZpZ3VyYXRpb24uCisJCQkgKi8KKwkJCSpsY29uZmlnID0gd2luLT5sY29uZmlnOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwkvKiB3aW5kb3cgZGltZW5zaW9ucyBtdXN0IGJlIG5vbi16ZXJvICovCisJaWYgKCFsY29uZmlnLT5saW5lX2xlbmd0aCB8fCAhbGNvbmZpZy0+eHNpemUgfHwgIWxjb25maWctPnlzaXplKSB7CisJCSpsY29uZmlnID0gd2luLT5sY29uZmlnOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiByb3VuZCBsaW5lX2xlbmd0aCB1cCB0byBhIG11bHRpcGxlIG9mIDMyICovCisJbGNvbmZpZy0+bGluZV9sZW5ndGggPSAoKGxjb25maWctPmxpbmVfbGVuZ3RoICsgMzEpIC8gMzIpICogMzI7CisJbGNvbmZpZy0+bGluZV9sZW5ndGggPQorCSAgICBtaW4obGNvbmZpZy0+bGluZV9sZW5ndGgsICh1bnNpZ25lZClNQVhfTElORV9MRU5HVEgpOworCWxjb25maWctPnhzaXplID0gbWluKGxjb25maWctPnhzaXplLCAodW5zaWduZWQpTUFYX1dJTl9TSVpFKTsKKwlsY29uZmlnLT55c2l6ZSA9IG1pbihsY29uZmlnLT55c2l6ZSwgKHVuc2lnbmVkKU1BWF9XSU5fU0laRSk7CisJbGNvbmZpZy0+eHBvcyA9IG1pbihsY29uZmlnLT54cG9zLCAodW5zaWduZWQpTUFYX1dJTl9TSVpFKTsKKwlsY29uZmlnLT55cG9zID0gbWluKGxjb25maWctPnlwb3MsICh1bnNpZ25lZClNQVhfV0lOX1NJWkUpOworCWxjb25maWctPmludGVybGFjZWQgPSAobGNvbmZpZy0+aW50ZXJsYWNlZCAhPSAwKTsKKwlpZiAobGNvbmZpZy0+aW50ZXJsYWNlZCkgeworCQkvKiB5c2l6ZSBhbmQgeXBvcyBtdXN0IGJlIGV2ZW4gZm9yIGludGVybGFjZWQgZGlzcGxheXMgKi8KKwkJbGNvbmZpZy0+eXNpemUgJj0gfjE7CisJCWxjb25maWctPnlwb3MgJj0gfjE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9vc2RfZGlzYWJsZV92aWRfcmdiODg4KHN0cnVjdCBvc2Rfc3RhdGUgKnNkKQoreworCS8qCisJICogVGhlIERNNjQ0NiBzdXBwb3J0cyBSR0I4ODggcGl4ZWwgZm9ybWF0IGluIGEgc2luZ2xlIHZpZGVvIHdpbmRvdy4KKwkgKiBUaGlzIHJvdXRpbmUgZGlzYWJsZXMgUkdCODg4IHBpeGVsIGZvcm1hdCBmb3IgYm90aCB2aWRlbyB3aW5kb3dzLgorCSAqIFRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCBuZWl0aGVyIHZpZGVvIHdpbmRvdyBpcyBjdXJyZW50bHkKKwkgKiBjb25maWd1cmVkIGZvciBSR0I4ODggcGl4ZWwgZm9ybWF0LgorCSAqLworCW9zZF9jbGVhcihzZCwgT1NEX01JU0NDVExfUkdCRU4sIE9TRF9NSVNDQ1RMKTsKK30KKworc3RhdGljIHZvaWQgX29zZF9lbmFibGVfdmlkX3JnYjg4OChzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwKKwkJCQkgICBlbnVtIG9zZF9sYXllciBsYXllcikKK3sKKwkvKgorCSAqIFRoZSBETTY0NDYgc3VwcG9ydHMgUkdCODg4IHBpeGVsIGZvcm1hdCBpbiBhIHNpbmdsZSB2aWRlbyB3aW5kb3cuCisJICogVGhpcyByb3V0aW5lIGVuYWJsZXMgUkdCODg4IHBpeGVsIGZvcm1hdCBmb3IgdGhlIHNwZWNpZmllZCB2aWRlbworCSAqIHdpbmRvdy4gIFRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCB0aGUgb3RoZXIgdmlkZW8gd2luZG93IGlzIG5vdAorCSAqIGN1cnJlbnRseSBjb25maWd1cmVkIGZvciBSR0I4ODggcGl4ZWwgZm9ybWF0LCBhcyB0aGlzIHJvdXRpbmUgd2lsbAorCSAqIGRpc2FibGUgUkdCODg4IHBpeGVsIGZvcm1hdCBmb3IgdGhlIG90aGVyIHdpbmRvdy4KKwkgKi8KKwlpZiAobGF5ZXIgPT0gV0lOX1ZJRDApIHsKKwkJb3NkX21vZGlmeShzZCwgT1NEX01JU0NDVExfUkdCRU4gfCBPU0RfTUlTQ0NUTF9SR0JXSU4sCisJCQkgIE9TRF9NSVNDQ1RMX1JHQkVOLCBPU0RfTUlTQ0NUTCk7CisJfSBlbHNlIGlmIChsYXllciA9PSBXSU5fVklEMSkgeworCQlvc2RfbW9kaWZ5KHNkLCBPU0RfTUlTQ0NUTF9SR0JFTiB8IE9TRF9NSVNDQ1RMX1JHQldJTiwKKwkJCSAgT1NEX01JU0NDVExfUkdCRU4gfCBPU0RfTUlTQ0NUTF9SR0JXSU4sCisJCQkgIE9TRF9NSVNDQ1RMKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9vc2Rfc2V0X2NiY3Jfb3JkZXIoc3RydWN0IG9zZF9zdGF0ZSAqc2QsCisJCQkJZW51bSBvc2RfcGl4X2Zvcm1hdCBwaXhmbXQpCit7CisJLyoKKwkgKiBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgYWxsIHdpbmRvd3MgdXNpbmcgWUMgcGl4Zm10IHVzZSB0aGUgc2FtZQorCSAqIENiL0NyIG9yZGVyLgorCSAqLworCWlmIChwaXhmbXQgPT0gUElYRk1UX1lDYkNySSkKKwkJb3NkX2NsZWFyKHNkLCBPU0RfTU9ERV9DUywgT1NEX01PREUpOworCWVsc2UgaWYgKHBpeGZtdCA9PSBQSVhGTVRfWUNyQ2JJKQorCQlvc2Rfc2V0KHNkLCBPU0RfTU9ERV9DUywgT1NEX01PREUpOworfQorCitzdGF0aWMgdm9pZCBfb3NkX3NldF9sYXllcl9jb25maWcoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyLAorCQkJCSAgY29uc3Qgc3RydWN0IG9zZF9sYXllcl9jb25maWcgKmxjb25maWcpCit7CisJdTMyIHdpbm1kID0gMCwgd2lubWRfbWFzayA9IDAsIGJtdyA9IDA7CisKKwlfb3NkX3NldF9jYmNyX29yZGVyKHNkLCBsY29uZmlnLT5waXhmbXQpOworCisJc3dpdGNoIChsYXllcikgeworCWNhc2UgV0lOX09TRDA6CisJCXdpbm1kX21hc2sgfD0gT1NEX09TRFdJTjBNRF9SR0IwRTsKKwkJaWYgKGxjb25maWctPnBpeGZtdCA9PSBQSVhGTVRfUkdCNTY1KQorCQkJd2lubWQgfD0gT1NEX09TRFdJTjBNRF9SR0IwRTsKKworCQl3aW5tZF9tYXNrIHw9IE9TRF9PU0RXSU4wTURfQk1XMCB8IE9TRF9PU0RXSU4wTURfT0ZGMDsKKworCQlzd2l0Y2ggKGxjb25maWctPnBpeGZtdCkgeworCQljYXNlIFBJWEZNVF8xQlBQOgorCQkJYm13ID0gMDsKKwkJCWJyZWFrOworCQljYXNlIFBJWEZNVF8yQlBQOgorCQkJYm13ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIFBJWEZNVF80QlBQOgorCQkJYm13ID0gMjsKKwkJCWJyZWFrOworCQljYXNlIFBJWEZNVF84QlBQOgorCQkJYm13ID0gMzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJd2lubWQgfD0gKGJtdyA8PCBPU0RfT1NEV0lOME1EX0JNVzBfU0hJRlQpOworCisJCWlmIChsY29uZmlnLT5pbnRlcmxhY2VkKQorCQkJd2lubWQgfD0gT1NEX09TRFdJTjBNRF9PRkYwOworCisJCW9zZF9tb2RpZnkoc2QsIHdpbm1kX21hc2ssIHdpbm1kLCBPU0RfT1NEV0lOME1EKTsKKwkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT5saW5lX2xlbmd0aCA+PiA1LCBPU0RfT1NEV0lOME9GU1QpOworCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnhwb3MsIE9TRF9PU0RXSU4wWFApOworCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnhzaXplLCBPU0RfT1NEV0lOMFhMKTsKKwkJaWYgKGxjb25maWctPmludGVybGFjZWQpIHsKKwkJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eXBvcyA+PiAxLCBPU0RfT1NEV0lOMFlQKTsKKwkJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eXNpemUgPj4gMSwgT1NEX09TRFdJTjBZTCk7CisJCX0gZWxzZSB7CisJCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnlwb3MsIE9TRF9PU0RXSU4wWVApOworCQkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT55c2l6ZSwgT1NEX09TRFdJTjBZTCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXSU5fVklEMDoKKwkJd2lubWRfbWFzayB8PSBPU0RfVklEV0lOTURfVkZGMDsKKwkJaWYgKGxjb25maWctPmludGVybGFjZWQpCisJCQl3aW5tZCB8PSBPU0RfVklEV0lOTURfVkZGMDsKKworCQlvc2RfbW9kaWZ5KHNkLCB3aW5tZF9tYXNrLCB3aW5tZCwgT1NEX1ZJRFdJTk1EKTsKKwkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT5saW5lX2xlbmd0aCA+PiA1LCBPU0RfVklEV0lOME9GU1QpOworCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnhwb3MsIE9TRF9WSURXSU4wWFApOworCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnhzaXplLCBPU0RfVklEV0lOMFhMKTsKKwkJLyoKKwkJICogRm9yIFlVVjQyMFAgZm9ybWF0IHRoZSByZWdpc3RlciBjb250ZW50cyBhcmUKKwkJICogZHVwbGljYXRlZCBpbiBib3RoIFZJRCByZWdpc3RlcnMKKwkJICovCisJCWlmIChsY29uZmlnLT5pbnRlcmxhY2VkKSB7CisJCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnlwb3MgPj4gMSwgT1NEX1ZJRFdJTjBZUCk7CisJCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnlzaXplID4+IDEsIE9TRF9WSURXSU4wWUwpOworCQl9IGVsc2UgeworCQkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT55cG9zLCBPU0RfVklEV0lOMFlQKTsKKwkJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eXNpemUsIE9TRF9WSURXSU4wWUwpOworCQl9CisJCWJyZWFrOworCWNhc2UgV0lOX09TRDE6CisJCS8qCisJCSAqIFRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCBPU0QxIGlzIGRpc2FibGVkIHByaW9yIHRvCisJCSAqIHN3aXRjaGluZyBmcm9tIGEgbm9ybWFsIG1vZGUgdG8gYXR0cmlidXRlIG1vZGUgb3IgZnJvbQorCQkgKiBhdHRyaWJ1dGUgbW9kZSB0byBhIG5vcm1hbCBtb2RlLgorCQkgKi8KKwkJaWYgKGxjb25maWctPnBpeGZtdCA9PSBQSVhGTVRfT1NEX0FUVFIpIHsKKwkJCXdpbm1kX21hc2sgfD0KKwkJCSAgICBPU0RfT1NEV0lOMU1EX0FUTjFFIHwgT1NEX09TRFdJTjFNRF9SR0IxRSB8CisJCQkgICAgT1NEX09TRFdJTjFNRF9DTFVUUzEgfAorCQkJICAgIE9TRF9PU0RXSU4xTURfQkxORDEgfCBPU0RfT1NEV0lOMU1EX1RFMTsKKwkJfSBlbHNlIHsKKwkJCXdpbm1kX21hc2sgfD0gT1NEX09TRFdJTjFNRF9SR0IxRTsKKwkJCWlmIChsY29uZmlnLT5waXhmbXQgPT0gUElYRk1UX1JHQjU2NSkKKwkJCQl3aW5tZCB8PSBPU0RfT1NEV0lOMU1EX1JHQjFFOworCisJCQl3aW5tZF9tYXNrIHw9IE9TRF9PU0RXSU4xTURfQk1XMTsKKwkJCXN3aXRjaCAobGNvbmZpZy0+cGl4Zm10KSB7CisJCQljYXNlIFBJWEZNVF8xQlBQOgorCQkJCWJtdyA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIFBJWEZNVF8yQlBQOgorCQkJCWJtdyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIFBJWEZNVF80QlBQOgorCQkJCWJtdyA9IDI7CisJCQkJYnJlYWs7CisJCQljYXNlIFBJWEZNVF84QlBQOgorCQkJCWJtdyA9IDM7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJd2lubWQgfD0gKGJtdyA8PCBPU0RfT1NEV0lOMU1EX0JNVzFfU0hJRlQpOworCQl9CisKKwkJd2lubWRfbWFzayB8PSBPU0RfT1NEV0lOMU1EX09GRjE7CisJCWlmIChsY29uZmlnLT5pbnRlcmxhY2VkKQorCQkJd2lubWQgfD0gT1NEX09TRFdJTjFNRF9PRkYxOworCisJCW9zZF9tb2RpZnkoc2QsIHdpbm1kX21hc2ssIHdpbm1kLCBPU0RfT1NEV0lOMU1EKTsKKwkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT5saW5lX2xlbmd0aCA+PiA1LCBPU0RfT1NEV0lOMU9GU1QpOworCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnhwb3MsIE9TRF9PU0RXSU4xWFApOworCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnhzaXplLCBPU0RfT1NEV0lOMVhMKTsKKwkJaWYgKGxjb25maWctPmludGVybGFjZWQpIHsKKwkJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eXBvcyA+PiAxLCBPU0RfT1NEV0lOMVlQKTsKKwkJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eXNpemUgPj4gMSwgT1NEX09TRFdJTjFZTCk7CisJCX0gZWxzZSB7CisJCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnlwb3MsIE9TRF9PU0RXSU4xWVApOworCQkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT55c2l6ZSwgT1NEX09TRFdJTjFZTCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXSU5fVklEMToKKwkJd2lubWRfbWFzayB8PSBPU0RfVklEV0lOTURfVkZGMTsKKwkJaWYgKGxjb25maWctPmludGVybGFjZWQpCisJCQl3aW5tZCB8PSBPU0RfVklEV0lOTURfVkZGMTsKKworCQlvc2RfbW9kaWZ5KHNkLCB3aW5tZF9tYXNrLCB3aW5tZCwgT1NEX1ZJRFdJTk1EKTsKKwkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT5saW5lX2xlbmd0aCA+PiA1LCBPU0RfVklEV0lOMU9GU1QpOworCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnhwb3MsIE9TRF9WSURXSU4xWFApOworCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnhzaXplLCBPU0RfVklEV0lOMVhMKTsKKwkJLyoKKwkJICogRm9yIFlVVjQyMFAgZm9ybWF0IHRoZSByZWdpc3RlciBjb250ZW50cyBhcmUKKwkJICogZHVwbGljYXRlZCBpbiBib3RoIFZJRCByZWdpc3RlcnMKKwkJICovCisJCW9zZF9tb2RpZnkoc2QsIE9TRF9NSVNDQ1RMX1M0MjBELCB+T1NEX01JU0NDVExfUzQyMEQsCisJCQkgICBPU0RfTUlTQ0NUTCk7CisKKwkJaWYgKGxjb25maWctPmludGVybGFjZWQpIHsKKwkJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eXBvcyA+PiAxLCBPU0RfVklEV0lOMVlQKTsKKwkJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eXNpemUgPj4gMSwgT1NEX1ZJRFdJTjFZTCk7CisJCX0gZWxzZSB7CisJCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnlwb3MsIE9TRF9WSURXSU4xWVApOworCQkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT55c2l6ZSwgT1NEX1ZJRFdJTjFZTCk7CisJCX0KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IG9zZF9zZXRfbGF5ZXJfY29uZmlnKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllciwKKwkJCQlzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyAqbGNvbmZpZykKK3sKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2QgPSBzZDsKKwlzdHJ1Y3Qgb3NkX3dpbmRvd19zdGF0ZSAqd2luID0gJm9zZC0+d2luW2xheWVyXTsKKwlzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyAqY2ZnID0gJndpbi0+bGNvbmZpZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZWplY3RfY29uZmlnOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCisJcmVqZWN0X2NvbmZpZyA9IHRyeV9sYXllcl9jb25maWcoc2QsIGxheWVyLCBsY29uZmlnKTsKKwlpZiAocmVqZWN0X2NvbmZpZykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvc2QtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHJlamVjdF9jb25maWc7CisJfQorCisJLyogdXBkYXRlIHRoZSBjdXJyZW50IENiL0NyIG9yZGVyICovCisJaWYgKGlzX3ljX3BpeGZtdChsY29uZmlnLT5waXhmbXQpKQorCQlvc2QtPnljX3BpeGZtdCA9IGxjb25maWctPnBpeGZtdDsKKworCS8qCisJICogSWYgd2UgYXJlIHN3aXRjaGluZyBPU0QxIGZyb20gbm9ybWFsIG1vZGUgdG8gYXR0cmlidXRlIG1vZGUgb3IgZnJvbQorCSAqIGF0dHJpYnV0ZSBtb2RlIHRvIG5vcm1hbCBtb2RlLCB0aGVuIHdlIG11c3QgZGlzYWJsZSB0aGUgd2luZG93LgorCSAqLworCWlmIChsYXllciA9PSBXSU5fT1NEMSkgeworCQlpZiAoKChsY29uZmlnLT5waXhmbXQgPT0gUElYRk1UX09TRF9BVFRSKSAmJgorCQkgIChjZmctPnBpeGZtdCAhPSBQSVhGTVRfT1NEX0FUVFIpKSB8fAorCQkgICgobGNvbmZpZy0+cGl4Zm10ICE9IFBJWEZNVF9PU0RfQVRUUikgJiYKKwkJICAoY2ZnLT5waXhmbXQgPT0gUElYRk1UX09TRF9BVFRSKSkpIHsKKwkJCXdpbi0+aXNfZW5hYmxlZCA9IDA7CisJCQlfb3NkX2Rpc2FibGVfbGF5ZXIoc2QsIGxheWVyKTsKKwkJfQorCX0KKworCV9vc2Rfc2V0X2xheWVyX2NvbmZpZyhzZCwgbGF5ZXIsIGxjb25maWcpOworCisJaWYgKGxheWVyID09IFdJTl9PU0QxKSB7CisJCXN0cnVjdCBvc2Rfb3Nkd2luX3N0YXRlICpvc2R3aW5fc3RhdGUgPQorCQkgICAgJm9zZC0+b3Nkd2luW09TRFdJTl9PU0QxXTsKKworCQlpZiAoKGxjb25maWctPnBpeGZtdCAhPSBQSVhGTVRfT1NEX0FUVFIpICYmCisJCSAgKGNmZy0+cGl4Zm10ID09IFBJWEZNVF9PU0RfQVRUUikpIHsKKwkJCS8qCisJCQkgKiBXZSBqdXN0IHN3aXRjaGVkIE9TRDEgZnJvbSBhdHRyaWJ1dGUgbW9kZSB0byBub3JtYWwKKwkJCSAqIG1vZGUsIHNvIHdlIG11c3QgaW5pdGlhbGl6ZSB0aGUgQ0xVVCBzZWxlY3QsIHRoZQorCQkJICogYmxlbmQgZmFjdG9yLCB0cmFuc3BhcmVuY3kgY29sb3JrZXkgZW5hYmxlLCBhbmQKKwkJCSAqIGF0dGVudWF0aW9uIGVuYWJsZSAoRE02NDQ2IG9ubHkpIGJpdHMgaW4gdGhlCisJCQkgKiBPU0RXSU4xTUQgcmVnaXN0ZXIuCisJCQkgKi8KKwkJCV9vc2Rfc2V0X29zZF9jbHV0KHNkLCBPU0RXSU5fT1NEMSwKKwkJCQkJCSAgIG9zZHdpbl9zdGF0ZS0+Y2x1dCk7CisJCQlfb3NkX3NldF9ibGVuZGluZ19mYWN0b3Ioc2QsIE9TRFdJTl9PU0QxLAorCQkJCQkJCSAgb3Nkd2luX3N0YXRlLT5ibGVuZCk7CisJCQlpZiAob3Nkd2luX3N0YXRlLT5jb2xvcmtleV9ibGVuZGluZykgeworCQkJCV9vc2RfZW5hYmxlX2NvbG9yX2tleShzZCwgT1NEV0lOX09TRDEsCisJCQkJCQkJICAgICAgIG9zZHdpbl9zdGF0ZS0+CisJCQkJCQkJICAgICAgIGNvbG9ya2V5LAorCQkJCQkJCSAgICAgICBsY29uZmlnLT5waXhmbXQpOworCQkJfSBlbHNlCisJCQkJX29zZF9kaXNhYmxlX2NvbG9yX2tleShzZCwgT1NEV0lOX09TRDEpOworCQkJX29zZF9zZXRfcmVjNjAxX2F0dGVudWF0aW9uKHNkLCBPU0RXSU5fT1NEMSwKKwkJCQkJCSAgICBvc2R3aW5fc3RhdGUtPgorCQkJCQkJICAgIHJlYzYwMV9hdHRlbnVhdGlvbik7CisJCX0gZWxzZSBpZiAoKGxjb25maWctPnBpeGZtdCA9PSBQSVhGTVRfT1NEX0FUVFIpICYmCisJCSAgKGNmZy0+cGl4Zm10ICE9IFBJWEZNVF9PU0RfQVRUUikpIHsKKwkJCS8qCisJCQkgKiBXZSBqdXN0IHN3aXRjaGVkIE9TRDEgZnJvbSBub3JtYWwgbW9kZSB0byBhdHRyaWJ1dGUKKwkJCSAqIG1vZGUsIHNvIHdlIG11c3QgaW5pdGlhbGl6ZSB0aGUgYmxpbmsgZW5hYmxlIGFuZAorCQkJICogYmxpbmsgaW50ZXJ2YWwgYml0cyBpbiB0aGUgT1NEQVRSTUQgcmVnaXN0ZXIuCisJCQkgKi8KKwkJCV9vc2Rfc2V0X2JsaW5rX2F0dHJpYnV0ZShzZCwgb3NkLT5pc19ibGlua2luZywKKwkJCQkJCQkgIG9zZC0+YmxpbmspOworCQl9CisJfQorCisJLyoKKwkgKiBJZiB3ZSBqdXN0IHN3aXRjaGVkIHRvIGEgMS0sIDItLCBvciA0LWJpdHMtcGVyLXBpeGVsIGJpdG1hcCBmb3JtYXQKKwkgKiB0aGVuIGNvbmZpZ3VyZSBhIGRlZmF1bHQgcGFsZXR0ZSBtYXAuCisJICovCisJaWYgKChsY29uZmlnLT5waXhmbXQgIT0gY2ZnLT5waXhmbXQpICYmCisJICAoKGxjb25maWctPnBpeGZtdCA9PSBQSVhGTVRfMUJQUCkgfHwKKwkgIChsY29uZmlnLT5waXhmbXQgPT0gUElYRk1UXzJCUFApIHx8CisJICAobGNvbmZpZy0+cGl4Zm10ID09IFBJWEZNVF80QlBQKSkpIHsKKwkJZW51bSBvc2Rfd2luX2xheWVyIG9zZHdpbiA9CisJCSAgICAoKGxheWVyID09IFdJTl9PU0QwKSA/IE9TRFdJTl9PU0QwIDogT1NEV0lOX09TRDEpOworCQlzdHJ1Y3Qgb3NkX29zZHdpbl9zdGF0ZSAqb3Nkd2luX3N0YXRlID0KKwkJICAgICZvc2QtPm9zZHdpbltvc2R3aW5dOworCQl1bnNpZ25lZCBjaGFyIGNsdXRfaW5kZXg7CisJCXVuc2lnbmVkIGNoYXIgY2x1dF9lbnRyaWVzID0gMDsKKworCQlzd2l0Y2ggKGxjb25maWctPnBpeGZtdCkgeworCQljYXNlIFBJWEZNVF8xQlBQOgorCQkJY2x1dF9lbnRyaWVzID0gMjsKKwkJCWJyZWFrOworCQljYXNlIFBJWEZNVF8yQlBQOgorCQkJY2x1dF9lbnRyaWVzID0gNDsKKwkJCWJyZWFrOworCQljYXNlIFBJWEZNVF80QlBQOgorCQkJY2x1dF9lbnRyaWVzID0gMTY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqIFRoZSBkZWZhdWx0IHBhbGV0dGUgbWFwIG1hcHMgdGhlIHBpeGVsIHZhbHVlIHRvIHRoZSBjbHV0CisJCSAqIGluZGV4LCBpLmUuIHBpeGVsIHZhbHVlIDAgbWFwcyB0byBjbHV0IGVudHJ5IDAsIHBpeGVsIHZhbHVlCisJCSAqIDEgbWFwcyB0byBjbHV0IGVudHJ5IDEsIGV0Yy4KKwkJICovCisJCWZvciAoY2x1dF9pbmRleCA9IDA7IGNsdXRfaW5kZXggPCAxNjsgY2x1dF9pbmRleCsrKSB7CisJCQlvc2R3aW5fc3RhdGUtPnBhbGV0dGVfbWFwW2NsdXRfaW5kZXhdID0gY2x1dF9pbmRleDsKKwkJCWlmIChjbHV0X2luZGV4IDwgY2x1dF9lbnRyaWVzKSB7CisJCQkJX29zZF9zZXRfcGFsZXR0ZV9tYXAoc2QsIG9zZHdpbiwgY2x1dF9pbmRleCwKKwkJCQkJCSAgICAgY2x1dF9pbmRleCwKKwkJCQkJCSAgICAgbGNvbmZpZy0+cGl4Zm10KTsKKwkJCX0KKwkJfQorCX0KKworCSpjZmcgPSAqbGNvbmZpZzsKKwkvKiBETTY0NDY6IGNvbmZpZ3VyZSB0aGUgUkdCODg4IGVuYWJsZSBhbmQgd2luZG93IHNlbGVjdGlvbiAqLworCWlmIChvc2QtPndpbltXSU5fVklEMF0ubGNvbmZpZy5waXhmbXQgPT0gUElYRk1UX1JHQjg4OCkKKwkJX29zZF9lbmFibGVfdmlkX3JnYjg4OChzZCwgV0lOX1ZJRDApOworCWVsc2UgaWYgKG9zZC0+d2luW1dJTl9WSUQxXS5sY29uZmlnLnBpeGZtdCA9PSBQSVhGTVRfUkdCODg4KQorCQlfb3NkX2VuYWJsZV92aWRfcmdiODg4KHNkLCBXSU5fVklEMSk7CisJZWxzZQorCQlfb3NkX2Rpc2FibGVfdmlkX3JnYjg4OChzZCk7CisKKwlpZiAobGF5ZXIgPT0gV0lOX1ZJRDApIHsKKwkJb3NkLT5waW5ncG9uZyA9CisJCSAgICBfb3NkX2RtNjQ0Nl92aWQwX3Bpbmdwb25nKHNkLCBvc2QtPmZpZWxkX2ludmVyc2lvbiwKKwkJCQkJCSAgICAgICB3aW4tPmZiX2Jhc2VfcGh5cywKKwkJCQkJCSAgICAgICBjZmcpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9zZF9pbml0X2xheWVyKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllcikKK3sKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2QgPSBzZDsKKwlzdHJ1Y3Qgb3NkX3dpbmRvd19zdGF0ZSAqd2luID0gJm9zZC0+d2luW2xheWVyXTsKKwllbnVtIG9zZF93aW5fbGF5ZXIgb3Nkd2luOworCXN0cnVjdCBvc2Rfb3Nkd2luX3N0YXRlICpvc2R3aW5fc3RhdGU7CisJc3RydWN0IG9zZF9sYXllcl9jb25maWcgKmNmZyA9ICZ3aW4tPmxjb25maWc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvc2QtPmxvY2ssIGZsYWdzKTsKKworCXdpbi0+aXNfZW5hYmxlZCA9IDA7CisJX29zZF9kaXNhYmxlX2xheWVyKHNkLCBsYXllcik7CisKKwl3aW4tPmhfem9vbSA9IFpPT01fWDE7CisJd2luLT52X3pvb20gPSBaT09NX1gxOworCV9vc2Rfc2V0X3pvb20oc2QsIGxheWVyLCB3aW4tPmhfem9vbSwgd2luLT52X3pvb20pOworCisJd2luLT5mYl9iYXNlX3BoeXMgPSAwOworCV9vc2Rfc3RhcnRfbGF5ZXIoc2QsIGxheWVyLCB3aW4tPmZiX2Jhc2VfcGh5cywgMCk7CisKKwljZmctPmxpbmVfbGVuZ3RoID0gMDsKKwljZmctPnhzaXplID0gMDsKKwljZmctPnlzaXplID0gMDsKKwljZmctPnhwb3MgPSAwOworCWNmZy0+eXBvcyA9IDA7CisJY2ZnLT5pbnRlcmxhY2VkID0gMDsKKwlzd2l0Y2ggKGxheWVyKSB7CisJY2FzZSBXSU5fT1NEMDoKKwljYXNlIFdJTl9PU0QxOgorCQlvc2R3aW4gPSAobGF5ZXIgPT0gV0lOX09TRDApID8gT1NEV0lOX09TRDAgOiBPU0RXSU5fT1NEMTsKKwkJb3Nkd2luX3N0YXRlID0gJm9zZC0+b3Nkd2luW29zZHdpbl07CisJCS8qCisJCSAqIE90aGVyIGNvZGUgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgT1NEIHdpbmRvd3MgZGVmYXVsdCB0byBhCisJCSAqIGJpdG1hcCBwaXhlbCBmb3JtYXQgd2hlbiB0aGV5IGFyZSBkZWFsbG9jYXRlZCwgc28gZG9uJ3QKKwkJICogY2hhbmdlIHRoaXMgZGVmYXVsdCBwaXhlbCBmb3JtYXQuCisJCSAqLworCQljZmctPnBpeGZtdCA9IFBJWEZNVF84QlBQOworCQlfb3NkX3NldF9sYXllcl9jb25maWcoc2QsIGxheWVyLCBjZmcpOworCQlvc2R3aW5fc3RhdGUtPmNsdXQgPSBSQU1fQ0xVVDsKKwkJX29zZF9zZXRfb3NkX2NsdXQoc2QsIG9zZHdpbiwgb3Nkd2luX3N0YXRlLT5jbHV0KTsKKwkJb3Nkd2luX3N0YXRlLT5jb2xvcmtleV9ibGVuZGluZyA9IDA7CisJCV9vc2RfZGlzYWJsZV9jb2xvcl9rZXkoc2QsIG9zZHdpbik7CisJCW9zZHdpbl9zdGF0ZS0+YmxlbmQgPSBPU0RfOF9WSURfMDsKKwkJX29zZF9zZXRfYmxlbmRpbmdfZmFjdG9yKHNkLCBvc2R3aW4sIG9zZHdpbl9zdGF0ZS0+YmxlbmQpOworCQlvc2R3aW5fc3RhdGUtPnJlYzYwMV9hdHRlbnVhdGlvbiA9IDA7CisJCV9vc2Rfc2V0X3JlYzYwMV9hdHRlbnVhdGlvbihzZCwgb3Nkd2luLAorCQkJCQkJICAgICBvc2R3aW5fc3RhdGUtPgorCQkJCQkJICAgICByZWM2MDFfYXR0ZW51YXRpb24pOworCQlpZiAob3Nkd2luID09IE9TRFdJTl9PU0QxKSB7CisJCQlvc2QtPmlzX2JsaW5raW5nID0gMDsKKwkJCW9zZC0+YmxpbmsgPSBCTElOS19YMTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdJTl9WSUQwOgorCWNhc2UgV0lOX1ZJRDE6CisJCWNmZy0+cGl4Zm10ID0gb3NkLT55Y19waXhmbXQ7CisJCV9vc2Rfc2V0X2xheWVyX2NvbmZpZyhzZCwgbGF5ZXIsIGNmZyk7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9zZC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBvc2RfcmVsZWFzZV9sYXllcihzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgZW51bSBvc2RfbGF5ZXIgbGF5ZXIpCit7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkID0gc2Q7CisJc3RydWN0IG9zZF93aW5kb3dfc3RhdGUgKndpbiA9ICZvc2QtPndpbltsYXllcl07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvc2QtPmxvY2ssIGZsYWdzKTsKKworCWlmICghd2luLT5pc19hbGxvY2F0ZWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3NkLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvc2QtPmxvY2ssIGZsYWdzKTsKKwlvc2RfaW5pdF9sYXllcihzZCwgbGF5ZXIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZvc2QtPmxvY2ssIGZsYWdzKTsKKworCXdpbi0+aXNfYWxsb2NhdGVkID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9zZC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG9zZF9yZXF1ZXN0X2xheWVyKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllcikKK3sKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2QgPSBzZDsKKwlzdHJ1Y3Qgb3NkX3dpbmRvd19zdGF0ZSAqd2luID0gJm9zZC0+d2luW2xheWVyXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHdpbi0+aXNfYWxsb2NhdGVkKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJfQorCXdpbi0+aXNfYWxsb2NhdGVkID0gMTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9vc2RfaW5pdChzdHJ1Y3Qgb3NkX3N0YXRlICpzZCkKK3sKKwlvc2Rfd3JpdGUoc2QsIDAsIE9TRF9NT0RFKTsKKwlvc2Rfd3JpdGUoc2QsIDAsIE9TRF9WSURXSU5NRCk7CisJb3NkX3dyaXRlKHNkLCAwLCBPU0RfT1NEV0lOME1EKTsKKwlvc2Rfd3JpdGUoc2QsIDAsIE9TRF9PU0RXSU4xTUQpOworCW9zZF93cml0ZShzZCwgMCwgT1NEX1JFQ1RDVVIpOworCW9zZF93cml0ZShzZCwgMCwgT1NEX01JU0NDVEwpOworfQorCitzdGF0aWMgdm9pZCBvc2Rfc2V0X2xlZnRfbWFyZ2luKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCB1MzIgdmFsKQoreworCW9zZF93cml0ZShzZCwgdmFsLCBPU0RfQkFTRVBYKTsKK30KKworc3RhdGljIHZvaWQgb3NkX3NldF90b3BfbWFyZ2luKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCB1MzIgdmFsKQoreworCW9zZF93cml0ZShzZCwgdmFsLCBPU0RfQkFTRVBZKTsKK30KKworc3RhdGljIGludCBvc2RfaW5pdGlhbGl6ZShzdHJ1Y3Qgb3NkX3N0YXRlICpvc2QpCit7CisJaWYgKG9zZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlfb3NkX2luaXQob3NkKTsKKworCS8qIHNldCBkZWZhdWx0IENiL0NyIG9yZGVyICovCisJb3NkLT55Y19waXhmbXQgPSBQSVhGTVRfWUNiQ3JJOworCisJX29zZF9zZXRfZmllbGRfaW52ZXJzaW9uKG9zZCwgb3NkLT5maWVsZF9pbnZlcnNpb24pOworCV9vc2Rfc2V0X3JvbV9jbHV0KG9zZCwgb3NkLT5yb21fY2x1dCk7CisKKwlvc2RfaW5pdF9sYXllcihvc2QsIFdJTl9PU0QwKTsKKwlvc2RfaW5pdF9sYXllcihvc2QsIFdJTl9WSUQwKTsKKwlvc2RfaW5pdF9sYXllcihvc2QsIFdJTl9PU0QxKTsKKwlvc2RfaW5pdF9sYXllcihvc2QsIFdJTl9WSUQxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHZwYmVfb3NkX29wcyBvc2Rfb3BzID0geworCS5pbml0aWFsaXplID0gb3NkX2luaXRpYWxpemUsCisJLnJlcXVlc3RfbGF5ZXIgPSBvc2RfcmVxdWVzdF9sYXllciwKKwkucmVsZWFzZV9sYXllciA9IG9zZF9yZWxlYXNlX2xheWVyLAorCS5lbmFibGVfbGF5ZXIgPSBvc2RfZW5hYmxlX2xheWVyLAorCS5kaXNhYmxlX2xheWVyID0gb3NkX2Rpc2FibGVfbGF5ZXIsCisJLnNldF9sYXllcl9jb25maWcgPSBvc2Rfc2V0X2xheWVyX2NvbmZpZywKKwkuZ2V0X2xheWVyX2NvbmZpZyA9IG9zZF9nZXRfbGF5ZXJfY29uZmlnLAorCS5zdGFydF9sYXllciA9IG9zZF9zdGFydF9sYXllciwKKwkuc2V0X2xlZnRfbWFyZ2luID0gb3NkX3NldF9sZWZ0X21hcmdpbiwKKwkuc2V0X3RvcF9tYXJnaW4gPSBvc2Rfc2V0X3RvcF9tYXJnaW4sCit9OworCitzdGF0aWMgaW50IG9zZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBvc2RfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQgPSAwOworCisJb3NkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG9zZF9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChvc2QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlvc2QtPmRldiA9ICZwZGV2LT5kZXY7CisJcGRhdGEgPSAoc3RydWN0IG9zZF9wbGF0Zm9ybV9kYXRhICopcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJb3NkLT52cGJlX3R5cGUgPSAoZW51bSB2cGJlX3ZlcnNpb24pcGRhdGEtPnZwYmVfdHlwZTsKKwlpZiAoTlVMTCA9PSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSkgeworCQlkZXZfZXJyKG9zZC0+ZGV2LCAiTm8gcGxhdGZvcm0gZGF0YSBkZWZpbmVkIGZvciBPU0QiCisJCQkiIHN1YiBkZXZpY2VcbiIpOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGZyZWVfbWVtOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2Vycihvc2QtPmRldiwgIlVuYWJsZSB0byBnZXQgT1NEIHJlZ2lzdGVyIGFkZHJlc3MgbWFwXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX21lbTsKKwl9CisJb3NkLT5vc2RfYmFzZV9waHlzID0gcmVzLT5zdGFydDsKKwlvc2QtPm9zZF9zaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihvc2QtPm9zZF9iYXNlX3BoeXMsIG9zZC0+b3NkX3NpemUsCisJCQkJTU9EVUxFX05BTUUpKSB7CisJCWRldl9lcnIob3NkLT5kZXYsICJVbmFibGUgdG8gcmVzZXJ2ZSBPU0QgTU1JTyByZWdpb25cbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfbWVtOworCX0KKwlvc2QtPm9zZF9iYXNlID0gKHVuc2lnbmVkIGxvbmcpaW9yZW1hcF9ub2NhY2hlKHJlcy0+c3RhcnQsCisJCQkJCQkJb3NkLT5vc2Rfc2l6ZSk7CisJaWYgKCFvc2QtPm9zZF9iYXNlKSB7CisJCWRldl9lcnIob3NkLT5kZXYsICJVbmFibGUgdG8gbWFwIHRoZSBPU0QgcmVnaW9uXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byByZWxlYXNlX21lbV9yZWdpb247CisJfQorCXNwaW5fbG9ja19pbml0KCZvc2QtPmxvY2spOworCW9zZC0+b3BzID0gb3NkX29wczsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBvc2QpOworCWRldl9ub3RpY2Uob3NkLT5kZXYsICJPU0Qgc3ViIGRldmljZSBwcm9iZSBzdWNjZXNzXG4iKTsKKwlyZXR1cm4gcmV0OworCityZWxlYXNlX21lbV9yZWdpb246CisJcmVsZWFzZV9tZW1fcmVnaW9uKG9zZC0+b3NkX2Jhc2VfcGh5cywgb3NkLT5vc2Rfc2l6ZSk7CitmcmVlX21lbToKKwlrZnJlZShvc2QpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3NkX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaW91bm1hcCgodm9pZCAqKW9zZC0+b3NkX2Jhc2UpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihvc2QtPm9zZF9iYXNlX3BoeXMsIG9zZC0+b3NkX3NpemUpOworCWtmcmVlKG9zZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9zZF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IG9zZF9wcm9iZSwKKwkucmVtb3ZlCQk9IG9zZF9yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gTU9EVUxFX05BTUUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IG9zZF9pbml0KHZvaWQpCit7CisJaWYgKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmb3NkX2RyaXZlcikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcmVnaXN0ZXIgZGF2aW5jaSBvc2QgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9zZF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm9zZF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChvc2RfaW5pdCk7Cittb2R1bGVfZXhpdChvc2RfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGFWaW5jaSBPU0QgTWFuYWdlciBEcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlRleGFzIEluc3RydW1lbnRzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV9vc2RfcmVncy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfb3NkX3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODQ1MjBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfb3NkX3JlZ3MuaApAQCAtMCwwICsxLDM2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDEwIFRleGFzIEluc3RydW1lbnRzIEluYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfVlBCRV9PU0RfUkVHU19ICisjZGVmaW5lIF9WUEJFX09TRF9SRUdTX0gKKworLyogVlBCRSBHbG9iYWwgUmVnaXN0ZXJzICovCisjZGVmaW5lIFZQQkVfUElECQkJCTB4MAorI2RlZmluZSBWUEJFX1BDUgkJCQkweDQKKworLyogVlBTUyBDTG9jayBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgVlBTU0NMS19QSUQJCQkJMHgwMAorI2RlZmluZSBWUFNTQ0xLX0NMS0NUUkwJCQkJMHgwNAorCisvKiBWUFNTIEJ1ZmZlciBMb2dpYyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgVlBTU0JMX1BJRAkJCQkweDAwCisjZGVmaW5lIFZQU1NCTF9QQ1IJCQkJMHgwNAorI2RlZmluZSBWUFNTQkxfQkNSCQkJCTB4MDgKKyNkZWZpbmUgVlBTU0JMX0lOVFNUQVQJCQkJMHgwQworI2RlZmluZSBWUFNTQkxfSU5UU0VMCQkJCTB4MTAKKyNkZWZpbmUgVlBTU0JMX0VWVFNFTAkJCQkweDE0CisjZGVmaW5lIFZQU1NCTF9NRU1DVFJMCQkJCTB4MTgKKyNkZWZpbmUgVlBTU0JMX0NDRENNVVgJCQkJMHgxQworCisvKiBETTM2NSBJU1A1IHN5c3RlbSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIElTUDVfUElECQkJCTB4MAorI2RlZmluZSBJU1A1X1BDQ1IJCQkJMHg0CisjZGVmaW5lIElTUDVfQkNSCQkJCTB4OAorI2RlZmluZSBJU1A1X0lOVFNUQVQJCQkJMHhDCisjZGVmaW5lIElTUDVfSU5UU0VMMQkJCQkweDEwCisjZGVmaW5lIElTUDVfSU5UU0VMMgkJCQkweDE0CisjZGVmaW5lIElTUDVfSU5UU0VMMwkJCQkweDE4CisjZGVmaW5lIElTUDVfRVZUU0VMCQkJCTB4MWMKKyNkZWZpbmUgSVNQNV9DQ0RDTVVYCQkJCTB4MjAKKworLyogVlBCRSBPbi1TY3JlZW4gRGlzcGxheSBTdWJzeXN0ZW0gUmVnaXN0ZXJzIChPU0QpICovCisjZGVmaW5lIE9TRF9NT0RFCQkJCTB4MDAKKyNkZWZpbmUgT1NEX1ZJRFdJTk1ECQkJCTB4MDQKKyNkZWZpbmUgT1NEX09TRFdJTjBNRAkJCQkweDA4CisjZGVmaW5lIE9TRF9PU0RXSU4xTUQJCQkJMHgwQworI2RlZmluZSBPU0RfT1NEQVRSTUQJCQkJMHgwQworI2RlZmluZSBPU0RfUkVDVENVUgkJCQkweDEwCisjZGVmaW5lIE9TRF9WSURXSU4wT0ZTVAkJCQkweDE4CisjZGVmaW5lIE9TRF9WSURXSU4xT0ZTVAkJCQkweDFDCisjZGVmaW5lIE9TRF9PU0RXSU4wT0ZTVAkJCQkweDIwCisjZGVmaW5lIE9TRF9PU0RXSU4xT0ZTVAkJCQkweDI0CisjZGVmaW5lIE9TRF9WSURXSU5BREgJCQkJMHgyOAorI2RlZmluZSBPU0RfVklEV0lOMEFETAkJCQkweDJDCisjZGVmaW5lIE9TRF9WSURXSU4wQURSCQkJCTB4MkMKKyNkZWZpbmUgT1NEX1ZJRFdJTjFBREwJCQkJMHgzMAorI2RlZmluZSBPU0RfVklEV0lOMUFEUgkJCQkweDMwCisjZGVmaW5lIE9TRF9PU0RXSU5BREgJCQkJMHgzNAorI2RlZmluZSBPU0RfT1NEV0lOMEFETAkJCQkweDM4CisjZGVmaW5lIE9TRF9PU0RXSU4wQURSCQkJCTB4MzgKKyNkZWZpbmUgT1NEX09TRFdJTjFBREwJCQkJMHgzQworI2RlZmluZSBPU0RfT1NEV0lOMUFEUgkJCQkweDNDCisjZGVmaW5lIE9TRF9CQVNFUFgJCQkJMHg0MAorI2RlZmluZSBPU0RfQkFTRVBZCQkJCTB4NDQKKyNkZWZpbmUgT1NEX1ZJRFdJTjBYUAkJCQkweDQ4CisjZGVmaW5lIE9TRF9WSURXSU4wWVAJCQkJMHg0QworI2RlZmluZSBPU0RfVklEV0lOMFhMCQkJCTB4NTAKKyNkZWZpbmUgT1NEX1ZJRFdJTjBZTAkJCQkweDU0CisjZGVmaW5lIE9TRF9WSURXSU4xWFAJCQkJMHg1OAorI2RlZmluZSBPU0RfVklEV0lOMVlQCQkJCTB4NUMKKyNkZWZpbmUgT1NEX1ZJRFdJTjFYTAkJCQkweDYwCisjZGVmaW5lIE9TRF9WSURXSU4xWUwJCQkJMHg2NAorI2RlZmluZSBPU0RfT1NEV0lOMFhQCQkJCTB4NjgKKyNkZWZpbmUgT1NEX09TRFdJTjBZUAkJCQkweDZDCisjZGVmaW5lIE9TRF9PU0RXSU4wWEwJCQkJMHg3MAorI2RlZmluZSBPU0RfT1NEV0lOMFlMCQkJCTB4NzQKKyNkZWZpbmUgT1NEX09TRFdJTjFYUAkJCQkweDc4CisjZGVmaW5lIE9TRF9PU0RXSU4xWVAJCQkJMHg3QworI2RlZmluZSBPU0RfT1NEV0lOMVhMCQkJCTB4ODAKKyNkZWZpbmUgT1NEX09TRFdJTjFZTAkJCQkweDg0CisjZGVmaW5lIE9TRF9DVVJYUAkJCQkweDg4CisjZGVmaW5lIE9TRF9DVVJZUAkJCQkweDhDCisjZGVmaW5lIE9TRF9DVVJYTAkJCQkweDkwCisjZGVmaW5lIE9TRF9DVVJZTAkJCQkweDk0CisjZGVmaW5lIE9TRF9XMEJNUDAxCQkJCTB4QTAKKyNkZWZpbmUgT1NEX1cwQk1QMjMJCQkJMHhBNAorI2RlZmluZSBPU0RfVzBCTVA0NQkJCQkweEE4CisjZGVmaW5lIE9TRF9XMEJNUDY3CQkJCTB4QUMKKyNkZWZpbmUgT1NEX1cwQk1QODkJCQkJMHhCMAorI2RlZmluZSBPU0RfVzBCTVBBQgkJCQkweEI0CisjZGVmaW5lIE9TRF9XMEJNUENECQkJCTB4QjgKKyNkZWZpbmUgT1NEX1cwQk1QRUYJCQkJMHhCQworI2RlZmluZSBPU0RfVzFCTVAwMQkJCQkweEMwCisjZGVmaW5lIE9TRF9XMUJNUDIzCQkJCTB4QzQKKyNkZWZpbmUgT1NEX1cxQk1QNDUJCQkJMHhDOAorI2RlZmluZSBPU0RfVzFCTVA2NwkJCQkweENDCisjZGVmaW5lIE9TRF9XMUJNUDg5CQkJCTB4RDAKKyNkZWZpbmUgT1NEX1cxQk1QQUIJCQkJMHhENAorI2RlZmluZSBPU0RfVzFCTVBDRAkJCQkweEQ4CisjZGVmaW5lIE9TRF9XMUJNUEVGCQkJCTB4REMKKyNkZWZpbmUgT1NEX1ZCTkRSWQkJCQkweEUwCisjZGVmaW5lIE9TRF9FWFRNT0RFCQkJCTB4RTQKKyNkZWZpbmUgT1NEX01JU0NDVEwJCQkJMHhFOAorI2RlZmluZSBPU0RfQ0xVVFJBTVlDQgkJCQkweEVDCisjZGVmaW5lIE9TRF9DTFVUUkFNQ1IJCQkJMHhGMAorI2RlZmluZSBPU0RfVFJBTlNQVkFMCQkJCTB4RjQKKyNkZWZpbmUgT1NEX1RSQU5TUFZBTEwJCQkJMHhGNAorI2RlZmluZSBPU0RfVFJBTlNQVkFMVQkJCQkweEY4CisjZGVmaW5lIE9TRF9UUkFOU1BCTVBJRFgJCQkweEZDCisjZGVmaW5lIE9TRF9QUFZXSU4wQURSCQkJCTB4RkMKKworLyogYml0IGRlZmluaXRpb25zICovCisjZGVmaW5lIFZQQkVfUENSX1ZFTkNfRElWCQkJKDEgPDwgMSkKKyNkZWZpbmUgVlBCRV9QQ1JfQ0xLX09GRgkJCSgxIDw8IDApCisKKyNkZWZpbmUgVlBTU0JMX0lOVFNUQVRfSFNTSUlOVAkJCSgxIDw8IDE0KQorI2RlZmluZSBWUFNTQkxfSU5UU1RBVF9DRkFMRElOVAkJCSgxIDw8IDEzKQorI2RlZmluZSBWUFNTQkxfSU5UU1RBVF9JUElQRV9JTlQ1CQkoMSA8PCAxMikKKyNkZWZpbmUgVlBTU0JMX0lOVFNUQVRfSVBJUEVfSU5UNAkJKDEgPDwgMTEpCisjZGVmaW5lIFZQU1NCTF9JTlRTVEFUX0lQSVBFX0lOVDMJCSgxIDw8IDEwKQorI2RlZmluZSBWUFNTQkxfSU5UU1RBVF9JUElQRV9JTlQyCQkoMSA8PCA5KQorI2RlZmluZSBWUFNTQkxfSU5UU1RBVF9JUElQRV9JTlQxCQkoMSA8PCA4KQorI2RlZmluZSBWUFNTQkxfSU5UU1RBVF9JUElQRV9JTlQwCQkoMSA8PCA3KQorI2RlZmluZSBWUFNTQkxfSU5UU1RBVF9JUElQRUlGSU5UCQkoMSA8PCA2KQorI2RlZmluZSBWUFNTQkxfSU5UU1RBVF9PU0RJTlQJCQkoMSA8PCA1KQorI2RlZmluZSBWUFNTQkxfSU5UU1RBVF9WRU5DSU5UCQkJKDEgPDwgNCkKKyNkZWZpbmUgVlBTU0JMX0lOVFNUQVRfSDNBSU5UCQkJKDEgPDwgMykKKyNkZWZpbmUgVlBTU0JMX0lOVFNUQVRfQ0NEQ19WRElOVDIJCSgxIDw8IDIpCisjZGVmaW5lIFZQU1NCTF9JTlRTVEFUX0NDRENfVkRJTlQxCQkoMSA8PCAxKQorI2RlZmluZSBWUFNTQkxfSU5UU1RBVF9DQ0RDX1ZESU5UMAkJKDEgPDwgMCkKKworLyogRE0zNjUgSVNQNSBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgSVNQNV9JTlRTVEFUX1ZFTkNJTlQJCQkoMSA8PCAyMSkKKyNkZWZpbmUgSVNQNV9JTlRTVEFUX09TRElOVAkJCSgxIDw8IDIwKQorCisvKiBWTU9EIFRWVFlQIG9wdGlvbnMgZm9yIEhETUQ9MCAqLworI2RlZmluZSBTRFRWX05UU0MJCQkJMAorI2RlZmluZSBTRFRWX1BBTAkJCQkxCisvKiBWTU9EIFRWVFlQIG9wdGlvbnMgZm9yIEhETUQ9MSAqLworI2RlZmluZSBIRFRWXzUyNVAJCQkJMAorI2RlZmluZSBIRFRWXzYyNVAJCQkJMQorI2RlZmluZSBIRFRWXzEwODBJCQkJCTIKKyNkZWZpbmUgSERUVl83MjBQCQkJCTMKKworI2RlZmluZSBPU0RfTU9ERV9DUwkJCQkoMSA8PCAxNSkKKyNkZWZpbmUgT1NEX01PREVfT1ZSU1oJCQkJKDEgPDwgMTQpCisjZGVmaW5lIE9TRF9NT0RFX09IUlNaCQkJCSgxIDw8IDEzKQorI2RlZmluZSBPU0RfTU9ERV9FRgkJCQkoMSA8PCAxMikKKyNkZWZpbmUgT1NEX01PREVfVlZSU1oJCQkJKDEgPDwgMTEpCisjZGVmaW5lIE9TRF9NT0RFX1ZIUlNaCQkJCSgxIDw8IDEwKQorI2RlZmluZSBPU0RfTU9ERV9GU0lOVgkJCQkoMSA8PCA5KQorI2RlZmluZSBPU0RfTU9ERV9CQ0xVVAkJCQkoMSA8PCA4KQorI2RlZmluZSBPU0RfTU9ERV9DQUJHX1NISUZUCQkJMAorI2RlZmluZSBPU0RfTU9ERV9DQUJHCQkJCSgweGZmIDw8IDApCisKKyNkZWZpbmUgT1NEX1ZJRFdJTk1EX1ZGSU5WCQkJKDEgPDwgMTUpCisjZGVmaW5lIE9TRF9WSURXSU5NRF9WMUVGQwkJCSgxIDw8IDE0KQorI2RlZmluZSBPU0RfVklEV0lOTURfVkhaMV9TSElGVAkJCTEyCisjZGVmaW5lIE9TRF9WSURXSU5NRF9WSFoxCQkJKDMgPDwgMTIpCisjZGVmaW5lIE9TRF9WSURXSU5NRF9WVloxX1NISUZUCQkJMTAKKyNkZWZpbmUgT1NEX1ZJRFdJTk1EX1ZWWjEJCQkoMyA8PCAxMCkKKyNkZWZpbmUgT1NEX1ZJRFdJTk1EX1ZGRjEJCQkoMSA8PCA5KQorI2RlZmluZSBPU0RfVklEV0lOTURfQUNUMQkJCSgxIDw8IDgpCisjZGVmaW5lIE9TRF9WSURXSU5NRF9WMEVGQwkJCSgxIDw8IDYpCisjZGVmaW5lIE9TRF9WSURXSU5NRF9WSFowX1NISUZUCQkJNAorI2RlZmluZSBPU0RfVklEV0lOTURfVkhaMAkJCSgzIDw8IDQpCisjZGVmaW5lIE9TRF9WSURXSU5NRF9WVlowX1NISUZUCQkJMgorI2RlZmluZSBPU0RfVklEV0lOTURfVlZaMAkJCSgzIDw8IDIpCisjZGVmaW5lIE9TRF9WSURXSU5NRF9WRkYwCQkJKDEgPDwgMSkKKyNkZWZpbmUgT1NEX1ZJRFdJTk1EX0FDVDAJCQkoMSA8PCAwKQorCisjZGVmaW5lIE9TRF9PU0RXSU4wTURfQVROMEUJCQkoMSA8PCAxNCkKKyNkZWZpbmUgT1NEX09TRFdJTjBNRF9SR0IwRQkJCSgxIDw8IDEzKQorI2RlZmluZSBPU0RfT1NEV0lOME1EX0JNUDBNRF9TSElGVAkJMTMKKyNkZWZpbmUgT1NEX09TRFdJTjBNRF9CTVAwTUQJCQkoMyA8PCAxMykKKyNkZWZpbmUgT1NEX09TRFdJTjBNRF9DTFVUUzAJCQkoMSA8PCAxMikKKyNkZWZpbmUgT1NEX09TRFdJTjBNRF9PSFowX1NISUZUCQkxMAorI2RlZmluZSBPU0RfT1NEV0lOME1EX09IWjAJCQkoMyA8PCAxMCkKKyNkZWZpbmUgT1NEX09TRFdJTjBNRF9PVlowX1NISUZUCQk4CisjZGVmaW5lIE9TRF9PU0RXSU4wTURfT1ZaMAkJCSgzIDw8IDgpCisjZGVmaW5lIE9TRF9PU0RXSU4wTURfQk1XMF9TSElGVAkJNgorI2RlZmluZSBPU0RfT1NEV0lOME1EX0JNVzAJCQkoMyA8PCA2KQorI2RlZmluZSBPU0RfT1NEV0lOME1EX0JMTkQwX1NISUZUCQkzCisjZGVmaW5lIE9TRF9PU0RXSU4wTURfQkxORDAJCQkoNyA8PCAzKQorI2RlZmluZSBPU0RfT1NEV0lOME1EX1RFMAkJCSgxIDw8IDIpCisjZGVmaW5lIE9TRF9PU0RXSU4wTURfT0ZGMAkJCSgxIDw8IDEpCisjZGVmaW5lIE9TRF9PU0RXSU4wTURfT0FDVDAJCQkoMSA8PCAwKQorCisjZGVmaW5lIE9TRF9PU0RXSU4xTURfT0FTVwkJCSgxIDw8IDE1KQorI2RlZmluZSBPU0RfT1NEV0lOMU1EX0FUTjFFCQkJKDEgPDwgMTQpCisjZGVmaW5lIE9TRF9PU0RXSU4xTURfUkdCMUUJCQkoMSA8PCAxMykKKyNkZWZpbmUgT1NEX09TRFdJTjFNRF9CTVAxTURfU0hJRlQJCTEzCisjZGVmaW5lIE9TRF9PU0RXSU4xTURfQk1QMU1ECQkJKDMgPDwgMTMpCisjZGVmaW5lIE9TRF9PU0RXSU4xTURfQ0xVVFMxCQkJKDEgPDwgMTIpCisjZGVmaW5lIE9TRF9PU0RXSU4xTURfT0haMV9TSElGVAkJMTAKKyNkZWZpbmUgT1NEX09TRFdJTjFNRF9PSFoxCQkJKDMgPDwgMTApCisjZGVmaW5lIE9TRF9PU0RXSU4xTURfT1ZaMV9TSElGVAkJOAorI2RlZmluZSBPU0RfT1NEV0lOMU1EX09WWjEJCQkoMyA8PCA4KQorI2RlZmluZSBPU0RfT1NEV0lOMU1EX0JNVzFfU0hJRlQJCTYKKyNkZWZpbmUgT1NEX09TRFdJTjFNRF9CTVcxCQkJKDMgPDwgNikKKyNkZWZpbmUgT1NEX09TRFdJTjFNRF9CTE5EMV9TSElGVAkJMworI2RlZmluZSBPU0RfT1NEV0lOMU1EX0JMTkQxCQkJKDcgPDwgMykKKyNkZWZpbmUgT1NEX09TRFdJTjFNRF9URTEJCQkoMSA8PCAyKQorI2RlZmluZSBPU0RfT1NEV0lOMU1EX09GRjEJCQkoMSA8PCAxKQorI2RlZmluZSBPU0RfT1NEV0lOMU1EX09BQ1QxCQkJKDEgPDwgMCkKKworI2RlZmluZSBPU0RfT1NEQVRSTURfT0FTVwkJCSgxIDw8IDE1KQorI2RlZmluZSBPU0RfT1NEQVRSTURfT0haQV9TSElGVAkJCTEwCisjZGVmaW5lIE9TRF9PU0RBVFJNRF9PSFpBCQkJKDMgPDwgMTApCisjZGVmaW5lIE9TRF9PU0RBVFJNRF9PVlpBX1NISUZUCQkJOAorI2RlZmluZSBPU0RfT1NEQVRSTURfT1ZaQQkJCSgzIDw8IDgpCisjZGVmaW5lIE9TRF9PU0RBVFJNRF9CTE5LSU5UX1NISUZUCQk2CisjZGVmaW5lIE9TRF9PU0RBVFJNRF9CTE5LSU5UCQkJKDMgPDwgNikKKyNkZWZpbmUgT1NEX09TREFUUk1EX09GRkEJCQkoMSA8PCAxKQorI2RlZmluZSBPU0RfT1NEQVRSTURfQkxOSwkJCSgxIDw8IDApCisKKyNkZWZpbmUgT1NEX1JFQ1RDVVJfUkNBRF9TSElGVAkJCTgKKyNkZWZpbmUgT1NEX1JFQ1RDVVJfUkNBRAkJCSgweGZmIDw8IDgpCisjZGVmaW5lIE9TRF9SRUNUQ1VSX0NMVVRTUgkJCSgxIDw8IDcpCisjZGVmaW5lIE9TRF9SRUNUQ1VSX1JDSFdfU0hJRlQJCQk0CisjZGVmaW5lIE9TRF9SRUNUQ1VSX1JDSFcJCQkoNyA8PCA0KQorI2RlZmluZSBPU0RfUkVDVENVUl9SQ1ZXX1NISUZUCQkJMQorI2RlZmluZSBPU0RfUkVDVENVUl9SQ1ZXCQkJKDcgPDwgMSkKKyNkZWZpbmUgT1NEX1JFQ1RDVVJfUkNBQ1QJCQkoMSA8PCAwKQorCisjZGVmaW5lIE9TRF9WSURXSU4wT0ZTVF9WMExPCQkJKDB4MWZmIDw8IDApCisKKyNkZWZpbmUgT1NEX1ZJRFdJTjFPRlNUX1YxTE8JCQkoMHgxZmYgPDwgMCkKKworI2RlZmluZSBPU0RfT1NEV0lOME9GU1RfTzBMTwkJCSgweDFmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9PU0RXSU4xT0ZTVF9PMUxPCQkJKDB4MWZmIDw8IDApCisKKyNkZWZpbmUgT1NEX1dJTk9GU1RfQUhfU0hJRlQJCQk5CisKKyNkZWZpbmUgT1NEX1ZJRFdJTjBPRlNUX1YwQUgJCQkoMHhmIDw8IDkpCisjZGVmaW5lIE9TRF9WSURXSU4xT0ZTVF9WMUFICQkJKDB4ZiA8PCA5KQorI2RlZmluZSBPU0RfT1NEV0lOME9GU1RfTzBBSAkJCSgweGYgPDwgOSkKKyNkZWZpbmUgT1NEX09TRFdJTjFPRlNUX08xQUgJCQkoMHhmIDw8IDkpCisKKyNkZWZpbmUgT1NEX1ZJRFdJTkFESF9WMUFIX1NISUZUCQk4CisjZGVmaW5lIE9TRF9WSURXSU5BREhfVjFBSAkJCSgweDdmIDw8IDgpCisjZGVmaW5lIE9TRF9WSURXSU5BREhfVjBBSF9TSElGVAkJMAorI2RlZmluZSBPU0RfVklEV0lOQURIX1YwQUgJCQkoMHg3ZiA8PCAwKQorCisjZGVmaW5lIE9TRF9WSURXSU4wQURMX1YwQUwJCQkoMHhmZmZmIDw8IDApCisKKyNkZWZpbmUgT1NEX1ZJRFdJTjFBRExfVjFBTAkJCSgweGZmZmYgPDwgMCkKKworI2RlZmluZSBPU0RfT1NEV0lOQURIX08xQUhfU0hJRlQJCTgKKyNkZWZpbmUgT1NEX09TRFdJTkFESF9PMUFICQkJKDB4N2YgPDwgOCkKKyNkZWZpbmUgT1NEX09TRFdJTkFESF9PMEFIX1NISUZUCQkwCisjZGVmaW5lIE9TRF9PU0RXSU5BREhfTzBBSAkJCSgweDdmIDw8IDApCisKKyNkZWZpbmUgT1NEX09TRFdJTjBBRExfTzBBTAkJCSgweGZmZmYgPDwgMCkKKworI2RlZmluZSBPU0RfT1NEV0lOMUFETF9PMUFMCQkJKDB4ZmZmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9CQVNFUFhfQlBYCQkJCSgweDNmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9CQVNFUFlfQlBZCQkJCSgweDFmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9WSURXSU4wWFBfVjBYCQkJKDB4N2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX1ZJRFdJTjBZUF9WMFkJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfVklEV0lOMFhMX1YwVwkJCSgweDdmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9WSURXSU4wWUxfVjBICQkJKDB4N2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX1ZJRFdJTjFYUF9WMVgJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfVklEV0lOMVlQX1YxWQkJCSgweDdmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9WSURXSU4xWExfVjFXCQkJKDB4N2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX1ZJRFdJTjFZTF9WMUgJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfT1NEV0lOMFhQX1cwWAkJCSgweDdmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9PU0RXSU4wWVBfVzBZCQkJKDB4N2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX09TRFdJTjBYTF9XMFcJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfT1NEV0lOMFlMX1cwSAkJCSgweDdmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9PU0RXSU4xWFBfVzFYCQkJKDB4N2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX09TRFdJTjFZUF9XMVkJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfT1NEV0lOMVhMX1cxVwkJCSgweDdmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9PU0RXSU4xWUxfVzFICQkJKDB4N2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX0NVUlhQX1JDU1gJCQkJKDB4N2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX0NVUllQX1JDU1kJCQkJKDB4N2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX0NVUlhMX1JDU1cJCQkJKDB4N2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX0NVUllMX1JDU0gJCQkJKDB4N2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX0VYVE1PREVfRVhQTURTRUwJCQkoMSA8PCAxNSkKKyNkZWZpbmUgT1NEX0VYVE1PREVfU0NSTkhFWFBfU0hJRlQJCTEzCisjZGVmaW5lIE9TRF9FWFRNT0RFX1NDUk5IRVhQCQkJKDMgPDwgMTMpCisjZGVmaW5lIE9TRF9FWFRNT0RFX1NDUk5WRVhQCQkJKDEgPDwgMTIpCisjZGVmaW5lIE9TRF9FWFRNT0RFX09TRDFCTERDSFIJCQkoMSA8PCAxMSkKKyNkZWZpbmUgT1NEX0VYVE1PREVfT1NEMEJMRENIUgkJCSgxIDw8IDEwKQorI2RlZmluZSBPU0RfRVhUTU9ERV9BVE5PU0QxRU4JCQkoMSA8PCA5KQorI2RlZmluZSBPU0RfRVhUTU9ERV9BVE5PU0QwRU4JCQkoMSA8PCA4KQorI2RlZmluZSBPU0RfRVhUTU9ERV9PU0RIUlNaMTUJCQkoMSA8PCA3KQorI2RlZmluZSBPU0RfRVhUTU9ERV9WSURIUlNaMTUJCQkoMSA8PCA2KQorI2RlZmluZSBPU0RfRVhUTU9ERV9aTUZJTFYxSEVOCQkJKDEgPDwgNSkKKyNkZWZpbmUgT1NEX0VYVE1PREVfWk1GSUxWMVZFTgkJCSgxIDw8IDQpCisjZGVmaW5lIE9TRF9FWFRNT0RFX1pNRklMVjBIRU4JCQkoMSA8PCAzKQorI2RlZmluZSBPU0RfRVhUTU9ERV9aTUZJTFYwVkVOCQkJKDEgPDwgMikKKyNkZWZpbmUgT1NEX0VYVE1PREVfRVhQRklMSEVOCQkJKDEgPDwgMSkKKyNkZWZpbmUgT1NEX0VYVE1PREVfRVhQRklMVkVOCQkJKDEgPDwgMCkKKworI2RlZmluZSBPU0RfTUlTQ0NUTF9CTERTRUwJCQkoMSA8PCAxNSkKKyNkZWZpbmUgT1NEX01JU0NDVExfUzQyMEQJCQkoMSA8PCAxNCkKKyNkZWZpbmUgT1NEX01JU0NDVExfQk1BUFQJCQkoMSA8PCAxMykKKyNkZWZpbmUgT1NEX01JU0NDVExfRE0zNjVNCQkJKDEgPDwgMTIpCisjZGVmaW5lIE9TRF9NSVNDQ1RMX1JHQkVOCQkJKDEgPDwgNykKKyNkZWZpbmUgT1NEX01JU0NDVExfUkdCV0lOCQkJKDEgPDwgNikKKyNkZWZpbmUgT1NEX01JU0NDVExfRE1BTkcJCQkoMSA8PCA2KQorI2RlZmluZSBPU0RfTUlTQ0NUTF9UTU9OCQkJKDEgPDwgNSkKKyNkZWZpbmUgT1NEX01JU0NDVExfUlNFTAkJCSgxIDw8IDQpCisjZGVmaW5lIE9TRF9NSVNDQ1RMX0NQQlNZCQkJKDEgPDwgMykKKyNkZWZpbmUgT1NEX01JU0NDVExfUFBTVwkJCSgxIDw8IDIpCisjZGVmaW5lIE9TRF9NSVNDQ1RMX1BQUlYJCQkoMSA8PCAxKQorCisjZGVmaW5lIE9TRF9DTFVUUkFNWUNCX1lfU0hJRlQJCQk4CisjZGVmaW5lIE9TRF9DTFVUUkFNWUNCX1kJCQkoMHhmZiA8PCA4KQorI2RlZmluZSBPU0RfQ0xVVFJBTVlDQl9DQl9TSElGVAkJCTAKKyNkZWZpbmUgT1NEX0NMVVRSQU1ZQ0JfQ0IJCQkoMHhmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9DTFVUUkFNQ1JfQ1JfU0hJRlQJCQk4CisjZGVmaW5lIE9TRF9DTFVUUkFNQ1JfQ1IJCQkoMHhmZiA8PCA4KQorI2RlZmluZSBPU0RfQ0xVVFJBTUNSX0NBRERSX1NISUZUCQkwCisjZGVmaW5lIE9TRF9DTFVUUkFNQ1JfQ0FERFIJCQkoMHhmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9UUkFOU1BWQUxfUkdCVFJBTlMJCQkoMHhmZmZmIDw8IDApCisKKyNkZWZpbmUgT1NEX1RSQU5TUFZBTExfUkdCTAkJCSgweGZmZmYgPDwgMCkKKworI2RlZmluZSBPU0RfVFJBTlNQVkFMVV9ZX1NISUZUCQkJOAorI2RlZmluZSBPU0RfVFJBTlNQVkFMVV9ZCQkJKDB4ZmYgPDwgOCkKKyNkZWZpbmUgT1NEX1RSQU5TUFZBTFVfUkdCVV9TSElGVAkJMAorI2RlZmluZSBPU0RfVFJBTlNQVkFMVV9SR0JVCQkJKDB4ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfVFJBTlNQQk1QSURYX0JNUDFfU0hJRlQJCTgKKyNkZWZpbmUgT1NEX1RSQU5TUEJNUElEWF9CTVAxCQkJKDB4ZmYgPDwgOCkKKyNkZWZpbmUgT1NEX1RSQU5TUEJNUElEWF9CTVAwX1NISUZUCQkwCisjZGVmaW5lIE9TRF9UUkFOU1BCTVBJRFhfQk1QMAkJCTB4ZmYKKworI2VuZGlmCQkJCS8qIF9EQVZJTkNJX1ZQQkVfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX3ZlbmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX3ZlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2EzZTVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfdmVuYy5jCkBAIC0wLDAgKzEsNTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRleGFzIEluc3RydW1lbnRzIEluYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvbXV4Lmg+CisjaW5jbHVkZSA8bWFjaC9pby5oPgorI2luY2x1ZGUgPG1hY2gvaTJjLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cGJlX3R5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cGJlX3ZlbmMuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3Zwc3MuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgorCisjaW5jbHVkZSAidnBiZV92ZW5jX3JlZ3MuaCIKKworI2RlZmluZSBNT0RVTEVfTkFNRQlWUEJFX1ZFTkNfU1VCREVWX05BTUUKKworc3RhdGljIGludCBkZWJ1ZyA9IDI7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgMC0yIik7CisKK3N0cnVjdCB2ZW5jX3N0YXRlIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgc2Q7CisJc3RydWN0IHZlbmNfY2FsbGJhY2sgKmNhbGxiYWNrOworCXN0cnVjdCB2ZW5jX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCBkZXZpY2UgKnBkZXY7CisJdTMyIG91dHB1dDsKKwl2NGwyX3N0ZF9pZCBzdGQ7CisJc3BpbmxvY2tfdCBsb2NrOworCXZvaWQgX19pb21lbSAqdmVuY19iYXNlOworCXZvaWQgX19pb21lbSAqdmRhY2NmZ19yZWc7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB2ZW5jX3N0YXRlICp0b19zdGF0ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXJldHVybiBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCB2ZW5jX3N0YXRlLCBzZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHZlbmNfcmVhZChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgb2Zmc2V0KQoreworCXN0cnVjdCB2ZW5jX3N0YXRlICp2ZW5jID0gdG9fc3RhdGUoc2QpOworCisJcmV0dXJuIHJlYWRsKHZlbmMtPnZlbmNfYmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHZlbmNfd3JpdGUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIG9mZnNldCwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgdmVuY19zdGF0ZSAqdmVuYyA9IHRvX3N0YXRlKHNkKTsKKworCXdyaXRlbCh2YWwsICh2ZW5jLT52ZW5jX2Jhc2UgKyBvZmZzZXQpKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHZlbmNfbW9kaWZ5KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiBvZmZzZXQsCisJCQkJIHUzMiB2YWwsIHUzMiBtYXNrKQoreworCXUzMiBuZXdfdmFsID0gKHZlbmNfcmVhZChzZCwgb2Zmc2V0KSAmIH5tYXNrKSB8ICh2YWwgJiBtYXNrKTsKKworCXZlbmNfd3JpdGUoc2QsIG9mZnNldCwgbmV3X3ZhbCk7CisKKwlyZXR1cm4gbmV3X3ZhbDsKK30KKworc3RhdGljIGlubGluZSB1MzIgdmRhY2NmZ193cml0ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgdmFsKQoreworCXN0cnVjdCB2ZW5jX3N0YXRlICp2ZW5jID0gdG9fc3RhdGUoc2QpOworCisJd3JpdGVsKHZhbCwgdmVuYy0+dmRhY2NmZ19yZWcpOworCisJdmFsID0gcmVhZGwodmVuYy0+dmRhY2NmZ19yZWcpOworCisJcmV0dXJuIHZhbDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBkYWMgb2YgdGhlIFZQQkUgZm9yIHZhcmlvdXMgb3V0cHV0cworICovCitzdGF0aWMgaW50IHZlbmNfc2V0X2RhYyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgb3V0X2luZGV4KQoreworCXN3aXRjaCAob3V0X2luZGV4KSB7CisJY2FzZSAwOgorCQl2NGwyX2RiZyhkZWJ1ZywgMSwgc2QsICJTZXR0aW5nIG91dHB1dCB0byBDb21wb3NpdGVcbiIpOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX0RBQ1NFTCwgMCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdjRsMl9kYmcoZGVidWcsIDEsIHNkLCAiU2V0dGluZyBvdXRwdXQgdG8gUy1WaWRlb1xuIik7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfREFDU0VMLCAweDIxMCk7CisJCWJyZWFrOworCWNhc2UgIDI6CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfREFDU0VMLCAweDU0Myk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2ZW5jX2VuYWJsZWRpZ2l0YWxvdXRwdXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IGJlbmFibGUpCit7CisJdjRsMl9kYmcoZGVidWcsIDIsIHNkLCAidmVuY19lbmFibGVkaWdpdGFsb3V0cHV0XG4iKTsKKworCWlmIChiZW5hYmxlKSB7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfVk1PRCwgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfQ1ZCUywgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfTENET1VULCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19IU1BMUywgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfSFNUQVJULCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19IVkFMSUQsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX0hJTlQsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX1ZTUExTLCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19WU1RBUlQsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX1ZWQUxJRCwgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfVklOVCwgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfWUNDQ1RMLCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19EQUNTRUwsIDApOworCisJfSBlbHNlIHsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19WTU9ELCAwKTsKKwkJLyogZGlzYWJsZSBWQ0xLIG91dHB1dCBwaW4gZW5hYmxlICovCisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfVklEQ1RMLCAweDE0MSk7CisKKwkJLyogRGlzYWJsZSBvdXRwdXQgc3luYyBwaW5zICovCisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfU1lOQ0NUTCwgMCk7CisKKwkJLyogRGlzYWJsZSBEQ0xPQ0sgKi8KKwkJdmVuY193cml0ZShzZCwgVkVOQ19EQ0xLQ1RMLCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19EUkdCWDEsIDB4MDAwMDA1N0MpOworCisJCS8qIERpc2FibGUgTENEIG91dHB1dCBjb250cm9sIChhY2NlcHRpbmcgZGVmYXVsdCBwb2xhcml0eSkgKi8KKwkJdmVuY193cml0ZShzZCwgVkVOQ19MQ0RPVVQsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX0NNUE5ULCAweDEwMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfSFNQTFMsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX0hJTlQsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX0hTVEFSVCwgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfSFZBTElELCAwKTsKKworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX1ZTUExTLCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19WSU5ULCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19WU1RBUlQsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX1ZWQUxJRCwgMCk7CisKKwkJdmVuY193cml0ZShzZCwgVkVOQ19IU0RMWSwgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfVlNETFksIDApOworCisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfWUNDQ1RMLCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19WU1RBUlRBLCAwKTsKKworCQkvKiBTZXQgT1NEIGNsb2NrIGFuZCBPU0QgU3luYyBBZGF2YW5jZSByZWdpc3RlcnMgKi8KKwkJdmVuY193cml0ZShzZCwgVkVOQ19PU0RDTEswLCAxKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19PU0RDTEsxLCAyKTsKKwl9Cit9CisKKy8qCisgKiBzZXR0aW5nIE5UU0MgbW9kZQorICovCitzdGF0aWMgaW50IHZlbmNfc2V0X250c2Moc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlzdHJ1Y3QgdmVuY19zdGF0ZSAqdmVuYyA9IHRvX3N0YXRlKHNkKTsKKwlzdHJ1Y3QgdmVuY19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHZlbmMtPnBkYXRhOworCisJdjRsMl9kYmcoZGVidWcsIDIsIHNkLCAidmVuY19zZXRfbnRzY1xuIik7CisKKwkvKiBTZXR1cCBjbG9jayBhdCBWUFNTICYgVkVOQyBmb3IgU0QgKi8KKwl2cHNzX2VuYWJsZV9jbG9jayhWUFNTX1ZFTkNfQ0xPQ0tfU0VMLCAxKTsKKwlpZiAocGRhdGEtPnNldHVwX2Nsb2NrKFZQQkVfRU5DX1NURCwgVjRMMl9TVERfNTI1XzYwKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJdmVuY19lbmFibGVkaWdpdGFsb3V0cHV0KHNkLCAwKTsKKworCS8qIHRvIHNldCBWRU5DIENMSyBESVYgdG8gMSAtIGZpbmFsIGNsb2NrIGlzIDU0IE1IeiAqLworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZJRENUTCwgMCwgMSA8PCAxKTsKKwkvKiBTZXQgUkVDNjU2IE1vZGUgKi8KKwl2ZW5jX3dyaXRlKHNkLCBWRU5DX1lDQ0NUTCwgMHgxKTsKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WRFBSTywgMCwgVkVOQ19WRFBST19EQUZSUSk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVkRQUk8sIDAsIFZFTkNfVkRQUk9fREFVUFMpOworCisJdmVuY193cml0ZShzZCwgVkVOQ19WTU9ELCAwKTsKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WTU9ELCAoMSA8PCBWRU5DX1ZNT0RfVklFX1NISUZUKSwKKwkJCVZFTkNfVk1PRF9WSUUpOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsICgwIDw8IFZFTkNfVk1PRF9WTUQpLCBWRU5DX1ZNT0RfVk1EKTsKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WTU9ELCAoMCA8PCBWRU5DX1ZNT0RfVFZUWVBfU0hJRlQpLAorCQkJVkVOQ19WTU9EX1RWVFlQKTsKKwl2ZW5jX3dyaXRlKHNkLCBWRU5DX0RBQ1RTVCwgMHgwKTsKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WTU9ELCBWRU5DX1ZNT0RfVkVOQywgVkVOQ19WTU9EX1ZFTkMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzZXR0aW5nIFBBTCBtb2RlCisgKi8KK3N0YXRpYyBpbnQgdmVuY19zZXRfcGFsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJc3RydWN0IHZlbmNfc3RhdGUgKnZlbmMgPSB0b19zdGF0ZShzZCk7CisKKwl2NGwyX2RiZyhkZWJ1ZywgMiwgc2QsICJ2ZW5jX3NldF9wYWxcbiIpOworCisJLyogU2V0dXAgY2xvY2sgYXQgVlBTUyAmIFZFTkMgZm9yIFNEICovCisJdnBzc19lbmFibGVfY2xvY2soVlBTU19WRU5DX0NMT0NLX1NFTCwgMSk7CisJaWYgKHZlbmMtPnBkYXRhLT5zZXR1cF9jbG9jayhWUEJFX0VOQ19TVEQsIFY0TDJfU1REXzYyNV81MCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZlbmNfZW5hYmxlZGlnaXRhbG91dHB1dChzZCwgMCk7CisKKwkvKiB0byBzZXQgVkVOQyBDTEsgRElWIHRvIDEgLSBmaW5hbCBjbG9jayBpcyA1NCBNSHogKi8KKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WSURDVEwsIDAsIDEgPDwgMSk7CisJLyogU2V0IFJFQzY1NiBNb2RlICovCisJdmVuY193cml0ZShzZCwgVkVOQ19ZQ0NDVEwsIDB4MSk7CisKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19TWU5DQ1RMLCAxIDw8IFZFTkNfU1lOQ0NUTF9PVkRfU0hJRlQsCisJCQlWRU5DX1NZTkNDVExfT1ZEKTsKKwl2ZW5jX3dyaXRlKHNkLCBWRU5DX1ZNT0QsIDApOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsCisJCQkoMSA8PCBWRU5DX1ZNT0RfVklFX1NISUZUKSwKKwkJCVZFTkNfVk1PRF9WSUUpOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsCisJCQkoMCA8PCBWRU5DX1ZNT0RfVk1EKSwgVkVOQ19WTU9EX1ZNRCk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVk1PRCwKKwkJCSgxIDw8IFZFTkNfVk1PRF9UVlRZUF9TSElGVCksCisJCQlWRU5DX1ZNT0RfVFZUWVApOworCXZlbmNfd3JpdGUoc2QsIFZFTkNfREFDVFNULCAweDApOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsIFZFTkNfVk1PRF9WRU5DLCBWRU5DX1ZNT0RfVkVOQyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHZlbmNfc2V0XzQ4MHA1OV85NAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgdmlkZW8gZW5jb2RlciB0byBFRFRWKDUyNXApIGNvbXBvbmVudCBzZXR0aW5nLgorICovCitzdGF0aWMgaW50IHZlbmNfc2V0XzQ4MHA1OV85NChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXN0cnVjdCB2ZW5jX3N0YXRlICp2ZW5jID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCB2ZW5jX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gdmVuYy0+cGRhdGE7CisKKwl2NGwyX2RiZyhkZWJ1ZywgMiwgc2QsICJ2ZW5jX3NldF80ODBwNTlfOTRcbiIpOworCisJLyogU2V0dXAgY2xvY2sgYXQgVlBTUyAmIFZFTkMgZm9yIFNEICovCisJaWYgKHBkYXRhLT5zZXR1cF9jbG9jayhWUEJFX0VOQ19EVl9QUkVTRVQsIFY0TDJfRFZfNDgwUDU5Xzk0KSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJdmVuY19lbmFibGVkaWdpdGFsb3V0cHV0KHNkLCAwKTsKKworCXZlbmNfd3JpdGUoc2QsIFZFTkNfT1NEQ0xLMCwgMCk7CisJdmVuY193cml0ZShzZCwgVkVOQ19PU0RDTEsxLCAxKTsKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WRFBSTywgVkVOQ19WRFBST19EQUZSUSwKKwkJICAgIFZFTkNfVkRQUk9fREFGUlEpOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZEUFJPLCBWRU5DX1ZEUFJPX0RBVVBTLAorCQkgICAgVkVOQ19WRFBST19EQVVQUyk7CisJdmVuY193cml0ZShzZCwgVkVOQ19WTU9ELCAwKTsKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WTU9ELCAoMSA8PCBWRU5DX1ZNT0RfVklFX1NISUZUKSwKKwkJICAgIFZFTkNfVk1PRF9WSUUpOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsIFZFTkNfVk1PRF9IRE1ELCBWRU5DX1ZNT0RfSERNRCk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVk1PRCwgKEhEVFZfNTI1UCA8PCBWRU5DX1ZNT0RfVFZUWVBfU0hJRlQpLAorCQkgICAgVkVOQ19WTU9EX1RWVFlQKTsKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WTU9ELCBWRU5DX1ZNT0RfVkRNRF9ZQ0JDUjggPDwKKwkJICAgIFZFTkNfVk1PRF9WRE1EX1NISUZULCBWRU5DX1ZNT0RfVkRNRCk7CisKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WTU9ELCBWRU5DX1ZNT0RfVkVOQywgVkVOQ19WTU9EX1ZFTkMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB2ZW5jX3NldF82MjVwCisgKgorICogVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSB2aWRlbyBlbmNvZGVyIHRvIEhEVFYoNjI1cCkgY29tcG9uZW50IHNldHRpbmcKKyAqLworc3RhdGljIGludCB2ZW5jX3NldF81NzZwNTAoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlzdHJ1Y3QgdmVuY19zdGF0ZSAqdmVuYyA9IHRvX3N0YXRlKHNkKTsKKwlzdHJ1Y3QgdmVuY19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHZlbmMtPnBkYXRhOworCisJdjRsMl9kYmcoZGVidWcsIDIsIHNkLCAidmVuY19zZXRfNTc2cDUwXG4iKTsKKworCS8qIFNldHVwIGNsb2NrIGF0IFZQU1MgJiBWRU5DIGZvciBTRCAqLworCWlmIChwZGF0YS0+c2V0dXBfY2xvY2soVlBCRV9FTkNfRFZfUFJFU0VULCBWNEwyX0RWXzU3NlA1MCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZlbmNfZW5hYmxlZGlnaXRhbG91dHB1dChzZCwgMCk7CisKKwl2ZW5jX3dyaXRlKHNkLCBWRU5DX09TRENMSzAsIDApOworCXZlbmNfd3JpdGUoc2QsIFZFTkNfT1NEQ0xLMSwgMSk7CisKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WRFBSTywgVkVOQ19WRFBST19EQUZSUSwKKwkJICAgIFZFTkNfVkRQUk9fREFGUlEpOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZEUFJPLCBWRU5DX1ZEUFJPX0RBVVBTLAorCQkgICAgVkVOQ19WRFBST19EQVVQUyk7CisKKwl2ZW5jX3dyaXRlKHNkLCBWRU5DX1ZNT0QsIDApOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsICgxIDw8IFZFTkNfVk1PRF9WSUVfU0hJRlQpLAorCQkgICAgVkVOQ19WTU9EX1ZJRSk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVk1PRCwgVkVOQ19WTU9EX0hETUQsIFZFTkNfVk1PRF9IRE1EKTsKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WTU9ELCAoSERUVl82MjVQIDw8IFZFTkNfVk1PRF9UVlRZUF9TSElGVCksCisJCSAgICBWRU5DX1ZNT0RfVFZUWVApOworCisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVk1PRCwgVkVOQ19WTU9EX1ZETURfWUNCQ1I4IDw8CisJCSAgICBWRU5DX1ZNT0RfVkRNRF9TSElGVCwgVkVOQ19WTU9EX1ZETUQpOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsIFZFTkNfVk1PRF9WRU5DLCBWRU5DX1ZNT0RfVkVOQyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZW5jX3Nfc3RkX291dHB1dChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2NGwyX3N0ZF9pZCBub3JtKQoreworCXY0bDJfZGJnKGRlYnVnLCAxLCBzZCwgInZlbmNfc19zdGRfb3V0cHV0XG4iKTsKKworCWlmIChub3JtICYgVjRMMl9TVERfNTI1XzYwKQorCQlyZXR1cm4gdmVuY19zZXRfbnRzYyhzZCk7CisJZWxzZSBpZiAobm9ybSAmIFY0TDJfU1REXzYyNV81MCkKKwkJcmV0dXJuIHZlbmNfc2V0X3BhbChzZCk7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB2ZW5jX3NfZHZfcHJlc2V0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkgICAgc3RydWN0IHY0bDJfZHZfcHJlc2V0ICpkdl9wcmVzZXQpCit7CisJdjRsMl9kYmcoZGVidWcsIDEsIHNkLCAidmVuY19zX2R2X3ByZXNldFxuIik7CisKKwlpZiAoZHZfcHJlc2V0LT5wcmVzZXQgPT0gVjRMMl9EVl81NzZQNTApCisJCXJldHVybiB2ZW5jX3NldF81NzZwNTAoc2QpOworCWVsc2UgaWYgKGR2X3ByZXNldC0+cHJlc2V0ID09IFY0TDJfRFZfNDgwUDU5Xzk0KQorCQlyZXR1cm4gdmVuY19zZXRfNDgwcDU5Xzk0KHNkKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZlbmNfc19yb3V0aW5nKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiBpbnB1dCwgdTMyIG91dHB1dCwKKwkJCSAgdTMyIGNvbmZpZykKK3sKKwlzdHJ1Y3QgdmVuY19zdGF0ZSAqdmVuYyA9IHRvX3N0YXRlKHNkKTsKKwlpbnQgcmV0OworCisJdjRsMl9kYmcoZGVidWcsIDEsIHNkLCAidmVuY19zX3JvdXRpbmdcbiIpOworCisJcmV0ID0gdmVuY19zZXRfZGFjKHNkLCBvdXRwdXQpOworCWlmICghcmV0KQorCQl2ZW5jLT5vdXRwdXQgPSBvdXRwdXQ7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgbG9uZyB2ZW5jX2lvY3RsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQl1bnNpZ25lZCBpbnQgY21kLAorCQkJdm9pZCAqYXJnKQoreworCXUzMiB2YWw7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVkVOQ19HRVRfRkxEOgorCQl2YWwgPSB2ZW5jX3JlYWQoc2QsIFZFTkNfVlNUQVQpOworCQkqKChpbnQgKilhcmcpID0gKCh2YWwgJiBWRU5DX1ZTVEFUX0ZJRFNUKSA9PQorCQlWRU5DX1ZTVEFUX0ZJRFNUKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdjRsMl9lcnIoc2QsICJXcm9uZyBJT0NUTCBjbWRcbiIpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyB2ZW5jX2NvcmVfb3BzID0geworCS5pb2N0bCAgICAgID0gdmVuY19pb2N0bCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIHZlbmNfdmlkZW9fb3BzID0geworCS5zX3JvdXRpbmcgPSB2ZW5jX3Nfcm91dGluZywKKwkuc19zdGRfb3V0cHV0ID0gdmVuY19zX3N0ZF9vdXRwdXQsCisJLnNfZHZfcHJlc2V0ID0gdmVuY19zX2R2X3ByZXNldCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIHZlbmNfb3BzID0geworCS5jb3JlID0gJnZlbmNfY29yZV9vcHMsCisJLnZpZGVvID0gJnZlbmNfdmlkZW9fb3BzLAorfTsKKworc3RhdGljIGludCB2ZW5jX2luaXRpYWxpemUoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlzdHJ1Y3QgdmVuY19zdGF0ZSAqdmVuYyA9IHRvX3N0YXRlKHNkKTsKKwlpbnQgcmV0OworCisJLyogU2V0IGRlZmF1bHQgdG8gb3V0cHV0IHRvIGNvbXBvc2l0ZSBhbmQgc3RkIHRvIE5UU0MgKi8KKwl2ZW5jLT5vdXRwdXQgPSAwOworCXZlbmMtPnN0ZCA9IFY0TDJfU1REXzUyNV82MDsKKworCXJldCA9IHZlbmNfc19yb3V0aW5nKHNkLCAwLCB2ZW5jLT5vdXRwdXQsIDApOworCWlmIChyZXQgPCAwKSB7CisJCXY0bDJfZXJyKHNkLCAiRXJyb3Igc2V0dGluZyBvdXRwdXQgZHVyaW5nIGluaXRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSB2ZW5jX3Nfc3RkX291dHB1dChzZCwgdmVuYy0+c3RkKTsKKwlpZiAocmV0IDwgMCkgeworCQl2NGwyX2VycihzZCwgIkVycm9yIHNldHRpbmcgc3RkIGR1cmluZyBpbml0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2ZW5jX2RldmljZV9nZXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgdmVuY19zdGF0ZSAqKnZlbmMgPSBkYXRhOworCisJaWYgKHN0cmNtcChNT0RVTEVfTkFNRSwgcGRldi0+bmFtZSkgPT0gMCkKKwkJKnZlbmMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgdjRsMl9zdWJkZXYgKnZlbmNfc3ViX2Rldl9pbml0KHN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYsCisJCWNvbnN0IGNoYXIgKnZlbmNfbmFtZSkKK3sKKwlzdHJ1Y3QgdmVuY19zdGF0ZSAqdmVuYzsKKwlpbnQgZXJyOworCisJZXJyID0gYnVzX2Zvcl9lYWNoX2RldigmcGxhdGZvcm1fYnVzX3R5cGUsIE5VTEwsICZ2ZW5jLAorCQkJdmVuY19kZXZpY2VfZ2V0KTsKKwlpZiAodmVuYyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXY0bDJfc3ViZGV2X2luaXQoJnZlbmMtPnNkLCAmdmVuY19vcHMpOworCisJc3RyY3B5KHZlbmMtPnNkLm5hbWUsIHZlbmNfbmFtZSk7CisJaWYgKHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldih2NGwyX2RldiwgJnZlbmMtPnNkKSA8IDApIHsKKwkJdjRsMl9lcnIodjRsMl9kZXYsCisJCQkidnBiZSB1bmFibGUgdG8gcmVnaXN0ZXIgdmVuYyBzdWIgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICh2ZW5jX2luaXRpYWxpemUoJnZlbmMtPnNkKSkgeworCQl2NGwyX2Vycih2NGwyX2RldiwKKwkJCSJ2cGJlIHZlbmMgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuICZ2ZW5jLT5zZDsKK30KK0VYUE9SVF9TWU1CT0wodmVuY19zdWJfZGV2X2luaXQpOworCitzdGF0aWMgaW50IHZlbmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmVuY19zdGF0ZSAqdmVuYzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgcmV0OworCisJdmVuYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2ZW5jX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHZlbmMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl2ZW5jLT5wZGV2ID0gJnBkZXYtPmRldjsKKwl2ZW5jLT5wZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmIChOVUxMID09IHZlbmMtPnBkYXRhKSB7CisJCWRldl9lcnIodmVuYy0+cGRldiwgIlVuYWJsZSB0byBnZXQgcGxhdGZvcm0gZGF0YSBmb3IiCisJCQkiIFZFTkMgc3ViIGRldmljZSIpOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGZyZWVfbWVtOworCX0KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIodmVuYy0+cGRldiwKKwkJCSJVbmFibGUgdG8gZ2V0IFZFTkMgcmVnaXN0ZXIgYWRkcmVzcyBtYXBcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfbWVtOworCX0KKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwgInZlbmMiKSkgeworCQlkZXZfZXJyKHZlbmMtPnBkZXYsICJVbmFibGUgdG8gcmVzZXJ2ZSBWRU5DIE1NSU8gcmVnaW9uXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX21lbTsKKwl9CisKKwl2ZW5jLT52ZW5jX2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoIXZlbmMtPnZlbmNfYmFzZSkgeworCQlkZXZfZXJyKHZlbmMtPnBkZXYsICJVbmFibGUgdG8gbWFwIFZFTkMgSU8gc3BhY2VcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIHJlbGVhc2VfdmVuY19tZW1fcmVnaW9uOworCX0KKworCXNwaW5fbG9ja19pbml0KCZ2ZW5jLT5sb2NrKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB2ZW5jKTsKKwlkZXZfbm90aWNlKHZlbmMtPnBkZXYsICJWRU5DIHN1YiBkZXZpY2UgcHJvYmUgc3VjY2Vzc1xuIik7CisJcmV0dXJuIDA7CisKK3JlbGVhc2VfdmVuY19tZW1fcmVnaW9uOgorCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CitmcmVlX21lbToKKwlrZnJlZSh2ZW5jKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZlbmNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHZlbmNfc3RhdGUgKnZlbmMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaW91bm1hcCgodm9pZCAqKXZlbmMtPnZlbmNfYmFzZSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJa2ZyZWUodmVuYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdmVuY19kcml2ZXIgPSB7CisJLnByb2JlCQk9IHZlbmNfcHJvYmUsCisJLnJlbW92ZQkJPSB2ZW5jX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBNT0RVTEVfTkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgdmVuY19pbml0KHZvaWQpCit7CisJaWYgKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdmVuY19kcml2ZXIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHJlZ2lzdGVyIHZlbmMgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2ZW5jX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdmVuY19kcml2ZXIpOworCXJldHVybjsKK30KKworbW9kdWxlX2luaXQodmVuY19pbml0KTsKK21vZHVsZV9leGl0KHZlbmNfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiVlBCRSBWRU5DIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiVGV4YXMgSW5zdHJ1bWVudHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX3ZlbmNfcmVncy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfdmVuY19yZWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ3Y2IxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX3ZlbmNfcmVncy5oCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfVlBCRV9WRU5DX1JFR1NfSAorI2RlZmluZSBfVlBCRV9WRU5DX1JFR1NfSAorCisvKiBWUEJFIFZpZGVvIEVuY29kZXIgLyBEaWdpdGFsIExDRCBTdWJzeXN0ZW0gUmVnaXN0ZXJzIChWRU5DKSAqLworI2RlZmluZSBWRU5DX1ZNT0QJCQkJMHgwMAorI2RlZmluZSBWRU5DX1ZJRENUTAkJCQkweDA0CisjZGVmaW5lIFZFTkNfVkRQUk8JCQkJMHgwOAorI2RlZmluZSBWRU5DX1NZTkNDVEwJCQkJMHgwQworI2RlZmluZSBWRU5DX0hTUExTCQkJCTB4MTAKKyNkZWZpbmUgVkVOQ19WU1BMUwkJCQkweDE0CisjZGVmaW5lIFZFTkNfSElOVAkJCQkweDE4CisjZGVmaW5lIFZFTkNfSFNUQVJUCQkJCTB4MUMKKyNkZWZpbmUgVkVOQ19IVkFMSUQJCQkJMHgyMAorI2RlZmluZSBWRU5DX1ZJTlQJCQkJMHgyNAorI2RlZmluZSBWRU5DX1ZTVEFSVAkJCQkweDI4CisjZGVmaW5lIFZFTkNfVlZBTElECQkJCTB4MkMKKyNkZWZpbmUgVkVOQ19IU0RMWQkJCQkweDMwCisjZGVmaW5lIFZFTkNfVlNETFkJCQkJMHgzNAorI2RlZmluZSBWRU5DX1lDQ0NUTAkJCQkweDM4CisjZGVmaW5lIFZFTkNfUkdCQ1RMCQkJCTB4M0MKKyNkZWZpbmUgVkVOQ19SR0JDTFAJCQkJMHg0MAorI2RlZmluZSBWRU5DX0xJTkVDVEwJCQkJMHg0NAorI2RlZmluZSBWRU5DX0NVTExMSU5FCQkJCTB4NDgKKyNkZWZpbmUgVkVOQ19MQ0RPVVQJCQkJMHg0QworI2RlZmluZSBWRU5DX0JSVFMJCQkJMHg1MAorI2RlZmluZSBWRU5DX0JSVFcJCQkJMHg1NAorI2RlZmluZSBWRU5DX0FDQ1RMCQkJCTB4NTgKKyNkZWZpbmUgVkVOQ19QV01QCQkJCTB4NUMKKyNkZWZpbmUgVkVOQ19QV01XCQkJCTB4NjAKKyNkZWZpbmUgVkVOQ19EQ0xLQ1RMCQkJCTB4NjQKKyNkZWZpbmUgVkVOQ19EQ0xLUFROMAkJCQkweDY4CisjZGVmaW5lIFZFTkNfRENMS1BUTjEJCQkJMHg2QworI2RlZmluZSBWRU5DX0RDTEtQVE4yCQkJCTB4NzAKKyNkZWZpbmUgVkVOQ19EQ0xLUFROMwkJCQkweDc0CisjZGVmaW5lIFZFTkNfRENMS1BUTjBBCQkJCTB4NzgKKyNkZWZpbmUgVkVOQ19EQ0xLUFROMUEJCQkJMHg3QworI2RlZmluZSBWRU5DX0RDTEtQVE4yQQkJCQkweDgwCisjZGVmaW5lIFZFTkNfRENMS1BUTjNBCQkJCTB4ODQKKyNkZWZpbmUgVkVOQ19EQ0xLSFMJCQkJMHg4OAorI2RlZmluZSBWRU5DX0RDTEtIU0EJCQkJMHg4QworI2RlZmluZSBWRU5DX0RDTEtIUgkJCQkweDkwCisjZGVmaW5lIFZFTkNfRENMS1ZTCQkJCTB4OTQKKyNkZWZpbmUgVkVOQ19EQ0xLVlIJCQkJMHg5OAorI2RlZmluZSBWRU5DX0NBUENUTAkJCQkweDlDCisjZGVmaW5lIFZFTkNfQ0FQRE8JCQkJMHhBMAorI2RlZmluZSBWRU5DX0NBUERFCQkJCTB4QTQKKyNkZWZpbmUgVkVOQ19BVFIwCQkJCTB4QTgKKyNkZWZpbmUgVkVOQ19BVFIxCQkJCTB4QUMKKyNkZWZpbmUgVkVOQ19BVFIyCQkJCTB4QjAKKyNkZWZpbmUgVkVOQ19WU1RBVAkJCQkweEI4CisjZGVmaW5lIFZFTkNfUkFNQURSCQkJCTB4QkMKKyNkZWZpbmUgVkVOQ19SQU1QT1JUCQkJCTB4QzAKKyNkZWZpbmUgVkVOQ19EQUNUU1QJCQkJMHhDNAorI2RlZmluZSBWRU5DX1lDT0xWTAkJCQkweEM4CisjZGVmaW5lIFZFTkNfU0NQUk9HCQkJCTB4Q0MKKyNkZWZpbmUgVkVOQ19DVkJTCQkJCTB4REMKKyNkZWZpbmUgVkVOQ19DTVBOVAkJCQkweEUwCisjZGVmaW5lIFZFTkNfRVRNRzAJCQkJMHhFNAorI2RlZmluZSBWRU5DX0VUTUcxCQkJCTB4RTgKKyNkZWZpbmUgVkVOQ19FVE1HMgkJCQkweEVDCisjZGVmaW5lIFZFTkNfRVRNRzMJCQkJMHhGMAorI2RlZmluZSBWRU5DX0RBQ1NFTAkJCQkweEY0CisjZGVmaW5lIFZFTkNfQVJHQlgwCQkJCTB4MTAwCisjZGVmaW5lIFZFTkNfQVJHQlgxCQkJCTB4MTA0CisjZGVmaW5lIFZFTkNfQVJHQlgyCQkJCTB4MTA4CisjZGVmaW5lIFZFTkNfQVJHQlgzCQkJCTB4MTBDCisjZGVmaW5lIFZFTkNfQVJHQlg0CQkJCTB4MTEwCisjZGVmaW5lIFZFTkNfRFJHQlgwCQkJCTB4MTE0CisjZGVmaW5lIFZFTkNfRFJHQlgxCQkJCTB4MTE4CisjZGVmaW5lIFZFTkNfRFJHQlgyCQkJCTB4MTFDCisjZGVmaW5lIFZFTkNfRFJHQlgzCQkJCTB4MTIwCisjZGVmaW5lIFZFTkNfRFJHQlg0CQkJCTB4MTI0CisjZGVmaW5lIFZFTkNfVlNUQVJUQQkJCQkweDEyOAorI2RlZmluZSBWRU5DX09TRENMSzAJCQkJMHgxMkMKKyNkZWZpbmUgVkVOQ19PU0RDTEsxCQkJCTB4MTMwCisjZGVmaW5lIFZFTkNfSFZMRENMMAkJCQkweDEzNAorI2RlZmluZSBWRU5DX0hWTERDTDEJCQkJMHgxMzgKKyNkZWZpbmUgVkVOQ19PU0RIQURWCQkJCTB4MTNDCisjZGVmaW5lIFZFTkNfQ0xLQ1RMCQkJCTB4MTQwCisjZGVmaW5lIFZFTkNfR0FNQ1RMCQkJCTB4MTQ0CisjZGVmaW5lIFZFTkNfWEhJTlRWTAkJCQkweDE3NAorCisvKiBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVlBCRV9QQ1JfVkVOQ19ESVYJCQkoMSA8PCAxKQorI2RlZmluZSBWUEJFX1BDUl9DTEtfT0ZGCQkJKDEgPDwgMCkKKworI2RlZmluZSBWRU5DX1ZNT0RfVkRNRF9TSElGVAkJCTEyCisjZGVmaW5lIFZFTkNfVk1PRF9WRE1EX1lDQkNSMTYJCQkwCisjZGVmaW5lIFZFTkNfVk1PRF9WRE1EX1lDQkNSOAkJCTEKKyNkZWZpbmUgVkVOQ19WTU9EX1ZETURfUkdCNjY2CQkJMgorI2RlZmluZSBWRU5DX1ZNT0RfVkRNRF9SR0I4CQkJMworI2RlZmluZSBWRU5DX1ZNT0RfVkRNRF9FUFNPTgkJCTQKKyNkZWZpbmUgVkVOQ19WTU9EX1ZETURfQ0FTSU8JCQk1CisjZGVmaW5lIFZFTkNfVk1PRF9WRE1EX1VESVNQUVZHQQkJNgorI2RlZmluZSBWRU5DX1ZNT0RfVkRNRF9TVE5MQ0QJCQk3CisjZGVmaW5lIFZFTkNfVk1PRF9WSUVfU0hJRlQJCQkxCisjZGVmaW5lIFZFTkNfVk1PRF9WRE1ECQkJCSg3IDw8IDEyKQorI2RlZmluZSBWRU5DX1ZNT0RfSVRMQ0wJCQkJKDEgPDwgMTEpCisjZGVmaW5lIFZFTkNfVk1PRF9JVExDCQkJCSgxIDw8IDEwKQorI2RlZmluZSBWRU5DX1ZNT0RfTlNJVAkJCQkoMSA8PCA5KQorI2RlZmluZSBWRU5DX1ZNT0RfSERNRAkJCQkoMSA8PCA4KQorI2RlZmluZSBWRU5DX1ZNT0RfVFZUWVBfU0hJRlQJCQk2CisjZGVmaW5lIFZFTkNfVk1PRF9UVlRZUAkJCQkoMyA8PCA2KQorI2RlZmluZSBWRU5DX1ZNT0RfU0xBVkUJCQkJKDEgPDwgNSkKKyNkZWZpbmUgVkVOQ19WTU9EX1ZNRAkJCQkoMSA8PCA0KQorI2RlZmluZSBWRU5DX1ZNT0RfQkxOSwkJCQkoMSA8PCAzKQorI2RlZmluZSBWRU5DX1ZNT0RfVklFCQkJCSgxIDw8IDEpCisjZGVmaW5lIFZFTkNfVk1PRF9WRU5DCQkJCSgxIDw8IDApCisKKy8qIFZNT0QgVFZUWVAgb3B0aW9ucyBmb3IgSERNRD0wICovCisjZGVmaW5lIFNEVFZfTlRTQwkJCQkwCisjZGVmaW5lIFNEVFZfUEFMCQkJCTEKKy8qIFZNT0QgVFZUWVAgb3B0aW9ucyBmb3IgSERNRD0xICovCisjZGVmaW5lIEhEVFZfNTI1UAkJCQkwCisjZGVmaW5lIEhEVFZfNjI1UAkJCQkxCisjZGVmaW5lIEhEVFZfMTA4MEkJCQkJMgorI2RlZmluZSBIRFRWXzcyMFAJCQkJMworCisjZGVmaW5lIFZFTkNfVklEQ1RMX1ZDTEtQCQkJKDEgPDwgMTQpCisjZGVmaW5lIFZFTkNfVklEQ1RMX1ZDTEtFX1NISUZUCQkJMTMKKyNkZWZpbmUgVkVOQ19WSURDVExfVkNMS0UJCQkoMSA8PCAxMykKKyNkZWZpbmUgVkVOQ19WSURDVExfVkNMS1pfU0hJRlQJCQkxMgorI2RlZmluZSBWRU5DX1ZJRENUTF9WQ0xLWgkJCSgxIDw8IDEyKQorI2RlZmluZSBWRU5DX1ZJRENUTF9TWURJUl9TSElGVAkJCTgKKyNkZWZpbmUgVkVOQ19WSURDVExfU1lESVIJCQkoMSA8PCA4KQorI2RlZmluZSBWRU5DX1ZJRENUTF9ET01EX1NISUZUCQkJNAorI2RlZmluZSBWRU5DX1ZJRENUTF9ET01ECQkJKDMgPDwgNCkKKyNkZWZpbmUgVkVOQ19WSURDVExfWUNESVJfU0hJRlQJCQkwCisjZGVmaW5lIFZFTkNfVklEQ1RMX1lDRElSCQkJKDEgPDwgMCkKKworI2RlZmluZSBWRU5DX1ZEUFJPX0FUWUNDX1NISUZUCQkJNQorI2RlZmluZSBWRU5DX1ZEUFJPX0FUWUNDCQkJKDEgPDwgNSkKKyNkZWZpbmUgVkVOQ19WRFBST19BVENPTV9TSElGVAkJCTQKKyNkZWZpbmUgVkVOQ19WRFBST19BVENPTQkJCSgxIDw8IDQpCisjZGVmaW5lIFZFTkNfVkRQUk9fREFGUlEJCQkoMSA8PCAzKQorI2RlZmluZSBWRU5DX1ZEUFJPX0RBVVBTCQkJKDEgPDwgMikKKyNkZWZpbmUgVkVOQ19WRFBST19DVVBTCQkJCSgxIDw8IDEpCisjZGVmaW5lIFZFTkNfVkRQUk9fWVVQUwkJCQkoMSA8PCAwKQorCisjZGVmaW5lIFZFTkNfU1lOQ0NUTF9WUExfU0hJRlQJCQkzCisjZGVmaW5lIFZFTkNfU1lOQ0NUTF9WUEwJCQkoMSA8PCAzKQorI2RlZmluZSBWRU5DX1NZTkNDVExfSFBMX1NISUZUCQkJMgorI2RlZmluZSBWRU5DX1NZTkNDVExfSFBMCQkJKDEgPDwgMikKKyNkZWZpbmUgVkVOQ19TWU5DQ1RMX1NZRVZfU0hJRlQJCQkxCisjZGVmaW5lIFZFTkNfU1lOQ0NUTF9TWUVWCQkJKDEgPDwgMSkKKyNkZWZpbmUgVkVOQ19TWU5DQ1RMX1NZRUhfU0hJRlQJCQkwCisjZGVmaW5lIFZFTkNfU1lOQ0NUTF9TWUVICQkJKDEgPDwgMCkKKyNkZWZpbmUgVkVOQ19TWU5DQ1RMX09WRF9TSElGVAkJCTE0CisjZGVmaW5lIFZFTkNfU1lOQ0NUTF9PVkQJCQkoMSA8PCAxNCkKKworI2RlZmluZSBWRU5DX0RDTEtDVExfRENLRUNfU0hJRlQJCTExCisjZGVmaW5lIFZFTkNfRENMS0NUTF9EQ0tFQwkJCSgxIDw8IDExKQorI2RlZmluZSBWRU5DX0RDTEtDVExfRENLUFdfU0hJRlQJCTAKKyNkZWZpbmUgVkVOQ19EQ0xLQ1RMX0RDS1BXCQkJKDB4M2YgPDwgMCkKKworI2RlZmluZSBWRU5DX1ZTVEFUX0ZJRFNUCQkJKDEgPDwgNCkKKworI2RlZmluZSBWRU5DX0NNUE5UX01SR0JfU0hJRlQJCQkxNAorI2RlZmluZSBWRU5DX0NNUE5UX01SR0IJCQkJKDEgPDwgMTQpCisKKyNlbmRpZgkJCQkvKiBfVlBCRV9WRU5DX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwaWZfY2FwdHVyZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwaWZfY2FwdHVyZS5jCmluZGV4IGQ5M2FkNzQuLjQ5ZTRkZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGlmX2NhcHR1cmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBpZl9jYXB0dXJlLmMKQEAgLTMzLDcgKzMzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CkBAIC00NCw2ICs0Myw3IEBACiAKIE1PRFVMRV9ERVNDUklQVElPTigiVEkgRGFWaW5jaSBWUElGIENhcHR1cmUgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihWUElGX0NBUFRVUkVfVkVSU0lPTik7CiAKICNkZWZpbmUgdnBpZl9lcnIoZm10LCBhcmcuLi4pCXY0bDJfZXJyKCZ2cGlmX29iai52NGwyX2RldiwgZm10LCAjIyBhcmcpCiAjZGVmaW5lIHZwaWZfZGJnKGxldmVsLCBkZWJ1ZywgZm10LCBhcmcuLi4pCVwKQEAgLTE2NzcsNyArMTY3Nyw2IEBACiB7CiAJc3RydWN0IHZwaWZfY2FwdHVyZV9jb25maWcgKmNvbmZpZyA9IHZwaWZfZGV2LT5wbGF0Zm9ybV9kYXRhOwogCi0JY2FwLT52ZXJzaW9uID0gVlBJRl9DQVBUVVJFX1ZFUlNJT05fQ09ERTsKIAljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9TVFJFQU1JTkc7CiAJc3RybGNweShjYXAtPmRyaXZlciwgInZwaWYgY2FwdHVyZSIsIHNpemVvZihjYXAtPmRyaXZlcikpOwogCXN0cmxjcHkoY2FwLT5idXNfaW5mbywgIkRNNjQ2eCBQbGF0Zm9ybSIsIHNpemVvZihjYXAtPmJ1c19pbmZvKSk7CkBAIC0yMjExLDEwICsyMjEwLDggQEAKIAkJdmZkLT52NGwyX2RldiA9ICZ2cGlmX29iai52NGwyX2RldjsKIAkJdmZkLT5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2U7CiAJCXNucHJpbnRmKHZmZC0+bmFtZSwgc2l6ZW9mKHZmZC0+bmFtZSksCi0JCQkgIkRNNjQ2eF9WUElGQ2FwdHVyZV9EUklWRVJfViVkLiVkLiVkIiwKLQkJCSAoVlBJRl9DQVBUVVJFX1ZFUlNJT05fQ09ERSA+PiAxNikgJiAweGZmLAotCQkJIChWUElGX0NBUFRVUkVfVkVSU0lPTl9DT0RFID4+IDgpICYgMHhmZiwKLQkJCSAoVlBJRl9DQVBUVVJFX1ZFUlNJT05fQ09ERSkgJiAweGZmKTsKKwkJCSAiRE02NDZ4X1ZQSUZDYXB0dXJlX0RSSVZFUl9WJXMiLAorCQkJIFZQSUZfQ0FQVFVSRV9WRVJTSU9OKTsKIAkJLyogU2V0IHZpZGVvX2RldiB0byB0aGUgdmlkZW8gZGV2aWNlICovCiAJCWNoLT52aWRlb19kZXYgPSB2ZmQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwaWZfY2FwdHVyZS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwaWZfY2FwdHVyZS5oCmluZGV4IDdhNDE5NmQuLjA2NDU1MGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGlmX2NhcHR1cmUuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBpZl9jYXB0dXJlLmgKQEAgLTIzLDcgKzIzLDYgQEAKIAogLyogSGVhZGVyIGZpbGVzICovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi1jb3JlLmg+CkBAIC0zMywxMSArMzIsNyBAQAogI2luY2x1ZGUgInZwaWYuaCIKIAogLyogTWFjcm9zICovCi0jZGVmaW5lIFZQSUZfTUFKT1JfUkVMRUFTRQkJMAotI2RlZmluZSBWUElGX01JTk9SX1JFTEVBU0UJCTAKLSNkZWZpbmUgVlBJRl9CVUlMRAkJCTEKLSNkZWZpbmUgVlBJRl9DQVBUVVJFX1ZFUlNJT05fQ09ERQkoKFZQSUZfTUFKT1JfUkVMRUFTRSA8PCAxNikgfCBcCi0JKFZQSUZfTUlOT1JfUkVMRUFTRSA8PCA4KSB8IFZQSUZfQlVJTEQpCisjZGVmaW5lIFZQSUZfQ0FQVFVSRV9WRVJTSU9OCQkiMC4wLjIiCiAKICNkZWZpbmUgVlBJRl9WQUxJRF9GSUVMRChmaWVsZCkJCSgoKFY0TDJfRklFTERfQU5ZID09IGZpZWxkKSB8fCBcCiAJKFY0TDJfRklFTERfTk9ORSA9PSBmaWVsZCkpIHx8IFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGlmX2Rpc3BsYXkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGlmX2Rpc3BsYXkuYwppbmRleCBjZGY2NTlhLi4yODZmMDI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBpZl9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwaWZfZGlzcGxheS5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtNDcsNiArNDYsNyBAQAogCiBNT0RVTEVfREVTQ1JJUFRJT04oIlRJIERhVmluY2kgVlBJRiBEaXNwbGF5IGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oVlBJRl9ESVNQTEFZX1ZFUlNJT04pOwogCiAjZGVmaW5lIERNNjQ2WF9WNEwyX1NURCAoVjRMMl9TVERfNTI1XzYwIHwgVjRMMl9TVERfNjI1XzUwKQogCkBAIC03MDEsNyArNzAxLDYgQEAKIHsKIAlzdHJ1Y3QgdnBpZl9kaXNwbGF5X2NvbmZpZyAqY29uZmlnID0gdnBpZl9kZXYtPnBsYXRmb3JtX2RhdGE7CiAKLQljYXAtPnZlcnNpb24gPSBWUElGX0RJU1BMQVlfVkVSU0lPTl9DT0RFOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fT1VUUFVUIHwgVjRMMl9DQVBfU1RSRUFNSU5HOwogCXN0cmxjcHkoY2FwLT5kcml2ZXIsICJ2cGlmIGRpc3BsYXkiLCBzaXplb2YoY2FwLT5kcml2ZXIpKTsKIAlzdHJsY3B5KGNhcC0+YnVzX2luZm8sICJQbGF0Zm9ybSIsIHNpemVvZihjYXAtPmJ1c19pbmZvKSk7CkBAIC0xNzQwLDEwICsxNzM5LDggQEAKIAkJdmZkLT52NGwyX2RldiA9ICZ2cGlmX29iai52NGwyX2RldjsKIAkJdmZkLT5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2U7CiAJCXNucHJpbnRmKHZmZC0+bmFtZSwgc2l6ZW9mKHZmZC0+bmFtZSksCi0JCQkgIkRNNjQ2eF9WUElGRGlzcGxheV9EUklWRVJfViVkLiVkLiVkIiwKLQkJCSAoVlBJRl9ESVNQTEFZX1ZFUlNJT05fQ09ERSA+PiAxNikgJiAweGZmLAotCQkJIChWUElGX0RJU1BMQVlfVkVSU0lPTl9DT0RFID4+IDgpICYgMHhmZiwKLQkJCSAoVlBJRl9ESVNQTEFZX1ZFUlNJT05fQ09ERSkgJiAweGZmKTsKKwkJCSAiRE02NDZ4X1ZQSUZEaXNwbGF5X0RSSVZFUl9WJXMiLAorCQkJIFZQSUZfRElTUExBWV9WRVJTSU9OKTsKIAogCQkvKiBTZXQgdmlkZW9fZGV2IHRvIHRoZSB2aWRlbyBkZXZpY2UgKi8KIAkJY2gtPnZpZGVvX2RldiA9IHZmZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGlmX2Rpc3BsYXkuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGlmX2Rpc3BsYXkuaAppbmRleCBiNTNhYWE4Li41ZDE5MzZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBpZl9kaXNwbGF5LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwaWZfZGlzcGxheS5oCkBAIC0xOCw3ICsxOCw2IEBACiAKIC8qIEhlYWRlciBmaWxlcyAqLwogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtY29yZS5oPgpAQCAtMjcsMTIgKzI2LDcgQEAKICNpbmNsdWRlICJ2cGlmLmgiCiAKIC8qIE1hY3JvcyAqLwotI2RlZmluZSBWUElGX01BSk9SX1JFTEVBU0UJKDApCi0jZGVmaW5lIFZQSUZfTUlOT1JfUkVMRUFTRQkoMCkKLSNkZWZpbmUgVlBJRl9CVUlMRAkJKDEpCi0KLSNkZWZpbmUgVlBJRl9ESVNQTEFZX1ZFUlNJT05fQ09ERSBcCi0JKChWUElGX01BSk9SX1JFTEVBU0UgPDwgMTYpIHwgKFZQSUZfTUlOT1JfUkVMRUFTRSA8PCA4KSB8IFZQSUZfQlVJTEQpCisjZGVmaW5lIFZQSUZfRElTUExBWV9WRVJTSU9OCSIwLjAuMiIKIAogI2RlZmluZSBWUElGX1ZBTElEX0ZJRUxEKGZpZWxkKSBcCiAJKCgoVjRMMl9GSUVMRF9BTlkgPT0gZmllbGQpIHx8IChWNEwyX0ZJRUxEX05PTkUgPT0gZmllbGQpKSB8fCBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvS2NvbmZpZwppbmRleCAzY2I3OGYyLi4yODFlZTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L0tjb25maWcKQEAgLTMsNyArMyw2IEBACiAJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgSTJDCiAJc2VsZWN0IFZJREVPX1RVTkVSCiAJc2VsZWN0IFZJREVPX1RWRUVQUk9NCi0JZGVwZW5kcyBvbiBSQ19DT1JFCiAJc2VsZWN0IFZJREVPQlVGX1ZNQUxMT0MKIAlzZWxlY3QgVklERU9fU0FBNzExWCBpZiBWSURFT19IRUxQRVJfQ0hJUFNfQVVUTwogCXNlbGVjdCBWSURFT19UVlA1MTUwIGlmIFZJREVPX0hFTFBFUl9DSElQU19BVVRPCkBAIC00MCw3ICszOSwxOCBAQAogCXNlbGVjdCBEVkJfUzkyMSBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfRFJYRCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfQ1hEMjgyMFIgaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX0RSWEsgaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1REQTE4MjcxQzJERCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBWSURFT0JVRl9EVkIKIAktLS1oZWxwLS0tCiAJICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgRFZCIGNhcmRzIGJhc2VkIG9uIHRoZQogCSAgRW1waWF0ZWNoIGVtMjh4eCBjaGlwcy4KKworY29uZmlnIFZJREVPX0VNMjhYWF9SQworICAgICAgICBib29sICJFTTI4WFggUmVtb3RlIENvbnRyb2xsZXIgc3VwcG9ydCIKKyAgICAgICAgZGVwZW5kcyBvbiBSQ19DT1JFCisgICAgICAgIGRlcGVuZHMgb24gVklERU9fRU0yOFhYCisgICAgICAgIGRlcGVuZHMgb24gIShSQ19DT1JFPW0gJiYgVklERU9fRU0yOFhYPXkpCisgICAgICAgIGRlZmF1bHQgeQorICAgICAgICAtLS1oZWxwLS0tCisgICAgICAgICAgRW5hYmxlcyBSZW1vdGUgQ29udHJvbGxlciBzdXBwb3J0IG9uIGVtMjh4eCBkcml2ZXIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L01ha2VmaWxlCmluZGV4IGQwZjA5M2QuLjM4YWFhMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L01ha2VmaWxlCkBAIC0xLDUgKzEsNyBAQAotZW0yOHh4LW9ianMgICAgIDo9IGVtMjh4eC12aWRlby5vIGVtMjh4eC1pMmMubyBlbTI4eHgtY2FyZHMubyBlbTI4eHgtY29yZS5vIFwKLQkJICAgZW0yOHh4LWlucHV0Lm8gZW0yOHh4LXZiaS5vCitlbTI4eHgteSA6PQllbTI4eHgtdmlkZW8ubyBlbTI4eHgtaTJjLm8gZW0yOHh4LWNhcmRzLm8KK2VtMjh4eC15ICs9CWVtMjh4eC1jb3JlLm8gIGVtMjh4eC12YmkubworCitlbTI4eHgtJChDT05GSUdfVklERU9fRU0yOFhYX1JDKSArPSBlbTI4eHgtaW5wdXQubwogCiBlbTI4eHgtYWxzYS1vYmpzIDo9IGVtMjh4eC1hdWRpby5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1hdWRpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWF1ZGlvLmMKaW5kZXggM2M0OGE3Mi4uY2ZmMDc2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWF1ZGlvLmMKQEAgLTMsOSArMyw5IEBACiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNiBNYXJrdXMgUmVjaGJlcmdlciA8bXJlY2hiZXJnZXJAZ21haWwuY29tPgogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDcgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTEgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHJlZGhhdC5jb20+CiAgKgktIFBvcnQgdG8gd29yayB3aXRoIHRoZSBpbi1rZXJuZWwgZHJpdmVyCi0gKgktIFNldmVyYWwgY2xlYW51cHMKKyAqCS0gQ2xlYW51cHMsIGZpeGVzLCBhbHNhLWNvbnRyb2xzLCBldGMuCiAgKgogICogIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIG15IHByZXZpb3VzIGF1NjAwIHVzYiBwc3RuIGF1ZGlvIGRyaXZlcgogICogIGFuZCBpbmhlcml0cyBhbGwgdGhlIGNvcHlyaWdodHMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxzb3VuZC9pbmZvLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgImVtMjh4eC5oIgogCkBAIC0yMTIsOSArMjEzLDEyIEBACiAJZm9yIChpID0gMDsgaSA8IEVNMjhYWF9BVURJT19CVUZTOyBpKyspIHsKIAkJZXJyQ29kZSA9IHVzYl9zdWJtaXRfdXJiKGRldi0+YWRldi51cmJbaV0sIEdGUF9BVE9NSUMpOwogCQlpZiAoZXJyQ29kZSkgeworCQkJZW0yOHh4X2VycmRldigic3VibWl0IG9mIGF1ZGlvIHVyYiBmYWlsZWRcbiIpOwogCQkJZW0yOHh4X2RlaW5pdF9pc29jX2F1ZGlvKGRldik7CisJCQlhdG9taWNfc2V0KCZkZXYtPnN0cmVhbV9zdGFydGVkLCAwKTsKIAkJCXJldHVybiBlcnJDb2RlOwogCQl9CisKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTI0NSw2ICsyNDksNyBAQAogCS5pbmZvID0gU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAogCQlTTkRSVl9QQ01fSU5GT19NTUFQICAgICAgICAgICB8CiAJCVNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEICAgIHwKKwkJU05EUlZfUENNX0lORk9fQkFUQ0gJICAgICAgfAogCQlTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElELAogCiAJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKQEAgLTI3NiwyNCArMjgxLDI3IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCS8qIFNldHMgdm9sdW1lLCBtdXRlLCBldGMgKi8KLQotCWRldi0+bXV0ZSA9IDA7Ci0JbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKLQlyZXQgPSBlbTI4eHhfYXVkaW9fYW5hbG9nX3NldChkZXYpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycjsKLQogCXJ1bnRpbWUtPmh3ID0gc25kX2VtMjh4eF9od19jYXB0dXJlOwotCWlmIChkZXYtPmFsdCA9PSAwICYmIGRldi0+YWRldi51c2VycyA9PSAwKSB7Ci0JCWludCBlcnJDb2RlOwotCQlkZXYtPmFsdCA9IDc7Ci0JCWRwcmludGsoImNoYW5naW5nIGFsdGVybmF0ZSBudW1iZXIgdG8gN1xuIik7Ci0JCWVyckNvZGUgPSB1c2Jfc2V0X2ludGVyZmFjZShkZXYtPnVkZXYsIDAsIDcpOwotCX0KKwlpZiAoKGRldi0+YWx0ID09IDAgfHwgZGV2LT5hdWRpb19pZm51bSkgJiYgZGV2LT5hZGV2LnVzZXJzID09IDApIHsKKwkJaWYgKGRldi0+YXVkaW9faWZudW0pCisJCQlkZXYtPmFsdCA9IDE7CisJCWVsc2UKKwkJCWRldi0+YWx0ID0gNzsKIAotCWRldi0+YWRldi51c2VycysrOwotCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKwkJZHByaW50aygiY2hhbmdpbmcgYWx0ZXJuYXRlIG51bWJlciBvbiBpbnRlcmZhY2UgJWQgdG8gJWRcbiIsCisJCQlkZXYtPmF1ZGlvX2lmbnVtLCBkZXYtPmFsdCk7CisJCXVzYl9zZXRfaW50ZXJmYWNlKGRldi0+dWRldiwgZGV2LT5hdWRpb19pZm51bSwgZGV2LT5hbHQpOworCisJCS8qIFNldHMgdm9sdW1lLCBtdXRlLCBldGMgKi8KKwkJZGV2LT5tdXRlID0gMDsKKwkJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKwkJcmV0ID0gZW0yOHh4X2F1ZGlvX2FuYWxvZ19zZXQoZGV2KTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycjsKKworCQlkZXYtPmFkZXYudXNlcnMrKzsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCX0KIAogCXNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKIAlkZXYtPmFkZXYuY2FwdHVyZV9wY21fc3Vic3RyZWFtID0gc3Vic3RyZWFtOwpAQCAtMzQyLDYgKzM1MCw4IEBACiAKIAlyZXQgPSBzbmRfcGNtX2FsbG9jX3ZtYWxsb2NfYnVmZmVyKHN1YnN0cmVhbSwKIAkJCQlwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCWZvcm1hdCA9IHBhcmFtc19mb3JtYXQoaHdfcGFyYW1zKTsKIAlyYXRlID0gcGFyYW1zX3JhdGUoaHdfcGFyYW1zKTsKIAljaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhod19wYXJhbXMpOwpAQCAtMzkzLDIwICs0MDMsMjQgQEAKIAkJCQkgICAgICBpbnQgY21kKQogewogCXN0cnVjdCBlbTI4eHggKmRldiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlpbnQgcmV0dmFsOworCWludCByZXR2YWwgPSAwOwogCiAJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6IC8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOiAvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgogCQlhdG9taWNfc2V0KCZkZXYtPnN0cmVhbV9zdGFydGVkLCAxKTsKIAkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOiAvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6IC8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKLQkJYXRvbWljX3NldCgmZGV2LT5zdHJlYW1fc3RhcnRlZCwgMSk7CisJCWF0b21pY19zZXQoJmRldi0+c3RyZWFtX3N0YXJ0ZWQsIDApOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR2YWwgPSAtRUlOVkFMOwogCX0KIAlzY2hlZHVsZV93b3JrKCZkZXYtPndxX3RyaWdnZXIpOwotCXJldHVybiAwOworCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzbmRfZW0yOHh4X2NhcHR1cmVfcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0KQEAgLTQzMiw2ICs0NDYsMTc5IEBACiAJcmV0dXJuIHZtYWxsb2NfdG9fcGFnZShwYWdlcHRyKTsKIH0KIAorLyoKKyAqIEFDOTcgdm9sdW1lIGNvbnRyb2wgc3VwcG9ydAorICovCitzdGF0aWMgaW50IGVtMjh4eF92b2xfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKmluZm8pCit7CisJaW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwlpbmZvLT5jb3VudCA9IDI7CisJaW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMHgxZjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVtMjh4eF92b2xfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQoreworCXN0cnVjdCBlbTI4eHggKmRldiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1MTYgdmFsID0gKDB4MWYgLSAodmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiAweDFmKSkgfAorCQkgICgweDFmIC0gKHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdICYgMHgxZikpIDw8IDg7CisJaW50IHJjOworCisJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKwlyYyA9IGVtMjh4eF9yZWFkX2FjOTcoZGV2LCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnI7CisKKwl2YWwgfD0gcmMgJiAweDgwMDA7CS8qIFByZXNlcnZlIHRoZSBtdXRlIGZsYWcgKi8KKworCXJjID0gZW0yOHh4X3dyaXRlX2FjOTcoZGV2LCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSwgdmFsKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycjsKKworCWRwcmludGsoIiVzbGVmdCB2b2wgJWQsIHJpZ2h0IHZvbCAlZCAoMHglMDR4KSB0byBhYzk3IHZvbHVtZSBjb250cm9sIDB4JTA0eFxuIiwKKwkJKHZhbCAmIDB4ODAwMCkgPyAibXV0ZWQgIiA6ICIiLAorCQkweDFmIC0gKCh2YWwgPj4gOCkgJiAweDFmKSwgMHgxZiAtICh2YWwgJiAweDFmKSwKKwkJdmFsLCAoaW50KWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKworZXJyOgorCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZW0yOHh4X3ZvbF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCit7CisJc3RydWN0IGVtMjh4eCAqZGV2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCB2YWw7CisKKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOworCXZhbCA9IGVtMjh4eF9yZWFkX2FjOTcoZGV2LCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gdmFsOworCisJZHByaW50aygiJXNsZWZ0IHZvbCAlZCwgcmlnaHQgdm9sICVkICgweCUwNHgpIGZyb20gYWM5NyB2b2x1bWUgY29udHJvbCAweCUwNHhcbiIsCisJCSh2YWwgJiAweDgwMDApID8gIm11dGVkICIgOiAiIiwKKwkJMHgxZiAtICgodmFsID4+IDgpICYgMHgxZiksIDB4MWYgLSAodmFsICYgMHgxZiksCisJCXZhbCwgKGludClrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisKKwl2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IDB4MWYgLSAodmFsICYgMHgxZik7CisJdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSAweDFmIC0gKCh2YWwgPDwgOCkgJiAweDFmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVtMjh4eF92b2xfcHV0X211dGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCit7CisJc3RydWN0IGVtMjh4eCAqZGV2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXUxNiB2YWwgPSB2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlpbnQgcmM7CisKKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOworCXJjID0gZW0yOHh4X3JlYWRfYWM5NyhkZXYsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycjsKKworCWlmICh2YWwpCisJCXJjICY9IDB4MWYxZjsKKwllbHNlCisJCXJjIHw9IDB4ODAwMDsKKworCXJjID0gZW0yOHh4X3dyaXRlX2FjOTcoZGV2LCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSwgcmMpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyOworCisJZHByaW50aygiJXNsZWZ0IHZvbCAlZCwgcmlnaHQgdm9sICVkICgweCUwNHgpIHRvIGFjOTcgdm9sdW1lIGNvbnRyb2wgMHglMDR4XG4iLAorCQkodmFsICYgMHg4MDAwKSA/ICJtdXRlZCAiIDogIiIsCisJCTB4MWYgLSAoKHZhbCA+PiA4KSAmIDB4MWYpLCAweDFmIC0gKHZhbCAmIDB4MWYpLAorCQl2YWwsIChpbnQpa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCitlcnI6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBlbTI4eHhfdm9sX2dldF9tdXRlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnZhbHVlKQoreworCXN0cnVjdCBlbTI4eHggKmRldiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgdmFsOworCisJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKwl2YWwgPSBlbTI4eHhfcmVhZF9hYzk3KGRldiwga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKwlpZiAodmFsIDwgMCkKKwkJcmV0dXJuIHZhbDsKKworCWlmICh2YWwgJiAweDgwMDApCisJCXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKKwllbHNlCisJCXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMTsKKworCWRwcmludGsoIiVzbGVmdCB2b2wgJWQsIHJpZ2h0IHZvbCAlZCAoMHglMDR4KSBmcm9tIGFjOTcgdm9sdW1lIGNvbnRyb2wgMHglMDR4XG4iLAorCQkodmFsICYgMHg4MDAwKSA/ICJtdXRlZCAiIDogIiIsCisJCTB4MWYgLSAoKHZhbCA+PiA4KSAmIDB4MWYpLCAweDFmIC0gKHZhbCAmIDB4MWYpLAorCQl2YWwsIChpbnQpa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShlbTI4eHhfZGJfc2NhbGUsIC0zNDUwLCAxNTAsIDApOworCitzdGF0aWMgaW50IGVtMjh4eF9jdm9sX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHN0cnVjdCBlbTI4eHggKmRldiwKKwkJCSAgIGNoYXIgKm5hbWUsIGludCBpZCkKK3sKKwlpbnQgZXJyOworCWNoYXIgY3RsX25hbWVbNDRdOworCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7CisJc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdG1wOworCisJbWVtc2V0ICgmdG1wLCAwLCBzaXplb2YodG1wKSk7CisJdG1wLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJdG1wLnByaXZhdGVfdmFsdWUgPSBpZCwKKwl0bXAubmFtZSAgPSBjdGxfbmFtZSwKKworCS8qIEFkZCBNdXRlIENvbnRyb2wgKi8KKwlzcHJpbnRmKGN0bF9uYW1lLCAiJXMgU3dpdGNoIiwgbmFtZSk7CisJdG1wLmdldCAgPSBlbTI4eHhfdm9sX2dldF9tdXRlOworCXRtcC5wdXQgID0gZW0yOHh4X3ZvbF9wdXRfbXV0ZTsKKwl0bXAuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm87CisJa2N0bCA9IHNuZF9jdGxfbmV3MSgmdG1wLCBkZXYpOworCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWRwcmludGsoIkFkZGVkIGNvbnRyb2wgJXMgZm9yIGFjOTcgdm9sdW1lIGNvbnRyb2wgMHglMDR4XG4iLAorCQljdGxfbmFtZSwgaWQpOworCisJbWVtc2V0ICgmdG1wLCAwLCBzaXplb2YodG1wKSk7CisJdG1wLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJdG1wLnByaXZhdGVfdmFsdWUgPSBpZCwKKwl0bXAubmFtZSAgPSBjdGxfbmFtZSwKKworCS8qIEFkZCBWb2x1bWUgQ29udHJvbCAqLworCXNwcmludGYoY3RsX25hbWUsICIlcyBWb2x1bWUiLCBuYW1lKTsKKwl0bXAuZ2V0ICAgPSBlbTI4eHhfdm9sX2dldDsKKwl0bXAucHV0ICAgPSBlbTI4eHhfdm9sX3B1dDsKKwl0bXAuaW5mbyAgPSBlbTI4eHhfdm9sX2luZm87CisJdG1wLnRsdi5wID0gZW0yOHh4X2RiX3NjYWxlLAorCWtjdGwgPSBzbmRfY3RsX25ldzEoJnRtcCwgZGV2KTsKKwllcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlkcHJpbnRrKCJBZGRlZCBjb250cm9sICVzIGZvciBhYzk3IHZvbHVtZSBjb250cm9sIDB4JTA0eFxuIiwKKwkJY3RsX25hbWUsIGlkKTsKKworCXJldHVybiAwOworfQorCisvKgorICogcmVnaXN0ZXIvdW5yZWdpc3RlciBjb2RlIGFuZCBkYXRhCisgKi8KIHN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VtMjh4eF9wY21fY2FwdHVyZSA9IHsKIAkub3BlbiAgICAgID0gc25kX2VtMjh4eF9jYXB0dXJlX29wZW4sCiAJLmNsb3NlICAgICA9IHNuZF9lbTI4eHhfcGNtX2Nsb3NlLApAQCAtNDUyLDE3ICs2MzksMTcgQEAKIAlzdGF0aWMgaW50ICAgICAgICAgIGRldm5yOwogCWludCAgICAgICAgICAgICAgICAgZXJyOwogCi0JaWYgKGRldi0+aGFzX2Fsc2FfYXVkaW8gIT0gMSkgeworCWlmICghZGV2LT5oYXNfYWxzYV9hdWRpbyB8fCBkZXYtPmF1ZGlvX2lmbnVtIDwgMCkgewogCQkvKiBUaGlzIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBleHRlbnNpb24gKGluIHRoaXMgY2FzZQogCQkgICB0aGUgZGV2aWNlIGlzIGV4cGVjdGluZyB0aGUgc25kLXVzYi1hdWRpbyBtb2R1bGUgb3IKIAkJICAgZG9lc24ndCBoYXZlIGFuYWxvZyBhdWRpbyBzdXBwb3J0IGF0IGFsbCkgKi8KIAkJcmV0dXJuIDA7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiZW0yOHh4LWF1ZGlvLmM6IHByb2JpbmcgZm9yIGVtMjh4MSAiCi0JCQkgIm5vbiBzdGFuZGFyZCB1c2JhdWRpb1xuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiZW0yOHh4LWF1ZGlvLmM6IHByb2JpbmcgZm9yIGVtMjh4eCBBdWRpbyBWZW5kb3IgQ2xhc3NcbiIpOwogCXByaW50ayhLRVJOX0lORk8gImVtMjh4eC1hdWRpby5jOiBDb3B5cmlnaHQgKEMpIDIwMDYgTWFya3VzICIKIAkJCSAiUmVjaGJlcmdlclxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiZW0yOHh4LWF1ZGlvLmM6IENvcHlyaWdodCAoQykgMjAwNy0yMDExIE1hdXJvIENhcnZhbGhvIENoZWhhYlxuIik7CiAKIAllcnIgPSBzbmRfY2FyZF9jcmVhdGUoaW5kZXhbZGV2bnJdLCAiRW0yOHh4IEF1ZGlvIiwgVEhJU19NT0RVTEUsIDAsCiAJCQkgICAgICAmY2FyZCk7CkBAIC00ODgsNiArNjc1LDIyIEBACiAKIAlJTklUX1dPUksoJmRldi0+d3FfdHJpZ2dlciwgYXVkaW9fdHJpZ2dlcik7CiAKKwlpZiAoZGV2LT5hdWRpb19tb2RlLmFjOTcgIT0gRU0yOFhYX05PX0FDOTcpIHsKKwkJZW0yOHh4X2N2b2xfbmV3KGNhcmQsIGRldiwgIlZpZGVvIiwgQUM5N19WSURFT19WT0wpOworCQllbTI4eHhfY3ZvbF9uZXcoY2FyZCwgZGV2LCAiTGluZSBJbiIsIEFDOTdfTElORUlOX1ZPTCk7CisJCWVtMjh4eF9jdm9sX25ldyhjYXJkLCBkZXYsICJQaG9uZSIsIEFDOTdfUEhPTkVfVk9MKTsKKwkJZW0yOHh4X2N2b2xfbmV3KGNhcmQsIGRldiwgIk1pY3JvcGhvbmUiLCBBQzk3X1BIT05FX1ZPTCk7CisJCWVtMjh4eF9jdm9sX25ldyhjYXJkLCBkZXYsICJDRCIsIEFDOTdfQ0RfVk9MKTsKKwkJZW0yOHh4X2N2b2xfbmV3KGNhcmQsIGRldiwgIkFVWCIsIEFDOTdfQVVYX1ZPTCk7CisJCWVtMjh4eF9jdm9sX25ldyhjYXJkLCBkZXYsICJQQ00iLCBBQzk3X1BDTV9PVVRfVk9MKTsKKworCQllbTI4eHhfY3ZvbF9uZXcoY2FyZCwgZGV2LCAiTWFzdGVyIiwgQUM5N19NQVNURVJfVk9MKTsKKwkJZW0yOHh4X2N2b2xfbmV3KGNhcmQsIGRldiwgIkxpbmUiLCBBQzk3X0xJTkVfTEVWRUxfVk9MKTsKKwkJZW0yOHh4X2N2b2xfbmV3KGNhcmQsIGRldiwgIk1vbm8iLCBBQzk3X01BU1RFUl9NT05PX1ZPTCk7CisJCWVtMjh4eF9jdm9sX25ldyhjYXJkLCBkZXYsICJMRkUiLCBBQzk3X0xGRV9NQVNURVJfVk9MKTsKKwkJZW0yOHh4X2N2b2xfbmV3KGNhcmQsIGRldiwgIlN1cnJvdW5kIiwgQUM5N19TVVJSX01BU1RFUl9WT0wpOworCX0KKwogCWVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOwogCWlmIChlcnIgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CkBAIC01MzgsNyArNzQxLDcgQEAKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiTWFya3VzIFJlY2hiZXJnZXIgPG1yZWNoYmVyZ2VyQGdtYWlsLmNvbT4iKTsKLU1PRFVMRV9BVVRIT1IoIk1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPiIpOworTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHJlZGhhdC5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkVtMjh4eCBBdWRpbyBkcml2ZXIiKTsKIAogbW9kdWxlX2luaXQoZW0yOHh4X2Fsc2FfcmVnaXN0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYwppbmRleCA0ZTM3Mzc1Li4zZTM5NTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYwpAQCAtMjg5LDcgKzI4OSw3IEBACiAJewktMSwJCS0xLAktMSwJLTF9LAogfTsKIAotLyogMjAxMzowMjRmIFBDVFYgU3lzdGVtcyBuYW5vU3RpY2sgVDIgMjkwZQorLyogMjAxMzowMjRmIFBDVFYgbmFub1N0aWNrIFQyIDI5MGUKICAqIEdQSU9fNiAtIGRlbW9kIHJlc2V0CiAgKiBHUElPXzcgLSBMRUQKICAqLwpAQCAtMzAwLDYgKzMwMCwyMyBAQAogCXstMSwJCQktMSwJLTEsCQktMX0sCiB9OwogCisjaWYgMAorc3RhdGljIHN0cnVjdCBlbTI4eHhfcmVnX3NlcSB0ZXJyYXRlY19oNV9ncGlvW10gPSB7CisJe0VNMjhYWF9SMDhfR1BJTywJMHhmZiwJMHhmZiwJMTB9LAorCXtFTTI4NzRfUjgwX0dQSU8sCTB4ZjYsCTB4ZmYsCTEwMH0sCisJe0VNMjg3NF9SODBfR1BJTywJMHhmMiwJMHhmZiwJNTB9LAorCXtFTTI4NzRfUjgwX0dQSU8sCTB4ZjYsCTB4ZmYsCTUwfSwKKwl7IC0xLAkJCS0xLAktMSwJLTF9LAorfTsKKworc3RhdGljIHN0cnVjdCBlbTI4eHhfcmVnX3NlcSB0ZXJyYXRlY19oNV9kaWdpdGFsW10gPSB7CisJe0VNMjg3NF9SODBfR1BJTywJMHhmNiwJMHhmZiwJMTB9LAorCXtFTTI4NzRfUjgwX0dQSU8sCTB4ZTYsCTB4ZmYsCTEwMH0sCisJe0VNMjg3NF9SODBfR1BJTywJMHhhNiwJMHhmZiwJMTB9LAorCXsgLTEsCQkJLTEsCS0xLAktMX0sCit9OworI2VuZGlmCisKIC8qCiAgKiAgQm9hcmQgZGVmaW5pdGlvbnMKICAqLwpAQCAtODQzLDYgKzg2MCwxOSBAQAogCQkJLmdwaW8gICAgID0gdGVycmF0ZWNfY2luZXJneV9VU0JfWFNfRlJfYW5hbG9nLAogCQl9IH0sCiAJfSwKKwlbRU0yODg0X0JPQVJEX1RFUlJBVEVDX0g1XSA9IHsKKwkJLm5hbWUgICAgICAgICA9ICJUZXJyYXRlYyBDaW5lcmd5IEg1IiwKKwkJLmhhc19kdmIgICAgICA9IDEsCisjaWYgMAorCQkudHVuZXJfdHlwZSAgID0gVFVORVJfUEhJTElQU19UREE4MjkwLAorCQkudHVuZXJfYWRkciAgID0gMHg0MSwKKwkJLmR2Yl9ncGlvICAgICA9IHRlcnJhdGVjX2g1X2RpZ2l0YWwsIC8qIEZJWE1FOiBwcm9iYWJseSB3cm9uZyAqLworCQkudHVuZXJfZ3BpbyAgID0gdGVycmF0ZWNfaDVfZ3BpbywKKyNlbmRpZgorCQkuaTJjX3NwZWVkICAgID0gRU0yODc0X0kyQ19TRUNPTkRBUllfQlVTX1NFTEVDVCB8CisJCQkJRU0yOFhYX0kyQ19DTEtfV0FJVF9FTkFCTEUgfAorCQkJCUVNMjhYWF9JMkNfRlJFUV80MDBfS0haLAorCX0sCiAJW0VNMjg4MF9CT0FSRF9IQVVQUEFVR0VfV0lOVFZfSFZSXzkwMF0gPSB7CiAJCS5uYW1lICAgICAgICAgPSAiSGF1cHBhdWdlIFdpblRWIEhWUiA5MDAiLAogCQkudGRhOTg4N19jb25mID0gVERBOTg4N19QUkVTRU5ULApAQCAtMTI1OSw3ICsxMjg5LDcgQEAKIAkJfSB9LAogCX0sCiAKLQlbRU0yODc0X0xFQURFUlNISVBfSVNEQlRdID0geworCVtFTTI4NzRfQk9BUkRfTEVBREVSU0hJUF9JU0RCVF0gPSB7CiAJCS5pMmNfc3BlZWQgICAgICA9IEVNMjg3NF9JMkNfU0VDT05EQVJZX0JVU19TRUxFQ1QgfAogCQkJCSAgRU0yOFhYX0kyQ19DTEtfV0FJVF9FTkFCTEUgfAogCQkJCSAgRU0yOFhYX0kyQ19GUkVRXzEwMF9LSFosCkBAIC0xMzE5LDcgKzEzNDksNiBAQAogCX0sCiAJW0VNMjg4MF9CT0FSRF9LV09STERfRFZCXzMwNVVdID0gewogCQkubmFtZQkgICAgICA9ICJLV29ybGQgRFZCLVQgMzA1VSIsCi0JCS52YWxpZCAgICAgICAgPSBFTTI4WFhfQk9BUkRfTk9UX1ZBTElEQVRFRCwKIAkJLnR1bmVyX3R5cGUgICA9IFRVTkVSX1hDMjAyOCwKIAkJLnR1bmVyX2dwaW8gICA9IGRlZmF1bHRfdHVuZXJfZ3BpbywKIAkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9UVlA1MTUwLApAQCAtMTc3MCwxNiArMTc5OSwxNiBAQAogCQkuZHZiX2dwaW8gICA9IGt3b3JsZF9hMzQwX2RpZ2l0YWwsCiAJCS50dW5lcl9ncGlvID0gZGVmYXVsdF90dW5lcl9ncGlvLAogCX0sCi0JLyogMjAxMzowMjRmIFBDVFYgU3lzdGVtcyBuYW5vU3RpY2sgVDIgMjkwZS4KKwkvKiAyMDEzOjAyNGYgUENUViBuYW5vU3RpY2sgVDIgMjkwZS4KIAkgKiBFbXBpYSBFTTI4MTc0LCBTb255IENYRDI4MjBSIGFuZCBOWFAgVERBMTgyNzFIRC9DMiAqLwogCVtFTTI4MTc0X0JPQVJEX1BDVFZfMjkwRV0gPSB7CisJCS5uYW1lICAgICAgICAgID0gIlBDVFYgbmFub1N0aWNrIFQyIDI5MGUiLAogCQkuaTJjX3NwZWVkICAgICAgPSBFTTI4NzRfSTJDX1NFQ09OREFSWV9CVVNfU0VMRUNUIHwKIAkJCUVNMjhYWF9JMkNfQ0xLX1dBSVRfRU5BQkxFIHwgRU0yOFhYX0kyQ19GUkVRXzEwMF9LSFosCi0JCS54Y2xrICAgICAgICAgID0gRU0yOFhYX1hDTEtfRlJFUVVFTkNZXzEyTUhaLAotCQkubmFtZSAgICAgICAgICA9ICJQQ1RWIFN5c3RlbXMgbmFub1N0aWNrIFQyIDI5MGUiLAogCQkudHVuZXJfdHlwZSAgICA9IFRVTkVSX0FCU0VOVCwKIAkJLnR1bmVyX2dwaW8gICAgPSBwY3R2XzI5MGUsCiAJCS5oYXNfZHZiICAgICAgID0gMSwKKwkJLmlyX2NvZGVzICAgICAgPSBSQ19NQVBfUElOTkFDTEVfUENUVl9IRCwKIAl9LAogfTsKIGNvbnN0IHVuc2lnbmVkIGludCBlbTI4eHhfYmNvdW50ID0gQVJSQVlfU0laRShlbTI4eHhfYm9hcmRzKTsKQEAgLTE4NTUsOCArMTg4NCwxMCBAQAogCXsgVVNCX0RFVklDRSgweDBjY2QsIDB4MDA0MiksCiAJCQkuZHJpdmVyX2luZm8gPSBFTTI4ODJfQk9BUkRfVEVSUkFURUNfSFlCUklEX1hTIH0sCiAJeyBVU0JfREVWSUNFKDB4MGNjZCwgMHgwMDQzKSwKLQkJCS5kcml2ZXJfaW5mbyA9IEVNMjg3MF9CT0FSRF9URVJSQVRFQ19YUyB9LAotCXsgVVNCX0RFVklDRSgweDBjY2QsIDB4MDA0NyksCisJCQkuZHJpdmVyX2luZm8gPSBFTTI4ODRfQk9BUkRfVEVSUkFURUNfSDUgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwY2NkLCAweDEwYTIpLAkvKiBSZXYuIDEgKi8KKwkJCS5kcml2ZXJfaW5mbyA9IEVNMjg4NF9CT0FSRF9URVJSQVRFQ19INSB9LAorCXsgVVNCX0RFVklDRSgweDBjY2QsIDB4MTBhZCksCS8qIFJldi4gMiAqLwogCQkJLmRyaXZlcl9pbmZvID0gRU0yODgwX0JPQVJEX1RFUlJBVEVDX1BST0RJR1lfWFMgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwY2NkLCAweDAwODQpLAogCQkJLmRyaXZlcl9pbmZvID0gRU0yODYwX0JPQVJEX1RFUlJBVEVDX0FWMzUwIH0sCkBAIC0xOTM3LDcgKzE5NjgsNyBAQAogCXsweDc3ODAwMDgwLCBFTTI4NjBfQk9BUkRfVFZQNTE1MF9SRUZFUkVOQ0VfREVTSUdOLCBUVU5FUl9BQlNFTlR9LAogCXsweGM1MTIwMGUzLCBFTTI4MjBfQk9BUkRfR0FETUVJX1RWUjIwMCwgVFVORVJfTEdfUEFMX05FV19UQVBDfSwKIAl7MHg0YmE1MDA4MCwgRU0yODYxX0JPQVJEX0dBRE1FSV9VVFYzMzBQTFVTLCBUVU5FUl9UTkZfNTMzNU1GfSwKLQl7MHg2YjgwMDA4MCwgRU0yODc0X0xFQURFUlNISVBfSVNEQlQsIFRVTkVSX0FCU0VOVH0sCisJezB4NmI4MDAwODAsIEVNMjg3NF9CT0FSRF9MRUFERVJTSElQX0lTREJULCBUVU5FUl9BQlNFTlR9LAogfTsKIAogLyogSTJDIHBvc3NpYmxlIGFkZHJlc3MgdG8gc2FhNzExNSwgdHZwNTE1MCwgbXNwMzQwMCwgdHZhdWRpbyAqLwpAQCAtMjY2MCwxMCArMjY5MSw5IEBACiAJCQkuYWRkciA9IDB4YmEgPj4gMSwKIAkJCS5wbGF0Zm9ybV9kYXRhID0gJnBkYXRhLAogCQl9OwotCQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOwogCiAJCXBkYXRhLnh0YWwgPSBkZXYtPnNlbnNvcl94dGFsOwotCQlzZCA9IHY0bDJfaTJjX25ld19zdWJkZXZfYm9hcmQoJmRldi0+djRsMl9kZXYsICZkZXYtPmkyY19hZGFwLAorCQl2NGwyX2kyY19uZXdfc3ViZGV2X2JvYXJkKCZkZXYtPnY0bDJfZGV2LCAmZGV2LT5pMmNfYWRhcCwKIAkJCQkmbXQ5djAxMV9pbmZvLCBOVUxMKTsKIAl9CiAKQEAgLTI4NDIsMTEgKzI4NzIsMjYgQEAKIAkJCWVtMjh4eF9pbmZvKCJjaGlwIElEIGlzIGVtMjg4Mi9lbTI4ODNcbiIpOwogCQkJZGV2LT53YWl0X2FmdGVyX3dyaXRlID0gMDsKIAkJCWJyZWFrOworCQljYXNlIENISVBfSURfRU0yODg0OgorCQkJZW0yOHh4X2luZm8oImNoaXAgSUQgaXMgZW0yODg0XG4iKTsKKwkJCWRldi0+cmVnX2dwaW9fbnVtID0gRU0yODc0X1I4MF9HUElPOworCQkJZGV2LT53YWl0X2FmdGVyX3dyaXRlID0gMDsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZW0yOHh4X2luZm8oImVtMjh4eCBjaGlwIElEID0gJWRcbiIsIGRldi0+Y2hpcF9pZCk7CiAJCX0KIAl9CiAKKwlpZiAoZGV2LT5pc19hdWRpb19vbmx5KSB7CisJCWVyckNvZGUgPSBlbTI4eHhfYXVkaW9fc2V0dXAoZGV2KTsKKwkJaWYgKGVyckNvZGUpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJZW0yOHh4X2FkZF9pbnRvX2Rldmxpc3QoZGV2KTsKKwkJZW0yOHh4X2luaXRfZXh0ZW5zaW9uKGRldik7CisKKwkJcmV0dXJuIDA7CisJfQorCiAJLyogUHJlcG9wdWxhdGUgY2FjaGVkIEdQTyByZWdpc3RlciBjb250ZW50ICovCiAJcmV0dmFsID0gZW0yOHh4X3JlYWRfcmVnKGRldiwgZGV2LT5yZWdfZ3BvX251bSk7CiAJaWYgKHJldHZhbCA+PSAwKQpAQCAtMjk0Nyw2ICsyOTkyLDkgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCisvKiBoaWdoIGJhbmR3aWR0aCBtdWx0aXBsaWVyLCBhcyBlbmNvZGVkIGluIGhpZ2hzcGVlZCBlbmRwb2ludCBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBoYl9tdWx0KHdNYXhQYWNrZXRTaXplKSAoMSArICgoKHdNYXhQYWNrZXRTaXplKSA+PiAxMSkgJiAweDAzKSkKKwogLyoKICAqIGVtMjh4eF91c2JfcHJvYmUoKQogICogY2hlY2tzIGZvciBzdXBwb3J0ZWQgZGV2aWNlcwpAQCAtMjk1NiwxNSArMzAwNCwxNSBAQAogewogCWNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKnVpZjsKIAlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSBOVUxMOwogCWludCByZXR2YWw7Ci0JaW50IGksIG5yLCBpZm51bSwgaXNvY19waXBlOworCWJvb2wgaXNfYXVkaW9fb25seSA9IGZhbHNlLCBoYXNfYXVkaW8gPSBmYWxzZTsKKwlpbnQgaSwgbnIsIGlzb2NfcGlwZTsKKwljb25zdCBpbnQgaWZudW0gPSBpbnRlcmZhY2UtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyOwogCWNoYXIgKnNwZWVkOwogCWNoYXIgZGVzY3JbMjU1XSA9ICIiOwogCiAJdWRldiA9IHVzYl9nZXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSk7Ci0JaWZudW0gPSBpbnRlcmZhY2UtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyOwogCiAJLyogQ2hlY2sgdG8gc2VlIG5leHQgZnJlZSBkZXZpY2UgYW5kIG1hcmsgYXMgdXNlZCAqLwogCW5yID0gZmluZF9maXJzdF96ZXJvX2JpdCgmZW0yOHh4X2RldnVzZWQsIEVNMjhYWF9NQVhCT0FSRFMpOwpAQCAtMjk4NCw2ICszMDMyLDE5IEBACiAJCWdvdG8gZXJyOwogCX0KIAorCS8qIEdldCBlbmRwb2ludHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW50ZXJmYWNlLT5udW1fYWx0c2V0dGluZzsgaSsrKSB7CisJCWludCBlcDsKKworCQlmb3IgKGVwID0gMDsgZXAgPCBpbnRlcmZhY2UtPmFsdHNldHRpbmdbaV0uZGVzYy5iTnVtRW5kcG9pbnRzOyBlcCsrKSB7CisJCQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQJKmU7CisJCQllID0gJmludGVyZmFjZS0+YWx0c2V0dGluZ1tpXS5lbmRwb2ludFtlcF07CisKKwkJCWlmIChlLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MgPT0gMHg4MykKKwkJCQloYXNfYXVkaW8gPSB0cnVlOworCQl9CisJfQorCiAJZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZy0+ZW5kcG9pbnRbMF0uZGVzYzsKIAogCS8qIGNoZWNrIGlmIHRoZSBkZXZpY2UgaGFzIHRoZSBpc28gaW4gZW5kcG9pbnQgYXQgdGhlIGNvcnJlY3QgcGxhY2UgKi8KQEAgLTMwMDMsMTkgKzMwNjQsMjIgQEAKIAkJCWNoZWNrX2ludGVyZmFjZSA9IDA7CiAKIAkJaWYgKCFjaGVja19pbnRlcmZhY2UpIHsKLQkJCWVtMjh4eF9lcnIoRFJJVkVSX05BTUUgIiB2aWRlbyBkZXZpY2UgKCUwNHg6JTA0eCk6ICIKLQkJCQkiaW50ZXJmYWNlICVpLCBjbGFzcyAlaSBmb3VuZC5cbiIsCi0JCQkJbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCi0JCQkJbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpLAotCQkJCWlmbnVtLAotCQkJCWludGVyZmFjZS0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VDbGFzcyk7CisJCQlpZiAoaGFzX2F1ZGlvKSB7CisJCQkJaXNfYXVkaW9fb25seSA9IHRydWU7CisJCQl9IGVsc2UgeworCQkJCWVtMjh4eF9lcnIoRFJJVkVSX05BTUUgIiB2aWRlbyBkZXZpY2UgKCUwNHg6JTA0eCk6ICIKKwkJCQkJImludGVyZmFjZSAlaSwgY2xhc3MgJWkgZm91bmQuXG4iLAorCQkJCQlsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKKwkJCQkJbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpLAorCQkJCQlpZm51bSwKKwkJCQkJaW50ZXJmYWNlLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZUNsYXNzKTsKKwkJCQllbTI4eHhfZXJyKERSSVZFUl9OQU1FICIgVGhpcyBpcyBhbiBhbmNpbGlhcnkgIgorCQkJCQkiaW50ZXJmYWNlIG5vdCB1c2VkIGJ5IHRoZSBkcml2ZXJcbiIpOwogCi0JCQllbTI4eHhfZXJyKERSSVZFUl9OQU1FICIgVGhpcyBpcyBhbiBhbmNpbGlhcnkgIgotCQkJCSJpbnRlcmZhY2Ugbm90IHVzZWQgYnkgdGhlIGRyaXZlclxuIik7Ci0KLQkJCWVtMjh4eF9kZXZ1c2VkICY9IH4oMTw8bnIpOwotCQkJcmV0dmFsID0gLUVOT0RFVjsKLQkJCWdvdG8gZXJyOworCQkJCWVtMjh4eF9kZXZ1c2VkICY9IH4oMTw8bnIpOworCQkJCXJldHZhbCA9IC1FTk9ERVY7CisJCQkJZ290byBlcnI7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTMwNDUsOCArMzEwOSw4IEBACiAJaWYgKCpkZXNjcikKIAkJc3RybGNhdChkZXNjciwgIiAiLCBzaXplb2YoZGVzY3IpKTsKIAotCXByaW50ayhEUklWRVJfTkFNRSAiOiBOZXcgZGV2aWNlICVzQCAlcyBNYnBzICIKLQkJIiglMDR4OiUwNHgsIGludGVyZmFjZSAlZCwgY2xhc3MgJWQpXG4iLAorCXByaW50ayhLRVJOX0lORk8gRFJJVkVSX05BTUUKKwkJIjogTmV3IGRldmljZSAlc0AgJXMgTWJwcyAoJTA0eDolMDR4LCBpbnRlcmZhY2UgJWQsIGNsYXNzICVkKVxuIiwKIAkJZGVzY3IsCiAJCXNwZWVkLAogCQlsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKQEAgLTMwNTQsNiArMzExOCwxMSBAQAogCQlpZm51bSwKIAkJaW50ZXJmYWNlLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOwogCisJaWYgKGhhc19hdWRpbykKKwkJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRQorCQkgICAgICAgIjogQXVkaW8gVmVuZG9yIENsYXNzIGludGVyZmFjZSAlaSBmb3VuZFxuIiwKKwkJICAgICAgIGlmbnVtKTsKKwogCS8qCiAJICogTWFrZSBzdXJlIHdlIGhhdmUgNDgwIE1icHMgb2YgYmFuZHdpZHRoLCBvdGhlcndpc2UgdGhpbmdzIGxpa2UKIAkgKiB2aWRlbyBzdHJlYW0gd291bGRuJ3QgbGlrZWx5IHdvcmssIHNpbmNlIDEyIE1icHMgaXMgZ2VuZXJhbGx5CkBAIC0zMDg5LDEwICszMTU4LDEzIEBACiAJZGV2LT5kZXZubyA9IG5yOwogCWRldi0+bW9kZWwgPSBpZC0+ZHJpdmVyX2luZm87CiAJZGV2LT5hbHQgICA9IC0xOworCWRldi0+aXNfYXVkaW9fb25seSA9IGlzX2F1ZGlvX29ubHk7CisJZGV2LT5oYXNfYWxzYV9hdWRpbyA9IGhhc19hdWRpbzsKKwlkZXYtPmF1ZGlvX2lmbnVtID0gaWZudW07CiAKIAkvKiBDaGVja3MgaWYgYXVkaW8gaXMgcHJvdmlkZWQgYnkgc29tZSBpbnRlcmZhY2UgKi8KIAlmb3IgKGkgPSAwOyBpIDwgdWRldi0+Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzOyBpKyspIHsKLQkJdWlmID0gdWRldi0+Y29uZmlnLT5pbnRlcmZhY2VbaV07CisJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICp1aWYgPSB1ZGV2LT5jb25maWctPmludGVyZmFjZVtpXTsKIAkJaWYgKHVpZi0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VDbGFzcyA9PSBVU0JfQ0xBU1NfQVVESU8pIHsKIAkJCWRldi0+aGFzX2F1ZGlvX2NsYXNzID0gMTsKIAkJCWJyZWFrOwpAQCAtMzEwMCw5ICszMTcyLDcgQEAKIAl9CiAKIAkvKiBjb21wdXRlIGFsdGVybmF0ZSBtYXggcGFja2V0IHNpemVzICovCi0JdWlmID0gdWRldi0+YWN0Y29uZmlnLT5pbnRlcmZhY2VbMF07Ci0KLQlkZXYtPm51bV9hbHQgPSB1aWYtPm51bV9hbHRzZXR0aW5nOworCWRldi0+bnVtX2FsdCA9IGludGVyZmFjZS0+bnVtX2FsdHNldHRpbmc7CiAJZGV2LT5hbHRfbWF4X3BrdF9zaXplID0ga21hbGxvYygzMiAqIGRldi0+bnVtX2FsdCwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoZGV2LT5hbHRfbWF4X3BrdF9zaXplID09IE5VTEwpIHsKQEAgLTMxMTQsMTQgKzMxODQsMjEgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1fYWx0IDsgaSsrKSB7Ci0JCXUxNiB0bXAgPSBsZTE2X3RvX2NwdSh1aWYtPmFsdHNldHRpbmdbaV0uZW5kcG9pbnRbaXNvY19waXBlXS5kZXNjLndNYXhQYWNrZXRTaXplKTsKLQkJZGV2LT5hbHRfbWF4X3BrdF9zaXplW2ldID0KLQkJICAgICh0bXAgJiAweDA3ZmYpICogKCgodG1wICYgMHgxODAwKSA+PiAxMSkgKyAxKTsKKwkJdTE2IHRtcCA9IGxlMTZfdG9fY3B1KGludGVyZmFjZS0+YWx0c2V0dGluZ1tpXS5lbmRwb2ludFtpc29jX3BpcGVdLmRlc2Mud01heFBhY2tldFNpemUpOworCQl1bnNpZ25lZCBpbnQgc2l6ZSA9IHRtcCAmIDB4N2ZmOworCisJCWlmICh1ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKKwkJCXNpemUgPSBzaXplICogaGJfbXVsdCh0bXApOworCisJCWRldi0+YWx0X21heF9wa3Rfc2l6ZVtpXSA9IHNpemU7CiAJfQogCiAJaWYgKChjYXJkW25yXSA+PSAwKSAmJiAoY2FyZFtucl0gPCBlbTI4eHhfYmNvdW50KSkKIAkJZGV2LT5tb2RlbCA9IGNhcmRbbnJdOwogCisJLyogc2F2ZSBvdXIgZGF0YSBwb2ludGVyIGluIHRoaXMgaW50ZXJmYWNlIGRldmljZSAqLworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBkZXYpOworCiAJLyogYWxsb2NhdGUgZGV2aWNlIHN0cnVjdCAqLwogCW11dGV4X2luaXQoJmRldi0+bG9jayk7CiAJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKQEAgLTMxMzMsOSArMzIxMCw2IEBACiAJCWdvdG8gZXJyOwogCX0KIAotCS8qIHNhdmUgb3VyIGRhdGEgcG9pbnRlciBpbiB0aGlzIGludGVyZmFjZSBkZXZpY2UgKi8KLQl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgZGV2KTsKLQogCXJlcXVlc3RfbW9kdWxlcyhkZXYpOwogCiAJLyogU2hvdWxkIGJlIHRoZSBsYXN0IHRoaW5nIHRvIGRvLCB0byBhdm9pZCBuZXdlciB1ZGV2J3MgdG8KQEAgLTMxNjQsNiArMzIzOCwxMyBAQAogCWlmICghZGV2KQogCQlyZXR1cm47CiAKKwlpZiAoZGV2LT5pc19hdWRpb19vbmx5KSB7CisJCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisJCWVtMjh4eF9jbG9zZV9leHRlbnNpb24oZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCQlyZXR1cm47CisJfQorCiAJZW0yOHh4X2luZm8oImRpc2Nvbm5lY3RpbmcgJXNcbiIsIGRldi0+dmRldi0+bmFtZSk7CiAKIAlmbHVzaF9yZXF1ZXN0X21vZHVsZXMoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY29yZS5jCmluZGV4IGUzM2YxNDUuLjU3YjFiNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNvcmUuYwpAQCAtMjExLDYgKzIxMSw3IEBACiB7CiAJcmV0dXJuIGVtMjh4eF93cml0ZV9yZWdzKGRldiwgcmVnLCAmdmFsLCAxKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGVtMjh4eF93cml0ZV9yZWcpOwogCiAvKgogICogZW0yOHh4X3dyaXRlX3JlZ19iaXRzKCkKQEAgLTI4Niw2ICsyODcsNyBAQAogCQlyZXR1cm4gcmV0OwogCXJldHVybiBsZTE2X3RvX2NwdSh2YWwpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoZW0yOHh4X3JlYWRfYWM5Nyk7CiAKIC8qCiAgKiBlbTI4eHhfd3JpdGVfYWM5NygpCkBAIC0zMTMsMTMgKzMxNSwxNCBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChlbTI4eHhfd3JpdGVfYWM5Nyk7CiAKLXN0cnVjdCBlbTI4eHhfdm9sX3RhYmxlIHsKK3N0cnVjdCBlbTI4eHhfdm9sX2l0YWJsZSB7CiAJZW51bSBlbTI4eHhfYW11eCBtdXg7CiAJdTgJCSByZWc7CiB9OwogCi1zdGF0aWMgc3RydWN0IGVtMjh4eF92b2xfdGFibGUgaW5wdXRzW10gPSB7CitzdGF0aWMgc3RydWN0IGVtMjh4eF92b2xfaXRhYmxlIGlucHV0c1tdID0gewogCXsgRU0yOFhYX0FNVVhfVklERU8sIAlBQzk3X1ZJREVPX1ZPTCAgIH0sCiAJeyBFTTI4WFhfQU1VWF9MSU5FX0lOLAlBQzk3X0xJTkVJTl9WT0wgIH0sCiAJeyBFTTI4WFhfQU1VWF9QSE9ORSwJQUM5N19QSE9ORV9WT0wgICB9LApAQCAtNDAzLDcgKzQwNiwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZW0yOHh4X3ZvbF90YWJsZSBvdXRwdXRzW10gPSB7CitzdHJ1Y3QgZW0yOHh4X3ZvbF9vdGFibGUgeworCWVudW0gZW0yOHh4X2FvdXQgbXV4OworCXU4CQkgcmVnOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbTI4eHhfdm9sX290YWJsZSBvdXRwdXRzW10gPSB7CiAJeyBFTTI4WFhfQU9VVF9NQVNURVIsIEFDOTdfTUFTVEVSX1ZPTCAgICAgIH0sCiAJeyBFTTI4WFhfQU9VVF9MSU5FLCAgIEFDOTdfTElORV9MRVZFTF9WT0wgIH0sCiAJeyBFTTI4WFhfQU9VVF9NT05PLCAgIEFDOTdfTUFTVEVSX01PTk9fVk9MIH0sCkBAIC00OTIsMTcgKzUwMCwxMyBAQAogCWlmIChkZXYtPmNoaXBfaWQgPT0gQ0hJUF9JRF9FTTI4NzAgfHwgZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODc0CiAJCXx8IGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjgxNzQpIHsKIAkJLyogRGlnaXRhbCBvbmx5IGRldmljZSAtIGRvbid0IGxvYWQgYW55IGFsc2EgbW9kdWxlICovCi0JCWRldi0+YXVkaW9fbW9kZS5oYXNfYXVkaW8gPSAwOwotCQlkZXYtPmhhc19hdWRpb19jbGFzcyA9IDA7Ci0JCWRldi0+aGFzX2Fsc2FfYXVkaW8gPSAwOworCQlkZXYtPmF1ZGlvX21vZGUuaGFzX2F1ZGlvID0gZmFsc2U7CisJCWRldi0+aGFzX2F1ZGlvX2NsYXNzID0gZmFsc2U7CisJCWRldi0+aGFzX2Fsc2FfYXVkaW8gPSBmYWxzZTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JLyogSWYgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBVc2IgQXVkaW8gQ2xhc3MsIHVzZSB2ZW5kb3IgY2xhc3MgKi8KLQlpZiAoIWRldi0+aGFzX2F1ZGlvX2NsYXNzKQotCQlkZXYtPmhhc19hbHNhX2F1ZGlvID0gMTsKLQotCWRldi0+YXVkaW9fbW9kZS5oYXNfYXVkaW8gPSAxOworCWRldi0+YXVkaW9fbW9kZS5oYXNfYXVkaW8gPSB0cnVlOwogCiAJLyogU2VlIGhvdyB0aGlzIGRldmljZSBpcyBjb25maWd1cmVkICovCiAJY2ZnID0gZW0yOHh4X3JlYWRfcmVnKGRldiwgRU0yOFhYX1IwMF9DSElQQ0ZHKTsKQEAgLTUxMiw4ICs1MTYsOCBAQAogCQljZmcgPSBFTTI4WFhfQ0hJUENGR19BQzk3OyAvKiBCZSBjb25zZXJ2YXRpdmUgKi8KIAl9IGVsc2UgaWYgKChjZmcgJiBFTTI4WFhfQ0hJUENGR19BVURJT01BU0spID09IDB4MDApIHsKIAkJLyogVGhlIGRldmljZSBkb2Vzbid0IGhhdmUgdmVuZG9yIGF1ZGlvIGF0IGFsbCAqLwotCQlkZXYtPmhhc19hbHNhX2F1ZGlvID0gMDsKLQkJZGV2LT5hdWRpb19tb2RlLmhhc19hdWRpbyA9IDA7CisJCWRldi0+aGFzX2Fsc2FfYXVkaW8gPSBmYWxzZTsKKwkJZGV2LT5hdWRpb19tb2RlLmhhc19hdWRpbyA9IGZhbHNlOwogCQlyZXR1cm4gMDsKIAl9IGVsc2UgaWYgKChjZmcgJiBFTTI4WFhfQ0hJUENGR19BVURJT01BU0spID09CiAJCSAgIEVNMjhYWF9DSElQQ0ZHX0kyU18zX1NBTVBSQVRFUykgewpAQCAtNTQyLDggKzU0Niw4IEBACiAJCSAqLwogCQllbTI4eHhfd2FybigiQUM5NyBjaGlwIHR5cGUgY291bGRuJ3QgYmUgZGV0ZXJtaW5lZFxuIik7CiAJCWRldi0+YXVkaW9fbW9kZS5hYzk3ID0gRU0yOFhYX05PX0FDOTc7Ci0JCWRldi0+aGFzX2Fsc2FfYXVkaW8gPSAwOwotCQlkZXYtPmF1ZGlvX21vZGUuaGFzX2F1ZGlvID0gMDsKKwkJZGV2LT5oYXNfYWxzYV9hdWRpbyA9IGZhbHNlOworCQlkZXYtPmF1ZGlvX21vZGUuaGFzX2F1ZGlvID0gZmFsc2U7CiAJCWdvdG8gaW5pdF9hdWRpbzsKIAl9CiAKQEAgLTYxNSw3ICs2MTksOSBAQAogewogCWludCByYzsKIAotCWlmIChkZXYtPmNoaXBfaWQgPT0gQ0hJUF9JRF9FTTI4NzQgfHwgZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODE3NCkgeworCWlmIChkZXYtPmNoaXBfaWQgPT0gQ0hJUF9JRF9FTTI4NzQgfHwKKwkgICAgZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODg0IHx8CisJICAgIGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjgxNzQpIHsKIAkJLyogVGhlIFRyYW5zcG9ydCBTdHJlYW0gRW5hYmxlIFJlZ2lzdGVyIG1vdmVkIGluIGVtMjg3NCAqLwogCQlpZiAoIXN0YXJ0KSB7CiAJCQlyYyA9IGVtMjh4eF93cml0ZV9yZWdfYml0cyhkZXYsIEVNMjg3NF9SNUZfVFNfRU5BQkxFLApAQCAtODg0LDYgKzg5MCw3IEBACiAJfQogCXJldHVybiByYzsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGVtMjh4eF9ncGlvX3NldCk7CiAKIGludCBlbTI4eHhfc2V0X21vZGUoc3RydWN0IGVtMjh4eCAqZGV2LCBlbnVtIGVtMjh4eF9tb2RlIHNldF9tb2RlKQogewpAQCAtOTE3LDcgKzkyNCw3IEBACiBzdGF0aWMgdm9pZCBlbTI4eHhfaXJxX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKIAlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSB1cmItPmNvbnRleHQ7Ci0JaW50IHJjLCBpOworCWludCBpOwogCiAJc3dpdGNoICh1cmItPnN0YXR1cykgewogCWNhc2UgMDogICAgICAgICAgICAgLyogc3VjY2VzcyAqLwpAQCAtOTM0LDcgKzk0MSw3IEBACiAKIAkvKiBDb3B5IGRhdGEgZnJvbSBVUkIgKi8KIAlzcGluX2xvY2soJmRldi0+c2xvY2spOwotCXJjID0gZGV2LT5pc29jX2N0bC5pc29jX2NvcHkoZGV2LCB1cmIpOworCWRldi0+aXNvY19jdGwuaXNvY19jb3B5KGRldiwgdXJiKTsKIAlzcGluX3VubG9jaygmZGV2LT5zbG9jayk7CiAKIAkvKiBSZXNldCB1cmIgYnVmZmVycyAqLwpAQCAtMTEwNiwxNyArMTExMywxOSBAQAogaW50IGVtMjh4eF9pc29jX2R2Yl9tYXhfcGFja2V0c2l6ZShzdHJ1Y3QgZW0yOHh4ICpkZXYpCiB7CiAJdW5zaWduZWQgaW50IGNoaXBfY2ZnMjsKLQl1bnNpZ25lZCBpbnQgcGFja2V0X3NpemUgPSA1NjQ7CisJdW5zaWduZWQgaW50IHBhY2tldF9zaXplOwogCi0JaWYgKGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjg3NCkgewotCQkvKiBGSVhNRSAtIGZvciBub3cgYXNzdW1lIDU2NCBsaWtlIGl0IHdhcyBiZWZvcmUsIGJ1dCB0aGUKLQkJICAgZW0yODc0IGNvZGUgc2hvdWxkIGJlIGFkZGVkIHRvIHJldHVybiB0aGUgcHJvcGVyIHZhbHVlLi4uICovCi0JCXBhY2tldF9zaXplID0gNTY0OwotCX0gZWxzZSBpZiAoZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODE3NCkgewotCQkvKiBGSVhNRSBzYW1lIGFzIGVtMjg3NC4gNTY0IHdhcyBlbm91Z2ggZm9yIDIyIE1iaXQgRFZCLVQKLQkJICAgYnV0IHRvbyBtdWNoIGZvciA0NCBNYml0IERWQi1DLiAqLwotCQlwYWNrZXRfc2l6ZSA9IDc1MjsKLQl9IGVsc2UgeworCXN3aXRjaCAoZGV2LT5jaGlwX2lkKSB7CisJY2FzZSBDSElQX0lEX0VNMjcxMDoKKwljYXNlIENISVBfSURfRU0yNzUwOgorCWNhc2UgQ0hJUF9JRF9FTTI4MDA6CisJY2FzZSBDSElQX0lEX0VNMjgyMDoKKwljYXNlIENISVBfSURfRU0yODQwOgorCWNhc2UgQ0hJUF9JRF9FTTI4NjA6CisJCS8qIE5vIERWQiBzdXBwb3J0ICovCisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgQ0hJUF9JRF9FTTI4NzA6CisJY2FzZSBDSElQX0lEX0VNMjg4MzoKIAkJLyogVFMgbWF4IHBhY2tldCBzaXplIHN0b3JlZCBpbiBiaXRzIDEtMCBvZiBSMDEgKi8KIAkJY2hpcF9jZmcyID0gZW0yOHh4X3JlYWRfcmVnKGRldiwgRU0yOFhYX1IwMV9DSElQQ0ZHMik7CiAJCXN3aXRjaCAoY2hpcF9jZmcyICYgRU0yOFhYX0NISVBDRkcyX1RTX1BBQ0tFVFNJWkVfTUFTSykgewpAQCAtMTEzMyw5ICsxMTQyLDI0IEBACiAJCQlwYWNrZXRfc2l6ZSA9IDc1MjsKIAkJCWJyZWFrOwogCQl9CisJCWJyZWFrOworCWNhc2UgQ0hJUF9JRF9FTTI4NzQ6CisJCS8qCisJCSAqIEZJWE1FOiBmb3Igbm93IGFzc3VtZXMgNTY0IGxpa2UgaXQgd2FzIGJlZm9yZSwgYnV0IHRoZQorCQkgKiBlbTI4NzQgY29kZSBzaG91bGQgYmUgYWRkZWQgdG8gcmV0dXJuIHRoZSBwcm9wZXIgdmFsdWUKKwkJICovCisJCXBhY2tldF9zaXplID0gNTY0OworCQlicmVhazsKKwljYXNlIENISVBfSURfRU0yODg0OgorCWNhc2UgQ0hJUF9JRF9FTTI4MTc0OgorCWRlZmF1bHQ6CisJCS8qCisJCSAqIEZJWE1FOiBzYW1lIGFzIGVtMjg3NC4gNTY0IHdhcyBlbm91Z2ggZm9yIDIyIE1iaXQgRFZCLVQKKwkJICogYnV0IG5vdCBlbm91Z2ggZm9yIDQ0IE1iaXQgRFZCLUMuCisJCSAqLworCQlwYWNrZXRfc2l6ZSA9IDc1MjsKIAl9CiAKLQllbTI4eHhfY29yZWRiZygiZHZiIG1heCBwYWNrZXQgc2l6ZT0lZFxuIiwgcGFja2V0X3NpemUpOwogCXJldHVybiBwYWNrZXRfc2l6ZTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGVtMjh4eF9pc29jX2R2Yl9tYXhfcGFja2V0c2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtZHZiLmMKaW5kZXggNzkwNGNhNC4uZTU5MTZkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1kdmIuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgRFZCIGRldmljZSBkcml2ZXIgZm9yIGVtMjh4eAogCi0gKGMpIDIwMDggTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+CisgKGMpIDIwMDgtMjAxMSBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KIAogIChjKSAyMDA4IERldmluIEhlaXRtdWVsbGVyIDxkZXZpbi5oZWl0bXVlbGxlckBnbWFpbC5jb20+CiAJLSBGaXhlcyBmb3IgdGhlIGRyaXZlciB0byBwcm9wZXJseSB3b3JrIHdpdGggSFZSLTk1MApAQCAtNDAsNiArNDAsOCBAQAogI2luY2x1ZGUgInM5MjEuaCIKICNpbmNsdWRlICJkcnhkLmgiCiAjaW5jbHVkZSAiY3hkMjgyMHIuaCIKKyNpbmNsdWRlICJ0ZGExODI3MWMyZGQuaCIKKyNpbmNsdWRlICJkcnhrLmgiCiAKIE1PRFVMRV9ERVNDUklQVElPTigiZHJpdmVyIGZvciBlbTI4eHggYmFzZWQgRFZCIGNhcmRzIik7CiBNT0RVTEVfQVVUSE9SKCJNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4iKTsKQEAgLTczLDYgKzc1LDExIEBACiAJc3RydWN0IGRteF9mcm9udGVuZCAgICAgICAgZmVfaHc7CiAJc3RydWN0IGRteF9mcm9udGVuZCAgICAgICAgZmVfbWVtOwogCXN0cnVjdCBkdmJfbmV0ICAgICAgICAgICAgIG5ldDsKKworCS8qIER1ZSB0byBEUlgtSyAtIHByb2JhYmx5IG5lZWQgY2hhbmdlcyAqLworCWludCAoKmdhdGVfY3RybCkoc3RydWN0IGR2Yl9mcm9udGVuZCAqLCBpbnQpOworCXN0cnVjdCBzZW1hcGhvcmUgICAgICBwbGxfbXV0ZXg7CisJYm9vbAkJCWRvbnRfYXR0YWNoX2ZlMTsKIH07CiAKIApAQCAtMTYwLDYgKzE2NywxMSBAQAogCQlyZXR1cm4gcmM7CiAKIAltYXhfZHZiX3BhY2tldF9zaXplID0gZW0yOHh4X2lzb2NfZHZiX21heF9wYWNrZXRzaXplKGRldik7CisJaWYgKG1heF9kdmJfcGFja2V0X3NpemUgPCAwKQorCQlyZXR1cm4gbWF4X2R2Yl9wYWNrZXRfc2l6ZTsKKwlkcHJpbnRrKDEsICJVc2luZyAlZCBidWZmZXJzIGVhY2ggd2l0aCAlZCBieXRlc1xuIiwKKwkJRU0yOFhYX0RWQl9OVU1fQlVGUywKKwkJbWF4X2R2Yl9wYWNrZXRfc2l6ZSk7CiAKIAlyZXR1cm4gZW0yOHh4X2luaXRfaXNvYyhkZXYsIEVNMjhYWF9EVkJfTUFYX1BBQ0tFVFMsCiAJCQkJRU0yOFhYX0RWQl9OVU1fQlVGUywgbWF4X2R2Yl9wYWNrZXRfc2l6ZSwKQEAgLTI5NSw2ICszMDcsNzkgQEAKIAkuZGlzYWJsZV9pMmNfZ2F0ZV9jdHJsID0gMSwKIH07CiAKK3N0cnVjdCBkcnhrX2NvbmZpZyB0ZXJyYXRlY19oNV9kcnhrID0geworCS5hZHIgPSAweDI5LAorCS5zaW5nbGVfbWFzdGVyID0gMSwKKwkubm9faTJjX2JyaWRnZSA9IDEsCisJLm1pY3JvY29kZV9uYW1lID0gImR2Yi11c2ItdGVycmF0ZWMtaDUtZHJ4ay5mdyIsCit9OworCitzdGF0aWMgaW50IGRyeGtfZ2F0ZV9jdHJsKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBlbTI4eHhfZHZiICpkdmIgPSBmZS0+c2VjX3ByaXY7CisJaW50IHN0YXR1czsKKworCWlmICghZHZiKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChlbmFibGUpIHsKKwkJZG93bigmZHZiLT5wbGxfbXV0ZXgpOworCQlzdGF0dXMgPSBkdmItPmdhdGVfY3RybChmZSwgMSk7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gZHZiLT5nYXRlX2N0cmwoZmUsIDApOworCQl1cCgmZHZiLT5wbGxfbXV0ZXgpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCB0ZXJyYXRlY19oNV9pbml0KHN0cnVjdCBlbTI4eHggKmRldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZW0yOHh4X3JlZ19zZXEgdGVycmF0ZWNfaDVfaW5pdFtdID0geworCQl7RU0yOFhYX1IwOF9HUElPLAkweGZmLAkweGZmLAkxMH0sCisJCXtFTTI4NzRfUjgwX0dQSU8sCTB4ZjYsCTB4ZmYsCTEwMH0sCisJCXtFTTI4NzRfUjgwX0dQSU8sCTB4ZjIsCTB4ZmYsCTUwfSwKKwkJe0VNMjg3NF9SODBfR1BJTywJMHhmNiwJMHhmZiwJMTAwfSwKKwkJeyAtMSwgICAgICAgICAgICAgICAgICAgLTEsICAgICAtMSwgICAgIC0xfSwKKwl9OworCXN0cnVjdCBlbTI4eHhfcmVnX3NlcSB0ZXJyYXRlY19oNV9lbmRbXSA9IHsKKwkJe0VNMjg3NF9SODBfR1BJTywJMHhlNiwJMHhmZiwJMTAwfSwKKwkJe0VNMjg3NF9SODBfR1BJTywJMHhhNiwJMHhmZiwJNTB9LAorCQl7RU0yODc0X1I4MF9HUElPLAkweGU2LAkweGZmLAkxMDB9LAorCQl7IC0xLCAgICAgICAgICAgICAgICAgICAtMSwgICAgIC0xLCAgICAgLTF9LAorCX07CisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciByWzRdOworCQlpbnQgbGVuOworCX0gcmVnc1tdID0geworCQl7eyAweDA2LCAweDAyLCAweDAwLCAweDMxIH0sIDR9LAorCQl7eyAweDAxLCAweDAyIH0sIDJ9LAorCQl7eyAweDAxLCAweDAyLCAweDAwLCAweGM2IH0sIDR9LAorCQl7eyAweDAxLCAweDAwIH0sIDJ9LAorCQl7eyAweDAxLCAweDAwLCAweGZmLCAweGFmIH0sIDR9LAorCQl7eyAweDAxLCAweDAwLCAweDAzLCAweGEwIH0sIDR9LAorCQl7eyAweDAxLCAweDAwIH0sIDJ9LAorCQl7eyAweDAxLCAweDAwLCAweDczLCAweGFmIH0sIDR9LAorCQl7eyAweDA0LCAweDAwIH0sIDJ9LAorCQl7eyAweDAwLCAweDA0IH0sIDJ9LAorCQl7eyAweDAwLCAweDA0LCAweDAwLCAweDBhIH0sIDR9LAorCQl7eyAweDA0LCAweDE0IH0sIDJ9LAorCQl7eyAweDA0LCAweDE0LCAweDAwLCAweDAwIH0sIDR9LAorCX07CisKKwllbTI4eHhfZ3Bpb19zZXQoZGV2LCB0ZXJyYXRlY19oNV9pbml0KTsKKwllbTI4eHhfd3JpdGVfcmVnKGRldiwgRU0yOFhYX1IwNl9JMkNfQ0xLLCAweDQwKTsKKwltc2xlZXAoMTApOworCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjA2X0kyQ19DTEssIDB4NDUpOworCW1zbGVlcCgxMCk7CisKKwlkZXYtPmkyY19jbGllbnQuYWRkciA9IDB4ODIgPj4gMTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlZ3MpOyBpKyspCisJCWkyY19tYXN0ZXJfc2VuZCgmZGV2LT5pMmNfY2xpZW50LCByZWdzW2ldLnIsIHJlZ3NbaV0ubGVuKTsKKwllbTI4eHhfZ3Bpb19zZXQoZGV2LCB0ZXJyYXRlY19oNV9lbmQpOworfTsKKwogc3RhdGljIGludCBtdDM1Ml90ZXJyYXRlY194c19pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCS8qIFZhbHVlcyBleHRyYWN0ZWQgZnJvbSBhIFVTQiB0cmFjZSBvZiB0aGUgVGVycmF0ZWMgV2luZG93cyBkcml2ZXIgKi8KQEAgLTUxNiw3ICs2MDEsNyBAQAogCWlmIChkdmItPmZlWzFdKQogCQlkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChkdmItPmZlWzFdKTsKIAlkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChkdmItPmZlWzBdKTsKLQlpZiAoZHZiLT5mZVsxXSkKKwlpZiAoZHZiLT5mZVsxXSAmJiAhZHZiLT5kb250X2F0dGFjaF9mZTEpCiAJCWR2Yl9mcm9udGVuZF9kZXRhY2goZHZiLT5mZVsxXSk7CiAJZHZiX2Zyb250ZW5kX2RldGFjaChkdmItPmZlWzBdKTsKIAlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZkdmItPmFkYXB0ZXIpOwpAQCAtNTQ2LDcgKzYzMSw3IEBACiAJZW0yOHh4X3NldF9tb2RlKGRldiwgRU0yOFhYX0RJR0lUQUxfTU9ERSk7CiAJLyogaW5pdCBmcm9udGVuZCAqLwogCXN3aXRjaCAoZGV2LT5tb2RlbCkgewotCWNhc2UgRU0yODc0X0xFQURFUlNISVBfSVNEQlQ6CisJY2FzZSBFTTI4NzRfQk9BUkRfTEVBREVSU0hJUF9JU0RCVDoKIAkJZHZiLT5mZVswXSA9IGR2Yl9hdHRhY2goczkyMV9hdHRhY2gsCiAJCQkJJnNoYXJwX2lzZGJ0LCAmZGV2LT5pMmNfYWRhcCk7CiAKQEAgLTY4OSw2ICs3NzQsNDEgQEAKIAkJCX0KIAkJfQogCQlicmVhazsKKwljYXNlIEVNMjg4NF9CT0FSRF9URVJSQVRFQ19INToKKwkJdGVycmF0ZWNfaDVfaW5pdChkZXYpOworCisJCWR2Yi0+ZG9udF9hdHRhY2hfZmUxID0gMTsKKworCQlkdmItPmZlWzBdID0gZHZiX2F0dGFjaChkcnhrX2F0dGFjaCwgJnRlcnJhdGVjX2g1X2RyeGssICZkZXYtPmkyY19hZGFwLCAmZHZiLT5mZVsxXSk7CisJCWlmICghZHZiLT5mZVswXSkgeworCQkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKworCQkvKiBGSVhNRTogZG8gd2UgbmVlZCBhIHBsbCBzZW1hcGhvcmU/ICovCisJCWR2Yi0+ZmVbMF0tPnNlY19wcml2ID0gZHZiOworCQlzZW1hX2luaXQoJmR2Yi0+cGxsX211dGV4LCAxKTsKKwkJZHZiLT5nYXRlX2N0cmwgPSBkdmItPmZlWzBdLT5vcHMuaTJjX2dhdGVfY3RybDsKKwkJZHZiLT5mZVswXS0+b3BzLmkyY19nYXRlX2N0cmwgPSBkcnhrX2dhdGVfY3RybDsKKwkJZHZiLT5mZVsxXS0+aWQgPSAxOworCisJCS8qIEF0dGFjaCB0ZGExODI3MSB0byBEVkItQyBmcm9udGVuZCAqLworCQlpZiAoZHZiLT5mZVswXS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCQlkdmItPmZlWzBdLT5vcHMuaTJjX2dhdGVfY3RybChkdmItPmZlWzBdLCAxKTsKKwkJaWYgKCFkdmJfYXR0YWNoKHRkYTE4MjcxYzJkZF9hdHRhY2gsIGR2Yi0+ZmVbMF0sICZkZXYtPmkyY19hZGFwLCAweDYwKSkgeworCQkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwkJaWYgKGR2Yi0+ZmVbMF0tPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQkJZHZiLT5mZVswXS0+b3BzLmkyY19nYXRlX2N0cmwoZHZiLT5mZVswXSwgMCk7CisKKwkJLyogSGFjayAtIG5lZWRlZCBieSBkcnhrL3RkYTE4MjcxYzJkZCAqLworCQlkdmItPmZlWzFdLT50dW5lcl9wcml2ID0gZHZiLT5mZVswXS0+dHVuZXJfcHJpdjsKKwkJbWVtY3B5KCZkdmItPmZlWzFdLT5vcHMudHVuZXJfb3BzLAorCQkgICAgICAgJmR2Yi0+ZmVbMF0tPm9wcy50dW5lcl9vcHMsCisJCSAgICAgICBzaXplb2YoZHZiLT5mZVswXS0+b3BzLnR1bmVyX29wcykpOworCisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWVtMjh4eF9lcnJkZXYoIi8yOiBUaGUgZnJvbnRlbmQgb2YgeW91ciBEVkIvQVRTQyBjYXJkIgogCQkJCSIgaXNuJ3Qgc3VwcG9ydGVkIHlldFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaTJjLmMKaW5kZXggNDczOWZjNy4uMzZmNWE5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pMmMuYwpAQCAtMTgxLDE2ICsxODEsMjUgQEAKIAogLyoKICAqIGVtMjh4eF9pMmNfc2VuZF9ieXRlcygpCi0gKiB1bnRlc3RlZCBmb3IgbW9yZSB0aGFuIDQgYnl0ZXMKICAqLwogc3RhdGljIGludCBlbTI4eHhfaTJjX3NlbmRfYnl0ZXModm9pZCAqZGF0YSwgdW5zaWduZWQgY2hhciBhZGRyLCBjaGFyICpidWYsCiAJCQkJIHNob3J0IGxlbiwgaW50IHN0b3ApCiB7CiAJaW50IHdyY291bnQgPSAwOwogCXN0cnVjdCBlbTI4eHggKmRldiA9IChzdHJ1Y3QgZW0yOHh4ICopZGF0YTsKKwlpbnQgd3JpdGVfdGltZW91dCwgcmV0OwogCiAJd3Jjb3VudCA9IGRldi0+ZW0yOHh4X3dyaXRlX3JlZ3NfcmVxKGRldiwgc3RvcCA/IDIgOiAzLCBhZGRyLCBidWYsIGxlbik7CiAKKwkvKiBTZWVtcyB0byBiZSByZXF1aXJlZCBhZnRlciBhIHdyaXRlICovCisJZm9yICh3cml0ZV90aW1lb3V0ID0gRU0yODAwX0kyQ19XUklURV9USU1FT1VUOyB3cml0ZV90aW1lb3V0ID4gMDsKKwkgICAgIHdyaXRlX3RpbWVvdXQgLT0gNSkgeworCQlyZXQgPSBkZXYtPmVtMjh4eF9yZWFkX3JlZyhkZXYsIDB4MDUpOworCQlpZiAoIXJldCkKKwkJCWJyZWFrOworCQltc2xlZXAoNSk7CisJfQorCiAJcmV0dXJuIHdyY291bnQ7CiB9CiAKQEAgLTIxOCw5ICsyMjcsNyBAQAogICovCiBzdGF0aWMgaW50IGVtMjh4eF9pMmNfY2hlY2tfZm9yX2RldmljZShzdHJ1Y3QgZW0yOHh4ICpkZXYsIHVuc2lnbmVkIGNoYXIgYWRkcikKIHsKLQljaGFyIG1zZzsKIAlpbnQgcmV0OwotCW1zZyA9IGFkZHI7CiAKIAlyZXQgPSBkZXYtPmVtMjh4eF9yZWFkX3JlZ19yZXEoZGV2LCAyLCBhZGRyKTsKIAlpZiAocmV0IDwgMCkgewpAQCAtMzMyLDcgKzMzOSw5IEBACiAJc3RydWN0IGVtMjh4eF9lZXByb20gKmVtX2VlcHJvbSA9ICh2b2lkICopZWVkYXRhOwogCWludCBpLCBlcnIsIHNpemUgPSBsZW4sIGJsb2NrOwogCi0JaWYgKGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjg3NCB8fCBkZXYtPmNoaXBfaWQgPT0gQ0hJUF9JRF9FTTI4MTc0KSB7CisJaWYgKGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjg3NCB8fAorCSAgICBkZXYtPmNoaXBfaWQgPT0gQ0hJUF9JRF9FTTI4MTc0IHx8CisJICAgIGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjg4NCkgewogCQkvKiBFbXBpYSBzd2l0Y2hlZCB0byBhIDE2LWJpdCBhZGRyZXNzYWJsZSBlZXByb20gaW4gbmV3ZXIKIAkJICAgZGV2aWNlcy4gIFdoaWxlIHdlIGNvdWxkIGNlcnRhaW5seSB3cml0ZSBhIHJvdXRpbmUgdG8gcmVhZAogCQkgICB0aGUgZWVwcm9tLCB0aGVyZSBpcyBub3RoaW5nIG9mIHVzZSBpbiB0aGVyZSB0aGF0IGNhbm5vdCBiZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaW5wdXQuYwppbmRleCBiYTFiYTg2Li41ZDEyYjE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaW5wdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaW5wdXQuYwpAQCAtMzcyLDYgKzM3Miw3IEBACiAJCWlyLT5nZXRfa2V5ID0gZGVmYXVsdF9wb2xsaW5nX2dldGtleTsKIAkJYnJlYWs7CiAJY2FzZSBDSElQX0lEX0VNMjg3NDoKKwljYXNlIENISVBfSURfRU0yODE3NDoKIAkJaXItPmdldF9rZXkgPSBlbTI4NzRfcG9sbGluZ19nZXRrZXk7CiAJCWVtMjh4eF93cml0ZV9yZWdzKGRldiwgRU0yODc0X1I1MF9JUl9DT05GSUcsICZpcl9jb25maWcsIDEpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1yZWcuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1yZWcuaAppbmRleCBlOTJhMjhlLi42NmY3OTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtcmVnLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LXJlZy5oCkBAIC0yMDEsNiArMjAxLDcgQEAKIAlDSElQX0lEX0VNMjg3MCA9IDM1LAogCUNISVBfSURfRU0yODgzID0gMzYsCiAJQ0hJUF9JRF9FTTI4NzQgPSA2NSwKKwlDSElQX0lEX0VNMjg4NCA9IDY4LAogCUNISVBfSURfRU0yODE3NCA9IDExMywKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LXZpZGVvLmMKaW5kZXggN2I2NDYxZC4uZDE3NmRjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LXZpZGVvLmMKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTUwLDcgKzQ5LDggQEAKIAkJICAgICAgIlNhc2NoYSBTb21tZXIgPHNhc2NoYXNvbW1lckBmcmVlbmV0LmRlPiIKIAogI2RlZmluZSBEUklWRVJfREVTQyAgICAgICAgICJFbXBpYSBlbTI4eHggYmFzZWQgVVNCIHZpZGVvIGRldmljZSBkcml2ZXIiCi0jZGVmaW5lIEVNMjhYWF9WRVJTSU9OX0NPREUgIEtFUk5FTF9WRVJTSU9OKDAsIDEsIDIpCisKKyNkZWZpbmUgRU0yOFhYX1ZFUlNJT04gIjAuMS4zIgogCiAjZGVmaW5lIGVtMjh4eF92aWRlb2RiZyhmbXQsIGFyZy4uLikgZG8ge1wKIAlpZiAodmlkZW9fZGVidWcpIFwKQEAgLTcyLDYgKzcyLDcgQEAKIE1PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CiBNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRU0yOFhYX1ZFUlNJT04pOwogCiBzdGF0aWMgdW5zaWduZWQgaW50IHZpZGVvX25yW10gPSB7WzAgLi4uIChFTTI4WFhfTUFYQk9BUkRTIC0gMSldID0gVU5TRVQgfTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdmJpX25yW10gICA9IHtbMCAuLi4gKEVNMjhYWF9NQVhCT0FSRFMgLSAxKV0gPSBVTlNFVCB9OwpAQCAtMTc1Nyw4ICsxNzU4LDYgQEAKIAlzdHJsY3B5KGNhcC0+Y2FyZCwgZW0yOHh4X2JvYXJkc1tkZXYtPm1vZGVsXS5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSk7CiAJdXNiX21ha2VfcGF0aChkZXYtPnVkZXYsIGNhcC0+YnVzX2luZm8sIHNpemVvZihjYXAtPmJ1c19pbmZvKSk7CiAKLQljYXAtPnZlcnNpb24gPSBFTTI4WFhfVkVSU0lPTl9DT0RFOwotCiAJY2FwLT5jYXBhYmlsaXRpZXMgPQogCQkJVjRMMl9DQVBfU0xJQ0VEX1ZCSV9DQVBUVVJFIHwKIAkJCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfApAQCAtMTk3Niw3ICsxOTc1LDYgQEAKIAlzdHJsY3B5KGNhcC0+Y2FyZCwgZW0yOHh4X2JvYXJkc1tkZXYtPm1vZGVsXS5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSk7CiAJdXNiX21ha2VfcGF0aChkZXYtPnVkZXYsIGNhcC0+YnVzX2luZm8sIHNpemVvZihjYXAtPmJ1c19pbmZvKSk7CiAKLQljYXAtPnZlcnNpb24gPSBFTTI4WFhfVkVSU0lPTl9DT0RFOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVI7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNDUwLDEwICsyNDQ4LDggQEAKICAgICAgIHU4IHZhbDsKIAlpbnQgcmV0OwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHY0bDIgZHJpdmVyIHZlcnNpb24gJWQuJWQuJWRcbiIsCi0JCWRldi0+bmFtZSwKLQkJKEVNMjhYWF9WRVJTSU9OX0NPREUgPj4gMTYpICYgMHhmZiwKLQkJKEVNMjhYWF9WRVJTSU9OX0NPREUgPj4gOCkgJiAweGZmLCBFTTI4WFhfVkVSU0lPTl9DT0RFICYgMHhmZik7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHY0bDIgZHJpdmVyIHZlcnNpb24gJXNcbiIsCisJCWRldi0+bmFtZSwgRU0yOFhYX1ZFUlNJT04pOwogCiAJLyogc2V0IGRlZmF1bHQgbm9ybSAqLwogCWRldi0+bm9ybSA9IGVtMjh4eF92aWRlb190ZW1wbGF0ZS5jdXJyZW50X25vcm07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHguaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC5oCmluZGV4IDNjY2EzMzEuLmQ4MDY1OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC5oCkBAIC0xMTcsOSArMTE3LDkgQEAKICNkZWZpbmUgRU0yODAwX0JPQVJEX1ZDMjExQQkJCSAgNzQKICNkZWZpbmUgRU0yODgyX0JPQVJEX0RJS09NX0RLMzAwCQkgIDc1CiAjZGVmaW5lIEVNMjg3MF9CT0FSRF9LV09STERfQTM0MAkJICA3NgotI2RlZmluZSBFTTI4NzRfTEVBREVSU0hJUF9JU0RCVAkJCSAgNzcKKyNkZWZpbmUgRU0yODc0X0JPQVJEX0xFQURFUlNISVBfSVNEQlQJCSAgNzcKICNkZWZpbmUgRU0yODE3NF9CT0FSRF9QQ1RWXzI5MEUgICAgICAgICAgICAgICAgICAgNzgKLQorI2RlZmluZSBFTTI4ODRfQk9BUkRfVEVSUkFURUNfSDUJCSAgNzkKIAogLyogTGltaXRzIG1pbmltdW0gYW5kIGRlZmF1bHQgbnVtYmVyIG9mIGJ1ZmZlcnMgKi8KICNkZWZpbmUgRU0yOFhYX01JTl9CVUYgNApAQCAtNDg3LDYgKzQ4Nyw4IEBACiAJaW50IGRldm5vOwkJLyogbWFya3MgdGhlIG51bWJlciBvZiB0aGlzIGRldmljZSAqLwogCWVudW0gZW0yOHh4X2NoaXBfaWQgY2hpcF9pZDsKIAorCWludCBhdWRpb19pZm51bTsKKwogCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKIAlzdHJ1Y3QgZW0yOHh4X2JvYXJkIGJvYXJkOwogCkBAIC01MDMsNiArNTA1LDcgQEAKIAogCXVuc2lnbmVkIGludCBoYXNfYXVkaW9fY2xhc3M6MTsKIAl1bnNpZ25lZCBpbnQgaGFzX2Fsc2FfYXVkaW86MTsKKwl1bnNpZ25lZCBpbnQgaXNfYXVkaW9fb25seToxOwogCiAJLyogQ29udHJvbHMgYXVkaW8gc3RyZWFtaW5nICovCiAJc3RydWN0IHdvcmtfc3RydWN0IHdxX3RyaWdnZXI7ICAgICAgICAgICAgICAvKiBUcmlnZ2VyIHRvIHN0YXJ0L3N0b3AgYXVkaW8gZm9yIGFsc2EgbW9kdWxlICovCkBAIC02OTcsNiArNzAwLDkgQEAKIHZvaWQgZW0yOHh4X3JlbGVhc2VfcmVzb3VyY2VzKHN0cnVjdCBlbTI4eHggKmRldik7CiAKIC8qIFByb3ZpZGVkIGJ5IGVtMjh4eC1pbnB1dC5jICovCisKKyNpZmRlZiBDT05GSUdfVklERU9fRU0yOFhYX1JDCisKIGludCBlbTI4eHhfZ2V0X2tleV90ZXJyYXRlYyhzdHJ1Y3QgSVJfaTJjICppciwgdTMyICppcl9rZXksIHUzMiAqaXJfcmF3KTsKIGludCBlbTI4eHhfZ2V0X2tleV9lbV9oYXVwKHN0cnVjdCBJUl9pMmMgKmlyLCB1MzIgKmlyX2tleSwgdTMyICppcl9yYXcpOwogaW50IGVtMjh4eF9nZXRfa2V5X3Bpbm5hY2xlX3VzYl9ncmV5KHN0cnVjdCBJUl9pMmMgKmlyLCB1MzIgKmlyX2tleSwKQEAgLTcwOSw2ICs3MTUsMjAgQEAKIGludCBlbTI4eHhfaXJfaW5pdChzdHJ1Y3QgZW0yOHh4ICpkZXYpOwogaW50IGVtMjh4eF9pcl9maW5pKHN0cnVjdCBlbTI4eHggKmRldik7CiAKKyNlbHNlCisKKyNkZWZpbmUgZW0yOHh4X2dldF9rZXlfdGVycmF0ZWMJCQlOVUxMCisjZGVmaW5lIGVtMjh4eF9nZXRfa2V5X2VtX2hhdXAJCQlOVUxMCisjZGVmaW5lIGVtMjh4eF9nZXRfa2V5X3Bpbm5hY2xlX3VzYl9ncmV5CU5VTEwKKyNkZWZpbmUgZW0yOHh4X2dldF9rZXlfd2luZmFzdF91c2JpaV9kZWx1eGUJTlVMTAorCitzdGF0aWMgaW5saW5lIHZvaWQgZW0yOHh4X3JlZ2lzdGVyX3NuYXBzaG90X2J1dHRvbihzdHJ1Y3QgZW0yOHh4ICpkZXYpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgZW0yOHh4X2RlcmVnaXN0ZXJfc25hcHNob3RfYnV0dG9uKHN0cnVjdCBlbTI4eHggKmRldikge30KK3N0YXRpYyBpbmxpbmUgaW50IGVtMjh4eF9pcl9pbml0KHN0cnVjdCBlbTI4eHggKmRldikgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgZW0yOHh4X2lyX2Zpbmkoc3RydWN0IGVtMjh4eCAqZGV2KSB7IHJldHVybiAwOyB9CisKKyNlbmRpZgorCiAvKiBQcm92aWRlZCBieSBlbTI4eHgtdmJpLmMgKi8KIGV4dGVybiBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzIGVtMjh4eF92YmlfcW9wczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MS5oCmluZGV4IGJmNjYxODkuLjE0YmI5MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTEuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxLmgKQEAgLTIxLDcgKzIxLDYgQEAKICNpZm5kZWYgX0VUNjFYMjUxX0hfCiAjZGVmaW5lIF9FVDYxWDI1MV9IXwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfY29yZS5jCmluZGV4IGE5ODI3NTAuLjlhMWU4MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfY29yZS5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTQ4LDggKzQ5LDcgQEAKICNkZWZpbmUgRVQ2MVgyNTFfTU9EVUxFX0FVVEhPUiAgIihDKSAyMDA2LTIwMDcgTHVjYSBSaXNvbGlhIgogI2RlZmluZSBFVDYxWDI1MV9BVVRIT1JfRU1BSUwgICAiPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+IgogI2RlZmluZSBFVDYxWDI1MV9NT0RVTEVfTElDRU5TRSAiR1BMIgotI2RlZmluZSBFVDYxWDI1MV9NT0RVTEVfVkVSU0lPTiAiMToxLjA5IgotI2RlZmluZSBFVDYxWDI1MV9NT0RVTEVfVkVSU0lPTl9DT0RFICBLRVJORUxfVkVSU0lPTigxLCAxLCA5KQorI2RlZmluZSBFVDYxWDI1MV9NT0RVTEVfVkVSU0lPTiAiMS4xLjEwIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTE1NzksNyArMTU3OSw3IEBACiB7CiAJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSBjYXAgPSB7CiAJCS5kcml2ZXIgPSAiZXQ2MXgyNTEiLAotCQkudmVyc2lvbiA9IEVUNjFYMjUxX01PRFVMRV9WRVJTSU9OX0NPREUsCisJCS52ZXJzaW9uID0gTElOVVhfVkVSU0lPTl9DT0RFLAogCQkuY2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1JFQURXUklURSB8CiAJCQkJVjRMMl9DQVBfU1RSRUFNSU5HLAogCX07CkBAIC0yNDgwLDE2ICsyNDgwLDggQEAKIAljYXNlIFZJRElPQ19TX1BBUk06CiAJCXJldHVybiBldDYxeDI1MV92aWRpb2Nfc19wYXJtKGNhbSwgYXJnKTsKIAotCWNhc2UgVklESU9DX0dfU1REOgotCWNhc2UgVklESU9DX1NfU1REOgotCWNhc2UgVklESU9DX1FVRVJZU1REOgotCWNhc2UgVklESU9DX0VOVU1TVEQ6Ci0JY2FzZSBWSURJT0NfUVVFUllNRU5VOgotCWNhc2UgVklESU9DX0VOVU1fRlJBTUVJTlRFUlZBTFM6Ci0JCXJldHVybiAtRUlOVkFMOwotCiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAtRU5PVFRZOwogCiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9mc2wtdml1LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2ZzbC12aXUuYwppbmRleCA5MDhkNzAxLi4yN2NiMTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2ZzbC12aXUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2ZzbC12aXUuYwpAQCAtMjMsMTkgKzIzLDEzIEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KICNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi1kbWEtY29udGlnLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJCSJmc2xfdml1IgotI2RlZmluZSBWSVVfTUFKT1JfVkVSU0lPTgkwCi0jZGVmaW5lIFZJVV9NSU5PUl9WRVJTSU9OCTUKLSNkZWZpbmUgVklVX1JFTEVBU0UJCTAKLSNkZWZpbmUgVklVX1ZFUlNJT04JCUtFUk5FTF9WRVJTSU9OKFZJVV9NQUpPUl9WRVJTSU9OLCBcCi0JCQkJCSAgICAgICBWSVVfTUlOT1JfVkVSU0lPTiwgXAotCQkJCQkgICAgICAgVklVX1JFTEVBU0UpCisjZGVmaW5lIFZJVV9WRVJTSU9OCQkiMC41LjEiCiAKICNkZWZpbmUgQlVGRkVSX1RJTUVPVVQJCW1zZWNzX3RvX2ppZmZpZXMoNTAwKSAgLyogMC41IHNlY29uZHMgKi8KIApAQCAtNjEwLDcgKzYwNCw2IEBACiB7CiAJc3RyY3B5KGNhcC0+ZHJpdmVyLCAidml1Iik7CiAJc3RyY3B5KGNhcC0+Y2FyZCwgInZpdSIpOwotCWNhcC0+dmVyc2lvbiA9IFZJVV9WRVJTSU9OOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0JVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CiAJCQkJVjRMMl9DQVBfU1RSRUFNSU5HICAgICB8CiAJCQkJVjRMMl9DQVBfVklERU9fT1ZFUkxBWSB8CkBAIC0xNjg0LDMgKzE2NzcsNCBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJGcmVlc2NhbGUgVmlkZW8tSW4oVklVKSIpOwogTU9EVUxFX0FVVEhPUigiSG9uZ2p1biBDaGVuIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihWSVVfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL0tjb25maWcKaW5kZXggMzRhZTJjMi4uNDNkOWEyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvS2NvbmZpZwpAQCAtMTc5LDYgKzE3OSwxNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ3NwY2FfcGFjNzMxMS4KIAorY29uZmlnIFVTQl9HU1BDQV9TRTQwMQorCXRyaXN0YXRlICJTRTQwMSBVU0IgQ2FtZXJhIERyaXZlciIKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgVVNCX0dTUENBCisJaGVscAorCSBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gdGhlCisJIEVuZHBvaW50cyAoZm9ybWVybHkga25vd24gYXMgQU9YKSBzZTQwMSBjaGlwLgorCisJIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ3NwY2Ffc2U0MDEuCisKIGNvbmZpZyBVU0JfR1NQQ0FfU045QzIwMjgKIAl0cmlzdGF0ZSAiU09OSVggRHVhbC1Nb2RlIFVTQiBDYW1lcmEgRHJpdmVyIgogCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBVU0JfR1NQQ0EKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL01ha2VmaWxlCmluZGV4IDgwMmZiZTEuLmQ2MzY0YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9NYWtlZmlsZQpAQCAtMTYsNiArMTYsNyBAQAogb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9QQUMyMDcpICAgKz0gZ3NwY2FfcGFjMjA3Lm8KIG9iai0kKENPTkZJR19VU0JfR1NQQ0FfUEFDNzMwMikgICs9IGdzcGNhX3BhYzczMDIubwogb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9QQUM3MzExKSAgKz0gZ3NwY2FfcGFjNzMxMS5vCitvYmotJChDT05GSUdfVVNCX0dTUENBX1NFNDAxKSAgICArPSBnc3BjYV9zZTQwMS5vCiBvYmotJChDT05GSUdfVVNCX0dTUENBX1NOOUMyMDI4KSArPSBnc3BjYV9zbjljMjAyOC5vCiBvYmotJChDT05GSUdfVVNCX0dTUENBX1NOOUMyMFgpICArPSBnc3BjYV9zbjljMjB4Lm8KIG9iai0kKENPTkZJR19VU0JfR1NQQ0FfU09OSVhCKSAgICs9IGdzcGNhX3Nvbml4Yi5vCkBAIC01OCw2ICs1OSw3IEBACiBnc3BjYV9wYWMyMDctb2JqcyAgIDo9IHBhYzIwNy5vCiBnc3BjYV9wYWM3MzAyLW9ianMgIDo9IHBhYzczMDIubwogZ3NwY2FfcGFjNzMxMS1vYmpzICA6PSBwYWM3MzExLm8KK2dzcGNhX3NlNDAxLW9ianMgICAgOj0gc2U0MDEubwogZ3NwY2Ffc245YzIwMjgtb2JqcyA6PSBzbjljMjAyOC5vCiBnc3BjYV9zbjljMjB4LW9ianMgIDo9IHNuOWMyMHgubwogZ3NwY2Ffc29uaXhiLW9ianMgICA6PSBzb25peGIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9nbDg2MC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9nbDg2MC5oCmluZGV4IDQ5YWQ0YWMuLjAzMzBhMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvZ2w4NjAuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLmgKQEAgLTE4LDcgKzE4LDYgQEAKICAqLwogI2lmbmRlZiBHTDg2MF9ERVZfSAogI2RlZmluZSBHTDg2MF9ERVZfSAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KIAogI2luY2x1ZGUgImdzcGNhLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuYwppbmRleCAwOGNlOTk0Li41ZGE0ODc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5jCkBAIC0yNCw3ICsyNCw2IEBACiAjZGVmaW5lIE1PRFVMRV9OQU1FICJnc3BjYSIKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTUxLDExICs1MCwxMiBAQAogI2Vycm9yICJERUZfTlVSQlMgdG9vIGJpZyIKICNlbmRpZgogCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OX05VTUJFUgkiMi4xMy4wIgorCiBNT0RVTEVfQVVUSE9SKCJKZWFuLUZyYW7Dp29pcyBNb2luZSA8aHR0cDovL21vaW5lamYuZnJlZS5mcj4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiR1NQQ0EgVVNCIENhbWVyYSBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotI2RlZmluZSBEUklWRVJfVkVSU0lPTl9OVU1CRVIJS0VSTkVMX1ZFUlNJT04oMiwgMTMsIDApCitNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTl9OVU1CRVIpOwogCiAjaWZkZWYgR1NQQ0FfREVCVUcKIGludCBnc3BjYV9kZWJ1ZyA9IERfRVJSIHwgRF9QUk9CRTsKQEAgLTQ0Myw4ICs0NDMsMTEgQEAKIAl9IGVsc2UgewogCQlzd2l0Y2ggKGdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSkgewogCQljYXNlIERJU0NBUkRfUEFDS0VUOgotCQkJaWYgKHBhY2tldF90eXBlID09IExBU1RfUEFDS0VUKQorCQkJaWYgKHBhY2tldF90eXBlID09IExBU1RfUEFDS0VUKSB7CiAJCQkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gcGFja2V0X3R5cGU7CisJCQkJZ3NwY2FfZGV2LT5pbWFnZSA9IE5VTEw7CisJCQkJZ3NwY2FfZGV2LT5pbWFnZV9sZW4gPSAwOworCQkJfQogCQkJcmV0dXJuOwogCQljYXNlIExBU1RfUEFDS0VUOgogCQkJcmV0dXJuOwpAQCAtMTI3OCwxMCArMTI4MSwxMCBAQAogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIG91dDsKIAl9Ci0Jc3RybmNweSgoY2hhciAqKSBjYXAtPmRyaXZlciwgZ3NwY2FfZGV2LT5zZF9kZXNjLT5uYW1lLAorCXN0cmxjcHkoKGNoYXIgKikgY2FwLT5kcml2ZXIsIGdzcGNhX2Rldi0+c2RfZGVzYy0+bmFtZSwKIAkJCXNpemVvZiBjYXAtPmRyaXZlcik7CiAJaWYgKGdzcGNhX2Rldi0+ZGV2LT5wcm9kdWN0ICE9IE5VTEwpIHsKLQkJc3RybmNweSgoY2hhciAqKSBjYXAtPmNhcmQsIGdzcGNhX2Rldi0+ZGV2LT5wcm9kdWN0LAorCQlzdHJsY3B5KChjaGFyICopIGNhcC0+Y2FyZCwgZ3NwY2FfZGV2LT5kZXYtPnByb2R1Y3QsCiAJCQlzaXplb2YgY2FwLT5jYXJkKTsKIAl9IGVsc2UgewogCQlzbnByaW50ZigoY2hhciAqKSBjYXAtPmNhcmQsIHNpemVvZiBjYXAtPmNhcmQsCkBAIC0xMjkxLDcgKzEyOTQsNiBAQAogCX0KIAl1c2JfbWFrZV9wYXRoKGdzcGNhX2Rldi0+ZGV2LCAoY2hhciAqKSBjYXAtPmJ1c19pbmZvLAogCQkJc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKLQljYXAtPnZlcnNpb24gPSBEUklWRVJfVkVSU0lPTl9OVU1CRVI7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFCiAJCQkgIHwgVjRMMl9DQVBfU1RSRUFNSU5HCiAJCQkgIHwgVjRMMl9DQVBfUkVBRFdSSVRFOwpAQCAtMTQ2MCw3ICsxNDYyLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaW5wdXQtPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOwogCWlucHV0LT5zdGF0dXMgPSBnc3BjYV9kZXYtPmNhbS5pbnB1dF9mbGFnczsKLQlzdHJuY3B5KGlucHV0LT5uYW1lLCBnc3BjYV9kZXYtPnNkX2Rlc2MtPm5hbWUsCisJc3RybGNweShpbnB1dC0+bmFtZSwgZ3NwY2FfZGV2LT5zZF9kZXNjLT5uYW1lLAogCQlzaXplb2YgaW5wdXQtPm5hbWUpOwogCXJldHVybiAwOwogfQpAQCAtMjQ3OCwxMCArMjQ4MCw3IEBACiAvKiAtLSBtb2R1bGUgaW5zZXJ0IC8gcmVtb3ZlIC0tICovCiBzdGF0aWMgaW50IF9faW5pdCBnc3BjYV9pbml0KHZvaWQpCiB7Ci0JaW5mbygidiVkLiVkLiVkIHJlZ2lzdGVyZWQiLAotCQkoRFJJVkVSX1ZFUlNJT05fTlVNQkVSID4+IDE2KSAmIDB4ZmYsCi0JCShEUklWRVJfVkVSU0lPTl9OVU1CRVIgPj4gOCkgJiAweGZmLAotCQlEUklWRVJfVkVSU0lPTl9OVU1CRVIgJiAweGZmKTsKKwlpbmZvKCJ2IiBEUklWRVJfVkVSU0lPTl9OVU1CRVIgIiByZWdpc3RlcmVkIik7CiAJcmV0dXJuIDA7CiB9CiBzdGF0aWMgdm9pZCBfX2V4aXQgZ3NwY2FfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUxOS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUxOS5jCmluZGV4IDA1N2UyODcuLjA4MDA0MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MTkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTE5LmMKQEAgLTEzNCw2ICsxMzQsNyBAQAogCVNFTl9PVjc2NzAsCiAJU0VOX09WNzZCRSwKIAlTRU5fT1Y4NjEwLAorCVNFTl9PVjk2MDAsCiB9OwogCiAvKiBOb3RlIHRoaXMgaXMgYSBiaXQgb2YgYSBoYWNrLCBidXQgdGhlIHc5OTY4Y2YgZHJpdmVyIG5lZWRzIHRoZSBjb2RlIGZvciBhbGwKQEAgLTM0MCw2ICszNDEsMTAgQEAKIAkJCSgxIDw8IEVYUE9TVVJFKSB8CiAJCQkoMSA8PCBBVVRPR0FJTikgfAogCQkJKDEgPDwgRlJFUSksCitbU0VOX09WOTYwMF0gPQkJKCgxIDw8IE5DVFJMKSAtIDEpCS8qIG5vIGNvbnRyb2wgKi8KKwkJCV4gKCgxIDw8IEVYUE9TVVJFKQkvKiBidXQgZXhwb3N1cmUgKi8KKwkJCSB8ICgxIDw8IEFVVE9HQUlOKSksCS8qIGFuZCBhdXRvZ2FpbiAqLworCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBvdjUxOV92Z2FfbW9kZVtdID0gewpAQCAtNTI1LDYgKzUzMCwxNyBAQAogCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAogCQkucHJpdiA9IDB9LAogfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IG92ZngyX292OTYwMF9tb2RlW10gPSB7CisJezY0MCwgNDgwLCBWNEwyX1BJWF9GTVRfU0JHR1I4LCBWNEwyX0ZJRUxEX05PTkUsCisJCS5ieXRlc3BlcmxpbmUgPSA2NDAsCisJCS5zaXplaW1hZ2UgPSA2NDAgKiA0ODAsCisJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0IsCisJCS5wcml2ID0gMX0sCisJezEyODAsIDEwMjQsIFY0TDJfUElYX0ZNVF9TQkdHUjgsIFY0TDJfRklFTERfTk9ORSwKKwkJLmJ5dGVzcGVybGluZSA9IDEyODAsCisJCS5zaXplaW1hZ2UgPSAxMjgwICogMTAyNCwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQn0sCit9OwogCiAvKiBSZWdpc3RlcnMgY29tbW9uIHRvIE9WNTExIC8gT1Y1MTggKi8KICNkZWZpbmUgUjUxeF9GSUZPX1BTSVpFCQkJMHgzMAkvKiAyIGJ5dGVzIHdpZGUgdy8gT1Y1MTgoKykgKi8KQEAgLTE4MDcsNiArMTgyMywyMiBAQAogCQkJfCBPVjc2NzBfQ09NOF9BRUN9LAogCXsweGExLCAweGM4fQogfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3ZfaTJjX3JlZ3ZhbHMgbm9ybV85NjAwW10gPSB7CisJezB4MTIsIDB4ODB9LAorCXsweDBjLCAweDI4fSwKKwl7MHgxMSwgMHg4MH0sCisJezB4MTMsIDB4YjV9LAorCXsweDE0LCAweDNlfSwKKwl7MHgxYiwgMHgwNH0sCisJezB4MjQsIDB4YjB9LAorCXsweDI1LCAweDkwfSwKKwl7MHgyNiwgMHg5NH0sCisJezB4MzUsIDB4OTB9LAorCXsweDM3LCAweDA3fSwKKwl7MHgzOCwgMHgwOH0sCisJezB4MDEsIDB4OGV9LAorCXsweDAyLCAweDg1fQorfTsKIAogLyogNzY3MC4gRGVmYXVsdHMgdGFrZW4gZnJvbSBPbW5pVmlzaW9uIHByb3ZpZGVkIGRhdGEsCiAqICBhcyBwcm92aWRlZCBieSBKb25hdGhhbiBDb3JiZXQgb2YgT0xQQwkJKi8KQEAgLTI0MDAsOSArMjQzMiwxMiBAQAogCiAJLyogSW5pdGlhdGUgMi1ieXRlIHdyaXRlIGN5Y2xlICovCiAJcmVnX3coc2QsIFI1MThfSTJDX0NUTCwgMHgwMyk7CisJcmVnX3I4KHNkLCBSNTE4X0kyQ19DVEwpOwogCiAJLyogSW5pdGlhdGUgMi1ieXRlIHJlYWQgY3ljbGUgKi8KIAlyZWdfdyhzZCwgUjUxOF9JMkNfQ1RMLCAweDA1KTsKKwlyZWdfcjgoc2QsIFI1MThfSTJDX0NUTCk7CisKIAl2YWx1ZSA9IHJlZ19yKHNkLCBSNTF4X0kyQ19EQVRBKTsKIAlQREVCVUcoRF9VU0JJLCAib3Y1MThfaTJjX3IgJTAyeCAlMDJ4IiwgcmVnLCB2YWx1ZSk7CiAJcmV0dXJuIHZhbHVlOwpAQCAtMjY4Niw3ICsyNzIxLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBUaGlzIGluaXRpYWxpemVzIHRoZSBPVjJ4MTAgLyBPVjM2MTAgLyBPVjM2MjAgKi8KKy8qIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIE9WMngxMCAvIE9WMzYxMCAvIE9WMzYyMCAvIE9WOTYwMCAqLwogc3RhdGljIHZvaWQgb3ZfaGlyZXNfY29uZmlndXJlKHN0cnVjdCBzZCAqc2QpCiB7CiAJaW50IGhpZ2gsIGxvdzsKQEAgLTI3MDIsMTkgKzI3MzcsMzIgQEAKIAloaWdoID0gaTJjX3Ioc2QsIDB4MGEpOwogCWxvdyA9IGkyY19yKHNkLCAweDBiKTsKIAkvKiBpbmZvKCIleCwgJXgiLCBoaWdoLCBsb3cpOyAqLwotCWlmIChoaWdoID09IDB4OTYgJiYgbG93ID09IDB4NDApIHsKLQkJUERFQlVHKERfUFJPQkUsICJTZW5zb3IgaXMgYW4gT1YyNjEwIik7Ci0JCXNkLT5zZW5zb3IgPSBTRU5fT1YyNjEwOwotCX0gZWxzZSBpZiAoaGlnaCA9PSAweDk2ICYmIGxvdyA9PSAweDQxKSB7Ci0JCVBERUJVRyhEX1BST0JFLCAiU2Vuc29yIGlzIGFuIE9WMjYxMEFFIik7Ci0JCXNkLT5zZW5zb3IgPSBTRU5fT1YyNjEwQUU7Ci0JfSBlbHNlIGlmIChoaWdoID09IDB4MzYgJiYgKGxvdyAmIDB4MGYpID09IDB4MDApIHsKLQkJUERFQlVHKERfUFJPQkUsICJTZW5zb3IgaXMgYW4gT1YzNjEwIik7Ci0JCXNkLT5zZW5zb3IgPSBTRU5fT1YzNjEwOwotCX0gZWxzZSB7Ci0JCWVycigiRXJyb3IgdW5rbm93biBzZW5zb3IgdHlwZTogJTAyeCUwMngiLAotCQkJaGlnaCwgbG93KTsKKwlzd2l0Y2ggKGhpZ2gpIHsKKwljYXNlIDB4OTY6CisJCXN3aXRjaCAobG93KSB7CisJCWNhc2UgMHg0MDoKKwkJCVBERUJVRyhEX1BST0JFLCAiU2Vuc29yIGlzIGEgT1YyNjEwIik7CisJCQlzZC0+c2Vuc29yID0gU0VOX09WMjYxMDsKKwkJCXJldHVybjsKKwkJY2FzZSAweDQxOgorCQkJUERFQlVHKERfUFJPQkUsICJTZW5zb3IgaXMgYSBPVjI2MTBBRSIpOworCQkJc2QtPnNlbnNvciA9IFNFTl9PVjI2MTBBRTsKKwkJCXJldHVybjsKKwkJY2FzZSAweGIxOgorCQkJUERFQlVHKERfUFJPQkUsICJTZW5zb3IgaXMgYSBPVjk2MDAiKTsKKwkJCXNkLT5zZW5zb3IgPSBTRU5fT1Y5NjAwOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCWNhc2UgMHgzNjoKKwkJaWYgKChsb3cgJiAweDBmKSA9PSAweDAwKSB7CisJCQlQREVCVUcoRF9QUk9CRSwgIlNlbnNvciBpcyBhIE9WMzYxMCIpOworCQkJc2QtPnNlbnNvciA9IFNFTl9PVjM2MTA7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CiAJfQorCWVycigiRXJyb3IgdW5rbm93biBzZW5zb3IgdHlwZTogJTAyeCUwMngiLCBoaWdoLCBsb3cpOwogfQogCiAvKiBUaGlzIGluaXRpYWxpemVzIHRoZSBPVjgxMTAsIE9WODYxMCBzZW5zb3IuIFRoZSBPVjgxMTAgdXNlcwpAQCAtMzQwMCw2ICszNDQ4LDEwIEBACiAJCQljYW0tPmNhbV9tb2RlID0gb3ZmeDJfb3YzNjEwX21vZGU7CiAJCQljYW0tPm5tb2RlcyA9IEFSUkFZX1NJWkUob3ZmeDJfb3YzNjEwX21vZGUpOwogCQkJYnJlYWs7CisJCWNhc2UgU0VOX09WOTYwMDoKKwkJCWNhbS0+Y2FtX21vZGUgPSBvdmZ4Ml9vdjk2MDBfbW9kZTsKKwkJCWNhbS0+bm1vZGVzID0gQVJSQVlfU0laRShvdmZ4Ml9vdjk2MDBfbW9kZSk7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWlmIChzZC0+c2lmKSB7CiAJCQkJY2FtLT5jYW1fbW9kZSA9IG92NTE5X3NpZl9tb2RlOwpAQCAtMzQ5Nyw2ICszNTQ5LDEyIEBACiAJY2FzZSBTRU5fT1Y4NjEwOgogCQl3cml0ZV9pMmNfcmVndmFscyhzZCwgbm9ybV84NjEwLCBBUlJBWV9TSVpFKG5vcm1fODYxMCkpOwogCQlicmVhazsKKwljYXNlIFNFTl9PVjk2MDA6CisJCXdyaXRlX2kyY19yZWd2YWxzKHNkLCBub3JtXzk2MDAsIEFSUkFZX1NJWkUobm9ybV85NjAwKSk7CisKKwkJLyogZW5hYmxlIGF1dG9leHBvICovCisvKgkJaTJjX3dfbWFzayhzZCwgMHgxMywgMHgwNSwgMHgwNSk7ICovCisJCWJyZWFrOwogCX0KIAlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOwogZXJyb3I6CkBAIC00MDg1LDYgKzQxNDMsMzMgQEAKIAkJaTJjX3dfbWFzayhzZCwgMHgxNCwgcXZnYSA/IDB4MjAgOiAweDAwLCAweDIwKTsKIAkJaTJjX3dfbWFzayhzZCwgMHgxMiwgMHgwNCwgMHgwNik7IC8qIEFXQjogMSBUZXN0IHBhdHRlcm46IDAgKi8KIAkJYnJlYWs7CisJY2FzZSBTRU5fT1Y5NjAwOiB7CisJCWNvbnN0IHN0cnVjdCBvdl9pMmNfcmVndmFscyAqdmFsczsKKwkJc3RhdGljIGNvbnN0IHN0cnVjdCBvdl9pMmNfcmVndmFscyBzeGdhXzE1W10gPSB7CisJCQl7MHgxMSwgMHg4MH0sIHsweDE0LCAweDNlfSwgezB4MjQsIDB4ODV9LCB7MHgyNSwgMHg3NX0KKwkJfTsKKwkJc3RhdGljIGNvbnN0IHN0cnVjdCBvdl9pMmNfcmVndmFscyBzeGdhXzdfNVtdID0geworCQkJezB4MTEsIDB4ODF9LCB7MHgxNCwgMHgzZX0sIHsweDI0LCAweDg1fSwgezB4MjUsIDB4NzV9CisJCX07CisJCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3ZfaTJjX3JlZ3ZhbHMgdmdhXzMwW10gPSB7CisJCQl7MHgxMSwgMHg4MX0sIHsweDE0LCAweDdlfSwgezB4MjQsIDB4NzB9LCB7MHgyNSwgMHg2MH0KKwkJfTsKKwkJc3RhdGljIGNvbnN0IHN0cnVjdCBvdl9pMmNfcmVndmFscyB2Z2FfMTVbXSA9IHsKKwkJCXsweDExLCAweDgzfSwgezB4MTQsIDB4M2V9LCB7MHgyNCwgMHg4MH0sIHsweDI1LCAweDcwfQorCQl9OworCisJCS8qIGZyYW1lIHJhdGVzOgorCQkgKgkxNWZwcyAvIDcuNSBmcHMgZm9yIDEyODB4MTAyNAorCQkgKgkzMGZwcyAvIDE1ZnBzIGZvciA2NDB4NDgwCisJCSAqLworCQlpMmNfd19tYXNrKHNkLCAweDEyLCBxdmdhID8gMHg0MCA6IDB4MDAsIDB4NDApOworCQlpZiAocXZnYSkKKwkJCXZhbHMgPSBzZC0+ZnJhbWVfcmF0ZSA8IDMwID8gdmdhXzE1IDogdmdhXzMwOworCQllbHNlCisJCQl2YWxzID0gc2QtPmZyYW1lX3JhdGUgPCAxNSA/IHN4Z2FfN181IDogc3hnYV8xNTsKKwkJd3JpdGVfaTJjX3JlZ3ZhbHMoc2QsIHZhbHMsIEFSUkFZX1NJWkUoc3hnYV8xNSkpOworCQlyZXR1cm47CisJICAgIH0KIAlkZWZhdWx0OgogCQlyZXR1cm47CiAJfQpAQCAtNDEyMCw2ICs0MjA1LDcgQEAKIAljYXNlIFNFTl9PVjI2MTBBRToKIAljYXNlIFNFTl9PVjM2MTA6CiAJY2FzZSBTRU5fT1Y3NjcwOgorCWNhc2UgU0VOX09WOTYwMDoKIAkJbW9kZV9pbml0X292X3NlbnNvcl9yZWdzKHNkKTsKIAkJcmV0dXJuOwogCWNhc2UgU0VOX09WNzY2MDoKQEAgLTQ5MjAsNyArNTAwNiw4IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgZGV2aWNlX3RhYmxlW10gPSB7CiAJe1VTQl9ERVZJQ0UoMHgwNDFlLCAweDQwMDMpLCAuZHJpdmVyX2luZm8gPSBCUklER0VfVzk5NjhDRiB9LAogCXtVU0JfREVWSUNFKDB4MDQxZSwgMHg0MDUyKSwgLmRyaXZlcl9pbmZvID0gQlJJREdFX09WNTE5IH0sCi0Je1VTQl9ERVZJQ0UoMHgwNDFlLCAweDQwNWYpLCAuZHJpdmVyX2luZm8gPSBCUklER0VfT1Y1MTkgfSwKKwl7VVNCX0RFVklDRSgweDA0MWUsIDB4NDA1ZiksCisJCS5kcml2ZXJfaW5mbyA9IEJSSURHRV9PVjUxOSB8IEJSSURHRV9JTlZFUlRfTEVEIH0sCiAJe1VTQl9ERVZJQ0UoMHgwNDFlLCAweDQwNjApLCAuZHJpdmVyX2luZm8gPSBCUklER0VfT1Y1MTkgfSwKIAl7VVNCX0RFVklDRSgweDA0MWUsIDB4NDA2MSksIC5kcml2ZXJfaW5mbyA9IEJSSURHRV9PVjUxOSB9LAogCXtVU0JfREVWSUNFKDB4MDQxZSwgMHg0MDY0KSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc2U0MDEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc2U0MDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzI4M2MyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zZTQwMS5jCkBAIC0wLDAgKzEsNzc0IEBACisvKgorICogR1NQQ0EgRW5kcG9pbnRzIChmb3JtZXJseSBrbm93biBhcyBBT1gpIHNlNDAxIFVTQiBDYW1lcmEgc3ViIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgorICoKKyAqIEJhc2VkIG9uIHRoZSB2NGwxIHNlNDAxIGRyaXZlciB3aGljaCBpczoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgSmVyb2VuIEIuIFZyZWVrZW4gKHBlMXJ4cUBhbXNhdC5vcmcpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjZGVmaW5lIE1PRFVMRV9OQU1FICJzZTQwMSIKKworI2RlZmluZSBCVUxLX1NJWkUgNDA5NgorI2RlZmluZSBQQUNLRVRfU0laRSAxMDI0CisjZGVmaW5lIFJFQURfUkVRX1NJWkUgNjQKKyNkZWZpbmUgTUFYX01PREVTICgoUkVBRF9SRVFfU0laRSAtIDYpIC8gNCkKKy8qIFRoZSBzZTQwMSBjb21wcmVzc2lvbiBhbGdvcml0aG0gdXNlcyBhIGZpeGVkIHF1YW50IGZhY3Rvciwgd2hpY2gKKyAgIGNhbiBiZSBjb25maWd1cmVkIGJ5IHNldHRpbmcgdGhlIGhpZ2ggbmliYmxlIG9mIHRoZSBTRTQwMV9PUEVSQVRJTkdNT0RFCisgICBmZWF0dXJlLiBUaGlzIG5lZWRzIHRvIGV4YWN0bHkgbWF0Y2ggd2hhdCBpcyBpbiBsaWJ2NGwhICovCisjZGVmaW5lIFNFNDAxX1FVQU5UX0ZBQ1QgOAorCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSAiZ3NwY2EuaCIKKyNpbmNsdWRlICJzZTQwMS5oIgorCitNT0RVTEVfQVVUSE9SKCJIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFbmRwb2ludHMgc2U0MDEiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogY29udHJvbHMgKi8KK2VudW0gZV9jdHJsIHsKKwlCUklHSFRORVNTLAorCUdBSU4sCisJRVhQT1NVUkUsCisJRlJFUSwKKwlOQ1RSTAkvKiBudW1iZXIgb2YgY29udHJvbHMgKi8KK307CisKKy8qIGV4cG9zdXJlIGNoYW5nZSBzdGF0ZSBtYWNoaW5lIHN0YXRlcyAqLworZW51bSB7CisJRVhQT19DSEFOR0VELAorCUVYUE9fRFJPUF9GUkFNRSwKKwlFWFBPX05PX0NIQU5HRSwKK307CisKKy8qIHNwZWNpZmljIHdlYmNhbSBkZXNjcmlwdG9yICovCitzdHJ1Y3Qgc2QgeworCXN0cnVjdCBnc3BjYV9kZXYgZ3NwY2FfZGV2OwkvKiAhISBtdXN0IGJlIHRoZSBmaXJzdCBpdGVtICovCisJc3RydWN0IGdzcGNhX2N0cmwgY3RybHNbTkNUUkxdOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgZm10c1tNQVhfTU9ERVNdOworCWludCBwaXhlbHNfcmVhZDsKKwlpbnQgcGFja2V0X3JlYWQ7CisJdTggcGFja2V0W1BBQ0tFVF9TSVpFXTsKKwl1OCByZXN0YXJ0X3N0cmVhbTsKKwl1OCBidXR0b25fc3RhdGU7CisJdTggcmVzZXRsZXZlbDsKKwl1OCByZXNldGxldmVsX2ZyYW1lX2NvdW50OworCWludCByZXNldGxldmVsX2FkanVzdF9kaXI7CisJaW50IGV4cG9fY2hhbmdlX3N0YXRlOworfTsKKworc3RhdGljIHZvaWQgc2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpOworc3RhdGljIHZvaWQgc2V0Z2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpOworc3RhdGljIHZvaWQgc2V0ZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjdHJsIHNkX2N0cmxzW05DVFJMXSA9IHsKK1tCUklHSFRORVNTXSA9IHsKKwkJeworCQkJLmlkICAgICAgPSBWNEwyX0NJRF9CUklHSFRORVNTLAorCQkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgICAgPSAiQnJpZ2h0bmVzcyIsCisJCQkubWluaW11bSA9IDAsCisJCQkubWF4aW11bSA9IDI1NSwKKwkJCS5zdGVwICAgID0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMTUsCisJCX0sCisJCS5zZXRfY29udHJvbCA9IHNldGJyaWdodG5lc3MKKwl9LAorW0dBSU5dID0geworCQl7CisJCQkuaWQgICAgICA9IFY0TDJfQ0lEX0dBSU4sCisJCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSAgICA9ICJHYWluIiwKKwkJCS5taW5pbXVtID0gMCwKKwkJCS5tYXhpbXVtID0gNTAsIC8qIFJlYWxseSA2MyBidXQgPiA1MCBpcyBub3QgcHJldHR5ICovCisJCQkuc3RlcCAgICA9IDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDI1LAorCQl9LAorCQkuc2V0X2NvbnRyb2wgPSBzZXRnYWluCisJfSwKK1tFWFBPU1VSRV0gPSB7CisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX0VYUE9TVVJFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiRXhwb3N1cmUiLAorCQkJLm1pbmltdW0gPSAwLAorCQkJLm1heGltdW0gPSAzMjc2NywKKwkJCS5zdGVwID0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMTUwMDAsCisJCX0sCisJCS5zZXRfY29udHJvbCA9IHNldGV4cG9zdXJlCisJfSwKK1tGUkVRXSA9IHsKKwkJeworCQkJLmlkCSA9IFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZLAorCQkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9NRU5VLAorCQkJLm5hbWUgICAgPSAiTGlnaHQgZnJlcXVlbmN5IGZpbHRlciIsCisJCQkubWluaW11bSA9IDAsCisJCQkubWF4aW11bSA9IDIsCisJCQkuc3RlcCAgICA9IDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJCX0sCisJCS5zZXRfY29udHJvbCA9IHNldGV4cG9zdXJlCisJfSwKK307CisKK3N0YXRpYyB2b2lkIHNlNDAxX3dyaXRlX3JlcShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIHUxNiByZXEsIHUxNiB2YWx1ZSwKKwkJCSAgICBpbnQgc2lsZW50KQoreworCWludCBlcnI7CisKKwlpZiAoZ3NwY2FfZGV2LT51c2JfZXJyIDwgMCkKKwkJcmV0dXJuOworCisJZXJyID0gdXNiX2NvbnRyb2xfbXNnKGdzcGNhX2Rldi0+ZGV2LAorCQkJICAgICAgdXNiX3NuZGN0cmxwaXBlKGdzcGNhX2Rldi0+ZGV2LCAwKSwgcmVxLAorCQkJICAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJICAgICAgdmFsdWUsIDAsIE5VTEwsIDAsIDEwMDApOworCWlmIChlcnIgPCAwKSB7CisJCWlmICghc2lsZW50KQorCQkJZXJyKCJ3cml0ZSByZXEgZmFpbGVkIHJlcSAlIzA0eCB2YWwgJSMwNHggZXJyb3IgJWQiLAorCQkJICAgIHJlcSwgdmFsdWUsIGVycik7CisJCWdzcGNhX2Rldi0+dXNiX2VyciA9IGVycjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNlNDAxX3JlYWRfcmVxKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgdTE2IHJlcSwgaW50IHNpbGVudCkKK3sKKwlpbnQgZXJyOworCisJaWYgKGdzcGNhX2Rldi0+dXNiX2VyciA8IDApCisJCXJldHVybjsKKworCWlmIChVU0JfQlVGX1NaIDwgUkVBRF9SRVFfU0laRSkgeworCQllcnIoIlVTQl9CVUZfU1ogdG9vIHNtYWxsISEiKTsKKwkJZ3NwY2FfZGV2LT51c2JfZXJyID0gLUVOT0JVRlM7CisJCXJldHVybjsKKwl9CisKKwllcnIgPSB1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCisJCQkgICAgICB1c2JfcmN2Y3RybHBpcGUoZ3NwY2FfZGV2LT5kZXYsIDApLCByZXEsCisJCQkgICAgICBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCSAgICAgIDAsIDAsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgUkVBRF9SRVFfU0laRSwgMTAwMCk7CisJaWYgKGVyciA8IDApIHsKKwkJaWYgKCFzaWxlbnQpCisJCQllcnIoInJlYWQgcmVxIGZhaWxlZCByZXEgJSMwNHggZXJyb3IgJWQiLCByZXEsIGVycik7CisJCWdzcGNhX2Rldi0+dXNiX2VyciA9IGVycjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNlNDAxX3NldF9mZWF0dXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCSAgICAgIHUxNiBzZWxlY3RvciwgdTE2IHBhcmFtKQoreworCWludCBlcnI7CisKKwlpZiAoZ3NwY2FfZGV2LT51c2JfZXJyIDwgMCkKKwkJcmV0dXJuOworCisJZXJyID0gdXNiX2NvbnRyb2xfbXNnKGdzcGNhX2Rldi0+ZGV2LAorCQkJICAgICAgdXNiX3NuZGN0cmxwaXBlKGdzcGNhX2Rldi0+ZGV2LCAwKSwKKwkJCSAgICAgIFNFNDAxX1JFUV9TRVRfRVhUX0ZFQVRVUkUsCisJCQkgICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQkgICAgICBwYXJhbSwgc2VsZWN0b3IsIE5VTEwsIDAsIDEwMDApOworCWlmIChlcnIgPCAwKSB7CisJCWVycigic2V0IGZlYXR1cmUgZmFpbGVkIHNlbCAlIzA0eCBwYXJhbSAlIzA0eCBlcnJvciAlZCIsCisJCSAgICBzZWxlY3RvciwgcGFyYW0sIGVycik7CisJCWdzcGNhX2Rldi0+dXNiX2VyciA9IGVycjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2U0MDFfZ2V0X2ZlYXR1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCB1MTYgc2VsZWN0b3IpCit7CisJaW50IGVycjsKKworCWlmIChnc3BjYV9kZXYtPnVzYl9lcnIgPCAwKQorCQlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOworCisJaWYgKFVTQl9CVUZfU1ogPCAyKSB7CisJCWVycigiVVNCX0JVRl9TWiB0b28gc21hbGwhISIpOworCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSAtRU5PQlVGUzsKKwkJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKKwl9CisKKwllcnIgPSB1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCisJCQkgICAgICB1c2JfcmN2Y3RybHBpcGUoZ3NwY2FfZGV2LT5kZXYsIDApLAorCQkJICAgICAgU0U0MDFfUkVRX0dFVF9FWFRfRkVBVFVSRSwKKwkJCSAgICAgIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJICAgICAgMCwgc2VsZWN0b3IsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgMiwgMTAwMCk7CisJaWYgKGVyciA8IDApIHsKKwkJZXJyKCJnZXQgZmVhdHVyZSBmYWlsZWQgc2VsICUjMDR4IGVycm9yICVkIiwgc2VsZWN0b3IsIGVycik7CisJCWdzcGNhX2Rldi0+dXNiX2VyciA9IGVycjsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2J1ZlswXSB8IChnc3BjYV9kZXYtPnVzYl9idWZbMV0gPDwgOCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKworCWlmIChnc3BjYV9kZXYtPmN0cmxfZGlzICYgKDEgPDwgQlJJR0hUTkVTUykpCisJCXJldHVybjsKKworCS8qIEhERzogdGhpcyBkb2VzIG5vdCBzZWVtIHRvIGRvIGFueXRoaW5nIG9uIG15IGNhbSAqLworCXNlNDAxX3dyaXRlX3JlcShnc3BjYV9kZXYsIFNFNDAxX1JFUV9TRVRfQlJULAorCQkJc2QtPmN0cmxzW0JSSUdIVE5FU1NdLnZhbCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldGdhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKKwl1MTYgZ2FpbiA9IDYzIC0gc2QtPmN0cmxzW0dBSU5dLnZhbDsKKworCS8qIHJlZCBjb2xvciBnYWluICovCisJc2U0MDFfc2V0X2ZlYXR1cmUoZ3NwY2FfZGV2LCBIVjcxMzFfUkVHX0FSQ0csIGdhaW4pOworCS8qIGdyZWVuIGNvbG9yIGdhaW4gKi8KKwlzZTQwMV9zZXRfZmVhdHVyZShnc3BjYV9kZXYsIEhWNzEzMV9SRUdfQUdDRywgZ2Fpbik7CisJLyogYmx1ZSBjb2xvciBnYWluICovCisJc2U0MDFfc2V0X2ZlYXR1cmUoZ3NwY2FfZGV2LCBIVjcxMzFfUkVHX0FCQ0csIGdhaW4pOworfQorCitzdGF0aWMgdm9pZCBzZXRleHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCWludCBpbnRlZ3JhdGlvbiA9IHNkLT5jdHJsc1tFWFBPU1VSRV0udmFsIDw8IDY7CisJdTggZXhwb3NlX2gsIGV4cG9zZV9tLCBleHBvc2VfbDsKKworCS8qIERvIHRoaXMgYmVmb3JlIHRoZSBzZXRfZmVhdHVyZSBjYWxscywgZm9yIHByb3BlciB0aW1pbmcgd3J0CisJICAgdGhlIGludGVycnVwdCBkcml2ZW4gcGt0X3NjYW4uIE5vdGUgd2UgbWF5IHN0aWxsIHJhY2UgYnV0IHRoYXQKKwkgICBpcyBub3QgYSBiaWcgaXNzdWUsIHRoZSBleHBvIGNoYW5nZSBzdGF0ZSBtYWNoaW5lIGlzIG1lcmVseSBmb3IKKwkgICBhdm9pZGluZyB1bmRlcmV4cG9zZWQgZnJhbWVzIGdldHRpbmcgc2VuZCBvdXQsIGlmIG9uZSBzbmVha3MKKwkgICB0aHJvdWdoIHNvIGJlIGl0ICovCisJc2QtPmV4cG9fY2hhbmdlX3N0YXRlID0gRVhQT19DSEFOR0VEOworCisJaWYgKHNkLT5jdHJsc1tGUkVRXS52YWwgPT0gVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfNTBIWikKKwkJaW50ZWdyYXRpb24gPSBpbnRlZ3JhdGlvbiAtIGludGVncmF0aW9uICUgMTA2NjY3OworCWlmIChzZC0+Y3RybHNbRlJFUV0udmFsID09IFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZXzYwSFopCisJCWludGVncmF0aW9uID0gaW50ZWdyYXRpb24gLSBpbnRlZ3JhdGlvbiAlIDg4ODg5OworCisJZXhwb3NlX2ggPSAoaW50ZWdyYXRpb24gPj4gMTYpOworCWV4cG9zZV9tID0gKGludGVncmF0aW9uID4+IDgpOworCWV4cG9zZV9sID0gaW50ZWdyYXRpb247CisKKwkvKiBpbnRlZ3JhdGlvbiB0aW1lIGxvdyAqLworCXNlNDAxX3NldF9mZWF0dXJlKGdzcGNhX2RldiwgSFY3MTMxX1JFR19USVRMLCBleHBvc2VfbCk7CisJLyogaW50ZWdyYXRpb24gdGltZSBtaWQgKi8KKwlzZTQwMV9zZXRfZmVhdHVyZShnc3BjYV9kZXYsIEhWNzEzMV9SRUdfVElUTSwgZXhwb3NlX20pOworCS8qIGludGVncmF0aW9uIHRpbWUgaGlnaCAqLworCXNlNDAxX3NldF9mZWF0dXJlKGdzcGNhX2RldiwgSFY3MTMxX1JFR19USVRVLCBleHBvc2VfaCk7Cit9CisKK3N0YXRpYyBpbnQgc2RfY29uZmlnKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKWdzcGNhX2RldjsKKwlzdHJ1Y3QgY2FtICpjYW0gPSAmZ3NwY2FfZGV2LT5jYW07CisJdTggKmNkID0gZ3NwY2FfZGV2LT51c2JfYnVmOworCWludCBpLCBqLCBuOworCWludCB3aWR0aHNbTUFYX01PREVTXSwgaGVpZ2h0c1tNQVhfTU9ERVNdOworCisJLyogUmVhZCB0aGUgY2FtZXJhIGRlc2NyaXB0b3IgKi8KKwlzZTQwMV9yZWFkX3JlcShnc3BjYV9kZXYsIFNFNDAxX1JFUV9HRVRfQ0FNRVJBX0RFU0NSSVBUT1IsIDEpOworCWlmIChnc3BjYV9kZXYtPnVzYl9lcnIpIHsKKwkJLyogU29tZXRpbWVzIGFmdGVyIGJlaW5nIGlkbGUgZm9yIGEgd2hpbGUgdGhlIHNlNDAxIHdvbid0CisJCSAgIHJlc3BvbmQgYW5kIG5lZWRzIGEgZ29vZCBraWNraW5nICAqLworCQl1c2JfcmVzZXRfZGV2aWNlKGdzcGNhX2Rldi0+ZGV2KTsKKwkJZ3NwY2FfZGV2LT51c2JfZXJyID0gMDsKKwkJc2U0MDFfcmVhZF9yZXEoZ3NwY2FfZGV2LCBTRTQwMV9SRVFfR0VUX0NBTUVSQV9ERVNDUklQVE9SLCAwKTsKKwl9CisKKwkvKiBTb21lIGNhbWVyYXMgc3RhcnQgd2l0aCB0aGVpciBMRUQgb24gKi8KKwlzZTQwMV93cml0ZV9yZXEoZ3NwY2FfZGV2LCBTRTQwMV9SRVFfTEVEX0NPTlRST0wsIDAsIDApOworCWlmIChnc3BjYV9kZXYtPnVzYl9lcnIpCisJCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7CisKKwlpZiAoY2RbMV0gIT0gMHg0MSkgeworCQllcnIoIldyb25nIGRlc2NyaXB0b3IgdHlwZSIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoIShjZFsyXSAmIFNFNDAxX0ZPUk1BVF9CQVlFUikpIHsKKwkJZXJyKCJCYXllciBmb3JtYXQgbm90IHN1cHBvcnRlZCEiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGNkWzNdKQorCQlpbmZvKCJFeHRyYUZlYXR1cmVzOiAlZCIsIGNkWzNdKTsKKworCW4gPSBjZFs0XSB8IChjZFs1XSA8PCA4KTsKKwlpZiAobiA+IE1BWF9NT0RFUykgeworCQllcnIoIlRvbyBtYW55IGZyYW1lIHNpemVzIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBuIDsgaSsrKSB7CisJCXdpZHRoc1tpXSA9IGNkWzYgKyBpICogNCArIDBdIHwgKGNkWzYgKyBpICogNCArIDFdIDw8IDgpOworCQloZWlnaHRzW2ldID0gY2RbNiArIGkgKiA0ICsgMl0gfCAoY2RbNiArIGkgKiA0ICsgM10gPDwgOCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG4gOyBpKyspIHsKKwkJc2QtPmZtdHNbaV0ud2lkdGggPSB3aWR0aHNbaV07CisJCXNkLT5mbXRzW2ldLmhlaWdodCA9IGhlaWdodHNbaV07CisJCXNkLT5mbXRzW2ldLmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCQlzZC0+Zm10c1tpXS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0I7CisJCXNkLT5mbXRzW2ldLnByaXYgPSAxOworCisJCS8qIGphbmdndSBjb21wcmVzc2lvbiBvbmx5IHdvcmtzIGZvciAxLzR0aCBvciAxLzE2dGggcmVzICovCisJCWZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKKwkJCWlmICh3aWR0aHNbal0gLyAyID09IHdpZHRoc1tpXSAmJgorCQkJICAgIGhlaWdodHNbal0gLyAyID09IGhlaWdodHNbaV0pIHsKKwkJCQlzZC0+Zm10c1tpXS5wcml2ID0gMjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiAxLzE2dGggaWYgYXZhaWxhYmxlIHRvbyBpcyBiZXR0ZXIgdGhlbiAxLzR0aCwgYmVjYXVzZQorCQkgICB3ZSB0aGVuIHVzZSBhIGxhcmdlciBhcmVhIG9mIHRoZSBzZW5zb3IgKi8KKwkJZm9yIChqID0gMDsgaiA8IG47IGorKykgeworCQkJaWYgKHdpZHRoc1tqXSAvIDQgPT0gd2lkdGhzW2ldICYmCisJCQkgICAgaGVpZ2h0c1tqXSAvIDQgPT0gaGVpZ2h0c1tpXSkgeworCQkJCXNkLT5mbXRzW2ldLnByaXYgPSA0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKHNkLT5mbXRzW2ldLnByaXYgPT0gMSkgeworCQkJLyogTm90IGEgMS80dGggb3IgMS8xNnRoIHJlcywgdXNlIGJheWVyICovCisJCQlzZC0+Zm10c1tpXS5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9TQkdHUjg7CisJCQlzZC0+Zm10c1tpXS5ieXRlc3BlcmxpbmUgPSB3aWR0aHNbaV07CisJCQlzZC0+Zm10c1tpXS5zaXplaW1hZ2UgPSB3aWR0aHNbaV0gKiBoZWlnaHRzW2ldOworCQkJaW5mbygiRnJhbWUgc2l6ZTogJWR4JWQgYmF5ZXIiLCB3aWR0aHNbaV0sIGhlaWdodHNbaV0pOworCQl9IGVsc2UgeworCQkJLyogRm91bmQgYSBtYXRjaCB1c2UgamFuZ2d1IGNvbXByZXNzaW9uICovCisJCQlzZC0+Zm10c1tpXS5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9TRTQwMTsKKwkJCXNkLT5mbXRzW2ldLmJ5dGVzcGVybGluZSA9IDA7CisJCQlzZC0+Zm10c1tpXS5zaXplaW1hZ2UgPSB3aWR0aHNbaV0gKiBoZWlnaHRzW2ldICogMzsKKwkJCWluZm8oIkZyYW1lIHNpemU6ICVkeCVkIDEvJWR0aCBqYW5nZ3UiLAorCQkJICAgICB3aWR0aHNbaV0sIGhlaWdodHNbaV0sCisJCQkgICAgIHNkLT5mbXRzW2ldLnByaXYgKiBzZC0+Zm10c1tpXS5wcml2KTsKKwkJfQorCX0KKworCWNhbS0+Y2FtX21vZGUgPSBzZC0+Zm10czsKKwljYW0tPm5tb2RlcyA9IG47CisJY2FtLT5idWxrID0gMTsKKwljYW0tPmJ1bGtfc2l6ZSA9IEJVTEtfU0laRTsKKwljYW0tPmJ1bGtfbnVyYnMgPSA0OworCWNhbS0+Y3RybHMgPSBzZC0+Y3RybHM7CisJZ3NwY2FfZGV2LT5uYmFsdCA9IDE7ICAvKiBJZ25vcmUgdGhlIGJvZ3VzIGlzb2MgYWx0IHNldHRpbmdzICovCisJc2QtPnJlc2V0bGV2ZWwgPSAweDJkOyAvKiBTZXQgaW5pdGlhbCByZXNldGxldmVsICovCisKKwkvKiBTZWUgaWYgdGhlIGNhbWVyYSBzdXBwb3J0cyBicmlnaHRuZXNzICovCisJc2U0MDFfcmVhZF9yZXEoZ3NwY2FfZGV2LCBTRTQwMV9SRVFfR0VUX0JSVCwgMSk7CisJaWYgKGdzcGNhX2Rldi0+dXNiX2VycikgeworCQlnc3BjYV9kZXYtPmN0cmxfZGlzID0gKDEgPDwgQlJJR0hUTkVTUyk7CisJCWdzcGNhX2Rldi0+dXNiX2VyciA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHByb2JlIGFuZCByZXN1bWUgdGltZSAqLworc3RhdGljIGludCBzZF9pbml0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworLyogLS0gc3RhcnQgdGhlIGNhbWVyYSAtLSAqLworc3RhdGljIGludCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKilnc3BjYV9kZXY7CisJaW50IG11bHQgPSBnc3BjYV9kZXYtPmNhbS5jYW1fbW9kZVtnc3BjYV9kZXYtPmN1cnJfbW9kZV0ucHJpdjsKKwlpbnQgbW9kZSA9IDA7CisKKwlzZTQwMV93cml0ZV9yZXEoZ3NwY2FfZGV2LCBTRTQwMV9SRVFfQ0FNRVJBX1BPV0VSLCAxLCAxKTsKKwlpZiAoZ3NwY2FfZGV2LT51c2JfZXJyKSB7CisJCS8qIFNvbWV0aW1lcyBhZnRlciBiZWluZyBpZGxlIGZvciBhIHdoaWxlIHRoZSBzZTQwMSB3b24ndAorCQkgICByZXNwb25kIGFuZCBuZWVkcyBhIGdvb2Qga2lja2luZyAgKi8KKwkJdXNiX3Jlc2V0X2RldmljZShnc3BjYV9kZXYtPmRldik7CisJCWdzcGNhX2Rldi0+dXNiX2VyciA9IDA7CisJCXNlNDAxX3dyaXRlX3JlcShnc3BjYV9kZXYsIFNFNDAxX1JFUV9DQU1FUkFfUE9XRVIsIDEsIDApOworCX0KKwlzZTQwMV93cml0ZV9yZXEoZ3NwY2FfZGV2LCBTRTQwMV9SRVFfTEVEX0NPTlRST0wsIDEsIDApOworCisJc2U0MDFfc2V0X2ZlYXR1cmUoZ3NwY2FfZGV2LCBIVjcxMzFfUkVHX01PREVfQiwgMHgwNSk7CisKKwkvKiBzZXQgc2l6ZSArIG1vZGUgKi8KKwlzZTQwMV93cml0ZV9yZXEoZ3NwY2FfZGV2LCBTRTQwMV9SRVFfU0VUX1dJRFRILAorCQkJZ3NwY2FfZGV2LT53aWR0aCAqIG11bHQsIDApOworCXNlNDAxX3dyaXRlX3JlcShnc3BjYV9kZXYsIFNFNDAxX1JFUV9TRVRfSEVJR0hULAorCQkJZ3NwY2FfZGV2LT5oZWlnaHQgKiBtdWx0LCAwKTsKKwkvKgorCSAqIEhERzogZGlzYWJsZWQgdGhpcyBhcyBpdCBkb2VzIG5vdCBzZWVtIHRvIGRvIGFueXRoaW5nCisJICogc2U0MDFfd3JpdGVfcmVxKGdzcGNhX2RldiwgU0U0MDFfUkVRX1NFVF9PVVRQVVRfTU9ERSwKKwkgKgkJICAgU0U0MDFfRk9STUFUX0JBWUVSLCAwKTsKKwkgKi8KKworCXN3aXRjaCAobXVsdCkgeworCWNhc2UgMTogLyogUmF3IGJheWVyICovCisJCW1vZGUgPSAweDAzOyBicmVhazsKKwljYXNlIDI6IC8qIDEvNHRoIGphbmdndSAqLworCQltb2RlID0gU0U0MDFfUVVBTlRfRkFDVCA8PCA0OyBicmVhazsKKwljYXNlIDQ6IC8qIDEvMTZ0aCBqYW5nZ3UgKi8KKwkJbW9kZSA9IChTRTQwMV9RVUFOVF9GQUNUIDw8IDQpIHwgMHgwMjsgYnJlYWs7CisJfQorCXNlNDAxX3NldF9mZWF0dXJlKGdzcGNhX2RldiwgU0U0MDFfT1BFUkFUSU5HTU9ERSwgbW9kZSk7CisKKwlzZXRicmlnaHRuZXNzKGdzcGNhX2Rldik7CisJc2V0Z2Fpbihnc3BjYV9kZXYpOworCXNldGV4cG9zdXJlKGdzcGNhX2Rldik7CisJc2U0MDFfc2V0X2ZlYXR1cmUoZ3NwY2FfZGV2LCBIVjcxMzFfUkVHX0FSTFYsIHNkLT5yZXNldGxldmVsKTsKKworCXNkLT5wYWNrZXRfcmVhZCA9IDA7CisJc2QtPnBpeGVsc19yZWFkID0gMDsKKwlzZC0+cmVzdGFydF9zdHJlYW0gPSAwOworCXNkLT5yZXNldGxldmVsX2ZyYW1lX2NvdW50ID0gMDsKKwlzZC0+cmVzZXRsZXZlbF9hZGp1c3RfZGlyID0gMDsKKwlzZC0+ZXhwb19jaGFuZ2Vfc3RhdGUgPSBFWFBPX05PX0NIQU5HRTsKKworCXNlNDAxX3dyaXRlX3JlcShnc3BjYV9kZXYsIFNFNDAxX1JFUV9TVEFSVF9DT05USU5VT1VTX0NBUFRVUkUsIDAsIDApOworCisJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKK30KKworc3RhdGljIHZvaWQgc2Rfc3RvcE4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXNlNDAxX3dyaXRlX3JlcShnc3BjYV9kZXYsIFNFNDAxX1JFUV9TVE9QX0NPTlRJTlVPVVNfQ0FQVFVSRSwgMCwgMCk7CisJc2U0MDFfd3JpdGVfcmVxKGdzcGNhX2RldiwgU0U0MDFfUkVRX0xFRF9DT05UUk9MLCAwLCAwKTsKKwlzZTQwMV93cml0ZV9yZXEoZ3NwY2FfZGV2LCBTRTQwMV9SRVFfQ0FNRVJBX1BPV0VSLCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgc2RfZHFfY2FsbGJhY2soc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopZ3NwY2FfZGV2OworCXVuc2lnbmVkIGludCBhaHJjLCBhbHJjOworCWludCBvbGRyZXNldCwgYWRqdXN0X2RpcjsKKworCS8qIFJlc3RhcnQgdGhlIHN0cmVhbSBpZiByZXF1ZXN0ZWQgZG8gc28gYnkgcGt0X3NjYW4gKi8KKwlpZiAoc2QtPnJlc3RhcnRfc3RyZWFtKSB7CisJCXNkX3N0b3BOKGdzcGNhX2Rldik7CisJCXNkX3N0YXJ0KGdzcGNhX2Rldik7CisJCXNkLT5yZXN0YXJ0X3N0cmVhbSA9IDA7CisJfQorCisJLyogQXV0b21hdGljYWxseSBhZGp1c3Qgc2Vuc29yIHJlc2V0IGxldmVsCisJICAgSHl1bmRhaSBoYXZlIHNvbWUgcmVhbGx5IG5pY2UgZG9jcyBhYm91dCB0aGlzIGFuZCBvdGhlciBzZW5zb3IKKwkgICByZWxhdGVkIHN0dWZmIG9uIHRoZWlyIGhvbWVwYWdlOiB3d3cuaGVpLmNvLmtyICovCisJc2QtPnJlc2V0bGV2ZWxfZnJhbWVfY291bnQrKzsKKwlpZiAoc2QtPnJlc2V0bGV2ZWxfZnJhbWVfY291bnQgPCAyMCkKKwkJcmV0dXJuOworCisJLyogRm9yIHNvbWUgcmVhc29uIHRoaXMgbm9ybWFsbHkgcmVhZC1vbmx5IHJlZ2lzdGVyIGRvZXNuJ3QgZ2V0IHJlc2V0CisJICAgdG8gemVybyBhZnRlciByZWFkaW5nIHRoZW0ganVzdCBvbmNlLi4uICovCisJc2U0MDFfZ2V0X2ZlYXR1cmUoZ3NwY2FfZGV2LCBIVjcxMzFfUkVHX0hJUkVGTk9IKTsKKwlzZTQwMV9nZXRfZmVhdHVyZShnc3BjYV9kZXYsIEhWNzEzMV9SRUdfSElSRUZOT0wpOworCXNlNDAxX2dldF9mZWF0dXJlKGdzcGNhX2RldiwgSFY3MTMxX1JFR19MT1JFRk5PSCk7CisJc2U0MDFfZ2V0X2ZlYXR1cmUoZ3NwY2FfZGV2LCBIVjcxMzFfUkVHX0xPUkVGTk9MKTsKKwlhaHJjID0gMjU2KnNlNDAxX2dldF9mZWF0dXJlKGdzcGNhX2RldiwgSFY3MTMxX1JFR19ISVJFRk5PSCkgKworCSAgICBzZTQwMV9nZXRfZmVhdHVyZShnc3BjYV9kZXYsIEhWNzEzMV9SRUdfSElSRUZOT0wpOworCWFscmMgPSAyNTYqc2U0MDFfZ2V0X2ZlYXR1cmUoZ3NwY2FfZGV2LCBIVjcxMzFfUkVHX0xPUkVGTk9IKSArCisJICAgIHNlNDAxX2dldF9mZWF0dXJlKGdzcGNhX2RldiwgSFY3MTMxX1JFR19MT1JFRk5PTCk7CisKKwkvKiBOb3QgYW4gZXhhY3Qgc2NpZW5jZSwgYnV0IGl0IHNlZW1zIHRvIHdvcmsgcHJldHR5IHdlbGwuLi4gKi8KKwlvbGRyZXNldCA9IHNkLT5yZXNldGxldmVsOworCWlmIChhbHJjID4gMTApIHsKKwkJd2hpbGUgKGFscmMgPj0gMTAgJiYgc2QtPnJlc2V0bGV2ZWwgPCA2MykgeworCQkJc2QtPnJlc2V0bGV2ZWwrKzsKKwkJCWFscmMgLz0gMjsKKwkJfQorCX0gZWxzZSBpZiAoYWhyYyA+IDIwKSB7CisJCXdoaWxlIChhaHJjID49IDIwICYmIHNkLT5yZXNldGxldmVsID4gMCkgeworCQkJc2QtPnJlc2V0bGV2ZWwtLTsKKwkJCWFocmMgLz0gMjsKKwkJfQorCX0KKwkvKiBEZXRlY3QgcGluZy1wb25nLWluZyBhbmQgaGFsdmUgYWRqdXN0bWVudCB0byBhdm9pZCBvdmVyc2hvb3QgKi8KKwlpZiAoc2QtPnJlc2V0bGV2ZWwgPiBvbGRyZXNldCkKKwkJYWRqdXN0X2RpciA9IDE7CisJZWxzZQorCQlhZGp1c3RfZGlyID0gLTE7CisJaWYgKHNkLT5yZXNldGxldmVsX2FkanVzdF9kaXIgJiYKKwkgICAgc2QtPnJlc2V0bGV2ZWxfYWRqdXN0X2RpciAhPSBhZGp1c3RfZGlyKQorCQlzZC0+cmVzZXRsZXZlbCA9IG9sZHJlc2V0ICsgKHNkLT5yZXNldGxldmVsIC0gb2xkcmVzZXQpIC8gMjsKKworCWlmIChzZC0+cmVzZXRsZXZlbCAhPSBvbGRyZXNldCkgeworCQlzZC0+cmVzZXRsZXZlbF9hZGp1c3RfZGlyID0gYWRqdXN0X2RpcjsKKwkJc2U0MDFfc2V0X2ZlYXR1cmUoZ3NwY2FfZGV2LCBIVjcxMzFfUkVHX0FSTFYsIHNkLT5yZXNldGxldmVsKTsKKwl9CisKKwlzZC0+cmVzZXRsZXZlbF9mcmFtZV9jb3VudCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHNkX2NvbXBsZXRlX2ZyYW1lKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgdTggKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKilnc3BjYV9kZXY7CisKKwlzd2l0Y2ggKHNkLT5leHBvX2NoYW5nZV9zdGF0ZSkgeworCWNhc2UgRVhQT19DSEFOR0VEOgorCQkvKiBUaGUgZXhwb3N1cmUgd2FzIGNoYW5nZWQgd2hpbGUgdGhpcyBmcmFtZQorCQkgICB3YXMgYmVpbmcgc2VuZCwgc28gdGhpcyBmcmFtZSBpcyBvayAqLworCQlzZC0+ZXhwb19jaGFuZ2Vfc3RhdGUgPSBFWFBPX0RST1BfRlJBTUU7CisJCWJyZWFrOworCWNhc2UgRVhQT19EUk9QX0ZSQU1FOgorCQkvKiBUaGUgZXhwb3N1cmUgd2FzIGNoYW5nZWQgd2hpbGUgdGhpcyBmcmFtZQorCQkgICB3YXMgYmVpbmcgY2FwdHVyZWQsIGRyb3AgaXQhICovCisJCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9IERJU0NBUkRfUEFDS0VUOworCQlzZC0+ZXhwb19jaGFuZ2Vfc3RhdGUgPSBFWFBPX05PX0NIQU5HRTsKKwkJYnJlYWs7CisJY2FzZSBFWFBPX05PX0NIQU5HRToKKwkJYnJlYWs7CisJfQorCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBkYXRhLCBsZW4pOworfQorCitzdGF0aWMgdm9pZCBzZF9wa3Rfc2Nhbl9qYW5nZ3Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCB1OCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKWdzcGNhX2RldjsKKwlpbnQgaW1hZ2VzaXplID0gZ3NwY2FfZGV2LT53aWR0aCAqIGdzcGNhX2Rldi0+aGVpZ2h0OworCWludCBpLCBwbGVuLCBiaXRzLCBwaXhlbHMsIGluZm8sIGNvdW50OworCisJaWYgKHNkLT5yZXN0YXJ0X3N0cmVhbSkKKwkJcmV0dXJuOworCisJLyogU29tZXRpbWVzIGEgMTAyNCBieXRlcyBnYXJiYWdlIGJ1bGsgcGFja2V0IGlzIHNlbmQgYmV0d2VlbiBmcmFtZXMgKi8KKwlpZiAoZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID09IExBU1RfUEFDS0VUICYmIGxlbiA9PSAxMDI0KSB7CisJCWdzcGNhX2Rldi0+bGFzdF9wYWNrZXRfdHlwZSA9IERJU0NBUkRfUEFDS0VUOworCQlyZXR1cm47CisJfQorCisJaSA9IDA7CisJd2hpbGUgKGkgPCBsZW4pIHsKKwkJLyogUmVhZCBoZWFkZXIgaWYgbm90IGFscmVhZHkgYmUgcHJlc2VudCBmcm9tIHByZXYgYnVsayBwa3QgKi8KKwkJaWYgKHNkLT5wYWNrZXRfcmVhZCA8IDQpIHsKKwkJCWNvdW50ID0gNCAtIHNkLT5wYWNrZXRfcmVhZDsKKwkJCWlmIChjb3VudCA+IGxlbiAtIGkpCisJCQkJY291bnQgPSBsZW4gLSBpOworCQkJbWVtY3B5KCZzZC0+cGFja2V0W3NkLT5wYWNrZXRfcmVhZF0sICZkYXRhW2ldLCBjb3VudCk7CisJCQlzZC0+cGFja2V0X3JlYWQgKz0gY291bnQ7CisJCQlpICs9IGNvdW50OworCQkJaWYgKHNkLT5wYWNrZXRfcmVhZCA8IDQpCisJCQkJYnJlYWs7CisJCX0KKwkJYml0cyAgID0gc2QtPnBhY2tldFszXSArIChzZC0+cGFja2V0WzJdIDw8IDgpOworCQlwaXhlbHMgPSBzZC0+cGFja2V0WzFdICsgKChzZC0+cGFja2V0WzBdICYgMHgzZikgPDwgOCk7CisJCWluZm8gICA9IChzZC0+cGFja2V0WzBdICYgMHhjMCkgPj4gNjsKKwkJcGxlbiAgID0gKChiaXRzICsgNDcpID4+IDQpIDw8IDE7CisJCS8qIFNhbml0eSBjaGVja3MgKi8KKwkJaWYgKHBsZW4gPiAxMDI0KSB7CisJCQllcnIoImludmFsaWQgcGFja2V0IGxlbiAlZCByZXN0YXJ0aW5nIHN0cmVhbSIsIHBsZW4pOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlpZiAoaW5mbyA9PSAzKSB7CisJCQllcnIoInVua25vd24gZnJhbWUgaW5mbyB2YWx1ZSByZXN0YXJ0aW5nIHN0cmVhbSIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCS8qIFJlYWQgKHJlbWFpbmRlciBvZikgcGFja2V0IGNvbnRlbnRzICovCisJCWNvdW50ID0gcGxlbiAtIHNkLT5wYWNrZXRfcmVhZDsKKwkJaWYgKGNvdW50ID4gbGVuIC0gaSkKKwkJCWNvdW50ID0gbGVuIC0gaTsKKwkJbWVtY3B5KCZzZC0+cGFja2V0W3NkLT5wYWNrZXRfcmVhZF0sICZkYXRhW2ldLCBjb3VudCk7CisJCXNkLT5wYWNrZXRfcmVhZCArPSBjb3VudDsKKwkJaSArPSBjb3VudDsKKwkJaWYgKHNkLT5wYWNrZXRfcmVhZCA8IHBsZW4pCisJCQlicmVhazsKKworCQlzZC0+cGl4ZWxzX3JlYWQgKz0gcGl4ZWxzOworCQlzZC0+cGFja2V0X3JlYWQgPSAwOworCisJCXN3aXRjaCAoaW5mbykgeworCQljYXNlIDA6IC8qIEZyYW1lIGRhdGEgKi8KKwkJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgc2QtPnBhY2tldCwKKwkJCQkJcGxlbik7CisJCQlicmVhazsKKwkJY2FzZSAxOiAvKiBFT0YgKi8KKwkJCWlmIChzZC0+cGl4ZWxzX3JlYWQgIT0gaW1hZ2VzaXplKSB7CisJCQkJZXJyKCJmcmFtZSBzaXplICVkIGV4cGVjdGVkICVkIiwKKwkJCQkgICAgc2QtPnBpeGVsc19yZWFkLCBpbWFnZXNpemUpOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCQlzZF9jb21wbGV0ZV9mcmFtZShnc3BjYV9kZXYsIHNkLT5wYWNrZXQsIHBsZW4pOworCQkJcmV0dXJuOyAvKiBEaXNjYXJkIHRoZSByZXN0IG9mIHRoZSBidWxrIHBhY2tldCAhISAqLworCQljYXNlIDI6IC8qIFNPRiAqLworCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULCBzZC0+cGFja2V0LAorCQkJCQlwbGVuKTsKKwkJCXNkLT5waXhlbHNfcmVhZCA9IHBpeGVsczsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybjsKKworZXJyb3I6CisJc2QtPnJlc3RhcnRfc3RyZWFtID0gMTsKKwkvKiBHaXZlIHVzZXJzcGFjZSBhIDAgYnl0ZXMgZnJhbWUsIHNvIG91ciBkcSBjYWxsYmFjayBnZXRzCisJICAgY2FsbGVkIGFuZCBpdCBjYW4gcmVzdGFydCB0aGUgc3RyZWFtICovCisJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgRklSU1RfUEFDS0VULCBOVUxMLCAwKTsKKwlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBMQVNUX1BBQ0tFVCwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNkX3BrdF9zY2FuX2JheWVyKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgdTggKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IGNhbSAqY2FtID0gJmdzcGNhX2Rldi0+Y2FtOworCWludCBpbWFnZXNpemUgPSBjYW0tPmNhbV9tb2RlW2dzcGNhX2Rldi0+Y3Vycl9tb2RlXS5zaXplaW1hZ2U7CisKKwlpZiAoZ3NwY2FfZGV2LT5pbWFnZV9sZW4gPT0gMCkgeworCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIGRhdGEsIGxlbik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZ3NwY2FfZGV2LT5pbWFnZV9sZW4gKyBsZW4gPj0gaW1hZ2VzaXplKSB7CisJCXNkX2NvbXBsZXRlX2ZyYW1lKGdzcGNhX2RldiwgZGF0YSwgbGVuKTsKKwkJcmV0dXJuOworCX0KKworCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIElOVEVSX1BBQ0tFVCwgZGF0YSwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgc2RfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCB1OCAqZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgbXVsdCA9IGdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlW2dzcGNhX2Rldi0+Y3Vycl9tb2RlXS5wcml2OworCisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAobXVsdCA9PSAxKSAvKiBtdWx0ID09IDEgbWVhbnMgcmF3IGJheWVyICovCisJCXNkX3BrdF9zY2FuX2JheWVyKGdzcGNhX2RldiwgZGF0YSwgbGVuKTsKKwllbHNlCisJCXNkX3BrdF9zY2FuX2phbmdndShnc3BjYV9kZXYsIGRhdGEsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgc2RfcXVlcnltZW51KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKKwkJCXN0cnVjdCB2NGwyX3F1ZXJ5bWVudSAqbWVudSkKK3sKKwlzd2l0Y2ggKG1lbnUtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWToKKwkJc3dpdGNoIChtZW51LT5pbmRleCkgeworCQljYXNlIFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZX0RJU0FCTEVEOgorCQkJc3RyY3B5KChjaGFyICopIG1lbnUtPm5hbWUsICJOb0ZsaWtlciIpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfNTBIWjoKKwkJCXN0cmNweSgoY2hhciAqKSBtZW51LT5uYW1lLCAiNTAgSHoiKTsKKwkJCXJldHVybiAwOworCQljYXNlIFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZXzYwSFo6CisJCQlzdHJjcHkoKGNoYXIgKikgbWVudS0+bmFtZSwgIjYwIEh6Iik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19JTlBVVCkgfHwgZGVmaW5lZChDT05GSUdfSU5QVVRfTU9EVUxFKQorc3RhdGljIGludCBzZF9pbnRfcGt0X3NjYW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCB1OCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKWdzcGNhX2RldjsKKwl1OCBzdGF0ZTsKKworCWlmIChsZW4gIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGRhdGFbMF0pIHsKKwljYXNlIDA6CisJY2FzZSAxOgorCQlzdGF0ZSA9IGRhdGFbMF07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoc2QtPmJ1dHRvbl9zdGF0ZSAhPSBzdGF0ZSkgeworCQlpbnB1dF9yZXBvcnRfa2V5KGdzcGNhX2Rldi0+aW5wdXRfZGV2LCBLRVlfQ0FNRVJBLCBzdGF0ZSk7CisJCWlucHV0X3N5bmMoZ3NwY2FfZGV2LT5pbnB1dF9kZXYpOworCQlzZC0+YnV0dG9uX3N0YXRlID0gc3RhdGU7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyogc3ViLWRyaXZlciBkZXNjcmlwdGlvbiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzZF9kZXNjIHNkX2Rlc2MgPSB7CisJLm5hbWUgPSBNT0RVTEVfTkFNRSwKKwkuY3RybHMgPSBzZF9jdHJscywKKwkubmN0cmxzID0gQVJSQVlfU0laRShzZF9jdHJscyksCisJLmNvbmZpZyA9IHNkX2NvbmZpZywKKwkuaW5pdCA9IHNkX2luaXQsCisJLnN0YXJ0ID0gc2Rfc3RhcnQsCisJLnN0b3BOID0gc2Rfc3RvcE4sCisJLmRxX2NhbGxiYWNrID0gc2RfZHFfY2FsbGJhY2ssCisJLnBrdF9zY2FuID0gc2RfcGt0X3NjYW4sCisJLnF1ZXJ5bWVudSA9IHNkX3F1ZXJ5bWVudSwKKyNpZiBkZWZpbmVkKENPTkZJR19JTlBVVCkgfHwgZGVmaW5lZChDT05GSUdfSU5QVVRfTU9EVUxFKQorCS5pbnRfcGt0X3NjYW4gPSBzZF9pbnRfcGt0X3NjYW4sCisjZW5kaWYKK307CisKKy8qIC0tIG1vZHVsZSBpbml0aWFsaXNhdGlvbiAtLSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRldmljZV90YWJsZVtdID0geworCXtVU0JfREVWSUNFKDB4MDNlOCwgMHgwMDA0KX0sIC8qIEVuZHBvaW50cy9Bb3ggU0U0MDEgKi8KKwl7VVNCX0RFVklDRSgweDA0NzEsIDB4MDMwYil9LCAvKiBQaGlsaXBzIFBDVkM2NjVLICovCisJe1VTQl9ERVZJQ0UoMHgwNDdkLCAweDUwMDEpfSwgLyogS2Vuc2luZ3RvbiA2NzAxNCAqLworCXtVU0JfREVWSUNFKDB4MDQ3ZCwgMHg1MDAyKX0sIC8qIEtlbnNpbmd0b24gNjcwMSg1LzcpICovCisJe1VTQl9ERVZJQ0UoMHgwNDdkLCAweDUwMDMpfSwgLyogS2Vuc2luZ3RvbiA2NzAxNiAqLworCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGRldmljZV90YWJsZSk7CisKKy8qIC0tIGRldmljZSBjb25uZWN0IC0tICovCitzdGF0aWMgaW50IHNkX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiBnc3BjYV9kZXZfcHJvYmUoaW50ZiwgaWQsICZzZF9kZXNjLCBzaXplb2Yoc3RydWN0IHNkKSwKKwkJCQlUSElTX01PRFVMRSk7Cit9CisKK3N0YXRpYyBpbnQgc2RfcHJlX3Jlc2V0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkX3Bvc3RfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBzZF9kcml2ZXIgPSB7CisJLm5hbWUgPSBNT0RVTEVfTkFNRSwKKwkuaWRfdGFibGUgPSBkZXZpY2VfdGFibGUsCisJLnByb2JlID0gc2RfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBnc3BjYV9kaXNjb25uZWN0LAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gZ3NwY2Ffc3VzcGVuZCwKKwkucmVzdW1lID0gZ3NwY2FfcmVzdW1lLAorI2VuZGlmCisJLnByZV9yZXNldCA9IHNkX3ByZV9yZXNldCwKKwkucG9zdF9yZXNldCA9IHNkX3Bvc3RfcmVzZXQsCit9OworCisvKiAtLSBtb2R1bGUgaW5zZXJ0IC8gcmVtb3ZlIC0tICovCitzdGF0aWMgaW50IF9faW5pdCBzZF9tb2RfaW5pdCh2b2lkKQoreworCXJldHVybiB1c2JfcmVnaXN0ZXIoJnNkX2RyaXZlcik7Cit9CitzdGF0aWMgdm9pZCBfX2V4aXQgc2RfbW9kX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3Rlcigmc2RfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc2RfbW9kX2luaXQpOworbW9kdWxlX2V4aXQoc2RfbW9kX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zZTQwMS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zZTQwMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZDhlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NlNDAxLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIEdTUENBIEVuZHBvaW50cyAoZm9ybWVybHkga25vd24gYXMgQU9YKSBzZTQwMSBVU0IgQ2FtZXJhIHN1YiBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KKyAqCisgKiBCYXNlZCBvbiB0aGUgdjRsMSBzZTQwMSBkcml2ZXIgd2hpY2ggaXM6CisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwIEplcm9lbiBCLiBWcmVla2VuIChwZTFyeHFAYW1zYXQub3JnKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2RlZmluZSBTRTQwMV9SRVFfR0VUX0NBTUVSQV9ERVNDUklQVE9SCQkweDA2CisjZGVmaW5lIFNFNDAxX1JFUV9TVEFSVF9DT05USU5VT1VTX0NBUFRVUkUJMHg0MQorI2RlZmluZSBTRTQwMV9SRVFfU1RPUF9DT05USU5VT1VTX0NBUFRVUkUJMHg0MgorI2RlZmluZSBTRTQwMV9SRVFfQ0FQVFVSRV9GUkFNRQkJCTB4NDMKKyNkZWZpbmUgU0U0MDFfUkVRX0dFVF9CUlQJCQkweDQ0CisjZGVmaW5lIFNFNDAxX1JFUV9TRVRfQlJUCQkJMHg0NQorI2RlZmluZSBTRTQwMV9SRVFfR0VUX1dJRFRICQkJMHg0YworI2RlZmluZSBTRTQwMV9SRVFfU0VUX1dJRFRICQkJMHg0ZAorI2RlZmluZSBTRTQwMV9SRVFfR0VUX0hFSUdIVAkJCTB4NGUKKyNkZWZpbmUgU0U0MDFfUkVRX1NFVF9IRUlHSFQJCQkweDRmCisjZGVmaW5lIFNFNDAxX1JFUV9HRVRfT1VUUFVUX01PREUJCTB4NTAKKyNkZWZpbmUgU0U0MDFfUkVRX1NFVF9PVVRQVVRfTU9ERQkJMHg1MQorI2RlZmluZSBTRTQwMV9SRVFfR0VUX0VYVF9GRUFUVVJFCQkweDUyCisjZGVmaW5lIFNFNDAxX1JFUV9TRVRfRVhUX0ZFQVRVUkUJCTB4NTMKKyNkZWZpbmUgU0U0MDFfUkVRX0NBTUVSQV9QT1dFUgkJCTB4NTYKKyNkZWZpbmUgU0U0MDFfUkVRX0xFRF9DT05UUk9MCQkJMHg1NworI2RlZmluZSBTRTQwMV9SRVFfQklPUwkJCQkweGZmCisKKyNkZWZpbmUgU0U0MDFfQklPU19SRUFECQkJCTB4MDcKKworI2RlZmluZSBTRTQwMV9GT1JNQVRfQkFZRVIJMHg0MAorCisvKiBIeXVuZGFpIGh2NzEzMWIgcmVnaXN0ZXJzCisgICA3MTIxIGFuZCA3MTQxIHNob3VsZCBiZSB0aGUgc2FtZSAoaGF2ZW4ndCByZWFsbHkgY2hlY2tlZC4uLikgKi8KKy8qIE1vZGUgcmVnaXN0ZXJzOiAqLworI2RlZmluZSBIVjcxMzFfUkVHX01PREVfQQkJMHgwMAorI2RlZmluZSBIVjcxMzFfUkVHX01PREVfQgkJMHgwMQorI2RlZmluZSBIVjcxMzFfUkVHX01PREVfQwkJMHgwMgorLyogRnJhbWUgcmVnaXN0ZXJzOiAqLworI2RlZmluZSBIVjcxMzFfUkVHX0ZSU1UJCTB4MTAKKyNkZWZpbmUgSFY3MTMxX1JFR19GUlNMCQkweDExCisjZGVmaW5lIEhWNzEzMV9SRUdfRkNTVQkJMHgxMgorI2RlZmluZSBIVjcxMzFfUkVHX0ZDU0wJCTB4MTMKKyNkZWZpbmUgSFY3MTMxX1JFR19GV0hVCQkweDE0CisjZGVmaW5lIEhWNzEzMV9SRUdfRldITAkJMHgxNQorI2RlZmluZSBIVjcxMzFfUkVHX0ZXV1UJCTB4MTYKKyNkZWZpbmUgSFY3MTMxX1JFR19GV1dMCQkweDE3CisvKiBUaW1pbmcgcmVnaXN0ZXJzOiAqLworI2RlZmluZSBIVjcxMzFfUkVHX1RIQlUJCTB4MjAKKyNkZWZpbmUgSFY3MTMxX1JFR19USEJMCQkweDIxCisjZGVmaW5lIEhWNzEzMV9SRUdfVFZCVQkJMHgyMgorI2RlZmluZSBIVjcxMzFfUkVHX1RWQkwJCTB4MjMKKyNkZWZpbmUgSFY3MTMxX1JFR19USVRVCQkweDI1CisjZGVmaW5lIEhWNzEzMV9SRUdfVElUTQkJMHgyNgorI2RlZmluZSBIVjcxMzFfUkVHX1RJVEwJCTB4MjcKKyNkZWZpbmUgSFY3MTMxX1JFR19UTUNECQkweDI4CisvKiBBZGp1c3QgUmVnaXN0ZXJzOiAqLworI2RlZmluZSBIVjcxMzFfUkVHX0FSTFYJCTB4MzAKKyNkZWZpbmUgSFY3MTMxX1JFR19BUkNHCQkweDMxCisjZGVmaW5lIEhWNzEzMV9SRUdfQUdDRwkJMHgzMgorI2RlZmluZSBIVjcxMzFfUkVHX0FCQ0cJCTB4MzMKKyNkZWZpbmUgSFY3MTMxX1JFR19BUEJWCQkweDM0CisjZGVmaW5lIEhWNzEzMV9SRUdfQVNMUAkJMHg1NAorLyogT2Zmc2V0IFJlZ2lzdGVyczogKi8KKyNkZWZpbmUgSFY3MTMxX1JFR19PRlNSCQkweDUwCisjZGVmaW5lIEhWNzEzMV9SRUdfT0ZTRwkJMHg1MQorI2RlZmluZSBIVjcxMzFfUkVHX09GU0IJCTB4NTIKKy8qIFJFc2V0IGxldmVsIHN0YXRpc3RpY3MgcmVnaXN0ZXJzOiAqLworI2RlZmluZSBIVjcxMzFfUkVHX0xPUkVGTk9ICTB4NTcKKyNkZWZpbmUgSFY3MTMxX1JFR19MT1JFRk5PTAkweDU4CisjZGVmaW5lIEhWNzEzMV9SRUdfSElSRUZOT0gJMHg1OQorI2RlZmluZSBIVjcxMzFfUkVHX0hJUkVGTk9MCTB4NWEKKworLyogc2U0MDEgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNFNDAxX09QRVJBVElOR01PREUJMHgyMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3N1bnBsdXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3VucGx1cy5jCmluZGV4IGIwODljMGQuLjZlYzIzMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3VucGx1cy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3VucGx1cy5jCkBAIC0yNDcsNyArMjQ3LDYgQEAKIAl7MHgzMCwgMHgwMDA0LCAweDAwMGF9LAogCXsweGIwLCAweDAwMDEsIDB4MDAwMH0sCiAKLQogCXsweGExLCAweDAwODAsIDB4MDAwMX0sCiAJezB4MzAsIDB4MDA0OSwgMHgwMDAwfSwKIAl7MHgzMCwgMHgwMDYwLCAweDAwMDV9LApAQCAtMjU2LDggKzI1NSw2IEBACiAJezB4MDAsIDB4MDAwMCwgMHgyMDAwfSwKIAl7MHgwMCwgMHgwMDEzLCAweDIzMDF9LAogCXsweDAwLCAweDAwMDMsIDB4MjAwMH0sCi0JezB4MDAsIDB4MDAwMCwgMHgyMDAwfSwKLQogfTsKIAogLyogY2xpY2tzbWFydCA0MjAgb3BlbiBkYXRhID8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvdDYxMy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90NjEzLmMKaW5kZXggN2U3NjJkNS4uZDFkNzMzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90NjEzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90NjEzLmMKQEAgLTEzODcsNyArMTM4Nyw3IEBACiAJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfRUZGRUNUUzoKIAkJaWYgKCh1bnNpZ25lZCkgbWVudS0+aW5kZXggPCBBUlJBWV9TSVpFKGVmZmVjdHNfY29udHJvbCkpIHsKLQkJCXN0cm5jcHkoKGNoYXIgKikgbWVudS0+bmFtZSwKKwkJCXN0cmxjcHkoKGNoYXIgKikgbWVudS0+bmFtZSwKIAkJCQllZmZlY3RzX2NvbnRyb2xbbWVudS0+aW5kZXhdLAogCQkJCXNpemVvZiBtZW51LT5uYW1lKTsKIAkJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9oZHB2ci9oZHB2ci1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL2hkcHZyLWNvcmUuYwppbmRleCA1ZjFkYjQ2Li40NDFkYWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL2hkcHZyLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL2hkcHZyLWNvcmUuYwpAQCAtNDc0LDUgKzQ3NCw2IEBACiBtb2R1bGVfZXhpdChoZHB2cl9leGl0KTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjAuMi4xIik7CiBNT0RVTEVfQVVUSE9SKCJKYW5uZSBHcnVuYXUiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSGF1cHBhdWdlIEhEIFBWUiBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnItdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnItdmlkZW8uYwppbmRleCA1MTRhZWE3Li4wODdmN2MwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL2hkcHZyLXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9oZHB2ci9oZHB2ci12aWRlby5jCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CkBAIC01NzQsNyArNTczLDYgQEAKIAlzdHJjcHkoY2FwLT5kcml2ZXIsICJoZHB2ciIpOwogCXN0cmNweShjYXAtPmNhcmQsICJIYXVwcGF1Z2UgSEQgUFZSIik7CiAJdXNiX21ha2VfcGF0aChkZXYtPnVkZXYsIGNhcC0+YnVzX2luZm8sIHNpemVvZihjYXAtPmJ1c19pbmZvKSk7Ci0JY2FwLT52ZXJzaW9uID0gSERQVlJfVkVSU0lPTjsKIAljYXAtPmNhcGFiaWxpdGllcyA9ICAgICBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKIAkJCQlWNEwyX0NBUF9BVURJTyAgICAgICAgIHwKIAkJCQlWNEwyX0NBUF9SRUFEV1JJVEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL2hkcHZyLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL2hkcHZyLmgKaW5kZXggMDcyZjIzYy4uZDY0MzlkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9oZHB2ci9oZHB2ci5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnIuaApAQCAtMTgsMTIgKzE4LDYgQEAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL2lyLWtiZC1pMmMuaD4KIAotI2RlZmluZSBIRFBWUl9NQUpPUl9WRVJTSU9OIDAKLSNkZWZpbmUgSERQVlJfTUlOT1JfVkVSU0lPTiAyCi0jZGVmaW5lIEhEUFZSX1JFTEVBU0UgMAotI2RlZmluZSBIRFBWUl9WRVJTSU9OIFwKLQlLRVJORUxfVkVSU0lPTihIRFBWUl9NQUpPUl9WRVJTSU9OLCBIRFBWUl9NSU5PUl9WRVJTSU9OLCBIRFBWUl9SRUxFQVNFKQotCiAjZGVmaW5lIEhEUFZSX01BWCA4CiAjZGVmaW5lIEhEUFZSX0kyQ19NQVhfU0laRSAxMjgKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZHJpdmVyLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuaAppbmRleCA4NGJkZjBmLi44ZjljYzE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuaApAQCAtMzYsNyArMzYsNiBAQAogICogICAgICAgICAgICAgICAgdXNpbmcgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgSml1bi1LdWVpIEp1bmcgQCBBVmVyTWVkaWEuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpbGVvcHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpbGVvcHMuYwppbmRleCBhN2Y1NGIwLi4zOGYwNTIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maWxlb3BzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlsZW9wcy5jCkBAIC03MjIsOCArNzIyLDggQEAKIAogCS8qIElmIHRoZXJlIGFyZSBzdWJzY3JpYmVkIGV2ZW50cywgdGhlbiBvbmx5IHVzZSB0aGUgbmV3IGV2ZW50CiAJICAgQVBJIGluc3RlYWQgb2YgdGhlIG9sZCB2aWRlby5oIGJhc2VkIEFQSS4gKi8KLQlpZiAoIWxpc3RfZW1wdHkoJmlkLT5maC5ldmVudHMtPnN1YnNjcmliZWQpKSB7Ci0JCXBvbGxfd2FpdChmaWxwLCAmaWQtPmZoLmV2ZW50cy0+d2FpdCwgd2FpdCk7CisJaWYgKCFsaXN0X2VtcHR5KCZpZC0+Zmguc3Vic2NyaWJlZCkpIHsKKwkJcG9sbF93YWl0KGZpbHAsICZpZC0+Zmgud2FpdCwgd2FpdCk7CiAJCS8qIFR1cm4gb2ZmIHRoZSBvbGQtc3R5bGUgdnN5bmMgZXZlbnRzICovCiAJCWNsZWFyX2JpdChJVlRWX0ZfSV9FVl9WU1lOQ19FTkFCTEVELCAmaXR2LT5pX2ZsYWdzKTsKIAkJaWYgKHY0bDJfZXZlbnRfcGVuZGluZygmaWQtPmZoKSkKQEAgLTc1MCw2ICs3NTAsNyBAQAogCXN0cnVjdCBpdnR2ICppdHYgPSBpZC0+aXR2OwogCXN0cnVjdCBpdnR2X3N0cmVhbSAqcyA9ICZpdHYtPnN0cmVhbXNbaWQtPnR5cGVdOwogCWludCBlb2YgPSB0ZXN0X2JpdChJVlRWX0ZfU19TVFJFQU1PRkYsICZzLT5zX2ZsYWdzKTsKKwl1bnNpZ25lZCByZXMgPSAwOwogCiAJLyogU3RhcnQgYSBjYXB0dXJlIGlmIHRoZXJlIGlzIG5vbmUgKi8KIAlpZiAoIWVvZiAmJiAhdGVzdF9iaXQoSVZUVl9GX1NfU1RSRUFNSU5HLCAmcy0+c19mbGFncykpIHsKQEAgLTc2OSwxMiArNzcwLDE2IEBACiAJLyogYWRkIHN0cmVhbSdzIHdhaXRxIHRvIHRoZSBwb2xsIGxpc3QgKi8KIAlJVlRWX0RFQlVHX0hJX0ZJTEUoIkVuY29kZXIgcG9sbFxuIik7CiAJcG9sbF93YWl0KGZpbHAsICZzLT53YWl0cSwgd2FpdCk7CisJaWYgKHY0bDJfZXZlbnRfcGVuZGluZygmaWQtPmZoKSkKKwkJcmVzIHw9IFBPTExQUkk7CisJZWxzZQorCQlwb2xsX3dhaXQoZmlscCwgJmlkLT5maC53YWl0LCB3YWl0KTsKIAogCWlmIChzLT5xX2Z1bGwubGVuZ3RoIHx8IHMtPnFfaW8ubGVuZ3RoKQotCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKKwkJcmV0dXJuIHJlcyB8IFBPTExJTiB8IFBPTExSRE5PUk07CiAJaWYgKGVvZikKLQkJcmV0dXJuIFBPTExIVVA7Ci0JcmV0dXJuIDA7CisJCXJldHVybiByZXMgfCBQT0xMSFVQOworCXJldHVybiByZXM7CiB9CiAKIHZvaWQgaXZ0dl9zdG9wX2NhcHR1cmUoc3RydWN0IGl2dHZfb3Blbl9pZCAqaWQsIGludCBnb3BfZW5kKQpAQCAtOTYxLDEwICs5NjYsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJdjRsMl9maF9pbml0KCZpdGVtLT5maCwgcy0+dmRldik7Ci0JaWYgKHMtPnR5cGUgPT0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfWVVWIHx8Ci0JICAgIHMtPnR5cGUgPT0gSVZUVl9ERUNfU1RSRUFNX1RZUEVfTVBHKSB7Ci0JCXJlcyA9IHY0bDJfZXZlbnRfYWxsb2MoJml0ZW0tPmZoLCA2MCk7Ci0JfQogCWlmIChyZXMgPCAwKSB7CiAJCXY0bDJfZmhfZXhpdCgmaXRlbS0+ZmgpOwogCQlrZnJlZShpdGVtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWlvY3RsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pb2N0bC5jCmluZGV4IDEyMGM3ZDguLjNlNWMwOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWlvY3RsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaW9jdGwuYwpAQCAtNzU3LDcgKzc1Nyw2IEBACiAJc3RybGNweSh2Y2FwLT5kcml2ZXIsIElWVFZfRFJJVkVSX05BTUUsIHNpemVvZih2Y2FwLT5kcml2ZXIpKTsKIAlzdHJsY3B5KHZjYXAtPmNhcmQsIGl0di0+Y2FyZF9uYW1lLCBzaXplb2YodmNhcC0+Y2FyZCkpOwogCXNucHJpbnRmKHZjYXAtPmJ1c19pbmZvLCBzaXplb2YodmNhcC0+YnVzX2luZm8pLCAiUENJOiVzIiwgcGNpX25hbWUoaXR2LT5wZGV2KSk7Ci0JdmNhcC0+dmVyc2lvbiA9IElWVFZfRFJJVkVSX1ZFUlNJT047IAkgICAgLyogdmVyc2lvbiAqLwogCXZjYXAtPmNhcGFiaWxpdGllcyA9IGl0di0+djRsMl9jYXA7IAkgICAgLyogY2FwYWJpbGl0aWVzICovCiAJcmV0dXJuIDA7CiB9CkBAIC0xNDUxLDExICsxNDUwLDExIEBACiAJc3dpdGNoIChzdWItPnR5cGUpIHsKIAljYXNlIFY0TDJfRVZFTlRfVlNZTkM6CiAJY2FzZSBWNEwyX0VWRU5UX0VPUzoKLQkJYnJlYWs7CisJY2FzZSBWNEwyX0VWRU5UX0NUUkw6CisJCXJldHVybiB2NGwyX2V2ZW50X3N1YnNjcmliZShmaCwgc3ViLCAwKTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JcmV0dXJuIHY0bDJfZXZlbnRfc3Vic2NyaWJlKGZoLCBzdWIpOwogfQogCiBzdGF0aWMgaW50IGl2dHZfbG9nX3N0YXR1cyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di12ZXJzaW9uLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di12ZXJzaW9uLmgKaW5kZXggYjY3YTQwNC4uYTIwZjM0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXZlcnNpb24uaApAQCAtMjEsMTEgKzIxLDYgQEAKICNkZWZpbmUgSVZUVl9WRVJTSU9OX0gKIAogI2RlZmluZSBJVlRWX0RSSVZFUl9OQU1FICJpdnR2IgotI2RlZmluZSBJVlRWX0RSSVZFUl9WRVJTSU9OX01BSk9SIDEKLSNkZWZpbmUgSVZUVl9EUklWRVJfVkVSU0lPTl9NSU5PUiA0Ci0jZGVmaW5lIElWVFZfRFJJVkVSX1ZFUlNJT05fUEFUQ0hMRVZFTCAyCi0KLSNkZWZpbmUgSVZUVl9WRVJTSU9OIF9fc3RyaW5naWZ5KElWVFZfRFJJVkVSX1ZFUlNJT05fTUFKT1IpICIuIiBfX3N0cmluZ2lmeShJVlRWX0RSSVZFUl9WRVJTSU9OX01JTk9SKSAiLiIgX19zdHJpbmdpZnkoSVZUVl9EUklWRVJfVkVSU0lPTl9QQVRDSExFVkVMKQotI2RlZmluZSBJVlRWX0RSSVZFUl9WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKElWVFZfRFJJVkVSX1ZFUlNJT05fTUFKT1IsSVZUVl9EUklWRVJfVkVSU0lPTl9NSU5PUixJVlRWX0RSSVZFUl9WRVJTSU9OX1BBVENITEVWRUwpCisjZGVmaW5lIElWVFZfVkVSU0lPTiAiMS40LjMiCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzX2NhcHR1cmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9sc19jYXB0dXJlLmMKaW5kZXggYTQ1ZDhmMC4uMzI0OGFjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzX2NhcHR1cmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY2FwdHVyZS5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9sc19jb3JlLmMKaW5kZXggNDNjNjhmNS4uZmI4ZTRhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY29yZS5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWFydmVsbC1jY2ljL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY3MzllMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWFydmVsbC1jY2ljL0tjb25maWcKQEAgLTAsMCArMSwyMyBAQAorY29uZmlnIFZJREVPX0NBRkVfQ0NJQworCXRyaXN0YXRlICJNYXJ2ZWxsIDg4QUxQMDEgKENhZmUpIENNT1MgQ2FtZXJhIENvbnRyb2xsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSSAmJiBJMkMgJiYgVklERU9fVjRMMgorCXNlbGVjdCBWSURFT19PVjc2NzAKKwlzZWxlY3QgVklERU9CVUYyX1ZNQUxMT0MKKwlzZWxlY3QgVklERU9CVUYyX0RNQV9DT05USUcKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgdmlkZW80bGludXgyIGRyaXZlciBmb3IgdGhlIE1hcnZlbGwgODhBTFAwMSBpbnRlZ3JhdGVkCisJICBDTU9TIGNhbWVyYSBjb250cm9sbGVyLiAgVGhpcyBpcyB0aGUgY29udHJvbGxlciBmb3VuZCBvbiBmaXJzdC0KKwkgIGdlbmVyYXRpb24gT0xQQyBzeXN0ZW1zLgorCitjb25maWcgVklERU9fTU1QX0NBTUVSQQorCXRyaXN0YXRlICJNYXJ2ZWxsIEFybWFkYSA2MTAgaW50ZWdyYXRlZCBjYW1lcmEgY29udHJvbGxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9NTVAgJiYgSTJDICYmIFZJREVPX1Y0TDIKKwlzZWxlY3QgVklERU9fT1Y3NjcwCisJc2VsZWN0IEkyQ19HUElPCisJc2VsZWN0IFZJREVPQlVGMl9ETUFfU0cKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGEgVmlkZW80TGludXgyIGRyaXZlciBmb3IgdGhlIGludGVncmF0ZWQgY2FtZXJhCisJICBjb250cm9sbGVyIGZvdW5kIG9uIE1hcnZlbGwgQXJtYWRhIDYxMCBhcHBsaWNhdGlvbgorCSAgcHJvY2Vzc29ycyAoYW5kIGxpa2VseSBiZXlvbmQpLiAgVGhpcyBpcyB0aGUgY29udHJvbGxlciBmb3VuZAorCSAgaW4gT0xQQyBYTyAxLjc1IHN5c3RlbXMuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWFydmVsbC1jY2ljL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhNzkyYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWFydmVsbC1jY2ljL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorb2JqLSQoQ09ORklHX1ZJREVPX0NBRkVfQ0NJQykgKz0gY2FmZV9jY2ljLm8KK2NhZmVfY2NpYy15IDo9IGNhZmUtZHJpdmVyLm8gbWNhbS1jb3JlLm8KKworb2JqLSQoQ09ORklHX1ZJREVPX01NUF9DQU1FUkEpICs9IG1tcF9jYW1lcmEubworbW1wX2NhbWVyYS15IDo9IG1tcC1kcml2ZXIubyBtY2FtLWNvcmUubworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9jYWZlLWRyaXZlci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvY2FmZS1kcml2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDMwZjliCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvY2FmZS1kcml2ZXIuYwpAQCAtMCwwICsxLDY1NCBAQAorLyoKKyAqIEEgZHJpdmVyIGZvciB0aGUgQ01PUyBjYW1lcmEgY29udHJvbGxlciBpbiB0aGUgTWFydmVsbCA4OEFMUDAxICJjYWZlIgorICogbXVsdGlmdW5jdGlvbiBjaGlwLiAgQ3VycmVudGx5IHdvcmtzIHdpdGggdGhlIE9tbml2aXNpb24gT1Y3NjcwCisgKiBzZW5zb3IuCisgKgorICogVGhlIGRhdGEgc2hlZXQgZm9yIHRoaXMgZGV2aWNlIGNhbiBiZSBmb3VuZCBhdDoKKyAqICAgIGh0dHA6Ly93d3cubWFydmVsbC5jb20vcHJvZHVjdHMvcGNfY29ubmVjdGl2aXR5Lzg4YWxwMDEvCisgKgorICogQ29weXJpZ2h0IDIwMDYtMTEgT25lIExhcHRvcCBQZXIgQ2hpbGQgQXNzb2NpYXRpb24sIEluYy4KKyAqIENvcHlyaWdodCAyMDA2LTExIEpvbmF0aGFuIENvcmJldCA8Y29yYmV0QGx3bi5uZXQ+CisgKgorICogV3JpdHRlbiBieSBKb25hdGhhbiBDb3JiZXQsIGNvcmJldEBsd24ubmV0LgorICoKKyAqIHY0bDJfZGV2aWNlL3Y0bDJfc3ViZGV2IGNvbnZlcnNpb24gYnk6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisgKgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgIm1jYW0tY29yZS5oIgorCisjZGVmaW5lIENBRkVfVkVSU0lPTiAweDAwMDAwMgorCisKKy8qCisgKiBQYXJhbWV0ZXJzLgorICovCitNT0RVTEVfQVVUSE9SKCJKb25hdGhhbiBDb3JiZXQgPGNvcmJldEBsd24ubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXJ2ZWxsIDg4QUxQMDEgQ01PUyBDYW1lcmEgQ29udHJvbGxlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJWaWRlbyIpOworCisKKworCitzdHJ1Y3QgY2FmZV9jYW1lcmEgeworCWludCByZWdpc3RlcmVkOwkJCS8qIEZ1bGx5IGluaXRpYWxpemVkPyAqLworCXN0cnVjdCBtY2FtX2NhbWVyYSBtY2FtOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXdhaXRfcXVldWVfaGVhZF90IHNtYnVzX3dhaXQ7CS8qIFdhaXRpbmcgb24gaTJjIGV2ZW50cyAqLworfTsKKworLyoKKyAqIE1vc3Qgb2YgdGhlIGNhbWVyYSBjb250cm9sbGVyIHJlZ2lzdGVycyBhcmUgZGVmaW5lZCBpbiBtY2FtLWNvcmUuaCwKKyAqIGJ1dCB0aGUgQ2FmZSBwbGF0Zm9ybSBoYXMgc29tZSBhZGRpdGlvbmFsIHJlZ2lzdGVycyBvZiBpdHMgb3duOworICogdGhleSBhcmUgZGVzY3JpYmVkIGhlcmUuCisgKi8KKworLyoKKyAqICJHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIiIGhhcyBhIGNvdXBsZSBvZiBHUElPcyB1c2VkIGZvciBzZW5zb3IKKyAqIHBvd2VyIGFuZCByZXNldCBvbiBPTFBDIFhPIDEuMCBzeXN0ZW1zLgorICovCisjZGVmaW5lIFJFR19HUFIJCTB4YjQKKyNkZWZpbmUJICBHUFJfQzFFTgkgIDB4MDAwMDAwMjAJLyogUGFkIDEgKHBvd2VyIGRvd24pIGVuYWJsZSAqLworI2RlZmluZQkgIEdQUl9DMEVOCSAgMHgwMDAwMDAxMAkvKiBQYWQgMCAocmVzZXQpIGVuYWJsZSAqLworI2RlZmluZQkgIEdQUl9DMQkgIDB4MDAwMDAwMDIJLyogQ29udHJvbCAxIHZhbHVlICovCisvKgorICogQ29udHJvbCAwIGlzIHdpcmVkIHRvIHJlc2V0IG9uIE9MUEMgbWFjaGluZXMuICBGb3Igb3Y3eCBzZW5zb3JzLAorICogaXQgaXMgYWN0aXZlIGxvdy4KKyAqLworI2RlZmluZQkgIEdQUl9DMAkgIDB4MDAwMDAwMDEJLyogQ29udHJvbCAwIHZhbHVlICovCisKKy8qCisgKiBUaGVzZSByZWdpc3RlcnMgY29udHJvbCB0aGUgU01CVVMgbW9kdWxlIGZvciBjb21tdW5pY2F0aW5nCisgKiB3aXRoIHRoZSBzZW5zb3IuCisgKi8KKyNkZWZpbmUgUkVHX1RXU0lDMAkweGI4CS8qIFRXU0kgKHNtYnVzKSBjb250cm9sIDAgKi8KKyNkZWZpbmUJICBUV1NJQzBfRU4JICAweDAwMDAwMDAxCS8qIFRXU0kgZW5hYmxlICovCisjZGVmaW5lCSAgVFdTSUMwX01PREUJICAweDAwMDAwMDAyCS8qIDEgPSAxNi1iaXQsIDAgPSA4LWJpdCAqLworI2RlZmluZQkgIFRXU0lDMF9TSUQJICAweDAwMDAwM2ZjCS8qIFNsYXZlIElEICovCisvKgorICogU3VidGxlIHRyaWNrZXJ5OiB0aGUgc2xhdmUgSUQgZmllbGQgc3RhcnRzIHdpdGggYml0IDIuICBCdXQgdGhlCisgKiBMaW51eCBpMmMgc3RhY2sgd2FudHMgdG8gdHJlYXQgdGhlIGJvdHRvbW1vc3QgYml0IGFzIGEgc2VwYXJhdGUKKyAqIHJlYWQvd3JpdGUgYml0LCB3aGljaCBpcyB3aHkgc2xhdmUgSUQncyBhcmUgdXN1YWxseSBwcmVzZW50ZWQKKyAqID4+MS4gIEZvciBjb25zaXN0ZW5jeSB3aXRoIHRoYXQgYmVoYXZpb3IsIHdlIHNoaWZ0IG92ZXIgdGhyZWUKKyAqIGJpdHMgaW5zdGVhZCBvZiB0d28uCisgKi8KKyNkZWZpbmUJICBUV1NJQzBfU0lEX1NISUZUIDMKKyNkZWZpbmUJICBUV1NJQzBfQ0xLRElWCSAgMHgwMDA3ZmMwMAkvKiBDbG9jayBkaXZpZGVyICovCisjZGVmaW5lCSAgVFdTSUMwX01BU0tBQ0sgIDB4MDA0MDAwMDAJLyogTWFzayBhY2sgZnJvbSBzZW5zb3IgKi8KKyNkZWZpbmUJICBUV1NJQzBfT1ZNQUdJQyAgMHgwMDgwMDAwMAkvKiBNYWtlIGl0IHdvcmsgb24gT1Ygc2Vuc29ycyAqLworCisjZGVmaW5lIFJFR19UV1NJQzEJMHhiYwkvKiBUV1NJIGNvbnRyb2wgMSAqLworI2RlZmluZQkgIFRXU0lDMV9EQVRBCSAgMHgwMDAwZmZmZgkvKiBEYXRhIHRvL2Zyb20gY2FtY2hpcCAqLworI2RlZmluZQkgIFRXU0lDMV9BRERSCSAgMHgwMGZmMDAwMAkvKiBBZGRyZXNzIChyZWdpc3RlcikgKi8KKyNkZWZpbmUJICBUV1NJQzFfQUREUl9TSElGVCAxNgorI2RlZmluZQkgIFRXU0lDMV9SRUFECSAgMHgwMTAwMDAwMAkvKiBTZXQgZm9yIHJlYWQgb3AgKi8KKyNkZWZpbmUJICBUV1NJQzFfV1NUQVQJICAweDAyMDAwMDAwCS8qIFdyaXRlIHN0YXR1cyAqLworI2RlZmluZQkgIFRXU0lDMV9SVkFMSUQJICAweDA0MDAwMDAwCS8qIFJlYWQgZGF0YSB2YWxpZCAqLworI2RlZmluZQkgIFRXU0lDMV9FUlJPUgkgIDB4MDgwMDAwMDAJLyogU29tZXRoaW5nIHNjcmV3ZWQgdXAgKi8KKworLyoKKyAqIEhlcmUncyB0aGUgd2VpcmQgZ2xvYmFsIGNvbnRyb2wgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgUkVHX0dMX0NTUiAgICAgMHgzMDA0ICAvKiBDb250cm9sL3N0YXR1cyByZWdpc3RlciAqLworI2RlZmluZQkgIEdDU1JfU1JTCSAweDAwMDAwMDAxCS8qIFNXIFJlc2V0IHNldCAqLworI2RlZmluZQkgIEdDU1JfU1JDCSAweDAwMDAwMDAyCS8qIFNXIFJlc2V0IGNsZWFyICovCisjZGVmaW5lCSAgR0NTUl9NUlMJIDB4MDAwMDAwMDQJLyogTWFzdGVyIHJlc2V0IHNldCAqLworI2RlZmluZQkgIEdDU1JfTVJDCSAweDAwMDAwMDA4CS8qIEhXIFJlc2V0IGNsZWFyICovCisjZGVmaW5lCSAgR0NTUl9DQ0lDX0VOCSAweDAwMDA0MDAwICAgIC8qIENDSUMgQ2xvY2sgZW5hYmxlICovCisjZGVmaW5lIFJFR19HTF9JTUFTSyAgIDB4MzAwYyAgLyogSW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJICBHSU1TS19DQ0lDX0VOCQkgMHgwMDAwMDAwNCAgICAvKiBDQ0lDIEludGVycnVwdCBlbmFibGUgKi8KKworI2RlZmluZSBSRUdfR0xfRkNSCTB4MzAzOAkvKiBHUElPIGZ1bmN0aW9uYWwgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZQkgIEdGQ1JfR1BJT19PTgkgIDB4MDgJCS8qIENhbWVyYSBHUElPIGVuYWJsZWQgKi8KKyNkZWZpbmUgUkVHX0dMX0dQSU9SCTB4MzE1YwkvKiBHUElPIHJlZ2lzdGVyICovCisjZGVmaW5lCSAgR0dQSU9fT1VUCQkweDgwMDAwCS8qIEdQSU8gb3V0cHV0ICovCisjZGVmaW5lCSAgR0dQSU9fVkFMCQkweDAwMDA4CS8qIE91dHB1dCBwaW4gdmFsdWUgKi8KKworI2RlZmluZSBSRUdfTEVOCQkgICAgICAgKFJFR19HTF9JTUFTSyArIDQpCisKKworLyoKKyAqIERlYnVnZ2luZyBhbmQgcmVsYXRlZC4KKyAqLworI2RlZmluZSBjYW1fZXJyKGNhbSwgZm10LCBhcmcuLi4pIFwKKwlkZXZfZXJyKCYoY2FtKS0+cGRldi0+ZGV2LCBmbXQsICMjYXJnKTsKKyNkZWZpbmUgY2FtX3dhcm4oY2FtLCBmbXQsIGFyZy4uLikgXAorCWRldl93YXJuKCYoY2FtKS0+cGRldi0+ZGV2LCBmbXQsICMjYXJnKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBUaGUgSTJDL1NNQlVTIGludGVyZmFjZSB0byB0aGUgY2FtZXJhIGl0c2VsZiBzdGFydHMgaGVyZS4gIFRoZQorICogY29udHJvbGxlciBoYW5kbGVzIFNNQlVTIGl0c2VsZiwgcHJlc2VudGluZyBhIHJlbGF0aXZlbHkgc2ltcGxlIHJlZ2lzdGVyCisgKiBpbnRlcmZhY2U7IGFsbCB3ZSBoYXZlIHRvIGRvIGlzIHRvIHRlbGwgaXQgd2hlcmUgdG8gcm91dGUgdGhlIGRhdGEuCisgKi8KKyNkZWZpbmUgQ0FGRV9TTUJVU19USU1FT1VUIChIWikgIC8qIGdlbmVyb3VzICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNhZmVfY2FtZXJhICp0b19jYW0oc3RydWN0IHY0bDJfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICptID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IG1jYW1fY2FtZXJhLCB2NGwyX2Rldik7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihtLCBzdHJ1Y3QgY2FmZV9jYW1lcmEsIG1jYW0pOworfQorCisKK3N0YXRpYyBpbnQgY2FmZV9zbWJ1c193cml0ZV9kb25lKHN0cnVjdCBtY2FtX2NhbWVyYSAqbWNhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjMTsKKworCS8qCisJICogV2UgbXVzdCBkZWxheSBhZnRlciB0aGUgaW50ZXJydXB0LCBvciB0aGUgY29udHJvbGxlciBnZXRzIGNvbmZ1c2VkCisJICogYW5kIG5ldmVyIGRvZXMgZ2l2ZSB1cyBnb29kIHN0YXR1cy4gIEZvcnR1bmF0ZWx5LCB3ZSBkb24ndCBkbyB0aGlzCisJICogb2Z0ZW4uCisJICovCisJdWRlbGF5KDIwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwljMSA9IG1jYW1fcmVnX3JlYWQobWNhbSwgUkVHX1RXU0lDMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gKGMxICYgKFRXU0lDMV9XU1RBVHxUV1NJQzFfRVJST1IpKSAhPSBUV1NJQzFfV1NUQVQ7Cit9CisKK3N0YXRpYyBpbnQgY2FmZV9zbWJ1c193cml0ZV9kYXRhKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLAorCQl1MTYgYWRkciwgdTggY29tbWFuZCwgdTggdmFsdWUpCit7CisJdW5zaWduZWQgaW50IHJ2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKm1jYW0gPSAmY2FtLT5tY2FtOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1jYW0tPmRldl9sb2NrLCBmbGFncyk7CisJcnZhbCA9IFRXU0lDMF9FTiB8ICgoYWRkciA8PCBUV1NJQzBfU0lEX1NISUZUKSAmIFRXU0lDMF9TSUQpOworCXJ2YWwgfD0gVFdTSUMwX09WTUFHSUM7ICAvKiBNYWtlIE9WIHNlbnNvcnMgd29yayAqLworCS8qCisJICogTWFydmVsbCBzZXogc2V0IGNsa2RpdiB0byBhbGwgMSdzIGZvciBub3cuCisJICovCisJcnZhbCB8PSBUV1NJQzBfQ0xLRElWOworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19UV1NJQzAsIHJ2YWwpOworCSh2b2lkKSBtY2FtX3JlZ19yZWFkKG1jYW0sIFJFR19UV1NJQzEpOyAvKiBmb3JjZSB3cml0ZSAqLworCXJ2YWwgPSB2YWx1ZSB8ICgoY29tbWFuZCA8PCBUV1NJQzFfQUREUl9TSElGVCkgJiBUV1NJQzFfQUREUik7CisJbWNhbV9yZWdfd3JpdGUobWNhbSwgUkVHX1RXU0lDMSwgcnZhbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKworCS8qIFVuZm9ydHVuYXRlbHksIHJlYWRpbmcgVFdTSUMxIHRvbyBzb29uIGFmdGVyIHNlbmRpbmcgYSBjb21tYW5kCisJICogY2F1c2VzIHRoZSBkZXZpY2UgdG8gZGllLgorCSAqIFVzZSBhIGJ1c3ktd2FpdCBiZWNhdXNlIHdlIG9mdGVuIHNlbmQgYSBsYXJnZSBxdWFudGl0eSBvZiBzbWFsbAorCSAqIGNvbW1hbmRzIGF0LW9uY2U7IHVzaW5nIG1zbGVlcCgpIHdvdWxkIGNhdXNlIGEgbG90IG9mIGNvbnRleHQKKwkgKiBzd2l0Y2hlcyB3aGljaCB0YWtlIGxvbmdlciB0aGFuIDJtcywgcmVzdWx0aW5nIGluIGEgbm90aWNlYWJsZQorCSAqIGJvb3QtdGltZSBhbmQgY2FwdHVyZS1zdGFydCBkZWxheXMuCisJICovCisJbWRlbGF5KDIpOworCisJLyoKKwkgKiBBbm90aGVyIHNhZCBmYWN0IGlzIHRoYXQgc29tZXRpbWVzLCBjb21tYW5kcyBzaWxlbnRseSBjb21wbGV0ZSBidXQKKwkgKiBjYWZlX3NtYnVzX3dyaXRlX2RvbmUoKSBuZXZlciBiZWNvbWVzIGF3YXJlIG9mIHRoaXMuCisJICogVGhpcyBoYXBwZW5zIGF0IHJhbmRvbSBhbmQgYXBwZWFycyB0byBwb3NzaWJsZSBvY2N1ciB3aXRoIGFueQorCSAqIGNvbW1hbmQuCisJICogV2UgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgdGhpcyBpcy4gV2Ugd29yayBhcm91bmQgdGhpcyBpc3N1ZQorCSAqIHdpdGggdGhlIHRpbWVvdXQgaW4gdGhlIHdhaXQgYmVsb3csIGFzc3VtaW5nIHRoYXQgYWxsIGNvbW1hbmRzCisJICogY29tcGxldGUgd2l0aGluIHRoZSB0aW1lb3V0LgorCSAqLworCXdhaXRfZXZlbnRfdGltZW91dChjYW0tPnNtYnVzX3dhaXQsIGNhZmVfc21idXNfd3JpdGVfZG9uZShtY2FtKSwKKwkJCUNBRkVfU01CVVNfVElNRU9VVCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlydmFsID0gbWNhbV9yZWdfcmVhZChtY2FtLCBSRUdfVFdTSUMxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCisJaWYgKHJ2YWwgJiBUV1NJQzFfV1NUQVQpIHsKKwkJY2FtX2VycihjYW0sICJTTUJVUyB3cml0ZSAoJTAyeC8lMDJ4LyUwMngpIHRpbWVkIG91dFxuIiwgYWRkciwKKwkJCQljb21tYW5kLCB2YWx1ZSk7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAocnZhbCAmIFRXU0lDMV9FUlJPUikgeworCQljYW1fZXJyKGNhbSwgIlNNQlVTIHdyaXRlICglMDJ4LyUwMngvJTAyeCkgZXJyb3JcbiIsIGFkZHIsCisJCQkJY29tbWFuZCwgdmFsdWUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IGNhZmVfc21idXNfcmVhZF9kb25lKHN0cnVjdCBtY2FtX2NhbWVyYSAqbWNhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjMTsKKworCS8qCisJICogV2UgbXVzdCBkZWxheSBhZnRlciB0aGUgaW50ZXJydXB0LCBvciB0aGUgY29udHJvbGxlciBnZXRzIGNvbmZ1c2VkCisJICogYW5kIG5ldmVyIGRvZXMgZ2l2ZSB1cyBnb29kIHN0YXR1cy4gIEZvcnR1bmF0ZWx5LCB3ZSBkb24ndCBkbyB0aGlzCisJICogb2Z0ZW4uCisJICovCisJdWRlbGF5KDIwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwljMSA9IG1jYW1fcmVnX3JlYWQobWNhbSwgUkVHX1RXU0lDMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gYzEgJiAoVFdTSUMxX1JWQUxJRHxUV1NJQzFfRVJST1IpOworfQorCisKKworc3RhdGljIGludCBjYWZlX3NtYnVzX3JlYWRfZGF0YShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSwKKwkJdTE2IGFkZHIsIHU4IGNvbW1hbmQsIHU4ICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgcnZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBtY2FtX2NhbWVyYSAqbWNhbSA9ICZjYW0tPm1jYW07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlydmFsID0gVFdTSUMwX0VOIHwgKChhZGRyIDw8IFRXU0lDMF9TSURfU0hJRlQpICYgVFdTSUMwX1NJRCk7CisJcnZhbCB8PSBUV1NJQzBfT1ZNQUdJQzsgLyogTWFrZSBPViBzZW5zb3JzIHdvcmsgKi8KKwkvKgorCSAqIE1hcnZlbCBzZXogc2V0IGNsa2RpdiB0byBhbGwgMSdzIGZvciBub3cuCisJICovCisJcnZhbCB8PSBUV1NJQzBfQ0xLRElWOworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19UV1NJQzAsIHJ2YWwpOworCSh2b2lkKSBtY2FtX3JlZ19yZWFkKG1jYW0sIFJFR19UV1NJQzEpOyAvKiBmb3JjZSB3cml0ZSAqLworCXJ2YWwgPSBUV1NJQzFfUkVBRCB8ICgoY29tbWFuZCA8PCBUV1NJQzFfQUREUl9TSElGVCkgJiBUV1NJQzFfQUREUik7CisJbWNhbV9yZWdfd3JpdGUobWNhbSwgUkVHX1RXU0lDMSwgcnZhbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKworCXdhaXRfZXZlbnRfdGltZW91dChjYW0tPnNtYnVzX3dhaXQsCisJCQljYWZlX3NtYnVzX3JlYWRfZG9uZShtY2FtKSwgQ0FGRV9TTUJVU19USU1FT1VUKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlydmFsID0gbWNhbV9yZWdfcmVhZChtY2FtLCBSRUdfVFdTSUMxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCisJaWYgKHJ2YWwgJiBUV1NJQzFfRVJST1IpIHsKKwkJY2FtX2VycihjYW0sICJTTUJVUyByZWFkICglMDJ4LyUwMngpIGVycm9yXG4iLCBhZGRyLCBjb21tYW5kKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICghKHJ2YWwgJiBUV1NJQzFfUlZBTElEKSkgeworCQljYW1fZXJyKGNhbSwgIlNNQlVTIHJlYWQgKCUwMngvJTAyeCkgdGltZWQgb3V0XG4iLCBhZGRyLAorCQkJCWNvbW1hbmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJKnZhbHVlID0gcnZhbCAmIDB4ZmY7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQZXJmb3JtIGEgdHJhbnNmZXIgb3ZlciBTTUJVUy4gIFRoaXMgdGhpbmcgaXMgY2FsbGVkIHVuZGVyCisgKiB0aGUgaTJjIGJ1cyBsb2NrLCBzbyB3ZSBzaG91bGRuJ3QgcmFjZSB3aXRoIG91cnNlbHZlcy4uLgorICovCitzdGF0aWMgaW50IGNhZmVfc21idXNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBhZGRyLAorCQl1bnNpZ25lZCBzaG9ydCBmbGFncywgY2hhciBydywgdTggY29tbWFuZCwKKwkJaW50IHNpemUsIHVuaW9uIGkyY19zbWJ1c19kYXRhICpkYXRhKQoreworCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gaTJjX2dldF9hZGFwZGF0YShhZGFwdGVyKTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCS8qCisJICogVGhpcyBpbnRlcmZhY2Ugd291bGQgYXBwZWFyIHRvIG9ubHkgZG8gYnl0ZSBkYXRhIG9wcy4gIE9LCisJICogaXQgY2FuIGRvIHdvcmQgdG9vLCBidXQgdGhlIGNhbSBjaGlwIGhhcyBubyB1c2UgZm9yIHRoYXQuCisJICovCisJaWYgKHNpemUgIT0gSTJDX1NNQlVTX0JZVEVfREFUQSkgeworCQljYW1fZXJyKGNhbSwgImZ1bmt5IHhmZXIgc2l6ZSAlZFxuIiwgc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChydyA9PSBJMkNfU01CVVNfV1JJVEUpCisJCXJldCA9IGNhZmVfc21idXNfd3JpdGVfZGF0YShjYW0sIGFkZHIsIGNvbW1hbmQsIGRhdGEtPmJ5dGUpOworCWVsc2UgaWYgKHJ3ID09IEkyQ19TTUJVU19SRUFEKQorCQlyZXQgPSBjYWZlX3NtYnVzX3JlYWRfZGF0YShjYW0sIGFkZHIsIGNvbW1hbmQsICZkYXRhLT5ieXRlKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkIGNhZmVfc21idXNfZW5hYmxlX2lycShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+bWNhbS5kZXZfbG9jaywgZmxhZ3MpOworCW1jYW1fcmVnX3NldF9iaXQoJmNhbS0+bWNhbSwgUkVHX0lSUU1BU0ssIFRXU0lJUlFTKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPm1jYW0uZGV2X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHUzMiBjYWZlX3NtYnVzX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEVfREFUQSAgfAorCSAgICAgICBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBjYWZlX3NtYnVzX2FsZ28gPSB7CisJLnNtYnVzX3hmZXIgPSBjYWZlX3NtYnVzX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkgPSBjYWZlX3NtYnVzX2Z1bmMKK307CisKK3N0YXRpYyBpbnQgY2FmZV9zbWJ1c19zZXR1cChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXA7CisJaW50IHJldDsKKworCWFkYXAgPSBremFsbG9jKHNpemVvZigqYWRhcCksIEdGUF9LRVJORUwpOworCWlmIChhZGFwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWNhbS0+bWNhbS5pMmNfYWRhcHRlciA9IGFkYXA7CisJY2FmZV9zbWJ1c19lbmFibGVfaXJxKGNhbSk7CisJYWRhcC0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlhZGFwLT5hbGdvID0gJmNhZmVfc21idXNfYWxnbzsKKwlzdHJjcHkoYWRhcC0+bmFtZSwgImNhZmVfY2NpYyIpOworCWFkYXAtPmRldi5wYXJlbnQgPSAmY2FtLT5wZGV2LT5kZXY7CisJaTJjX3NldF9hZGFwZGF0YShhZGFwLCBjYW0pOworCXJldCA9IGkyY19hZGRfYWRhcHRlcihhZGFwKTsKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZWdpc3RlciBjYWZlIGkyYyBhZGFwdGVyXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBjYWZlX3NtYnVzX3NodXRkb3duKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQoreworCWkyY19kZWxfYWRhcHRlcihjYW0tPm1jYW0uaTJjX2FkYXB0ZXIpOworCWtmcmVlKGNhbS0+bWNhbS5pMmNfYWRhcHRlcik7Cit9CisKKworLyoKKyAqIENvbnRyb2xsZXItbGV2ZWwgc3R1ZmYKKyAqLworCitzdGF0aWMgdm9pZCBjYWZlX2N0bHJfaW5pdChzdHJ1Y3QgbWNhbV9jYW1lcmEgKm1jYW0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCS8qCisJICogQWRkZWQgbWFnaWMgdG8gYnJpbmcgdXAgdGhlIGhhcmR3YXJlIG9uIHRoZSBCLVRlc3QgYm9hcmQKKwkgKi8KKwltY2FtX3JlZ193cml0ZShtY2FtLCAweDMwMzgsIDB4OCk7CisJbWNhbV9yZWdfd3JpdGUobWNhbSwgMHgzMTVjLCAweDgwMDA4KTsKKwkvKgorCSAqIEdvIHRocm91Z2ggdGhlIGRhbmNlIG5lZWRlZCB0byB3YWtlIHRoZSBkZXZpY2UgdXAuCisJICogTm90ZSB0aGF0IHRoZXNlIHJlZ2lzdGVycyBhcmUgZ2xvYmFsIGFuZCBzaGFyZWQKKwkgKiB3aXRoIHRoZSBOQU5EIGFuZCBTRCBkZXZpY2VzLiAgSW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUKKwkgKiB0aHJlZSBzdGlsbCBuZWVkcyB0byBiZSBleGFtaW5lZC4KKwkgKi8KKwltY2FtX3JlZ193cml0ZShtY2FtLCBSRUdfR0xfQ1NSLCBHQ1NSX1NSU3xHQ1NSX01SUyk7IC8qIE5lZWRlZD8gKi8KKwltY2FtX3JlZ193cml0ZShtY2FtLCBSRUdfR0xfQ1NSLCBHQ1NSX1NSQ3xHQ1NSX01SQyk7CisJbWNhbV9yZWdfd3JpdGUobWNhbSwgUkVHX0dMX0NTUiwgR0NTUl9TUkN8R0NTUl9NUlMpOworCS8qCisJICogSGVyZSB3ZSBtdXN0IHdhaXQgYSBiaXQgZm9yIHRoZSBjb250cm9sbGVyIHRvIGNvbWUgYXJvdW5kLgorCSAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1jYW0tPmRldl9sb2NrLCBmbGFncyk7CisJbXNsZWVwKDUpOworCXNwaW5fbG9ja19pcnFzYXZlKCZtY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCisJbWNhbV9yZWdfd3JpdGUobWNhbSwgUkVHX0dMX0NTUiwgR0NTUl9DQ0lDX0VOfEdDU1JfU1JDfEdDU1JfTVJDKTsKKwltY2FtX3JlZ19zZXRfYml0KG1jYW0sIFJFR19HTF9JTUFTSywgR0lNU0tfQ0NJQ19FTik7CisJLyoKKwkgKiBNYXNrIGFsbCBpbnRlcnJ1cHRzLgorCSAqLworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19JUlFNQVNLLCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIGNhZmVfY3Rscl9wb3dlcl91cChzdHJ1Y3QgbWNhbV9jYW1lcmEgKm1jYW0pCit7CisJLyoKKwkgKiBQYXJ0IG9uZSBvZiB0aGUgc2Vuc29yIGRhbmNlOiB0dXJuIHRoZSBnbG9iYWwKKwkgKiBHUElPIHNpZ25hbCBvbi4KKwkgKi8KKwltY2FtX3JlZ193cml0ZShtY2FtLCBSRUdfR0xfRkNSLCBHRkNSX0dQSU9fT04pOworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19HTF9HUElPUiwgR0dQSU9fT1VUfEdHUElPX1ZBTCk7CisJLyoKKwkgKiBQdXQgdGhlIHNlbnNvciBpbnRvIG9wZXJhdGlvbmFsIG1vZGUgKGFzc3VtZXMgT0xQQy1zdHlsZQorCSAqIHdpcmluZykuICBDb250cm9sIDAgaXMgcmVzZXQgLSBzZXQgdG8gMSB0byBvcGVyYXRlLgorCSAqIENvbnRyb2wgMSBpcyBwb3dlciBkb3duLCBzZXQgdG8gMCB0byBvcGVyYXRlLgorCSAqLworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19HUFIsIEdQUl9DMUVOfEdQUl9DMEVOKTsgLyogcHdyIHVwLCByZXNldCAqLworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19HUFIsIEdQUl9DMUVOfEdQUl9DMEVOfEdQUl9DMCk7Cit9CisKK3N0YXRpYyB2b2lkIGNhZmVfY3Rscl9wb3dlcl9kb3duKHN0cnVjdCBtY2FtX2NhbWVyYSAqbWNhbSkKK3sKKwltY2FtX3JlZ193cml0ZShtY2FtLCBSRUdfR1BSLCBHUFJfQzFFTnxHUFJfQzBFTnxHUFJfQzEpOworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19HTF9GQ1IsIEdGQ1JfR1BJT19PTik7CisJbWNhbV9yZWdfd3JpdGUobWNhbSwgUkVHX0dMX0dQSU9SLCBHR1BJT19PVVQpOworfQorCisKKworLyoKKyAqIFRoZSBwbGF0Zm9ybSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworc3RhdGljIGlycXJldHVybl90IGNhZmVfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBkYXRhOworCXN0cnVjdCBtY2FtX2NhbWVyYSAqbWNhbSA9ICZjYW0tPm1jYW07CisJdW5zaWduZWQgaW50IGlycXMsIGhhbmRsZWQ7CisKKwlzcGluX2xvY2soJm1jYW0tPmRldl9sb2NrKTsKKwlpcnFzID0gbWNhbV9yZWdfcmVhZChtY2FtLCBSRUdfSVJRU1RBVCk7CisJaGFuZGxlZCA9IGNhbS0+cmVnaXN0ZXJlZCAmJiBtY2NpY19pcnEobWNhbSwgaXJxcyk7CisJaWYgKGlycXMgJiBUV1NJSVJRUykgeworCQltY2FtX3JlZ193cml0ZShtY2FtLCBSRUdfSVJRU1RBVCwgVFdTSUlSUVMpOworCQl3YWtlX3VwKCZjYW0tPnNtYnVzX3dhaXQpOworCQloYW5kbGVkID0gMTsKKwl9CisJc3Bpbl91bmxvY2soJm1jYW0tPmRldl9sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFBDSSBpbnRlcmZhY2Ugc3R1ZmYuCisgKi8KKworc3RhdGljIGludCBjYWZlX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQ7CisJc3RydWN0IGNhZmVfY2FtZXJhICpjYW07CisJc3RydWN0IG1jYW1fY2FtZXJhICptY2FtOworCisJLyoKKwkgKiBTdGFydCBwdXR0aW5nIHRvZ2V0aGVyIG9uZSBvZiBvdXIgYmlnIGNhbWVyYSBzdHJ1Y3R1cmVzLgorCSAqLworCXJldCA9IC1FTk9NRU07CisJY2FtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNhZmVfY2FtZXJhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhbSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwljYW0tPnBkZXYgPSBwZGV2OworCW1jYW0gPSAmY2FtLT5tY2FtOworCW1jYW0tPmNoaXBfaWQgPSBWNEwyX0lERU5UX0NBRkU7CisJc3Bpbl9sb2NrX2luaXQoJm1jYW0tPmRldl9sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYW0tPnNtYnVzX3dhaXQpOworCW1jYW0tPnBsYXRfcG93ZXJfdXAgPSBjYWZlX2N0bHJfcG93ZXJfdXA7CisJbWNhbS0+cGxhdF9wb3dlcl9kb3duID0gY2FmZV9jdGxyX3Bvd2VyX2Rvd247CisJbWNhbS0+ZGV2ID0gJnBkZXYtPmRldjsKKwkvKgorCSAqIFNldCB0aGUgY2xvY2sgc3BlZWQgZm9yIHRoZSBYTyAxOyBJIGRvbid0IGJlbGlldmUgdGhpcworCSAqIGRyaXZlciBoYXMgZXZlciBydW4gYW55d2hlcmUgZWxzZS4KKwkgKi8KKwltY2FtLT5jbG9ja19zcGVlZCA9IDQ1OworCW1jYW0tPnVzZV9zbWJ1cyA9IDE7CisJLyoKKwkgKiBWbWFsbG9jIG1vZGUgZm9yIGJ1ZmZlcnMgaXMgdHJhZGl0aW9uYWwgd2l0aCB0aGlzIGRyaXZlci4KKwkgKiBXZSAqbWlnaHQqIGJlIGFibGUgdG8gcnVuIERNQV9jb250aWcsIGVzcGVjaWFsbHkgb24gYSBzeXN0ZW0KKwkgKiB3aXRoIENNQSBpbiBpdC4KKwkgKi8KKwltY2FtLT5idWZmZXJfbW9kZSA9IEJfdm1hbGxvYzsKKwkvKgorCSAqIEdldCBzZXQgdXAgb24gdGhlIFBDSSBidXMuCisJICovCisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZnJlZTsKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCXJldCA9IC1FSU87CisJbWNhbS0+cmVncyA9IHBjaV9pb21hcChwZGV2LCAwLCAwKTsKKwlpZiAoIW1jYW0tPnJlZ3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gaW9yZW1hcCBjYWZlLWNjaWMgcmVnc1xuIik7CisJCWdvdG8gb3V0X2Rpc2FibGU7CisJfQorCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgY2FmZV9pcnEsIElSUUZfU0hBUkVELCAiY2FmZS1jY2ljIiwgY2FtKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9pb3VubWFwOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBjb250cm9sbGVyIGFuZCBsZWF2ZSBpdCBwb3dlcmVkIHVwLiAgSXQgd2lsbAorCSAqIHN0YXkgdGhhdCB3YXkgdW50aWwgdGhlIHNlbnNvciBkcml2ZXIgc2hvd3MgdXAuCisJICovCisJY2FmZV9jdGxyX2luaXQobWNhbSk7CisJY2FmZV9jdGxyX3Bvd2VyX3VwKG1jYW0pOworCS8qCisJICogU2V0IHVwIEkyQy9TTUJVUyBjb21tdW5pY2F0aW9ucy4gIFdlIGhhdmUgdG8gZHJvcCB0aGUgbXV0ZXggaGVyZQorCSAqIGJlY2F1c2UgdGhlIHNlbnNvciBjb3VsZCBhdHRhY2ggaW4gdGhpcyBjYWxsIGNoYWluLCBsZWFkaW5nIHRvCisJICogdW5zaWdodGx5IGRlYWRsb2Nrcy4KKwkgKi8KKwlyZXQgPSBjYWZlX3NtYnVzX3NldHVwKGNhbSk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfcGRvd247CisKKwlyZXQgPSBtY2NpY19yZWdpc3RlcihtY2FtKTsKKwlpZiAocmV0ID09IDApIHsKKwkJY2FtLT5yZWdpc3RlcmVkID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FmZV9zbWJ1c19zaHV0ZG93bihjYW0pOworb3V0X3Bkb3duOgorCWNhZmVfY3Rscl9wb3dlcl9kb3duKG1jYW0pOworCWZyZWVfaXJxKHBkZXYtPmlycSwgY2FtKTsKK291dF9pb3VubWFwOgorCXBjaV9pb3VubWFwKHBkZXYsIG1jYW0tPnJlZ3MpOworb3V0X2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworb3V0X2ZyZWU6CisJa2ZyZWUoY2FtKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBTaHV0IGRvd24gYW4gaW5pdGlhbGl6ZWQgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGNhZmVfc2h1dGRvd24oc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCit7CisJbWNjaWNfc2h1dGRvd24oJmNhbS0+bWNhbSk7CisJY2FmZV9zbWJ1c19zaHV0ZG93bihjYW0pOworCWZyZWVfaXJxKGNhbS0+cGRldi0+aXJxLCBjYW0pOworCXBjaV9pb3VubWFwKGNhbS0+cGRldiwgY2FtLT5tY2FtLnJlZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIGNhZmVfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gdG9fY2FtKHY0bDJfZGV2KTsKKworCWlmIChjYW0gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJwY2lfcmVtb3ZlIG9uIHVua25vd24gcGRldiAlcFxuIiwgcGRldik7CisJCXJldHVybjsKKwl9CisJY2FmZV9zaHV0ZG93bihjYW0pOworCWtmcmVlKGNhbSk7Cit9CisKKworI2lmZGVmIENPTkZJR19QTQorLyoKKyAqIEJhc2ljIHBvd2VyIG1hbmFnZW1lbnQuCisgKi8KK3N0YXRpYyBpbnQgY2FmZV9wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSB0b19jYW0odjRsMl9kZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCW1jY2ljX3N1c3BlbmQoJmNhbS0+bWNhbSk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgY2FmZV9wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSB0b19jYW0odjRsMl9kZXYpOworCWludCByZXQgPSAwOworCisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisKKwlpZiAocmV0KSB7CisJCWNhbV93YXJuKGNhbSwgIlVuYWJsZSB0byByZS1lbmFibGUgZGV2aWNlIG9uIHJlc3VtZSFcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwljYWZlX2N0bHJfaW5pdCgmY2FtLT5tY2FtKTsKKwlyZXR1cm4gbWNjaWNfcmVzdW1lKCZjYW0tPm1jYW0pOworfQorCisjZW5kaWYgIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY2FmZV9pZHNbXSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLAorCQkgICAgIFBDSV9ERVZJQ0VfSURfTUFSVkVMTF84OEFMUDAxX0NDSUMpIH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY2FmZV9pZHMpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY2FmZV9wY2lfZHJpdmVyID0geworCS5uYW1lID0gImNhZmUxMDAwLWNjaWMiLAorCS5pZF90YWJsZSA9IGNhZmVfaWRzLAorCS5wcm9iZSA9IGNhZmVfcGNpX3Byb2JlLAorCS5yZW1vdmUgPSBjYWZlX3BjaV9yZW1vdmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBjYWZlX3BjaV9zdXNwZW5kLAorCS5yZXN1bWUgPSBjYWZlX3BjaV9yZXN1bWUsCisjZW5kaWYKK307CisKKworCisKK3N0YXRpYyBpbnQgX19pbml0IGNhZmVfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIk1hcnZlbGwgTTg4QUxQMDEgJ0NBRkUnIENhbWVyYSBDb250cm9sbGVyIHZlcnNpb24gJWRcbiIsCisJCQlDQUZFX1ZFUlNJT04pOworCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmNhZmVfcGNpX2RyaXZlcik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZWdpc3RlciBjYWZlX2NjaWMgZHJpdmVyXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCXJldCA9IDA7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjYWZlX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmNhZmVfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGNhZmVfaW5pdCk7Cittb2R1bGVfZXhpdChjYWZlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvbWNhbS1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9tY2FtLWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2MxNDUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvbWNhbS1jb3JlLmMKQEAgLTAsMCArMSwxODQzIEBACisvKgorICogVGhlIE1hcnZlbGwgY2FtZXJhIGNvcmUuICBUaGlzIGRldmljZSBhcHBlYXJzIGluIGEgbnVtYmVyIG9mIHNldHRpbmdzLAorICogc28gaXQgbmVlZHMgcGxhdGZvcm0tc3BlY2lmaWMgc3VwcG9ydCBvdXRzaWRlIG9mIHRoZSBjb3JlLgorICoKKyAqIENvcHlyaWdodCAyMDExIEpvbmF0aGFuIENvcmJldCBjb3JiZXRAbHduLm5ldAorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgorI2luY2x1ZGUgPG1lZGlhL292NzY3MC5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi12bWFsbG9jLmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWRtYS1jb250aWcuaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItZG1hLXNnLmg+CisKKyNpbmNsdWRlICJtY2FtLWNvcmUuaCIKKworLyoKKyAqIEJhc2ljIGZyYW1lIHN0YXRzIC0gdG8gYmUgZGVsZXRlZCBzaG9ydGx5CisgKi8KK3N0YXRpYyBpbnQgZnJhbWVzOworc3RhdGljIGludCBzaW5nbGVzOworc3RhdGljIGludCBkZWxpdmVyZWQ7CisKKyNpZmRlZiBNQ0FNX01PREVfVk1BTExPQworLyoKKyAqIEludGVybmFsIERNQSBidWZmZXIgbWFuYWdlbWVudC4gIFNpbmNlIHRoZSBjb250cm9sbGVyIGNhbm5vdCBkbyBTL0cgSS9PLAorICogd2UgbXVzdCBoYXZlIHBoeXNpY2FsbHkgY29udGlndW91cyBidWZmZXJzIHRvIGJyaW5nIGZyYW1lcyBpbnRvLgorICogVGhlc2UgcGFyYW1ldGVycyBjb250cm9sIGhvdyBtYW55IGJ1ZmZlcnMgd2UgdXNlLCB3aGV0aGVyIHdlCisgKiBhbGxvY2F0ZSB0aGVtIGF0IGxvYWQgdGltZSAoYmV0dGVyIGNoYW5jZSBvZiBzdWNjZXNzLCBidXQgbmFpbHMgZG93bgorICogbWVtb3J5KSBvciB3aGVuIHNvbWVib2R5IHRyaWVzIHRvIHVzZSB0aGUgY2FtZXJhIChyaXNraWVyKSwgYW5kLAorICogZm9yIGxvYWQtdGltZSBhbGxvY2F0aW9uLCBob3cgYmlnIHRoZXkgc2hvdWxkIGJlLgorICoKKyAqIFRoZSBjb250cm9sbGVyIGNhbiBjeWNsZSB0aHJvdWdoIHRocmVlIGJ1ZmZlcnMuICBXZSBjb3VsZCB1c2UKKyAqIG1vcmUgYnkgZmxpcHBpbmcgcG9pbnRlcnMgYXJvdW5kLCBidXQgaXQgcHJvYmFibHkgbWFrZXMgbGl0dGxlCisgKiBzZW5zZS4KKyAqLworCitzdGF0aWMgaW50IGFsbG9jX2J1ZnNfYXRfcmVhZDsKK21vZHVsZV9wYXJhbShhbGxvY19idWZzX2F0X3JlYWQsIGJvb2wsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhhbGxvY19idWZzX2F0X3JlYWQsCisJCSJOb24temVybyB2YWx1ZSBjYXVzZXMgRE1BIGJ1ZmZlcnMgdG8gYmUgYWxsb2NhdGVkIHdoZW4gdGhlICIKKwkJInZpZGVvIGNhcHR1cmUgZGV2aWNlIGlzIHJlYWQsIHJhdGhlciB0aGFuIGF0IG1vZHVsZSBsb2FkICIKKwkJInRpbWUuICBUaGlzIHNhdmVzIG1lbW9yeSwgYnV0IGRlY3JlYXNlcyB0aGUgY2hhbmNlcyBvZiAiCisJCSJzdWNjZXNzZnVsbHkgZ2V0dGluZyB0aG9zZSBidWZmZXJzLiAgVGhpcyBwYXJhbWV0ZXIgaXMgIgorCQkib25seSB1c2VkIGluIHRoZSB2bWFsbG9jIGJ1ZmZlciBtb2RlIik7CisKK3N0YXRpYyBpbnQgbl9kbWFfYnVmcyA9IDM7Cittb2R1bGVfcGFyYW0obl9kbWFfYnVmcywgdWludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG5fZG1hX2J1ZnMsCisJCSJUaGUgbnVtYmVyIG9mIERNQSBidWZmZXJzIHRvIGFsbG9jYXRlLiAgQ2FuIGJlIGVpdGhlciB0d28gIgorCQkiKHNhdmVzIG1lbW9yeSwgbWFrZXMgdGltaW5nIHRpZ2h0ZXIpIG9yIHRocmVlLiIpOworCitzdGF0aWMgaW50IGRtYV9idWZfc2l6ZSA9IFZHQV9XSURUSCAqIFZHQV9IRUlHSFQgKiAyOyAgLyogV29yc3QgY2FzZSAqLworbW9kdWxlX3BhcmFtKGRtYV9idWZfc2l6ZSwgdWludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRtYV9idWZfc2l6ZSwKKwkJIlRoZSBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgRE1BIGJ1ZmZlcnMuICBJZiBhY3R1YWwgb3BlcmF0aW5nICIKKwkJInBhcmFtZXRlcnMgcmVxdWlyZSBsYXJnZXIgYnVmZmVycywgYW4gYXR0ZW1wdCB0byByZWFsbG9jYXRlICIKKwkJIndpbGwgYmUgbWFkZS4iKTsKKyNlbHNlIC8qIE1DQU1fTU9ERV9WTUFMTE9DICovCitzdGF0aWMgY29uc3QgaW50IGFsbG9jX2J1ZnNfYXRfcmVhZCA9IDA7CitzdGF0aWMgY29uc3QgaW50IG5fZG1hX2J1ZnMgPSAzOyAgLyogVXNlZCBieSBTL0dfUEFSTSAqLworI2VuZGlmIC8qIE1DQU1fTU9ERV9WTUFMTE9DICovCisKK3N0YXRpYyBpbnQgZmxpcDsKK21vZHVsZV9wYXJhbShmbGlwLCBib29sLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZmxpcCwKKwkJIklmIHNldCwgdGhlIHNlbnNvciB3aWxsIGJlIGluc3RydWN0ZWQgdG8gZmxpcCB0aGUgaW1hZ2UgIgorCQkidmVydGljYWxseS4iKTsKKworc3RhdGljIGludCBidWZmZXJfbW9kZSA9IC0xOworbW9kdWxlX3BhcmFtKGJ1ZmZlcl9tb2RlLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhidWZmZXJfbW9kZSwKKwkJIlNldCB0aGUgYnVmZmVyIG1vZGUgdG8gYmUgdXNlZDsgZGVmYXVsdCBpcyB0byBnbyB3aXRoIHdoYXQgIgorCQkidGhlIHBsYXRmb3JtIGRyaXZlciBhc2tzIGZvci4gIFNldCB0byAwIGZvciB2bWFsbG9jLCAxIGZvciAiCisJCSJETUEgY29udGlndW91cy4iKTsKKworLyoKKyAqIFN0YXR1cyBmbGFncy4gIEFsd2F5cyBtYW5pcHVsYXRlZCB3aXRoIGJpdCBvcGVyYXRpb25zLgorICovCisjZGVmaW5lIENGX0JVRjBfVkFMSUQJIDAJLyogQnVmZmVycyB2YWxpZCAtIGZpcnN0IHRocmVlICovCisjZGVmaW5lIENGX0JVRjFfVkFMSUQJIDEKKyNkZWZpbmUgQ0ZfQlVGMl9WQUxJRAkgMgorI2RlZmluZSBDRl9ETUFfQUNUSVZFCSAzCS8qIEEgZnJhbWUgaXMgaW5jb21pbmcgKi8KKyNkZWZpbmUgQ0ZfQ09ORklHX05FRURFRCA0CS8qIE11c3QgY29uZmlndXJlIGhhcmR3YXJlICovCisjZGVmaW5lIENGX1NJTkdMRV9CVUZGRVIgNQkvKiBSdW5uaW5nIHdpdGggYSBzaW5nbGUgYnVmZmVyICovCisjZGVmaW5lIENGX1NHX1JFU1RBUlQJIDYJLyogU0cgcmVzdGFydCBuZWVkZWQgKi8KKworI2RlZmluZSBzZW5zb3JfY2FsbChjYW0sIG8sIGYsIGFyZ3MuLi4pIFwKKwl2NGwyX3N1YmRldl9jYWxsKGNhbS0+c2Vuc29yLCBvLCBmLCAjI2FyZ3MpCisKK3N0YXRpYyBzdHJ1Y3QgbWNhbV9mb3JtYXRfc3RydWN0IHsKKwlfX3U4ICpkZXNjOworCV9fdTMyIHBpeGVsZm9ybWF0OworCWludCBicHA7ICAgLyogQnl0ZXMgcGVyIHBpeGVsICovCisJZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIG1idXNfY29kZTsKK30gbWNhbV9mb3JtYXRzW10gPSB7CisJeworCQkuZGVzYwkJPSAiWVVZViA0OjI6MiIsCisJCS5waXhlbGZvcm1hdAk9IFY0TDJfUElYX0ZNVF9ZVVlWLAorCQkubWJ1c19jb2RlCT0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDgsCisJCS5icHAJCT0gMiwKKwl9LAorCXsKKwkJLmRlc2MJCT0gIlJHQiA0NDQiLAorCQkucGl4ZWxmb3JtYXQJPSBWNEwyX1BJWF9GTVRfUkdCNDQ0LAorCQkubWJ1c19jb2RlCT0gVjRMMl9NQlVTX0ZNVF9SR0I0NDRfMlg4X1BBREhJX0xFLAorCQkuYnBwCQk9IDIsCisJfSwKKwl7CisJCS5kZXNjCQk9ICJSR0IgNTY1IiwKKwkJLnBpeGVsZm9ybWF0CT0gVjRMMl9QSVhfRk1UX1JHQjU2NSwKKwkJLm1idXNfY29kZQk9IFY0TDJfTUJVU19GTVRfUkdCNTY1XzJYOF9MRSwKKwkJLmJwcAkJPSAyLAorCX0sCisJeworCQkuZGVzYwkJPSAiUmF3IFJHQiBCYXllciIsCisJCS5waXhlbGZvcm1hdAk9IFY0TDJfUElYX0ZNVF9TQkdHUjgsCisJCS5tYnVzX2NvZGUJPSBWNEwyX01CVVNfRk1UX1NCR0dSOF8xWDgsCisJCS5icHAJCT0gMQorCX0sCit9OworI2RlZmluZSBOX01DQU1fRk1UUyBBUlJBWV9TSVpFKG1jYW1fZm9ybWF0cykKKworc3RhdGljIHN0cnVjdCBtY2FtX2Zvcm1hdF9zdHJ1Y3QgKm1jYW1fZmluZF9mb3JtYXQodTMyIHBpeGVsZm9ybWF0KQoreworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTl9NQ0FNX0ZNVFM7IGkrKykKKwkJaWYgKG1jYW1fZm9ybWF0c1tpXS5waXhlbGZvcm1hdCA9PSBwaXhlbGZvcm1hdCkKKwkJCXJldHVybiBtY2FtX2Zvcm1hdHMgKyBpOworCS8qIE5vdCBmb3VuZD8gVGhlbiByZXR1cm4gdGhlIGZpcnN0IGZvcm1hdC4gKi8KKwlyZXR1cm4gbWNhbV9mb3JtYXRzOworfQorCisvKgorICogVGhlIGRlZmF1bHQgZm9ybWF0IHdlIHVzZSB1bnRpbCBzb21lYm9keSBzYXlzIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgbWNhbV9kZWZfcGl4X2Zvcm1hdCA9IHsKKwkud2lkdGgJCT0gVkdBX1dJRFRILAorCS5oZWlnaHQJCT0gVkdBX0hFSUdIVCwKKwkucGl4ZWxmb3JtYXQJPSBWNEwyX1BJWF9GTVRfWVVZViwKKwkuZmllbGQJCT0gVjRMMl9GSUVMRF9OT05FLAorCS5ieXRlc3BlcmxpbmUJPSBWR0FfV0lEVEgqMiwKKwkuc2l6ZWltYWdlCT0gVkdBX1dJRFRIKlZHQV9IRUlHSFQqMiwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgbWNhbV9kZWZfbWJ1c19jb2RlID0KKwkJCQkJVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDg7CisKKworLyoKKyAqIFRoZSB0d28td29yZCBETUEgZGVzY3JpcHRvciBmb3JtYXQgdXNlZCBieSB0aGUgQXJtYWRhIDYxMCBhbmQgbGlrZS4gIFRoZXJlCisgKiBJcyBhIHRocmVlLXdvcmQgZm9ybWF0IGFzIHdlbGwgKHNldCBDMV9ERVNDXzNXT1JEKSB3aGVyZSB0aGUgdGhpcmQKKyAqIHdvcmQgaXMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGRlc2NyaXB0b3IsIGJ1dCB3ZSBkb24ndCB1c2UgaXQuICBUd28td29yZAorICogZGVzY3JpcHRvcnMgaGF2ZSB0byBiZSBjb250aWd1b3VzIGluIG1lbW9yeS4KKyAqLworc3RydWN0IG1jYW1fZG1hX2Rlc2MgeworCXUzMiBkbWFfYWRkcjsKKwl1MzIgc2VnbWVudF9sZW47Cit9OworCisvKgorICogT3VyIGJ1ZmZlciB0eXBlIGZvciB3b3JraW5nIHdpdGggdmlkZW9idWYyLiAgTm90ZSB0aGF0IHRoZSB2YjIKKyAqIGRldmVsb3BlcnMgaGF2ZSBkZWNyZWVkIHRoYXQgc3RydWN0IHZiMl9idWZmZXIgbXVzdCBiZSBhdCB0aGUKKyAqIGJlZ2lubmluZyBvZiB0aGlzIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IG1jYW1fdmJfYnVmZmVyIHsKKwlzdHJ1Y3QgdmIyX2J1ZmZlciB2Yl9idWY7CisJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZTsKKwlzdHJ1Y3QgbWNhbV9kbWFfZGVzYyAqZG1hX2Rlc2M7CS8qIERlc2NyaXB0b3IgdmlydHVhbCBhZGRyZXNzICovCisJZG1hX2FkZHJfdCBkbWFfZGVzY19wYTsJCS8qIERlc2NyaXB0b3IgcGh5c2ljYWwgYWRkcmVzcyAqLworCWludCBkbWFfZGVzY19uZW50OwkJLyogTnVtYmVyIG9mIG1hcHBlZCBkZXNjcmlwdG9ycyAqLworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbWNhbV92Yl9idWZmZXIgKnZiX3RvX212YihzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IG1jYW1fdmJfYnVmZmVyLCB2Yl9idWYpOworfQorCisvKgorICogSGFuZCBhIGNvbXBsZXRlZCBidWZmZXIgYmFjayB0byB1c2VyIHNwYWNlLgorICovCitzdGF0aWMgdm9pZCBtY2FtX2J1ZmZlcl9kb25lKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtLCBpbnQgZnJhbWUsCisJCXN0cnVjdCB2YjJfYnVmZmVyICp2YnVmKQoreworCXZidWYtPnY0bDJfYnVmLmJ5dGVzdXNlZCA9IGNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2U7CisJdmJ1Zi0+djRsMl9idWYuc2VxdWVuY2UgPSBjYW0tPmJ1Zl9zZXFbZnJhbWVdOworCXZiMl9zZXRfcGxhbmVfcGF5bG9hZCh2YnVmLCAwLCBjYW0tPnBpeF9mb3JtYXQuc2l6ZWltYWdlKTsKKwl2YjJfYnVmZmVyX2RvbmUodmJ1ZiwgVkIyX0JVRl9TVEFURV9ET05FKTsKK30KKworCisKKy8qCisgKiBEZWJ1Z2dpbmcgYW5kIHJlbGF0ZWQuCisgKi8KKyNkZWZpbmUgY2FtX2VycihjYW0sIGZtdCwgYXJnLi4uKSBcCisJZGV2X2VycigoY2FtKS0+ZGV2LCBmbXQsICMjYXJnKTsKKyNkZWZpbmUgY2FtX3dhcm4oY2FtLCBmbXQsIGFyZy4uLikgXAorCWRldl93YXJuKChjYW0pLT5kZXYsIGZtdCwgIyNhcmcpOworI2RlZmluZSBjYW1fZGJnKGNhbSwgZm10LCBhcmcuLi4pIFwKKwlkZXZfZGJnKChjYW0pLT5kZXYsIGZtdCwgIyNhcmcpOworCisKKy8qCisgKiBGbGFnIG1hbmlwdWxhdGlvbiBoZWxwZXJzCisgKi8KK3N0YXRpYyB2b2lkIG1jYW1fcmVzZXRfYnVmZmVycyhzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlpbnQgaTsKKworCWNhbS0+bmV4dF9idWYgPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uYnVmczsgaSsrKQorCQljbGVhcl9iaXQoaSwgJmNhbS0+ZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCBtY2FtX25lZWRzX2NvbmZpZyhzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoQ0ZfQ09ORklHX05FRURFRCwgJmNhbS0+ZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBtY2FtX3NldF9jb25maWdfbmVlZGVkKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtLCBpbnQgbmVlZGVkKQoreworCWlmIChuZWVkZWQpCisJCXNldF9iaXQoQ0ZfQ09ORklHX05FRURFRCwgJmNhbS0+ZmxhZ3MpOworCWVsc2UKKwkJY2xlYXJfYml0KENGX0NPTkZJR19ORUVERUQsICZjYW0tPmZsYWdzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIE1ha2UgdGhlIGNvbnRyb2xsZXIgc3RhcnQgZ3JhYmJpbmcgaW1hZ2VzLiAgRXZlcnl0aGluZyBtdXN0CisgKiBiZSBzZXQgdXAgYmVmb3JlIGRvaW5nIHRoaXMuCisgKi8KK3N0YXRpYyB2b2lkIG1jYW1fY3Rscl9zdGFydChzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwkvKiBzZXRfYml0IHBlcmZvcm1zIGEgcmVhZCwgc28gbm8gb3RoZXIgYmFycmllciBzaG91bGQgYmUKKwkgICBuZWVkZWQgaGVyZSAqLworCW1jYW1fcmVnX3NldF9iaXQoY2FtLCBSRUdfQ1RSTDAsIEMwX0VOQUJMRSk7Cit9CisKK3N0YXRpYyB2b2lkIG1jYW1fY3Rscl9zdG9wKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCW1jYW1fcmVnX2NsZWFyX2JpdChjYW0sIFJFR19DVFJMMCwgQzBfRU5BQkxFKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgTUNBTV9NT0RFX1ZNQUxMT0MKKy8qCisgKiBDb2RlIHNwZWNpZmljIHRvIHRoZSB2bWFsbG9jIGJ1ZmZlciBtb2RlLgorICovCisKKy8qCisgKiBBbGxvY2F0ZSBpbi1rZXJuZWwgRE1BIGJ1ZmZlcnMgZm9yIHZtYWxsb2MgbW9kZS4KKyAqLworc3RhdGljIGludCBtY2FtX2FsbG9jX2RtYV9idWZzKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtLCBpbnQgbG9hZHRpbWUpCit7CisJaW50IGk7CisKKwltY2FtX3NldF9jb25maWdfbmVlZGVkKGNhbSwgMSk7CisJaWYgKGxvYWR0aW1lKQorCQljYW0tPmRtYV9idWZfc2l6ZSA9IGRtYV9idWZfc2l6ZTsKKwllbHNlCisJCWNhbS0+ZG1hX2J1Zl9zaXplID0gY2FtLT5waXhfZm9ybWF0LnNpemVpbWFnZTsKKwlpZiAobl9kbWFfYnVmcyA+IDMpCisJCW5fZG1hX2J1ZnMgPSAzOworCisJY2FtLT5uYnVmcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IG5fZG1hX2J1ZnM7IGkrKykgeworCQljYW0tPmRtYV9idWZzW2ldID0gZG1hX2FsbG9jX2NvaGVyZW50KGNhbS0+ZGV2LAorCQkJCWNhbS0+ZG1hX2J1Zl9zaXplLCBjYW0tPmRtYV9oYW5kbGVzICsgaSwKKwkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKGNhbS0+ZG1hX2J1ZnNbaV0gPT0gTlVMTCkgeworCQkJY2FtX3dhcm4oY2FtLCAiRmFpbGVkIHRvIGFsbG9jYXRlIERNQSBidWZmZXJcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJKGNhbS0+bmJ1ZnMpKys7CisJfQorCisJc3dpdGNoIChjYW0tPm5idWZzKSB7CisJY2FzZSAxOgorCQlkbWFfZnJlZV9jb2hlcmVudChjYW0tPmRldiwgY2FtLT5kbWFfYnVmX3NpemUsCisJCQkJY2FtLT5kbWFfYnVmc1swXSwgY2FtLT5kbWFfaGFuZGxlc1swXSk7CisJCWNhbS0+bmJ1ZnMgPSAwOworCWNhc2UgMDoKKwkJY2FtX2VycihjYW0sICJJbnN1ZmZpY2llbnQgRE1BIGJ1ZmZlcnMsIGNhbm5vdCBvcGVyYXRlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljYXNlIDI6CisJCWlmIChuX2RtYV9idWZzID4gMikKKwkJCWNhbV93YXJuKGNhbSwgIldpbGwgbGltcCBhbG9uZyB3aXRoIG9ubHkgMiBidWZmZXJzXG4iKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtY2FtX2ZyZWVfZG1hX2J1ZnMoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uYnVmczsgaSsrKSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KGNhbS0+ZGV2LCBjYW0tPmRtYV9idWZfc2l6ZSwKKwkJCQljYW0tPmRtYV9idWZzW2ldLCBjYW0tPmRtYV9oYW5kbGVzW2ldKTsKKwkJY2FtLT5kbWFfYnVmc1tpXSA9IE5VTEw7CisJfQorCWNhbS0+bmJ1ZnMgPSAwOworfQorCisKKy8qCisgKiBTZXQgdXAgRE1BIGJ1ZmZlcnMgd2hlbiBvcGVyYXRpbmcgaW4gdm1hbGxvYyBtb2RlCisgKi8KK3N0YXRpYyB2b2lkIG1jYW1fY3Rscl9kbWFfdm1hbGxvYyhzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwkvKgorCSAqIFN0b3JlIHRoZSBmaXJzdCB0d28gWSBidWZmZXJzICh3ZSBhcmVuJ3Qgc3VwcG9ydGluZworCSAqIHBsYW5hciBmb3JtYXRzIGZvciBub3csIHNvIG5vIFVWIGJ1ZnMpLiAgVGhlbiBlaXRoZXIKKwkgKiBzZXQgdGhlIHRoaXJkIGlmIGl0IGV4aXN0cywgb3IgdGVsbCB0aGUgY29udHJvbGxlcgorCSAqIHRvIGp1c3QgdXNlIHR3by4KKwkgKi8KKwltY2FtX3JlZ193cml0ZShjYW0sIFJFR19ZMEJBUiwgY2FtLT5kbWFfaGFuZGxlc1swXSk7CisJbWNhbV9yZWdfd3JpdGUoY2FtLCBSRUdfWTFCQVIsIGNhbS0+ZG1hX2hhbmRsZXNbMV0pOworCWlmIChjYW0tPm5idWZzID4gMikgeworCQltY2FtX3JlZ193cml0ZShjYW0sIFJFR19ZMkJBUiwgY2FtLT5kbWFfaGFuZGxlc1syXSk7CisJCW1jYW1fcmVnX2NsZWFyX2JpdChjYW0sIFJFR19DVFJMMSwgQzFfVFdPQlVGUyk7CisJfSBlbHNlCisJCW1jYW1fcmVnX3NldF9iaXQoY2FtLCBSRUdfQ1RSTDEsIEMxX1RXT0JVRlMpOworCWlmIChjYW0tPmNoaXBfaWQgPT0gVjRMMl9JREVOVF9DQUZFKQorCQltY2FtX3JlZ193cml0ZShjYW0sIFJFR19VQkFSLCAwKTsgLyogMzIgYml0cyBvbmx5ICovCit9CisKKy8qCisgKiBDb3B5IGRhdGEgb3V0IHRvIHVzZXIgc3BhY2UgaW4gdGhlIHZtYWxsb2MgY2FzZQorICovCitzdGF0aWMgdm9pZCBtY2FtX2ZyYW1lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gKHN0cnVjdCBtY2FtX2NhbWVyYSAqKSBkYXRhOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG1jYW1fdmJfYnVmZmVyICpidWY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5idWZzOyBpKyspIHsKKwkJaW50IGJ1Zm5vID0gY2FtLT5uZXh0X2J1ZjsKKworCQlpZiAoY2FtLT5zdGF0ZSAhPSBTX1NUUkVBTUlORyB8fCBidWZubyA8IDApCisJCQlicmVhazsgIC8qIEkvTyBnb3Qgc3RvcHBlZCAqLworCQlpZiAoKysoY2FtLT5uZXh0X2J1ZikgPj0gY2FtLT5uYnVmcykKKwkJCWNhbS0+bmV4dF9idWYgPSAwOworCQlpZiAoIXRlc3RfYml0KGJ1Zm5vLCAmY2FtLT5mbGFncykpCisJCQljb250aW51ZTsKKwkJaWYgKGxpc3RfZW1wdHkoJmNhbS0+YnVmZmVycykpIHsKKwkJCXNpbmdsZXMrKzsKKwkJCWJyZWFrOyAgLyogTGVhdmUgaXQgdmFsaWQsIGhvcGUgZm9yIGJldHRlciBsYXRlciAqLworCQl9CisJCWRlbGl2ZXJlZCsrOworCQljbGVhcl9iaXQoYnVmbm8sICZjYW0tPmZsYWdzKTsKKwkJYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmY2FtLT5idWZmZXJzLCBzdHJ1Y3QgbWNhbV92Yl9idWZmZXIsCisJCQkJcXVldWUpOworCQlsaXN0X2RlbF9pbml0KCZidWYtPnF1ZXVlKTsKKwkJLyoKKwkJICogRHJvcCB0aGUgbG9jayBkdXJpbmcgdGhlIGJpZyBjb3B5LiAgVGhpcyAqc2hvdWxkKiBiZSBzYWZlLi4uCisJCSAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJCW1lbWNweSh2YjJfcGxhbmVfdmFkZHIoJmJ1Zi0+dmJfYnVmLCAwKSwgY2FtLT5kbWFfYnVmc1tidWZub10sCisJCQkJY2FtLT5waXhfZm9ybWF0LnNpemVpbWFnZSk7CisJCW1jYW1fYnVmZmVyX2RvbmUoY2FtLCBidWZubywgJmJ1Zi0+dmJfYnVmKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworfQorCisKKy8qCisgKiBNYWtlIHN1cmUgb3VyIGFsbG9jYXRlZCBidWZmZXJzIGFyZSB1cCB0byB0aGUgdGFzay4KKyAqLworc3RhdGljIGludCBtY2FtX2NoZWNrX2RtYV9idWZmZXJzKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCWlmIChjYW0tPm5idWZzID4gMCAmJiBjYW0tPmRtYV9idWZfc2l6ZSA8IGNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2UpCisJCQltY2FtX2ZyZWVfZG1hX2J1ZnMoY2FtKTsKKwlpZiAoY2FtLT5uYnVmcyA9PSAwKQorCQlyZXR1cm4gbWNhbV9hbGxvY19kbWFfYnVmcyhjYW0sIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtY2FtX3ZtYWxsb2NfZG9uZShzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSwgaW50IGZyYW1lKQoreworCXRhc2tsZXRfc2NoZWR1bGUoJmNhbS0+c190YXNrbGV0KTsKK30KKworI2Vsc2UgLyogTUNBTV9NT0RFX1ZNQUxMT0MgKi8KKworc3RhdGljIGlubGluZSBpbnQgbWNhbV9hbGxvY19kbWFfYnVmcyhzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSwgaW50IGxvYWR0aW1lKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWNhbV9mcmVlX2RtYV9idWZzKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSBpbnQgbWNhbV9jaGVja19kbWFfYnVmZmVycyhzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlyZXR1cm4gMDsKK30KKworCisKKyNlbmRpZiAvKiBNQ0FNX01PREVfVk1BTExPQyAqLworCisKKyNpZmRlZiBNQ0FNX01PREVfRE1BX0NPTlRJRworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIERNQS1jb250aWd1b3VzIGNvZGUuCisgKi8KKy8qCisgKiBTZXQgdXAgYSBjb250aWd1b3VzIGJ1ZmZlciBmb3IgdGhlIGdpdmVuIGZyYW1lLiAgSGVyZSBhbHNvIGlzIHdoZXJlCisgKiB0aGUgdW5kZXJydW4gc3RyYXRlZ3kgaXMgc2V0OiBpZiB0aGVyZSBpcyBubyBidWZmZXIgYXZhaWxhYmxlLCByZXVzZQorICogdGhlIGJ1ZmZlciBmcm9tIHRoZSBvdGhlciBCQVIgYW5kIHNldCB0aGUgQ0ZfU0lOR0xFX0JVRkZFUiBmbGFnIHRvCisgKiBrZWVwIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBmcm9tIGdpdmluZyB0aGF0IGJ1ZmZlciBiYWNrIHRvIHVzZXIKKyAqIHNwYWNlLiAgSW4gdGhpcyB3YXksIHdlIGFsd2F5cyBoYXZlIGEgYnVmZmVyIHRvIERNQSB0byBhbmQgZG9uJ3QKKyAqIGhhdmUgdG8gdHJ5IHRvIHBsYXkgZ2FtZXMgc3RvcHBpbmcgYW5kIHJlc3RhcnRpbmcgdGhlIGNvbnRyb2xsZXIuCisgKi8KK3N0YXRpYyB2b2lkIG1jYW1fc2V0X2NvbnRpZ19idWZmZXIoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0sIGludCBmcmFtZSkKK3sKKwlzdHJ1Y3QgbWNhbV92Yl9idWZmZXIgKmJ1ZjsKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBubyBhdmFpbGFibGUgYnVmZmVycywgZ28gaW50byBzaW5nbGUgbW9kZQorCSAqLworCWlmIChsaXN0X2VtcHR5KCZjYW0tPmJ1ZmZlcnMpKSB7CisJCWJ1ZiA9IGNhbS0+dmJfYnVmc1tmcmFtZSBeIDB4MV07CisJCWNhbS0+dmJfYnVmc1tmcmFtZV0gPSBidWY7CisJCW1jYW1fcmVnX3dyaXRlKGNhbSwgZnJhbWUgPT0gMCA/IFJFR19ZMEJBUiA6IFJFR19ZMUJBUiwKKwkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcigmYnVmLT52Yl9idWYsIDApKTsKKwkJc2V0X2JpdChDRl9TSU5HTEVfQlVGRkVSLCAmY2FtLT5mbGFncyk7CisJCXNpbmdsZXMrKzsKKwkJcmV0dXJuOworCX0KKwkvKgorCSAqIE9LLCB3ZSBoYXZlIGEgYnVmZmVyIHdlIGNhbiB1c2UuCisJICovCisJYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmY2FtLT5idWZmZXJzLCBzdHJ1Y3QgbWNhbV92Yl9idWZmZXIsIHF1ZXVlKTsKKwlsaXN0X2RlbF9pbml0KCZidWYtPnF1ZXVlKTsKKwltY2FtX3JlZ193cml0ZShjYW0sIGZyYW1lID09IDAgPyBSRUdfWTBCQVIgOiBSRUdfWTFCQVIsCisJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcigmYnVmLT52Yl9idWYsIDApKTsKKwljYW0tPnZiX2J1ZnNbZnJhbWVdID0gYnVmOworCWNsZWFyX2JpdChDRl9TSU5HTEVfQlVGRkVSLCAmY2FtLT5mbGFncyk7Cit9CisKKy8qCisgKiBJbml0aWFsIEJfRE1BX2NvbnRpZyBzZXR1cC4KKyAqLworc3RhdGljIHZvaWQgbWNhbV9jdGxyX2RtYV9jb250aWcoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJbWNhbV9yZWdfc2V0X2JpdChjYW0sIFJFR19DVFJMMSwgQzFfVFdPQlVGUyk7CisJY2FtLT5uYnVmcyA9IDI7CisJbWNhbV9zZXRfY29udGlnX2J1ZmZlcihjYW0sIDApOworCW1jYW1fc2V0X2NvbnRpZ19idWZmZXIoY2FtLCAxKTsKK30KKworLyoKKyAqIEZyYW1lIGNvbXBsZXRpb24gaGFuZGxpbmcuCisgKi8KK3N0YXRpYyB2b2lkIG1jYW1fZG1hX2NvbnRpZ19kb25lKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtLCBpbnQgZnJhbWUpCit7CisJc3RydWN0IG1jYW1fdmJfYnVmZmVyICpidWYgPSBjYW0tPnZiX2J1ZnNbZnJhbWVdOworCisJaWYgKCF0ZXN0X2JpdChDRl9TSU5HTEVfQlVGRkVSLCAmY2FtLT5mbGFncykpIHsKKwkJZGVsaXZlcmVkKys7CisJCW1jYW1fYnVmZmVyX2RvbmUoY2FtLCBmcmFtZSwgJmJ1Zi0+dmJfYnVmKTsKKwl9CisJbWNhbV9zZXRfY29udGlnX2J1ZmZlcihjYW0sIGZyYW1lKTsKK30KKworI2VuZGlmIC8qIE1DQU1fTU9ERV9ETUFfQ09OVElHICovCisKKyNpZmRlZiBNQ0FNX01PREVfRE1BX1NHCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogU2NhdHRlci9nYXRoZXItc3BlY2lmaWMgY29kZS4KKyAqLworCisvKgorICogU2V0IHVwIHRoZSBuZXh0IGJ1ZmZlciBmb3IgUy9HIEkvTzsgY2FsbGVyIHNob3VsZCBiZSBzdXJlIHRoYXQKKyAqIHRoZSBjb250cm9sbGVyIGlzIHN0b3BwZWQgYW5kIGEgYnVmZmVyIGlzIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIHZvaWQgbWNhbV9zZ19uZXh0X2J1ZmZlcihzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlzdHJ1Y3QgbWNhbV92Yl9idWZmZXIgKmJ1ZjsKKworCWJ1ZiA9IGxpc3RfZmlyc3RfZW50cnkoJmNhbS0+YnVmZmVycywgc3RydWN0IG1jYW1fdmJfYnVmZmVyLCBxdWV1ZSk7CisJbGlzdF9kZWxfaW5pdCgmYnVmLT5xdWV1ZSk7CisJbWNhbV9yZWdfd3JpdGUoY2FtLCBSRUdfRE1BX0RFU0NfWSwgYnVmLT5kbWFfZGVzY19wYSk7CisJbWNhbV9yZWdfd3JpdGUoY2FtLCBSRUdfREVTQ19MRU5fWSwKKwkJCWJ1Zi0+ZG1hX2Rlc2NfbmVudCpzaXplb2Yoc3RydWN0IG1jYW1fZG1hX2Rlc2MpKTsKKwltY2FtX3JlZ193cml0ZShjYW0sIFJFR19ERVNDX0xFTl9VLCAwKTsKKwltY2FtX3JlZ193cml0ZShjYW0sIFJFR19ERVNDX0xFTl9WLCAwKTsKKwljYW0tPnZiX2J1ZnNbMF0gPSBidWY7Cit9CisKKy8qCisgKiBJbml0aWFsIEJfRE1BX3NnIHNldHVwCisgKi8KK3N0YXRpYyB2b2lkIG1jYW1fY3Rscl9kbWFfc2coc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJbWNhbV9yZWdfY2xlYXJfYml0KGNhbSwgUkVHX0NUUkwxLCBDMV9ERVNDXzNXT1JEKTsKKwltY2FtX3NnX25leHRfYnVmZmVyKGNhbSk7CisJbWNhbV9yZWdfc2V0X2JpdChjYW0sIFJFR19DVFJMMSwgQzFfREVTQ19FTkEpOworCWNhbS0+bmJ1ZnMgPSAzOworfQorCisKKy8qCisgKiBGcmFtZSBjb21wbGV0aW9uIHdpdGggUy9HIGlzIHRyaWNraWVyLiAgV2UgY2FuJ3QgbXVjayB3aXRoCisgKiBhIGRlc2NyaXB0b3IgY2hhaW4gb24gdGhlIGZseSwgc2luY2UgdGhlIGNvbnRyb2xsZXIgYnVmZmVycyBpdAorICogaW50ZXJuYWxseS4gIFNvIHdlIGhhdmUgdG8gYWN0dWFsbHkgc3RvcCBhbmQgcmVzdGFydDsgTWFydmVsbAorICogc2F5cyB0aGlzIGlzIHRoZSB3YXkgdG8gZG8gaXQuCisgKgorICogT2YgY291cnNlLCBzdG9wcGluZyBpcyBlYXNpZXIgc2FpZCB0aGFuIGRvbmU7IGV4cGVyaWVuY2Ugc2hvd3MKKyAqIHRoYXQgdGhlIGNvbnRyb2xsZXIgY2FuIHN0YXJ0IGEgZnJhbWUgKmFmdGVyKiBDMF9FTkFCTEUgaGFzIGJlZW4KKyAqIGNsZWFyZWQuICBTbyB3aGVuIHJ1bm5pbmcgaW4gUy9HIG1vZGUsIHRoZSBjb250cm9sbGVyIGlzICJzdG9wcGVkIgorICogb24gcmVjZWlwdCBvZiB0aGUgc3RhcnQtb2YtZnJhbWUgaW50ZXJydXB0LiAgVGhhdCBtZWFucyB3ZSBjYW4KKyAqIHNhZmVseSBjaGFuZ2UgdGhlIERNQSBkZXNjcmlwdG9yIGFycmF5IGhlcmUgYW5kIHJlc3RhcnQgdGhpbmdzCisgKiAoYXNzdW1pbmcgdGhlcmUncyBhbm90aGVyIGJ1ZmZlciB3YWl0aW5nIHRvIGdvKS4KKyAqLworc3RhdGljIHZvaWQgbWNhbV9kbWFfc2dfZG9uZShzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSwgaW50IGZyYW1lKQoreworCXN0cnVjdCBtY2FtX3ZiX2J1ZmZlciAqYnVmID0gY2FtLT52Yl9idWZzWzBdOworCisJLyoKKwkgKiBWZXJ5IEJhZCBOb3QgR29vZCBUaGluZ3MgaGFwcGVuIGlmIHlvdSBkb24ndCBjbGVhcgorCSAqIEMxX0RFU0NfRU5BIGJlZm9yZSBtYWtpbmcgYW55IGRlc2NyaXB0b3IgY2hhbmdlcy4KKwkgKi8KKwltY2FtX3JlZ19jbGVhcl9iaXQoY2FtLCBSRUdfQ1RSTDEsIEMxX0RFU0NfRU5BKTsKKwkvKgorCSAqIElmIHdlIGhhdmUgYW5vdGhlciBidWZmZXIgYXZhaWxhYmxlLCBwdXQgaXQgaW4gYW5kCisJICogcmVzdGFydCB0aGUgZW5naW5lLgorCSAqLworCWlmICghbGlzdF9lbXB0eSgmY2FtLT5idWZmZXJzKSkgeworCQltY2FtX3NnX25leHRfYnVmZmVyKGNhbSk7CisJCW1jYW1fcmVnX3NldF9iaXQoY2FtLCBSRUdfQ1RSTDEsIEMxX0RFU0NfRU5BKTsKKwkJbWNhbV9jdGxyX3N0YXJ0KGNhbSk7CisJLyoKKwkgKiBPdGhlcndpc2Ugc2V0IENGX1NHX1JFU1RBUlQgYW5kIHRoZSBjb250cm9sbGVyIHdpbGwKKwkgKiBiZSByZXN0YXJ0ZWQgb25jZSBhbm90aGVyIGJ1ZmZlciBzaG93cyB1cC4KKwkgKi8KKwl9IGVsc2UgeworCQlzZXRfYml0KENGX1NHX1JFU1RBUlQsICZjYW0tPmZsYWdzKTsKKwkJc2luZ2xlcysrOworCX0KKwkvKgorCSAqIE5vdyB3ZSBjYW4gZ2l2ZSB0aGUgY29tcGxldGVkIGZyYW1lIGJhY2sgdG8gdXNlciBzcGFjZS4KKwkgKi8KKwlkZWxpdmVyZWQrKzsKKwltY2FtX2J1ZmZlcl9kb25lKGNhbSwgZnJhbWUsICZidWYtPnZiX2J1Zik7Cit9CisKKworLyoKKyAqIFNjYXR0ZXIvZ2F0aGVyIG1vZGUgcmVxdWlyZXMgc3RvcHBpbmcgdGhlIGNvbnRyb2xsZXIgYmV0d2VlbgorICogZnJhbWVzIHNvIHdlIGNhbiBwdXQgaW4gYSBuZXcgRE1BIGRlc2NyaXB0b3IgYXJyYXkuICBJZiBubyBuZXcKKyAqIGJ1ZmZlciBleGlzdHMgYXQgZnJhbWUgY29tcGxldGlvbiwgdGhlIGNvbnRyb2xsZXIgaXMgbGVmdCBzdG9wcGVkOworICogdGhpcyBmdW5jdGlvbiBpcyBjaGFyZ2VkIHdpdGggZ2V0dGlnIHRoaW5ncyBnb2luZyBhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQgbWNhbV9zZ19yZXN0YXJ0KHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCW1jYW1fY3Rscl9kbWFfc2coY2FtKTsKKwltY2FtX2N0bHJfc3RhcnQoY2FtKTsKKwljbGVhcl9iaXQoQ0ZfU0dfUkVTVEFSVCwgJmNhbS0+ZmxhZ3MpOworfQorCisjZWxzZSAvKiBNQ0FNX01PREVfRE1BX1NHICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtY2FtX3NnX3Jlc3RhcnQoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJcmV0dXJuOworfQorCisjZW5kaWYgLyogTUNBTV9NT0RFX0RNQV9TRyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogQnVmZmVyLW1vZGUtaW5kZXBlbmRlbnQgY29udHJvbGxlciBjb2RlLgorICovCisKKy8qCisgKiBJbWFnZSBmb3JtYXQgc2V0dXAKKyAqLworc3RhdGljIHZvaWQgbWNhbV9jdGxyX2ltYWdlKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCWludCBpbWdzejsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpmbXQgPSAmY2FtLT5waXhfZm9ybWF0OworCisJaW1nc3ogPSAoKGZtdC0+aGVpZ2h0IDw8IElNR1NaX1ZfU0hJRlQpICYgSU1HU1pfVl9NQVNLKSB8CisJCShmbXQtPmJ5dGVzcGVybGluZSAmIElNR1NaX0hfTUFTSyk7CisJbWNhbV9yZWdfd3JpdGUoY2FtLCBSRUdfSU1HU0laRSwgaW1nc3opOworCW1jYW1fcmVnX3dyaXRlKGNhbSwgUkVHX0lNR09GRlNFVCwgMCk7CisJLyogWVBJVENIIGp1c3QgZHJvcHMgdGhlIGxhc3QgdHdvIGJpdHMgKi8KKwltY2FtX3JlZ193cml0ZV9tYXNrKGNhbSwgUkVHX0lNR1BJVENILCBmbXQtPmJ5dGVzcGVybGluZSwKKwkJCUlNR1BfWVBfTUFTSyk7CisJLyoKKwkgKiBUZWxsIHRoZSBjb250cm9sbGVyIGFib3V0IHRoZSBpbWFnZSBmb3JtYXQgd2UgYXJlIHVzaW5nLgorCSAqLworCXN3aXRjaCAoY2FtLT5waXhfZm9ybWF0LnBpeGVsZm9ybWF0KSB7CisJY2FzZSBWNEwyX1BJWF9GTVRfWVVZVjoKKwkgICAgbWNhbV9yZWdfd3JpdGVfbWFzayhjYW0sIFJFR19DVFJMMCwKKwkJCSAgICBDMF9ERl9ZVVZ8QzBfWVVWX1BBQ0tFRHxDMF9ZVVZFX1lVWVYsCisJCQkgICAgQzBfREZfTUFTSyk7CisJICAgIGJyZWFrOworCisJY2FzZSBWNEwyX1BJWF9GTVRfUkdCNDQ0OgorCSAgICBtY2FtX3JlZ193cml0ZV9tYXNrKGNhbSwgUkVHX0NUUkwwLAorCQkJICAgIEMwX0RGX1JHQnxDMF9SR0JGXzQ0NHxDMF9SR0I0X1hSR0IsCisJCQkgICAgQzBfREZfTUFTSyk7CisJCS8qIEFscGhhIHZhbHVlPyAqLworCSAgICBicmVhazsKKworCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU2NToKKwkgICAgbWNhbV9yZWdfd3JpdGVfbWFzayhjYW0sIFJFR19DVFJMMCwKKwkJCSAgICBDMF9ERl9SR0J8QzBfUkdCRl81NjV8QzBfUkdCNV9CR0dSLAorCQkJICAgIEMwX0RGX01BU0spOworCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICAgIGNhbV9lcnIoY2FtLCAiVW5rbm93biBmb3JtYXQgJXhcbiIsIGNhbS0+cGl4X2Zvcm1hdC5waXhlbGZvcm1hdCk7CisJICAgIGJyZWFrOworCX0KKwkvKgorCSAqIE1ha2Ugc3VyZSBpdCBrbm93cyB3ZSB3YW50IHRvIHVzZSBoc3luYy92c3luYy4KKwkgKi8KKwltY2FtX3JlZ193cml0ZV9tYXNrKGNhbSwgUkVHX0NUUkwwLCBDMF9TSUZfSFZTWU5DLAorCQkJQzBfU0lGTV9NQVNLKTsKK30KKworCisvKgorICogQ29uZmlndXJlIHRoZSBjb250cm9sbGVyIGZvciBvcGVyYXRpb247IGNhbGxlciBob2xkcyB0aGUKKyAqIGRldmljZSBtdXRleC4KKyAqLworc3RhdGljIGludCBtY2FtX2N0bHJfY29uZmlndXJlKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCWNhbS0+ZG1hX3NldHVwKGNhbSk7CisJbWNhbV9jdGxyX2ltYWdlKGNhbSk7CisJbWNhbV9zZXRfY29uZmlnX25lZWRlZChjYW0sIDApOworCWNsZWFyX2JpdChDRl9TR19SRVNUQVJULCAmY2FtLT5mbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtY2FtX2N0bHJfaXJxX2VuYWJsZShzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwkvKgorCSAqIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdHMsIHNpbmNlIHdlIGRvIG5vdAorCSAqIGV4cGVjdCB0byBoYXZlIEkvTyBhY3RpdmUgcHJpb3IgdG8gZW5hYmxpbmcuCisJICovCisJbWNhbV9yZWdfd3JpdGUoY2FtLCBSRUdfSVJRU1RBVCwgRlJBTUVJUlFTKTsKKwltY2FtX3JlZ19zZXRfYml0KGNhbSwgUkVHX0lSUU1BU0ssIEZSQU1FSVJRUyk7Cit9CisKK3N0YXRpYyB2b2lkIG1jYW1fY3Rscl9pcnFfZGlzYWJsZShzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwltY2FtX3JlZ19jbGVhcl9iaXQoY2FtLCBSRUdfSVJRTUFTSywgRlJBTUVJUlFTKTsKK30KKworCisKK3N0YXRpYyB2b2lkIG1jYW1fY3Rscl9pbml0KHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCS8qCisJICogTWFrZSBzdXJlIGl0J3Mgbm90IHBvd2VyZWQgZG93bi4KKwkgKi8KKwltY2FtX3JlZ19jbGVhcl9iaXQoY2FtLCBSRUdfQ1RSTDEsIEMxX1BXUkRXTik7CisJLyoKKwkgKiBUdXJuIG9mZiB0aGUgZW5hYmxlIGJpdC4gIEl0IHN1cmUgc2hvdWxkIGJlIG9mZiBhbnl3YXksCisJICogYnV0IGl0J3MgZ29vZCB0byBiZSBzdXJlLgorCSAqLworCW1jYW1fcmVnX2NsZWFyX2JpdChjYW0sIFJFR19DVFJMMCwgQzBfRU5BQkxFKTsKKwkvKgorCSAqIENsb2NrIHRoZSBzZW5zb3IgYXBwcm9wcmlhdGVseS4gIENvbnRyb2xsZXIgY2xvY2sgc2hvdWxkCisJICogYmUgNDhNSHosIHNlbnNvciAidHlwaWNhbCIgdmFsdWUgaXMgaGFsZiB0aGF0LgorCSAqLworCW1jYW1fcmVnX3dyaXRlX21hc2soY2FtLCBSRUdfQ0xLQ1RSTCwgMiwgQ0xLX0RJVl9NQVNLKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Cit9CisKKworLyoKKyAqIFN0b3AgdGhlIGNvbnRyb2xsZXIsIGFuZCBkb24ndCByZXR1cm4gdW50aWwgd2UncmUgcmVhbGx5IHN1cmUgdGhhdCBubworICogZnVydGhlciBETUEgaXMgZ29pbmcgb24uCisgKi8KK3N0YXRpYyB2b2lkIG1jYW1fY3Rscl9zdG9wX2RtYShzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBUaGVvcnk6IHN0b3AgdGhlIGNhbWVyYSBjb250cm9sbGVyICh3aGV0aGVyIGl0IGlzIG9wZXJhdGluZworCSAqIG9yIG5vdCkuICBEZWxheSBicmllZmx5IGp1c3QgaW4gY2FzZSB3ZSByYWNlIHdpdGggdGhlIFNPRgorCSAqIGludGVycnVwdCwgdGhlbiB3YWl0IHVudGlsIG5vIERNQSBpcyBhY3RpdmUuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwljbGVhcl9iaXQoQ0ZfU0dfUkVTVEFSVCwgJmNhbS0+ZmxhZ3MpOworCW1jYW1fY3Rscl9zdG9wKGNhbSk7CisJY2FtLT5zdGF0ZSA9IFNfSURMRTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJbXNsZWVwKDQwKTsKKwlpZiAodGVzdF9iaXQoQ0ZfRE1BX0FDVElWRSwgJmNhbS0+ZmxhZ3MpKQorCQljYW1fZXJyKGNhbSwgIlRpbWVvdXQgd2FpdGluZyBmb3IgRE1BIHRvIGVuZFxuIik7CisJCS8qIFRoaXMgd291bGQgYmUgYmFkIG5ld3MgLSB3aGF0IG5vdz8gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCW1jYW1fY3Rscl9pcnFfZGlzYWJsZShjYW0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFBvd2VyIHVwIGFuZCBkb3duLgorICovCitzdGF0aWMgdm9pZCBtY2FtX2N0bHJfcG93ZXJfdXAoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJY2FtLT5wbGF0X3Bvd2VyX3VwKGNhbSk7CisJbWNhbV9yZWdfY2xlYXJfYml0KGNhbSwgUkVHX0NUUkwxLCBDMV9QV1JEV04pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwltc2xlZXAoNSk7IC8qIEp1c3QgdG8gYmUgc3VyZSAqLworfQorCitzdGF0aWMgdm9pZCBtY2FtX2N0bHJfcG93ZXJfZG93bihzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIFNjaG9vbCBvZiBoYXJkIGtub2NrcyBkZXBhcnRtZW50OiBiZSBzdXJlIHdlIGRvIGFueSByZWdpc3RlcgorCSAqIHR3aWRkbGluZyBvbiB0aGUgY29udHJvbGxlciAqYmVmb3JlKiBjYWxsaW5nIHRoZSBwbGF0Zm9ybQorCSAqIHBvd2VyIGRvd24gcm91dGluZS4KKwkgKi8KKwltY2FtX3JlZ19zZXRfYml0KGNhbSwgUkVHX0NUUkwxLCBDMV9QV1JEV04pOworCWNhbS0+cGxhdF9wb3dlcl9kb3duKGNhbSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIENvbW11bmljYXRpb25zIHdpdGggdGhlIHNlbnNvci4KKyAqLworCitzdGF0aWMgaW50IF9fbWNhbV9jYW1fcmVzZXQoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJcmV0dXJuIHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgcmVzZXQsIDApOworfQorCisvKgorICogV2UgaGF2ZSBmb3VuZCB0aGUgc2Vuc29yIG9uIHRoZSBpMmMuICBMZXQncyB0cnkgdG8gaGF2ZSBhCisgKiBjb252ZXJzYXRpb24uCisgKi8KK3N0YXRpYyBpbnQgbWNhbV9jYW1faW5pdChzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlzdHJ1Y3QgdjRsMl9kYmdfY2hpcF9pZGVudCBjaGlwOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCWlmIChjYW0tPnN0YXRlICE9IFNfTk9UUkVBRFkpCisJCWNhbV93YXJuKGNhbSwgIkNhbSBpbml0IHdpdGggZGV2aWNlIGluIGZ1bmt5IHN0YXRlICVkIiwKKwkJCQljYW0tPnN0YXRlKTsKKwlyZXQgPSBfX21jYW1fY2FtX3Jlc2V0KGNhbSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisJY2hpcC5pZGVudCA9IFY0TDJfSURFTlRfTk9ORTsKKwljaGlwLm1hdGNoLnR5cGUgPSBWNEwyX0NISVBfTUFUQ0hfSTJDX0FERFI7CisJY2hpcC5tYXRjaC5hZGRyID0gY2FtLT5zZW5zb3JfYWRkcjsKKwlyZXQgPSBzZW5zb3JfY2FsbChjYW0sIGNvcmUsIGdfY2hpcF9pZGVudCwgJmNoaXApOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCWNhbS0+c2Vuc29yX3R5cGUgPSBjaGlwLmlkZW50OworCWlmIChjYW0tPnNlbnNvcl90eXBlICE9IFY0TDJfSURFTlRfT1Y3NjcwKSB7CisJCWNhbV9lcnIoY2FtLCAiVW5zdXBwb3J0ZWQgc2Vuc29yIHR5cGUgMHgleCIsIGNhbS0+c2Vuc29yX3R5cGUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisvKiBHZXQvc2V0IHBhcmFtZXRlcnM/ICovCisJcmV0ID0gMDsKKwljYW0tPnN0YXRlID0gU19JRExFOworb3V0OgorCW1jYW1fY3Rscl9wb3dlcl9kb3duKGNhbSk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDb25maWd1cmUgdGhlIHNlbnNvciB0byBtYXRjaCB0aGUgcGFyYW1ldGVycyB3ZSBoYXZlLiAgQ2FsbGVyIHNob3VsZAorICogaG9sZCBzX211dGV4CisgKi8KK3N0YXRpYyBpbnQgbWNhbV9jYW1fc2V0X2ZsaXAoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJc3RydWN0IHY0bDJfY29udHJvbCBjdHJsOworCisJbWVtc2V0KCZjdHJsLCAwLCBzaXplb2YoY3RybCkpOworCWN0cmwuaWQgPSBWNEwyX0NJRF9WRkxJUDsKKwljdHJsLnZhbHVlID0gZmxpcDsKKwlyZXR1cm4gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCBzX2N0cmwsICZjdHJsKTsKK30KKworCitzdGF0aWMgaW50IG1jYW1fY2FtX2NvbmZpZ3VyZShzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1idXNfZm10OworCWludCByZXQ7CisKKwl2NGwyX2ZpbGxfbWJ1c19mb3JtYXQoJm1idXNfZm10LCAmY2FtLT5waXhfZm9ybWF0LCBjYW0tPm1idXNfY29kZSk7CisJcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCBpbml0LCAwKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgdmlkZW8sIHNfbWJ1c19mbXQsICZtYnVzX2ZtdCk7CisJLyoKKwkgKiBPVjc2NzAgZG9lcyB3ZWlyZCB0aGluZ3MgaWYgZmxpcCBpcyBzZXQgKmJlZm9yZSogZm9ybWF0Li4uCisJICovCisJcmV0ICs9IG1jYW1fY2FtX3NldF9mbGlwKGNhbSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEdldCBldmVyeXRoaW5nIHJlYWR5LCBhbmQgc3RhcnQgZ3JhYmJpbmcgZnJhbWVzLgorICovCitzdGF0aWMgaW50IG1jYW1fcmVhZF9zZXR1cChzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIENvbmZpZ3VyYXRpb24uICBJZiB3ZSBzdGlsbCBkb24ndCBoYXZlIERNQSBidWZmZXJzLAorCSAqIG1ha2Ugb25lIGxhc3QsIGRlc3BlcmF0ZSBhdHRlbXB0LgorCSAqLworCWlmIChjYW0tPmJ1ZmZlcl9tb2RlID09IEJfdm1hbGxvYyAmJiBjYW0tPm5idWZzID09IDAgJiYKKwkJCW1jYW1fYWxsb2NfZG1hX2J1ZnMoY2FtLCAwKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAobWNhbV9uZWVkc19jb25maWcoY2FtKSkgeworCQltY2FtX2NhbV9jb25maWd1cmUoY2FtKTsKKwkJcmV0ID0gbWNhbV9jdGxyX2NvbmZpZ3VyZShjYW0pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKgorCSAqIFR1cm4gaXQgbG9vc2UuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwltY2FtX3Jlc2V0X2J1ZmZlcnMoY2FtKTsKKwltY2FtX2N0bHJfaXJxX2VuYWJsZShjYW0pOworCWNhbS0+c3RhdGUgPSBTX1NUUkVBTUlORzsKKwltY2FtX2N0bHJfc3RhcnQoY2FtKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogVmlkZW9idWYyIGludGVyZmFjZSBjb2RlLgorICovCisKK3N0YXRpYyBpbnQgbWNhbV92Yl9xdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50ICpuYnVmcywKKwkJdW5zaWduZWQgaW50ICpudW1fcGxhbmVzLCB1bnNpZ25lZCBsb25nIHNpemVzW10sCisJCXZvaWQgKmFsbG9jX2N0eHNbXSkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOworCWludCBtaW5idWZzID0gKGNhbS0+YnVmZmVyX21vZGUgPT0gQl9ETUFfY29udGlnKSA/IDMgOiAyOworCisJc2l6ZXNbMF0gPSBjYW0tPnBpeF9mb3JtYXQuc2l6ZWltYWdlOworCSpudW1fcGxhbmVzID0gMTsgLyogU29tZWRheSB3ZSBoYXZlIHRvIHN1cHBvcnQgcGxhbmFyIGZvcm1hdHMuLi4gKi8KKwlpZiAoKm5idWZzIDwgbWluYnVmcykKKwkJKm5idWZzID0gbWluYnVmczsKKwlpZiAoY2FtLT5idWZmZXJfbW9kZSA9PSBCX0RNQV9jb250aWcpCisJCWFsbG9jX2N0eHNbMF0gPSBjYW0tPnZiX2FsbG9jX2N0eDsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBtY2FtX3ZiX2J1Zl9xdWV1ZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IG1jYW1fdmJfYnVmZmVyICptdmIgPSB2Yl90b19tdmIodmIpOworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gdmIyX2dldF9kcnZfcHJpdih2Yi0+dmIyX3F1ZXVlKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzdGFydDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJc3RhcnQgPSAoY2FtLT5zdGF0ZSA9PSBTX0JVRldBSVQpICYmICFsaXN0X2VtcHR5KCZjYW0tPmJ1ZmZlcnMpOworCWxpc3RfYWRkKCZtdmItPnF1ZXVlLCAmY2FtLT5idWZmZXJzKTsKKwlpZiAodGVzdF9iaXQoQ0ZfU0dfUkVTVEFSVCwgJmNhbS0+ZmxhZ3MpKQorCQltY2FtX3NnX3Jlc3RhcnQoY2FtKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJaWYgKHN0YXJ0KQorCQltY2FtX3JlYWRfc2V0dXAoY2FtKTsKK30KKworCisvKgorICogdmIyIHVzZXMgdGhlc2UgdG8gcmVsZWFzZSB0aGUgbXV0ZXggd2hlbiB3YWl0aW5nIGluIGRxYnVmLiAgSSdtCisgKiBub3QgYWN0dWFsbHkgc3VyZSB3ZSBuZWVkIHRvIGRvIHRoaXMgKEknbSBub3Qgc3VyZSB0aGF0IHZiMl9kcWJ1ZigpIG5lZWRzCisgKiB0byBiZSBjYWxsZWQgd2l0aCB0aGUgbXV0ZXggaGVsZCksIGJ1dCBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5LgorICovCitzdGF0aWMgdm9pZCBtY2FtX3ZiX3dhaXRfcHJlcGFyZShzdHJ1Y3QgdmIyX3F1ZXVlICp2cSkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOworCisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBtY2FtX3ZiX3dhaXRfZmluaXNoKHN0cnVjdCB2YjJfcXVldWUgKnZxKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworfQorCisvKgorICogVGhlc2UgbmVlZCB0byBiZSBjYWxsZWQgd2l0aCB0aGUgbXV0ZXggaGVsZCBmcm9tIHZiMgorICovCitzdGF0aWMgaW50IG1jYW1fdmJfc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnZxKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CisKKwlpZiAoY2FtLT5zdGF0ZSAhPSBTX0lETEUpCisJCXJldHVybiAtRUlOVkFMOworCWNhbS0+c2VxdWVuY2UgPSAwOworCS8qCisJICogVmlkZW9idWYyIHNuZWFraWx5IGhvYXJkcyBhbGwgdGhlIGJ1ZmZlcnMgYW5kIHdvbid0CisJICogZ2l2ZSB0aGVtIHRvIHVzIHVudGlsICphZnRlciogc3RyZWFtaW5nIHN0YXJ0cy4gIEJ1dAorCSAqIHdlIGNhbid0IGFjdHVhbGx5IHN0YXJ0IHN0cmVhbWluZyB1bnRpbCB3ZSBoYXZlIGEKKwkgKiBkZXN0aW5hdGlvbi4gIFNvIGdvIGludG8gYSB3YWl0IHN0YXRlIGFuZCBob3BlIHRoZXkKKwkgKiBnaXZlIHVzIGJ1ZmZlcnMgc29vbi4KKwkgKi8KKwlpZiAoY2FtLT5idWZmZXJfbW9kZSAhPSBCX3ZtYWxsb2MgJiYgbGlzdF9lbXB0eSgmY2FtLT5idWZmZXJzKSkgeworCQljYW0tPnN0YXRlID0gU19CVUZXQUlUOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIG1jYW1fcmVhZF9zZXR1cChjYW0pOworfQorCitzdGF0aWMgaW50IG1jYW1fdmJfc3RvcF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqdnEpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSB2YjJfZ2V0X2Rydl9wcml2KHZxKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGNhbS0+c3RhdGUgPT0gU19CVUZXQUlUKSB7CisJCS8qIFRoZXkgbmV2ZXIgZ2F2ZSB1cyBidWZmZXJzICovCisJCWNhbS0+c3RhdGUgPSBTX0lETEU7CisJCXJldHVybiAwOworCX0KKwlpZiAoY2FtLT5zdGF0ZSAhPSBTX1NUUkVBTUlORykKKwkJcmV0dXJuIC1FSU5WQUw7CisJbWNhbV9jdGxyX3N0b3BfZG1hKGNhbSk7CisJLyoKKwkgKiBWQjIgcmVjbGFpbXMgdGhlIGJ1ZmZlcnMsIHNvIHdlIG5lZWQgdG8gZm9yZ2V0CisJICogYWJvdXQgdGhlbS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCUlOSVRfTElTVF9IRUFEKCZjYW0tPmJ1ZmZlcnMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZiMl9vcHMgbWNhbV92YjJfb3BzID0geworCS5xdWV1ZV9zZXR1cAkJPSBtY2FtX3ZiX3F1ZXVlX3NldHVwLAorCS5idWZfcXVldWUJCT0gbWNhbV92Yl9idWZfcXVldWUsCisJLnN0YXJ0X3N0cmVhbWluZwk9IG1jYW1fdmJfc3RhcnRfc3RyZWFtaW5nLAorCS5zdG9wX3N0cmVhbWluZwkJPSBtY2FtX3ZiX3N0b3Bfc3RyZWFtaW5nLAorCS53YWl0X3ByZXBhcmUJCT0gbWNhbV92Yl93YWl0X3ByZXBhcmUsCisJLndhaXRfZmluaXNoCQk9IG1jYW1fdmJfd2FpdF9maW5pc2gsCit9OworCisKKyNpZmRlZiBNQ0FNX01PREVfRE1BX1NHCisvKgorICogU2NhdHRlci9nYXRoZXIgbW9kZSB1c2VzIGFsbCBvZiB0aGUgYWJvdmUgZnVuY3Rpb25zIHBsdXMgYQorICogZmV3IGV4dHJhcyB0byBkZWFsIHdpdGggRE1BIG1hcHBpbmcuCisgKi8KK3N0YXRpYyBpbnQgbWNhbV92Yl9zZ19idWZfaW5pdChzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IG1jYW1fdmJfYnVmZmVyICptdmIgPSB2Yl90b19tdmIodmIpOworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gdmIyX2dldF9kcnZfcHJpdih2Yi0+dmIyX3F1ZXVlKTsKKwlpbnQgbmRlc2MgPSBjYW0tPnBpeF9mb3JtYXQuc2l6ZWltYWdlL1BBR0VfU0laRSArIDE7CisKKwltdmItPmRtYV9kZXNjID0gZG1hX2FsbG9jX2NvaGVyZW50KGNhbS0+ZGV2LAorCQkJbmRlc2MgKiBzaXplb2Yoc3RydWN0IG1jYW1fZG1hX2Rlc2MpLAorCQkJJm12Yi0+ZG1hX2Rlc2NfcGEsIEdGUF9LRVJORUwpOworCWlmIChtdmItPmRtYV9kZXNjID09IE5VTEwpIHsKKwkJY2FtX2VycihjYW0sICJVbmFibGUgdG8gZ2V0IERNQSBkZXNjcmlwdG9yIGFycmF5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1jYW1fdmJfc2dfYnVmX3ByZXBhcmUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBtY2FtX3ZiX2J1ZmZlciAqbXZiID0gdmJfdG9fbXZiKHZiKTsKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHZiMl9nZXRfZHJ2X3ByaXYodmItPnZiMl9xdWV1ZSk7CisJc3RydWN0IHZiMl9kbWFfc2dfZGVzYyAqc2dkID0gdmIyX2RtYV9zZ19wbGFuZV9kZXNjKHZiLCAwKTsKKwlzdHJ1Y3QgbWNhbV9kbWFfZGVzYyAqZGVzYyA9IG12Yi0+ZG1hX2Rlc2M7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlpbnQgaTsKKworCW12Yi0+ZG1hX2Rlc2NfbmVudCA9IGRtYV9tYXBfc2coY2FtLT5kZXYsIHNnZC0+c2dsaXN0LCBzZ2QtPm51bV9wYWdlcywKKwkJCURNQV9GUk9NX0RFVklDRSk7CisJaWYgKG12Yi0+ZG1hX2Rlc2NfbmVudCA8PSAwKQorCQlyZXR1cm4gLUVJTzsgIC8qIE5vdCBzdXJlIHdoYXQncyByaWdodCBoZXJlICovCisJZm9yX2VhY2hfc2coc2dkLT5zZ2xpc3QsIHNnLCBtdmItPmRtYV9kZXNjX25lbnQsIGkpIHsKKwkJZGVzYy0+ZG1hX2FkZHIgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCWRlc2MtPnNlZ21lbnRfbGVuID0gc2dfZG1hX2xlbihzZyk7CisJCWRlc2MrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWNhbV92Yl9zZ19idWZfZmluaXNoKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHZiMl9nZXRfZHJ2X3ByaXYodmItPnZiMl9xdWV1ZSk7CisJc3RydWN0IHZiMl9kbWFfc2dfZGVzYyAqc2dkID0gdmIyX2RtYV9zZ19wbGFuZV9kZXNjKHZiLCAwKTsKKworCWRtYV91bm1hcF9zZyhjYW0tPmRldiwgc2dkLT5zZ2xpc3QsIHNnZC0+bnVtX3BhZ2VzLCBETUFfRlJPTV9ERVZJQ0UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtY2FtX3ZiX3NnX2J1Zl9jbGVhbnVwKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHZiMl9nZXRfZHJ2X3ByaXYodmItPnZiMl9xdWV1ZSk7CisJc3RydWN0IG1jYW1fdmJfYnVmZmVyICptdmIgPSB2Yl90b19tdmIodmIpOworCWludCBuZGVzYyA9IGNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2UvUEFHRV9TSVpFICsgMTsKKworCWRtYV9mcmVlX2NvaGVyZW50KGNhbS0+ZGV2LCBuZGVzYyAqIHNpemVvZihzdHJ1Y3QgbWNhbV9kbWFfZGVzYyksCisJCQltdmItPmRtYV9kZXNjLCBtdmItPmRtYV9kZXNjX3BhKTsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZiMl9vcHMgbWNhbV92YjJfc2dfb3BzID0geworCS5xdWV1ZV9zZXR1cAkJPSBtY2FtX3ZiX3F1ZXVlX3NldHVwLAorCS5idWZfaW5pdAkJPSBtY2FtX3ZiX3NnX2J1Zl9pbml0LAorCS5idWZfcHJlcGFyZQkJPSBtY2FtX3ZiX3NnX2J1Zl9wcmVwYXJlLAorCS5idWZfcXVldWUJCT0gbWNhbV92Yl9idWZfcXVldWUsCisJLmJ1Zl9maW5pc2gJCT0gbWNhbV92Yl9zZ19idWZfZmluaXNoLAorCS5idWZfY2xlYW51cAkJPSBtY2FtX3ZiX3NnX2J1Zl9jbGVhbnVwLAorCS5zdGFydF9zdHJlYW1pbmcJPSBtY2FtX3ZiX3N0YXJ0X3N0cmVhbWluZywKKwkuc3RvcF9zdHJlYW1pbmcJCT0gbWNhbV92Yl9zdG9wX3N0cmVhbWluZywKKwkud2FpdF9wcmVwYXJlCQk9IG1jYW1fdmJfd2FpdF9wcmVwYXJlLAorCS53YWl0X2ZpbmlzaAkJPSBtY2FtX3ZiX3dhaXRfZmluaXNoLAorfTsKKworI2VuZGlmIC8qIE1DQU1fTU9ERV9ETUFfU0cgKi8KKworc3RhdGljIGludCBtY2FtX3NldHVwX3ZiMihzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlzdHJ1Y3QgdmIyX3F1ZXVlICp2cSA9ICZjYW0tPnZiX3F1ZXVlOworCisJbWVtc2V0KHZxLCAwLCBzaXplb2YoKnZxKSk7CisJdnEtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJdnEtPmRydl9wcml2ID0gY2FtOworCUlOSVRfTElTVF9IRUFEKCZjYW0tPmJ1ZmZlcnMpOworCXN3aXRjaCAoY2FtLT5idWZmZXJfbW9kZSkgeworCWNhc2UgQl9ETUFfY29udGlnOgorI2lmZGVmIE1DQU1fTU9ERV9ETUFfQ09OVElHCisJCXZxLT5vcHMgPSAmbWNhbV92YjJfb3BzOworCQl2cS0+bWVtX29wcyA9ICZ2YjJfZG1hX2NvbnRpZ19tZW1vcHM7CisJCWNhbS0+dmJfYWxsb2NfY3R4ID0gdmIyX2RtYV9jb250aWdfaW5pdF9jdHgoY2FtLT5kZXYpOworCQl2cS0+aW9fbW9kZXMgPSBWQjJfTU1BUCB8IFZCMl9VU0VSUFRSOworCQljYW0tPmRtYV9zZXR1cCA9IG1jYW1fY3Rscl9kbWFfY29udGlnOworCQljYW0tPmZyYW1lX2NvbXBsZXRlID0gbWNhbV9kbWFfY29udGlnX2RvbmU7CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSBCX0RNQV9zZzoKKyNpZmRlZiBNQ0FNX01PREVfRE1BX1NHCisJCXZxLT5vcHMgPSAmbWNhbV92YjJfc2dfb3BzOworCQl2cS0+bWVtX29wcyA9ICZ2YjJfZG1hX3NnX21lbW9wczsKKwkJdnEtPmlvX21vZGVzID0gVkIyX01NQVAgfCBWQjJfVVNFUlBUUjsKKwkJY2FtLT5kbWFfc2V0dXAgPSBtY2FtX2N0bHJfZG1hX3NnOworCQljYW0tPmZyYW1lX2NvbXBsZXRlID0gbWNhbV9kbWFfc2dfZG9uZTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIEJfdm1hbGxvYzoKKyNpZmRlZiBNQ0FNX01PREVfVk1BTExPQworCQl0YXNrbGV0X2luaXQoJmNhbS0+c190YXNrbGV0LCBtY2FtX2ZyYW1lX3Rhc2tsZXQsCisJCQkJKHVuc2lnbmVkIGxvbmcpIGNhbSk7CisJCXZxLT5vcHMgPSAmbWNhbV92YjJfb3BzOworCQl2cS0+bWVtX29wcyA9ICZ2YjJfdm1hbGxvY19tZW1vcHM7CisJCXZxLT5idWZfc3RydWN0X3NpemUgPSBzaXplb2Yoc3RydWN0IG1jYW1fdmJfYnVmZmVyKTsKKwkJdnEtPmlvX21vZGVzID0gVkIyX01NQVA7CisJCWNhbS0+ZG1hX3NldHVwID0gbWNhbV9jdGxyX2RtYV92bWFsbG9jOworCQljYW0tPmZyYW1lX2NvbXBsZXRlID0gbWNhbV92bWFsbG9jX2RvbmU7CisjZW5kaWYKKwkJYnJlYWs7CisJfQorCXJldHVybiB2YjJfcXVldWVfaW5pdCh2cSk7Cit9CisKK3N0YXRpYyB2b2lkIG1jYW1fY2xlYW51cF92YjIoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJdmIyX3F1ZXVlX3JlbGVhc2UoJmNhbS0+dmJfcXVldWUpOworI2lmZGVmIE1DQU1fTU9ERV9ETUFfQ09OVElHCisJaWYgKGNhbS0+YnVmZmVyX21vZGUgPT0gQl9ETUFfY29udGlnKQorCQl2YjJfZG1hX2NvbnRpZ19jbGVhbnVwX2N0eChjYW0tPnZiX2FsbG9jX2N0eCk7CisjZW5kaWYKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogVGhlIGxvbmcgbGlzdCBvZiBWNEwyIGlvY3RsKCkgb3BlcmF0aW9ucy4KKyAqLworCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXQgPSB2YjJfc3RyZWFtb24oJmNhbS0+dmJfcXVldWUsIHR5cGUpOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXQgPSB2YjJfc3RyZWFtb2ZmKCZjYW0tPnZiX3F1ZXVlLCB0eXBlKTsKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyZXEpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJcmV0ID0gdmIyX3JlcWJ1ZnMoJmNhbS0+dmJfcXVldWUsIHJlcSk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBtY2FtX3ZpZGlvY19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJcmV0ID0gdmIyX3F1ZXJ5YnVmKCZjYW0tPnZiX3F1ZXVlLCBidWYpOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX3FidWYoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IHZiMl9xYnVmKCZjYW0tPnZiX3F1ZXVlLCBidWYpOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXQgPSB2YjJfZHFidWYoJmNhbS0+dmJfcXVldWUsIGJ1ZiwgZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisKKworc3RhdGljIGludCBtY2FtX3ZpZGlvY19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBwcml2OworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgcXVlcnljdHJsLCBxYyk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBtY2FtX3ZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBwcml2OworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgZ19jdHJsLCBjdHJsKTsKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHByaXY7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCBzX2N0cmwsIGN0cmwpOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKK3sKKwlzdHJjcHkoY2FwLT5kcml2ZXIsICJtYXJ2ZWxsX2NjaWMiKTsKKwlzdHJjcHkoY2FwLT5jYXJkLCAibWFydmVsbF9jY2ljIik7CisJY2FwLT52ZXJzaW9uID0gMTsKKwljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAorCQlWNEwyX0NBUF9SRUFEV1JJVEUgfCBWNEwyX0NBUF9TVFJFQU1JTkc7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBtY2FtX3ZpZGlvY19lbnVtX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxwLAorCQl2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmbXQpCit7CisJaWYgKGZtdC0+aW5kZXggPj0gTl9NQ0FNX0ZNVFMpCisJCXJldHVybiAtRUlOVkFMOworCXN0cmxjcHkoZm10LT5kZXNjcmlwdGlvbiwgbWNhbV9mb3JtYXRzW2ZtdC0+aW5kZXhdLmRlc2MsCisJCQlzaXplb2YoZm10LT5kZXNjcmlwdGlvbikpOworCWZtdC0+cGl4ZWxmb3JtYXQgPSBtY2FtX2Zvcm1hdHNbZm10LT5pbmRleF0ucGl4ZWxmb3JtYXQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHByaXY7CisJc3RydWN0IG1jYW1fZm9ybWF0X3N0cnVjdCAqZjsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXggPSAmZm10LT5mbXQucGl4OworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgbWJ1c19mbXQ7CisJaW50IHJldDsKKworCWYgPSBtY2FtX2ZpbmRfZm9ybWF0KHBpeC0+cGl4ZWxmb3JtYXQpOworCXBpeC0+cGl4ZWxmb3JtYXQgPSBmLT5waXhlbGZvcm1hdDsKKwl2NGwyX2ZpbGxfbWJ1c19mb3JtYXQoJm1idXNfZm10LCBwaXgsIGYtPm1idXNfY29kZSk7CisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXQgPSBzZW5zb3JfY2FsbChjYW0sIHZpZGVvLCB0cnlfbWJ1c19mbXQsICZtYnVzX2ZtdCk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXY0bDJfZmlsbF9waXhfZm9ybWF0KHBpeCwgJm1idXNfZm10KTsKKwlwaXgtPmJ5dGVzcGVybGluZSA9IHBpeC0+d2lkdGggKiBmLT5icHA7CisJcGl4LT5zaXplaW1hZ2UgPSBwaXgtPmhlaWdodCAqIHBpeC0+Ynl0ZXNwZXJsaW5lOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2Nfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBwcml2OworCXN0cnVjdCBtY2FtX2Zvcm1hdF9zdHJ1Y3QgKmY7CisJaW50IHJldDsKKworCS8qCisJICogQ2FuJ3QgZG8gYW55dGhpbmcgaWYgdGhlIGRldmljZSBpcyBub3QgaWRsZQorCSAqIEFsc28gY2FuJ3QgaWYgdGhlcmUgYXJlIHN0cmVhbWluZyBidWZmZXJzIGluIHBsYWNlLgorCSAqLworCWlmIChjYW0tPnN0YXRlICE9IFNfSURMRSB8fCBjYW0tPnZiX3F1ZXVlLm51bV9idWZmZXJzID4gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWYgPSBtY2FtX2ZpbmRfZm9ybWF0KGZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCk7CisKKwkvKgorCSAqIFNlZSBpZiB0aGUgZm9ybWF0dGluZyB3b3JrcyBpbiBwcmluY2lwbGUuCisJICovCisJcmV0ID0gbWNhbV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwKGZpbHAsIHByaXYsIGZtdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwkvKgorCSAqIE5vdyB3ZSBzdGFydCB0byBjaGFuZ2UgdGhpbmdzIGZvciByZWFsLCBzbyBsZXQncyBkbyBpdAorCSAqIHVuZGVyIGxvY2suCisJICovCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwljYW0tPnBpeF9mb3JtYXQgPSBmbXQtPmZtdC5waXg7CisJY2FtLT5tYnVzX2NvZGUgPSBmLT5tYnVzX2NvZGU7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB3ZSBoYXZlIGFwcHJvcHJpYXRlIERNQSBidWZmZXJzLgorCSAqLworCWlmIChjYW0tPmJ1ZmZlcl9tb2RlID09IEJfdm1hbGxvYykgeworCQlyZXQgPSBtY2FtX2NoZWNrX2RtYV9idWZmZXJzKGNhbSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisJbWNhbV9zZXRfY29uZmlnX25lZWRlZChjYW0sIDEpOworCXJldCA9IDA7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZXR1cm4gb3VyIHN0b3JlZCBub3Rpb24gb2YgaG93IHRoZSBjYW1lcmEgaXMvc2hvdWxkIGJlIGNvbmZpZ3VyZWQuCisgKiBUaGUgVjRsMiBzcGVjIHdhbnRzIHVzIHRvIGJlIHNtYXJ0ZXIsIGFuZCBhY3R1YWxseSBnZXQgdGhpcyBmcm9tCisgKiB0aGUgY2FtZXJhIChhbmQgbm90IG1lc3Mgd2l0aCBpdCBhdCBvcGVuIHRpbWUpLiAgU29tZWRheS4KKyAqLworc3RhdGljIGludCBtY2FtX3ZpZGlvY19nX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBwcml2OworCisJZi0+Zm10LnBpeCA9IGNhbS0+cGl4X2Zvcm1hdDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdlIG9ubHkgaGF2ZSBvbmUgaW5wdXQgLSB0aGUgc2Vuc29yIC0gc28gbWluaW1pemUgdGhlIG5vbnNlbnNlIGhlcmUuCisgKi8KK3N0YXRpYyBpbnQgbWNhbV92aWRpb2NfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfaW5wdXQgKmlucHV0KQoreworCWlmIChpbnB1dC0+aW5kZXggIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpbnB1dC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7CisJaW5wdXQtPnN0ZCA9IFY0TDJfU1REX0FMTDsgLyogTm90IHN1cmUgd2hhdCBzaG91bGQgZ28gaGVyZSAqLworCXN0cmNweShpbnB1dC0+bmFtZSwgIkNhbWVyYSIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCAqaSkKK3sKKwkqaSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2Nfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGkpCit7CisJaWYgKGkgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKKy8qIGZyb20gdml2aS5jICovCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX3Nfc3RkKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCAqYSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEcvU19QQVJNLiAgTW9zdCBvZiB0aGlzIGlzIGRvbmUgYnkgdGhlIHNlbnNvciwgYnV0IHdlIGFyZQorICogdGhlIGxldmVsIHdoaWNoIGNvbnRyb2xzIHRoZSBudW1iZXIgb2YgcmVhZCBidWZmZXJzLgorICovCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX2dfcGFybShzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybXMpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBwcml2OworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgdmlkZW8sIGdfcGFybSwgcGFybXMpOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlwYXJtcy0+cGFybS5jYXB0dXJlLnJlYWRidWZmZXJzID0gbl9kbWFfYnVmczsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX3NfcGFybShzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybXMpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBwcml2OworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgdmlkZW8sIHNfcGFybSwgcGFybXMpOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlwYXJtcy0+cGFybS5jYXB0dXJlLnJlYWRidWZmZXJzID0gbl9kbWFfYnVmczsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX2dfY2hpcF9pZGVudChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfZGJnX2NoaXBfaWRlbnQgKmNoaXApCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBwcml2OworCisJY2hpcC0+aWRlbnQgPSBWNEwyX0lERU5UX05PTkU7CisJY2hpcC0+cmV2aXNpb24gPSAwOworCWlmICh2NGwyX2NoaXBfbWF0Y2hfaG9zdCgmY2hpcC0+bWF0Y2gpKSB7CisJCWNoaXAtPmlkZW50ID0gY2FtLT5jaGlwX2lkOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgZ19jaGlwX2lkZW50LCBjaGlwKTsKK30KKworc3RhdGljIGludCBtY2FtX3ZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX2ZybXNpemVlbnVtICpzaXplcykKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHByaXY7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCB2aWRlbywgZW51bV9mcmFtZXNpemVzLCBzaXplcyk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2NfZW51bV9mcmFtZWludGVydmFscyhzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfZnJtaXZhbGVudW0gKmludGVydmFsKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gcHJpdjsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXQgPSBzZW5zb3JfY2FsbChjYW0sIHZpZGVvLCBlbnVtX2ZyYW1laW50ZXJ2YWxzLCBpbnRlcnZhbCk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX2dfcmVnaXN0ZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gcHJpdjsKKworCWlmICh2NGwyX2NoaXBfbWF0Y2hfaG9zdCgmcmVnLT5tYXRjaCkpIHsKKwkJcmVnLT52YWwgPSBtY2FtX3JlZ19yZWFkKGNhbSwgcmVnLT5yZWcpOworCQlyZWctPnNpemUgPSA0OworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgZ19yZWdpc3RlciwgcmVnKTsKK30KKworc3RhdGljIGludCBtY2FtX3ZpZGlvY19zX3JlZ2lzdGVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZykKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHByaXY7CisKKwlpZiAodjRsMl9jaGlwX21hdGNoX2hvc3QoJnJlZy0+bWF0Y2gpKSB7CisJCW1jYW1fcmVnX3dyaXRlKGNhbSwgcmVnLT5yZWcsIHJlZy0+dmFsKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBzZW5zb3JfY2FsbChjYW0sIGNvcmUsIHNfcmVnaXN0ZXIsIHJlZyk7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyBtY2FtX3Y0bF9pb2N0bF9vcHMgPSB7CisJLnZpZGlvY19xdWVyeWNhcAk9IG1jYW1fdmlkaW9jX3F1ZXJ5Y2FwLAorCS52aWRpb2NfZW51bV9mbXRfdmlkX2NhcCA9IG1jYW1fdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAsCisJLnZpZGlvY190cnlfZm10X3ZpZF9jYXAJPSBtY2FtX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAsCisJLnZpZGlvY19zX2ZtdF92aWRfY2FwCT0gbWNhbV92aWRpb2Nfc19mbXRfdmlkX2NhcCwKKwkudmlkaW9jX2dfZm10X3ZpZF9jYXAJPSBtY2FtX3ZpZGlvY19nX2ZtdF92aWRfY2FwLAorCS52aWRpb2NfZW51bV9pbnB1dAk9IG1jYW1fdmlkaW9jX2VudW1faW5wdXQsCisJLnZpZGlvY19nX2lucHV0CQk9IG1jYW1fdmlkaW9jX2dfaW5wdXQsCisJLnZpZGlvY19zX2lucHV0CQk9IG1jYW1fdmlkaW9jX3NfaW5wdXQsCisJLnZpZGlvY19zX3N0ZAkJPSBtY2FtX3ZpZGlvY19zX3N0ZCwKKwkudmlkaW9jX3JlcWJ1ZnMJCT0gbWNhbV92aWRpb2NfcmVxYnVmcywKKwkudmlkaW9jX3F1ZXJ5YnVmCT0gbWNhbV92aWRpb2NfcXVlcnlidWYsCisJLnZpZGlvY19xYnVmCQk9IG1jYW1fdmlkaW9jX3FidWYsCisJLnZpZGlvY19kcWJ1ZgkJPSBtY2FtX3ZpZGlvY19kcWJ1ZiwKKwkudmlkaW9jX3N0cmVhbW9uCT0gbWNhbV92aWRpb2Nfc3RyZWFtb24sCisJLnZpZGlvY19zdHJlYW1vZmYJPSBtY2FtX3ZpZGlvY19zdHJlYW1vZmYsCisJLnZpZGlvY19xdWVyeWN0cmwJPSBtY2FtX3ZpZGlvY19xdWVyeWN0cmwsCisJLnZpZGlvY19nX2N0cmwJCT0gbWNhbV92aWRpb2NfZ19jdHJsLAorCS52aWRpb2Nfc19jdHJsCQk9IG1jYW1fdmlkaW9jX3NfY3RybCwKKwkudmlkaW9jX2dfcGFybQkJPSBtY2FtX3ZpZGlvY19nX3Bhcm0sCisJLnZpZGlvY19zX3Bhcm0JCT0gbWNhbV92aWRpb2Nfc19wYXJtLAorCS52aWRpb2NfZW51bV9mcmFtZXNpemVzID0gbWNhbV92aWRpb2NfZW51bV9mcmFtZXNpemVzLAorCS52aWRpb2NfZW51bV9mcmFtZWludGVydmFscyA9IG1jYW1fdmlkaW9jX2VudW1fZnJhbWVpbnRlcnZhbHMsCisJLnZpZGlvY19nX2NoaXBfaWRlbnQJPSBtY2FtX3ZpZGlvY19nX2NoaXBfaWRlbnQsCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworCS52aWRpb2NfZ19yZWdpc3Rlcgk9IG1jYW1fdmlkaW9jX2dfcmVnaXN0ZXIsCisJLnZpZGlvY19zX3JlZ2lzdGVyCT0gbWNhbV92aWRpb2Nfc19yZWdpc3RlciwKKyNlbmRpZgorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIE91ciB2YXJpb3VzIGZpbGUgb3BlcmF0aW9ucy4KKyAqLworc3RhdGljIGludCBtY2FtX3Y0bF9vcGVuKHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKKwlpbnQgcmV0ID0gMDsKKworCWZpbHAtPnByaXZhdGVfZGF0YSA9IGNhbTsKKworCWZyYW1lcyA9IHNpbmdsZXMgPSBkZWxpdmVyZWQgPSAwOworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJaWYgKGNhbS0+dXNlcnMgPT0gMCkgeworCQlyZXQgPSBtY2FtX3NldHVwX3ZiMihjYW0pOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJCW1jYW1fY3Rscl9wb3dlcl91cChjYW0pOworCQlfX21jYW1fY2FtX3Jlc2V0KGNhbSk7CisJCW1jYW1fc2V0X2NvbmZpZ19uZWVkZWQoY2FtLCAxKTsKKwl9CisJKGNhbS0+dXNlcnMpKys7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBtY2FtX3Y0bF9yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJY2FtX2VycihjYW0sICJSZWxlYXNlLCAlZCBmcmFtZXMsICVkIHNpbmdsZXMsICVkIGRlbGl2ZXJlZFxuIiwgZnJhbWVzLAorCQkJc2luZ2xlcywgZGVsaXZlcmVkKTsKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCShjYW0tPnVzZXJzKS0tOworCWlmIChmaWxwID09IGNhbS0+b3duZXIpIHsKKwkJbWNhbV9jdGxyX3N0b3BfZG1hKGNhbSk7CisJCWNhbS0+b3duZXIgPSBOVUxMOworCX0KKwlpZiAoY2FtLT51c2VycyA9PSAwKSB7CisJCW1jYW1fY2xlYW51cF92YjIoY2FtKTsKKwkJbWNhbV9jdGxyX3Bvd2VyX2Rvd24oY2FtKTsKKwkJaWYgKGNhbS0+YnVmZmVyX21vZGUgPT0gQl92bWFsbG9jICYmIGFsbG9jX2J1ZnNfYXRfcmVhZCkKKwkJCW1jYW1fZnJlZV9kbWFfYnVmcyhjYW0pOworCX0KKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1jYW1fdjRsX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsCisJCWNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IHZiMl9yZWFkKCZjYW0tPnZiX3F1ZXVlLCBidWZmZXIsIGxlbiwgcG9zLAorCQkJZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisKKworc3RhdGljIHVuc2lnbmVkIGludCBtY2FtX3Y0bF9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLAorCQlzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKnB0KQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IHZiMl9wb2xsKCZjYW0tPnZiX3F1ZXVlLCBmaWxwLCBwdCk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBtY2FtX3Y0bF9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXQgPSB2YjJfbW1hcCgmY2FtLT52Yl9xdWV1ZSwgdm1hKTsKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgbWNhbV92NGxfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IG1jYW1fdjRsX29wZW4sCisJLnJlbGVhc2UgPSBtY2FtX3Y0bF9yZWxlYXNlLAorCS5yZWFkID0gbWNhbV92NGxfcmVhZCwKKwkucG9sbCA9IG1jYW1fdjRsX3BvbGwsCisJLm1tYXAgPSBtY2FtX3Y0bF9tbWFwLAorCS51bmxvY2tlZF9pb2N0bCA9IHZpZGVvX2lvY3RsMiwKK307CisKKworLyoKKyAqIFRoaXMgdGVtcGxhdGUgZGV2aWNlIGhvbGRzIGFsbCBvZiB0aG9zZSB2NGwyIG1ldGhvZHM7IHdlCisgKiBjbG9uZSBpdCBmb3Igc3BlY2lmaWMgcmVhbCBkZXZpY2VzLgorICovCitzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBtY2FtX3Y0bF90ZW1wbGF0ZSA9IHsKKwkubmFtZSA9ICJtY2FtIiwKKwkudHZub3JtcyA9IFY0TDJfU1REX05UU0NfTSwKKwkuY3VycmVudF9ub3JtID0gVjRMMl9TVERfTlRTQ19NLCAgLyogbWFrZSBtcGxheWVyIGhhcHB5ICovCisKKwkuZm9wcyA9ICZtY2FtX3Y0bF9mb3BzLAorCS5pb2N0bF9vcHMgPSAmbWNhbV92NGxfaW9jdGxfb3BzLAorCS5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2VfZW1wdHksCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogSW50ZXJydXB0IGhhbmRsZXIgc3R1ZmYKKyAqLworc3RhdGljIHZvaWQgbWNhbV9mcmFtZV9jb21wbGV0ZShzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSwgaW50IGZyYW1lKQoreworCS8qCisJICogQmFzaWMgZnJhbWUgaG91c2VrZWVwaW5nLgorCSAqLworCXNldF9iaXQoZnJhbWUsICZjYW0tPmZsYWdzKTsKKwljbGVhcl9iaXQoQ0ZfRE1BX0FDVElWRSwgJmNhbS0+ZmxhZ3MpOworCWNhbS0+bmV4dF9idWYgPSBmcmFtZTsKKwljYW0tPmJ1Zl9zZXFbZnJhbWVdID0gKysoY2FtLT5zZXF1ZW5jZSk7CisJZnJhbWVzKys7CisJLyoKKwkgKiAiVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIgorCSAqLworCWlmIChjYW0tPnN0YXRlICE9IFNfU1RSRUFNSU5HKQorCQlyZXR1cm47CisJLyoKKwkgKiBQcm9jZXNzIHRoZSBmcmFtZSBhbmQgc2V0IHVwIHRoZSBuZXh0IG9uZS4KKwkgKi8KKwljYW0tPmZyYW1lX2NvbXBsZXRlKGNhbSwgZnJhbWUpOworfQorCisKKy8qCisgKiBUaGUgaW50ZXJydXB0IGhhbmRsZXI7IHRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIGZyb20gdGhlCisgKiBwbGF0Zm9ybSBpcnEgaGFuZGxlciB3aXRoIHRoZSBsb2NrIGhlbGQuCisgKi8KK2ludCBtY2NpY19pcnEoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0sIHVuc2lnbmVkIGludCBpcnFzKQoreworCXVuc2lnbmVkIGludCBmcmFtZSwgaGFuZGxlZCA9IDA7CisKKwltY2FtX3JlZ193cml0ZShjYW0sIFJFR19JUlFTVEFULCBGUkFNRUlSUVMpOyAvKiBDbGVhcidlbSBhbGwgKi8KKwkvKgorCSAqIEhhbmRsZSBhbnkgZnJhbWUgY29tcGxldGlvbnMuICBUaGVyZSByZWFsbHkgc2hvdWxkCisJICogbm90IGJlIG1vcmUgdGhhbiBvbmUgb2YgdGhlc2UsIG9yIHdlIGhhdmUgZmFsbGVuCisJICogZmFyIGJlaGluZC4KKwkgKgorCSAqIFdoZW4gcnVubmluZyBpbiBTL0cgbW9kZSwgdGhlIGZyYW1lIG51bWJlciBsYWNrcyBhbnkKKwkgKiByZWFsIG1lYW5pbmcgLSB0aGVyZSdzIG9ubHkgb25lIGRlc2NyaXB0b3IgYXJyYXkgLSBidXQKKwkgKiB0aGUgY29udHJvbGxlciBzdGlsbCBwaWNrcyBhIGRpZmZlcmVudCBvbmUgdG8gc2lnbmFsCisJICogZWFjaCB0aW1lLgorCSAqLworCWZvciAoZnJhbWUgPSAwOyBmcmFtZSA8IGNhbS0+bmJ1ZnM7IGZyYW1lKyspCisJCWlmIChpcnFzICYgKElSUV9FT0YwIDw8IGZyYW1lKSkgeworCQkJbWNhbV9mcmFtZV9jb21wbGV0ZShjYW0sIGZyYW1lKTsKKwkJCWhhbmRsZWQgPSAxOworCQl9CisJLyoKKwkgKiBJZiBhIGZyYW1lIHN0YXJ0cywgbm90ZSB0aGF0IHdlIGhhdmUgRE1BIGFjdGl2ZS4gIFRoaXMKKwkgKiBjb2RlIGFzc3VtZXMgdGhhdCB3ZSB3b24ndCBnZXQgbXVsdGlwbGUgZnJhbWUgaW50ZXJydXB0cworCSAqIGF0IG9uY2U7IG1heSB3YW50IHRvIHJldGhpbmsgdGhhdC4KKwkgKi8KKwlpZiAoaXJxcyAmIChJUlFfU09GMCB8IElSUV9TT0YxIHwgSVJRX1NPRjIpKSB7CisJCXNldF9iaXQoQ0ZfRE1BX0FDVElWRSwgJmNhbS0+ZmxhZ3MpOworCQloYW5kbGVkID0gMTsKKwkJaWYgKGNhbS0+YnVmZmVyX21vZGUgPT0gQl9ETUFfc2cpCisJCQltY2FtX2N0bHJfc3RvcChjYW0pOworCX0KKwlyZXR1cm4gaGFuZGxlZDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFJlZ2lzdHJhdGlvbiBhbmQgc3VjaC4KKyAqLworc3RhdGljIHN0cnVjdCBvdjc2NzBfY29uZmlnIHNlbnNvcl9jZmcgPSB7CisJLyoKKwkgKiBFeGNsdWRlIFFDSUYgbW9kZSwgYmVjYXVzZSBpdCBvbmx5IGNhcHR1cmVzIGEgdGlueSBwb3J0aW9uCisJICogb2YgdGhlIHNlbnNvciBGT1YKKwkgKi8KKwkubWluX3dpZHRoID0gMzIwLAorCS5taW5faGVpZ2h0ID0gMjQwLAorfTsKKworCitpbnQgbWNjaWNfcmVnaXN0ZXIoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJc3RydWN0IGkyY19ib2FyZF9pbmZvIG92NzY3MF9pbmZvID0geworCQkudHlwZSA9ICJvdjc2NzAiLAorCQkuYWRkciA9IDB4NDIgPj4gMSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmc2Vuc29yX2NmZywKKwl9OworCWludCByZXQ7CisKKwkvKgorCSAqIFZhbGlkYXRlIHRoZSByZXF1ZXN0ZWQgYnVmZmVyIG1vZGUuCisJICovCisJaWYgKGJ1ZmZlcl9tb2RlID49IDApCisJCWNhbS0+YnVmZmVyX21vZGUgPSBidWZmZXJfbW9kZTsKKwlpZiAoY2FtLT5idWZmZXJfbW9kZSA9PSBCX0RNQV9zZyAmJgorCQkJY2FtLT5jaGlwX2lkID09IFY0TDJfSURFTlRfQ0FGRSkgeworCQlwcmludGsoS0VSTl9FUlIgIm1hcnZlbGwtY2FtOiBDYWZlIGNhbid0IGRvIFMvRyBJL08sICIKKwkJCSJhdHRlbXB0aW5nIHZtYWxsb2MgbW9kZSBpbnN0ZWFkXG4iKTsKKwkJY2FtLT5idWZmZXJfbW9kZSA9IEJfdm1hbGxvYzsKKwl9CisJaWYgKCFtY2FtX2J1ZmZlcl9tb2RlX3N1cHBvcnRlZChjYW0tPmJ1ZmZlcl9tb2RlKSkgeworCQlwcmludGsoS0VSTl9FUlIgIm1hcnZlbGwtY2FtOiBidWZmZXIgbW9kZSAlZCB1bnN1cHBvcnRlZFxuIiwKKwkJCQljYW0tPmJ1ZmZlcl9tb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qCisJICogUmVnaXN0ZXIgd2l0aCBWNEwKKwkgKi8KKwlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3RlcihjYW0tPmRldiwgJmNhbS0+djRsMl9kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9pbml0KCZjYW0tPnNfbXV0ZXgpOworCWNhbS0+c3RhdGUgPSBTX05PVFJFQURZOworCW1jYW1fc2V0X2NvbmZpZ19uZWVkZWQoY2FtLCAxKTsKKwljYW0tPnBpeF9mb3JtYXQgPSBtY2FtX2RlZl9waXhfZm9ybWF0OworCWNhbS0+bWJ1c19jb2RlID0gbWNhbV9kZWZfbWJ1c19jb2RlOworCUlOSVRfTElTVF9IRUFEKCZjYW0tPmJ1ZmZlcnMpOworCW1jYW1fY3Rscl9pbml0KGNhbSk7CisKKwkvKgorCSAqIFRyeSB0byBmaW5kIHRoZSBzZW5zb3IuCisJICovCisJc2Vuc29yX2NmZy5jbG9ja19zcGVlZCA9IGNhbS0+Y2xvY2tfc3BlZWQ7CisJc2Vuc29yX2NmZy51c2Vfc21idXMgPSBjYW0tPnVzZV9zbWJ1czsKKwljYW0tPnNlbnNvcl9hZGRyID0gb3Y3NjcwX2luZm8uYWRkcjsKKwljYW0tPnNlbnNvciA9IHY0bDJfaTJjX25ld19zdWJkZXZfYm9hcmQoJmNhbS0+djRsMl9kZXYsCisJCQljYW0tPmkyY19hZGFwdGVyLCAmb3Y3NjcwX2luZm8sIE5VTEwpOworCWlmIChjYW0tPnNlbnNvciA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3VucmVnaXN0ZXI7CisJfQorCisJcmV0ID0gbWNhbV9jYW1faW5pdChjYW0pOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VucmVnaXN0ZXI7CisJLyoKKwkgKiBHZXQgdGhlIHY0bDIgc2V0dXAgZG9uZS4KKwkgKi8KKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCWNhbS0+dmRldiA9IG1jYW1fdjRsX3RlbXBsYXRlOworCWNhbS0+dmRldi5kZWJ1ZyA9IDA7CisJY2FtLT52ZGV2LnY0bDJfZGV2ID0gJmNhbS0+djRsMl9kZXY7CisJcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZjYW0tPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIC0xKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwl2aWRlb19zZXRfZHJ2ZGF0YSgmY2FtLT52ZGV2LCBjYW0pOworCisJLyoKKwkgKiBJZiBzbyByZXF1ZXN0ZWQsIHRyeSB0byBnZXQgb3VyIERNQSBidWZmZXJzIG5vdy4KKwkgKi8KKwlpZiAoY2FtLT5idWZmZXJfbW9kZSA9PSBCX3ZtYWxsb2MgJiYgIWFsbG9jX2J1ZnNfYXRfcmVhZCkgeworCQlpZiAobWNhbV9hbGxvY19kbWFfYnVmcyhjYW0sIDEpKQorCQkJY2FtX3dhcm4oY2FtLCAiVW5hYmxlIHRvIGFsbG9jIERNQSBidWZmZXJzIGF0IGxvYWQiCisJCQkJCSIgd2lsbCB0cnkgYWdhaW4gbGF0ZXIuIik7CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7CitvdXRfdW5yZWdpc3RlcjoKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZjYW0tPnY0bDJfZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3ZvaWQgbWNjaWNfc2h1dGRvd24oc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJLyoKKwkgKiBJZiB3ZSBoYXZlIG5vIHVzZXJzIChhbmQgd2UgcmVhbGx5LCByZWFsbHkgc2hvdWxkIGhhdmUgbm8KKwkgKiB1c2VycykgdGhlIGRldmljZSB3aWxsIGFscmVhZHkgYmUgcG93ZXJlZCBkb3duLiAgVHJ5aW5nIHRvCisJICogdGFrZSBpdCBkb3duIGFnYWluIHdpbGwgd2VkZ2UgdGhlIG1hY2hpbmUsIHdoaWNoIGlzIGZyb3duZWQKKwkgKiB1cG9uLgorCSAqLworCWlmIChjYW0tPnVzZXJzID4gMCkgeworCQljYW1fd2FybihjYW0sICJSZW1vdmluZyBhIGRldmljZSB3aXRoIHVzZXJzIVxuIik7CisJCW1jYW1fY3Rscl9wb3dlcl9kb3duKGNhbSk7CisJfQorCXZiMl9xdWV1ZV9yZWxlYXNlKCZjYW0tPnZiX3F1ZXVlKTsKKwlpZiAoY2FtLT5idWZmZXJfbW9kZSA9PSBCX3ZtYWxsb2MpCisJCW1jYW1fZnJlZV9kbWFfYnVmcyhjYW0pOworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZjYW0tPnZkZXYpOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmNhbS0+djRsMl9kZXYpOworfQorCisvKgorICogUG93ZXIgbWFuYWdlbWVudAorICovCisjaWZkZWYgQ09ORklHX1BNCisKK3ZvaWQgbWNjaWNfc3VzcGVuZChzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwllbnVtIG1jYW1fc3RhdGUgY3N0YXRlID0gY2FtLT5zdGF0ZTsKKworCW1jYW1fY3Rscl9zdG9wX2RtYShjYW0pOworCW1jYW1fY3Rscl9wb3dlcl9kb3duKGNhbSk7CisJY2FtLT5zdGF0ZSA9IGNzdGF0ZTsKK30KKworaW50IG1jY2ljX3Jlc3VtZShzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJaWYgKGNhbS0+dXNlcnMgPiAwKSB7CisJCW1jYW1fY3Rscl9wb3dlcl91cChjYW0pOworCQlfX21jYW1fY2FtX3Jlc2V0KGNhbSk7CisJfSBlbHNlIHsKKwkJbWNhbV9jdGxyX3Bvd2VyX2Rvd24oY2FtKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCisJc2V0X2JpdChDRl9DT05GSUdfTkVFREVELCAmY2FtLT5mbGFncyk7CisJaWYgKGNhbS0+c3RhdGUgPT0gU19TVFJFQU1JTkcpCisJCXJldCA9IG1jYW1fcmVhZF9zZXR1cChjYW0pOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9tY2FtLWNvcmUuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWFydmVsbC1jY2ljL21jYW0tY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNzIwMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9tY2FtLWNvcmUuaApAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAqIE1hcnZlbGwgY2FtZXJhIGNvcmUgc3RydWN0dXJlcy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBKb25hdGhhbiBDb3JiZXQgY29yYmV0QGx3bi5uZXQKKyAqLworI2lmbmRlZiBfTUNBTV9DT1JFX0gKKyNkZWZpbmUgX01DQU1fQ09SRV9ICisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1jb3JlLmg+CisKKy8qCisgKiBDcmVhdGUgb3VyIG93biBzeW1ib2xzIGZvciB0aGUgc3VwcG9ydGVkIGJ1ZmZlciBtb2RlcywgYnV0LCBmb3Igbm93LAorICogYmFzZSB0aGVtIGVudGlyZWx5IG9uIHdoaWNoIHZpZGVvYnVmMiBvcHRpb25zIGhhdmUgYmVlbiBzZWxlY3RlZC4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPQlVGMl9WTUFMTE9DKSB8fCBkZWZpbmVkKENPTkZJR19WSURFT0JVRjJfVk1BTExPQ19NT0RVTEUpCisjZGVmaW5lIE1DQU1fTU9ERV9WTUFMTE9DIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfVklERU9CVUYyX0RNQV9DT05USUcpIHx8IGRlZmluZWQoQ09ORklHX1ZJREVPQlVGMl9ETUFfQ09OVElHX01PRFVMRSkKKyNkZWZpbmUgTUNBTV9NT0RFX0RNQV9DT05USUcgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19WSURFT0JVRjJfRE1BX1NHKSB8fCBkZWZpbmVkKENPTkZJR19WSURFT0JVRjJfRE1BX1NHX01PRFVMRSkKKyNkZWZpbmUgTUNBTV9NT0RFX0RNQV9TRyAxCisjZW5kaWYKKworI2lmICFkZWZpbmVkKE1DQU1fTU9ERV9WTUFMTE9DKSAmJiAhZGVmaW5lZChNQ0FNX01PREVfRE1BX0NPTlRJRykgJiYgXAorCSFkZWZpbmVkKE1DQU1fTU9ERV9ETUFfU0cpCisjZXJyb3IgT25lIG9mIHRoZSB2aWRlb2J1ZiBidWZmZXIgbW9kZXMgbXVzdCBiZSBzZWxlY3RlZCBpbiB0aGUgY29uZmlnCisjZW5kaWYKKworCitlbnVtIG1jYW1fc3RhdGUgeworCVNfTk9UUkVBRFksCS8qIE5vdCB5ZXQgaW5pdGlhbGl6ZWQgKi8KKwlTX0lETEUsCQkvKiBKdXN0IGhhbmdpbmcgYXJvdW5kICovCisJU19GTEFLRUQsCS8qIFNvbWUgc29ydCBvZiBwcm9ibGVtICovCisJU19TVFJFQU1JTkcsCS8qIFN0cmVhbWluZyBkYXRhICovCisJU19CVUZXQUlUCS8qIHN0cmVhbWluZyByZXF1ZXN0ZWQgYnV0IG5vIGJ1ZmZlcnMgeWV0ICovCit9OworI2RlZmluZSBNQVhfRE1BX0JVRlMgMworCisvKgorICogRGlmZmVyZW50IHBsYXRmb3JtcyB3b3JrIGJlc3Qgd2l0aCBkaWZmZXJlbnQgYnVmZmVyIG1vZGVzLCBzbyB3ZQorICogbGV0IHRoZSBwbGF0Zm9ybSBwaWNrLgorICovCitlbnVtIG1jYW1fYnVmZmVyX21vZGUgeworCUJfdm1hbGxvYyA9IDAsCisJQl9ETUFfY29udGlnID0gMSwKKwlCX0RNQV9zZyA9IDIKK307CisKKy8qCisgKiBJcyBhIGdpdmVuIGJ1ZmZlciBtb2RlIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBrZXJuZWwgY29uZmlndXJhdGlvbj8KKyAqLworc3RhdGljIGlubGluZSBpbnQgbWNhbV9idWZmZXJfbW9kZV9zdXBwb3J0ZWQoZW51bSBtY2FtX2J1ZmZlcl9tb2RlIG1vZGUpCit7CisJc3dpdGNoIChtb2RlKSB7CisjaWZkZWYgTUNBTV9NT0RFX1ZNQUxMT0MKKwljYXNlIEJfdm1hbGxvYzoKKyNlbmRpZgorI2lmZGVmIE1DQU1fTU9ERV9ETUFfQ09OVElHCisJY2FzZSBCX0RNQV9jb250aWc6CisjZW5kaWYKKyNpZmRlZiBNQ0FNX01PREVfRE1BX1NHCisJY2FzZSBCX0RNQV9zZzoKKyNlbmRpZgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKKworLyoKKyAqIEEgZGVzY3JpcHRpb24gb2Ygb25lIG9mIG91ciBkZXZpY2VzLgorICogTG9ja2luZzogY29udHJvbGxlZCBieSBzX211dGV4LiAgQ2VydGFpbiBmaWVsZHMsIGhvd2V2ZXIsIHJlcXVpcmUKKyAqICAgICAgICAgIHRoZSBkZXZfbG9jayBzcGlubG9jazsgdGhleSBhcmUgbWFya2VkIGFzIHN1Y2ggYnkgY29tbWVudHMuCisgKiAgICAgICAgICBkZXZfbG9jayBpcyBhbHNvIHJlcXVpcmVkIGZvciBhY2Nlc3MgdG8gZGV2aWNlIHJlZ2lzdGVycy4KKyAqLworc3RydWN0IG1jYW1fY2FtZXJhIHsKKwkvKgorCSAqIFRoZXNlIGZpZWxkcyBzaG91bGQgYmUgc2V0IGJ5IHRoZSBwbGF0Zm9ybSBjb2RlIHByaW9yIHRvCisJICogY2FsbGluZyBtY2FtX3JlZ2lzdGVyKCkuCisJICovCisJc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcHRlcjsKKwl1bnNpZ25lZCBjaGFyIF9faW9tZW0gKnJlZ3M7CisJc3BpbmxvY2tfdCBkZXZfbG9jazsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7IC8qIEZvciBtZXNzYWdlcywgZG1hIGFsbG9jICovCisJdW5zaWduZWQgaW50IGNoaXBfaWQ7CisJc2hvcnQgaW50IGNsb2NrX3NwZWVkOwkvKiBTZW5zb3IgY2xvY2sgc3BlZWQsIGRlZmF1bHQgMzAgKi8KKwlzaG9ydCBpbnQgdXNlX3NtYnVzOwkvKiBTTUJVUyBvciBzdHJhaWdodCBJMmM/ICovCisJZW51bSBtY2FtX2J1ZmZlcl9tb2RlIGJ1ZmZlcl9tb2RlOworCS8qCisJICogQ2FsbGJhY2tzIGZyb20gdGhlIGNvcmUgdG8gdGhlIHBsYXRmb3JtIGNvZGUuCisJICovCisJdm9pZCAoKnBsYXRfcG93ZXJfdXApIChzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSk7CisJdm9pZCAoKnBsYXRfcG93ZXJfZG93bikgKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKTsKKworCS8qCisJICogRXZlcnl0aGluZyBiZWxvdyBoZXJlIGlzIHByaXZhdGUgdG8gdGhlIG1jYW0gY29yZSBhbmQKKwkgKiBzaG91bGQgbm90IGJlIHRvdWNoZWQgYnkgdGhlIHBsYXRmb3JtIGNvZGUuCisJICovCisJc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2OworCWVudW0gbWNhbV9zdGF0ZSBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogQnVmZmVyIHN0YXR1cywgbWFpbmx5IChkZXZfbG9jaykgKi8KKwlpbnQgdXNlcnM7CQkJLyogSG93IG1hbnkgb3BlbiBGRHMgKi8KKwlzdHJ1Y3QgZmlsZSAqb3duZXI7CQkvKiBXaG8gaGFzIGRhdGEgYWNjZXNzICh2NGwyKSAqLworCisJLyoKKwkgKiBTdWJzeXN0ZW0gc3RydWN0dXJlcy4KKwkgKi8KKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZkZXY7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZW5zb3I7CisJdW5zaWduZWQgc2hvcnQgc2Vuc29yX2FkZHI7CisKKwkvKiBWaWRlb2J1ZjIgc3R1ZmYgKi8KKwlzdHJ1Y3QgdmIyX3F1ZXVlIHZiX3F1ZXVlOworCXN0cnVjdCBsaXN0X2hlYWQgYnVmZmVyczsJLyogQXZhaWxhYmxlIGZyYW1lcyAqLworCisJdW5zaWduZWQgaW50IG5idWZzOwkJLyogSG93IG1hbnkgYXJlIGFsbG9jJ2QgKi8KKwlpbnQgbmV4dF9idWY7CQkJLyogTmV4dCB0byBjb25zdW1lIChkZXZfbG9jaykgKi8KKworCS8qIERNQSBidWZmZXJzIC0gdm1hbGxvYyBtb2RlICovCisjaWZkZWYgTUNBTV9NT0RFX1ZNQUxMT0MKKwl1bnNpZ25lZCBpbnQgZG1hX2J1Zl9zaXplOwkvKiBhbGxvY2F0ZWQgc2l6ZSAqLworCXZvaWQgKmRtYV9idWZzW01BWF9ETUFfQlVGU107CS8qIEludGVybmFsIGJ1ZmZlciBhZGRyZXNzZXMgKi8KKwlkbWFfYWRkcl90IGRtYV9oYW5kbGVzW01BWF9ETUFfQlVGU107IC8qIEJ1ZmZlciBidXMgYWRkcmVzc2VzICovCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHNfdGFza2xldDsKKyNlbmRpZgorCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsJCS8qIEZyYW1lIHNlcXVlbmNlIG51bWJlciAqLworCXVuc2lnbmVkIGludCBidWZfc2VxW01BWF9ETUFfQlVGU107IC8qIFNlcXVlbmNlIGZvciBpbmRpdmlkdWFsIGJ1ZnMgKi8KKworCS8qIERNQSBidWZmZXJzIC0gRE1BIG1vZGVzICovCisJc3RydWN0IG1jYW1fdmJfYnVmZmVyICp2Yl9idWZzW01BWF9ETUFfQlVGU107CisJc3RydWN0IHZiMl9hbGxvY19jdHggKnZiX2FsbG9jX2N0eDsKKworCS8qIE1vZGUtc3BlY2lmaWMgb3BzLCBzZXQgYXQgb3BlbiB0aW1lICovCisJdm9pZCAoKmRtYV9zZXR1cCkoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pOworCXZvaWQgKCpmcmFtZV9jb21wbGV0ZSkoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0sIGludCBmcmFtZSk7CisKKwkvKiBDdXJyZW50IG9wZXJhdGluZyBwYXJhbWV0ZXJzICovCisJdTMyIHNlbnNvcl90eXBlOwkJLyogQ3VycmVudGx5IG92NzY3MCBvbmx5ICovCisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBwaXhfZm9ybWF0OworCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBtYnVzX2NvZGU7CisKKwkvKiBMb2NrcyAqLworCXN0cnVjdCBtdXRleCBzX211dGV4OyAvKiBBY2Nlc3MgdG8gdGhpcyBzdHJ1Y3R1cmUgKi8KK307CisKKworLyoKKyAqIFJlZ2lzdGVyIEkvTyBmdW5jdGlvbnMuICBUaGVzZSBhcmUgaGVyZSBiZWNhdXNlIHRoZSBwbGF0Zm9ybSBjb2RlCisgKiBtYXkgbGVnaXRpbWF0ZWx5IG5lZWQgdG8gbWVzcyB3aXRoIHRoZSByZWdpc3RlciBzcGFjZS4KKyAqLworLyoKKyAqIERldmljZSByZWdpc3RlciBJL08KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1jYW1fcmVnX3dyaXRlKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtLCB1bnNpZ25lZCBpbnQgcmVnLAorCQl1bnNpZ25lZCBpbnQgdmFsKQoreworCWlvd3JpdGUzMih2YWwsIGNhbS0+cmVncyArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1jYW1fcmVnX3JlYWQoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0sCisJCXVuc2lnbmVkIGludCByZWcpCit7CisJcmV0dXJuIGlvcmVhZDMyKGNhbS0+cmVncyArIHJlZyk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIG1jYW1fcmVnX3dyaXRlX21hc2soc3RydWN0IG1jYW1fY2FtZXJhICpjYW0sIHVuc2lnbmVkIGludCByZWcsCisJCXVuc2lnbmVkIGludCB2YWwsIHVuc2lnbmVkIGludCBtYXNrKQoreworCXVuc2lnbmVkIGludCB2ID0gbWNhbV9yZWdfcmVhZChjYW0sIHJlZyk7CisKKwl2ID0gKHYgJiB+bWFzaykgfCAodmFsICYgbWFzayk7CisJbWNhbV9yZWdfd3JpdGUoY2FtLCByZWcsIHYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWNhbV9yZWdfY2xlYXJfYml0KHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtLAorCQl1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCW1jYW1fcmVnX3dyaXRlX21hc2soY2FtLCByZWcsIDAsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtY2FtX3JlZ19zZXRfYml0KHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtLAorCQl1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCW1jYW1fcmVnX3dyaXRlX21hc2soY2FtLCByZWcsIHZhbCwgdmFsKTsKK30KKworLyoKKyAqIEZ1bmN0aW9ucyBmb3IgdXNlIGJ5IHBsYXRmb3JtIGNvZGUuCisgKi8KK2ludCBtY2NpY19yZWdpc3RlcihzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSk7CitpbnQgbWNjaWNfaXJxKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtLCB1bnNpZ25lZCBpbnQgaXJxcyk7Cit2b2lkIG1jY2ljX3NodXRkb3duKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKTsKKyNpZmRlZiBDT05GSUdfUE0KK3ZvaWQgbWNjaWNfc3VzcGVuZChzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSk7CitpbnQgbWNjaWNfcmVzdW1lKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKTsKKyNlbmRpZgorCisvKgorICogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBtODhhbHAwMSBjYW1lcmEgaW50ZXJmYWNlLiAgT2Zmc2V0cyBpbiBieXRlcworICogYXMgZ2l2ZW4gaW4gdGhlIHNwZWMuCisgKi8KKyNkZWZpbmUgUkVHX1kwQkFSCTB4MDAKKyNkZWZpbmUgUkVHX1kxQkFSCTB4MDQKKyNkZWZpbmUgUkVHX1kyQkFSCTB4MDgKKy8qIC4uLiAqLworCisjZGVmaW5lIFJFR19JTUdQSVRDSAkweDI0CS8qIEltYWdlIHBpdGNoIHJlZ2lzdGVyICovCisjZGVmaW5lICAgSU1HUF9ZUF9TSEZUCSAgMgkJLyogWSBwaXRjaCBwYXJhbXMgKi8KKyNkZWZpbmUgICBJTUdQX1lQX01BU0sJICAweDAwMDAzZmZjCS8qIFkgcGl0Y2ggZmllbGQgKi8KKyNkZWZpbmUJICBJTUdQX1VWUF9TSEZUCSAgMTgJCS8qIFVWIHBpdGNoIChwbGFuYXIpICovCisjZGVmaW5lICAgSU1HUF9VVlBfTUFTSyAgIDB4M2ZmYzAwMDAKKyNkZWZpbmUgUkVHX0lSUVNUQVRSQVcJMHgyOAkvKiBSQVcgSVJRIFN0YXR1cyAqLworI2RlZmluZSAgIElSUV9FT0YwCSAgMHgwMDAwMDAwMQkvKiBFbmQgb2YgZnJhbWUgMCAqLworI2RlZmluZSAgIElSUV9FT0YxCSAgMHgwMDAwMDAwMgkvKiBFbmQgb2YgZnJhbWUgMSAqLworI2RlZmluZSAgIElSUV9FT0YyCSAgMHgwMDAwMDAwNAkvKiBFbmQgb2YgZnJhbWUgMiAqLworI2RlZmluZSAgIElSUV9TT0YwCSAgMHgwMDAwMDAwOAkvKiBTdGFydCBvZiBmcmFtZSAwICovCisjZGVmaW5lICAgSVJRX1NPRjEJICAweDAwMDAwMDEwCS8qIFN0YXJ0IG9mIGZyYW1lIDEgKi8KKyNkZWZpbmUgICBJUlFfU09GMgkgIDB4MDAwMDAwMjAJLyogU3RhcnQgb2YgZnJhbWUgMiAqLworI2RlZmluZSAgIElSUV9PVkVSRkxPVwkgIDB4MDAwMDAwNDAJLyogRklGTyBvdmVyZmxvdyAqLworI2RlZmluZSAgIElSUV9UV1NJVwkgIDB4MDAwMTAwMDAJLyogVFdTSSAoc21idXMpIHdyaXRlICovCisjZGVmaW5lICAgSVJRX1RXU0lSCSAgMHgwMDAyMDAwMAkvKiBUV1NJIHJlYWQgKi8KKyNkZWZpbmUgICBJUlFfVFdTSUUJICAweDAwMDQwMDAwCS8qIFRXU0kgZXJyb3IgKi8KKyNkZWZpbmUgICBUV1NJSVJRUyAoSVJRX1RXU0lXfElSUV9UV1NJUnxJUlFfVFdTSUUpCisjZGVmaW5lICAgRlJBTUVJUlFTIChJUlFfRU9GMHxJUlFfRU9GMXxJUlFfRU9GMnxJUlFfU09GMHxJUlFfU09GMXxJUlFfU09GMikKKyNkZWZpbmUgICBBTExJUlFTIChUV1NJSVJRU3xGUkFNRUlSUVN8SVJRX09WRVJGTE9XKQorI2RlZmluZSBSRUdfSVJRTUFTSwkweDJjCS8qIElSUSBtYXNrIC0gc2FtZSBiaXRzIGFzIElSUVNUQVQgKi8KKyNkZWZpbmUgUkVHX0lSUVNUQVQJMHgzMAkvKiBJUlEgc3RhdHVzIC8gY2xlYXIgKi8KKworI2RlZmluZSBSRUdfSU1HU0laRQkweDM0CS8qIEltYWdlIHNpemUgKi8KKyNkZWZpbmUgIElNR1NaX1ZfTUFTSwkgIDB4MWZmZjAwMDAKKyNkZWZpbmUgIElNR1NaX1ZfU0hJRlQJICAxNgorI2RlZmluZQkgSU1HU1pfSF9NQVNLCSAgMHgwMDAwM2ZmZgorI2RlZmluZSBSRUdfSU1HT0ZGU0VUCTB4MzgJLyogSU1hZ2Ugb2Zmc2V0ICovCisKKyNkZWZpbmUgUkVHX0NUUkwwCTB4M2MJLyogQ29udHJvbCAwICovCisjZGVmaW5lICAgQzBfRU5BQkxFCSAgMHgwMDAwMDAwMQkvKiBNYWtlcyB0aGUgd2hvbGUgdGhpbmcgZ28gKi8KKworLyogTWFzayBmb3IgYWxsIHRoZSBmb3JtYXQgYml0cyAqLworI2RlZmluZSAgIEMwX0RGX01BU0sJICAweDAwZmZmZmZjICAgIC8qIEJpdHMgMi0yMyAqLworCisvKiBSR0Igb3JkZXJpbmcgKi8KKyNkZWZpbmUJICBDMF9SR0I0X1JHQlgJICAweDAwMDAwMDAwCisjZGVmaW5lCSAgQzBfUkdCNF9YUkdCCSAgMHgwMDAwMDAwNAorI2RlZmluZQkgIEMwX1JHQjRfQkdSWAkgIDB4MDAwMDAwMDgKKyNkZWZpbmUJICBDMF9SR0I0X1hCR1IJICAweDAwMDAwMDBjCisjZGVmaW5lCSAgQzBfUkdCNV9SR0dCCSAgMHgwMDAwMDAwMAorI2RlZmluZQkgIEMwX1JHQjVfR1JCRwkgIDB4MDAwMDAwMDQKKyNkZWZpbmUJICBDMF9SR0I1X0dCUkcJICAweDAwMDAwMDA4CisjZGVmaW5lCSAgQzBfUkdCNV9CR0dSCSAgMHgwMDAwMDAwYworCisvKiBTcGVjIGhhcyB0d28gZmllbGRzIGZvciBESU4gYW5kIERPVVQsIGJ1dCB0aGV5IG11c3QgbWF0Y2gsIHNvCisgICBjb21iaW5lIHRoZW0gaGVyZS4gKi8KKyNkZWZpbmUJICBDMF9ERl9ZVVYJICAweDAwMDAwMDAwCS8qIERhdGEgaXMgWVVWCSAgICAqLworI2RlZmluZQkgIEMwX0RGX1JHQgkgIDB4MDAwMDAwYTAJLyogLi4uIFJHQgkJICAgICovCisjZGVmaW5lCSAgQzBfREZfQkFZRVIJICAweDAwMDAwMTQwCS8qIC4uLiBCYXllcgkJICAgICovCisvKiA4LTgtOCBtdXN0IGJlIG1pc3NpbmcgZnJvbSB0aGUgYmVsb3cgLSBhc2sgKi8KKyNkZWZpbmUJICBDMF9SR0JGXzU2NQkgIDB4MDAwMDAwMDAKKyNkZWZpbmUJICBDMF9SR0JGXzQ0NAkgIDB4MDAwMDA4MDAKKyNkZWZpbmUJICBDMF9SR0JfQkdSCSAgMHgwMDAwMTAwMAkvKiBCbHVlIGNvbWVzIGZpcnN0ICovCisjZGVmaW5lCSAgQzBfWVVWX1BMQU5BUgkgIDB4MDAwMDAwMDAJLyogWVVWIDQyMiBwbGFuYXIgZm9ybWF0ICovCisjZGVmaW5lCSAgQzBfWVVWX1BBQ0tFRAkgIDB4MDAwMDgwMDAJLyogWVVWIDQyMiBwYWNrZWQJKi8KKyNkZWZpbmUJICBDMF9ZVVZfNDIwUEwJICAweDAwMDBhMDAwCS8qIFlVViA0MjAgcGxhbmFyCSovCisvKiBUaGluayB0aGF0IDQyMCBwYWNrZWQgbXVzdCBiZSAxMTEgLSBhc2sgKi8KKyNkZWZpbmUJICBDMF9ZVVZFX1lVWVYJICAweDAwMDAwMDAwCS8qIFkxQ2JZMENyCQkqLworI2RlZmluZQkgIEMwX1lVVkVfWVZZVQkgIDB4MDAwMTAwMDAJLyogWTFDclkwQ2IJCSovCisjZGVmaW5lCSAgQzBfWVVWRV9WWVVZCSAgMHgwMDAyMDAwMAkvKiBDclkxQ2JZMAkJKi8KKyNkZWZpbmUJICBDMF9ZVVZFX1VZVlkJICAweDAwMDMwMDAwCS8qIENiWTFDclkwCQkqLworI2RlZmluZQkgIEMwX1lVVkVfWFlVVgkgIDB4MDAwMDAwMDAJLyogNDIwOiAuWVVWCQkqLworI2RlZmluZQkgIEMwX1lVVkVfWFlWVQkgIDB4MDAwMTAwMDAJLyogNDIwOiAuWVZVCQkqLworI2RlZmluZQkgIEMwX1lVVkVfWFVWWQkgIDB4MDAwMjAwMDAJLyogNDIwOiAuVVZZCQkqLworI2RlZmluZQkgIEMwX1lVVkVfWFZVWQkgIDB4MDAwMzAwMDAJLyogNDIwOiAuVlVZCQkqLworLyogQmF5ZXIgYml0cyAxOCwxOSBpZiBuZWVkZWQgKi8KKyNkZWZpbmUJICBDMF9IUE9MX0xPVwkgIDB4MDEwMDAwMDAJLyogSFNZTkMgcG9sYXJpdHkgYWN0aXZlIGxvdyAqLworI2RlZmluZQkgIEMwX1ZQT0xfTE9XCSAgMHgwMjAwMDAwMAkvKiBWU1lOQyBwb2xhcml0eSBhY3RpdmUgbG93ICovCisjZGVmaW5lCSAgQzBfVkNMS19MT1cJICAweDA0MDAwMDAwCS8qIFZDTEsgb24gZmFsbGluZyBlZGdlICovCisjZGVmaW5lCSAgQzBfRE9XTlNDQUxFCSAgMHgwODAwMDAwMAkvKiBFbmFibGUgZG93bnNjYWxlciAqLworI2RlZmluZQkgIEMwX1NJRk1fTUFTSwkgIDB4YzAwMDAwMDAJLyogU0lGIG1vZGUgYml0cyAqLworI2RlZmluZQkgIEMwX1NJRl9IVlNZTkMJICAweDAwMDAwMDAwCS8qIFVzZSBIL1ZTWU5DICovCisjZGVmaW5lCSAgQ09fU09GX05PU1lOQwkgIDB4NDAwMDAwMDAJLyogVXNlIGluYmFuZCBhY3RpdmUgc2lnbmFsaW5nICovCisKKy8qIEJpdHMgYmVsb3cgQzFfNDQ0QUxQSEEgYXJlIG5vdCBwcmVzZW50IGluIENhZmUgKi8KKyNkZWZpbmUgUkVHX0NUUkwxCTB4NDAJLyogQ29udHJvbCAxICovCisjZGVmaW5lCSAgQzFfQ0xLR0FURQkgIDB4MDAwMDAwMDEJLyogU2Vuc29yIGNsb2NrIGdhdGUgKi8KKyNkZWZpbmUgICBDMV9ERVNDX0VOQQkgIDB4MDAwMDAxMDAJLyogRE1BIGRlc2NyaXB0b3IgZW5hYmxlICovCisjZGVmaW5lICAgQzFfREVTQ18zV09SRCAgIDB4MDAwMDAyMDAJLyogVGhyZWUtd29yZCBkZXNjcmlwdG9ycyB1c2VkICovCisjZGVmaW5lCSAgQzFfNDQ0QUxQSEEJICAweDAwZjAwMDAwCS8qIEFscGhhIGZpZWxkIGluIFJHQjQ0NCAqLworI2RlZmluZQkgIEMxX0FMUEhBX1NIRlQJICAyMAorI2RlZmluZQkgIEMxX0RNQUIzMgkgIDB4MDAwMDAwMDAJLyogMzItYnl0ZSBETUEgYnVyc3QgKi8KKyNkZWZpbmUJICBDMV9ETUFCMTYJICAweDAyMDAwMDAwCS8qIDE2LWJ5dGUgRE1BIGJ1cnN0ICovCisjZGVmaW5lCSAgQzFfRE1BQjY0CSAgMHgwNDAwMDAwMAkvKiA2NC1ieXRlIERNQSBidXJzdCAqLworI2RlZmluZQkgIEMxX0RNQUJfTUFTSwkgIDB4MDYwMDAwMDAKKyNkZWZpbmUJICBDMV9UV09CVUZTCSAgMHgwODAwMDAwMAkvKiBVc2Ugb25seSB0d28gRE1BIGJ1ZmZlcnMgKi8KKyNkZWZpbmUJICBDMV9QV1JEV04JICAweDEwMDAwMDAwCS8qIFBvd2VyIGRvd24gKi8KKworI2RlZmluZSBSRUdfQ0xLQ1RSTAkweDg4CS8qIENsb2NrIGNvbnRyb2wgKi8KKyNkZWZpbmUJICBDTEtfRElWX01BU0sJICAweDAwMDBmZmZmCS8qIFVwcGVyIGJpdHMgUlcgInJlc2VydmVkIiAqLworCisvKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSBDYWZlLW9ubHkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX1VCQVIJMHhjNAkvKiBVcHBlciBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKworLyogQXJtYWRhIDYxMCBETUEgZGVzY3JpcHRvciByZWdpc3RlcnMgKi8KKyNkZWZpbmUJUkVHX0RNQV9ERVNDX1kJMHgyMDAKKyNkZWZpbmUJUkVHX0RNQV9ERVNDX1UJMHgyMDQKKyNkZWZpbmUJUkVHX0RNQV9ERVNDX1YJMHgyMDgKKyNkZWZpbmUgUkVHX0RFU0NfTEVOX1kJMHgyMGMJLyogTGVuZ3RocyBhcmUgaW4gYnl0ZXMgKi8KKyNkZWZpbmUJUkVHX0RFU0NfTEVOX1UJMHgyMTAKKyNkZWZpbmUgUkVHX0RFU0NfTEVOX1YJMHgyMTQKKworLyoKKyAqIFVzZWZ1bCBzdHVmZiB0aGF0IHByb2JhYmx5IGJlbG9uZ3Mgc29tZXdoZXJlIGdsb2JhbC4KKyAqLworI2RlZmluZSBWR0FfV0lEVEgJNjQwCisjZGVmaW5lIFZHQV9IRUlHSFQJNDgwCisKKyNlbmRpZiAvKiBfTUNBTV9DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWFydmVsbC1jY2ljL21tcC1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWFydmVsbC1jY2ljL21tcC1kcml2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmI3NjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvbW1wLWRyaXZlci5jCkBAIC0wLDAgKzEsMzQwIEBACisvKgorICogU3VwcG9ydCBmb3IgdGhlIGNhbWVyYSBkZXZpY2UgZm91bmQgb24gTWFydmVsbCBNTVAgcHJvY2Vzc29yczsga25vd24KKyAqIHRvIHdvcmsgd2l0aCB0aGUgQXJtYWRhIDYxMCBhcyB1c2VkIGluIHRoZSBPTFBDIDEuNzUgc3lzdGVtLgorICoKKyAqIENvcHlyaWdodCAyMDExIEpvbmF0aGFuIENvcmJldCA8Y29yYmV0QGx3bi5uZXQ+CisgKgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgorI2luY2x1ZGUgPG1lZGlhL21tcC1jYW1lcmEuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIm1jYW0tY29yZS5oIgorCitNT0RVTEVfQVVUSE9SKCJKb25hdGhhbiBDb3JiZXQgPGNvcmJldEBsd24ubmV0PiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdHJ1Y3QgbW1wX2NhbWVyYSB7CisJdm9pZCAqcG93ZXJfcmVnczsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCBtY2FtX2NhbWVyYSBtY2FtOworCXN0cnVjdCBsaXN0X2hlYWQgZGV2bGlzdDsKKwlpbnQgaXJxOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbW1wX2NhbWVyYSAqbWNhbV90b19jYW0oc3RydWN0IG1jYW1fY2FtZXJhICptY2FtKQoreworCXJldHVybiBjb250YWluZXJfb2YobWNhbSwgc3RydWN0IG1tcF9jYW1lcmEsIG1jYW0pOworfQorCisvKgorICogQSBzaWxseSBsaXR0bGUgaW5mcmFzdHJ1Y3R1cmUgc28gd2UgY2FuIGtlZXAgdHJhY2sgb2Ygb3VyIGRldmljZXMuCisgKiBDaGFuY2VzIGFyZSB0aGF0IHdlIHdpbGwgbmV2ZXIgaGF2ZSBtb3JlIHRoYW4gb25lIG9mIHRoZW0sIGJ1dAorICogdGhlIEFybWFkYSA2MTAgKmRvZXMqIGhhdmUgdHdvIGNvbnRyb2xsZXJzLi4uCisgKi8KKworc3RhdGljIExJU1RfSEVBRChtbXBjYW1fZGV2aWNlcyk7CitzdGF0aWMgc3RydWN0IG11dGV4IG1tcGNhbV9kZXZpY2VzX2xvY2s7CisKK3N0YXRpYyB2b2lkIG1tcGNhbV9hZGRfZGV2aWNlKHN0cnVjdCBtbXBfY2FtZXJhICpjYW0pCit7CisJbXV0ZXhfbG9jaygmbW1wY2FtX2RldmljZXNfbG9jayk7CisJbGlzdF9hZGQoJmNhbS0+ZGV2bGlzdCwgJm1tcGNhbV9kZXZpY2VzKTsKKwltdXRleF91bmxvY2soJm1tcGNhbV9kZXZpY2VzX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBtbXBjYW1fcmVtb3ZlX2RldmljZShzdHJ1Y3QgbW1wX2NhbWVyYSAqY2FtKQoreworCW11dGV4X2xvY2soJm1tcGNhbV9kZXZpY2VzX2xvY2spOworCWxpc3RfZGVsKCZjYW0tPmRldmxpc3QpOworCW11dGV4X3VubG9jaygmbW1wY2FtX2RldmljZXNfbG9jayk7Cit9CisKKy8qCisgKiBQbGF0Zm9ybSBkZXYgcmVtb3ZlIHBhc3NlcyB1cyBhIHBsYXRmb3JtX2RldmljZSwgYW5kIHRoZXJlJ3MKKyAqIG5vIGhhbmR5IHVudXNlZCBkcnZkYXRhIHRvIHN0YXNoIGEgYmFja3BvaW50ZXIgaW4uICBTbyBqdXN0CisgKiBkaWcgaXQgb3V0IG9mIG91ciBsaXN0LgorICovCitzdGF0aWMgc3RydWN0IG1tcF9jYW1lcmEgKm1tcGNhbV9maW5kX2RldmljZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtbXBfY2FtZXJhICpjYW07CisKKwltdXRleF9sb2NrKCZtbXBjYW1fZGV2aWNlc19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhbSwgJm1tcGNhbV9kZXZpY2VzLCBkZXZsaXN0KSB7CisJCWlmIChjYW0tPnBkZXYgPT0gcGRldikgeworCQkJbXV0ZXhfdW5sb2NrKCZtbXBjYW1fZGV2aWNlc19sb2NrKTsKKwkJCXJldHVybiBjYW07CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZtbXBjYW1fZGV2aWNlc19sb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKworCisKKworLyoKKyAqIFBvd2VyLXJlbGF0ZWQgcmVnaXN0ZXJzOyB0aGlzIGFsbW9zdCBjZXJ0YWlubHkgYmVsb25ncworICogc29tZXdoZXJlIGVsc2UuCisgKgorICogQVJNQURBIDYxMCByZWdpc3RlciBtYW51YWwsIHNlYyA3LjIuMSwgcDE4NDIuCisgKi8KKyNkZWZpbmUgQ1BVX1NVQlNZU19QTVVfQkFTRQkweGQ0MjgyODAwCisjZGVmaW5lIFJFR19DQ0lDX0RDR0NSCQkweDI4CS8qIENDSUMgZHluIGNsb2NrIGdhdGUgY3RybCByZWcgKi8KKyNkZWZpbmUgUkVHX0NDSUNfQ1JDUgkJMHg1MAkvKiBDQ0lDIGNsayByZXNldCBjdHJsIHJlZwkqLworCisvKgorICogUG93ZXIgY29udHJvbC4KKyAqLworc3RhdGljIHZvaWQgbW1wY2FtX3Bvd2VyX3VwKHN0cnVjdCBtY2FtX2NhbWVyYSAqbWNhbSkKK3sKKwlzdHJ1Y3QgbW1wX2NhbWVyYSAqY2FtID0gbWNhbV90b19jYW0obWNhbSk7CisJc3RydWN0IG1tcF9jYW1lcmFfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisvKgorICogVHVybiBvbiBwb3dlciBhbmQgY2xvY2tzIHRvIHRoZSBjb250cm9sbGVyLgorICovCisJaW93cml0ZTMyKDB4M2YsIGNhbS0+cG93ZXJfcmVncyArIFJFR19DQ0lDX0RDR0NSKTsKKwlpb3dyaXRlMzIoMHgzODA1YiwgY2FtLT5wb3dlcl9yZWdzICsgUkVHX0NDSUNfQ1JDUik7CisJbWRlbGF5KDEpOworLyoKKyAqIFByb3ZpZGUgcG93ZXIgdG8gdGhlIHNlbnNvci4KKyAqLworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19DTEtDVFJMLCAweDYwMDAwMDAyKTsKKwlwZGF0YSA9IGNhbS0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJZ3Bpb19zZXRfdmFsdWUocGRhdGEtPnNlbnNvcl9wb3dlcl9ncGlvLCAxKTsKKwltZGVsYXkoNSk7CisJbWNhbV9yZWdfY2xlYXJfYml0KG1jYW0sIFJFR19DVFJMMSwgMHgxMDAwMDAwMCk7CisJZ3Bpb19zZXRfdmFsdWUocGRhdGEtPnNlbnNvcl9yZXNldF9ncGlvLCAwKTsgLyogcmVzZXQgaXMgYWN0aXZlIGxvdyAqLworCW1kZWxheSg1KTsKKwlncGlvX3NldF92YWx1ZShwZGF0YS0+c2Vuc29yX3Jlc2V0X2dwaW8sIDEpOyAvKiByZXNldCBpcyBhY3RpdmUgbG93ICovCisJbWRlbGF5KDUpOworfQorCitzdGF0aWMgdm9pZCBtbXBjYW1fcG93ZXJfZG93bihzdHJ1Y3QgbWNhbV9jYW1lcmEgKm1jYW0pCit7CisJc3RydWN0IG1tcF9jYW1lcmEgKmNhbSA9IG1jYW1fdG9fY2FtKG1jYW0pOworCXN0cnVjdCBtbXBfY2FtZXJhX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworLyoKKyAqIFR1cm4gb2ZmIGNsb2NrcyBhbmQgc2V0IHJlc2V0IGxpbmVzCisgKi8KKwlpb3dyaXRlMzIoMCwgY2FtLT5wb3dlcl9yZWdzICsgUkVHX0NDSUNfRENHQ1IpOworCWlvd3JpdGUzMigwLCBjYW0tPnBvd2VyX3JlZ3MgKyBSRUdfQ0NJQ19DUkNSKTsKKy8qCisgKiBTaHV0IGRvd24gdGhlIHNlbnNvci4KKyAqLworCXBkYXRhID0gY2FtLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlncGlvX3NldF92YWx1ZShwZGF0YS0+c2Vuc29yX3Bvd2VyX2dwaW8sIDApOworCWdwaW9fc2V0X3ZhbHVlKHBkYXRhLT5zZW5zb3JfcmVzZXRfZ3BpbywgMCk7Cit9CisKKworc3RhdGljIGlycXJldHVybl90IG1tcGNhbV9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKm1jYW0gPSBkYXRhOworCXVuc2lnbmVkIGludCBpcnFzLCBoYW5kbGVkOworCisJc3Bpbl9sb2NrKCZtY2FtLT5kZXZfbG9jayk7CisJaXJxcyA9IG1jYW1fcmVnX3JlYWQobWNhbSwgUkVHX0lSUVNUQVQpOworCWhhbmRsZWQgPSBtY2NpY19pcnEobWNhbSwgaXJxcyk7CisJc3Bpbl91bmxvY2soJm1jYW0tPmRldl9sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCitzdGF0aWMgaW50IG1tcGNhbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtbXBfY2FtZXJhICpjYW07CisJc3RydWN0IG1jYW1fY2FtZXJhICptY2FtOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBtbXBfY2FtZXJhX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCWludCByZXQ7CisKKwljYW0gPSBremFsbG9jKHNpemVvZigqY2FtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhbSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwljYW0tPnBkZXYgPSBwZGV2OworCUlOSVRfTElTVF9IRUFEKCZjYW0tPmRldmxpc3QpOworCisJbWNhbSA9ICZjYW0tPm1jYW07CisJbWNhbS0+cGxhdGZvcm0gPSBNSFBfQXJtYWRhNjEwOworCW1jYW0tPnBsYXRfcG93ZXJfdXAgPSBtbXBjYW1fcG93ZXJfdXA7CisJbWNhbS0+cGxhdF9wb3dlcl9kb3duID0gbW1wY2FtX3Bvd2VyX2Rvd247CisJbWNhbS0+ZGV2ID0gJnBkZXYtPmRldjsKKwltY2FtLT51c2Vfc21idXMgPSAwOworCW1jYW0tPmNoaXBfaWQgPSBWNEwyX0lERU5UX0FSTUFEQTYxMDsKKwltY2FtLT5idWZmZXJfbW9kZSA9IEJfRE1BX3NnOworCXNwaW5fbG9ja19pbml0KCZtY2FtLT5kZXZfbG9jayk7CisJLyoKKwkgKiBHZXQgb3VyIEkvTyBtZW1vcnkuCisJICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gaW9tZW0gcmVzb3VyY2UhXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisJbWNhbS0+cmVncyA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAobWNhbS0+cmVncyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk1NSU8gaW9yZW1hcCBmYWlsXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisJLyoKKwkgKiBQb3dlci9jbG9jayBtZW1vcnkgaXMgZWxzZXdoZXJlOyBnZXQgaXQgdG9vLiAgUGVyaGFwcyB0aGlzCisJICogc2hvdWxkIHJlYWxseSBiZSBtYW5hZ2VkIG91dHNpZGUgb2YgdGhpcyBkcml2ZXI/CisJICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gcG93ZXIgcmVzb3VyY2UhXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfdW5tYXAxOworCX0KKwljYW0tPnBvd2VyX3JlZ3MgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKGNhbS0+cG93ZXJfcmVncyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInBvd2VyIE1NSU8gaW9yZW1hcCBmYWlsXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfdW5tYXAxOworCX0KKwkvKgorCSAqIEZpbmQgdGhlIGkyYyBhZGFwdGVyLiAgVGhpcyBhc3N1bWVzLCBvZiBjb3Vyc2UsIHRoYXQgdGhlCisJICogaTJjIGJ1cyBpcyBhbHJlYWR5IHVwIGFuZCBmdW5jdGlvbmluZy4KKwkgKi8KKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCW1jYW0tPmkyY19hZGFwdGVyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRhdGEtPmkyY19kZXZpY2UpOworCWlmIChtY2FtLT5pMmNfYWRhcHRlciA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIGkyYyBhZGFwdGVyXG4iKTsKKwkJZ290byBvdXRfdW5tYXAyOworCX0KKwkvKgorCSAqIFNlbnNvciBHUElPIHBpbnMuCisJICovCisJcmV0ID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT5zZW5zb3JfcG93ZXJfZ3BpbywgImNhbS1wb3dlciIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgZ2V0IHNlbnNvciBwb3dlciBncGlvICVkIiwKKwkJCQlwZGF0YS0+c2Vuc29yX3Bvd2VyX2dwaW8pOworCQlnb3RvIG91dF91bm1hcDI7CisJfQorCWdwaW9fZGlyZWN0aW9uX291dHB1dChwZGF0YS0+c2Vuc29yX3Bvd2VyX2dwaW8sIDApOworCXJldCA9IGdwaW9fcmVxdWVzdChwZGF0YS0+c2Vuc29yX3Jlc2V0X2dwaW8sICJjYW0tcmVzZXQiKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGdldCBzZW5zb3IgcmVzZXQgZ3BpbyAlZCIsCisJCQkJcGRhdGEtPnNlbnNvcl9yZXNldF9ncGlvKTsKKwkJZ290byBvdXRfZ3BpbzsKKwl9CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBkYXRhLT5zZW5zb3JfcmVzZXRfZ3BpbywgMCk7CisJLyoKKwkgKiBQb3dlciB0aGUgZGV2aWNlIHVwIGFuZCBoYW5kIGl0IG9mZiB0byB0aGUgY29yZS4KKwkgKi8KKwltbXBjYW1fcG93ZXJfdXAobWNhbSk7CisJcmV0ID0gbWNjaWNfcmVnaXN0ZXIobWNhbSk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZ3BpbzI7CisJLyoKKwkgKiBGaW5hbGx5LCBzZXQgdXAgb3VyIElSUSBub3cgdGhhdCB0aGUgY29yZSBpcyByZWFkeSB0bworCSAqIGRlYWwgd2l0aCBpdC4KKwkgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOworCWlmIChyZXMgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF91bnJlZ2lzdGVyOworCX0KKwljYW0tPmlycSA9IHJlcy0+c3RhcnQ7CisJcmV0ID0gcmVxdWVzdF9pcnEoY2FtLT5pcnEsIG1tcGNhbV9pcnEsIElSUUZfU0hBUkVELAorCQkJIm1tcC1jYW1lcmEiLCBtY2FtKTsKKwlpZiAocmV0ID09IDApIHsKKwkJbW1wY2FtX2FkZF9kZXZpY2UoY2FtKTsKKwkJcmV0dXJuIDA7CisJfQorCitvdXRfdW5yZWdpc3RlcjoKKwltY2NpY19zaHV0ZG93bihtY2FtKTsKK291dF9ncGlvMjoKKwltbXBjYW1fcG93ZXJfZG93bihtY2FtKTsKKwlncGlvX2ZyZWUocGRhdGEtPnNlbnNvcl9yZXNldF9ncGlvKTsKK291dF9ncGlvOgorCWdwaW9fZnJlZShwZGF0YS0+c2Vuc29yX3Bvd2VyX2dwaW8pOworb3V0X3VubWFwMjoKKwlpb3VubWFwKGNhbS0+cG93ZXJfcmVncyk7CitvdXRfdW5tYXAxOgorCWlvdW5tYXAobWNhbS0+cmVncyk7CitvdXRfZnJlZToKKwlrZnJlZShjYW0pOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBtbXBjYW1fcmVtb3ZlKHN0cnVjdCBtbXBfY2FtZXJhICpjYW0pCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICptY2FtID0gJmNhbS0+bWNhbTsKKwlzdHJ1Y3QgbW1wX2NhbWVyYV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKworCW1tcGNhbV9yZW1vdmVfZGV2aWNlKGNhbSk7CisJZnJlZV9pcnEoY2FtLT5pcnEsIG1jYW0pOworCW1jY2ljX3NodXRkb3duKG1jYW0pOworCW1tcGNhbV9wb3dlcl9kb3duKG1jYW0pOworCXBkYXRhID0gY2FtLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlncGlvX2ZyZWUocGRhdGEtPnNlbnNvcl9yZXNldF9ncGlvKTsKKwlncGlvX2ZyZWUocGRhdGEtPnNlbnNvcl9wb3dlcl9ncGlvKTsKKwlpb3VubWFwKGNhbS0+cG93ZXJfcmVncyk7CisJaW91bm1hcChtY2FtLT5yZWdzKTsKKwlrZnJlZShjYW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1tcGNhbV9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbW1wX2NhbWVyYSAqY2FtID0gbW1wY2FtX2ZpbmRfZGV2aWNlKHBkZXYpOworCisJaWYgKGNhbSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gbW1wY2FtX3JlbW92ZShjYW0pOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1tcGNhbV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IG1tcGNhbV9wcm9iZSwKKwkucmVtb3ZlCQk9IG1tcGNhbV9wbGF0Zm9ybV9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAibW1wLWNhbWVyYSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFCisJfQorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBtbXBjYW1faW5pdF9tb2R1bGUodm9pZCkKK3sKKwltdXRleF9pbml0KCZtbXBjYW1fZGV2aWNlc19sb2NrKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtbXBjYW1fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1tcGNhbV9leGl0X21vZHVsZSh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtbXBjYW1fZHJpdmVyKTsKKwkvKgorCSAqIHBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCkgc2hvdWxkIGhhdmUgZW1wdGllZCB0aGUgbGlzdAorCSAqLworCWlmICghbGlzdF9lbXB0eSgmbW1wY2FtX2RldmljZXMpKQorCQlwcmludGsoS0VSTl9FUlIgIm1tcF9jYW1lcmEgbGVhdmluZyBkZXZpY2VzIGJlaGluZFxuIik7Cit9CisKK21vZHVsZV9pbml0KG1tcGNhbV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChtbXBjYW1fZXhpdF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tZW0ybWVtX3Rlc3RkZXYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWVtMm1lbV90ZXN0ZGV2LmMKaW5kZXggYjAzZDc0ZS4uMTY2YmY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tZW0ybWVtX3Rlc3RkZXYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21lbTJtZW1fdGVzdGRldi5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMzUsNyArMzQsNyBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJWaXJ0dWFsIGRldmljZSBmb3IgbWVtMm1lbSBmcmFtZXdvcmsgdGVzdGluZyIpOwogTU9EVUxFX0FVVEhPUigiUGF3ZWwgT3NjaWFrLCA8cGF3ZWxAb3NjaWFrLmNvbT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQorTU9EVUxFX1ZFUlNJT04oIjAuMS4xIik7CiAKICNkZWZpbmUgTUlOX1cgMzIKICNkZWZpbmUgTUlOX0ggMzIKQEAgLTM4MCw3ICszNzksNiBAQAogCXN0cm5jcHkoY2FwLT5kcml2ZXIsIE1FTTJNRU1fTkFNRSwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSAtIDEpOwogCXN0cm5jcHkoY2FwLT5jYXJkLCBNRU0yTUVNX05BTUUsIHNpemVvZihjYXAtPmNhcmQpIC0gMSk7CiAJY2FwLT5idXNfaW5mb1swXSA9IDA7Ci0JY2FwLT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oMCwgMSwgMCk7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfVklERU9fT1VUUFVUCiAJCQkgIHwgVjRMMl9DQVBfU1RSRUFNSU5HOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OW0wMDEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTAwMS5jCmluZGV4IGUyYmJkOGMuLjRkYTljY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTAwMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTAwMS5jCkBAIC02MDMsMTMgKzYwMyw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCi0JLyoKLQkgKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLgotCSAqIFNvIHRoaXMgZW50aXJlIHRlc3QgaXMgY29tcGxldGVseSByZWR1bmRhbnQuCi0JICovCi0JaWYgKCFpY2QtPmRldi5wYXJlbnQgfHwKLQkgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpCi0JCXJldHVybiAtRU5PREVWOworCS8qIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuICovCisJQlVHX09OKCFpY2QtPnBhcmVudCB8fAorCSAgICAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKTsKIAogCS8qIEVuYWJsZSB0aGUgY2hpcCAqLwogCWRhdGEgPSByZWdfd3JpdGUoY2xpZW50LCBNVDlNMDAxX0NISVBfRU5BQkxFLCAxKTsKQEAgLTY3NSw4ICs2NzEsOCBAQAogewogCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwogCi0JZGV2X2RiZygmaWNkLT5kZXYsICJWaWRlbyByZW1vdmVkOiAlcCwgJXBcbiIsCi0JCWljZC0+ZGV2LnBhcmVudCwgaWNkLT52ZGV2KTsKKwlkZXZfZGJnKGljZC0+cGRldiwgIlZpZGVvIHJlbW92ZWQ6ICVwLCAlcFxuIiwKKwkJaWNkLT5wYXJlbnQsIGljZC0+dmRldik7CiAJaWYgKGljbC0+ZnJlZV9idXMpCiAJCWljbC0+ZnJlZV9idXMoaWNsKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTExMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMTExLmMKaW5kZXggZWJlYmVkOS4uYTM1N2FhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMTExLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMTExLmMKQEAgLTYzLDYgKzYzLDEyIEBACiAjZGVmaW5lIE1UOU0xMTFfUkVTRVRfUkVTVEFSVF9GUkFNRQkoMSA8PCAxKQogI2RlZmluZSBNVDlNMTExX1JFU0VUX1JFU0VUX01PREUJKDEgPDwgMCkKIAorI2RlZmluZSBNVDlNMTExX1JNX0ZVTExfUE9XRVJfUkQJKDAgPDwgMTApCisjZGVmaW5lIE1UOU0xMTFfUk1fTE9XX1BPV0VSX1JECQkoMSA8PCAxMCkKKyNkZWZpbmUgTVQ5TTExMV9STV9DT0xfU0tJUF80WAkJKDEgPDwgNSkKKyNkZWZpbmUgTVQ5TTExMV9STV9ST1dfU0tJUF80WAkJKDEgPDwgNCkKKyNkZWZpbmUgTVQ5TTExMV9STV9DT0xfU0tJUF8yWAkJKDEgPDwgMykKKyNkZWZpbmUgTVQ5TTExMV9STV9ST1dfU0tJUF8yWAkJKDEgPDwgMikKICNkZWZpbmUgTVQ5TTExMV9STUJfTUlSUk9SX0NPTFMJCSgxIDw8IDEpCiAjZGVmaW5lIE1UOU0xMTFfUk1CX01JUlJPUl9ST1dTCQkoMSA8PCAwKQogI2RlZmluZSBNVDlNMTExX0NUWFRfQ1RSTF9SRVNUQVJUCSgxIDw8IDE1KQpAQCAtOTUsNyArMTAxLDggQEAKIAogI2RlZmluZSBNVDlNMTExX09QTU9ERV9BVVRPRVhQT19FTgkoMSA8PCAxNCkKICNkZWZpbmUgTVQ5TTExMV9PUE1PREVfQVVUT1dISVRFQkFMX0VOCSgxIDw8IDEpCi0KKyNkZWZpbmUgTVQ5TTExMV9PVVRGTVRfRkxJUF9CQVlFUl9DT0wJKDEgPDwgOSkKKyNkZWZpbmUgTVQ5TTExMV9PVVRGTVRfRkxJUF9CQVlFUl9ST1cJKDEgPDwgOCkKICNkZWZpbmUgTVQ5TTExMV9PVVRGTVRfUFJPQ0VTU0VEX0JBWUVSCSgxIDw8IDE0KQogI2RlZmluZSBNVDlNMTExX09VVEZNVF9CWVBBU1NfSUZQCSgxIDw8IDEwKQogI2RlZmluZSBNVDlNMTExX09VVEZNVF9JTlZfUElYX0NMT0NLCSgxIDw8IDkpCkBAIC0xMTAsOSArMTE3LDggQEAKICNkZWZpbmUgTVQ5TTExMV9PVVRGTVRfVFNUX1JBTVBfRlJBTUUJKDMgPDwgNCkKICNkZWZpbmUgTVQ5TTExMV9PVVRGTVRfU0hJRlRfM19VUAkoMSA8PCAzKQogI2RlZmluZSBNVDlNMTExX09VVEZNVF9BVkdfQ0hST01BCSgxIDw8IDIpCi0jZGVmaW5lIE1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ19ZCSgxIDw8IDEpCi0jZGVmaW5lIE1UOU0xMTFfT1VURk1UX1NXQVBfUkdCX0VWRU4JKDEgPDwgMSkKLSNkZWZpbmUgTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DYl9DcgkoMSA8PCAwKQorI2RlZmluZSBNVDlNMTExX09VVEZNVF9TV0FQX1lDYkNyX0NfWV9SR0JfRVZFTgkoMSA8PCAxKQorI2RlZmluZSBNVDlNMTExX09VVEZNVF9TV0FQX1lDYkNyX0NiX0NyX1JHQl9SX0IJKDEgPDwgMCkKIAogLyoKICAqIENhbWVyYSBjb250cm9sIHJlZ2lzdGVyIGFkZHJlc3NlcyAoMHgyMDAuLjB4MmZmIG5vdCBpbXBsZW1lbnRlZCkKQEAgLTEyMiw2ICsxMjgsOCBAQAogI2RlZmluZSByZWdfd3JpdGUocmVnLCB2YWwpIG10OW0xMTFfcmVnX3dyaXRlKGNsaWVudCwgTVQ5TTExMV8jI3JlZywgKHZhbCkpCiAjZGVmaW5lIHJlZ19zZXQocmVnLCB2YWwpIG10OW0xMTFfcmVnX3NldChjbGllbnQsIE1UOU0xMTFfIyNyZWcsICh2YWwpKQogI2RlZmluZSByZWdfY2xlYXIocmVnLCB2YWwpIG10OW0xMTFfcmVnX2NsZWFyKGNsaWVudCwgTVQ5TTExMV8jI3JlZywgKHZhbCkpCisjZGVmaW5lIHJlZ19tYXNrKHJlZywgdmFsLCBtYXNrKSBtdDltMTExX3JlZ19tYXNrKGNsaWVudCwgTVQ5TTExMV8jI3JlZywgXAorCQkodmFsKSwgKG1hc2spKQogCiAjZGVmaW5lIE1UOU0xMTFfTUlOX0RBUktfUk9XUwk4CiAjZGVmaW5lIE1UOU0xMTFfTUlOX0RBUktfQ09MUwkyNgpAQCAtMTUzLDcgKzE2MSwxMSBAQAogCXtWNEwyX01CVVNfRk1UX1VZVlk4XzJYOCwgVjRMMl9DT0xPUlNQQUNFX0pQRUd9LAogCXtWNEwyX01CVVNfRk1UX1ZZVVk4XzJYOCwgVjRMMl9DT0xPUlNQQUNFX0pQRUd9LAogCXtWNEwyX01CVVNfRk1UX1JHQjU1NV8yWDhfUEFESElfTEUsIFY0TDJfQ09MT1JTUEFDRV9TUkdCfSwKKwl7VjRMMl9NQlVTX0ZNVF9SR0I1NTVfMlg4X1BBREhJX0JFLCBWNEwyX0NPTE9SU1BBQ0VfU1JHQn0sCiAJe1Y0TDJfTUJVU19GTVRfUkdCNTY1XzJYOF9MRSwgVjRMMl9DT0xPUlNQQUNFX1NSR0J9LAorCXtWNEwyX01CVVNfRk1UX1JHQjU2NV8yWDhfQkUsIFY0TDJfQ09MT1JTUEFDRV9TUkdCfSwKKwl7VjRMMl9NQlVTX0ZNVF9CR1I1NjVfMlg4X0xFLCBWNEwyX0NPTE9SU1BBQ0VfU1JHQn0sCisJe1Y0TDJfTUJVU19GTVRfQkdSNTY1XzJYOF9CRSwgVjRMMl9DT0xPUlNQQUNFX1NSR0J9LAogCXtWNEwyX01CVVNfRk1UX1NCR0dSOF8xWDgsIFY0TDJfQ09MT1JTUEFDRV9TUkdCfSwKIAl7VjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzJYOF9QQURISV9MRSwgVjRMMl9DT0xPUlNQQUNFX1NSR0J9LAogfTsKQEAgLTE2OSw2ICsxODEsOCBAQAogCQkJICogZnJvbSB2NGwyLWNoaXAtaWRlbnQuaCAqLwogCWVudW0gbXQ5bTExMV9jb250ZXh0IGNvbnRleHQ7CiAJc3RydWN0IHY0bDJfcmVjdCByZWN0OworCXN0cnVjdCBtdXRleCBwb3dlcl9sb2NrOyAvKiBsb2NrIHRvIHByb3RlY3QgcG93ZXJfY291bnQgKi8KKwlpbnQgcG93ZXJfY291bnQ7CiAJY29uc3Qgc3RydWN0IG10OW0xMTFfZGF0YWZtdCAqZm10OwogCXVuc2lnbmVkIGludCBnYWluOwogCXVuc2lnbmVkIGNoYXIgYXV0b2V4cG9zdXJlOwpAQCAtMTc2LDEwICsxOTAsNiBAQAogCXVuc2lnbmVkIGludCBwb3dlcmVkOjE7CiAJdW5zaWduZWQgaW50IGhmbGlwOjE7CiAJdW5zaWduZWQgaW50IHZmbGlwOjE7Ci0JdW5zaWduZWQgaW50IHN3YXBfcmdiX2V2ZW5fb2RkOjE7Ci0JdW5zaWduZWQgaW50IHN3YXBfcmdiX3JlZF9ibHVlOjE7Ci0JdW5zaWduZWQgaW50IHN3YXBfeXV2X3lfY2hyb21hczoxOwotCXVuc2lnbmVkIGludCBzd2FwX3l1dl9jYl9jcjoxOwogCXVuc2lnbmVkIGludCBhdXRvd2hpdGViYWxhbmNlOjE7CiB9OwogCkBAIC0yNDgsMTIgKzI1OCwyNiBAQAogCWludCByZXQ7CiAKIAlyZXQgPSBtdDltMTExX3JlZ19yZWFkKGNsaWVudCwgcmVnKTsKLQlyZXR1cm4gbXQ5bTExMV9yZWdfd3JpdGUoY2xpZW50LCByZWcsIHJldCAmIH5kYXRhKTsKKwlpZiAocmV0ID49IDApCisJCXJldCA9IG10OW0xMTFfcmVnX3dyaXRlKGNsaWVudCwgcmVnLCByZXQgJiB+ZGF0YSk7CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBtdDltMTExX3NldF9jb250ZXh0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCitzdGF0aWMgaW50IG10OW0xMTFfcmVnX21hc2soc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgY29uc3QgdTE2IHJlZywKKwkJCSAgICBjb25zdCB1MTYgZGF0YSwgY29uc3QgdTE2IG1hc2spCit7CisJaW50IHJldDsKKworCXJldCA9IG10OW0xMTFfcmVnX3JlYWQoY2xpZW50LCByZWcpOworCWlmIChyZXQgPj0gMCkKKwkJcmV0ID0gbXQ5bTExMV9yZWdfd3JpdGUoY2xpZW50LCByZWcsIChyZXQgJiB+bWFzaykgfCBkYXRhKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG10OW0xMTFfc2V0X2NvbnRleHQoc3RydWN0IG10OW0xMTEgKm10OW0xMTEsCiAJCQkgICAgICAgZW51bSBtdDltMTExX2NvbnRleHQgY3R4dCkKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmbXQ5bTExMS0+c3ViZGV2KTsKIAlpbnQgdmFsQiA9IE1UOU0xMTFfQ1RYVF9DVFJMX1JFU1RBUlQgfCBNVDlNMTExX0NUWFRfQ1RSTF9ERUZFQ1RDT1JfQgogCQl8IE1UOU0xMTFfQ1RYVF9DVFJMX1JFU0laRV9CIHwgTVQ5TTExMV9DVFhUX0NUUkxfQ1RSTDJfQgogCQl8IE1UOU0xMTFfQ1RYVF9DVFJMX0dBTU1BX0IgfCBNVDlNMTExX0NUWFRfQ1RSTF9SRUFEX01PREVfQgpAQCAtMjY3LDEwICsyOTEsMTAgQEAKIAkJcmV0dXJuIHJlZ193cml0ZShDT05URVhUX0NPTlRST0wsIHZhbEEpOwogfQogCi1zdGF0aWMgaW50IG10OW0xMTFfc2V0dXBfcmVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorc3RhdGljIGludCBtdDltMTExX3NldHVwX3JlY3Qoc3RydWN0IG10OW0xMTEgKm10OW0xMTEsCiAJCQkgICAgICBzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0KQogewotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDltMTExLT5zdWJkZXYpOwogCWludCByZXQsIGlzX3Jhd19mb3JtYXQ7CiAJaW50IHdpZHRoID0gcmVjdC0+d2lkdGg7CiAJaW50IGhlaWdodCA9IHJlY3QtPmhlaWdodDsKQEAgLTMxMiw4MSArMzM2LDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG10OW0xMTFfc2V0dXBfcGl4Zm10KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiBvdXRmbXQpCitzdGF0aWMgaW50IG10OW0xMTFfZW5hYmxlKHN0cnVjdCBtdDltMTExICptdDltMTExKQogewotCWludCByZXQ7Ci0JdTE2IG1hc2sgPSBNVDlNMTExX09VVEZNVF9QUk9DRVNTRURfQkFZRVIgfCBNVDlNMTExX09VVEZNVF9SR0IgfAotCQlNVDlNMTExX09VVEZNVF9CWVBBU1NfSUZQIHwgTVQ5TTExMV9PVVRGTVRfU1dBUF9SR0JfRVZFTiB8Ci0JCU1UOU0xMTFfT1VURk1UX1JHQjU2NSB8IE1UOU0xMTFfT1VURk1UX1JHQjU1NSB8Ci0JCU1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ2JfQ3IgfAotCQlNVDlNMTExX09VVEZNVF9TV0FQX1lDYkNyX0NfWTsKLQotCXJldCA9IHJlZ19yZWFkKE9VVFBVVF9GT1JNQVRfQ1RSTDJfQSk7Ci0JaWYgKHJldCA+PSAwKQotCQlyZXQgPSByZWdfd3JpdGUoT1VUUFVUX0ZPUk1BVF9DVFJMMl9BLCAocmV0ICYgfm1hc2spIHwgb3V0Zm10KTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gcmVnX3JlYWQoT1VUUFVUX0ZPUk1BVF9DVFJMMl9CKTsKLQlpZiAocmV0ID49IDApCi0JCXJldCA9IHJlZ193cml0ZShPVVRQVVRfRk9STUFUX0NUUkwyX0IsIChyZXQgJiB+bWFzaykgfCBvdXRmbXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtdDltMTExX3NldGZtdF9iYXllcjgoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlyZXR1cm4gbXQ5bTExMV9zZXR1cF9waXhmbXQoY2xpZW50LCBNVDlNMTExX09VVEZNVF9QUk9DRVNTRURfQkFZRVIgfAotCQkJCSAgICBNVDlNMTExX09VVEZNVF9SR0IpOwotfQotCi1zdGF0aWMgaW50IG10OW0xMTFfc2V0Zm10X2JheWVyMTAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlyZXR1cm4gbXQ5bTExMV9zZXR1cF9waXhmbXQoY2xpZW50LCBNVDlNMTExX09VVEZNVF9CWVBBU1NfSUZQKTsKLX0KLQotc3RhdGljIGludCBtdDltMTExX3NldGZtdF9yZ2I1NjUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKLQlpbnQgdmFsID0gMDsKLQotCWlmIChtdDltMTExLT5zd2FwX3JnYl9yZWRfYmx1ZSkKLQkJdmFsIHw9IE1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ2JfQ3I7Ci0JaWYgKG10OW0xMTEtPnN3YXBfcmdiX2V2ZW5fb2RkKQotCQl2YWwgfD0gTVQ5TTExMV9PVVRGTVRfU1dBUF9SR0JfRVZFTjsKLQl2YWwgfD0gTVQ5TTExMV9PVVRGTVRfUkdCIHwgTVQ5TTExMV9PVVRGTVRfUkdCNTY1OwotCi0JcmV0dXJuIG10OW0xMTFfc2V0dXBfcGl4Zm10KGNsaWVudCwgdmFsKTsKLX0KLQotc3RhdGljIGludCBtdDltMTExX3NldGZtdF9yZ2I1NTUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKLQlpbnQgdmFsID0gMDsKLQotCWlmIChtdDltMTExLT5zd2FwX3JnYl9yZWRfYmx1ZSkKLQkJdmFsIHw9IE1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ2JfQ3I7Ci0JaWYgKG10OW0xMTEtPnN3YXBfcmdiX2V2ZW5fb2RkKQotCQl2YWwgfD0gTVQ5TTExMV9PVVRGTVRfU1dBUF9SR0JfRVZFTjsKLQl2YWwgfD0gTVQ5TTExMV9PVVRGTVRfUkdCIHwgTVQ5TTExMV9PVVRGTVRfUkdCNTU1OwotCi0JcmV0dXJuIG10OW0xMTFfc2V0dXBfcGl4Zm10KGNsaWVudCwgdmFsKTsKLX0KLQotc3RhdGljIGludCBtdDltMTExX3NldGZtdF95dXYoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKLQlpbnQgdmFsID0gMDsKLQotCWlmIChtdDltMTExLT5zd2FwX3l1dl9jYl9jcikKLQkJdmFsIHw9IE1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ2JfQ3I7Ci0JaWYgKG10OW0xMTEtPnN3YXBfeXV2X3lfY2hyb21hcykKLQkJdmFsIHw9IE1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ19ZOwotCi0JcmV0dXJuIG10OW0xMTFfc2V0dXBfcGl4Zm10KGNsaWVudCwgdmFsKTsKLX0KLQotc3RhdGljIGludCBtdDltMTExX2VuYWJsZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDltMTExLT5zdWJkZXYpOwogCWludCByZXQ7CiAKIAlyZXQgPSByZWdfc2V0KFJFU0VULCBNVDlNMTExX1JFU0VUX0NISVBfRU5BQkxFKTsKQEAgLTM5NSw4ICszNDcsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5bTExMV9yZXNldChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBtdDltMTExX3Jlc2V0KHN0cnVjdCBtdDltMTExICptdDltMTExKQogeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDltMTExLT5zdWJkZXYpOwogCWludCByZXQ7CiAKIAlyZXQgPSByZWdfc2V0KFJFU0VULCBNVDlNMTExX1JFU0VUX1JFU0VUX01PREUpOwpAQCAtNDI0LDExICszNzcsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG10OW0xMTFfbWFrZV9yZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCitzdGF0aWMgaW50IG10OW0xMTFfbWFrZV9yZWN0KHN0cnVjdCBtdDltMTExICptdDltMTExLAogCQkJICAgICBzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0KQogewotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOwotCiAJaWYgKG10OW0xMTEtPmZtdC0+Y29kZSA9PSBWNEwyX01CVVNfRk1UX1NCR0dSOF8xWDggfHwKIAkgICAgbXQ5bTExMS0+Zm10LT5jb2RlID09IFY0TDJfTUJVU19GTVRfU0JHR1IxMF8yWDhfUEFESElfTEUpIHsKIAkJLyogQmF5ZXIgZm9ybWF0IC0gZXZlbiBzaXplIGxlbmd0aHMgKi8KQEAgLTQ0NCwxNCArMzk1LDE0IEBACiAJc29jX2NhbWVyYV9saW1pdF9zaWRlKCZyZWN0LT50b3AsICZyZWN0LT5oZWlnaHQsCiAJCSAgICAgTVQ5TTExMV9NSU5fREFSS19ST1dTLCAyLCBNVDlNMTExX01BWF9IRUlHSFQpOwogCi0JcmV0dXJuIG10OW0xMTFfc2V0dXBfcmVjdChjbGllbnQsIHJlY3QpOworCXJldHVybiBtdDltMTExX3NldHVwX3JlY3QobXQ5bTExMSwgcmVjdCk7CiB9CiAKIHN0YXRpYyBpbnQgbXQ5bTExMV9zX2Nyb3Aoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3JvcCAqYSkKIHsKIAlzdHJ1Y3QgdjRsMl9yZWN0IHJlY3QgPSBhLT5jOwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IG10OW0xMTEsIHN1YmRldik7CiAJaW50IHJldDsKIAogCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXMgbGVmdD0lZCwgdG9wPSVkLCB3aWR0aD0lZCwgaGVpZ2h0PSVkXG4iLApAQCAtNDYwLDcgKzQxMSw3IEBACiAJaWYgKGEtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldCA9IG10OW0xMTFfbWFrZV9yZWN0KGNsaWVudCwgJnJlY3QpOworCXJldCA9IG10OW0xMTFfbWFrZV9yZWN0KG10OW0xMTEsICZyZWN0KTsKIAlpZiAoIXJldCkKIAkJbXQ5bTExMS0+cmVjdCA9IHJlY3Q7CiAJcmV0dXJuIHJldDsKQEAgLTQ2OCw4ICs0MTksNyBAQAogCiBzdGF0aWMgaW50IG10OW0xMTFfZ19jcm9wKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Nyb3AgKmEpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOworCXN0cnVjdCBtdDltMTExICptdDltMTExID0gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3QgbXQ5bTExMSwgc3ViZGV2KTsKIAogCWEtPmMJPSBtdDltMTExLT5yZWN0OwogCWEtPnR5cGUJPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CkBAIC00OTYsOCArNDQ2LDcgQEAKIHN0YXRpYyBpbnQgbXQ5bTExMV9nX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IG10OW0xMTEsIHN1YmRldik7CiAKIAltZi0+d2lkdGgJPSBtdDltMTExLT5yZWN0LndpZHRoOwogCW1mLT5oZWlnaHQJPSBtdDltMTExLT5yZWN0LmhlaWdodDsKQEAgLTUwOCw1MSArNDU3LDczIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5bTExMV9zZXRfcGl4Zm10KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCitzdGF0aWMgaW50IG10OW0xMTFfc2V0X3BpeGZtdChzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSwKIAkJCSAgICAgIGVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBjb2RlKQogewotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDltMTExLT5zdWJkZXYpOworCXUxNiBkYXRhX291dGZtdDIsIG1hc2tfb3V0Zm10MiA9IE1UOU0xMTFfT1VURk1UX1BST0NFU1NFRF9CQVlFUiB8CisJCU1UOU0xMTFfT1VURk1UX0JZUEFTU19JRlAgfCBNVDlNMTExX09VVEZNVF9SR0IgfAorCQlNVDlNMTExX09VVEZNVF9SR0I1NjUgfCBNVDlNMTExX09VVEZNVF9SR0I1NTUgfAorCQlNVDlNMTExX09VVEZNVF9SR0I0NDR4IHwgTVQ5TTExMV9PVVRGTVRfUkdCeDQ0NCB8CisJCU1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ19ZX1JHQl9FVkVOIHwKKwkJTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DYl9Dcl9SR0JfUl9COwogCWludCByZXQ7CiAKIAlzd2l0Y2ggKGNvZGUpIHsKIAljYXNlIFY0TDJfTUJVU19GTVRfU0JHR1I4XzFYODoKLQkJcmV0ID0gbXQ5bTExMV9zZXRmbXRfYmF5ZXI4KGNsaWVudCk7CisJCWRhdGFfb3V0Zm10MiA9IE1UOU0xMTFfT1VURk1UX1BST0NFU1NFRF9CQVlFUiB8CisJCQlNVDlNMTExX09VVEZNVF9SR0I7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzJYOF9QQURISV9MRToKLQkJcmV0ID0gbXQ5bTExMV9zZXRmbXRfYmF5ZXIxMChjbGllbnQpOworCQlkYXRhX291dGZtdDIgPSBNVDlNMTExX09VVEZNVF9CWVBBU1NfSUZQIHwgTVQ5TTExMV9PVVRGTVRfUkdCOwogCQlicmVhazsKIAljYXNlIFY0TDJfTUJVU19GTVRfUkdCNTU1XzJYOF9QQURISV9MRToKLQkJcmV0ID0gbXQ5bTExMV9zZXRmbXRfcmdiNTU1KGNsaWVudCk7CisJCWRhdGFfb3V0Zm10MiA9IE1UOU0xMTFfT1VURk1UX1JHQiB8IE1UOU0xMTFfT1VURk1UX1JHQjU1NSB8CisJCQlNVDlNMTExX09VVEZNVF9TV0FQX1lDYkNyX0NfWV9SR0JfRVZFTjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX01CVVNfRk1UX1JHQjU1NV8yWDhfUEFESElfQkU6CisJCWRhdGFfb3V0Zm10MiA9IE1UOU0xMTFfT1VURk1UX1JHQiB8IE1UOU0xMTFfT1VURk1UX1JHQjU1NTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX01CVVNfRk1UX1JHQjU2NV8yWDhfTEU6Ci0JCXJldCA9IG10OW0xMTFfc2V0Zm10X3JnYjU2NShjbGllbnQpOworCQlkYXRhX291dGZtdDIgPSBNVDlNMTExX09VVEZNVF9SR0IgfCBNVDlNMTExX09VVEZNVF9SR0I1NjUgfAorCQkJTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DX1lfUkdCX0VWRU47CisJCWJyZWFrOworCWNhc2UgVjRMMl9NQlVTX0ZNVF9SR0I1NjVfMlg4X0JFOgorCQlkYXRhX291dGZtdDIgPSBNVDlNMTExX09VVEZNVF9SR0IgfCBNVDlNMTExX09VVEZNVF9SR0I1NjU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9NQlVTX0ZNVF9CR1I1NjVfMlg4X0JFOgorCQlkYXRhX291dGZtdDIgPSBNVDlNMTExX09VVEZNVF9SR0IgfCBNVDlNMTExX09VVEZNVF9SR0I1NjUgfAorCQkJTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DYl9Dcl9SR0JfUl9COworCQlicmVhazsKKwljYXNlIFY0TDJfTUJVU19GTVRfQkdSNTY1XzJYOF9MRToKKwkJZGF0YV9vdXRmbXQyID0gTVQ5TTExMV9PVVRGTVRfUkdCIHwgTVQ5TTExMV9PVVRGTVRfUkdCNTY1IHwKKwkJCU1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ19ZX1JHQl9FVkVOIHwKKwkJCU1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ2JfQ3JfUkdCX1JfQjsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX01CVVNfRk1UX1VZVlk4XzJYODoKLQkJbXQ5bTExMS0+c3dhcF95dXZfeV9jaHJvbWFzID0gMDsKLQkJbXQ5bTExMS0+c3dhcF95dXZfY2JfY3IgPSAwOwotCQlyZXQgPSBtdDltMTExX3NldGZtdF95dXYoY2xpZW50KTsKKwkJZGF0YV9vdXRmbXQyID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX01CVVNfRk1UX1ZZVVk4XzJYODoKLQkJbXQ5bTExMS0+c3dhcF95dXZfeV9jaHJvbWFzID0gMDsKLQkJbXQ5bTExMS0+c3dhcF95dXZfY2JfY3IgPSAxOwotCQlyZXQgPSBtdDltMTExX3NldGZtdF95dXYoY2xpZW50KTsKKwkJZGF0YV9vdXRmbXQyID0gTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DYl9Dcl9SR0JfUl9COwogCQlicmVhazsKIAljYXNlIFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4OgotCQltdDltMTExLT5zd2FwX3l1dl95X2Nocm9tYXMgPSAxOwotCQltdDltMTExLT5zd2FwX3l1dl9jYl9jciA9IDA7Ci0JCXJldCA9IG10OW0xMTFfc2V0Zm10X3l1dihjbGllbnQpOworCQlkYXRhX291dGZtdDIgPSBNVDlNMTExX09VVEZNVF9TV0FQX1lDYkNyX0NfWV9SR0JfRVZFTjsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX01CVVNfRk1UX1lWWVU4XzJYODoKLQkJbXQ5bTExMS0+c3dhcF95dXZfeV9jaHJvbWFzID0gMTsKLQkJbXQ5bTExMS0+c3dhcF95dXZfY2JfY3IgPSAxOwotCQlyZXQgPSBtdDltMTExX3NldGZtdF95dXYoY2xpZW50KTsKKwkJZGF0YV9vdXRmbXQyID0gTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DX1lfUkdCX0VWRU4gfAorCQkJTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DYl9Dcl9SR0JfUl9COwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlBpeGVsIGZvcm1hdCBub3QgaGFuZGxlZCA6ICV4XG4iLAotCQkJY29kZSk7Ci0JCXJldCA9IC1FSU5WQUw7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiUGl4ZWwgZm9ybWF0IG5vdCBoYW5kbGVkOiAleFxuIiwgY29kZSk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCXJldCA9IHJlZ19tYXNrKE9VVFBVVF9GT1JNQVRfQ1RSTDJfQSwgZGF0YV9vdXRmbXQyLAorCQkgICAgICAgbWFza19vdXRmbXQyKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX21hc2soT1VUUFVUX0ZPUk1BVF9DVFJMMl9CLCBkYXRhX291dGZtdDIsCisJCQkgICAgICAgbWFza19vdXRmbXQyKTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTU2MSw3ICs1MzIsNyBAQAogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAljb25zdCBzdHJ1Y3QgbXQ5bTExMV9kYXRhZm10ICpmbXQ7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7CisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBtdDltMTExLCBzdWJkZXYpOwogCXN0cnVjdCB2NGwyX3JlY3QgcmVjdCA9IHsKIAkJLmxlZnQJPSBtdDltMTExLT5yZWN0LmxlZnQsCiAJCS50b3AJPSBtdDltMTExLT5yZWN0LnRvcCwKQEAgLTU3OSw5ICs1NTAsOSBAQAogCQkiJXMgY29kZT0leCBsZWZ0PSVkLCB0b3A9JWQsIHdpZHRoPSVkLCBoZWlnaHQ9JWRcbiIsIF9fZnVuY19fLAogCQltZi0+Y29kZSwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwogCi0JcmV0ID0gbXQ5bTExMV9tYWtlX3JlY3QoY2xpZW50LCAmcmVjdCk7CisJcmV0ID0gbXQ5bTExMV9tYWtlX3JlY3QobXQ5bTExMSwgJnJlY3QpOwogCWlmICghcmV0KQotCQlyZXQgPSBtdDltMTExX3NldF9waXhmbXQoY2xpZW50LCBtZi0+Y29kZSk7CisJCXJldCA9IG10OW0xMTFfc2V0X3BpeGZtdChtdDltMTExLCBtZi0+Y29kZSk7CiAJaWYgKCFyZXQpIHsKIAkJbXQ5bTExMS0+cmVjdAk9IHJlY3Q7CiAJCW10OW0xMTEtPmZtdAk9IGZtdDsKQEAgLTU5NCw4ICs1NjUsNyBAQAogc3RhdGljIGludCBtdDltMTExX3RyeV9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKIAkJCSAgIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IG10OW0xMTEsIHN1YmRldik7CiAJY29uc3Qgc3RydWN0IG10OW0xMTFfZGF0YWZtdCAqZm10OwogCWJvb2wgYmF5ZXIgPSBtZi0+Y29kZSA9PSBWNEwyX01CVVNfRk1UX1NCR0dSOF8xWDggfHwKIAkJbWYtPmNvZGUgPT0gVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzJYOF9QQURISV9MRTsKQEAgLTYzNSw3ICs2MDUsNyBAQAogCQkJCXN0cnVjdCB2NGwyX2RiZ19jaGlwX2lkZW50ICppZCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7CisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBtdDltMTExLCBzdWJkZXYpOwogCiAJaWYgKGlkLT5tYXRjaC50eXBlICE9IFY0TDJfQ0hJUF9NQVRDSF9JMkNfQUREUikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC03MjYsMjEgKzY5NiwxNiBAQAogCX0KIH07CiAKLXN0YXRpYyBpbnQgbXQ5bTExMV9yZXN1bWUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpOwotc3RhdGljIGludCBtdDltMTExX3N1c3BlbmQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7Ci0KIHN0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgbXQ5bTExMV9vcHMgPSB7Ci0JLnN1c3BlbmQJCT0gbXQ5bTExMV9zdXNwZW5kLAotCS5yZXN1bWUJCQk9IG10OW0xMTFfcmVzdW1lLAogCS5xdWVyeV9idXNfcGFyYW0JPSBtdDltMTExX3F1ZXJ5X2J1c19wYXJhbSwKIAkuc2V0X2J1c19wYXJhbQkJPSBtdDltMTExX3NldF9idXNfcGFyYW0sCiAJLmNvbnRyb2xzCQk9IG10OW0xMTFfY29udHJvbHMsCiAJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKG10OW0xMTFfY29udHJvbHMpLAogfTsKIAotc3RhdGljIGludCBtdDltMTExX3NldF9mbGlwKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBmbGlwLCBpbnQgbWFzaykKK3N0YXRpYyBpbnQgbXQ5bTExMV9zZXRfZmxpcChzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSwgaW50IGZsaXAsIGludCBtYXNrKQogewotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDltMTExLT5zdWJkZXYpOwogCWludCByZXQ7CiAKIAlpZiAobXQ5bTExMS0+Y29udGV4dCA9PSBISUdIUE9XRVIpIHsKQEAgLTc1OCw4ICs3MjMsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5bTExMV9nZXRfZ2xvYmFsX2dhaW4oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgbXQ5bTExMV9nZXRfZ2xvYmFsX2dhaW4oc3RydWN0IG10OW0xMTEgKm10OW0xMTEpCiB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OW0xMTEtPnN1YmRldik7CiAJaW50IGRhdGE7CiAKIAlkYXRhID0gcmVnX3JlYWQoR0xPQkFMX0dBSU4pOwpAQCAtNzY5LDkgKzczNSw5IEBACiAJcmV0dXJuIGRhdGE7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5bTExMV9zZXRfZ2xvYmFsX2dhaW4oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGdhaW4pCitzdGF0aWMgaW50IG10OW0xMTFfc2V0X2dsb2JhbF9nYWluKHN0cnVjdCBtdDltMTExICptdDltMTExLCBpbnQgZ2FpbikKIHsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmbXQ5bTExMS0+c3ViZGV2KTsKIAl1MTYgdmFsOwogCiAJaWYgKGdhaW4gPiA2MyAqIDIgKiAyKQpAQCAtNzg4LDkgKzc1NCw5IEBACiAJcmV0dXJuIHJlZ193cml0ZShHTE9CQUxfR0FJTiwgdmFsKTsKIH0KIAotc3RhdGljIGludCBtdDltMTExX3NldF9hdXRvZXhwb3N1cmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IG9uKQorc3RhdGljIGludCBtdDltMTExX3NldF9hdXRvZXhwb3N1cmUoc3RydWN0IG10OW0xMTEgKm10OW0xMTEsIGludCBvbikKIHsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmbXQ5bTExMS0+c3ViZGV2KTsKIAlpbnQgcmV0OwogCiAJaWYgKG9uKQpAQCAtODA0LDkgKzc3MCw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBtdDltMTExX3NldF9hdXRvd2hpdGViYWxhbmNlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBvbikKK3N0YXRpYyBpbnQgbXQ5bTExMV9zZXRfYXV0b3doaXRlYmFsYW5jZShzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSwgaW50IG9uKQogewotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDltMTExLT5zdWJkZXYpOwogCWludCByZXQ7CiAKIAlpZiAob24pCkBAIC04MjMsNyArNzg5LDcgQEAKIHN0YXRpYyBpbnQgbXQ5bTExMV9nX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7CisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBtdDltMTExLCBzdWJkZXYpOwogCWludCBkYXRhOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewpAQCAtODQ4LDcgKzgxNCw3IEBACiAJCWN0cmwtPnZhbHVlID0gISEoZGF0YSAmIE1UOU0xMTFfUk1CX01JUlJPUl9DT0xTKTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9HQUlOOgotCQlkYXRhID0gbXQ5bTExMV9nZXRfZ2xvYmFsX2dhaW4oY2xpZW50KTsKKwkJZGF0YSA9IG10OW0xMTFfZ2V0X2dsb2JhbF9nYWluKG10OW0xMTEpOwogCQlpZiAoZGF0YSA8IDApCiAJCQlyZXR1cm4gZGF0YTsKIAkJY3RybC0+dmFsdWUgPSBkYXRhOwpAQCAtODY1LDggKzgzMSw3IEBACiAKIHN0YXRpYyBpbnQgbXQ5bTExMV9zX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7CisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBtdDltMTExLCBzdWJkZXYpOwogCWNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmw7CiAJaW50IHJldDsKIApAQCAtODc3LDIyICs4NDIsMjIgQEAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9WRkxJUDoKIAkJbXQ5bTExMS0+dmZsaXAgPSBjdHJsLT52YWx1ZTsKLQkJcmV0ID0gbXQ5bTExMV9zZXRfZmxpcChjbGllbnQsIGN0cmwtPnZhbHVlLAorCQlyZXQgPSBtdDltMTExX3NldF9mbGlwKG10OW0xMTEsIGN0cmwtPnZhbHVlLAogCQkJCQlNVDlNMTExX1JNQl9NSVJST1JfUk9XUyk7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfSEZMSVA6CiAJCW10OW0xMTEtPmhmbGlwID0gY3RybC0+dmFsdWU7Ci0JCXJldCA9IG10OW0xMTFfc2V0X2ZsaXAoY2xpZW50LCBjdHJsLT52YWx1ZSwKKwkJcmV0ID0gbXQ5bTExMV9zZXRfZmxpcChtdDltMTExLCBjdHJsLT52YWx1ZSwKIAkJCQkJTVQ5TTExMV9STUJfTUlSUk9SX0NPTFMpOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCXJldCA9IG10OW0xMTFfc2V0X2dsb2JhbF9nYWluKGNsaWVudCwgY3RybC0+dmFsdWUpOworCQlyZXQgPSBtdDltMTExX3NldF9nbG9iYWxfZ2FpbihtdDltMTExLCBjdHJsLT52YWx1ZSk7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfRVhQT1NVUkVfQVVUTzoKLQkJcmV0ID0gIG10OW0xMTFfc2V0X2F1dG9leHBvc3VyZShjbGllbnQsIGN0cmwtPnZhbHVlKTsKKwkJcmV0ID0gIG10OW0xMTFfc2V0X2F1dG9leHBvc3VyZShtdDltMTExLCBjdHJsLT52YWx1ZSk7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFOgotCQlyZXQgPSAgbXQ5bTExMV9zZXRfYXV0b3doaXRlYmFsYW5jZShjbGllbnQsIGN0cmwtPnZhbHVlKTsKKwkJcmV0ID0gIG10OW0xMTFfc2V0X2F1dG93aGl0ZWJhbGFuY2UobXQ5bTExMSwgY3RybC0+dmFsdWUpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSAtRUlOVkFMOwpAQCAtOTAxLDYwICs4NjYsNTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG10OW0xMTFfc3VzcGVuZChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBtdDltMTExX3N1c3BlbmQoc3RydWN0IG10OW0xMTEgKm10OW0xMTEpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQodG9fc29jX2NhbWVyYV9jb250cm9sKGljZCkpOwotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOwotCi0JbXQ5bTExMS0+Z2FpbiA9IG10OW0xMTFfZ2V0X2dsb2JhbF9nYWluKGNsaWVudCk7CisJbXQ5bTExMS0+Z2FpbiA9IG10OW0xMTFfZ2V0X2dsb2JhbF9nYWluKG10OW0xMTEpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5bTExMV9yZXN0b3JlX3N0YXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgdm9pZCBtdDltMTExX3Jlc3RvcmVfc3RhdGUoc3RydWN0IG10OW0xMTEgKm10OW0xMTEpCiB7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7Ci0KLQltdDltMTExX3NldF9jb250ZXh0KGNsaWVudCwgbXQ5bTExMS0+Y29udGV4dCk7Ci0JbXQ5bTExMV9zZXRfcGl4Zm10KGNsaWVudCwgbXQ5bTExMS0+Zm10LT5jb2RlKTsKLQltdDltMTExX3NldHVwX3JlY3QoY2xpZW50LCAmbXQ5bTExMS0+cmVjdCk7Ci0JbXQ5bTExMV9zZXRfZmxpcChjbGllbnQsIG10OW0xMTEtPmhmbGlwLCBNVDlNMTExX1JNQl9NSVJST1JfQ09MUyk7Ci0JbXQ5bTExMV9zZXRfZmxpcChjbGllbnQsIG10OW0xMTEtPnZmbGlwLCBNVDlNMTExX1JNQl9NSVJST1JfUk9XUyk7Ci0JbXQ5bTExMV9zZXRfZ2xvYmFsX2dhaW4oY2xpZW50LCBtdDltMTExLT5nYWluKTsKLQltdDltMTExX3NldF9hdXRvZXhwb3N1cmUoY2xpZW50LCBtdDltMTExLT5hdXRvZXhwb3N1cmUpOwotCW10OW0xMTFfc2V0X2F1dG93aGl0ZWJhbGFuY2UoY2xpZW50LCBtdDltMTExLT5hdXRvd2hpdGViYWxhbmNlKTsKLQlyZXR1cm4gMDsKKwltdDltMTExX3NldF9jb250ZXh0KG10OW0xMTEsIG10OW0xMTEtPmNvbnRleHQpOworCW10OW0xMTFfc2V0X3BpeGZtdChtdDltMTExLCBtdDltMTExLT5mbXQtPmNvZGUpOworCW10OW0xMTFfc2V0dXBfcmVjdChtdDltMTExLCAmbXQ5bTExMS0+cmVjdCk7CisJbXQ5bTExMV9zZXRfZmxpcChtdDltMTExLCBtdDltMTExLT5oZmxpcCwgTVQ5TTExMV9STUJfTUlSUk9SX0NPTFMpOworCW10OW0xMTFfc2V0X2ZsaXAobXQ5bTExMSwgbXQ5bTExMS0+dmZsaXAsIE1UOU0xMTFfUk1CX01JUlJPUl9ST1dTKTsKKwltdDltMTExX3NldF9nbG9iYWxfZ2FpbihtdDltMTExLCBtdDltMTExLT5nYWluKTsKKwltdDltMTExX3NldF9hdXRvZXhwb3N1cmUobXQ5bTExMSwgbXQ5bTExMS0+YXV0b2V4cG9zdXJlKTsKKwltdDltMTExX3NldF9hdXRvd2hpdGViYWxhbmNlKG10OW0xMTEsIG10OW0xMTEtPmF1dG93aGl0ZWJhbGFuY2UpOwogfQogCi1zdGF0aWMgaW50IG10OW0xMTFfcmVzdW1lKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQorc3RhdGljIGludCBtdDltMTExX3Jlc3VtZShzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudCh0b19zb2NfY2FtZXJhX2NvbnRyb2woaWNkKSk7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAobXQ5bTExMS0+cG93ZXJlZCkgewotCQlyZXQgPSBtdDltMTExX2VuYWJsZShjbGllbnQpOworCQlyZXQgPSBtdDltMTExX2VuYWJsZShtdDltMTExKTsKIAkJaWYgKCFyZXQpCi0JCQlyZXQgPSBtdDltMTExX3Jlc2V0KGNsaWVudCk7CisJCQlyZXQgPSBtdDltMTExX3Jlc2V0KG10OW0xMTEpOwogCQlpZiAoIXJldCkKLQkJCXJldCA9IG10OW0xMTFfcmVzdG9yZV9zdGF0ZShjbGllbnQpOworCQkJbXQ5bTExMV9yZXN0b3JlX3N0YXRlKG10OW0xMTEpOwogCX0KIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG10OW0xMTFfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBtdDltMTExX2luaXQoc3RydWN0IG10OW0xMTEgKm10OW0xMTEpCiB7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OW0xMTEtPnN1YmRldik7CiAJaW50IHJldDsKIAogCW10OW0xMTEtPmNvbnRleHQgPSBISUdIUE9XRVI7Ci0JcmV0ID0gbXQ5bTExMV9lbmFibGUoY2xpZW50KTsKKwlyZXQgPSBtdDltMTExX2VuYWJsZShtdDltMTExKTsKIAlpZiAoIXJldCkKLQkJcmV0ID0gbXQ5bTExMV9yZXNldChjbGllbnQpOworCQlyZXQgPSBtdDltMTExX3Jlc2V0KG10OW0xMTEpOwogCWlmICghcmV0KQotCQlyZXQgPSBtdDltMTExX3NldF9jb250ZXh0KGNsaWVudCwgbXQ5bTExMS0+Y29udGV4dCk7CisJCXJldCA9IG10OW0xMTFfc2V0X2NvbnRleHQobXQ5bTExMSwgbXQ5bTExMS0+Y29udGV4dCk7CiAJaWYgKCFyZXQpCi0JCXJldCA9IG10OW0xMTFfc2V0X2F1dG9leHBvc3VyZShjbGllbnQsIG10OW0xMTEtPmF1dG9leHBvc3VyZSk7CisJCXJldCA9IG10OW0xMTFfc2V0X2F1dG9leHBvc3VyZShtdDltMTExLCBtdDltMTExLT5hdXRvZXhwb3N1cmUpOwogCWlmIChyZXQpCiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAibXQ5bTExMSBpbml0IGZhaWxlZDogJWRcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKQEAgLTk3MSwyMCArOTI4LDEzIEBACiAJczMyIGRhdGE7CiAJaW50IHJldDsKIAotCS8qCi0JICogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4KLQkgKiBTbyB0aGlzIGVudGlyZSB0ZXN0IGlzIGNvbXBsZXRlbHkgcmVkdW5kYW50LgotCSAqLwotCWlmICghaWNkLT5kZXYucGFyZW50IHx8Ci0JICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKQotCQlyZXR1cm4gLUVOT0RFVjsKKwkvKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLiAqLworCUJVR19PTighaWNkLT5wYXJlbnQgfHwKKwkgICAgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSk7CiAKIAltdDltMTExLT5hdXRvZXhwb3N1cmUgPSAxOwogCW10OW0xMTEtPmF1dG93aGl0ZWJhbGFuY2UgPSAxOwogCi0JbXQ5bTExMS0+c3dhcF9yZ2JfZXZlbl9vZGQgPSAxOwotCW10OW0xMTEtPnN3YXBfcmdiX3JlZF9ibHVlID0gMTsKLQogCWRhdGEgPSByZWdfcmVhZChDSElQX1ZFUlNJT04pOwogCiAJc3dpdGNoIChkYXRhKSB7CkBAIC0xMDA1LDE2ICs5NTUsNTEgQEAKIAkJZ290byBlaTJjOwogCX0KIAotCXJldCA9IG10OW0xMTFfaW5pdChjbGllbnQpOworCXJldCA9IG10OW0xMTFfaW5pdChtdDltMTExKTsKIAogZWkyYzoKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IG10OW0xMTFfc19wb3dlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgb24pCit7CisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBtdDltMTExLCBzdWJkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJm10OW0xMTEtPnBvd2VyX2xvY2spOworCisJLyoKKwkgKiBJZiB0aGUgcG93ZXIgY291bnQgaXMgbW9kaWZpZWQgZnJvbSAwIHRvICE9IDAgb3IgZnJvbSAhPSAwIHRvIDAsCisJICogdXBkYXRlIHRoZSBwb3dlciBzdGF0ZS4KKwkgKi8KKwlpZiAobXQ5bTExMS0+cG93ZXJfY291bnQgPT0gIW9uKSB7CisJCWlmIChvbikgeworCQkJcmV0ID0gbXQ5bTExMV9yZXN1bWUobXQ5bTExMSk7CisJCQlpZiAocmV0KSB7CisJCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkJCSJGYWlsZWQgdG8gcmVzdW1lIHRoZSBzZW5zb3I6ICVkXG4iLCByZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9IGVsc2UgeworCQkJbXQ5bTExMV9zdXNwZW5kKG10OW0xMTEpOworCQl9CisJfQorCisJLyogVXBkYXRlIHRoZSBwb3dlciBjb3VudC4gKi8KKwltdDltMTExLT5wb3dlcl9jb3VudCArPSBvbiA/IDEgOiAtMTsKKwlXQVJOX09OKG10OW0xMTEtPnBvd2VyX2NvdW50IDwgMCk7CisKK291dDoKKwltdXRleF91bmxvY2soJm10OW0xMTEtPnBvd2VyX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgbXQ5bTExMV9zdWJkZXZfY29yZV9vcHMgPSB7CiAJLmdfY3RybAkJPSBtdDltMTExX2dfY3RybCwKIAkuc19jdHJsCQk9IG10OW0xMTFfc19jdHJsLAogCS5nX2NoaXBfaWRlbnQJPSBtdDltMTExX2dfY2hpcF9pZGVudCwKKwkuc19wb3dlcgk9IG10OW0xMTFfc19wb3dlciwKICNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCiAJLmdfcmVnaXN0ZXIJPSBtdDltMTExX2dfcmVnaXN0ZXIsCiAJLnNfcmVnaXN0ZXIJPSBtdDltMTExX3NfcmVnaXN0ZXIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQwMzEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDAzMS5jCmluZGV4IDdjZTI3OWMuLjMwNTQ3Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDAzMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDAzMS5jCkBAIC03MDAsOCArNzAwLDcgQEAKIHN0YXRpYyBpbnQgbXQ5dDAzMV9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHRvX3ZpZGVvX2RldmljZShkZXYpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY29udGFpbmVyX29mKHZkZXYtPnBhcmVudCwKLQkJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlLCBkZXYpOworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZGV2X2dldF9kcnZkYXRhKHZkZXYtPnBhcmVudCk7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCXN0cnVjdCBtdDl0MDMxICptdDl0MDMxID0gdG9fbXQ5dDAzMShjbGllbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDl0MTEyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQxMTIuYwppbmRleCBiZmZhOWVlLi5kMmUwYTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQxMTIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQxMTIuYwpAQCAtMTA1NywxMyArMTA1Nyw5IEBACiAJY29uc3QgY2hhciAgICAgICAgICAqZGV2bmFtZTsKIAlpbnQgICAgICAgICAgICAgICAgICBjaGlwaWQ7CiAKLQkvKgotCSAqIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuCi0JICogU28gdGhpcyBlbnRpcmUgdGVzdCBpcyBjb21wbGV0ZWx5IHJlZHVuZGFudC4KLQkgKi8KLQlpZiAoIWljZC0+ZGV2LnBhcmVudCB8fAotCSAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJLyogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4gKi8KKwlCVUdfT04oIWljZC0+cGFyZW50IHx8CisJICAgICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpOwogCiAJLyoKIAkgKiBjaGVjayBhbmQgc2hvdyBjaGlwIElECmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXYwMTEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAxMS5jCmluZGV4IDQ5MDRkMjUuLjg5M2E4YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAxMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAxMS5jCkBAIC01NCwxMSArNTQsMjAgQEAKIAkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAogCQkubmFtZSA9ICJHYWluIiwKIAkJLm1pbmltdW0gPSAwLAotCQkubWF4aW11bSA9ICgxIDw8IDEwKSAtIDEsCisJCS5tYXhpbXVtID0gKDEgPDwgMTIpIC0gMSAtIDB4MDAyMCwKIAkJLnN0ZXAgPSAxLAogCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDAyMCwKIAkJLmZsYWdzID0gMCwKIAl9LCB7CisJCS5pZCA9IFY0TDJfQ0lEX0VYUE9TVVJFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIkV4cG9zdXJlIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDIwNDcsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAweDAxZmMsCisJCS5mbGFncyA9IDAsCisJfSwgewogCQkuaWQgPSBWNEwyX0NJRF9SRURfQkFMQU5DRSwKIAkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAogCQkubmFtZSA9ICJSZWQgQmFsYW5jZSIsCkBAIC0xMDUsNyArMTE0LDggQEAKIAl1bnNpZ25lZCBoZmxpcDoxOwogCXVuc2lnbmVkIHZmbGlwOjE7CiAKLQl1MTYgZ2xvYmFsX2dhaW4sIHJlZF9iYWwsIGJsdWVfYmFsOworCXUxNiBnbG9iYWxfZ2FpbiwgZXhwb3N1cmU7CisJczE2IHJlZF9iYWwsIGJsdWVfYmFsOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbXQ5djAxMSAqdG9fbXQ5djAxMShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQpAQCAtMTgwLDI0ICsxOTAsNjggQEAKIAkJeyBSMDdfTVQ5VjAxMV9PVVRfQ1RSTCwgMHgwMDAyIH0sCS8qIGNoaXAgZW5hYmxlICovCiB9OwogCisKK3N0YXRpYyB1MTYgY2FsY19tdDl2MDExX2dhaW4oczE2IGxpbmVhcmdhaW4pCit7CisKKwl1MTYgZGlnaXRhbGdhaW4gPSAwOworCXUxNiBhbmFsb2dtdWx0ID0gMDsKKwl1MTYgYW5hbG9naW5pdCA9IDA7CisKKwlpZiAobGluZWFyZ2FpbiA8IDApCisJCWxpbmVhcmdhaW4gPSAwOworCisJLyogcmVjb21tZW5kZWQgbWluaW11bSAqLworCWxpbmVhcmdhaW4gKz0gMHgwMDIwOworCisJaWYgKGxpbmVhcmdhaW4gPiAyMDQ3KQorCQlsaW5lYXJnYWluID0gMjA0NzsKKworCWlmIChsaW5lYXJnYWluID4gMTAyMykgeworCQlkaWdpdGFsZ2FpbiA9IDM7CisJCWFuYWxvZ211bHQgPSAzOworCQlhbmFsb2dpbml0ID0gbGluZWFyZ2FpbiAvIDE2OworCX0gZWxzZSBpZiAobGluZWFyZ2FpbiA+IDUxMSkgeworCQlkaWdpdGFsZ2FpbiA9IDE7CisJCWFuYWxvZ211bHQgPSAzOworCQlhbmFsb2dpbml0ID0gbGluZWFyZ2FpbiAvIDg7CisJfSBlbHNlIGlmIChsaW5lYXJnYWluID4gMjU1KSB7CisJCWFuYWxvZ211bHQgPSAzOworCQlhbmFsb2dpbml0ID0gbGluZWFyZ2FpbiAvIDQ7CisJfSBlbHNlIGlmIChsaW5lYXJnYWluID4gMTI3KSB7CisJCWFuYWxvZ211bHQgPSAxOworCQlhbmFsb2dpbml0ID0gbGluZWFyZ2FpbiAvIDI7CisJfSBlbHNlCisJCWFuYWxvZ2luaXQgPSBsaW5lYXJnYWluOworCisJcmV0dXJuIGFuYWxvZ2luaXQgKyAoYW5hbG9nbXVsdCA8PCA3KSArIChkaWdpdGFsZ2FpbiA8PCA5KTsKKworfQorCiBzdGF0aWMgdm9pZCBzZXRfYmFsYW5jZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQogewogCXN0cnVjdCBtdDl2MDExICpjb3JlID0gdG9fbXQ5djAxMShzZCk7Ci0JdTE2IGdyZWVuMV9nYWluLCBncmVlbjJfZ2FpbiwgYmx1ZV9nYWluLCByZWRfZ2FpbjsKKwl1MTYgZ3JlZW5fZ2FpbiwgYmx1ZV9nYWluLCByZWRfZ2FpbjsKKwl1MTYgZXhwb3N1cmU7CisJczE2IGJhbDsKIAotCWdyZWVuMV9nYWluID0gY29yZS0+Z2xvYmFsX2dhaW47Ci0JZ3JlZW4yX2dhaW4gPSBjb3JlLT5nbG9iYWxfZ2FpbjsKKwlleHBvc3VyZSA9IGNvcmUtPmV4cG9zdXJlOwogCi0JYmx1ZV9nYWluID0gY29yZS0+Z2xvYmFsX2dhaW4gKwotCQkgICAgY29yZS0+Z2xvYmFsX2dhaW4gKiBjb3JlLT5ibHVlX2JhbCAvICgxIDw8IDkpOworCWdyZWVuX2dhaW4gPSBjYWxjX210OXYwMTFfZ2Fpbihjb3JlLT5nbG9iYWxfZ2Fpbik7CiAKLQlyZWRfZ2FpbiA9IGNvcmUtPmdsb2JhbF9nYWluICsKLQkJICAgY29yZS0+Z2xvYmFsX2dhaW4gKiBjb3JlLT5ibHVlX2JhbCAvICgxIDw8IDkpOworCWJhbCA9IGNvcmUtPmdsb2JhbF9nYWluOworCWJhbCArPSAoY29yZS0+Ymx1ZV9iYWwgKiBjb3JlLT5nbG9iYWxfZ2FpbiAvICgxIDw8IDcpKTsKKwlibHVlX2dhaW4gPSBjYWxjX210OXYwMTFfZ2FpbihiYWwpOwogCi0JbXQ5djAxMV93cml0ZShzZCwgUjJCX01UOVYwMTFfR1JFRU5fMV9HQUlOLCBncmVlbjFfZ2Fpbik7Ci0JbXQ5djAxMV93cml0ZShzZCwgUjJFX01UOVYwMTFfR1JFRU5fMl9HQUlOLCAgZ3JlZW4xX2dhaW4pOworCWJhbCA9IGNvcmUtPmdsb2JhbF9nYWluOworCWJhbCArPSAoY29yZS0+cmVkX2JhbCAqIGNvcmUtPmdsb2JhbF9nYWluIC8gKDEgPDwgNykpOworCXJlZF9nYWluID0gY2FsY19tdDl2MDExX2dhaW4oYmFsKTsKKworCW10OXYwMTFfd3JpdGUoc2QsIFIyQl9NVDlWMDExX0dSRUVOXzFfR0FJTiwgZ3JlZW5fZ2Fpbik7CisJbXQ5djAxMV93cml0ZShzZCwgUjJFX01UOVYwMTFfR1JFRU5fMl9HQUlOLCBncmVlbl9nYWluKTsKIAltdDl2MDExX3dyaXRlKHNkLCBSMkNfTVQ5VjAxMV9CTFVFX0dBSU4sIGJsdWVfZ2Fpbik7CiAJbXQ5djAxMV93cml0ZShzZCwgUjJEX01UOVYwMTFfUkVEX0dBSU4sIHJlZF9nYWluKTsKKwltdDl2MDExX3dyaXRlKHNkLCBSMDlfTVQ5VjAxMV9TSFVUVEVSX1dJRFRILCBleHBvc3VyZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGNhbGNfZnBzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiAqbnVtZXJhdG9yLCB1MzIgKmRlbm9taW5hdG9yKQpAQCAtMjg2LDcgKzM0MCw3IEBACiAJICogYmUgbWlzc2luZy4KIAkgKi8KIAotCWhzdGFydCA9IDE0ICsgKDY0MCAtIGNvcmUtPndpZHRoKSAvIDI7CisJaHN0YXJ0ID0gMjAgKyAoNjQwIC0gY29yZS0+d2lkdGgpIC8gMjsKIAltdDl2MDExX3dyaXRlKHNkLCBSMDJfTVQ5VjAxMV9DT0xTVEFSVCwgaHN0YXJ0KTsKIAltdDl2MDExX3dyaXRlKHNkLCBSMDRfTVQ5VjAxMV9XSURUSCwgY29yZS0+d2lkdGgpOwogCW10OXYwMTFfd3JpdGUoc2QsIFIwNV9NVDlWMDExX0hCTEFOSywgNzcxIC0gY29yZS0+d2lkdGgpOwpAQCAtMzM4LDYgKzM5Miw5IEBACiAJY2FzZSBWNEwyX0NJRF9HQUlOOgogCQljdHJsLT52YWx1ZSA9IGNvcmUtPmdsb2JhbF9nYWluOwogCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgorCQljdHJsLT52YWx1ZSA9IGNvcmUtPmV4cG9zdXJlOworCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgogCQljdHJsLT52YWx1ZSA9IGNvcmUtPnJlZF9iYWw7CiAJCXJldHVybiAwOwpAQCAtMzkyLDYgKzQ0OSw5IEBACiAJY2FzZSBWNEwyX0NJRF9HQUlOOgogCQljb3JlLT5nbG9iYWxfZ2FpbiA9IGN0cmwtPnZhbHVlOwogCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgorCQljb3JlLT5leHBvc3VyZSA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgogCQljb3JlLT5yZWRfYmFsID0gY3RybC0+dmFsdWU7CiAJCWJyZWFrOwpAQCAtNTk4LDYgKzY1OCw3IEBACiAJfQogCiAJY29yZS0+Z2xvYmFsX2dhaW4gPSAweDAwMjQ7CisJY29yZS0+ZXhwb3N1cmUgPSAweDAxZmM7CiAJY29yZS0+d2lkdGggID0gNjQwOwogCWNvcmUtPmhlaWdodCA9IDQ4MDsKIAljb3JlLT54dGFsID0gMjcwMDAwMDA7CS8qIEh6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXYwMjIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAyMi5jCmluZGV4IGZjNzZlZDEuLjUxYjBmY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAyMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAyMi5jCkBAIC03MjgsOSArNzI4LDkgQEAKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoIWljZC0+ZGV2LnBhcmVudCB8fAotCSAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJLyogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4gKi8KKwlCVUdfT04oIWljZC0+cGFyZW50IHx8CisJICAgICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpOwogCiAJLyogUmVhZCBvdXQgdGhlIGNoaXAgdmVyc2lvbiByZWdpc3RlciAqLwogCWRhdGEgPSByZWdfcmVhZChjbGllbnQsIE1UOVYwMjJfQ0hJUF9WRVJTSU9OKTsKQEAgLTgwOSw4ICs4MDksOCBAQAogewogCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwogCi0JZGV2X2RiZygmaWNkLT5kZXYsICJWaWRlbyByZW1vdmVkOiAlcCwgJXBcbiIsCi0JCWljZC0+ZGV2LnBhcmVudCwgaWNkLT52ZGV2KTsKKwlkZXZfZGJnKGljZC0+cGRldiwgIlZpZGVvIHJlbW92ZWQ6ICVwLCAlcFxuIiwKKwkJaWNkLT5wYXJlbnQsIGljZC0+dmRldik7CiAJaWYgKGljbC0+ZnJlZV9idXMpCiAJCWljbC0+ZnJlZV9idXMoaWNsKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAzMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDMyLmMKaW5kZXggMTMxOWMyYy4uYzY0ZTFkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDMyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDMyLmMKQEAgLTMxLDE0ICszMSwxNCBAQAogI2RlZmluZSBNVDlWMDMyX0NISVBfVkVSU0lPTgkJCQkweDAwCiAjZGVmaW5lCQlNVDlWMDMyX0NISVBfSURfUkVWMQkJCTB4MTMxMQogI2RlZmluZQkJTVQ5VjAzMl9DSElQX0lEX1JFVjMJCQkweDEzMTMKLSNkZWZpbmUgTVQ5VjAzMl9ST1dfU1RBUlQJCQkJMHgwMQotI2RlZmluZQkJTVQ5VjAzMl9ST1dfU1RBUlRfTUlOCQkJNAotI2RlZmluZQkJTVQ5VjAzMl9ST1dfU1RBUlRfREVGCQkJMTAKLSNkZWZpbmUJCU1UOVYwMzJfUk9XX1NUQVJUX01BWAkJCTQ4MgotI2RlZmluZSBNVDlWMDMyX0NPTFVNTl9TVEFSVAkJCQkweDAyCisjZGVmaW5lIE1UOVYwMzJfQ09MVU1OX1NUQVJUCQkJCTB4MDEKICNkZWZpbmUJCU1UOVYwMzJfQ09MVU1OX1NUQVJUX01JTgkJMQotI2RlZmluZQkJTVQ5VjAzMl9DT0xVTU5fU1RBUlRfREVGCQkyCisjZGVmaW5lCQlNVDlWMDMyX0NPTFVNTl9TVEFSVF9ERUYJCTEKICNkZWZpbmUJCU1UOVYwMzJfQ09MVU1OX1NUQVJUX01BWAkJNzUyCisjZGVmaW5lIE1UOVYwMzJfUk9XX1NUQVJUCQkJCTB4MDIKKyNkZWZpbmUJCU1UOVYwMzJfUk9XX1NUQVJUX01JTgkJCTQKKyNkZWZpbmUJCU1UOVYwMzJfUk9XX1NUQVJUX0RFRgkJCTUKKyNkZWZpbmUJCU1UOVYwMzJfUk9XX1NUQVJUX01BWAkJCTQ4MgogI2RlZmluZSBNVDlWMDMyX1dJTkRPV19IRUlHSFQJCQkJMHgwMwogI2RlZmluZQkJTVQ5VjAzMl9XSU5ET1dfSEVJR0hUX01JTgkJMQogI2RlZmluZQkJTVQ5VjAzMl9XSU5ET1dfSEVJR0hUX0RFRgkJNDgwCkBAIC00MjAsMTMgKzQyMCwxMyBAQAogCXN0cnVjdCB2NGwyX3JlY3QgKl9fY3JvcDsKIAlzdHJ1Y3QgdjRsMl9yZWN0IHJlY3Q7CiAKLQkvKiBDbGFtcCB0aGUgY3JvcCByZWN0YW5nbGUgYm91bmRhcmllcyBhbmQgYWxpZ24gdGhlbSB0byBhIG11bHRpcGxlIG9mIDIKLQkgKiBwaXhlbHMuCisJLyogQ2xhbXAgdGhlIGNyb3AgcmVjdGFuZ2xlIGJvdW5kYXJpZXMgYW5kIGFsaWduIHRoZW0gdG8gYSBub24gbXVsdGlwbGUKKwkgKiBvZiAyIHBpeGVscyB0byBlbnN1cmUgYSBHUkJHIEJheWVyIHBhdHRlcm4uCiAJICovCi0JcmVjdC5sZWZ0ID0gY2xhbXAoQUxJR04oY3JvcC0+cmVjdC5sZWZ0LCAyKSwKKwlyZWN0LmxlZnQgPSBjbGFtcChBTElHTihjcm9wLT5yZWN0LmxlZnQgKyAxLCAyKSAtIDEsCiAJCQkgIE1UOVYwMzJfQ09MVU1OX1NUQVJUX01JTiwKIAkJCSAgTVQ5VjAzMl9DT0xVTU5fU1RBUlRfTUFYKTsKLQlyZWN0LnRvcCA9IGNsYW1wKEFMSUdOKGNyb3AtPnJlY3QudG9wLCAyKSwKKwlyZWN0LnRvcCA9IGNsYW1wKEFMSUdOKGNyb3AtPnJlY3QudG9wICsgMSwgMikgLSAxLAogCQkJIE1UOVYwMzJfUk9XX1NUQVJUX01JTiwKIAkJCSBNVDlWMDMyX1JPV19TVEFSVF9NQVgpOwogCXJlY3Qud2lkdGggPSBjbGFtcChBTElHTihjcm9wLT5yZWN0LndpZHRoLCAyKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgxX2NhbWVyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9teDFfY2FtZXJhLmMKaW5kZXggNjNmOGEwYy4uMDg3ZGIxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9teDFfY2FtZXJhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9teDFfY2FtZXJhLmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgpAQCAtNzMsNyArNzIsNyBAQAogI2RlZmluZSBDU0lTUl9TT0ZfSU5UCQkoMSA8PCAxNikKICNkZWZpbmUgQ1NJU1JfRFJEWQkJKDEgPDwgMCkKIAotI2RlZmluZSBWRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oMCwgMCwgMSkKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMC4yIgogI2RlZmluZSBEUklWRVJfTkFNRSAibXgxLWNhbWVyYSIKIAogI2RlZmluZSBDU0lfSVJRX01BU0sJKENTSVNSX1NGRl9PUl9JTlQgfCBDU0lTUl9SRkZfT1JfSU5UIHwgXApAQCAtMTQyLDcgKzE0MSw3IEBACiAJaWYgKCpzaXplICogKmNvdW50ID4gTUFYX1ZJREVPX01FTSAqIDEwMjQgKiAxMDI0KQogCQkqY291bnQgPSAoTUFYX1ZJREVPX01FTSAqIDEwMjQgKiAxMDI0KSAvICpzaXplOwogCi0JZGV2X2RiZyhpY2QtPmRldi5wYXJlbnQsICJjb3VudD0lZCwgc2l6ZT0lZFxuIiwgKmNvdW50LCAqc2l6ZSk7CisJZGV2X2RiZyhpY2QtPnBhcmVudCwgImNvdW50PSVkLCBzaXplPSVkXG4iLCAqY291bnQsICpzaXplKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTU0LDcgKzE1Myw3IEBACiAKIAlCVUdfT04oaW5faW50ZXJydXB0KCkpOwogCi0JZGV2X2RiZyhpY2QtPmRldi5wYXJlbnQsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKIAkJdmIsIHZiLT5iYWRkciwgdmItPmJzaXplKTsKIAogCS8qCkBAIC0xNzksNyArMTc4LDcgQEAKIAlpZiAoYnl0ZXNfcGVyX2xpbmUgPCAwKQogCQlyZXR1cm4gYnl0ZXNfcGVyX2xpbmU7CiAKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiJXMgKHZiPTB4JXApIDB4JTA4bHggJWRcbiIsIF9fZnVuY19fLAogCQl2YiwgdmItPmJhZGRyLCB2Yi0+YnNpemUpOwogCiAJLyogQWRkZWQgbGlzdCBoZWFkIGluaXRpYWxpemF0aW9uIG9uIGFsbG9jICovCkBAIC0yMzIsNyArMjMxLDcgQEAKIHN0YXRpYyBpbnQgbXgxX2NhbWVyYV9zZXR1cF9kbWEoc3RydWN0IG14MV9jYW1lcmFfZGV2ICpwY2RldikKIHsKIAlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YnVmID0gJnBjZGV2LT5hY3RpdmUtPnZiOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBjZGV2LT5pY2QtPmRldi5wYXJlbnQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcGNkZXYtPmljZC0+cGFyZW50OwogCWludCByZXQ7CiAKIAlpZiAodW5saWtlbHkoIXBjZGV2LT5hY3RpdmUpKSB7CkBAIC0yNTYsMTEgKzI1NSwxMSBAQAogCQkJCQkJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSB2cS0+cHJpdl9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14MV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAlzdHJ1Y3QgbXgxX2J1ZmZlciAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgbXgxX2J1ZmZlciwgdmIpOwogCi0JZGV2X2RiZyhpY2QtPmRldi5wYXJlbnQsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKIAkJdmIsIHZiLT5iYWRkciwgdmItPmJzaXplKTsKIAogCWxpc3RfYWRkX3RhaWwoJnZiLT5xdWV1ZSwgJnBjZGV2LT5jYXB0dXJlKTsKQEAgLTI4Nyw3ICsyODYsNyBAQAogCXN0cnVjdCBteDFfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBteDFfYnVmZmVyLCB2Yik7CiAjaWZkZWYgREVCVUcKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHZxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5kZXYucGFyZW50OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+cGFyZW50OwogCiAJZGV2X2RiZyhkZXYsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCiAJCXZiLCB2Yi0+YmFkZHIsIHZiLT5ic2l6ZSk7CkBAIC0zNDMsNyArMzQyLDcgQEAKIHN0YXRpYyB2b2lkIG14MV9jYW1lcmFfZG1hX2lycShpbnQgY2hhbm5lbCwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgbXgxX2NhbWVyYV9kZXYgKnBjZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwY2Rldi0+aWNkLT5kZXYucGFyZW50OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBjZGV2LT5pY2QtPnBhcmVudDsKIAlzdHJ1Y3QgbXgxX2J1ZmZlciAqYnVmOwogCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0zNzgsMTAgKzM3NywxMCBAQAogc3RhdGljIHZvaWQgbXgxX2NhbWVyYV9pbml0X3ZpZGVvYnVmKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwKIAkJCQkgICAgIHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14MV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAotCXZpZGVvYnVmX3F1ZXVlX2RtYV9jb250aWdfaW5pdChxLCAmbXgxX3ZpZGVvYnVmX29wcywgaWNkLT5kZXYucGFyZW50LAorCXZpZGVvYnVmX3F1ZXVlX2RtYV9jb250aWdfaW5pdChxLCAmbXgxX3ZpZGVvYnVmX29wcywgaWNkLT5wYXJlbnQsCiAJCQkJJnBjZGV2LT5sb2NrLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCiAJCQkJVjRMMl9GSUVMRF9OT05FLAogCQkJCXNpemVvZihzdHJ1Y3QgbXgxX2J1ZmZlciksIGljZCwgJmljZC0+dmlkZW9fbG9jayk7CkBAIC00MDEsNyArNDAwLDcgQEAKIAkgKi8KIAlkaXYgPSAobGNkY2xrICsgMiAqIG1jbGsgLSAxKSAvICgyICogbWNsaykgLSAxOwogCi0JZGV2X2RiZyhwY2Rldi0+aWNkLT5kZXYucGFyZW50LAorCWRldl9kYmcocGNkZXYtPmljZC0+cGFyZW50LAogCQkiU3lzdGVtIGNsb2NrICVsdWtIeiwgdGFyZ2V0IGZyZXEgJWRrSHosIGRpdmlzb3IgJWx1XG4iLAogCQlsY2RjbGsgLyAxMDAwLCBtY2xrIC8gMTAwMCwgZGl2KTsKIApAQCAtNDEyLDcgKzQxMSw3IEBACiB7CiAJdW5zaWduZWQgaW50IGNzaWNyMSA9IENTSUNSMV9FTjsKIAotCWRldl9kYmcocGNkZXYtPmljZC0+ZGV2LnBhcmVudCwgIkFjdGl2YXRlIGRldmljZVxuIik7CisJZGV2X2RiZyhwY2Rldi0+aWNkLT5wYXJlbnQsICJBY3RpdmF0ZSBkZXZpY2VcbiIpOwogCiAJY2xrX2VuYWJsZShwY2Rldi0+Y2xrKTsKIApAQCAtNDI4LDcgKzQyNyw3IEBACiAKIHN0YXRpYyB2b2lkIG14MV9jYW1lcmFfZGVhY3RpdmF0ZShzdHJ1Y3QgbXgxX2NhbWVyYV9kZXYgKnBjZGV2KQogewotCWRldl9kYmcocGNkZXYtPmljZC0+ZGV2LnBhcmVudCwgIkRlYWN0aXZhdGUgZGV2aWNlXG4iKTsKKwlkZXZfZGJnKHBjZGV2LT5pY2QtPnBhcmVudCwgIkRlYWN0aXZhdGUgZGV2aWNlXG4iKTsKIAogCS8qIERpc2FibGUgYWxsIENTSSBpbnRlcmZhY2UgKi8KIAlfX3Jhd193cml0ZWwoMHgwMCwgcGNkZXYtPmJhc2UgKyBDU0lDUjEpOwpAQCAtNDQyLDEzICs0NDEsMTMgQEAKICAqLwogc3RhdGljIGludCBteDFfY2FtZXJhX2FkZF9kZXZpY2Uoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgxX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCiAJaWYgKHBjZGV2LT5pY2QpCiAJCXJldHVybiAtRUJVU1k7CiAKLQlkZXZfaW5mbyhpY2QtPmRldi5wYXJlbnQsICJNWDEgQ2FtZXJhIGRyaXZlciBhdHRhY2hlZCB0byBjYW1lcmEgJWRcbiIsCisJZGV2X2luZm8oaWNkLT5wYXJlbnQsICJNWDEgQ2FtZXJhIGRyaXZlciBhdHRhY2hlZCB0byBjYW1lcmEgJWRcbiIsCiAJCSBpY2QtPmRldm51bSk7CiAKIAlteDFfY2FtZXJhX2FjdGl2YXRlKHBjZGV2KTsKQEAgLTQ2MCw3ICs0NTksNyBAQAogCiBzdGF0aWMgdm9pZCBteDFfY2FtZXJhX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgxX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCXVuc2lnbmVkIGludCBjc2ljcjE7CiAKQEAgLTQ3Myw3ICs0NzIsNyBAQAogCS8qIFN0b3AgRE1BIGVuZ2luZSAqLwogCWlteF9kbWFfZGlzYWJsZShwY2Rldi0+ZG1hX2NoYW4pOwogCi0JZGV2X2luZm8oaWNkLT5kZXYucGFyZW50LCAiTVgxIENhbWVyYSBkcml2ZXIgZGV0YWNoZWQgZnJvbSBjYW1lcmEgJWRcbiIsCisJZGV2X2luZm8oaWNkLT5wYXJlbnQsICJNWDEgQ2FtZXJhIGRyaXZlciBkZXRhY2hlZCBmcm9tIGNhbWVyYSAlZFxuIiwKIAkJIGljZC0+ZGV2bnVtKTsKIAogCW14MV9jYW1lcmFfZGVhY3RpdmF0ZShwY2Rldik7CkBAIC00OTEsNyArNDkwLDcgQEAKIAogc3RhdGljIGludCBteDFfY2FtZXJhX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIF9fdTMyIHBpeGZtdCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDFfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJdW5zaWduZWQgbG9uZyBjYW1lcmFfZmxhZ3MsIGNvbW1vbl9mbGFnczsKIAl1bnNpZ25lZCBpbnQgY3NpY3IxOwpAQCAtNTYyLDE0ICs1NjEsMTQgQEAKIAogCXhsYXRlID0gc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoaWNkLCBwaXgtPnBpeGVsZm9ybWF0KTsKIAlpZiAoIXhsYXRlKSB7Ci0JCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwgIkZvcm1hdCAleCBub3QgZm91bmRcbiIsCisJCWRldl93YXJuKGljZC0+cGFyZW50LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwKIAkJCSBwaXgtPnBpeGVsZm9ybWF0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJYnVzd2lkdGggPSB4bGF0ZS0+aG9zdF9mbXQtPmJpdHNfcGVyX3NhbXBsZTsKIAlpZiAoYnVzd2lkdGggPiA4KSB7Ci0JCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwKKwkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsCiAJCQkgImJpdHMtcGVyLXNhbXBsZSAlZCBmb3IgZm9ybWF0ICV4IHVuc3VwcG9ydGVkXG4iLAogCQkJIGJ1c3dpZHRoLCBwaXgtPnBpeGVsZm9ybWF0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC02MDksNyArNjA4LDcgQEAKIAogCXhsYXRlID0gc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoaWNkLCBwaXgtPnBpeGVsZm9ybWF0KTsKIAlpZiAoIXhsYXRlKSB7Ci0JCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwgIkZvcm1hdCAleCBub3QgZm91bmRcbiIsCisJCWRldl93YXJuKGljZC0+cGFyZW50LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwKIAkJCSBwaXgtPnBpeGVsZm9ybWF0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNjc2LDcgKzY3NSw2IEBACiB7CiAJLyogY2FwLT5uYW1lIGlzIHNldCBieSB0aGUgZnJpZW5kbHkgY2FsbGVyOi0+ICovCiAJc3RybGNweShjYXAtPmNhcmQsICJpLk1YMS9pLk1YTCBDYW1lcmEiLCBzaXplb2YoY2FwLT5jYXJkKSk7Ci0JY2FwLT52ZXJzaW9uID0gVkVSU0lPTl9DT0RFOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKIAogCXJldHVybiAwOwpAQCAtODgzLDQgKzg4MSw1IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oImkuTVgxL2kuTVhMIFNvQyBDYW1lcmEgSG9zdCBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIlBhdWxpdXMgWmFsZWNrYXMgPHBhdWxpdXMuemFsZWNrYXNAdGVsdG9uaWthLmx0PiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX1ZFUlNJT04oRFJJVkVSX1ZFUlNJT04pOwogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIERSSVZFUl9OQU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgyX2NhbWVyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9teDJfY2FtZXJhLmMKaW5kZXggNGVhYjFjNi4uZWMyNDEwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9teDJfY2FtZXJhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9teDJfY2FtZXJhLmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgpAQCAtNDcsNyArNDYsNyBAQAogI2luY2x1ZGUgPGFzbS9kbWEuaD4KIAogI2RlZmluZSBNWDJfQ0FNX0RSVl9OQU1FICJteDItY2FtZXJhIgotI2RlZmluZSBNWDJfQ0FNX1ZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTigwLCAwLCA1KQorI2RlZmluZSBNWDJfQ0FNX1ZFUlNJT04gIjAuMC42IgogI2RlZmluZSBNWDJfQ0FNX0RSSVZFUl9ERVNDUklQVElPTiAiaS5NWDJ4X0NhbWVyYSIKIAogLyogcmVzZXQgdmFsdWVzICovCkBAIC0yNzgsNyArMjc3LDcgQEAKICAqLwogc3RhdGljIGludCBteDJfY2FtZXJhX2FkZF9kZXZpY2Uoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgyX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCWludCByZXQ7CiAJdTMyIGNzaWNyMTsKQEAgLTMwMyw3ICszMDIsNyBAQAogCiAJcGNkZXYtPmljZCA9IGljZDsKIAotCWRldl9pbmZvKGljZC0+ZGV2LnBhcmVudCwgIkNhbWVyYSBkcml2ZXIgYXR0YWNoZWQgdG8gY2FtZXJhICVkXG4iLAorCWRldl9pbmZvKGljZC0+cGFyZW50LCAiQ2FtZXJhIGRyaXZlciBhdHRhY2hlZCB0byBjYW1lcmEgJWRcbiIsCiAJCSBpY2QtPmRldm51bSk7CiAKIAlyZXR1cm4gMDsKQEAgLTMxMSwxMiArMzEwLDEyIEBACiAKIHN0YXRpYyB2b2lkIG14Ml9jYW1lcmFfcmVtb3ZlX2RldmljZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDJfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAKIAlCVUdfT04oaWNkICE9IHBjZGV2LT5pY2QpOwogCi0JZGV2X2luZm8oaWNkLT5kZXYucGFyZW50LCAiQ2FtZXJhIGRyaXZlciBkZXRhY2hlZCBmcm9tIGNhbWVyYSAlZFxuIiwKKwlkZXZfaW5mbyhpY2QtPnBhcmVudCwgIkNhbWVyYSBkcml2ZXIgZGV0YWNoZWQgZnJvbSBjYW1lcmEgJWRcbiIsCiAJCSBpY2QtPmRldm51bSk7CiAKIAlteDJfY2FtZXJhX2RlYWN0aXZhdGUocGNkZXYpOwpAQCAtNDM3LDcgKzQzNiw3IEBACiAJaW50IGJ5dGVzX3Blcl9saW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUoaWNkLT51c2VyX3dpZHRoLAogCQkJaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQpOwogCi0JZGV2X2RiZygmaWNkLT5kZXYsICJjb3VudD0lZCwgc2l6ZT0lZFxuIiwgKmNvdW50LCAqc2l6ZSk7CisJZGV2X2RiZyhpY2QtPnBhcmVudCwgImNvdW50PSVkLCBzaXplPSVkXG4iLCAqY291bnQsICpzaXplKTsKIAogCWlmIChieXRlc19wZXJfbGluZSA8IDApCiAJCXJldHVybiBieXRlc19wZXJfbGluZTsKQEAgLTQ1Nyw3ICs0NTYsNyBAQAogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdnEtPnByaXZfZGF0YTsKIAlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiA9ICZidWYtPnZiOwogCi0JZGV2X2RiZygmaWNkLT5kZXYsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKIAkJdmIsIHZiLT5iYWRkciwgdmItPmJzaXplKTsKIAogCS8qCkBAIC00NjcsNyArNDY2LDcgQEAKIAl2aWRlb2J1Zl93YWl0b24odnEsIHZiLCAwLCAwKTsKIAogCXZpZGVvYnVmX2RtYV9jb250aWdfZnJlZSh2cSwgdmIpOwotCWRldl9kYmcoJmljZC0+ZGV2LCAiJXMgZnJlZWRcbiIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiJXMgZnJlZWRcbiIsIF9fZnVuY19fKTsKIAogCXZiLT5zdGF0ZSA9IFZJREVPQlVGX05FRURTX0lOSVQ7CiB9CkBAIC00ODEsNyArNDgwLDcgQEAKIAkJCWljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10KTsKIAlpbnQgcmV0ID0gMDsKIAotCWRldl9kYmcoJmljZC0+ZGV2LCAiJXMgKHZiPTB4JXApIDB4JTA4bHggJWRcbiIsIF9fZnVuY19fLAorCWRldl9kYmcoaWNkLT5wYXJlbnQsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCiAJCXZiLCB2Yi0+YmFkZHIsIHZiLT5ic2l6ZSk7CiAKIAlpZiAoYnl0ZXNfcGVyX2xpbmUgPCAwKQpAQCAtNTMzLDEyICs1MzIsMTIgQEAKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHZxLT5wcml2X2RhdGE7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0KLQkJdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJCXRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14Ml9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAlzdHJ1Y3QgbXgyX2J1ZmZlciAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgbXgyX2J1ZmZlciwgdmIpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkZXZfZGJnKCZpY2QtPmRldiwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiJXMgKHZiPTB4JXApIDB4JTA4bHggJWRcbiIsIF9fZnVuY19fLAogCQl2YiwgdmItPmJhZGRyLCB2Yi0+YnNpemUpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjZGV2LT5sb2NrLCBmbGFncyk7CkBAIC02MTEsMjcgKzYxMCwyNyBAQAogCQkJCSBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHZxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgyX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCXN0cnVjdCBteDJfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBteDJfYnVmZmVyLCB2Yik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogI2lmZGVmIERFQlVHCi0JZGV2X2RiZygmaWNkLT5kZXYsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKIAkJdmIsIHZiLT5iYWRkciwgdmItPmJzaXplKTsKIAogCXN3aXRjaCAodmItPnN0YXRlKSB7CiAJY2FzZSBWSURFT0JVRl9BQ1RJVkU6Ci0JCWRldl9pbmZvKCZpY2QtPmRldiwgIiVzIChhY3RpdmUpXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9pbmZvKGljZC0+cGFyZW50LCAiJXMgKGFjdGl2ZSlcbiIsIF9fZnVuY19fKTsKIAkJYnJlYWs7CiAJY2FzZSBWSURFT0JVRl9RVUVVRUQ6Ci0JCWRldl9pbmZvKCZpY2QtPmRldiwgIiVzIChxdWV1ZWQpXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9pbmZvKGljZC0+cGFyZW50LCAiJXMgKHF1ZXVlZClcbiIsIF9fZnVuY19fKTsKIAkJYnJlYWs7CiAJY2FzZSBWSURFT0JVRl9QUkVQQVJFRDoKLQkJZGV2X2luZm8oJmljZC0+ZGV2LCAiJXMgKHByZXBhcmVkKVxuIiwgX19mdW5jX18pOworCQlkZXZfaW5mbyhpY2QtPnBhcmVudCwgIiVzIChwcmVwYXJlZClcbiIsIF9fZnVuY19fKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2luZm8oJmljZC0+ZGV2LCAiJXMgKHVua25vd24pICVkXG4iLCBfX2Z1bmNfXywKKwkJZGV2X2luZm8oaWNkLT5wYXJlbnQsICIlcyAodW5rbm93bikgJWRcbiIsIF9fZnVuY19fLAogCQkJCXZiLT5zdGF0ZSk7CiAJCWJyZWFrOwogCX0KQEAgLTY3OCw3ICs2NzcsNyBAQAogc3RhdGljIHZvaWQgbXgyX2NhbWVyYV9pbml0X3ZpZGVvYnVmKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwKIAkJCSAgICAgIHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14Ml9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAogCXZpZGVvYnVmX3F1ZXVlX2RtYV9jb250aWdfaW5pdChxLCAmbXgyX3ZpZGVvYnVmX29wcywgcGNkZXYtPmRldiwKQEAgLTcxOSw3ICs3MTgsNyBAQAogCQlpbnQgYnl0ZXNwZXJsaW5lKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9Ci0JCXRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCQl0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDJfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAKIAl3cml0ZWwocGNkZXYtPmRpc2NhcmRfYnVmZmVyX2RtYSwKQEAgLTc3Miw3ICs3NzEsNyBAQAogCQlfX3UzMiBwaXhmbXQpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0KLQkJdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJCXRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14Ml9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGNhbWVyYV9mbGFncywgY29tbW9uX2ZsYWdzOwogCWludCByZXQgPSAwOwpAQCAtODkxLDcgKzg5MCw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIlNlbnNvciBjcm9wcGVkICVkeCVkXG4iLAorCWRldl9kYmcoaWNkLT5wYXJlbnQsICJTZW5zb3IgY3JvcHBlZCAlZHglZFxuIiwKIAkJbWYud2lkdGgsIG1mLmhlaWdodCk7CiAKIAlpY2QtPnVzZXJfd2lkdGgJCT0gbWYud2lkdGg7CkBAIC05MTEsNyArOTEwLDcgQEAKIAogCXhsYXRlID0gc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoaWNkLCBwaXgtPnBpeGVsZm9ybWF0KTsKIAlpZiAoIXhsYXRlKSB7Ci0JCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwgIkZvcm1hdCAleCBub3QgZm91bmRcbiIsCisJCWRldl93YXJuKGljZC0+cGFyZW50LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwKIAkJCQlwaXgtPnBpeGVsZm9ybWF0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtOTUxLDcgKzk1MCw3IEBACiAKIAl4bGF0ZSA9IHNvY19jYW1lcmFfeGxhdGVfYnlfZm91cmNjKGljZCwgcGl4Zm10KTsKIAlpZiAocGl4Zm10ICYmICF4bGF0ZSkgewotCQlkZXZfd2FybihpY2QtPmRldi5wYXJlbnQsICJGb3JtYXQgJXggbm90IGZvdW5kXG4iLCBwaXhmbXQpOworCQlkZXZfd2FybihpY2QtPnBhcmVudCwgIkZvcm1hdCAleCBub3QgZm91bmRcbiIsIHBpeGZtdCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtOTc0LDExICs5NzMsMTYgQEAKIAkJaWYgKHBpeC0+Ynl0ZXNwZXJsaW5lIDwgMCkKIAkJCXJldHVybiBwaXgtPmJ5dGVzcGVybGluZTsKIAkJcGl4LT5zaXplaW1hZ2UgPSBwaXgtPmhlaWdodCAqIHBpeC0+Ynl0ZXNwZXJsaW5lOwotCQlpZiAocGl4LT5zaXplaW1hZ2UgPiAoNCAqIDB4M2ZmZmYpKSB7IC8qIENTSVJYQ05UIGxpbWl0ICovCi0JCQlkZXZfd2FybihpY2QtPmRldi5wYXJlbnQsCi0JCQkJCSJJbWFnZSBzaXplICgldSkgYWJvdmUgbGltaXRcbiIsCi0JCQkJCXBpeC0+c2l6ZWltYWdlKTsKLQkJCXJldHVybiAtRUlOVkFMOworCQkvKiBDaGVjayBhZ2FpbnN0IHRoZSBDU0lSWENOVCBsaW1pdCAqLworCQlpZiAocGl4LT5zaXplaW1hZ2UgPiA0ICogMHgzZmZmZikgeworCQkJLyogQWRqdXN0IGdlb21ldHJ5LCBwcmVzZXJ2ZSBhc3BlY3QgcmF0aW8gKi8KKwkJCXVuc2lnbmVkIGludCBuZXdfaGVpZ2h0ID0gaW50X3NxcnQoNCAqIDB4M2ZmZmYgKgorCQkJCQlwaXgtPmhlaWdodCAvIHBpeC0+Ynl0ZXNwZXJsaW5lKTsKKwkJCXBpeC0+d2lkdGggPSBuZXdfaGVpZ2h0ICogcGl4LT53aWR0aCAvIHBpeC0+aGVpZ2h0OworCQkJcGl4LT5oZWlnaHQgPSBuZXdfaGVpZ2h0OworCQkJcGl4LT5ieXRlc3BlcmxpbmUgPSBzb2NfbWJ1c19ieXRlc19wZXJfbGluZShwaXgtPndpZHRoLAorCQkJCQkJCXhsYXRlLT5ob3N0X2ZtdCk7CisJCQlCVUdfT04ocGl4LT5ieXRlc3BlcmxpbmUgPCAwKTsKIAkJfQogCX0KIApAQCAtOTk2LDcgKzEwMDAsNyBAQAogCWlmIChtZi5maWVsZCA9PSBWNEwyX0ZJRUxEX0FOWSkKIAkJbWYuZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CiAJaWYgKG1mLmZpZWxkICE9IFY0TDJfRklFTERfTk9ORSkgewotCQlkZXZfZXJyKGljZC0+ZGV2LnBhcmVudCwgIkZpZWxkIHR5cGUgJWQgdW5zdXBwb3J0ZWQuXG4iLAorCQlkZXZfZXJyKGljZC0+cGFyZW50LCAiRmllbGQgdHlwZSAlZCB1bnN1cHBvcnRlZC5cbiIsCiAJCQkJbWYuZmllbGQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMDE0LDcgKzEwMTgsNiBAQAogewogCS8qIGNhcC0+bmFtZSBpcyBzZXQgYnkgdGhlIGZyaWVuZGx5IGNhbGxlcjotPiAqLwogCXN0cmxjcHkoY2FwLT5jYXJkLCBNWDJfQ0FNX0RSSVZFUl9ERVNDUklQVElPTiwgc2l6ZW9mKGNhcC0+Y2FyZCkpOwotCWNhcC0+dmVyc2lvbiA9IE1YMl9DQU1fVkVSU0lPTl9DT0RFOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKIAogCXJldHVybiAwOwpAQCAtMTUyMywzICsxNTI2LDQgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiaS5NWDI3L2kuTVgyNSBTb0MgQ2FtZXJhIEhvc3QgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJTYXNjaGEgSGF1ZXIgPHNoYUBwZW5ndXRyb25peC5kZT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKE1YMl9DQU1fVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL214M19jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgzX2NhbWVyYS5jCmluZGV4IGM3NjgwZWIuLmMwNDViNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgzX2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgzX2NhbWVyYS5jCkBAIC0xMSw3ICsxMSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgpAQCAtMTk1LDcgKzE5NCw3IEBACiAJCQl1bnNpZ25lZCBsb25nIHNpemVzW10sIHZvaWQgKmFsbG9jX2N0eHNbXSkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHNvY19jYW1lcmFfZnJvbV92YjJxKHZxKTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDNfY2FtZXJhX2RldiAqbXgzX2NhbSA9IGljaS0+cHJpdjsKIAlpbnQgYnl0ZXNfcGVyX2xpbmUgPSBzb2NfbWJ1c19ieXRlc19wZXJfbGluZShpY2QtPnVzZXJfd2lkdGgsCiAJCQkJCQlpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdCk7CkBAIC0yMjQsNyArMjIzLDcgQEAKIHN0YXRpYyBpbnQgbXgzX3ZpZGVvYnVmX3ByZXBhcmUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gc29jX2NhbWVyYV9mcm9tX3ZiMnEodmItPnZiMl9xdWV1ZSk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7CiAJc3RydWN0IGlkbWFjX2NoYW5uZWwgKmljaGFuID0gbXgzX2NhbS0+aWRtYWNfY2hhbm5lbFswXTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwpAQCAtMjQyLDcgKzI0MSw3IEBACiAJbmV3X3NpemUgPSBieXRlc19wZXJfbGluZSAqIGljZC0+dXNlcl9oZWlnaHQ7CiAKIAlpZiAodmIyX3BsYW5lX3NpemUodmIsIDApIDwgbmV3X3NpemUpIHsKLQkJZGV2X2VycihpY2QtPmRldi5wYXJlbnQsICJCdWZmZXIgdG9vIHNtYWxsICglbHUgPCAlenUpXG4iLAorCQlkZXZfZXJyKGljZC0+cGFyZW50LCAiQnVmZmVyIHRvbyBzbWFsbCAoJWx1IDwgJXp1KVxuIiwKIAkJCXZiMl9wbGFuZV9zaXplKHZiLCAwKSwgbmV3X3NpemUpOwogCQlyZXR1cm4gLUVOT0JVRlM7CiAJfQpAQCAtMjg0LDcgKzI4Myw3IEBACiBzdGF0aWMgdm9pZCBteDNfdmlkZW9idWZfcXVldWUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gc29jX2NhbWVyYV9mcm9tX3ZiMnEodmItPnZiMl9xdWV1ZSk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7CiAJc3RydWN0IG14M19jYW1lcmFfYnVmZmVyICpidWYgPSB0b19teDNfdmIodmIpOwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHhkID0gYnVmLT50eGQ7CkBAIC0zMzcsNyArMzM2LDcgQEAKIAlzcGluX3VubG9ja19pcnEoJm14M19jYW0tPmxvY2spOwogCiAJY29va2llID0gdHhkLT50eF9zdWJtaXQodHhkKTsKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIlN1Ym1pdHRlZCBjb29raWUgJWQgRE1BIDB4JTA4eFxuIiwKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiU3VibWl0dGVkIGNvb2tpZSAlZCBETUEgMHglMDh4XG4iLAogCQljb29raWUsIHNnX2RtYV9hZGRyZXNzKCZidWYtPnNnKSk7CiAKIAlpZiAoY29va2llID49IDApCkBAIC0zNTgsMTMgKzM1NywxMyBAQAogc3RhdGljIHZvaWQgbXgzX3ZpZGVvYnVmX3JlbGVhc2Uoc3RydWN0IHZiMl9idWZmZXIgKnZiKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gc29jX2NhbWVyYV9mcm9tX3ZiMnEodmItPnZiMl9xdWV1ZSk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7CiAJc3RydWN0IG14M19jYW1lcmFfYnVmZmVyICpidWYgPSB0b19teDNfdmIodmIpOwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHhkID0gYnVmLT50eGQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRldl9kYmcoaWNkLT5kZXYucGFyZW50LAorCWRldl9kYmcoaWNkLT5wYXJlbnQsCiAJCSJSZWxlYXNlJXMgRE1BIDB4JTA4eCwgcXVldWUgJXNlbXB0eVxuIiwKIAkJbXgzX2NhbS0+YWN0aXZlID09IGJ1ZiA/ICIgYWN0aXZlIiA6ICIiLCBzZ19kbWFfYWRkcmVzcygmYnVmLT5zZyksCiAJCWxpc3RfZW1wdHkoJmJ1Zi0+cXVldWUpID8gIiIgOiAibm90ICIpOwpAQCAtNDAzLDcgKzQwMiw3IEBACiBzdGF0aWMgaW50IG14M19zdG9wX3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICpxKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gc29jX2NhbWVyYV9mcm9tX3ZiMnEocSk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7CiAJc3RydWN0IGlkbWFjX2NoYW5uZWwgKmljaGFuID0gbXgzX2NhbS0+aWRtYWNfY2hhbm5lbFswXTsKIAlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47CkBAIC00OTksNyArNDk4LDcgQEAKIAogCWNsa19lbmFibGUobXgzX2NhbS0+Y2xrKTsKIAlyYXRlID0gY2xrX3JvdW5kX3JhdGUobXgzX2NhbS0+Y2xrLCBteDNfY2FtLT5tY2xrKTsKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIlNldCBTRU5TX0NPTkYgdG8gJXgsIHJhdGUgJWxkXG4iLCBjb25mLCByYXRlKTsKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiU2V0IFNFTlNfQ09ORiB0byAleCwgcmF0ZSAlbGRcbiIsIGNvbmYsIHJhdGUpOwogCWlmIChyYXRlKQogCQljbGtfc2V0X3JhdGUobXgzX2NhbS0+Y2xrLCByYXRlKTsKIH0KQEAgLTUwNyw3ICs1MDYsNyBAQAogLyogQ2FsbGVkIHdpdGggLnZpZGVvX2xvY2sgaGVsZCAqLwogc3RhdGljIGludCBteDNfY2FtZXJhX2FkZF9kZXZpY2Uoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7CiAKIAlpZiAobXgzX2NhbS0+aWNkKQpAQCAtNTE3LDcgKzUxNiw3IEBACiAKIAlteDNfY2FtLT5pY2QgPSBpY2Q7CiAKLQlkZXZfaW5mbyhpY2QtPmRldi5wYXJlbnQsICJNWDMgQ2FtZXJhIGRyaXZlciBhdHRhY2hlZCB0byBjYW1lcmEgJWRcbiIsCisJZGV2X2luZm8oaWNkLT5wYXJlbnQsICJNWDMgQ2FtZXJhIGRyaXZlciBhdHRhY2hlZCB0byBjYW1lcmEgJWRcbiIsCiAJCSBpY2QtPmRldm51bSk7CiAKIAlyZXR1cm4gMDsKQEAgLTUyNiw3ICs1MjUsNyBAQAogLyogQ2FsbGVkIHdpdGggLnZpZGVvX2xvY2sgaGVsZCAqLwogc3RhdGljIHZvaWQgbXgzX2NhbWVyYV9yZW1vdmVfZGV2aWNlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14M19jYW1lcmFfZGV2ICpteDNfY2FtID0gaWNpLT5wcml2OwogCXN0cnVjdCBpZG1hY19jaGFubmVsICoqaWNoYW4gPSAmbXgzX2NhbS0+aWRtYWNfY2hhbm5lbFswXTsKIApAQCAtNTQxLDcgKzU0MCw3IEBACiAKIAlteDNfY2FtLT5pY2QgPSBOVUxMOwogCi0JZGV2X2luZm8oaWNkLT5kZXYucGFyZW50LCAiTVgzIENhbWVyYSBkcml2ZXIgZGV0YWNoZWQgZnJvbSBjYW1lcmEgJWRcbiIsCisJZGV2X2luZm8oaWNkLT5wYXJlbnQsICJNWDMgQ2FtZXJhIGRyaXZlciBkZXRhY2hlZCBmcm9tIGNhbWVyYSAlZFxuIiwKIAkJIGljZC0+ZGV2bnVtKTsKIH0KIApAQCAtNjA4LDEyICs2MDcsMTIgQEAKIHN0YXRpYyBpbnQgbXgzX2NhbWVyYV90cnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQkJCSAgICBjb25zdCB1bnNpZ25lZCBpbnQgZGVwdGgpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7CiAJdW5zaWduZWQgbG9uZyBidXNfZmxhZ3MsIGNhbWVyYV9mbGFnczsKIAlpbnQgcmV0ID0gdGVzdF9wbGF0Zm9ybV9wYXJhbShteDNfY2FtLCBkZXB0aCwgJmJ1c19mbGFncyk7CiAKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgInJlcXVlc3QgYnVzIHdpZHRoICVkIGJpdDogJWRcbiIsIGRlcHRoLCByZXQpOworCWRldl9kYmcoaWNkLT5wYXJlbnQsICJyZXF1ZXN0IGJ1cyB3aWR0aCAlZCBiaXQ6ICVkXG4iLCBkZXB0aCwgcmV0KTsKIAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtNjIyLDcgKzYyMSw3IEBACiAKIAlyZXQgPSBzb2NfY2FtZXJhX2J1c19wYXJhbV9jb21wYXRpYmxlKGNhbWVyYV9mbGFncywgYnVzX2ZsYWdzKTsKIAlpZiAocmV0IDwgMCkKLQkJZGV2X3dhcm4oaWNkLT5kZXYucGFyZW50LAorCQlkZXZfd2FybihpY2QtPnBhcmVudCwKIAkJCSAiRmxhZ3MgaW5jb21wYXRpYmxlOiBjYW1lcmEgJWx4LCBob3N0ICVseFxuIiwKIAkJCSBjYW1lcmFfZmxhZ3MsIGJ1c19mbGFncyk7CiAKQEAgLTY3Niw3ICs2NzUsNyBAQAogCQkJCSAgc3RydWN0IHNvY19jYW1lcmFfZm9ybWF0X3hsYXRlICp4bGF0ZSkKIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPmRldi5wYXJlbnQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5wYXJlbnQ7CiAJaW50IGZvcm1hdHMgPSAwLCByZXQ7CiAJZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIGNvZGU7CiAJY29uc3Qgc3RydWN0IHNvY19tYnVzX3BpeGVsZm10ICpmbXQ7CkBAIC02ODgsNyArNjg3LDcgQEAKIAogCWZtdCA9IHNvY19tYnVzX2dldF9mbXRkZXNjKGNvZGUpOwogCWlmICghZm10KSB7Ci0JCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwKKwkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsCiAJCQkgIlVuc3VwcG9ydGVkIGZvcm1hdCBjb2RlICMldTogJWRcbiIsIGlkeCwgY29kZSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTgxNiw3ICs4MTUsNyBAQAogCQkJICAgICAgIHN0cnVjdCB2NGwyX2Nyb3AgKmEpCiB7CiAJc3RydWN0IHY0bDJfcmVjdCAqcmVjdCA9ICZhLT5jOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14M19jYW1lcmFfZGV2ICpteDNfY2FtID0gaWNpLT5wcml2OwogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwogCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgbWY7CkBAIC04NDksNyArODQ4LDcgQEAKIAkJY29uZmlndXJlX2dlb21ldHJ5KG14M19jYW0sIG1mLndpZHRoLCBtZi5oZWlnaHQsCiAJCQkJICAgaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQpOwogCi0JZGV2X2RiZyhpY2QtPmRldi5wYXJlbnQsICJTZW5zb3IgY3JvcHBlZCAlZHglZFxuIiwKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiU2Vuc29yIGNyb3BwZWQgJWR4JWRcbiIsCiAJCW1mLndpZHRoLCBtZi5oZWlnaHQpOwogCiAJaWNkLT51c2VyX3dpZHRoCQk9IG1mLndpZHRoOwpAQCAtODYxLDcgKzg2MCw3IEBACiBzdGF0aWMgaW50IG14M19jYW1lcmFfc2V0X2ZtdChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKIAkJCSAgICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDNfY2FtZXJhX2RldiAqbXgzX2NhbSA9IGljaS0+cHJpdjsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKIAljb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnhsYXRlOwpAQCAtODcxLDEzICs4NzAsMTMgQEAKIAogCXhsYXRlID0gc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoaWNkLCBwaXgtPnBpeGVsZm9ybWF0KTsKIAlpZiAoIXhsYXRlKSB7Ci0JCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwgIkZvcm1hdCAleCBub3QgZm91bmRcbiIsCisJCWRldl93YXJuKGljZC0+cGFyZW50LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwKIAkJCSBwaXgtPnBpeGVsZm9ybWF0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJc3RyaWRlX2FsaWduKCZwaXgtPndpZHRoKTsKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIlNldCBmb3JtYXQgJWR4JWRcbiIsIHBpeC0+d2lkdGgsIHBpeC0+aGVpZ2h0KTsKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiU2V0IGZvcm1hdCAlZHglZFxuIiwgcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQpOwogCiAJLyoKIAkgKiBNaWdodCBoYXZlIHRvIHBlcmZvcm0gYSBjb21wbGV0ZSBpbnRlcmZhY2UgaW5pdGlhbGlzYXRpb24gbGlrZSBpbgpAQCAtOTEzLDEzICs5MTIsNyBAQAogCXBpeC0+Y29sb3JzcGFjZQkJPSBtZi5jb2xvcnNwYWNlOwogCWljZC0+Y3VycmVudF9mbXQJPSB4bGF0ZTsKIAotCXBpeC0+Ynl0ZXNwZXJsaW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUocGl4LT53aWR0aCwKLQkJCQkJCSAgICB4bGF0ZS0+aG9zdF9mbXQpOwotCWlmIChwaXgtPmJ5dGVzcGVybGluZSA8IDApCi0JCXJldHVybiBwaXgtPmJ5dGVzcGVybGluZTsKLQlwaXgtPnNpemVpbWFnZSA9IHBpeC0+aGVpZ2h0ICogcGl4LT5ieXRlc3BlcmxpbmU7Ci0KLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIlNlbnNvciBzZXQgJWR4JWRcbiIsIHBpeC0+d2lkdGgsIHBpeC0+aGVpZ2h0KTsKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiU2Vuc29yIHNldCAlZHglZFxuIiwgcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTkzNiw3ICs5MjksNyBAQAogCiAJeGxhdGUgPSBzb2NfY2FtZXJhX3hsYXRlX2J5X2ZvdXJjYyhpY2QsIHBpeGZtdCk7CiAJaWYgKHBpeGZtdCAmJiAheGxhdGUpIHsKLQkJZGV2X3dhcm4oaWNkLT5kZXYucGFyZW50LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwgcGl4Zm10KTsKKwkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsICJGb3JtYXQgJXggbm90IGZvdW5kXG4iLCBwaXhmbXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTk0NiwxMiArOTM5LDYgQEAKIAlpZiAocGl4LT53aWR0aCA+IDQwOTYpCiAJCXBpeC0+d2lkdGggPSA0MDk2OwogCi0JcGl4LT5ieXRlc3BlcmxpbmUgPSBzb2NfbWJ1c19ieXRlc19wZXJfbGluZShwaXgtPndpZHRoLAotCQkJCQkJICAgIHhsYXRlLT5ob3N0X2ZtdCk7Ci0JaWYgKHBpeC0+Ynl0ZXNwZXJsaW5lIDwgMCkKLQkJcmV0dXJuIHBpeC0+Ynl0ZXNwZXJsaW5lOwotCXBpeC0+c2l6ZWltYWdlID0gcGl4LT5oZWlnaHQgKiBwaXgtPmJ5dGVzcGVybGluZTsKLQogCS8qIGxpbWl0IHRvIHNlbnNvciBjYXBhYmlsaXRpZXMgKi8KIAltZi53aWR0aAk9IHBpeC0+d2lkdGg7CiAJbWYuaGVpZ2h0CT0gcGl4LT5oZWlnaHQ7CkBAIC05NzQsNyArOTYxLDcgQEAKIAljYXNlIFY0TDJfRklFTERfTk9ORToKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycihpY2QtPmRldi5wYXJlbnQsICJGaWVsZCB0eXBlICVkIHVuc3VwcG9ydGVkLlxuIiwKKwkJZGV2X2VycihpY2QtPnBhcmVudCwgIkZpZWxkIHR5cGUgJWQgdW5zdXBwb3J0ZWQuXG4iLAogCQkJbWYuZmllbGQpOwogCQlyZXQgPSAtRUlOVkFMOwogCX0KQEAgLTEwMDAsNyArOTg3LDYgQEAKIHsKIAkvKiBjYXAtPm5hbWUgaXMgc2V0IGJ5IHRoZSBmaXJlbmRseSBjYWxsZXI6LT4gKi8KIAlzdHJsY3B5KGNhcC0+Y2FyZCwgImkuTVgzeCBDYW1lcmEiLCBzaXplb2YoY2FwLT5jYXJkKSk7Ci0JY2FwLT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oMCwgMiwgMik7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfU1RSRUFNSU5HOwogCiAJcmV0dXJuIDA7CkBAIC0xMDA4LDcgKzk5NCw3IEBACiAKIHN0YXRpYyBpbnQgbXgzX2NhbWVyYV9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCBfX3UzMiBwaXhmbXQpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7CiAJdW5zaWduZWQgbG9uZyBidXNfZmxhZ3MsIGNhbWVyYV9mbGFncywgY29tbW9uX2ZsYWdzOwogCXUzMiBkdywgc2Vuc19jb25mOwpAQCAtMTAxNiw3ICsxMDAyLDcgQEAKIAlpbnQgYnVzd2lkdGg7CiAJaW50IHJldDsKIAljb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnhsYXRlOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+ZGV2LnBhcmVudDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPnBhcmVudDsKIAogCWZtdCA9IHNvY19tYnVzX2dldF9mbXRkZXNjKGljZC0+Y3VycmVudF9mbXQtPmNvZGUpOwogCWlmICghZm10KQpAQCAtMTMyNSw0ICsxMzExLDUgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiaS5NWDN4IFNvQyBDYW1lcmEgSG9zdCBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkd1ZW5uYWRpIExpYWtob3ZldHNraSA8bGdAZGVueC5kZT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjIuMyIpOwogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIE1YM19DQU1fRFJWX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvS2NvbmZpZwppbmRleCBlNjMyMzNmZC4uMzkwYWIwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL0tjb25maWcKQEAgLTEsMTEgKzEsMTQgQEAKK2NvbmZpZyBWSURFT19PTUFQMl9WT1VUX1ZSRkIKKwlib29sCisKIGNvbmZpZyBWSURFT19PTUFQMl9WT1VUCiAJdHJpc3RhdGUgIk9NQVAyL09NQVAzIFY0TDItRGlzcGxheSBkcml2ZXIiCiAJZGVwZW5kcyBvbiBBUkNIX09NQVAyIHx8IEFSQ0hfT01BUDMKIAlzZWxlY3QgVklERU9CVUZfR0VOCiAJc2VsZWN0IFZJREVPQlVGX0RNQV9DT05USUcKIAlzZWxlY3QgT01BUDJfRFNTCi0Jc2VsZWN0IE9NQVAyX1ZSQU0KLQlzZWxlY3QgT01BUDJfVlJGQgorCXNlbGVjdCBPTUFQMl9WUkZCIGlmIEFSQ0hfT01BUDIgfHwgQVJDSF9PTUFQMworCXNlbGVjdCBWSURFT19PTUFQMl9WT1VUX1ZSRkIgaWYgVklERU9fT01BUDJfVk9VVCAmJiBPTUFQMl9WUkZCCiAJZGVmYXVsdCBuCiAJLS0taGVscC0tLQogCSAgVjRMMiBEaXNwbGF5IGRyaXZlciBzdXBwb3J0IGZvciBPTUFQMi8zIGJhc2VkIGJvYXJkcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9NYWtlZmlsZQppbmRleCBiMjg3ODgwLi5mYzQxMGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL01ha2VmaWxlCkBAIC00LDQgKzQsNSBAQAogCiAjIE9NQVAyLzMgRGlzcGxheSBkcml2ZXIKIG9tYXAtdm91dC15IDo9IG9tYXBfdm91dC5vIG9tYXBfdm91dGxpYi5vCitvbWFwLXZvdXQtJChDT05GSUdfVklERU9fT01BUDJfVk9VVF9WUkZCKSArPSBvbWFwX3ZvdXRfdnJmYi5vCiBvYmotJChDT05GSUdfVklERU9fT01BUDJfVk9VVCkgKz0gb21hcC12b3V0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXQuYwppbmRleCBhNjQ3ODk0Li5iNWVmMzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dC5jCkBAIC0zNSwyOCArMzUsMjYgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+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+dmRkc19jc2liID0gcmVndWxhdG9yX2dldChpc3AtPmRldiwgInZkZHNfY3NpYiIpOworCQlpZiAoSVNfRVJSKGNjcDItPnZkZHNfY3NpYikpIHsKKwkJCWRldl9kYmcoaXNwLT5kZXYsCisJCQkJIkNvdWxkIG5vdCBnZXQgcmVndWxhdG9yIHZkZHNfY3NpYlxuIik7CisJCQljY3AyLT52ZGRzX2NzaWIgPSBOVUxMOworCQl9CisJfSBlbHNlIGlmIChpc3AtPnJldmlzaW9uID09IElTUF9SRVZJU0lPTl8xNV8wKSB7CiAJCWNjcDItPnBoeSA9ICZpc3AtPmlzcF9jc2lwaHkxOworCX0KIAogCXJldCA9IGNjcDJfaW5pdF9lbnRpdGllcyhjY3AyKTsKIAlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwY2NwMi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BjY3AyLmgKaW5kZXggNTUwNWE4Ni4uNjY3NGU5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BjY3AyLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BjY3AyLmgKQEAgLTgxLDYgKzgxLDcgQEAKIAlzdHJ1Y3QgaXNwX2ludGVyZmFjZV9tZW1fY29uZmlnIG1lbV9jZmc7CiAJc3RydWN0IGlzcF92aWRlbyB2aWRlb19pbjsKIAlzdHJ1Y3QgaXNwX2NzaXBoeSAqcGh5OworCXN0cnVjdCByZWd1bGF0b3IgKnZkZHNfY3NpYjsKIAl1bnNpZ25lZCBpbnQgZXJyb3I7CiAJZW51bSBpc3BfcGlwZWxpbmVfc3RyZWFtX3N0YXRlIHN0YXRlOwogCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHN0YXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwc3RhdC5jCmluZGV4IGI0NGNiNjg1Li44MDgwNjU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHN0YXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHN0YXQuYwpAQCAtMTAzMiw3ICsxMDMyLDYgQEAKIAlzbnByaW50ZihzdWJkZXYtPm5hbWUsIFY0TDJfU1VCREVWX05BTUVfU0laRSwgIk9NQVAzIElTUCAlcyIsIG5hbWUpOwogCXN1YmRldi0+Z3JwX2lkID0gMSA8PCAxNjsJLyogZ3JvdXAgSUQgZm9yIGlzcCBzdWJkZXZzICovCiAJc3ViZGV2LT5mbGFncyB8PSBWNEwyX1NVQkRFVl9GTF9IQVNfRVZFTlRTIHwgVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREU7Ci0Jc3ViZGV2LT5uZXZlbnRzID0gU1RBVF9ORVZFTlRTOwogCXY0bDJfc2V0X3N1YmRldmRhdGEoc3ViZGV2LCBzdGF0KTsKIAogCXN0YXQtPnBhZC5mbGFncyA9IE1FRElBX1BBRF9GTF9TSU5LOwpAQCAtMTA1MCw3ICsxMDQ5LDcgQEAKIAlpZiAoc3ViLT50eXBlICE9IHN0YXQtPmV2ZW50X3R5cGUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIHY0bDJfZXZlbnRfc3Vic2NyaWJlKGZoLCBzdWIpOworCXJldHVybiB2NGwyX2V2ZW50X3N1YnNjcmliZShmaCwgc3ViLCBTVEFUX05FVkVOVFMpOwogfQogCiBpbnQgb21hcDNpc3Bfc3RhdF91bnN1YnNjcmliZV9ldmVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwdmlkZW8uYwppbmRleCA5Y2Q4ZjFhLi5mZDk2NWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3B2aWRlby5jCkBAIC02OTUsNyArNjk1LDYgQEAKIAlzdHJsY3B5KGNhcC0+ZHJpdmVyLCBJU1BfVklERU9fRFJJVkVSX05BTUUsIHNpemVvZihjYXAtPmRyaXZlcikpOwogCXN0cmxjcHkoY2FwLT5jYXJkLCB2aWRlby0+dmlkZW8ubmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkpOwogCXN0cmxjcHkoY2FwLT5idXNfaW5mbywgIm1lZGlhIiwgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKLQljYXAtPnZlcnNpb24gPSBJU1BfVklERU9fRFJJVkVSX1ZFUlNJT047CiAKIAlpZiAodmlkZW8tPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQogCQljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9TVFJFQU1JTkc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHZpZGVvLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHZpZGVvLmgKaW5kZXggOTExYmVhNi4uNTMxNjBhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3B2aWRlby5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwdmlkZW8uaApAQCAtMjcsNyArMjcsNiBAQAogI2RlZmluZSBPTUFQM19JU1BfVklERU9fSAogCiAjaW5jbHVkZSA8bGludXgvdjRsMi1tZWRpYWJ1cy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYS1lbnRpdHkuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZmguaD4KQEAgLTM1LDcgKzM0LDcgQEAKICNpbmNsdWRlICJpc3BxdWV1ZS5oIgogCiAjZGVmaW5lIElTUF9WSURFT19EUklWRVJfTkFNRQkJImlzcHZpZGVvIgotI2RlZmluZSBJU1BfVklERU9fRFJJVkVSX1ZFUlNJT04JS0VSTkVMX1ZFUlNJT04oMCwgMCwgMSkKKyNkZWZpbmUgSVNQX1ZJREVPX0RSSVZFUl9WRVJTSU9OCSIwLjAuMiIKIAogc3RydWN0IGlzcF9kZXZpY2U7CiBzdHJ1Y3QgaXNwX3ZpZGVvOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjI2NDAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3YyNjQwLmMKaW5kZXggMGNlYTBjZi4uOWNlMmZhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjI2NDAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292MjY0MC5jCkBAIC0xMDMxLDE2ICsxMDMxLDkgQEAKIAljb25zdCBjaGFyICpkZXZuYW1lOwogCWludCByZXQ7CiAKLQkvKgotCSAqIHdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuCi0JICogU28gdGhpcyBlbnRpcmUgdGVzdCBpcyBjb21wbGV0ZWx5IHJlZHVuZGFudC4KLQkgKi8KLQlpZiAoIWljZC0+ZGV2LnBhcmVudCB8fAotCSAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlBhcmVudCBtaXNzaW5nIG9yIGludmFsaWQhXG4iKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBlcnI7Ci0JfQorCS8qIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuICovCisJQlVHX09OKCFpY2QtPnBhcmVudCB8fAorCSAgICAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKTsKIAogCS8qCiAJICogY2hlY2sgYW5kIHNob3cgcHJvZHVjdCBJRCBhbmQgbWFudWZhY3R1cmVyIElECmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTY0Mi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjU2NDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDlhNGFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjU2NDIuYwpAQCAtMCwwICsxLDEwMTIgQEAKKy8qCisgKiBEcml2ZXIgZm9yIE9WNTY0MiBDTU9TIEltYWdlIFNlbnNvciBmcm9tIE9tbml2aXNpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIEJhc3RpYW4gSGVjaHQgPGhlY2h0YkBnbWFpbC5jb20+CisgKgorICogQmFzZWQgb24gU29ueSBJTVgwNzQgQ2FtZXJhIERyaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBHdWVubmFkaSBMaWFraG92ZXRza2kgPGcubGlha2hvdmV0c2tpQGdteC5kZT4KKyAqCisgKiBCYXNlZCBvbiBPbW5pdmlzaW9uIE9WNzY3MCBDYW1lcmEgRHJpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtNyBKb25hdGhhbiBDb3JiZXQgPGNvcmJldEBsd24ubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgorI2luY2x1ZGUgPG1lZGlhL3NvY19tZWRpYWJ1cy5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+CisKKy8qIE9WNTY0MiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUkVHX0NISVBfSURfSElHSAkJMHgzMDBhCisjZGVmaW5lIFJFR19DSElQX0lEX0xPVwkJCTB4MzAwYgorCisjZGVmaW5lIFJFR19XSU5ET1dfU1RBUlRfWF9ISUdICQkweDM4MDAKKyNkZWZpbmUgUkVHX1dJTkRPV19TVEFSVF9YX0xPVwkJMHgzODAxCisjZGVmaW5lIFJFR19XSU5ET1dfU1RBUlRfWV9ISUdICQkweDM4MDIKKyNkZWZpbmUgUkVHX1dJTkRPV19TVEFSVF9ZX0xPVwkJMHgzODAzCisjZGVmaW5lIFJFR19XSU5ET1dfV0lEVEhfSElHSAkJMHgzODA0CisjZGVmaW5lIFJFR19XSU5ET1dfV0lEVEhfTE9XCQkweDM4MDUKKyNkZWZpbmUgUkVHX1dJTkRPV19IRUlHSFRfSElHSCAJCTB4MzgwNgorI2RlZmluZSBSRUdfV0lORE9XX0hFSUdIVF9MT1cJCTB4MzgwNworI2RlZmluZSBSRUdfT1VUX1dJRFRIX0hJR0gJCTB4MzgwOAorI2RlZmluZSBSRUdfT1VUX1dJRFRIX0xPVwkJMHgzODA5CisjZGVmaW5lIFJFR19PVVRfSEVJR0hUX0hJR0gJCTB4MzgwYQorI2RlZmluZSBSRUdfT1VUX0hFSUdIVF9MT1cJCTB4MzgwYgorI2RlZmluZSBSRUdfT1VUX1RPVEFMX1dJRFRIX0hJR0gJMHgzODBjCisjZGVmaW5lIFJFR19PVVRfVE9UQUxfV0lEVEhfTE9XCQkweDM4MGQKKyNkZWZpbmUgUkVHX09VVF9UT1RBTF9IRUlHSFRfSElHSAkweDM4MGUKKyNkZWZpbmUgUkVHX09VVF9UT1RBTF9IRUlHSFRfTE9XCTB4MzgwZgorCisvKgorICogZGVmaW5lIHN0YW5kYXJkIHJlc29sdXRpb24uCisgKiBXb3JrcyBjdXJyZW50bHkgb25seSBmb3IgdXAgdG8gNzIwIGxpbmVzCisgKiBlZy4gMzIweDI0MCwgNjQweDQ4MCwgODAweDYwMCwgMTI4MHg3MjAsIDIwNDh4NzIwCisgKi8KKworI2RlZmluZSBPVjU2NDJfV0lEVEgJCTEyODAKKyNkZWZpbmUgT1Y1NjQyX0hFSUdIVAkJNzIwCisjZGVmaW5lIE9WNTY0Ml9UT1RBTF9XSURUSAkzMjAwCisjZGVmaW5lIE9WNTY0Ml9UT1RBTF9IRUlHSFQJMjAwMAorI2RlZmluZSBPVjU2NDJfU0VOU09SX1NJWkVfWAkyNTkyCisjZGVmaW5lIE9WNTY0Ml9TRU5TT1JfU0laRV9ZCTE5NDQKKworc3RydWN0IHJlZ3ZhbF9saXN0IHsKKwl1MTYgcmVnX251bTsKKwl1OCB2YWx1ZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndmFsX2xpc3Qgb3Y1NjQyX2RlZmF1bHRfcmVnc19pbml0W10gPSB7CisJeyAweDMxMDMsIDB4OTMgfSwKKwl7IDB4MzAwOCwgMHg4MiB9LAorCXsgMHgzMDE3LCAweDdmIH0sCisJeyAweDMwMTgsIDB4ZmMgfSwKKwl7IDB4MzgxMCwgMHhjMiB9LAorCXsgMHgzNjE1LCAweGYwIH0sCisJeyAweDMwMDAsIDB4MCAgfSwKKwl7IDB4MzAwMSwgMHgwICB9LAorCXsgMHgzMDAyLCAweDAgIH0sCisJeyAweDMwMDMsIDB4MCAgfSwKKwl7IDB4MzAwNCwgMHhmZiB9LAorCXsgMHgzMDMwLCAweDJiIH0sCisJeyAweDMwMTEsIDB4OCAgfSwKKwl7IDB4MzAxMCwgMHgxMCB9LAorCXsgMHgzNjA0LCAweDYwIH0sCisJeyAweDM2MjIsIDB4NjAgfSwKKwl7IDB4MzYyMSwgMHg5ICB9LAorCXsgMHgzNzA5LCAweDAgIH0sCisJeyAweDQwMDAsIDB4MjEgfSwKKwl7IDB4NDAxZCwgMHgyMiB9LAorCXsgMHgzNjAwLCAweDU0IH0sCisJeyAweDM2MDUsIDB4NCAgfSwKKwl7IDB4MzYwNiwgMHgzZiB9LAorCXsgMHgzYzAxLCAweDgwIH0sCisJeyAweDMwMGQsIDB4MjIgfSwKKwl7IDB4MzYyMywgMHgyMiB9LAorCXsgMHg1MDAwLCAweDRmIH0sCisJeyAweDUwMjAsIDB4NCAgfSwKKwl7IDB4NTE4MSwgMHg3OSB9LAorCXsgMHg1MTgyLCAweDAgIH0sCisJeyAweDUxODUsIDB4MjIgfSwKKwl7IDB4NTE5NywgMHgxICB9LAorCXsgMHg1NTAwLCAweGEgIH0sCisJeyAweDU1MDQsIDB4MCAgfSwKKwl7IDB4NTUwNSwgMHg3ZiB9LAorCXsgMHg1MDgwLCAweDggIH0sCisJeyAweDMwMGUsIDB4MTggfSwKKwl7IDB4NDYxMCwgMHgwICB9LAorCXsgMHg0NzFkLCAweDUgIH0sCisJeyAweDQ3MDgsIDB4NiAgfSwKKwl7IDB4MzcwYywgMHhhMCB9LAorCXsgMHg1Njg3LCAweDk0IH0sCisJeyAweDUwMWYsIDB4MCAgfSwKKwl7IDB4NTAwMCwgMHg0ZiB9LAorCXsgMHg1MDAxLCAweGNmIH0sCisJeyAweDQzMDAsIDB4MzAgfSwKKwl7IDB4NDMwMCwgMHgzMCB9LAorCXsgMHg0NjBiLCAweDM1IH0sCisJeyAweDQ3MWQsIDB4MCAgfSwKKwl7IDB4MzAwMiwgMHhjICB9LAorCXsgMHgzMDAyLCAweDAgIH0sCisJeyAweDQ3MTMsIDB4MyAgfSwKKwl7IDB4NDcxYywgMHg1MCB9LAorCXsgMHg0NzIxLCAweDIgIH0sCisJeyAweDQ0MDIsIDB4OTAgfSwKKwl7IDB4NDYwYywgMHgyMiB9LAorCXsgMHgzODE1LCAweDQ0IH0sCisJeyAweDM1MDMsIDB4NyAgfSwKKwl7IDB4MzUwMSwgMHg3MyB9LAorCXsgMHgzNTAyLCAweDgwIH0sCisJeyAweDM1MGIsIDB4MCAgfSwKKwl7IDB4MzgxOCwgMHhjOCB9LAorCXsgMHgzODI0LCAweDExIH0sCisJeyAweDNhMDAsIDB4NzggfSwKKwl7IDB4M2ExYSwgMHg0ICB9LAorCXsgMHgzYTEzLCAweDMwIH0sCisJeyAweDNhMTgsIDB4MCAgfSwKKwl7IDB4M2ExOSwgMHg3YyB9LAorCXsgMHgzYTA4LCAweDEyIH0sCisJeyAweDNhMDksIDB4YzAgfSwKKwl7IDB4M2EwYSwgMHhmICB9LAorCXsgMHgzYTBiLCAweGEwIH0sCisJeyAweDM1MGMsIDB4NyAgfSwKKwl7IDB4MzUwZCwgMHhkMCB9LAorCXsgMHgzYTBkLCAweDggIH0sCisJeyAweDNhMGUsIDB4NiAgfSwKKwl7IDB4MzUwMCwgMHgwICB9LAorCXsgMHgzNTAxLCAweDAgIH0sCisJeyAweDM1MDIsIDB4MCAgfSwKKwl7IDB4MzUwYSwgMHgwICB9LAorCXsgMHgzNTBiLCAweDAgIH0sCisJeyAweDM1MDMsIDB4MCAgfSwKKwl7IDB4M2EwZiwgMHgzYyB9LAorCXsgMHgzYTEwLCAweDMyIH0sCisJeyAweDNhMWIsIDB4M2MgfSwKKwl7IDB4M2ExZSwgMHgzMiB9LAorCXsgMHgzYTExLCAweDgwIH0sCisJeyAweDNhMWYsIDB4MjAgfSwKKwl7IDB4MzAzMCwgMHgyYiB9LAorCXsgMHgzYTAyLCAweDAgIH0sCisJeyAweDNhMDMsIDB4N2QgfSwKKwl7IDB4M2EwNCwgMHgwICB9LAorCXsgMHgzYTE0LCAweDAgIH0sCisJeyAweDNhMTUsIDB4N2QgfSwKKwl7IDB4M2ExNiwgMHgwICB9LAorCXsgMHgzYTAwLCAweDc4IH0sCisJeyAweDNhMDgsIDB4OSAgfSwKKwl7IDB4M2EwOSwgMHg2MCB9LAorCXsgMHgzYTBhLCAweDcgIH0sCisJeyAweDNhMGIsIDB4ZDAgfSwKKwl7IDB4M2EwZCwgMHgxMCB9LAorCXsgMHgzYTBlLCAweGQgIH0sCisJeyAweDQ0MDcsIDB4NCAgfSwKKwl7IDB4NTE5MywgMHg3MCB9LAorCXsgMHg1ODliLCAweDAgIH0sCisJeyAweDU4OWEsIDB4YzAgfSwKKwl7IDB4NDAxZSwgMHgyMCB9LAorCXsgMHg0MDAxLCAweDQyIH0sCisJeyAweDQwMWMsIDB4NiAgfSwKKwl7IDB4MzgyNSwgMHhhYyB9LAorCXsgMHgzODI3LCAweGMgIH0sCisJeyAweDUyOGEsIDB4MSAgfSwKKwl7IDB4NTI4YiwgMHg0ICB9LAorCXsgMHg1MjhjLCAweDggIH0sCisJeyAweDUyOGQsIDB4MTAgfSwKKwl7IDB4NTI4ZSwgMHgyMCB9LAorCXsgMHg1MjhmLCAweDI4IH0sCisJeyAweDUyOTAsIDB4MzAgfSwKKwl7IDB4NTI5MiwgMHgwICB9LAorCXsgMHg1MjkzLCAweDEgIH0sCisJeyAweDUyOTQsIDB4MCAgfSwKKwl7IDB4NTI5NSwgMHg0ICB9LAorCXsgMHg1Mjk2LCAweDAgIH0sCisJeyAweDUyOTcsIDB4OCAgfSwKKwl7IDB4NTI5OCwgMHgwICB9LAorCXsgMHg1Mjk5LCAweDEwIH0sCisJeyAweDUyOWEsIDB4MCAgfSwKKwl7IDB4NTI5YiwgMHgyMCB9LAorCXsgMHg1MjljLCAweDAgIH0sCisJeyAweDUyOWQsIDB4MjggfSwKKwl7IDB4NTI5ZSwgMHgwICB9LAorCXsgMHg1MjlmLCAweDMwIH0sCisJeyAweDUyODIsIDB4MCAgfSwKKwl7IDB4NTMwMCwgMHgwICB9LAorCXsgMHg1MzAxLCAweDIwIH0sCisJeyAweDUzMDIsIDB4MCAgfSwKKwl7IDB4NTMwMywgMHg3YyB9LAorCXsgMHg1MzBjLCAweDAgIH0sCisJeyAweDUzMGQsIDB4YyAgfSwKKwl7IDB4NTMwZSwgMHgyMCB9LAorCXsgMHg1MzBmLCAweDgwIH0sCisJeyAweDUzMTAsIDB4MjAgfSwKKwl7IDB4NTMxMSwgMHg4MCB9LAorCXsgMHg1MzA4LCAweDIwIH0sCisJeyAweDUzMDksIDB4NDAgfSwKKwl7IDB4NTMwNCwgMHgwICB9LAorCXsgMHg1MzA1LCAweDMwIH0sCisJeyAweDUzMDYsIDB4MCAgfSwKKwl7IDB4NTMwNywgMHg4MCB9LAorCXsgMHg1MzE0LCAweDggIH0sCisJeyAweDUzMTUsIDB4MjAgfSwKKwl7IDB4NTMxOSwgMHgzMCB9LAorCXsgMHg1MzE2LCAweDEwIH0sCisJeyAweDUzMTcsIDB4MCAgfSwKKwl7IDB4NTMxOCwgMHgyICB9LAorCXsgMHg1MzgwLCAweDEgIH0sCisJeyAweDUzODEsIDB4MCAgfSwKKwl7IDB4NTM4MiwgMHgwICB9LAorCXsgMHg1MzgzLCAweDRlIH0sCisJeyAweDUzODQsIDB4MCAgfSwKKwl7IDB4NTM4NSwgMHhmICB9LAorCXsgMHg1Mzg2LCAweDAgIH0sCisJeyAweDUzODcsIDB4MCAgfSwKKwl7IDB4NTM4OCwgMHgxICB9LAorCXsgMHg1Mzg5LCAweDE1IH0sCisJeyAweDUzOGEsIDB4MCAgfSwKKwl7IDB4NTM4YiwgMHgzMSB9LAorCXsgMHg1MzhjLCAweDAgIH0sCisJeyAweDUzOGQsIDB4MCAgfSwKKwl7IDB4NTM4ZSwgMHgwICB9LAorCXsgMHg1MzhmLCAweGYgIH0sCisJeyAweDUzOTAsIDB4MCAgfSwKKwl7IDB4NTM5MSwgMHhhYiB9LAorCXsgMHg1MzkyLCAweDAgIH0sCisJeyAweDUzOTMsIDB4YTIgfSwKKwl7IDB4NTM5NCwgMHg4ICB9LAorCXsgMHg1NDgwLCAweDE0IH0sCisJeyAweDU0ODEsIDB4MjEgfSwKKwl7IDB4NTQ4MiwgMHgzNiB9LAorCXsgMHg1NDgzLCAweDU3IH0sCisJeyAweDU0ODQsIDB4NjUgfSwKKwl7IDB4NTQ4NSwgMHg3MSB9LAorCXsgMHg1NDg2LCAweDdkIH0sCisJeyAweDU0ODcsIDB4ODcgfSwKKwl7IDB4NTQ4OCwgMHg5MSB9LAorCXsgMHg1NDg5LCAweDlhIH0sCisJeyAweDU0OGEsIDB4YWEgfSwKKwl7IDB4NTQ4YiwgMHhiOCB9LAorCXsgMHg1NDhjLCAweGNkIH0sCisJeyAweDU0OGQsIDB4ZGQgfSwKKwl7IDB4NTQ4ZSwgMHhlYSB9LAorCXsgMHg1NDhmLCAweDFkIH0sCisJeyAweDU0OTAsIDB4NSAgfSwKKwl7IDB4NTQ5MSwgMHgwICB9LAorCXsgMHg1NDkyLCAweDQgIH0sCisJeyAweDU0OTMsIDB4MjAgfSwKKwl7IDB4NTQ5NCwgMHgzICB9LAorCXsgMHg1NDk1LCAweDYwIH0sCisJeyAweDU0OTYsIDB4MiAgfSwKKwl7IDB4NTQ5NywgMHhiOCB9LAorCXsgMHg1NDk4LCAweDIgIH0sCisJeyAweDU0OTksIDB4ODYgfSwKKwl7IDB4NTQ5YSwgMHgyICB9LAorCXsgMHg1NDliLCAweDViIH0sCisJeyAweDU0OWMsIDB4MiAgfSwKKwl7IDB4NTQ5ZCwgMHgzYiB9LAorCXsgMHg1NDllLCAweDIgIH0sCisJeyAweDU0OWYsIDB4MWMgfSwKKwl7IDB4NTRhMCwgMHgyICB9LAorCXsgMHg1NGExLCAweDQgIH0sCisJeyAweDU0YTIsIDB4MSAgfSwKKwl7IDB4NTRhMywgMHhlZCB9LAorCXsgMHg1NGE0LCAweDEgIH0sCisJeyAweDU0YTUsIDB4YzUgfSwKKwl7IDB4NTRhNiwgMHgxICB9LAorCXsgMHg1NGE3LCAweGE1IH0sCisJeyAweDU0YTgsIDB4MSAgfSwKKwl7IDB4NTRhOSwgMHg2YyB9LAorCXsgMHg1NGFhLCAweDEgIH0sCisJeyAweDU0YWIsIDB4NDEgfSwKKwl7IDB4NTRhYywgMHgxICB9LAorCXsgMHg1NGFkLCAweDIwIH0sCisJeyAweDU0YWUsIDB4MCAgfSwKKwl7IDB4NTRhZiwgMHgxNiB9LAorCXsgMHg1NGIwLCAweDEgIH0sCisJeyAweDU0YjEsIDB4MjAgfSwKKwl7IDB4NTRiMiwgMHgwICB9LAorCXsgMHg1NGIzLCAweDEwIH0sCisJeyAweDU0YjQsIDB4MCAgfSwKKwl7IDB4NTRiNSwgMHhmMCB9LAorCXsgMHg1NGI2LCAweDAgIH0sCisJeyAweDU0YjcsIDB4ZGYgfSwKKwl7IDB4NTQwMiwgMHgzZiB9LAorCXsgMHg1NDAzLCAweDAgIH0sCisJeyAweDM0MDYsIDB4MCAgfSwKKwl7IDB4NTE4MCwgMHhmZiB9LAorCXsgMHg1MTgxLCAweDUyIH0sCisJeyAweDUxODIsIDB4MTEgfSwKKwl7IDB4NTE4MywgMHgxNCB9LAorCXsgMHg1MTg0LCAweDI1IH0sCisJeyAweDUxODUsIDB4MjQgfSwKKwl7IDB4NTE4NiwgMHg2ICB9LAorCXsgMHg1MTg3LCAweDggIH0sCisJeyAweDUxODgsIDB4OCAgfSwKKwl7IDB4NTE4OSwgMHg3YyB9LAorCXsgMHg1MThhLCAweDYwIH0sCisJeyAweDUxOGIsIDB4YjIgfSwKKwl7IDB4NTE4YywgMHhiMiB9LAorCXsgMHg1MThkLCAweDQ0IH0sCisJeyAweDUxOGUsIDB4M2QgfSwKKwl7IDB4NTE4ZiwgMHg1OCB9LAorCXsgMHg1MTkwLCAweDQ2IH0sCisJeyAweDUxOTEsIDB4ZjggfSwKKwl7IDB4NTE5MiwgMHg0ICB9LAorCXsgMHg1MTkzLCAweDcwIH0sCisJeyAweDUxOTQsIDB4ZjAgfSwKKwl7IDB4NTE5NSwgMHhmMCB9LAorCXsgMHg1MTk2LCAweDMgIH0sCisJeyAweDUxOTcsIDB4MSAgfSwKKwl7IDB4NTE5OCwgMHg0ICB9LAorCXsgMHg1MTk5LCAweDEyIH0sCisJeyAweDUxOWEsIDB4NCAgfSwKKwl7IDB4NTE5YiwgMHgwICB9LAorCXsgMHg1MTljLCAweDYgIH0sCisJeyAweDUxOWQsIDB4ODIgfSwKKwl7IDB4NTE5ZSwgMHgwICB9LAorCXsgMHg1MDI1LCAweDgwIH0sCisJeyAweDNhMGYsIDB4MzggfSwKKwl7IDB4M2ExMCwgMHgzMCB9LAorCXsgMHgzYTFiLCAweDNhIH0sCisJeyAweDNhMWUsIDB4MmUgfSwKKwl7IDB4M2ExMSwgMHg2MCB9LAorCXsgMHgzYTFmLCAweDEwIH0sCisJeyAweDU2ODgsIDB4YTYgfSwKKwl7IDB4NTY4OSwgMHg2YSB9LAorCXsgMHg1NjhhLCAweGVhIH0sCisJeyAweDU2OGIsIDB4YWUgfSwKKwl7IDB4NTY4YywgMHhhNiB9LAorCXsgMHg1NjhkLCAweDZhIH0sCisJeyAweDU2OGUsIDB4NjIgfSwKKwl7IDB4NTY4ZiwgMHgyNiB9LAorCXsgMHg1NTgzLCAweDQwIH0sCisJeyAweDU1ODQsIDB4NDAgfSwKKwl7IDB4NTU4MCwgMHgyICB9LAorCXsgMHg1MDAwLCAweGNmIH0sCisJeyAweDU4MDAsIDB4MjcgfSwKKwl7IDB4NTgwMSwgMHgxOSB9LAorCXsgMHg1ODAyLCAweDEyIH0sCisJeyAweDU4MDMsIDB4ZiAgfSwKKwl7IDB4NTgwNCwgMHgxMCB9LAorCXsgMHg1ODA1LCAweDE1IH0sCisJeyAweDU4MDYsIDB4MWUgfSwKKwl7IDB4NTgwNywgMHgyZiB9LAorCXsgMHg1ODA4LCAweDE1IH0sCisJeyAweDU4MDksIDB4ZCAgfSwKKwl7IDB4NTgwYSwgMHhhICB9LAorCXsgMHg1ODBiLCAweDkgIH0sCisJeyAweDU4MGMsIDB4YSAgfSwKKwl7IDB4NTgwZCwgMHhjICB9LAorCXsgMHg1ODBlLCAweDEyIH0sCisJeyAweDU4MGYsIDB4MTkgfSwKKwl7IDB4NTgxMCwgMHhiICB9LAorCXsgMHg1ODExLCAweDcgIH0sCisJeyAweDU4MTIsIDB4NCAgfSwKKwl7IDB4NTgxMywgMHgzICB9LAorCXsgMHg1ODE0LCAweDMgIH0sCisJeyAweDU4MTUsIDB4NiAgfSwKKwl7IDB4NTgxNiwgMHhhICB9LAorCXsgMHg1ODE3LCAweGYgIH0sCisJeyAweDU4MTgsIDB4YSAgfSwKKwl7IDB4NTgxOSwgMHg1ICB9LAorCXsgMHg1ODFhLCAweDEgIH0sCisJeyAweDU4MWIsIDB4MCAgfSwKKwl7IDB4NTgxYywgMHgwICB9LAorCXsgMHg1ODFkLCAweDMgIH0sCisJeyAweDU4MWUsIDB4OCAgfSwKKwl7IDB4NTgxZiwgMHhjICB9LAorCXsgMHg1ODIwLCAweGEgIH0sCisJeyAweDU4MjEsIDB4NSAgfSwKKwl7IDB4NTgyMiwgMHgxICB9LAorCXsgMHg1ODIzLCAweDAgIH0sCisJeyAweDU4MjQsIDB4MCAgfSwKKwl7IDB4NTgyNSwgMHgzICB9LAorCXsgMHg1ODI2LCAweDggIH0sCisJeyAweDU4MjcsIDB4YyAgfSwKKwl7IDB4NTgyOCwgMHhlICB9LAorCXsgMHg1ODI5LCAweDggIH0sCisJeyAweDU4MmEsIDB4NiAgfSwKKwl7IDB4NTgyYiwgMHg0ICB9LAorCXsgMHg1ODJjLCAweDUgIH0sCisJeyAweDU4MmQsIDB4NyAgfSwKKwl7IDB4NTgyZSwgMHhiICB9LAorCXsgMHg1ODJmLCAweDEyIH0sCisJeyAweDU4MzAsIDB4MTggfSwKKwl7IDB4NTgzMSwgMHgxMCB9LAorCXsgMHg1ODMyLCAweGMgIH0sCisJeyAweDU4MzMsIDB4YSAgfSwKKwl7IDB4NTgzNCwgMHhiICB9LAorCXsgMHg1ODM1LCAweGUgIH0sCisJeyAweDU4MzYsIDB4MTUgfSwKKwl7IDB4NTgzNywgMHgxOSB9LAorCXsgMHg1ODM4LCAweDMyIH0sCisJeyAweDU4MzksIDB4MWYgfSwKKwl7IDB4NTgzYSwgMHgxOCB9LAorCXsgMHg1ODNiLCAweDE2IH0sCisJeyAweDU4M2MsIDB4MTcgfSwKKwl7IDB4NTgzZCwgMHgxZSB9LAorCXsgMHg1ODNlLCAweDI2IH0sCisJeyAweDU4M2YsIDB4NTMgfSwKKwl7IDB4NTg0MCwgMHgxMCB9LAorCXsgMHg1ODQxLCAweGYgIH0sCisJeyAweDU4NDIsIDB4ZCAgfSwKKwl7IDB4NTg0MywgMHhjICB9LAorCXsgMHg1ODQ0LCAweGUgIH0sCisJeyAweDU4NDUsIDB4OSAgfSwKKwl7IDB4NTg0NiwgMHgxMSB9LAorCXsgMHg1ODQ3LCAweDEwIH0sCisJeyAweDU4NDgsIDB4MTAgfSwKKwl7IDB4NTg0OSwgMHgxMCB9LAorCXsgMHg1ODRhLCAweDEwIH0sCisJeyAweDU4NGIsIDB4ZSAgfSwKKwl7IDB4NTg0YywgMHgxMCB9LAorCXsgMHg1ODRkLCAweDEwIH0sCisJeyAweDU4NGUsIDB4MTEgfSwKKwl7IDB4NTg0ZiwgMHgxMCB9LAorCXsgMHg1ODUwLCAweGYgIH0sCisJeyAweDU4NTEsIDB4YyAgfSwKKwl7IDB4NTg1MiwgMHhmICB9LAorCXsgMHg1ODUzLCAweDEwIH0sCisJeyAweDU4NTQsIDB4MTAgfSwKKwl7IDB4NTg1NSwgMHhmICB9LAorCXsgMHg1ODU2LCAweGUgIH0sCisJeyAweDU4NTcsIDB4YiAgfSwKKwl7IDB4NTg1OCwgMHgxMCB9LAorCXsgMHg1ODU5LCAweGQgIH0sCisJeyAweDU4NWEsIDB4ZCAgfSwKKwl7IDB4NTg1YiwgMHhjICB9LAorCXsgMHg1ODVjLCAweGMgIH0sCisJeyAweDU4NWQsIDB4YyAgfSwKKwl7IDB4NTg1ZSwgMHhiICB9LAorCXsgMHg1ODVmLCAweGMgIH0sCisJeyAweDU4NjAsIDB4YyAgfSwKKwl7IDB4NTg2MSwgMHhjICB9LAorCXsgMHg1ODYyLCAweGQgIH0sCisJeyAweDU4NjMsIDB4OCAgfSwKKwl7IDB4NTg2NCwgMHgxMSB9LAorCXsgMHg1ODY1LCAweDE4IH0sCisJeyAweDU4NjYsIDB4MTggfSwKKwl7IDB4NTg2NywgMHgxOSB9LAorCXsgMHg1ODY4LCAweDE3IH0sCisJeyAweDU4NjksIDB4MTkgfSwKKwl7IDB4NTg2YSwgMHgxNiB9LAorCXsgMHg1ODZiLCAweDEzIH0sCisJeyAweDU4NmMsIDB4MTMgfSwKKwl7IDB4NTg2ZCwgMHgxMiB9LAorCXsgMHg1ODZlLCAweDEzIH0sCisJeyAweDU4NmYsIDB4MTYgfSwKKwl7IDB4NTg3MCwgMHgxNCB9LAorCXsgMHg1ODcxLCAweDEyIH0sCisJeyAweDU4NzIsIDB4MTAgfSwKKwl7IDB4NTg3MywgMHgxMSB9LAorCXsgMHg1ODc0LCAweDExIH0sCisJeyAweDU4NzUsIDB4MTYgfSwKKwl7IDB4NTg3NiwgMHgxNCB9LAorCXsgMHg1ODc3LCAweDExIH0sCisJeyAweDU4NzgsIDB4MTAgfSwKKwl7IDB4NTg3OSwgMHhmICB9LAorCXsgMHg1ODdhLCAweDEwIH0sCisJeyAweDU4N2IsIDB4MTQgfSwKKwl7IDB4NTg3YywgMHgxMyB9LAorCXsgMHg1ODdkLCAweDEyIH0sCisJeyAweDU4N2UsIDB4MTEgfSwKKwl7IDB4NTg3ZiwgMHgxMSB9LAorCXsgMHg1ODgwLCAweDEyIH0sCisJeyAweDU4ODEsIDB4MTUgfSwKKwl7IDB4NTg4MiwgMHgxNCB9LAorCXsgMHg1ODgzLCAweDE1IH0sCisJeyAweDU4ODQsIDB4MTUgfSwKKwl7IDB4NTg4NSwgMHgxNSB9LAorCXsgMHg1ODg2LCAweDEzIH0sCisJeyAweDU4ODcsIDB4MTcgfSwKKwl7IDB4MzcxMCwgMHgxMCB9LAorCXsgMHgzNjMyLCAweDUxIH0sCisJeyAweDM3MDIsIDB4MTAgfSwKKwl7IDB4MzcwMywgMHhiMiB9LAorCXsgMHgzNzA0LCAweDE4IH0sCisJeyAweDM3MGIsIDB4NDAgfSwKKwl7IDB4MzcwZCwgMHgzICB9LAorCXsgMHgzNjMxLCAweDEgIH0sCisJeyAweDM2MzIsIDB4NTIgfSwKKwl7IDB4MzYwNiwgMHgyNCB9LAorCXsgMHgzNjIwLCAweDk2IH0sCisJeyAweDU3ODUsIDB4NyAgfSwKKwl7IDB4M2ExMywgMHgzMCB9LAorCXsgMHgzNjAwLCAweDUyIH0sCisJeyAweDM2MDQsIDB4NDggfSwKKwl7IDB4MzYwNiwgMHgxYiB9LAorCXsgMHgzNzBkLCAweGIgIH0sCisJeyAweDM3MGYsIDB4YzAgfSwKKwl7IDB4MzcwOSwgMHgxICB9LAorCXsgMHgzODIzLCAweDAgIH0sCisJeyAweDUwMDcsIDB4MCAgfSwKKwl7IDB4NTAwOSwgMHgwICB9LAorCXsgMHg1MDExLCAweDAgIH0sCisJeyAweDUwMTMsIDB4MCAgfSwKKwl7IDB4NTE5ZSwgMHgwICB9LAorCXsgMHg1MDg2LCAweDAgIH0sCisJeyAweDUwODcsIDB4MCAgfSwKKwl7IDB4NTA4OCwgMHgwICB9LAorCXsgMHg1MDg5LCAweDAgIH0sCisJeyAweDMwMmIsIDB4MCAgfSwKKwl7IDB4MzUwMywgMHg3ICB9LAorCXsgMHgzMDExLCAweDggIH0sCisJeyAweDM1MGMsIDB4MiAgfSwKKwl7IDB4MzUwZCwgMHhlNCB9LAorCXsgMHgzNjIxLCAweGM5IH0sCisJeyAweDM3MGEsIDB4ODEgfSwKKwl7IDB4ZmZmZiwgMHhmZiB9LAorfTsKKworc3RhdGljIHN0cnVjdCByZWd2YWxfbGlzdCBvdjU2NDJfZGVmYXVsdF9yZWdzX2ZpbmFsaXNlW10gPSB7CisJeyAweDM4MTAsIDB4YzIgfSwKKwl7IDB4MzgxOCwgMHhjOSB9LAorCXsgMHgzODFjLCAweDEwIH0sCisJeyAweDM4MWQsIDB4YTAgfSwKKwl7IDB4MzgxZSwgMHg1ICB9LAorCXsgMHgzODFmLCAweGIwIH0sCisJeyAweDM4MjAsIDB4MCAgfSwKKwl7IDB4MzgyMSwgMHgwICB9LAorCXsgMHgzODI0LCAweDExIH0sCisJeyAweDNhMDgsIDB4MWIgfSwKKwl7IDB4M2EwOSwgMHhjMCB9LAorCXsgMHgzYTBhLCAweDE3IH0sCisJeyAweDNhMGIsIDB4MjAgfSwKKwl7IDB4M2EwZCwgMHgyICB9LAorCXsgMHgzYTBlLCAweDEgIH0sCisJeyAweDQwMWMsIDB4NCAgfSwKKwl7IDB4NTY4MiwgMHg1ICB9LAorCXsgMHg1NjgzLCAweDAgIH0sCisJeyAweDU2ODYsIDB4MiAgfSwKKwl7IDB4NTY4NywgMHhjYyB9LAorCXsgMHg1MDAxLCAweDRmIH0sCisJeyAweDU4OWIsIDB4NiAgfSwKKwl7IDB4NTg5YSwgMHhjNSB9LAorCXsgMHgzNTAzLCAweDAgIH0sCisJeyAweDQ2MGMsIDB4MjAgfSwKKwl7IDB4NDYwYiwgMHgzNyB9LAorCXsgMHg0NzFjLCAweGQwIH0sCisJeyAweDQ3MWQsIDB4NSAgfSwKKwl7IDB4MzgxNSwgMHgxICB9LAorCXsgMHgzODE4LCAweGMxIH0sCisJeyAweDUwMWYsIDB4MCAgfSwKKwl7IDB4NTAwMiwgMHhlMCB9LAorCXsgMHg0MzAwLCAweDMyIH0sIC8qIFVZVlkgKi8KKwl7IDB4MzAwMiwgMHgxYyB9LAorCXsgMHg0ODAwLCAweDE0IH0sCisJeyAweDQ4MDEsIDB4ZiAgfSwKKwl7IDB4MzAwNywgMHgzYiB9LAorCXsgMHgzMDBlLCAweDQgIH0sCisJeyAweDQ4MDMsIDB4NTAgfSwKKwl7IDB4MzgxNSwgMHgxICB9LAorCXsgMHg0NzEzLCAweDIgIH0sCisJeyAweDQ4NDIsIDB4MSAgfSwKKwl7IDB4MzAwZiwgMHhlICB9LAorCXsgMHgzMDAzLCAweDMgIH0sCisJeyAweDMwMDMsIDB4MSAgfSwKKwl7IDB4ZmZmZiwgMHhmZiB9LAorfTsKKworc3RydWN0IG92NTY0Ml9kYXRhZm10IHsKKwllbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUJY29kZTsKKwllbnVtIHY0bDJfY29sb3JzcGFjZQkJY29sb3JzcGFjZTsKK307CisKK3N0cnVjdCBvdjU2NDIgeworCXN0cnVjdCB2NGwyX3N1YmRldgkJc3ViZGV2OworCWNvbnN0IHN0cnVjdCBvdjU2NDJfZGF0YWZtdAkqZm10OworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvdjU2NDJfZGF0YWZtdCBvdjU2NDJfY29sb3VyX2ZtdHNbXSA9IHsKKwl7VjRMMl9NQlVTX0ZNVF9VWVZZOF8yWDgsIFY0TDJfQ09MT1JTUEFDRV9KUEVHfSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb3Y1NjQyICp0b19vdjU2NDIoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpLCBzdHJ1Y3Qgb3Y1NjQyLCBzdWJkZXYpOworfQorCisvKiBGaW5kIGEgZGF0YSBmb3JtYXQgYnkgYSBwaXhlbCBjb2RlIGluIGFuIGFycmF5ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG92NTY0Ml9kYXRhZm10CisJCQkqb3Y1NjQyX2ZpbmRfZGF0YWZtdChlbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgY29kZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG92NTY0Ml9jb2xvdXJfZm10cyk7IGkrKykKKwkJaWYgKG92NTY0Ml9jb2xvdXJfZm10c1tpXS5jb2RlID09IGNvZGUpCisJCQlyZXR1cm4gb3Y1NjQyX2NvbG91cl9mbXRzICsgaTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHJlZ19yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiByZWcsIHU4ICp2YWwpCit7CisJaW50IHJldDsKKwkvKiBXZSBoYXZlIDE2LWJpdCBpMmMgYWRkcmVzc2VzIC0gY2FyZSBmb3IgZW5kaWFuZXNzICovCisJdW5zaWduZWQgY2hhciBkYXRhWzJdID0geyByZWcgPj4gOCwgcmVnICYgMHhmZiB9OworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgZGF0YSwgMik7CisJaWYgKHJldCA8IDIpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogaTJjIHJlYWQgZXJyb3IsIHJlZzogJXhcbiIsCisJCQlfX2Z1bmNfXywgcmVnKTsKKwkJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAtRUlPOworCX0KKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsIHZhbCwgMSk7CisJaWYgKHJldCA8IDEpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogaTJjIHJlYWQgZXJyb3IsIHJlZzogJXhcbiIsCisJCQkJX19mdW5jX18sIHJlZyk7CisJCXJldHVybiByZXQgPCAwID8gcmV0IDogLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVnX3dyaXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiByZWcsIHU4IHZhbCkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGNoYXIgZGF0YVszXSA9IHsgcmVnID4+IDgsIHJlZyAmIDB4ZmYsIHZhbCB9OworCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgZGF0YSwgMyk7CisJaWYgKHJldCA8IDMpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogaTJjIHdyaXRlIGVycm9yLCByZWc6ICV4XG4iLAorCQkJX19mdW5jX18sIHJlZyk7CisJCXJldHVybiByZXQgPCAwID8gcmV0IDogLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCitzdGF0aWMgaW50IG92NTY0Ml9nZXRfcmVnaXN0ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCWludCByZXQ7CisJdTggdmFsOworCisJaWYgKHJlZy0+cmVnICYgfjB4ZmZmZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZWctPnNpemUgPSAxOworCisJcmV0ID0gcmVnX3JlYWQoY2xpZW50LCByZWctPnJlZywgJnZhbCk7CisJaWYgKCFyZXQpCisJCXJlZy0+dmFsID0gKF9fdTY0KXZhbDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3Y1NjQyX3NldF9yZWdpc3RlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKKwlpZiAocmVnLT5yZWcgJiB+MHhmZmZmIHx8IHJlZy0+dmFsICYgfjB4ZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHJlZ193cml0ZShjbGllbnQsIHJlZy0+cmVnLCByZWctPnZhbCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBvdjU2NDJfd3JpdGVfYXJyYXkoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQlzdHJ1Y3QgcmVndmFsX2xpc3QgKnZhbHMpCit7CisJd2hpbGUgKHZhbHMtPnJlZ19udW0gIT0gMHhmZmZmIHx8IHZhbHMtPnZhbHVlICE9IDB4ZmYpIHsKKwkJaW50IHJldCA9IHJlZ193cml0ZShjbGllbnQsIHZhbHMtPnJlZ19udW0sIHZhbHMtPnZhbHVlKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQl2YWxzKys7CisJfQorCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiUmVnaXN0ZXIgbGlzdCBsb2FkZWRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92NTY0Ml9zZXRfcmVzb2x1dGlvbihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCByZXQ7CisJdTggc3RhcnRfeF9oaWdoID0gKChPVjU2NDJfU0VOU09SX1NJWkVfWCAtIE9WNTY0Ml9XSURUSCkgLyAyKSA+PiA4OworCXU4IHN0YXJ0X3hfbG93ICA9ICgoT1Y1NjQyX1NFTlNPUl9TSVpFX1ggLSBPVjU2NDJfV0lEVEgpIC8gMikgJiAweGZmOworCXU4IHN0YXJ0X3lfaGlnaCA9ICgoT1Y1NjQyX1NFTlNPUl9TSVpFX1kgLSBPVjU2NDJfSEVJR0hUKSAvIDIpID4+IDg7CisJdTggc3RhcnRfeV9sb3cgID0gKChPVjU2NDJfU0VOU09SX1NJWkVfWSAtIE9WNTY0Ml9IRUlHSFQpIC8gMikgJiAweGZmOworCisJdTggd2lkdGhfaGlnaAk9IE9WNTY0Ml9XSURUSCAgPj4gODsKKwl1OCB3aWR0aF9sb3cJPSBPVjU2NDJfV0lEVEggICYgMHhmZjsKKwl1OCBoZWlnaHRfaGlnaAk9IE9WNTY0Ml9IRUlHSFQgPj4gODsKKwl1OCBoZWlnaHRfbG93CT0gT1Y1NjQyX0hFSUdIVCAmIDB4ZmY7CisKKwl1OCB0b3RhbF93aWR0aF9oaWdoICA9IE9WNTY0Ml9UT1RBTF9XSURUSCAgPj4gODsKKwl1OCB0b3RhbF93aWR0aF9sb3cgICA9IE9WNTY0Ml9UT1RBTF9XSURUSCAgJiAweGZmOworCXU4IHRvdGFsX2hlaWdodF9oaWdoID0gT1Y1NjQyX1RPVEFMX0hFSUdIVCA+PiA4OworCXU4IHRvdGFsX2hlaWdodF9sb3cgID0gT1Y1NjQyX1RPVEFMX0hFSUdIVCAmIDB4ZmY7CisKKwlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfV0lORE9XX1NUQVJUX1hfSElHSCwgc3RhcnRfeF9oaWdoKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX1dJTkRPV19TVEFSVF9YX0xPVywgc3RhcnRfeF9sb3cpOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfV0lORE9XX1NUQVJUX1lfSElHSCwgc3RhcnRfeV9oaWdoKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX1dJTkRPV19TVEFSVF9ZX0xPVywgc3RhcnRfeV9sb3cpOworCisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19XSU5ET1dfV0lEVEhfSElHSCwgd2lkdGhfaGlnaCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19XSU5ET1dfV0lEVEhfTE9XICwgd2lkdGhfbG93KTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX1dJTkRPV19IRUlHSFRfSElHSCwgaGVpZ2h0X2hpZ2gpOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfV0lORE9XX0hFSUdIVF9MT1csICBoZWlnaHRfbG93KTsKKworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfT1VUX1dJRFRIX0hJR0gsIHdpZHRoX2hpZ2gpOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfT1VUX1dJRFRIX0xPVyAsIHdpZHRoX2xvdyk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19PVVRfSEVJR0hUX0hJR0gsIGhlaWdodF9oaWdoKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX09VVF9IRUlHSFRfTE9XLCAgaGVpZ2h0X2xvdyk7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX09VVF9UT1RBTF9XSURUSF9ISUdILCB0b3RhbF93aWR0aF9oaWdoKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX09VVF9UT1RBTF9XSURUSF9MT1csIHRvdGFsX3dpZHRoX2xvdyk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19PVVRfVE9UQUxfSEVJR0hUX0hJR0gsIHRvdGFsX2hlaWdodF9oaWdoKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX09VVF9UT1RBTF9IRUlHSFRfTE9XLCAgdG90YWxfaGVpZ2h0X2xvdyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG92NTY0Ml90cnlfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkgIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQoreworCWNvbnN0IHN0cnVjdCBvdjU2NDJfZGF0YWZtdCAqZm10ID0gb3Y1NjQyX2ZpbmRfZGF0YWZtdChtZi0+Y29kZSk7CisKKwlkZXZfZGJnKHNkLT52NGwyX2Rldi0+ZGV2LCAiJXMoJXUpIHdpZHRoOiAldSBoZWlndGg6ICV1XG4iLAorCQkJX19mdW5jX18sIG1mLT5jb2RlLCBtZi0+d2lkdGgsIG1mLT5oZWlnaHQpOworCisJaWYgKCFmbXQpIHsKKwkJbWYtPmNvZGUJPSBvdjU2NDJfY29sb3VyX2ZtdHNbMF0uY29kZTsKKwkJbWYtPmNvbG9yc3BhY2UJPSBvdjU2NDJfY29sb3VyX2ZtdHNbMF0uY29sb3JzcGFjZTsKKwl9CisKKwltZi0+d2lkdGgJPSBPVjU2NDJfV0lEVEg7CisJbWYtPmhlaWdodAk9IE9WNTY0Ml9IRUlHSFQ7CisJbWYtPmZpZWxkCT0gVjRMMl9GSUVMRF9OT05FOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Y1NjQyX3NfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IG92NTY0MiAqcHJpdiA9IHRvX292NTY0MihjbGllbnQpOworCisJZGV2X2RiZyhzZC0+djRsMl9kZXYtPmRldiwgIiVzKCV1KVxuIiwgX19mdW5jX18sIG1mLT5jb2RlKTsKKworCS8qIE1JUEkgQ1NJIGNvdWxkIGhhdmUgY2hhbmdlZCB0aGUgZm9ybWF0LCBkb3VibGUtY2hlY2sgKi8KKwlpZiAoIW92NTY0Ml9maW5kX2RhdGFmbXQobWYtPmNvZGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW92NTY0Ml90cnlfZm10KHNkLCBtZik7CisKKwlwcml2LT5mbXQgPSBvdjU2NDJfZmluZF9kYXRhZm10KG1mLT5jb2RlKTsKKworCW92NTY0Ml93cml0ZV9hcnJheShjbGllbnQsIG92NTY0Ml9kZWZhdWx0X3JlZ3NfaW5pdCk7CisJb3Y1NjQyX3NldF9yZXNvbHV0aW9uKGNsaWVudCk7CisJb3Y1NjQyX3dyaXRlX2FycmF5KGNsaWVudCwgb3Y1NjQyX2RlZmF1bHRfcmVnc19maW5hbGlzZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdjU2NDJfZ19mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3Qgb3Y1NjQyICpwcml2ID0gdG9fb3Y1NjQyKGNsaWVudCk7CisKKwljb25zdCBzdHJ1Y3Qgb3Y1NjQyX2RhdGFmbXQgKmZtdCA9IHByaXYtPmZtdDsKKworCW1mLT5jb2RlCT0gZm10LT5jb2RlOworCW1mLT5jb2xvcnNwYWNlCT0gZm10LT5jb2xvcnNwYWNlOworCW1mLT53aWR0aAk9IE9WNTY0Ml9XSURUSDsKKwltZi0+aGVpZ2h0CT0gT1Y1NjQyX0hFSUdIVDsKKwltZi0+ZmllbGQJPSBWNEwyX0ZJRUxEX05PTkU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdjU2NDJfZW51bV9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdW5zaWduZWQgaW50IGluZGV4LAorCQkJICAgZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlICpjb2RlKQoreworCWlmIChpbmRleCA+PSBBUlJBWV9TSVpFKG92NTY0Ml9jb2xvdXJfZm10cykpCisJCXJldHVybiAtRUlOVkFMOworCisJKmNvZGUgPSBvdjU2NDJfY29sb3VyX2ZtdHNbaW5kZXhdLmNvZGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Y1NjQyX2dfY2hpcF9pZGVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJICAgICAgIHN0cnVjdCB2NGwyX2RiZ19jaGlwX2lkZW50ICppZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisKKwlpZiAoaWQtPm1hdGNoLnR5cGUgIT0gVjRMMl9DSElQX01BVENIX0kyQ19BRERSKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChpZC0+bWF0Y2guYWRkciAhPSBjbGllbnQtPmFkZHIpCisJCXJldHVybiAtRU5PREVWOworCisJaWQtPmlkZW50CT0gVjRMMl9JREVOVF9PVjU2NDI7CisJaWQtPnJldmlzaW9uCT0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92NTY0Ml9nX2Nyb3Aoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3JvcCAqYSkKK3sKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0ID0gJmEtPmM7CisKKwlhLT50eXBlCQk9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwlyZWN0LT50b3AJPSAwOworCXJlY3QtPmxlZnQJPSAwOworCXJlY3QtPndpZHRoCT0gT1Y1NjQyX1dJRFRIOworCXJlY3QtPmhlaWdodAk9IE9WNTY0Ml9IRUlHSFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdjU2NDJfY3JvcGNhcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jcm9wY2FwICphKQoreworCWEtPmJvdW5kcy5sZWZ0CQkJPSAwOworCWEtPmJvdW5kcy50b3AJCQk9IDA7CisJYS0+Ym91bmRzLndpZHRoCQkJPSBPVjU2NDJfV0lEVEg7CisJYS0+Ym91bmRzLmhlaWdodAkJPSBPVjU2NDJfSEVJR0hUOworCWEtPmRlZnJlY3QJCQk9IGEtPmJvdW5kczsKKwlhLT50eXBlCQkJCT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCWEtPnBpeGVsYXNwZWN0Lm51bWVyYXRvcgk9IDE7CisJYS0+cGl4ZWxhc3BlY3QuZGVub21pbmF0b3IJPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG92NTY0Ml9zdWJkZXZfdmlkZW9fb3BzID0geworCS5zX21idXNfZm10CT0gb3Y1NjQyX3NfZm10LAorCS5nX21idXNfZm10CT0gb3Y1NjQyX2dfZm10LAorCS50cnlfbWJ1c19mbXQJPSBvdjU2NDJfdHJ5X2ZtdCwKKwkuZW51bV9tYnVzX2ZtdAk9IG92NTY0Ml9lbnVtX2ZtdCwKKwkuZ19jcm9wCQk9IG92NTY0Ml9nX2Nyb3AsCisJLmNyb3BjYXAJPSBvdjU2NDJfY3JvcGNhcCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgb3Y1NjQyX3N1YmRldl9jb3JlX29wcyA9IHsKKwkuZ19jaGlwX2lkZW50CT0gb3Y1NjQyX2dfY2hpcF9pZGVudCwKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCisJLmdfcmVnaXN0ZXIJPSBvdjU2NDJfZ2V0X3JlZ2lzdGVyLAorCS5zX3JlZ2lzdGVyCT0gb3Y1NjQyX3NldF9yZWdpc3RlciwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgb3Y1NjQyX3N1YmRldl9vcHMgPSB7CisJLmNvcmUJPSAmb3Y1NjQyX3N1YmRldl9jb3JlX29wcywKKwkudmlkZW8JPSAmb3Y1NjQyX3N1YmRldl92aWRlb19vcHMsCit9OworCisvKgorICogV2UgaGF2ZSB0byBwcm92aWRlIHNvYy1jYW1lcmEgb3BlcmF0aW9ucywgYnV0IHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8gc2F5CisgKiB0aGVyZS4gVGhlIE1JUEkgQ1NJMiBkcml2ZXIgd2lsbCBwcm92aWRlIC5xdWVyeV9idXNfcGFyYW0gYW5kIC5zZXRfYnVzX3BhcmFtCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNvY19vdjU2NDJfcXVlcnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvY19vdjU2NDJfc2V0X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCQkgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX29wcyBzb2Nfb3Y1NjQyX29wcyA9IHsKKwkucXVlcnlfYnVzX3BhcmFtCT0gc29jX292NTY0Ml9xdWVyeV9idXNfcGFyYW0sCisJLnNldF9idXNfcGFyYW0JCT0gc29jX292NTY0Ml9zZXRfYnVzX3BhcmFtLAorfTsKKworc3RhdGljIGludCBvdjU2NDJfdmlkZW9fcHJvYmUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkgICAgICBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCByZXQ7CisJdTggaWRfaGlnaCwgaWRfbG93OworCXUxNiBpZDsKKworCS8qIFJlYWQgc2Vuc29yIE1vZGVsIElEICovCisJcmV0ID0gcmVnX3JlYWQoY2xpZW50LCBSRUdfQ0hJUF9JRF9ISUdILCAmaWRfaGlnaCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZCA9IGlkX2hpZ2ggPDwgODsKKworCXJldCA9IHJlZ19yZWFkKGNsaWVudCwgUkVHX0NISVBfSURfTE9XLCAmaWRfbG93KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlkIHw9IGlkX2xvdzsKKworCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIkNoaXAgSUQgMHglMDR4IGRldGVjdGVkXG4iLCBpZCk7CisKKwlpZiAoaWQgIT0gMHg1NjQyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92NTY0Ml9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmRpZCkKK3sKKwlzdHJ1Y3Qgb3Y1NjQyICpwcml2OworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2w7CisJaW50IHJldDsKKworCWlmICghaWNkKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiT1Y1NjQyOiBtaXNzaW5nIHNvYy1jYW1lcmEgZGF0YSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKKwlpZiAoIWljbCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIk9WNTY0MjogbWlzc2luZyBwbGF0Zm9ybSBkYXRhIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb3Y1NjQyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXY0bDJfaTJjX3N1YmRldl9pbml0KCZwcml2LT5zdWJkZXYsIGNsaWVudCwgJm92NTY0Ml9zdWJkZXZfb3BzKTsKKworCWljZC0+b3BzCT0gJnNvY19vdjU2NDJfb3BzOworCXByaXYtPmZtdAk9ICZvdjU2NDJfY29sb3VyX2ZtdHNbMF07CisKKwlyZXQgPSBvdjU2NDJfdmlkZW9fcHJvYmUoaWNkLCBjbGllbnQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWljZC0+b3BzID0gTlVMTDsKKwlrZnJlZShwcml2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG92NTY0Ml9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3Qgb3Y1NjQyICpwcml2ID0gdG9fb3Y1NjQyKGNsaWVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOworCisJaWNkLT5vcHMgPSBOVUxMOworCWlmIChpY2wtPmZyZWVfYnVzKQorCQlpY2wtPmZyZWVfYnVzKGljbCk7CisJa2ZyZWUocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG92NTY0Ml9pZFtdID0geworCXsgIm92NTY0MiIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgb3Y1NjQyX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG92NTY0Ml9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm92NTY0MiIsCisJfSwKKwkucHJvYmUJCT0gb3Y1NjQyX3Byb2JlLAorCS5yZW1vdmUJCT0gb3Y1NjQyX3JlbW92ZSwKKwkuaWRfdGFibGUJPSBvdjU2NDJfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBvdjU2NDJfbW9kX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJm92NTY0Ml9pMmNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG92NTY0Ml9tb2RfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZvdjU2NDJfaTJjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG92NTY0Ml9tb2RfaW5pdCk7Cittb2R1bGVfZXhpdChvdjU2NDJfbW9kX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk9tbml2aXNpb24gT1Y1NjQyIENhbWVyYSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkJhc3RpYW4gSGVjaHQgPGhlY2h0YkBnbWFpbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzY3MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjc2NzAuYwppbmRleCBkNGU3YzExLi44YWEwNTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzY3MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NjcwLmMKQEAgLTE5LDggKzE5LDcgQEAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVkaWFidXMuaD4KLQotI2luY2x1ZGUgIm92NzY3MC5oIgorI2luY2x1ZGUgPG1lZGlhL292NzY3MC5oPgogCiBNT0RVTEVfQVVUSE9SKCJKb25hdGhhbiBDb3JiZXQgPGNvcmJldEBsd24ubmV0PiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBIGxvdy1sZXZlbCBkcml2ZXIgZm9yIE9tbmlWaXNpb24gb3Y3NjcwIHNlbnNvcnMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NzJ4LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzcyeC5jCmluZGV4IDQ4ODk1ZWYuLjM5Nzg3MGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NzJ4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjc3MnguYwpAQCAtMTAzMiwxMyArMTAzMiw5IEBACiAJdTggICAgICAgICAgICAgICAgICBwaWQsIHZlcjsKIAljb25zdCBjaGFyICAgICAgICAgKmRldm5hbWU7CiAKLQkvKgotCSAqIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuCi0JICogU28gdGhpcyBlbnRpcmUgdGVzdCBpcyBjb21wbGV0ZWx5IHJlZHVuZGFudC4KLQkgKi8KLQlpZiAoIWljZC0+ZGV2LnBhcmVudCB8fAotCSAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJLyogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4gKi8KKwlCVUdfT04oIWljZC0+cGFyZW50IHx8CisJICAgICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpOwogCiAJLyoKIAkgKiBjaGVjayBhbmQgc2hvdyBwcm9kdWN0IElEIGFuZCBtYW51ZmFjdHVyZXIgSUQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y5NjQwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292OTY0MC5jCmluZGV4IDUxNzNhYzQuLjM2ODFhNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y5NjQwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjk2NDAuYwpAQCAtNjU3LDE2ICs2NTcsOSBAQAogCWNvbnN0IGNoYXIJKmRldm5hbWU7CiAJaW50CQlyZXQgPSAwOwogCi0JLyoKLQkgKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLgotCSAqIFNvIHRoaXMgZW50aXJlIHRlc3QgaXMgY29tcGxldGVseSByZWR1bmRhbnQuCi0JICovCi0JaWYgKCFpY2QtPmRldi5wYXJlbnQgfHwKLQkgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJQYXJlbnQgbWlzc2luZyBvciBpbnZhbGlkIVxuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyOwotCX0KKwkvKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLiAqLworCUJVR19PTighaWNkLT5wYXJlbnQgfHwKKwkgICAgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSk7CiAKIAkvKgogCSAqIGNoZWNrIGFuZCBzaG93IHByb2R1Y3QgSUQgYW5kIG1hbnVmYWN0dXJlciBJRApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjk3NDAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y5NzQwLmMKaW5kZXggNGQ0ZWU0Zi4uZWRkMWZmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjk3NDAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292OTc0MC5jCkBAIC00NCwxMiArNDQsMTIgQEAKICNkZWZpbmUgT1Y5NzQwX1lfQUREUl9TVEFSVF9MTwkJMHgwMzQ3CiAjZGVmaW5lIE9WOTc0MF9YX0FERFJfRU5EX0hJCQkweDAzNDgKICNkZWZpbmUgT1Y5NzQwX1hfQUREUl9FTkRfTE8JCTB4MDM0OQotI2RlZmluZSBPVjk3NDBfWV9BRERSX0VORF9ISQkJMHgwMzRBCi0jZGVmaW5lIE9WOTc0MF9ZX0FERFJfRU5EX0xPCQkweDAzNEIKLSNkZWZpbmUgT1Y5NzQwX1hfT1VUUFVUX1NJWkVfSEkJCTB4MDM0QwotI2RlZmluZSBPVjk3NDBfWF9PVVRQVVRfU0laRV9MTwkJMHgwMzRECi0jZGVmaW5lIE9WOTc0MF9ZX09VVFBVVF9TSVpFX0hJCQkweDAzNEUKLSNkZWZpbmUgT1Y5NzQwX1lfT1VUUFVUX1NJWkVfTE8JCTB4MDM0RgorI2RlZmluZSBPVjk3NDBfWV9BRERSX0VORF9ISQkJMHgwMzRhCisjZGVmaW5lIE9WOTc0MF9ZX0FERFJfRU5EX0xPCQkweDAzNGIKKyNkZWZpbmUgT1Y5NzQwX1hfT1VUUFVUX1NJWkVfSEkJCTB4MDM0YworI2RlZmluZSBPVjk3NDBfWF9PVVRQVVRfU0laRV9MTwkJMHgwMzRkCisjZGVmaW5lIE9WOTc0MF9ZX09VVFBVVF9TSVpFX0hJCQkweDAzNGUKKyNkZWZpbmUgT1Y5NzQwX1lfT1VUUFVUX1NJWkVfTE8JCTB4MDM0ZgogCiAvKiBJTyBDb250cm9sIFJlZ2lzdGVycyAqLwogI2RlZmluZSBPVjk3NDBfSU9fQ1JFTDAwCQkweDMwMDIKQEAgLTY4LDYgKzY4LDcgQEAKICNkZWZpbmUgT1Y5NzQwX0FOQUxPR19DVFJMMDQJCTB4MzYwNAogI2RlZmluZSBPVjk3NDBfQU5BTE9HX0NUUkwxMAkJMHgzNjEwCiAjZGVmaW5lIE9WOTc0MF9BTkFMT0dfQ1RSTDEyCQkweDM2MTIKKyNkZWZpbmUgT1Y5NzQwX0FOQUxPR19DVFJMMTUJCTB4MzYxNQogI2RlZmluZSBPVjk3NDBfQU5BTE9HX0NUUkwyMAkJMHgzNjIwCiAjZGVmaW5lIE9WOTc0MF9BTkFMT0dfQ1RSTDIxCQkweDM2MjEKICNkZWZpbmUgT1Y5NzQwX0FOQUxPR19DVFJMMjIJCTB4MzYyMgpAQCAtODksMjggKzkwLDI4IEBACiAjZGVmaW5lIE9WOTc0MF9USU1JTkdfQ1RSTDM1CQkweDM4MzUKIAogLyogQmFuZGluZyBGaWx0ZXIgKi8KLSNkZWZpbmUgT1Y5NzQwX0FFQ19NQVhFWFBPXzYwX0gJCTB4M0EwMgotI2RlZmluZSBPVjk3NDBfQUVDX01BWEVYUE9fNjBfTAkJMHgzQTAzCi0jZGVmaW5lIE9WOTc0MF9BRUNfQjUwX1NURVBfSEkJCTB4M0EwOAotI2RlZmluZSBPVjk3NDBfQUVDX0I1MF9TVEVQX0xPCQkweDNBMDkKLSNkZWZpbmUgT1Y5NzQwX0FFQ19CNjBfU1RFUF9ISQkJMHgzQTBBCi0jZGVmaW5lIE9WOTc0MF9BRUNfQjYwX1NURVBfTE8JCTB4M0EwQgotI2RlZmluZSBPVjk3NDBfQUVDX0NUUkwwRAkJMHgzQTBECi0jZGVmaW5lIE9WOTc0MF9BRUNfQ1RSTDBFCQkweDNBMEUKLSNkZWZpbmUgT1Y5NzQwX0FFQ19NQVhFWFBPXzUwX0gJCTB4M0ExNAotI2RlZmluZSBPVjk3NDBfQUVDX01BWEVYUE9fNTBfTAkJMHgzQTE1CisjZGVmaW5lIE9WOTc0MF9BRUNfTUFYRVhQT182MF9ICQkweDNhMDIKKyNkZWZpbmUgT1Y5NzQwX0FFQ19NQVhFWFBPXzYwX0wJCTB4M2EwMworI2RlZmluZSBPVjk3NDBfQUVDX0I1MF9TVEVQX0hJCQkweDNhMDgKKyNkZWZpbmUgT1Y5NzQwX0FFQ19CNTBfU1RFUF9MTwkJMHgzYTA5CisjZGVmaW5lIE9WOTc0MF9BRUNfQjYwX1NURVBfSEkJCTB4M2EwYQorI2RlZmluZSBPVjk3NDBfQUVDX0I2MF9TVEVQX0xPCQkweDNhMGIKKyNkZWZpbmUgT1Y5NzQwX0FFQ19DVFJMMEQJCTB4M2EwZAorI2RlZmluZSBPVjk3NDBfQUVDX0NUUkwwRQkJMHgzYTBlCisjZGVmaW5lIE9WOTc0MF9BRUNfTUFYRVhQT181MF9ICQkweDNhMTQKKyNkZWZpbmUgT1Y5NzQwX0FFQ19NQVhFWFBPXzUwX0wJCTB4M2ExNQogCiAvKiBBRUMvQUdDIENvbnRyb2wgKi8KICNkZWZpbmUgT1Y5NzQwX0FFQ19FTkFCTEUJCTB4MzUwMwotI2RlZmluZSBPVjk3NDBfR0FJTl9DRUlMSU5HXzAxCQkweDNBMTgKLSNkZWZpbmUgT1Y5NzQwX0dBSU5fQ0VJTElOR18wMgkJMHgzQTE5Ci0jZGVmaW5lIE9WOTc0MF9BRUNfSElfVEhSRVNIT0xECQkweDNBMTEKLSNkZWZpbmUgT1Y5NzQwX0FFQ18zQTFBCQkJMHgzQTFBCi0jZGVmaW5lIE9WOTc0MF9BRUNfQ1RSTDFCX1dQVDIJCTB4M0ExQgotI2RlZmluZSBPVjk3NDBfQUVDX0NUUkwwRl9XUFQJCTB4M0EwRgotI2RlZmluZSBPVjk3NDBfQUVDX0NUUkwxMF9CUFQJCTB4M0ExMAotI2RlZmluZSBPVjk3NDBfQUVDX0NUUkwxRV9CUFQyCQkweDNBMUUKLSNkZWZpbmUgT1Y5NzQwX0FFQ19MT19USFJFU0hPTEQJCTB4M0ExRgorI2RlZmluZSBPVjk3NDBfR0FJTl9DRUlMSU5HXzAxCQkweDNhMTgKKyNkZWZpbmUgT1Y5NzQwX0dBSU5fQ0VJTElOR18wMgkJMHgzYTE5CisjZGVmaW5lIE9WOTc0MF9BRUNfSElfVEhSRVNIT0xECQkweDNhMTEKKyNkZWZpbmUgT1Y5NzQwX0FFQ18zQTFBCQkJMHgzYTFhCisjZGVmaW5lIE9WOTc0MF9BRUNfQ1RSTDFCX1dQVDIJCTB4M2ExYgorI2RlZmluZSBPVjk3NDBfQUVDX0NUUkwwRl9XUFQJCTB4M2EwZgorI2RlZmluZSBPVjk3NDBfQUVDX0NUUkwxMF9CUFQJCTB4M2ExMAorI2RlZmluZSBPVjk3NDBfQUVDX0NUUkwxRV9CUFQyCQkweDNhMWUKKyNkZWZpbmUgT1Y5NzQwX0FFQ19MT19USFJFU0hPTEQJCTB4M2ExZgogCiAvKiBCTEMgQ29udHJvbCAqLwogI2RlZmluZSBPVjk3NDBfQkxDX0FVVE9fRU5BQkxFCQkweDQwMDIKQEAgLTEzMiw3ICsxMzMsNyBAQAogI2RlZmluZSBPVjk3NDBfVlRfU1lTX0NMS19ESVYJCTB4MDMwMwogI2RlZmluZSBPVjk3NDBfVlRfUElYX0NMS19ESVYJCTB4MDMwMQogI2RlZmluZSBPVjk3NDBfUExMX0NUUkwzMDEwCQkweDMwMTAKLSNkZWZpbmUgT1Y5NzQwX1ZGSUZPX0NUUkwwMAkJMHg0NjBFCisjZGVmaW5lIE9WOTc0MF9WRklGT19DVFJMMDAJCTB4NDYwZQogCiAvKiBJU1AgQ29udHJvbCAqLwogI2RlZmluZSBPVjk3NDBfSVNQX0NUUkwwMAkJMHg1MDAwCkBAIC0xNDEsOSArMTQyLDkgQEAKICNkZWZpbmUgT1Y5NzQwX0lTUF9DVFJMMDUJCTB4NTAwNQogI2RlZmluZSBPVjk3NDBfSVNQX0NUUkwxMgkJMHg1MDEyCiAjZGVmaW5lIE9WOTc0MF9JU1BfQ1RSTDE5CQkweDUwMTkKLSNkZWZpbmUgT1Y5NzQwX0lTUF9DVFJMMUEJCTB4NTAxQQotI2RlZmluZSBPVjk3NDBfSVNQX0NUUkwxRQkJMHg1MDFFCi0jZGVmaW5lIE9WOTc0MF9JU1BfQ1RSTDFGCQkweDUwMUYKKyNkZWZpbmUgT1Y5NzQwX0lTUF9DVFJMMUEJCTB4NTAxYQorI2RlZmluZSBPVjk3NDBfSVNQX0NUUkwxRQkJMHg1MDFlCisjZGVmaW5lIE9WOTc0MF9JU1BfQ1RSTDFGCQkweDUwMWYKICNkZWZpbmUgT1Y5NzQwX0lTUF9DVFJMMjAJCTB4NTAyMAogI2RlZmluZSBPVjk3NDBfSVNQX0NUUkwyMQkJMHg1MDIxCiAKQEAgLTE1OCwxMiArMTU5LDEyIEBACiAjZGVmaW5lIE9WOTc0MF9BV0JfQURWX0NUUkwwNAkJMHg1MTg3CiAjZGVmaW5lIE9WOTc0MF9BV0JfQURWX0NUUkwwNQkJMHg1MTg4CiAjZGVmaW5lIE9WOTc0MF9BV0JfQURWX0NUUkwwNgkJMHg1MTg5Ci0jZGVmaW5lIE9WOTc0MF9BV0JfQURWX0NUUkwwNwkJMHg1MThBCi0jZGVmaW5lIE9WOTc0MF9BV0JfQURWX0NUUkwwOAkJMHg1MThCCi0jZGVmaW5lIE9WOTc0MF9BV0JfQURWX0NUUkwwOQkJMHg1MThDCi0jZGVmaW5lIE9WOTc0MF9BV0JfQURWX0NUUkwxMAkJMHg1MThECi0jZGVmaW5lIE9WOTc0MF9BV0JfQURWX0NUUkwxMQkJMHg1MThFCi0jZGVmaW5lIE9WOTc0MF9BV0JfQ1RSTDBGCQkweDUxOEYKKyNkZWZpbmUgT1Y5NzQwX0FXQl9BRFZfQ1RSTDA3CQkweDUxOGEKKyNkZWZpbmUgT1Y5NzQwX0FXQl9BRFZfQ1RSTDA4CQkweDUxOGIKKyNkZWZpbmUgT1Y5NzQwX0FXQl9BRFZfQ1RSTDA5CQkweDUxOGMKKyNkZWZpbmUgT1Y5NzQwX0FXQl9BRFZfQ1RSTDEwCQkweDUxOGQKKyNkZWZpbmUgT1Y5NzQwX0FXQl9BRFZfQ1RSTDExCQkweDUxOGUKKyNkZWZpbmUgT1Y5NzQwX0FXQl9DVFJMMEYJCTB4NTE4ZgogI2RlZmluZSBPVjk3NDBfQVdCX0NUUkwxMAkJMHg1MTkwCiAjZGVmaW5lIE9WOTc0MF9BV0JfQ1RSTDExCQkweDUxOTEKICNkZWZpbmUgT1Y5NzQwX0FXQl9DVFJMMTIJCTB4NTE5MgpAQCAtMTgwLDI3ICsxODEsOCBAQAogI2RlZmluZSBPVjk3NDBfTUlQSV9DVFJMXzMwMTIJCTB4MzAxMgogI2RlZmluZSBPVjk3NDBfU0NfQ01NTV9NSVBJX0NUUgkJMHgzMDE0CiAKLS8qIHN1cHBvcnRlZCByZXNvbHV0aW9ucyAqLwotZW51bSB7Ci0JT1Y5NzQwX1ZHQSwKLQlPVjk3NDBfNzIwUCwKLX07Ci0KLXN0cnVjdCBvdjk3NDBfcmVzb2x1dGlvbiB7Ci0JdW5zaWduZWQgaW50IHdpZHRoOwotCXVuc2lnbmVkIGludCBoZWlnaHQ7Ci19OwotCi1zdGF0aWMgc3RydWN0IG92OTc0MF9yZXNvbHV0aW9uIG92OTc0MF9yZXNvbHV0aW9uc1tdID0gewotCVtPVjk3NDBfVkdBXSA9IHsKLQkJLndpZHRoCT0gNjQwLAotCQkuaGVpZ2h0CT0gNDgwLAotCX0sCi0JW09WOTc0MF83MjBQXSA9IHsKLQkJLndpZHRoCT0gMTI4MCwKLQkJLmhlaWdodAk9IDcyMCwKLQl9LAotfTsKKyNkZWZpbmUgT1Y5NzQwX01BWF9XSURUSAkJMTI4MAorI2RlZmluZSBPVjk3NDBfTUFYX0hFSUdIVAkJNzIwCiAKIC8qIE1pc2MuIHN0cnVjdHVyZXMgKi8KIHN0cnVjdCBvdjk3NDBfcmVnIHsKQEAgLTIxOSw5ICsyMDEsMTYgQEAKIAogCWJvb2wJCQkJZmxhZ192ZmxpcDsKIAlib29sCQkJCWZsYWdfaGZsaXA7CisKKwkvKiBGb3Igc3VzcGVuZC9yZXN1bWUuICovCisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdAljdXJyZW50X21mOworCWJvb2wJCQkJY3VycmVudF9lbmFibGU7CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG92OTc0MF9yZWcgb3Y5NzQwX2RlZmF1bHRzW10gPSB7CisJLyogU29mdHdhcmUgUmVzZXQgKi8KKwl7IE9WOTc0MF9TT0ZUV0FSRV9SRVNFVCwJMHgwMSB9LAorCiAJLyogQmFuZGluZyBGaWx0ZXIgKi8KIAl7IE9WOTc0MF9BRUNfQjUwX1NURVBfSEksCTB4MDAgfSwKIAl7IE9WOTc0MF9BRUNfQjUwX1NURVBfTE8sCTB4ZTggfSwKQEAgLTI0MSwzNiArMjMwLDM2IEBACiAJLyogVW4tZG9jdW1lbnRlZCBPVjk3NDAgcmVnaXN0ZXJzICovCiAJeyAweDU4MDAsIDB4MjkgfSwgeyAweDU4MDEsIDB4MjUgfSwgeyAweDU4MDIsIDB4MjAgfSwgeyAweDU4MDMsIDB4MjEgfSwKIAl7IDB4NTgwNCwgMHgyNiB9LCB7IDB4NTgwNSwgMHgyZSB9LCB7IDB4NTgwNiwgMHgxMSB9LCB7IDB4NTgwNywgMHgwYyB9LAotCXsgMHg1ODA4LCAweDA5IH0sIHsgMHg1ODA5LCAweDBhIH0sIHsgMHg1ODBBLCAweDBlIH0sIHsgMHg1ODBCLCAweDE2IH0sCi0JeyAweDU4MEMsIDB4MDYgfSwgeyAweDU4MEQsIDB4MDIgfSwgeyAweDU4MEUsIDB4MDAgfSwgeyAweDU4MEYsIDB4MDAgfSwKKwl7IDB4NTgwOCwgMHgwOSB9LCB7IDB4NTgwOSwgMHgwYSB9LCB7IDB4NTgwYSwgMHgwZSB9LCB7IDB4NTgwYiwgMHgxNiB9LAorCXsgMHg1ODBjLCAweDA2IH0sIHsgMHg1ODBkLCAweDAyIH0sIHsgMHg1ODBlLCAweDAwIH0sIHsgMHg1ODBmLCAweDAwIH0sCiAJeyAweDU4MTAsIDB4MDQgfSwgeyAweDU4MTEsIDB4MGEgfSwgeyAweDU4MTIsIDB4MDUgfSwgeyAweDU4MTMsIDB4MDIgfSwKIAl7IDB4NTgxNCwgMHgwMCB9LCB7IDB4NTgxNSwgMHgwMCB9LCB7IDB4NTgxNiwgMHgwMyB9LCB7IDB4NTgxNywgMHgwOSB9LAotCXsgMHg1ODE4LCAweDBmIH0sIHsgMHg1ODE5LCAweDBhIH0sIHsgMHg1ODFBLCAweDA3IH0sIHsgMHg1ODFCLCAweDA4IH0sCi0JeyAweDU4MUMsIDB4MGIgfSwgeyAweDU4MUQsIDB4MTQgfSwgeyAweDU4MUUsIDB4MjggfSwgeyAweDU4MUYsIDB4MjMgfSwKKwl7IDB4NTgxOCwgMHgwZiB9LCB7IDB4NTgxOSwgMHgwYSB9LCB7IDB4NTgxYSwgMHgwNyB9LCB7IDB4NTgxYiwgMHgwOCB9LAorCXsgMHg1ODFjLCAweDBiIH0sIHsgMHg1ODFkLCAweDE0IH0sIHsgMHg1ODFlLCAweDI4IH0sIHsgMHg1ODFmLCAweDIzIH0sCiAJeyAweDU4MjAsIDB4MWQgfSwgeyAweDU4MjEsIDB4MWUgfSwgeyAweDU4MjIsIDB4MjQgfSwgeyAweDU4MjMsIDB4MmEgfSwKIAl7IDB4NTgyNCwgMHg0ZiB9LCB7IDB4NTgyNSwgMHg2ZiB9LCB7IDB4NTgyNiwgMHg1ZiB9LCB7IDB4NTgyNywgMHg3ZiB9LAotCXsgMHg1ODI4LCAweDlmIH0sIHsgMHg1ODI5LCAweDVmIH0sIHsgMHg1ODJBLCAweDhmIH0sIHsgMHg1ODJCLCAweDllIH0sCi0JeyAweDU4MkMsIDB4OGYgfSwgeyAweDU4MkQsIDB4OWYgfSwgeyAweDU4MkUsIDB4NGYgfSwgeyAweDU4MkYsIDB4ODcgfSwKKwl7IDB4NTgyOCwgMHg5ZiB9LCB7IDB4NTgyOSwgMHg1ZiB9LCB7IDB4NTgyYSwgMHg4ZiB9LCB7IDB4NTgyYiwgMHg5ZSB9LAorCXsgMHg1ODJjLCAweDhmIH0sIHsgMHg1ODJkLCAweDlmIH0sIHsgMHg1ODJlLCAweDRmIH0sIHsgMHg1ODJmLCAweDg3IH0sCiAJeyAweDU4MzAsIDB4ODYgfSwgeyAweDU4MzEsIDB4OTcgfSwgeyAweDU4MzIsIDB4YWUgfSwgeyAweDU4MzMsIDB4M2YgfSwKIAl7IDB4NTgzNCwgMHg4ZSB9LCB7IDB4NTgzNSwgMHg3YyB9LCB7IDB4NTgzNiwgMHg3ZSB9LCB7IDB4NTgzNywgMHhhZiB9LAotCXsgMHg1ODM4LCAweDhmIH0sIHsgMHg1ODM5LCAweDhmIH0sIHsgMHg1ODNBLCAweDlmIH0sIHsgMHg1ODNCLCAweDdmIH0sCi0JeyAweDU4M0MsIDB4NWYgfSwKKwl7IDB4NTgzOCwgMHg4ZiB9LCB7IDB4NTgzOSwgMHg4ZiB9LCB7IDB4NTgzYSwgMHg5ZiB9LCB7IDB4NTgzYiwgMHg3ZiB9LAorCXsgMHg1ODNjLCAweDVmIH0sCiAKIAkvKiBZIEdhbW1hICovCiAJeyAweDU0ODAsIDB4MDcgfSwgeyAweDU0ODEsIDB4MTggfSwgeyAweDU0ODIsIDB4MmMgfSwgeyAweDU0ODMsIDB4NGUgfSwKIAl7IDB4NTQ4NCwgMHg1ZSB9LCB7IDB4NTQ4NSwgMHg2YiB9LCB7IDB4NTQ4NiwgMHg3NyB9LCB7IDB4NTQ4NywgMHg4MiB9LAotCXsgMHg1NDg4LCAweDhjIH0sIHsgMHg1NDg5LCAweDk1IH0sIHsgMHg1NDhBLCAweGE0IH0sIHsgMHg1NDhCLCAweGIxIH0sCi0JeyAweDU0OEMsIDB4YzYgfSwgeyAweDU0OEQsIDB4ZDggfSwgeyAweDU0OEUsIDB4ZTkgfSwKKwl7IDB4NTQ4OCwgMHg4YyB9LCB7IDB4NTQ4OSwgMHg5NSB9LCB7IDB4NTQ4YSwgMHhhNCB9LCB7IDB4NTQ4YiwgMHhiMSB9LAorCXsgMHg1NDhjLCAweGM2IH0sIHsgMHg1NDhkLCAweGQ4IH0sIHsgMHg1NDhlLCAweGU5IH0sCiAKIAkvKiBVViBHYW1tYSAqLwogCXsgMHg1NDkwLCAweDBmIH0sIHsgMHg1NDkxLCAweGZmIH0sIHsgMHg1NDkyLCAweDBkIH0sIHsgMHg1NDkzLCAweDA1IH0sCiAJeyAweDU0OTQsIDB4MDcgfSwgeyAweDU0OTUsIDB4MWEgfSwgeyAweDU0OTYsIDB4MDQgfSwgeyAweDU0OTcsIDB4MDEgfSwKLQl7IDB4NTQ5OCwgMHgwMyB9LCB7IDB4NTQ5OSwgMHg1MyB9LCB7IDB4NTQ5QSwgMHgwMiB9LCB7IDB4NTQ5QiwgMHhlYiB9LAotCXsgMHg1NDlDLCAweDAyIH0sIHsgMHg1NDlELCAweGEwIH0sIHsgMHg1NDlFLCAweDAyIH0sIHsgMHg1NDlGLCAweDY3IH0sCi0JeyAweDU0QTAsIDB4MDIgfSwgeyAweDU0QTEsIDB4M2IgfSwgeyAweDU0QTIsIDB4MDIgfSwgeyAweDU0QTMsIDB4MTggfSwKLQl7IDB4NTRBNCwgMHgwMSB9LCB7IDB4NTRBNSwgMHhlNyB9LCB7IDB4NTRBNiwgMHgwMSB9LCB7IDB4NTRBNywgMHhjMyB9LAotCXsgMHg1NEE4LCAweDAxIH0sIHsgMHg1NEE5LCAweDk0IH0sIHsgMHg1NEFBLCAweDAxIH0sIHsgMHg1NEFCLCAweDcyIH0sCi0JeyAweDU0QUMsIDB4MDEgfSwgeyAweDU0QUQsIDB4NTcgfSwKKwl7IDB4NTQ5OCwgMHgwMyB9LCB7IDB4NTQ5OSwgMHg1MyB9LCB7IDB4NTQ5YSwgMHgwMiB9LCB7IDB4NTQ5YiwgMHhlYiB9LAorCXsgMHg1NDljLCAweDAyIH0sIHsgMHg1NDlkLCAweGEwIH0sIHsgMHg1NDllLCAweDAyIH0sIHsgMHg1NDlmLCAweDY3IH0sCisJeyAweDU0YTAsIDB4MDIgfSwgeyAweDU0YTEsIDB4M2IgfSwgeyAweDU0YTIsIDB4MDIgfSwgeyAweDU0YTMsIDB4MTggfSwKKwl7IDB4NTRhNCwgMHgwMSB9LCB7IDB4NTRhNSwgMHhlNyB9LCB7IDB4NTRhNiwgMHgwMSB9LCB7IDB4NTRhNywgMHhjMyB9LAorCXsgMHg1NGE4LCAweDAxIH0sIHsgMHg1NGE5LCAweDk0IH0sIHsgMHg1NGFhLCAweDAxIH0sIHsgMHg1NGFiLCAweDcyIH0sCisJeyAweDU0YWMsIDB4MDEgfSwgeyAweDU0YWQsIDB4NTcgfSwKIAogCS8qIEFXQiAqLwogCXsgT1Y5NzQwX0FXQl9DVFJMMDAsCQkweGYwIH0sCkBAIC0yOTYsMTggKzI4NSwxOCBAQAogCXsgT1Y5NzQwX0FXQl9DVFJMMTQsCQkweDAwIH0sCiAKIAkvKiBDSVAgKi8KLQl7IDB4NTMwRCwgMHgxMiB9LAorCXsgMHg1MzBkLCAweDEyIH0sCiAKIAkvKiBDTVggKi8KIAl7IDB4NTM4MCwgMHgwMSB9LCB7IDB4NTM4MSwgMHgwMCB9LCB7IDB4NTM4MiwgMHgwMCB9LCB7IDB4NTM4MywgMHgxNyB9LAogCXsgMHg1Mzg0LCAweDAwIH0sIHsgMHg1Mzg1LCAweDAxIH0sIHsgMHg1Mzg2LCAweDAwIH0sIHsgMHg1Mzg3LCAweDAwIH0sCi0JeyAweDUzODgsIDB4MDAgfSwgeyAweDUzODksIDB4ZTAgfSwgeyAweDUzOEEsIDB4MDAgfSwgeyAweDUzOEIsIDB4MjAgfSwKLQl7IDB4NTM4QywgMHgwMCB9LCB7IDB4NTM4RCwgMHgwMCB9LCB7IDB4NTM4RSwgMHgwMCB9LCB7IDB4NTM4RiwgMHgxNiB9LAorCXsgMHg1Mzg4LCAweDAwIH0sIHsgMHg1Mzg5LCAweGUwIH0sIHsgMHg1MzhhLCAweDAwIH0sIHsgMHg1MzhiLCAweDIwIH0sCisJeyAweDUzOGMsIDB4MDAgfSwgeyAweDUzOGQsIDB4MDAgfSwgeyAweDUzOGUsIDB4MDAgfSwgeyAweDUzOGYsIDB4MTYgfSwKIAl7IDB4NTM5MCwgMHgwMCB9LCB7IDB4NTM5MSwgMHg5YyB9LCB7IDB4NTM5MiwgMHgwMCB9LCB7IDB4NTM5MywgMHhhMCB9LAogCXsgMHg1Mzk0LCAweDE4IH0sCiAKIAkvKiA1MC82MCBEZXRlY3Rpb24gKi8KLQl7IDB4M0MwQSwgMHg5YyB9LCB7IDB4M0MwQiwgMHgzZiB9LAorCXsgMHgzYzBhLCAweDljIH0sIHsgMHgzYzBiLCAweDNmIH0sCiAKIAkvKiBPdXRwdXQgU2VsZWN0ICovCiAJeyBPVjk3NDBfSU9fT1VUUFVUX1NFTDAxLAkweDAwIH0sCkBAIC0zMzMsNiArMzIyLDcgQEAKIAl7IE9WOTc0MF9BTkFMT0dfQ1RSTDEwLAkJMHhhMSB9LAogCXsgT1Y5NzQwX0FOQUxPR19DVFJMMTIsCQkweDI0IH0sCiAJeyBPVjk3NDBfQU5BTE9HX0NUUkwyMiwJCTB4OWYgfSwKKwl7IE9WOTc0MF9BTkFMT0dfQ1RSTDE1LAkJMHhmMCB9LAogCiAJLyogU2Vuc29yIENvbnRyb2wgKi8KIAl7IE9WOTc0MF9TRU5TT1JfQ1RSTDAzLAkJMHg0MiB9LApAQCAtMzg1LDcgKzM3NSw3IEBACiAJeyBPVjk3NDBfTE5fTEVOR1RIX1BDS19MTywJMHg2MiB9LAogCiAJLyogTUlQSSBDb250cm9sICovCi0JeyBPVjk3NDBfTUlQSV9DVFJMMDAsCQkweDQ0IH0sCisJeyBPVjk3NDBfTUlQSV9DVFJMMDAsCQkweDQ0IH0sIC8qIDB4NjQgZm9yIGRpc2NvbnRpbnVvdXMgY2xrICovCiAJeyBPVjk3NDBfTUlQSV8zODM3LAkJMHgwMSB9LAogCXsgT1Y5NzQwX01JUElfQ1RSTDAxLAkJMHgwZiB9LAogCXsgT1Y5NzQwX01JUElfQ1RSTDAzLAkJMHgwNSB9LApAQCAtMzkzLDU0ICszODMsOSBAQAogCXsgT1Y5NzQwX1ZGSUZPX1JEX0NUUkwsCQkweDE2IH0sCiAJeyBPVjk3NDBfTUlQSV9DVFJMXzMwMTIsCTB4NzAgfSwKIAl7IE9WOTc0MF9TQ19DTU1NX01JUElfQ1RSLAkweDAxIH0sCi19OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG92OTc0MF9yZWcgb3Y5NzQwX3JlZ3NfdmdhW10gPSB7Ci0JeyBPVjk3NDBfWF9BRERSX1NUQVJUX0hJLAkweDAwIH0sCi0JeyBPVjk3NDBfWF9BRERSX1NUQVJUX0xPLAkweGEwIH0sCi0JeyBPVjk3NDBfWV9BRERSX1NUQVJUX0hJLAkweDAwIH0sCi0JeyBPVjk3NDBfWV9BRERSX1NUQVJUX0xPLAkweDAwIH0sCi0JeyBPVjk3NDBfWF9BRERSX0VORF9ISSwJCTB4MDQgfSwKLQl7IE9WOTc0MF9YX0FERFJfRU5EX0xPLAkJMHg2MyB9LAotCXsgT1Y5NzQwX1lfQUREUl9FTkRfSEksCQkweDAyIH0sCi0JeyBPVjk3NDBfWV9BRERSX0VORF9MTywJCTB4ZDMgfSwKLQl7IE9WOTc0MF9YX09VVFBVVF9TSVpFX0hJLAkweDAyIH0sCi0JeyBPVjk3NDBfWF9PVVRQVVRfU0laRV9MTywJMHg4MCB9LAotCXsgT1Y5NzQwX1lfT1VUUFVUX1NJWkVfSEksCTB4MDEgfSwKLQl7IE9WOTc0MF9ZX09VVFBVVF9TSVpFX0xPLAkweGUwIH0sCi0JeyBPVjk3NDBfSVNQX0NUUkwxRSwJCTB4MDMgfSwKLQl7IE9WOTc0MF9JU1BfQ1RSTDFGLAkJMHhjMCB9LAotCXsgT1Y5NzQwX0lTUF9DVFJMMjAsCQkweDAyIH0sCi0JeyBPVjk3NDBfSVNQX0NUUkwyMSwJCTB4ZDAgfSwKLQl7IE9WOTc0MF9WRklGT19SRUFEX1NUQVJUX0hJLAkweDAxIH0sCi0JeyBPVjk3NDBfVkZJRk9fUkVBRF9TVEFSVF9MTywJMHg0MCB9LAotCXsgT1Y5NzQwX0lTUF9DVFJMMDAsCQkweGZmIH0sCi0JeyBPVjk3NDBfSVNQX0NUUkwwMSwJCTB4ZmYgfSwKLQl7IE9WOTc0MF9JU1BfQ1RSTDAzLAkJMHhmZiB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvdjk3NDBfcmVnIG92OTc0MF9yZWdzXzcyMHBbXSA9IHsKLQl7IE9WOTc0MF9YX0FERFJfU1RBUlRfSEksCTB4MDAgfSwKLQl7IE9WOTc0MF9YX0FERFJfU1RBUlRfTE8sCTB4MDAgfSwKLQl7IE9WOTc0MF9ZX0FERFJfU1RBUlRfSEksCTB4MDAgfSwKLQl7IE9WOTc0MF9ZX0FERFJfU1RBUlRfTE8sCTB4MDAgfSwKLQl7IE9WOTc0MF9YX0FERFJfRU5EX0hJLAkJMHgwNSB9LAotCXsgT1Y5NzQwX1hfQUREUl9FTkRfTE8sCQkweDAzIH0sCi0JeyBPVjk3NDBfWV9BRERSX0VORF9ISSwJCTB4MDIgfSwKLQl7IE9WOTc0MF9ZX0FERFJfRU5EX0xPLAkJMHhkMyB9LAotCXsgT1Y5NzQwX1hfT1VUUFVUX1NJWkVfSEksCTB4MDUgfSwKLQl7IE9WOTc0MF9YX09VVFBVVF9TSVpFX0xPLAkweDAwIH0sCi0JeyBPVjk3NDBfWV9PVVRQVVRfU0laRV9ISSwJMHgwMiB9LAotCXsgT1Y5NzQwX1lfT1VUUFVUX1NJWkVfTE8sCTB4ZDAgfSwKLQl7IE9WOTc0MF9JU1BfQ1RSTDFFLAkJMHgwNSB9LAotCXsgT1Y5NzQwX0lTUF9DVFJMMUYsCQkweDAwIH0sCi0JeyBPVjk3NDBfSVNQX0NUUkwyMCwJCTB4MDIgfSwKLQl7IE9WOTc0MF9JU1BfQ1RSTDIxLAkJMHhkMCB9LAotCXsgT1Y5NzQwX1ZGSUZPX1JFQURfU1RBUlRfSEksCTB4MDIgfSwKLQl7IE9WOTc0MF9WRklGT19SRUFEX1NUQVJUX0xPLAkweDMwIH0sCi0JeyBPVjk3NDBfSVNQX0NUUkwwMCwJCTB4ZmYgfSwKLQl7IE9WOTc0MF9JU1BfQ1RSTDAxLAkJMHhlZiB9LAotCXsgT1Y5NzQwX0lTUF9DVFJMMDMsCQkweGZmIH0sCisJLyogWVVZViBvcmRlciAqLworCXsgT1Y5NzQwX0lTUF9DVFJMMTksCQkweDAyIH0sCiB9OwogCiBzdGF0aWMgZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIG92OTc0MF9jb2Rlc1tdID0gewpAQCAtNTM3LDcgKzQ4Miw4IEBACiAJcmV0ID0gb3Y5NzQwX3JlZ19yZWFkKGNsaWVudCwgcmVnLCAmdmFsKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKLQkJCSJbUmVhZF0tTW9kaWZ5LVdyaXRlIG9mIHJlZ2lzdGVyICUwMnggZmFpbGVkIVxuIiwgcmVnKTsKKwkJCSJbUmVhZF0tTW9kaWZ5LVdyaXRlIG9mIHJlZ2lzdGVyIDB4JTA0eCBmYWlsZWQhXG4iLAorCQkJcmVnKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTU0Nyw3ICs0OTMsOCBAQAogCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCByZWcsIHZhbCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsCi0JCQkiUmVhZC1Nb2RpZnktW1dyaXRlXSBvZiByZWdpc3RlciAlMDJ4IGZhaWxlZCFcbiIsIHJlZyk7CisJCQkiUmVhZC1Nb2RpZnktW1dyaXRlXSBvZiByZWdpc3RlciAweCUwNHggZmFpbGVkIVxuIiwKKwkJCXJlZyk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC02MDgsNiArNTU1LDggQEAKIAkJCQkJICAgICAgIDB4MDApOwogCX0KIAorCXByaXYtPmN1cnJlbnRfZW5hYmxlID0gZW5hYmxlOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjMwLDYgKzU3OSwyMTUgQEAKIAlyZXR1cm4gc29jX2NhbWVyYV9hcHBseV9zZW5zb3JfZmxhZ3MoaWNsLCBmbGFncyk7CiB9CiAKKy8qIHNlbGVjdCBuZWFyZXN0IGhpZ2hlciByZXNvbHV0aW9uIGZvciBjYXB0dXJlICovCitzdGF0aWMgdm9pZCBvdjk3NDBfcmVzX3JvdW5kdXAodTMyICp3aWR0aCwgdTMyICpoZWlnaHQpCit7CisJLyogV2lkdGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgcGl4ZWxzLiAqLworCSp3aWR0aCA9IEFMSUdOKCp3aWR0aCwgNCk7CisKKwkvKiBNYXggcmVzb2x1dGlvbiBpcyAxMjgweDcyMCAoNzIwcCkuICovCisJaWYgKCp3aWR0aCA+IE9WOTc0MF9NQVhfV0lEVEgpCisJCSp3aWR0aCA9IE9WOTc0MF9NQVhfV0lEVEg7CisKKwlpZiAoKmhlaWdodCA+IE9WOTc0MF9NQVhfSEVJR0hUKQorCQkqaGVpZ2h0ID0gT1Y5NzQwX01BWF9IRUlHSFQ7Cit9CisKKy8qIFNldHVwIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gcmVzb2x1dGlvbiBhbmQgY29sb3IgZW5jb2RpbmcgKi8KK3N0YXRpYyBpbnQgb3Y5NzQwX3NldF9yZXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTMyIHdpZHRoLCB1MzIgaGVpZ2h0KQoreworCXUzMiB4X3N0YXJ0OworCXUzMiB5X3N0YXJ0OworCXUzMiB4X2VuZDsKKwl1MzIgeV9lbmQ7CisJYm9vbCBzY2FsaW5nID0gMDsKKwl1MzIgc2NhbGVfaW5wdXRfeDsKKwl1MzIgc2NhbGVfaW5wdXRfeTsKKwlpbnQgcmV0OworCisJaWYgKCh3aWR0aCAhPSBPVjk3NDBfTUFYX1dJRFRIKSB8fCAoaGVpZ2h0ICE9IE9WOTc0MF9NQVhfSEVJR0hUKSkKKwkJc2NhbGluZyA9IDE7CisKKwkvKgorCSAqIFRyeSB0byB1c2UgYXMgbXVjaCBvZiB0aGUgc2Vuc29yIGFyZWEgYXMgcG9zc2libGUgd2hlbiBzdXBwb3J0aW5nCisJICogc21hbGxlciByZXNvbHV0aW9ucy4gIERlcGVuZGluZyBvbiB0aGUgYXNwZWN0IHJhdGlvIG9mIHRoZQorCSAqIGNob3NlbiByZXNvbHV0aW9uLCB3ZSBjYW4gZWl0aGVyIHVzZSB0aGUgZnVsbCB3aWR0aCBvZiB0aGUgc2Vuc29yLAorCSAqIG9yIHRoZSBmdWxsIGhlaWdodCBvZiB0aGUgc2Vuc29yIChvciBib3RoIGlmIHRoZSBhc3BlY3QgcmF0aW8gaXMKKwkgKiB0aGUgc2FtZSBhcyAxMjgweDcyMC4KKwkgKi8KKwlpZiAoKE9WOTc0MF9NQVhfV0lEVEggKiBoZWlnaHQpID4gKE9WOTc0MF9NQVhfSEVJR0hUICogd2lkdGgpKSB7CisJCXNjYWxlX2lucHV0X3ggPSAoT1Y5NzQwX01BWF9IRUlHSFQgKiB3aWR0aCkgLyBoZWlnaHQ7CisJCXNjYWxlX2lucHV0X3kgPSBPVjk3NDBfTUFYX0hFSUdIVDsKKwl9IGVsc2UgeworCQlzY2FsZV9pbnB1dF94ID0gT1Y5NzQwX01BWF9XSURUSDsKKwkJc2NhbGVfaW5wdXRfeSA9IChPVjk3NDBfTUFYX1dJRFRIICogaGVpZ2h0KSAvIHdpZHRoOworCX0KKworCS8qIFRoZXNlIGRlc2NyaWJlIHRoZSBhcmVhIG9mIHRoZSBzZW5zb3IgdG8gdXNlLiAqLworCXhfc3RhcnQgPSAoT1Y5NzQwX01BWF9XSURUSCAtIHNjYWxlX2lucHV0X3gpIC8gMjsKKwl5X3N0YXJ0ID0gKE9WOTc0MF9NQVhfSEVJR0hUIC0gc2NhbGVfaW5wdXRfeSkgLyAyOworCXhfZW5kID0geF9zdGFydCArIHNjYWxlX2lucHV0X3ggLSAxOworCXlfZW5kID0geV9zdGFydCArIHNjYWxlX2lucHV0X3kgLSAxOworCisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9YX0FERFJfU1RBUlRfSEksIHhfc3RhcnQgPj4gOCk7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfWF9BRERSX1NUQVJUX0xPLCB4X3N0YXJ0ICYgMHhmZik7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfWV9BRERSX1NUQVJUX0hJLCB5X3N0YXJ0ID4+IDgpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX1lfQUREUl9TVEFSVF9MTywgeV9zdGFydCAmIDB4ZmYpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfWF9BRERSX0VORF9ISSwgeF9lbmQgPj4gOCk7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfWF9BRERSX0VORF9MTywgeF9lbmQgJiAweGZmKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9ZX0FERFJfRU5EX0hJLCB5X2VuZCA+PiA4KTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9ZX0FERFJfRU5EX0xPLCB5X2VuZCAmIDB4ZmYpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfWF9PVVRQVVRfU0laRV9ISSwgd2lkdGggPj4gOCk7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfWF9PVVRQVVRfU0laRV9MTywgd2lkdGggJiAweGZmKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9ZX09VVFBVVF9TSVpFX0hJLCBoZWlnaHQgPj4gOCk7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfWV9PVVRQVVRfU0laRV9MTywgaGVpZ2h0ICYgMHhmZik7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9JU1BfQ1RSTDFFLCBzY2FsZV9pbnB1dF94ID4+IDgpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX0lTUF9DVFJMMUYsIHNjYWxlX2lucHV0X3ggJiAweGZmKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9JU1BfQ1RSTDIwLCBzY2FsZV9pbnB1dF95ID4+IDgpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX0lTUF9DVFJMMjEsIHNjYWxlX2lucHV0X3kgJiAweGZmKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX1ZGSUZPX1JFQURfU1RBUlRfSEksCisJCQkgICAgICAgKHNjYWxlX2lucHV0X3ggLSB3aWR0aCkgPj4gOCk7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfVkZJRk9fUkVBRF9TVEFSVF9MTywKKwkJCSAgICAgICAoc2NhbGVfaW5wdXRfeCAtIHdpZHRoKSAmIDB4ZmYpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfSVNQX0NUUkwwMCwgMHhmZik7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfSVNQX0NUUkwwMSwgMHhlZiB8CisJCQkJCQkJICAoc2NhbGluZyA8PCA0KSk7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfSVNQX0NUUkwwMywgMHhmZik7CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworLyogc2V0IHRoZSBmb3JtYXQgd2Ugd2lsbCBjYXB0dXJlIGluICovCitzdGF0aWMgaW50IG92OTc0MF9zX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBvdjk3NDBfcHJpdiAqcHJpdiA9IHRvX292OTc0MChzZCk7CisJZW51bSB2NGwyX2NvbG9yc3BhY2UgY3NwYWNlOworCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBjb2RlID0gbWYtPmNvZGU7CisJaW50IHJldDsKKworCW92OTc0MF9yZXNfcm91bmR1cCgmbWYtPndpZHRoLCAmbWYtPmhlaWdodCk7CisKKwlzd2l0Y2ggKGNvZGUpIHsKKwljYXNlIFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4OgorCQljc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZV9hcnJheShjbGllbnQsIG92OTc0MF9kZWZhdWx0cywKKwkJCQkgICAgIEFSUkFZX1NJWkUob3Y5NzQwX2RlZmF1bHRzKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBvdjk3NDBfc2V0X3JlcyhjbGllbnQsIG1mLT53aWR0aCwgbWYtPmhlaWdodCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwltZi0+Y29kZQk9IGNvZGU7CisJbWYtPmNvbG9yc3BhY2UJPSBjc3BhY2U7CisKKwltZW1jcHkoJnByaXYtPmN1cnJlbnRfbWYsIG1mLCBzaXplb2Yoc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCkpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvdjk3NDBfdHJ5X2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJICBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKK3sKKwlvdjk3NDBfcmVzX3JvdW5kdXAoJm1mLT53aWR0aCwgJm1mLT5oZWlnaHQpOworCisJbWYtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCW1mLT5jb2RlID0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDg7CisJbWYtPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92OTc0MF9lbnVtX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1bnNpZ25lZCBpbnQgaW5kZXgsCisJCQkgICBlbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgKmNvZGUpCit7CisJaWYgKGluZGV4ID49IEFSUkFZX1NJWkUob3Y5NzQwX2NvZGVzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqY29kZSA9IG92OTc0MF9jb2Rlc1tpbmRleF07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdjk3NDBfY3JvcGNhcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jcm9wY2FwICphKQoreworCWEtPmJvdW5kcy5sZWZ0CQk9IDA7CisJYS0+Ym91bmRzLnRvcAkJPSAwOworCWEtPmJvdW5kcy53aWR0aAkJPSBPVjk3NDBfTUFYX1dJRFRIOworCWEtPmJvdW5kcy5oZWlnaHQJPSBPVjk3NDBfTUFYX0hFSUdIVDsKKwlhLT5kZWZyZWN0CQk9IGEtPmJvdW5kczsKKwlhLT50eXBlCQkJPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJYS0+cGl4ZWxhc3BlY3QubnVtZXJhdG9yCT0gMTsKKwlhLT5waXhlbGFzcGVjdC5kZW5vbWluYXRvcgk9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdjk3NDBfZ19jcm9wKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Nyb3AgKmEpCit7CisJYS0+Yy5sZWZ0CQk9IDA7CisJYS0+Yy50b3AJCT0gMDsKKwlhLT5jLndpZHRoCQk9IE9WOTc0MF9NQVhfV0lEVEg7CisJYS0+Yy5oZWlnaHQJCT0gT1Y5NzQwX01BWF9IRUlHSFQ7CisJYS0+dHlwZQkJCT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCisJcmV0dXJuIDA7Cit9CisKIC8qIEdldCBzdGF0dXMgb2YgYWRkaXRpb25hbCBjYW1lcmEgY2FwYWJpbGl0aWVzICovCiBzdGF0aWMgaW50IG92OTc0MF9nX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKQEAgLTY4MCw2ICs4MzgsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBvdjk3NDBfc19wb3dlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgb24pCit7CisJc3RydWN0IG92OTc0MF9wcml2ICpwcml2ID0gdG9fb3Y5NzQwKHNkKTsKKworCWlmICghcHJpdi0+Y3VycmVudF9lbmFibGUpCisJCXJldHVybiAwOworCisJaWYgKG9uKSB7CisJCW92OTc0MF9zX2ZtdChzZCwgJnByaXYtPmN1cnJlbnRfbWYpOworCQlvdjk3NDBfc19zdHJlYW0oc2QsIHByaXYtPmN1cnJlbnRfZW5hYmxlKTsKKwl9IGVsc2UgeworCQlvdjk3NDBfc19zdHJlYW0oc2QsIDApOworCQlwcml2LT5jdXJyZW50X2VuYWJsZSA9IHRydWU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKICNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCiBzdGF0aWMgaW50IG92OTc0MF9nZXRfcmVnaXN0ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKIAkJCSAgICAgICBzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZykKQEAgLTcxNCwxMjcgKzg5MCw2IEBACiB9CiAjZW5kaWYKIAotLyogc2VsZWN0IG5lYXJlc3QgaGlnaGVyIHJlc29sdXRpb24gZm9yIGNhcHR1cmUgKi8KLXN0YXRpYyB2b2lkIG92OTc0MF9yZXNfcm91bmR1cCh1MzIgKndpZHRoLCB1MzIgKmhlaWdodCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG92OTc0MF9yZXNvbHV0aW9ucyk7IGkrKykKLQkJaWYgKChvdjk3NDBfcmVzb2x1dGlvbnNbaV0ud2lkdGggPj0gKndpZHRoKSAmJgotCQkgICAgKG92OTc0MF9yZXNvbHV0aW9uc1tpXS5oZWlnaHQgPj0gKmhlaWdodCkpIHsKLQkJCSp3aWR0aCA9IG92OTc0MF9yZXNvbHV0aW9uc1tpXS53aWR0aDsKLQkJCSpoZWlnaHQgPSBvdjk3NDBfcmVzb2x1dGlvbnNbaV0uaGVpZ2h0OwotCQkJcmV0dXJuOwotCQl9Ci0KLQkqd2lkdGggPSBvdjk3NDBfcmVzb2x1dGlvbnNbT1Y5NzQwXzcyMFBdLndpZHRoOwotCSpoZWlnaHQgPSBvdjk3NDBfcmVzb2x1dGlvbnNbT1Y5NzQwXzcyMFBdLmhlaWdodDsKLX0KLQotLyogU2V0dXAgcmVnaXN0ZXJzIGFjY29yZGluZyB0byByZXNvbHV0aW9uIGFuZCBjb2xvciBlbmNvZGluZyAqLwotc3RhdGljIGludCBvdjk3NDBfc2V0X3JlcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MzIgd2lkdGgpCi17Ci0JaW50IHJldDsKLQotCS8qIHNlbGVjdCByZWdpc3RlciBjb25maWd1cmF0aW9uIGZvciBnaXZlbiByZXNvbHV0aW9uICovCi0JaWYgKHdpZHRoID09IG92OTc0MF9yZXNvbHV0aW9uc1tPVjk3NDBfVkdBXS53aWR0aCkgewotCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlNldHRpbmcgaW1hZ2Ugc2l6ZSB0byA2NDB4NDgwXG4iKTsKLQkJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZV9hcnJheShjbGllbnQsIG92OTc0MF9yZWdzX3ZnYSwKLQkJCQkJICAgICBBUlJBWV9TSVpFKG92OTc0MF9yZWdzX3ZnYSkpOwotCX0gZWxzZSBpZiAod2lkdGggPT0gb3Y5NzQwX3Jlc29sdXRpb25zW09WOTc0MF83MjBQXS53aWR0aCkgewotCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlNldHRpbmcgaW1hZ2Ugc2l6ZSB0byAxMjgweDcyMFxuIik7Ci0JCXJldCA9IG92OTc0MF9yZWdfd3JpdGVfYXJyYXkoY2xpZW50LCBvdjk3NDBfcmVnc183MjBwLAotCQkJCQkgICAgIEFSUkFZX1NJWkUob3Y5NzQwX3JlZ3NfNzIwcCkpOwotCX0gZWxzZSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIHNlbGVjdCByZXNvbHV0aW9uIVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIHNldCB0aGUgZm9ybWF0IHdlIHdpbGwgY2FwdHVyZSBpbiAqLwotc3RhdGljIGludCBvdjk3NDBfc19mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQkJCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQllbnVtIHY0bDJfY29sb3JzcGFjZSBjc3BhY2U7Ci0JZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIGNvZGUgPSBtZi0+Y29kZTsKLQlpbnQgcmV0OwotCi0Jb3Y5NzQwX3Jlc19yb3VuZHVwKCZtZi0+d2lkdGgsICZtZi0+aGVpZ2h0KTsKLQotCXN3aXRjaCAoY29kZSkgewotCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDg6Ci0JCWNzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlX2FycmF5KGNsaWVudCwgb3Y5NzQwX2RlZmF1bHRzLAotCQkJCSAgICAgQVJSQVlfU0laRShvdjk3NDBfZGVmYXVsdHMpKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IG92OTc0MF9zZXRfcmVzKGNsaWVudCwgbWYtPndpZHRoKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCW1mLT5jb2RlCT0gY29kZTsKLQltZi0+Y29sb3JzcGFjZQk9IGNzcGFjZTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y5NzQwX3RyeV9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKLQkJCSAgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCi17Ci0Jb3Y5NzQwX3Jlc19yb3VuZHVwKCZtZi0+d2lkdGgsICZtZi0+aGVpZ2h0KTsKLQotCW1mLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKLQltZi0+Y29kZSA9IFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4OwotCW1mLT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0I7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvdjk3NDBfZW51bV9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdW5zaWduZWQgaW50IGluZGV4LAotCQkJICAgZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlICpjb2RlKQotewotCWlmIChpbmRleCA+PSBBUlJBWV9TSVpFKG92OTc0MF9jb2RlcykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JKmNvZGUgPSBvdjk3NDBfY29kZXNbaW5kZXhdOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y5NzQwX2Nyb3BjYXAoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3JvcGNhcCAqYSkKLXsKLQlhLT5ib3VuZHMubGVmdAkJPSAwOwotCWEtPmJvdW5kcy50b3AJCT0gMDsKLQlhLT5ib3VuZHMud2lkdGgJCT0gb3Y5NzQwX3Jlc29sdXRpb25zW09WOTc0MF83MjBQXS53aWR0aDsKLQlhLT5ib3VuZHMuaGVpZ2h0CT0gb3Y5NzQwX3Jlc29sdXRpb25zW09WOTc0MF83MjBQXS5oZWlnaHQ7Ci0JYS0+ZGVmcmVjdAkJPSBhLT5ib3VuZHM7Ci0JYS0+dHlwZQkJCT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCWEtPnBpeGVsYXNwZWN0Lm51bWVyYXRvcgk9IDE7Ci0JYS0+cGl4ZWxhc3BlY3QuZGVub21pbmF0b3IJPSAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y5NzQwX2dfY3JvcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jcm9wICphKQotewotCWEtPmMubGVmdAkJPSAwOwotCWEtPmMudG9wCQk9IDA7Ci0JYS0+Yy53aWR0aAkJPSBvdjk3NDBfcmVzb2x1dGlvbnNbT1Y5NzQwXzcyMFBdLndpZHRoOwotCWEtPmMuaGVpZ2h0CQk9IG92OTc0MF9yZXNvbHV0aW9uc1tPVjk3NDBfNzIwUF0uaGVpZ2h0OwotCWEtPnR5cGUJCQk9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG92OTc0MF92aWRlb19wcm9iZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKIAkJCSAgICAgIHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CkBAIC04NDMsMTYgKzg5OCw5IEBACiAJdTggbW9kZWxoaSwgbW9kZWxsbzsKIAlpbnQgcmV0OwogCi0JLyoKLQkgKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLgotCSAqIFNvIHRoaXMgZW50aXJlIHRlc3QgaXMgY29tcGxldGVseSByZWR1bmRhbnQuCi0JICovCi0JaWYgKCFpY2QtPmRldi5wYXJlbnQgfHwKLQkgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJQYXJlbnQgbWlzc2luZyBvciBpbnZhbGlkIVxuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyOwotCX0KKwkvKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLiAqLworCUJVR19PTighaWNkLT5wYXJlbnQgfHwKKwkgICAgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSk7CiAKIAkvKgogCSAqIGNoZWNrIGFuZCBzaG93IHByb2R1Y3QgSUQgYW5kIG1hbnVmYWN0dXJlciBJRApAQCAtOTAxLDE3ICs5NDksNiBAQAogCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShvdjk3NDBfY29udHJvbHMpLAogfTsKIAotc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBvdjk3NDBfY29yZV9vcHMgPSB7Ci0JLmdfY3RybAkJCT0gb3Y5NzQwX2dfY3RybCwKLQkuc19jdHJsCQkJPSBvdjk3NDBfc19jdHJsLAotCS5nX2NoaXBfaWRlbnQJCT0gb3Y5NzQwX2dfY2hpcF9pZGVudCwKLSNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCi0JLmdfcmVnaXN0ZXIJCT0gb3Y5NzQwX2dldF9yZWdpc3RlciwKLQkuc19yZWdpc3RlcgkJPSBvdjk3NDBfc2V0X3JlZ2lzdGVyLAotI2VuZGlmCi0KLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIG92OTc0MF92aWRlb19vcHMgPSB7CiAJLnNfc3RyZWFtCQk9IG92OTc0MF9zX3N0cmVhbSwKIAkuc19tYnVzX2ZtdAkJPSBvdjk3NDBfc19mbXQsCkBAIC05MjEsNiArOTU4LDE3IEBACiAJLmdfY3JvcAkJCT0gb3Y5NzQwX2dfY3JvcCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgb3Y5NzQwX2NvcmVfb3BzID0geworCS5nX2N0cmwJCQk9IG92OTc0MF9nX2N0cmwsCisJLnNfY3RybAkJCT0gb3Y5NzQwX3NfY3RybCwKKwkuZ19jaGlwX2lkZW50CQk9IG92OTc0MF9nX2NoaXBfaWRlbnQsCisJLnNfcG93ZXIJCT0gb3Y5NzQwX3NfcG93ZXIsCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworCS5nX3JlZ2lzdGVyCQk9IG92OTc0MF9nZXRfcmVnaXN0ZXIsCisJLnNfcmVnaXN0ZXIJCT0gb3Y5NzQwX3NldF9yZWdpc3RlciwKKyNlbmRpZgorfTsKKwogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgb3Y5NzQwX3N1YmRldl9vcHMgPSB7CiAJLmNvcmUJCQk9ICZvdjk3NDBfY29yZV9vcHMsCiAJLnZpZGVvCQkJPSAmb3Y5NzQwX3ZpZGVvX29wcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcG1zLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Btcy5jCmluZGV4IDc1NTE5MDcuLmU3NTNiNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcG1zLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wbXMuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTM5LDcgKzM4LDcgQEAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KK01PRFVMRV9WRVJTSU9OKCIwLjAuNCIpOwogCiAjZGVmaW5lIE1PVE9ST0xBCTEKICNkZWZpbmUgUEhJTElQUzIJMiAgICAgICAgICAgICAgIC8qIFNBQTcxOTEgKi8KQEAgLTY3OCw3ICs2NzcsNiBAQAogCXN0cmxjcHkodmNhcC0+ZHJpdmVyLCBkZXYtPnY0bDJfZGV2Lm5hbWUsIHNpemVvZih2Y2FwLT5kcml2ZXIpKTsKIAlzdHJsY3B5KHZjYXAtPmNhcmQsICJNZWRpYXZpc2lvbiBQTVMiLCBzaXplb2YodmNhcC0+Y2FyZCkpOwogCXN0cmxjcHkodmNhcC0+YnVzX2luZm8sICJJU0EiLCBzaXplb2YodmNhcC0+YnVzX2luZm8pKTsKLQl2Y2FwLT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oMCwgMCwgMyk7CiAJdmNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1JFQURXUklURTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLW1haW4uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLW1haW4uYwppbmRleCAyMjU0MTk0Li5jMWQ5YmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1tYWluLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItbWFpbi5jCkBAIC0xNjgsNiArMTY4LDcgQEAKIE1PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CiBNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjAuOS4xIik7CiAKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLXY0bDIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLXY0bDIuYwppbmRleCAzODc2MTE0Li5lMjdmOGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi12NGwyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItdjRsMi5jCkBAIC05MSw3ICs5MSw3IEBACiAJLmRyaXZlciAgICAgICAgID0gInB2cnVzYjIiLAogCS5jYXJkICAgICAgICAgICA9ICJIYXVwcGF1Z2UgV2luVFYgcHZyLXVzYjIiLAogCS5idXNfaW5mbyAgICAgICA9ICJ1c2IiLAotCS52ZXJzaW9uICAgICAgICA9IEtFUk5FTF9WRVJTSU9OKDAsIDksIDApLAorCS52ZXJzaW9uICAgICAgICA9IExJTlVYX1ZFUlNJT05fQ09ERSwKIAkuY2FwYWJpbGl0aWVzICAgPSAoVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CiAJCQkgICBWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX0FVRElPIHwgVjRMMl9DQVBfUkFESU8gfAogCQkJICAgVjRMMl9DQVBfUkVBRFdSSVRFKSwKQEAgLTM2OSwxMSArMzY5LDYgQEAKIAkJYnJlYWs7CiAJfQogCi0JY2FzZSBWSURJT0NfU19BVURJTzoKLQl7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KIAljYXNlIFZJRElPQ19HX1RVTkVSOgogCXsKIAkJc3RydWN0IHY0bDJfdHVuZXIgKnZ0ID0gKHN0cnVjdCB2NGwyX3R1bmVyICopYXJnOwpAQCAtODUwLDcgKzg0NSw3IEBACiAjZW5kaWYKIAogCWRlZmF1bHQgOgotCQlyZXQgPSAtRUlOVkFMOworCQlyZXQgPSAtRU5PVFRZOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9LY29uZmlnCmluZGV4IDhkYTQyZTQuLmQ2M2QwYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvS2NvbmZpZwpAQCAtMSw2ICsxLDcgQEAKIGNvbmZpZyBVU0JfUFdDCiAJdHJpc3RhdGUgIlVTQiBQaGlsaXBzIENhbWVyYXMiCiAJZGVwZW5kcyBvbiBWSURFT19WNEwyCisJc2VsZWN0IFZJREVPQlVGMl9WTUFMTE9DCiAJLS0taGVscC0tLQogCSAgU2F5IFkgb3IgTSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBvbmUgb2YgdGhlc2UgUGhpbGlwcyAmIE9FTQogCSAgd2ViY2FtczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1jdHJsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtY3RybC5jCmluZGV4IDc2MGI0ZGUuLjM5NzdhZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1jdHJsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWN0cmwuYwpAQCAtMyw2ICszLDcgQEAKICAgIHZpZGVvIG1vZGVzLgogICAgKEMpIDE5OTktMjAwMyBOZW1vc29mdCBVbnYuCiAgICAoQykgMjAwNC0yMDA2IEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKyAgIChDKSAyMDExIEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CiAKICAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAogICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCkBAIC00Myw2MSArNDQsMTIgQEAKICNpbmNsdWRlIDxhc20vZXJybm8uaD4KIAogI2luY2x1ZGUgInB3Yy5oIgotI2luY2x1ZGUgInB3Yy11bmNvbXByZXNzLmgiCiAjaW5jbHVkZSAicHdjLWtpYXJhLmgiCiAjaW5jbHVkZSAicHdjLXRpbW9uLmgiCiAjaW5jbHVkZSAicHdjLWRlYzEuaCIKICNpbmNsdWRlICJwd2MtZGVjMjMuaCIKIAotLyogUmVxdWVzdCB0eXBlczogdmlkZW8gKi8KLSNkZWZpbmUgU0VUX0xVTV9DVEwJCQkweDAxCi0jZGVmaW5lIEdFVF9MVU1fQ1RMCQkJMHgwMgotI2RlZmluZSBTRVRfQ0hST01fQ1RMCQkJMHgwMwotI2RlZmluZSBHRVRfQ0hST01fQ1RMCQkJMHgwNAotI2RlZmluZSBTRVRfU1RBVFVTX0NUTAkJCTB4MDUKLSNkZWZpbmUgR0VUX1NUQVRVU19DVEwJCQkweDA2Ci0jZGVmaW5lIFNFVF9FUF9TVFJFQU1fQ1RMCQkweDA3Ci0jZGVmaW5lIEdFVF9FUF9TVFJFQU1fQ1RMCQkweDA4Ci0jZGVmaW5lIEdFVF9YWF9DVEwJCQkweDA5Ci0jZGVmaW5lIFNFVF9YWF9DVEwJCQkweDBBCi0jZGVmaW5lIEdFVF9YWV9DVEwJCQkweDBCCi0jZGVmaW5lIFNFVF9YWV9DVEwJCQkweDBDCi0jZGVmaW5lIFNFVF9NUFRfQ1RMCQkJMHgwRAotI2RlZmluZSBHRVRfTVBUX0NUTAkJCTB4MEUKLQotLyogU2VsZWN0b3JzIGZvciB0aGUgTHVtaW5hbmNlIGNvbnRyb2xzIFtHU11FVF9MVU1fQ1RMICovCi0jZGVmaW5lIEFHQ19NT0RFX0ZPUk1BVFRFUgkJCTB4MjAwMAotI2RlZmluZSBQUkVTRVRfQUdDX0ZPUk1BVFRFUgkJCTB4MjEwMAotI2RlZmluZSBTSFVUVEVSX01PREVfRk9STUFUVEVSCQkJMHgyMjAwCi0jZGVmaW5lIFBSRVNFVF9TSFVUVEVSX0ZPUk1BVFRFUgkJMHgyMzAwCi0jZGVmaW5lIFBSRVNFVF9DT05UT1VSX0ZPUk1BVFRFUgkJMHgyNDAwCi0jZGVmaW5lIEFVVE9fQ09OVE9VUl9GT1JNQVRURVIJCQkweDI1MDAKLSNkZWZpbmUgQkFDS19MSUdIVF9DT01QRU5TQVRJT05fRk9STUFUVEVSCTB4MjYwMAotI2RlZmluZSBDT05UUkFTVF9GT1JNQVRURVIJCQkweDI3MDAKLSNkZWZpbmUgRFlOQU1JQ19OT0lTRV9DT05UUk9MX0ZPUk1BVFRFUgkJMHgyODAwCi0jZGVmaW5lIEZMSUNLRVJMRVNTX01PREVfRk9STUFUVEVSCQkweDI5MDAKLSNkZWZpbmUgQUVfQ09OVFJPTF9TUEVFRAkJCTB4MkEwMAotI2RlZmluZSBCUklHSFRORVNTX0ZPUk1BVFRFUgkJCTB4MkIwMAotI2RlZmluZSBHQU1NQV9GT1JNQVRURVIJCQkJMHgyQzAwCi0KLS8qIFNlbGVjdG9ycyBmb3IgdGhlIENocm9taW5hbmNlIGNvbnRyb2xzIFtHU11FVF9DSFJPTV9DVEwgKi8KLSNkZWZpbmUgV0JfTU9ERV9GT1JNQVRURVIJCQkweDEwMDAKLSNkZWZpbmUgQVdCX0NPTlRST0xfU1BFRURfRk9STUFUVEVSCQkweDExMDAKLSNkZWZpbmUgQVdCX0NPTlRST0xfREVMQVlfRk9STUFUVEVSCQkweDEyMDAKLSNkZWZpbmUgUFJFU0VUX01BTlVBTF9SRURfR0FJTl9GT1JNQVRURVIJMHgxMzAwCi0jZGVmaW5lIFBSRVNFVF9NQU5VQUxfQkxVRV9HQUlOX0ZPUk1BVFRFUgkweDE0MDAKLSNkZWZpbmUgQ09MT1VSX01PREVfRk9STUFUVEVSCQkJMHgxNTAwCi0jZGVmaW5lIFNBVFVSQVRJT05fTU9ERV9GT1JNQVRURVIxCQkweDE2MDAKLSNkZWZpbmUgU0FUVVJBVElPTl9NT0RFX0ZPUk1BVFRFUjIJCTB4MTcwMAotCi0vKiBTZWxlY3RvcnMgZm9yIHRoZSBTdGF0dXMgY29udHJvbHMgW0dTXUVUX1NUQVRVU19DVEwgKi8KLSNkZWZpbmUgU0FWRV9VU0VSX0RFRkFVTFRTX0ZPUk1BVFRFUgkJMHgwMjAwCi0jZGVmaW5lIFJFU1RPUkVfVVNFUl9ERUZBVUxUU19GT1JNQVRURVIJCTB4MDMwMAotI2RlZmluZSBSRVNUT1JFX0ZBQ1RPUllfREVGQVVMVFNfRk9STUFUVEVSCTB4MDQwMAotI2RlZmluZSBSRUFEX0FHQ19GT1JNQVRURVIJCQkweDA1MDAKLSNkZWZpbmUgUkVBRF9TSFVUVEVSX0ZPUk1BVFRFUgkJCTB4MDYwMAotI2RlZmluZSBSRUFEX1JFRF9HQUlOX0ZPUk1BVFRFUgkJCTB4MDcwMAotI2RlZmluZSBSRUFEX0JMVUVfR0FJTl9GT1JNQVRURVIJCTB4MDgwMAorLyogU2VsZWN0b3JzIGZvciBzdGF0dXMgY29udHJvbHMgdXNlZCBvbmx5IGluIHRoaXMgZmlsZSAqLwogI2RlZmluZSBHRVRfU1RBVFVTX0IwMAkJCQkweDBCMDAKICNkZWZpbmUgU0VOU09SX1RZUEVfRk9STUFUVEVSMQkJCTB4MEMwMAogI2RlZmluZSBHRVRfU1RBVFVTXzMwMDAJCQkJMHgzMDAwCkBAIC0xMTYsMTEgKzY4LDYgQEAKIC8qIEZvcm1hdHRlcnMgZm9yIHRoZSBWaWRlbyBFbmRwb2ludCBjb250cm9scyBbR1NdRVRfRVBfU1RSRUFNX0NUTCAqLwogI2RlZmluZSBWSURFT19PVVRQVVRfQ09OVFJPTF9GT1JNQVRURVIJCTB4MDEwMAogCi0vKiBGb3JtYXR0ZXJzIGZvciB0aGUgbW90b3JpemVkIHBhbiAmIHRpbHQgW0dTXUVUX01QVF9DVEwgKi8KLSNkZWZpbmUgUFRfUkVMQVRJVkVfQ09OVFJPTF9GT1JNQVRURVIJCTB4MDEKLSNkZWZpbmUgUFRfUkVTRVRfQ09OVFJPTF9GT1JNQVRURVIJCTB4MDIKLSNkZWZpbmUgUFRfU1RBVFVTX0ZPUk1BVFRFUgkJCTB4MDMKLQogc3RhdGljIGNvbnN0IGNoYXIgKnNpemUybmFtZVtQU1pfTUFYXSA9CiB7CiAJInN1YlFDSUYiLApAQCAtMTYwLDcgKzEwNyw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIGludCBfc2VuZF9jb250cm9sX21zZyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwKLQl1OCByZXF1ZXN0LCB1MTYgdmFsdWUsIGludCBpbmRleCwgdm9pZCAqYnVmLCBpbnQgYnVmbGVuLCBpbnQgdGltZW91dCkKKwl1OCByZXF1ZXN0LCB1MTYgdmFsdWUsIGludCBpbmRleCwgdm9pZCAqYnVmLCBpbnQgYnVmbGVuKQogewogCWludCByYzsKIAl2b2lkICprYnVmID0gTlVMTDsKQEAgLTE3Nyw3ICsxMjQsNyBAQAogCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCiAJCXZhbHVlLAogCQlpbmRleCwKLQkJa2J1ZiwgYnVmbGVuLCB0aW1lb3V0KTsKKwkJa2J1ZiwgYnVmbGVuLCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CiAKIAlrZnJlZShrYnVmKTsKIAlyZXR1cm4gcmM7CkBAIC0xOTcsOSArMTQ0LDEzIEBACiAJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAogCQl2YWx1ZSwKIAkJcGRldi0+dmNpbnRlcmZhY2UsCi0JCWtidWYsIGJ1ZmxlbiwgNTAwKTsKKwkJa2J1ZiwgYnVmbGVuLCBVU0JfQ1RSTF9HRVRfVElNRU9VVCk7CiAJbWVtY3B5KGJ1Ziwga2J1ZiwgYnVmbGVuKTsKIAlrZnJlZShrYnVmKTsKKworCWlmIChyYyA8IDApCisJCVBXQ19FUlJPUigicmVjdl9jb250cm9sX21zZyBlcnJvciAlZCByZXEgJTAyeCB2YWwgJTA0eFxuIiwKKwkJCSAgcmMsIHJlcXVlc3QsIHZhbHVlKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTIxMCwxOCArMTYxLDE2IEBACiAJCVNFVF9FUF9TVFJFQU1fQ1RMLAogCQlWSURFT19PVVRQVVRfQ09OVFJPTF9GT1JNQVRURVIsCiAJCWluZGV4LAotCQlidWYsIGJ1ZmxlbiwgMTAwMCk7CisJCWJ1ZiwgYnVmbGVuKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc2VuZF9jb250cm9sX21zZyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwKK2ludCBzZW5kX2NvbnRyb2xfbXNnKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LAogCXU4IHJlcXVlc3QsIHUxNiB2YWx1ZSwgdm9pZCAqYnVmLCBpbnQgYnVmbGVuKQogewogCXJldHVybiBfc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQlyZXF1ZXN0LCB2YWx1ZSwgcGRldi0+dmNpbnRlcmZhY2UsIGJ1ZiwgYnVmbGVuLCA1MDApOworCQlyZXF1ZXN0LCB2YWx1ZSwgcGRldi0+dmNpbnRlcmZhY2UsIGJ1ZiwgYnVmbGVuKTsKIH0KIAotCi0KIHN0YXRpYyBpbnQgc2V0X3ZpZGVvX21vZGVfTmFsYShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHNpemUsIGludCBmcmFtZXMpCiB7CiAJdW5zaWduZWQgY2hhciBidWZbM107CkBAIC0yNjEsOCArMjEwLDExIEBACiAJCVBXQ19ERUJVR19NT0RVTEUoIkZhaWxlZCB0byBzZW5kIHZpZGVvIGNvbW1hbmQuLi4gJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQotCWlmIChwRW50cnktPmNvbXByZXNzZWQgJiYgcGRldi0+cGl4Zm10ID09IFY0TDJfUElYX0ZNVF9ZVVY0MjApCi0JCXB3Y19kZWMxX2luaXQocGRldi0+dHlwZSwgcGRldi0+cmVsZWFzZSwgYnVmLCBwZGV2LT5kZWNvbXByZXNzX2RhdGEpOworCWlmIChwRW50cnktPmNvbXByZXNzZWQgJiYgcGRldi0+cGl4Zm10ID09IFY0TDJfUElYX0ZNVF9ZVVY0MjApIHsKKwkJcmV0ID0gcHdjX2RlYzFfaW5pdChwZGV2LCBwZGV2LT50eXBlLCBwZGV2LT5yZWxlYXNlLCBidWYpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJcGRldi0+Y21kX2xlbiA9IDM7CiAJbWVtY3B5KHBkZXYtPmNtZF9idWYsIGJ1ZiwgMyk7CkBAIC0zMjEsOCArMjczLDExIEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlpZiAocENob29zZS0+YmFuZGxlbmd0aCA+IDAgJiYgcGRldi0+cGl4Zm10ID09IFY0TDJfUElYX0ZNVF9ZVVY0MjApCi0JCXB3Y19kZWMyM19pbml0KHBkZXYsIHBkZXYtPnR5cGUsIGJ1Zik7CisJaWYgKHBDaG9vc2UtPmJhbmRsZW5ndGggPiAwICYmIHBkZXYtPnBpeGZtdCA9PSBWNEwyX1BJWF9GTVRfWVVWNDIwKSB7CisJCXJldCA9IHB3Y19kZWMyM19pbml0KHBkZXYsIHBkZXYtPnR5cGUsIGJ1Zik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CiAKIAlwZGV2LT5jbWRfbGVuID0gMTM7CiAJbWVtY3B5KHBkZXYtPmNtZF9idWYsIGJ1ZiwgMTMpOwpAQCAtMzk0LDggKzM0OSwxMSBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKHBDaG9vc2UtPmJhbmRsZW5ndGggPiAwICYmIHBkZXYtPnBpeGZtdCA9PSBWNEwyX1BJWF9GTVRfWVVWNDIwKQotCQlwd2NfZGVjMjNfaW5pdChwZGV2LCBwZGV2LT50eXBlLCBidWYpOworCWlmIChwQ2hvb3NlLT5iYW5kbGVuZ3RoID4gMCAmJiBwZGV2LT5waXhmbXQgPT0gVjRMMl9QSVhfRk1UX1lVVjQyMCkgeworCQlyZXQgPSBwd2NfZGVjMjNfaW5pdChwZGV2LCBwZGV2LT50eXBlLCBidWYpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJcGRldi0+Y21kX2xlbiA9IDEyOwogCW1lbWNweShwZGV2LT5jbWRfYnVmLCBidWYsIDEyKTsKQEAgLTQ1Miw2ICs0MTAsNyBAQAogCX0KIAlwZGV2LT52aWV3LnggPSB3aWR0aDsKIAlwZGV2LT52aWV3LnkgPSBoZWlnaHQ7CisJcGRldi0+dmNvbXByZXNzaW9uID0gY29tcHJlc3Npb247CiAJcGRldi0+ZnJhbWVfdG90YWxfc2l6ZSA9IHBkZXYtPmZyYW1lX3NpemUgKyBwZGV2LT5mcmFtZV9oZWFkZXJfc2l6ZSArIHBkZXYtPmZyYW1lX3RyYWlsZXJfc2l6ZTsKIAlwd2Nfc2V0X2ltYWdlX2J1ZmZlcl9zaXplKHBkZXYpOwogCVBXQ19ERUJVR19TSVpFKCJTZXQgdmlld3BvcnQgdG8gJWR4JWQsIGltYWdlIHNpemUgaXMgJWR4JWQuXG4iLCB3aWR0aCwgaGVpZ2h0LCBwd2NfaW1hZ2Vfc2l6ZXNbc2l6ZV0ueCwgcHdjX2ltYWdlX3NpemVzW3NpemVdLnkpOwpAQCAtNTExLDEzICs0NzAsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNkZWZpbmUgQkxBQ0tfWSAwCi0jZGVmaW5lIEJMQUNLX1UgMTI4Ci0jZGVmaW5lIEJMQUNLX1YgMTI4Ci0KIHN0YXRpYyB2b2lkIHB3Y19zZXRfaW1hZ2VfYnVmZmVyX3NpemUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7Ci0JaW50IGksIGZhY3RvciA9IDA7CisJaW50IGZhY3RvciA9IDA7CiAKIAkvKiBmb3IgVjRMMl9QSVhfRk1UX1lVVjQyMCAqLwogCXN3aXRjaCAocGRldi0+cGl4Zm10KSB7CkBAIC01NDEsNDQyICs0OTYsMTA4IEBACiAJICovCiAJcGRldi0+b2Zmc2V0LnggPSAoKHBkZXYtPnZpZXcueCAtIHBkZXYtPmltYWdlLngpIC8gMikgJiAweEZGRkM7CiAJcGRldi0+b2Zmc2V0LnkgPSAoKHBkZXYtPnZpZXcueSAtIHBkZXYtPmltYWdlLnkpIC8gMikgJiAweEZGRkU7Ci0KLQkvKiBGaWxsIGJ1ZmZlcnMgd2l0aCBibGFjayBjb2xvcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcHdjX21idWZzOyBpKyspIHsKLQkJdW5zaWduZWQgY2hhciAqcCA9IHBkZXYtPmltYWdlX2RhdGEgKyBwZGV2LT5pbWFnZXNbaV0ub2Zmc2V0OwotCQltZW1zZXQocCwgQkxBQ0tfWSwgcGRldi0+dmlldy54ICogcGRldi0+dmlldy55KTsKLQkJcCArPSBwZGV2LT52aWV3LnggKiBwZGV2LT52aWV3Lnk7Ci0JCW1lbXNldChwLCBCTEFDS19VLCBwZGV2LT52aWV3LnggKiBwZGV2LT52aWV3LnkvNCk7Ci0JCXAgKz0gcGRldi0+dmlldy54ICogcGRldi0+dmlldy55LzQ7Ci0JCW1lbXNldChwLCBCTEFDS19WLCBwZGV2LT52aWV3LnggKiBwZGV2LT52aWV3LnkvNCk7Ci0JfQogfQogCi0KLQotLyogQlJJR0hUTkVTUyAqLwotCi1pbnQgcHdjX2dldF9icmlnaHRuZXNzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoraW50IHB3Y19nZXRfdThfY3RybChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdTggcmVxdWVzdCwgdTE2IHZhbHVlLCBpbnQgKmRhdGEpCiB7Ci0JY2hhciBidWY7CiAJaW50IHJldDsKKwl1OCBidWY7CiAKLQlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsCi0JCUdFVF9MVU1fQ1RMLCBCUklHSFRORVNTX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOworCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwgcmVxdWVzdCwgdmFsdWUsICZidWYsIHNpemVvZihidWYpKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKLQlyZXR1cm4gYnVmOwotfQogCi1pbnQgcHdjX3NldF9icmlnaHRuZXNzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpCi17Ci0JY2hhciBidWY7Ci0KLQlpZiAodmFsdWUgPCAwKQotCQl2YWx1ZSA9IDA7Ci0JaWYgKHZhbHVlID4gMHhmZmZmKQotCQl2YWx1ZSA9IDB4ZmZmZjsKLQlidWYgPSAodmFsdWUgPj4gOSkgJiAweDdmOwotCXJldHVybiBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCVNFVF9MVU1fQ1RMLCBCUklHSFRORVNTX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotfQotCi0vKiBDT05UUkFTVCAqLwotCi1pbnQgcHdjX2dldF9jb250cmFzdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKLXsKLQljaGFyIGJ1ZjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LAotCQlHRVRfTFVNX0NUTCwgQ09OVFJBU1RfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotaW50IHB3Y19zZXRfY29udHJhc3Qoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKLXsKLQljaGFyIGJ1ZjsKLQotCWlmICh2YWx1ZSA8IDApCi0JCXZhbHVlID0gMDsKLQlpZiAodmFsdWUgPiAweGZmZmYpCi0JCXZhbHVlID0gMHhmZmZmOwotCWJ1ZiA9ICh2YWx1ZSA+PiAxMCkgJiAweDNmOwotCXJldHVybiBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCVNFVF9MVU1fQ1RMLCBDT05UUkFTVF9GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLX0KLQotLyogR0FNTUEgKi8KLQotaW50IHB3Y19nZXRfZ2FtbWEoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCi17Ci0JY2hhciBidWY7Ci0JaW50IHJldDsKLQotCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwKLQkJR0VUX0xVTV9DVEwsIEdBTU1BX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCXJldHVybiBidWY7Ci19Ci0KLWludCBwd2Nfc2V0X2dhbW1hKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpCi17Ci0JY2hhciBidWY7Ci0KLQlpZiAodmFsdWUgPCAwKQotCQl2YWx1ZSA9IDA7Ci0JaWYgKHZhbHVlID4gMHhmZmZmKQotCQl2YWx1ZSA9IDB4ZmZmZjsKLQlidWYgPSAodmFsdWUgPj4gMTEpICYgMHgxZjsKLQlyZXR1cm4gc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQlTRVRfTFVNX0NUTCwgR0FNTUFfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci19Ci0KLQotLyogU0FUVVJBVElPTiAqLwotCi0vKiByZXR1cm4gYSB2YWx1ZSBiZXR3ZWVuIFstMTAwICwgMTAwXSAqLwotaW50IHB3Y19nZXRfc2F0dXJhdGlvbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSkKLXsKLQljaGFyIGJ1ZjsKLQlpbnQgcmV0LCBzYXR1cmF0aW9uX3JlZ2lzdGVyOwotCi0JaWYgKHBkZXYtPnR5cGUgPCA2NzUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChwZGV2LT50eXBlIDwgNzMwKQotCQlzYXR1cmF0aW9uX3JlZ2lzdGVyID0gU0FUVVJBVElPTl9NT0RFX0ZPUk1BVFRFUjI7Ci0JZWxzZQotCQlzYXR1cmF0aW9uX3JlZ2lzdGVyID0gU0FUVVJBVElPTl9NT0RFX0ZPUk1BVFRFUjE7Ci0JcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LAotCQlHRVRfQ0hST01fQ1RMLCBzYXR1cmF0aW9uX3JlZ2lzdGVyLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JKnZhbHVlID0gKHNpZ25lZClidWY7CisJKmRhdGEgPSBidWY7CiAJcmV0dXJuIDA7CiB9CiAKLS8qIEBwYXJhbSB2YWx1ZSBzYXR1cmF0aW9uIGNvbG9yIGJldHdlZW4gWy0xMDAgLCAxMDBdICovCi1pbnQgcHdjX3NldF9zYXR1cmF0aW9uKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpCitpbnQgcHdjX3NldF91OF9jdHJsKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCB1OCByZXF1ZXN0LCB1MTYgdmFsdWUsIHU4IGRhdGEpCiB7Ci0JY2hhciBidWY7Ci0JaW50IHNhdHVyYXRpb25fcmVnaXN0ZXI7Ci0KLQlpZiAocGRldi0+dHlwZSA8IDY3NSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHZhbHVlIDwgLTEwMCkKLQkJdmFsdWUgPSAtMTAwOwotCWlmICh2YWx1ZSA+IDEwMCkKLQkJdmFsdWUgPSAxMDA7Ci0JaWYgKHBkZXYtPnR5cGUgPCA3MzApCi0JCXNhdHVyYXRpb25fcmVnaXN0ZXIgPSBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMjsKLQllbHNlCi0JCXNhdHVyYXRpb25fcmVnaXN0ZXIgPSBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMTsKLQlyZXR1cm4gc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQlTRVRfQ0hST01fQ1RMLCBzYXR1cmF0aW9uX3JlZ2lzdGVyLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci19Ci0KLS8qIEFHQyAqLwotCi1pbnQgcHdjX3NldF9hZ2Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBtb2RlLCBpbnQgdmFsdWUpCi17Ci0JY2hhciBidWY7CiAJaW50IHJldDsKIAotCWlmIChtb2RlKQotCQlidWYgPSAweDA7IC8qIGF1dG8gKi8KLQllbHNlCi0JCWJ1ZiA9IDB4ZmY7IC8qIGZpeGVkICovCi0KLQlyZXQgPSBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCVNFVF9MVU1fQ1RMLCBBR0NfTU9ERV9GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLQotCWlmICghbW9kZSAmJiByZXQgPj0gMCkgewotCQlpZiAodmFsdWUgPCAwKQotCQkJdmFsdWUgPSAwOwotCQlpZiAodmFsdWUgPiAweGZmZmYpCi0JCQl2YWx1ZSA9IDB4ZmZmZjsKLQkJYnVmID0gKHZhbHVlID4+IDEwKSAmIDB4M0Y7Ci0JCXJldCA9IHNlbmRfY29udHJvbF9tc2cocGRldiwKLQkJCVNFVF9MVU1fQ1RMLCBQUkVTRVRfQUdDX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCX0KKwlyZXQgPSBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsIHJlcXVlc3QsIHZhbHVlLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHB3Y19nZXRfYWdjKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQotewotCXVuc2lnbmVkIGNoYXIgYnVmOwotCWludCByZXQ7Ci0KLQlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsCi0JCUdFVF9MVU1fQ1RMLCBBR0NfTU9ERV9GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChidWYgIT0gMCkgeyAvKiBmaXhlZCAqLwotCQlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsCi0JCQlHRVRfTFVNX0NUTCwgUFJFU0VUX0FHQ19GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCQlpZiAoYnVmID4gMHgzRikKLQkJCWJ1ZiA9IDB4M0Y7Ci0JCSp2YWx1ZSA9IChidWYgPDwgMTApOwotCX0KLQllbHNlIHsgLyogYXV0byAqLwotCQlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsCi0JCQlHRVRfU1RBVFVTX0NUTCwgUkVBRF9BR0NfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQkJLyogR2FoLi4uIHRoaXMgdmFsdWUgcmFuZ2VzIGZyb20gMHgwMCAuLi4gMHg5RiAqLwotCQlpZiAoYnVmID4gMHg5RikKLQkJCWJ1ZiA9IDB4OUY7Ci0JCSp2YWx1ZSA9IC0oNDggKyBidWYgKiA0MDkpOwotCX0KIAogCXJldHVybiAwOwogfQogCi1pbnQgcHdjX3NldF9zaHV0dGVyX3NwZWVkKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbW9kZSwgaW50IHZhbHVlKQoraW50IHB3Y19nZXRfczhfY3RybChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdTggcmVxdWVzdCwgdTE2IHZhbHVlLCBpbnQgKmRhdGEpCiB7Ci0JY2hhciBidWZbMl07Ci0JaW50IHNwZWVkLCByZXQ7Ci0KLQotCWlmIChtb2RlKQotCQlidWZbMF0gPSAweDA7CS8qIGF1dG8gKi8KLQllbHNlCi0JCWJ1ZlswXSA9IDB4ZmY7IC8qIGZpeGVkICovCi0KLQlyZXQgPSBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCVNFVF9MVU1fQ1RMLCBTSFVUVEVSX01PREVfRk9STUFUVEVSLCAmYnVmLCAxKTsKLQotCWlmICghbW9kZSAmJiByZXQgPj0gMCkgewotCQlpZiAodmFsdWUgPCAwKQotCQkJdmFsdWUgPSAwOwotCQlpZiAodmFsdWUgPiAweGZmZmYpCi0JCQl2YWx1ZSA9IDB4ZmZmZjsKLQotCQlpZiAoREVWSUNFX1VTRV9DT0RFQzIocGRldi0+dHlwZSkpIHsKLQkJCS8qIHNwZWVkIHJhbmdlcyBmcm9tIDB4MCB0byAweDI5MCAoNjU2KSAqLwotCQkJc3BlZWQgPSAodmFsdWUgLyAxMDApOwotCQkJYnVmWzFdID0gc3BlZWQgPj4gODsKLQkJCWJ1ZlswXSA9IHNwZWVkICYgMHhmZjsKLQkJfSBlbHNlIGlmIChERVZJQ0VfVVNFX0NPREVDMyhwZGV2LT50eXBlKSkgewotCQkJLyogc3BlZWQgc2VlbXMgdG8gcmFuZ2UgZnJvbSAweDAgdG8gMHhmZiAqLwotCQkJYnVmWzFdID0gMDsKLQkJCWJ1ZlswXSA9IHZhbHVlID4+IDg7Ci0JCX0KLQotCQlyZXQgPSBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCQlTRVRfTFVNX0NUTCwgUFJFU0VUX1NIVVRURVJfRk9STUFUVEVSLAotCQkJJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBleHBvcnRlZCB0byB2NGwxLCBzbyBvdXRwdXQgdmFsdWVzIGJldHdlZW4gMCAtPiAyNTYgKi8KLWludCBwd2NfZ2V0X3NodXR0ZXJfc3BlZWQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCi17Ci0JdW5zaWduZWQgY2hhciBidWZbMl07CiAJaW50IHJldDsKKwlzOCBidWY7CiAKLQlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsCi0JCUdFVF9TVEFUVVNfQ1RMLCBSRUFEX1NIVVRURVJfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7CisJcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LCByZXF1ZXN0LCB2YWx1ZSwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCSp2YWx1ZSA9IGJ1ZlswXSArIChidWZbMV0gPDwgOCk7Ci0JaWYgKERFVklDRV9VU0VfQ09ERUMyKHBkZXYtPnR5cGUpKSB7Ci0JCS8qIHNwZWVkIHJhbmdlcyBmcm9tIDB4MCB0byAweDI5MCAoNjU2KSAqLwotCQkqdmFsdWUgKj0gMjU2LzY1NjsKLQl9IGVsc2UgaWYgKERFVklDRV9VU0VfQ09ERUMzKHBkZXYtPnR5cGUpKSB7Ci0JCS8qIHNwZWVkIHNlZW1zIHRvIHJhbmdlIGZyb20gMHgwIHRvIDB4ZmYgKi8KLQl9CisKKwkqZGF0YSA9IGJ1ZjsKIAlyZXR1cm4gMDsKIH0KIAoraW50IHB3Y19nZXRfdTE2X2N0cmwoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHU4IHJlcXVlc3QsIHUxNiB2YWx1ZSwgaW50ICpkYXRhKQoreworCWludCByZXQ7CisJdTggYnVmWzJdOworCisJcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LCByZXF1ZXN0LCB2YWx1ZSwgYnVmLCBzaXplb2YoYnVmKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkqZGF0YSA9IChidWZbMV0gPDwgOCkgfCBidWZbMF07CisJcmV0dXJuIDA7Cit9CisKK2ludCBwd2Nfc2V0X3UxNl9jdHJsKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCB1OCByZXF1ZXN0LCB1MTYgdmFsdWUsIHUxNiBkYXRhKQoreworCWludCByZXQ7CisJdTggYnVmWzJdOworCisJYnVmWzBdID0gZGF0YSAmIDB4ZmY7CisJYnVmWzFdID0gZGF0YSA+PiA4OworCXJldCA9IHNlbmRfY29udHJvbF9tc2cocGRldiwgcmVxdWVzdCwgdmFsdWUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK2ludCBwd2NfYnV0dG9uX2N0cmwoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHUxNiB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc2VuZF9jb250cm9sX21zZyhwZGV2LCBTRVRfU1RBVFVTX0NUTCwgdmFsdWUsIE5VTEwsIDApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CiAKIC8qIFBPV0VSICovCi0KLWludCBwd2NfY2FtZXJhX3Bvd2VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgcG93ZXIpCit2b2lkIHB3Y19jYW1lcmFfcG93ZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBwb3dlcikKIHsKIAljaGFyIGJ1ZjsKKwlpbnQgcjsKKworCWlmICghcGRldi0+cG93ZXJfc2F2ZSkKKwkJcmV0dXJuOwogCiAJaWYgKHBkZXYtPnR5cGUgPCA2NzUgfHwgKHBkZXYtPnR5cGUgPCA3MzAgJiYgcGRldi0+cmVsZWFzZSA8IDYpKQotCQlyZXR1cm4gMDsJLyogTm90IHN1cHBvcnRlZCBieSBOYWxhIG9yIFRpbW9uIDwgcmVsZWFzZSA2ICovCisJCXJldHVybjsJLyogTm90IHN1cHBvcnRlZCBieSBOYWxhIG9yIFRpbW9uIDwgcmVsZWFzZSA2ICovCiAKIAlpZiAocG93ZXIpCiAJCWJ1ZiA9IDB4MDA7IC8qIGFjdGl2ZSAqLwogCWVsc2UKIAkJYnVmID0gMHhGRjsgLyogcG93ZXIgc2F2ZSAqLwotCXJldHVybiBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCisJciA9IHNlbmRfY29udHJvbF9tc2cocGRldiwKIAkJU0VUX1NUQVRVU19DVEwsIFNFVF9QT1dFUl9TQVZFX01PREVfRk9STUFUVEVSLAogCQkmYnVmLCBzaXplb2YoYnVmKSk7CisKKwlpZiAociA8IDApCisJCVBXQ19FUlJPUigiRmFpbGVkIHRvIHBvd2VyICVzIGNhbWVyYSAoJWQpXG4iLAorCQkJICBwb3dlciA/ICJvbiIgOiAib2ZmIiwgcik7CiB9CiAKLQotCi0vKiBwcml2YXRlIGNhbGxzICovCi0KLWludCBwd2NfcmVzdG9yZV91c2VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQotewotCXJldHVybiBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCVNFVF9TVEFUVVNfQ1RMLCBSRVNUT1JFX1VTRVJfREVGQVVMVFNfRk9STUFUVEVSLCBOVUxMLCAwKTsKLX0KLQotaW50IHB3Y19zYXZlX3VzZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIHNlbmRfY29udHJvbF9tc2cocGRldiwKLQkJU0VUX1NUQVRVU19DVEwsIFNBVkVfVVNFUl9ERUZBVUxUU19GT1JNQVRURVIsIE5VTEwsIDApOwotfQotCi1pbnQgcHdjX3Jlc3RvcmVfZmFjdG9yeShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQlTRVRfU1RBVFVTX0NUTCwgUkVTVE9SRV9GQUNUT1JZX0RFRkFVTFRTX0ZPUk1BVFRFUiwgTlVMTCwgMCk7Ci19Ci0KLSAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0gLyogUGF0Y2ggYnkgQWx2YXJhZG86IChub3QgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24gICAqLwotCi0gLyoKLSAgKiB0aGUgY2FtZXJhIHJlY29nbml6ZXMgbW9kZXMgZnJvbSAwIHRvIDQ6Ci0gICoKLSAgKiAwMDogaW5kb29yIChpbmNhbmRlc2NhbnQgbGlnaHRpbmcpCi0gICogMDE6IG91dGRvb3IgKHN1bmxpZ2h0KQotICAqIDAyOiBmbHVvcmVzY2VudCBsaWdodGluZwotICAqIDAzOiBtYW51YWwKLSAgKiAwNDogYXV0bwotICAqLwotaW50IHB3Y19zZXRfYXdiKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbW9kZSkKLXsKLQljaGFyIGJ1ZjsKLQlpbnQgcmV0OwotCi0JaWYgKG1vZGUgPCAwKQotCSAgICBtb2RlID0gMDsKLQotCWlmIChtb2RlID4gNCkKLQkgICAgbW9kZSA9IDQ7Ci0KLQlidWYgPSBtb2RlICYgMHgwNzsgLyoganVzdCB0aGUgbG93ZXN0IHRocmVlIGJpdHMgKi8KLQotCXJldCA9IHNlbmRfY29udHJvbF9tc2cocGRldiwKLQkJU0VUX0NIUk9NX0NUTCwgV0JfTU9ERV9GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLQotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCXJldHVybiAwOwotfQotCi1pbnQgcHdjX2dldF9hd2Ioc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCi17Ci0JdW5zaWduZWQgY2hhciBidWY7Ci0JaW50IHJldDsKLQotCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwKLQkJR0VUX0NIUk9NX0NUTCwgV0JfTU9ERV9GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLQotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCXJldHVybiBidWY7Ci19Ci0KLWludCBwd2Nfc2V0X3JlZF9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpCi17Ci0JdW5zaWduZWQgY2hhciBidWY7Ci0KLQlpZiAodmFsdWUgPCAwKQotCQl2YWx1ZSA9IDA7Ci0JaWYgKHZhbHVlID4gMHhmZmZmKQotCQl2YWx1ZSA9IDB4ZmZmZjsKLQkvKiBvbmx5IHRoZSBtc2IgaXMgY29uc2lkZXJlZCAqLwotCWJ1ZiA9IHZhbHVlID4+IDg7Ci0JcmV0dXJuIHNlbmRfY29udHJvbF9tc2cocGRldiwKLQkJU0VUX0NIUk9NX0NUTCwgUFJFU0VUX01BTlVBTF9SRURfR0FJTl9GT1JNQVRURVIsCi0JCSZidWYsIHNpemVvZihidWYpKTsKLX0KLQotaW50IHB3Y19nZXRfcmVkX2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCi17Ci0JdW5zaWduZWQgY2hhciBidWY7Ci0JaW50IHJldDsKLQotCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwKLQkJR0VUX0NIUk9NX0NUTCwgUFJFU0VUX01BTlVBTF9SRURfR0FJTl9GT1JNQVRURVIsCi0JCSZidWYsIHNpemVvZihidWYpKTsKLQlpZiAocmV0IDwgMCkKLQkgICAgcmV0dXJuIHJldDsKLQkqdmFsdWUgPSBidWYgPDwgODsKLQlyZXR1cm4gMDsKLX0KLQotCi1pbnQgcHdjX3NldF9ibHVlX2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZjsKLQotCWlmICh2YWx1ZSA8IDApCi0JCXZhbHVlID0gMDsKLQlpZiAodmFsdWUgPiAweGZmZmYpCi0JCXZhbHVlID0gMHhmZmZmOwotCS8qIG9ubHkgdGhlIG1zYiBpcyBjb25zaWRlcmVkICovCi0JYnVmID0gdmFsdWUgPj4gODsKLQlyZXR1cm4gc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQlTRVRfQ0hST01fQ1RMLCBQUkVTRVRfTUFOVUFMX0JMVUVfR0FJTl9GT1JNQVRURVIsCi0JCSZidWYsIHNpemVvZihidWYpKTsKLX0KLQotaW50IHB3Y19nZXRfYmx1ZV9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQotewotCXVuc2lnbmVkIGNoYXIgYnVmOwotCWludCByZXQ7Ci0KLQlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsCi0JCUdFVF9DSFJPTV9DVEwsIFBSRVNFVF9NQU5VQUxfQkxVRV9HQUlOX0ZPUk1BVFRFUiwKLQkJJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCWlmIChyZXQgPCAwKQotCSAgICByZXR1cm4gcmV0OwotCSp2YWx1ZSA9IGJ1ZiA8PCA4OwotCXJldHVybiAwOwotfQotCi0KLS8qIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBhcmUgZGlmZmVyZW50LCBzaW5jZSB0aGV5IG9ubHkgcmVhZCB0aGUKLSAgIGludGVybmFsIHJlZC9ibHVlIGdhaW5zLCB3aGljaCBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIG1hbnVhbAotICAgZ2FpbnMgc2V0IG9yIHJlYWQgYWJvdmUuCi0gKi8KLXN0YXRpYyBpbnQgcHdjX3JlYWRfcmVkX2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCi17Ci0JdW5zaWduZWQgY2hhciBidWY7Ci0JaW50IHJldDsKLQotCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwKLQkJR0VUX1NUQVRVU19DVEwsIFJFQURfUkVEX0dBSU5fRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JKnZhbHVlID0gYnVmIDw8IDg7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHdjX3JlYWRfYmx1ZV9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQotewotCXVuc2lnbmVkIGNoYXIgYnVmOwotCWludCByZXQ7Ci0KLQlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsCi0JCUdFVF9TVEFUVVNfQ1RMLCBSRUFEX0JMVUVfR0FJTl9GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQkqdmFsdWUgPSBidWYgPDwgODsKLQlyZXR1cm4gMDsKLX0KLQotCiBzdGF0aWMgaW50IHB3Y19zZXRfd2Jfc3BlZWQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBzcGVlZCkKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZjsKQEAgLTEwMjgsNiArNjQ5LDcgQEAKIGludCBwd2Nfc2V0X2xlZHMoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBvbl92YWx1ZSwgaW50IG9mZl92YWx1ZSkKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKKwlpbnQgcjsKIAogCWlmIChwZGV2LT50eXBlIDwgNzMwKQogCQlyZXR1cm4gMDsKQEAgLTEwNDUsOCArNjY3LDEyIEBACiAJYnVmWzBdID0gb25fdmFsdWU7CiAJYnVmWzFdID0gb2ZmX3ZhbHVlOwogCi0JcmV0dXJuIHNlbmRfY29udHJvbF9tc2cocGRldiwKKwlyID0gc2VuZF9jb250cm9sX21zZyhwZGV2LAogCQlTRVRfU1RBVFVTX0NUTCwgTEVEX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWlmIChyIDwgMCkKKwkJUFdDX0VSUk9SKCJGYWlsZWQgdG8gc2V0IExFRCBvbi9vZmYgdGltZSAoJWQpXG4iLCByKTsKKworCXJldHVybiByOwogfQogCiBzdGF0aWMgaW50IHB3Y19nZXRfbGVkcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpvbl92YWx1ZSwgaW50ICpvZmZfdmFsdWUpCkBAIC0xMDY5LDE2NCArNjk1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHB3Y19zZXRfY29udG91cihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGNvbnRvdXIpCi17Ci0JdW5zaWduZWQgY2hhciBidWY7Ci0JaW50IHJldDsKLQotCWlmIChjb250b3VyIDwgMCkKLQkJYnVmID0gMHhmZjsgLyogYXV0byBjb250b3VyIG9uICovCi0JZWxzZQotCQlidWYgPSAweDA7IC8qIGF1dG8gY29udG91ciBvZmYgKi8KLQlyZXQgPSBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCVNFVF9MVU1fQ1RMLCBBVVRPX0NPTlRPVVJfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoY29udG91ciA8IDApCi0JCXJldHVybiAwOwotCWlmIChjb250b3VyID4gMHhmZmZmKQotCQljb250b3VyID0gMHhmZmZmOwotCi0JYnVmID0gKGNvbnRvdXIgPj4gMTApOyAvKiBjb250b3VyIHByZXNldCBpcyBbMC4uM2ZdICovCi0JcmV0ID0gc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQlTRVRfTFVNX0NUTCwgUFJFU0VUX0NPTlRPVVJfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBwd2NfZ2V0X2NvbnRvdXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqY29udG91cikKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LAotCQlHRVRfTFVNX0NUTCwgQVVUT19DT05UT1VSX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKGJ1ZiA9PSAwKSB7Ci0JCS8qIGF1dG8gbW9kZSBvZmYsIHF1ZXJ5IGN1cnJlbnQgcHJlc2V0IHZhbHVlICovCi0JCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwKLQkJCUdFVF9MVU1fQ1RMLCBQUkVTRVRfQ09OVE9VUl9GT1JNQVRURVIsCi0JCQkmYnVmLCBzaXplb2YoYnVmKSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQkJKmNvbnRvdXIgPSBidWYgPDwgMTA7Ci0JfQotCWVsc2UKLQkJKmNvbnRvdXIgPSAtMTsKLQlyZXR1cm4gMDsKLX0KLQotCi1pbnQgcHdjX3NldF9iYWNrbGlnaHQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBiYWNrbGlnaHQpCi17Ci0JdW5zaWduZWQgY2hhciBidWY7Ci0KLQlpZiAoYmFja2xpZ2h0KQotCQlidWYgPSAweGZmOwotCWVsc2UKLQkJYnVmID0gMHgwOwotCXJldHVybiBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCVNFVF9MVU1fQ1RMLCBCQUNLX0xJR0hUX0NPTVBFTlNBVElPTl9GT1JNQVRURVIsCi0JCSZidWYsIHNpemVvZihidWYpKTsKLX0KLQotaW50IHB3Y19nZXRfYmFja2xpZ2h0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKmJhY2tsaWdodCkKLXsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGNoYXIgYnVmOwotCi0JcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LAotCQlHRVRfTFVNX0NUTCwgQkFDS19MSUdIVF9DT01QRU5TQVRJT05fRk9STUFUVEVSLAotCQkmYnVmLCBzaXplb2YoYnVmKSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JKmJhY2tsaWdodCA9ICEhYnVmOwotCXJldHVybiAwOwotfQotCi1pbnQgcHdjX3NldF9jb2xvdXJfbW9kZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGNvbG91cikKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZjsKLQotCWlmIChjb2xvdXIpCi0JCWJ1ZiA9IDB4ZmY7Ci0JZWxzZQotCQlidWYgPSAweDA7Ci0JcmV0dXJuIHNlbmRfY29udHJvbF9tc2cocGRldiwKLQkJU0VUX0NIUk9NX0NUTCwgQ09MT1VSX01PREVfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci19Ci0KLWludCBwd2NfZ2V0X2NvbG91cl9tb2RlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKmNvbG91cikKLXsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGNoYXIgYnVmOwotCi0JcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LAotCQlHRVRfQ0hST01fQ1RMLCBDT0xPVVJfTU9ERV9GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQkqY29sb3VyID0gISFidWY7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotaW50IHB3Y19zZXRfZmxpY2tlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGZsaWNrZXIpCi17Ci0JdW5zaWduZWQgY2hhciBidWY7Ci0KLQlpZiAoZmxpY2tlcikKLQkJYnVmID0gMHhmZjsKLQllbHNlCi0JCWJ1ZiA9IDB4MDsKLQlyZXR1cm4gc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQlTRVRfTFVNX0NUTCwgRkxJQ0tFUkxFU1NfTU9ERV9GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLX0KLQotaW50IHB3Y19nZXRfZmxpY2tlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpmbGlja2VyKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgY2hhciBidWY7Ci0KLQlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsCi0JCUdFVF9MVU1fQ1RMLCBGTElDS0VSTEVTU19NT0RFX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCSpmbGlja2VyID0gISFidWY7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBwd2Nfc2V0X2R5bmFtaWNfbm9pc2Uoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBub2lzZSkKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZjsKLQotCWlmIChub2lzZSA8IDApCi0JCW5vaXNlID0gMDsKLQlpZiAobm9pc2UgPiAzKQotCQlub2lzZSA9IDM7Ci0JYnVmID0gbm9pc2U7Ci0JcmV0dXJuIHNlbmRfY29udHJvbF9tc2cocGRldiwKLQkJU0VUX0xVTV9DVEwsIERZTkFNSUNfTk9JU0VfQ09OVFJPTF9GT1JNQVRURVIsCi0JCSZidWYsIHNpemVvZihidWYpKTsKLX0KLQotaW50IHB3Y19nZXRfZHluYW1pY19ub2lzZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpub2lzZSkKLXsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGNoYXIgYnVmOwotCi0JcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LAotCQlHRVRfTFVNX0NUTCwgRFlOQU1JQ19OT0lTRV9DT05UUk9MX0ZPUk1BVFRFUiwKLQkJJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCSpub2lzZSA9IGJ1ZjsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBfcHdjX21wdF9yZXNldChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGZsYWdzKQogewogCXVuc2lnbmVkIGNoYXIgYnVmOwpAQCAtMTMwOSw3ICs3NzcsNyBAQAogCXJldHVybiAwOwogfQogCi0KKyNpZmRlZiBDT05GSUdfVVNCX1BXQ19ERUJVRwogaW50IHB3Y19nZXRfY21vc19zZW5zb3Ioc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqc2Vuc29yKQogewogCXVuc2lnbmVkIGNoYXIgYnVmOwpAQCAtMTMzMiw3ICs4MDAsNyBAQAogCQkqc2Vuc29yID0gYnVmOwogCXJldHVybiAwOwogfQotCisjZW5kaWYKIAogIC8qIEVuZCBvZiBBZGQtT25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCkBAIC0xMzU2LDM3ICs4MjQsNDEgQEAKIC8qIGNvcHkgbG9jYWwgdmFyaWFibGUgdG8gYXJnICovCiAjZGVmaW5lIEFSR19PVVQoQVJHX25hbWUpIC8qIG5vdGhpbmcgKi8KIAorLyoKKyAqIE91ciBjdHJscyB1c2UgbmF0aXZlIHZhbHVlcywgYnV0IHRoZSBvbGQgY3VzdG9tIHB3YyBpb2N0bCBpbnRlcmZhY2UgZXhwZWN0cworICogdmFsdWVzIGZyb20gMCAtIDY1NTM1LCBkZWZpbmUgMiBoZWxwZXIgZnVuY3Rpb25zIHRvIHNjYWxlIHRoaW5ncy4gKi8KK3N0YXRpYyBpbnQgcHdjX2lvY3RsX2dfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQoreworCXJldHVybiB2NGwyX2N0cmxfZ19jdHJsKGN0cmwpICogNjU1MzUgLyBjdHJsLT5tYXhpbXVtOworfQorCitzdGF0aWMgaW50IHB3Y19pb2N0bF9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCwgaW50IHZhbCkKK3sKKwlyZXR1cm4gdjRsMl9jdHJsX3NfY3RybChjdHJsLCB2YWwgKiBjdHJsLT5tYXhpbXVtIC8gNjU1MzUpOworfQorCiBsb25nIHB3Y19pb2N0bChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewogCWxvbmcgcmV0ID0gMDsKIAogCXN3aXRjaChjbWQpIHsKIAljYXNlIFZJRElPQ1BXQ1JVU0VSOgotCXsKLQkJaWYgKHB3Y19yZXN0b3JlX3VzZXIocGRldikpCi0JCQlyZXQgPSAtRUlOVkFMOworCQlyZXQgPSBwd2NfYnV0dG9uX2N0cmwocGRldiwgUkVTVE9SRV9VU0VSX0RFRkFVTFRTX0ZPUk1BVFRFUik7CiAJCWJyZWFrOwotCX0KIAogCWNhc2UgVklESU9DUFdDU1VTRVI6Ci0JewotCQlpZiAocHdjX3NhdmVfdXNlcihwZGV2KSkKLQkJCXJldCA9IC1FSU5WQUw7CisJCXJldCA9IHB3Y19idXR0b25fY3RybChwZGV2LCBTQVZFX1VTRVJfREVGQVVMVFNfRk9STUFUVEVSKTsKIAkJYnJlYWs7Ci0JfQogCiAJY2FzZSBWSURJT0NQV0NGQUNUT1JZOgotCXsKLQkJaWYgKHB3Y19yZXN0b3JlX2ZhY3RvcnkocGRldikpCi0JCQlyZXQgPSAtRUlOVkFMOworCQlyZXQgPSBwd2NfYnV0dG9uX2N0cmwocGRldiwgUkVTVE9SRV9GQUNUT1JZX0RFRkFVTFRTX0ZPUk1BVFRFUik7CiAJCWJyZWFrOwotCX0KIAogCWNhc2UgVklESU9DUFdDU0NRVUFMOgogCXsKIAkJQVJHX0RFRihpbnQsIHF1YWwpCiAKLQkJaWYgKHBkZXYtPmlzb19pbml0KSB7CisJCWlmICh2YjJfaXNfc3RyZWFtaW5nKCZwZGV2LT52Yl9xdWV1ZSkpIHsKIAkJCXJldCA9IC1FQlVTWTsKIAkJCWJyZWFrOwogCQl9CkBAIC0xMzk2LDggKzg2OCw2IEBACiAJCQlyZXQgPSAtRUlOVkFMOwogCQllbHNlCiAJCQlyZXQgPSBwd2Nfc2V0X3ZpZGVvX21vZGUocGRldiwgcGRldi0+dmlldy54LCBwZGV2LT52aWV3LnksIHBkZXYtPnZmcmFtZXMsIEFSR1IocXVhbCksIHBkZXYtPnZzbmFwc2hvdCk7Ci0JCWlmIChyZXQgPj0gMCkKLQkJCXBkZXYtPnZjb21wcmVzc2lvbiA9IEFSR1IocXVhbCk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTQzMiw3MSArOTAyLDU5IEBACiAJY2FzZSBWSURJT0NQV0NTQUdDOgogCXsKIAkJQVJHX0RFRihpbnQsIGFnYykKLQogCQlBUkdfSU4oYWdjKQotCQlpZiAocHdjX3NldF9hZ2MocGRldiwgQVJHUihhZ2MpIDwgMCA/IDEgOiAwLCBBUkdSKGFnYykpKQotCQkJcmV0ID0gLUVJTlZBTDsKKwkJcmV0ID0gdjRsMl9jdHJsX3NfY3RybChwZGV2LT5hdXRvZ2FpbiwgQVJHUihhZ2MpIDwgMCk7CisJCWlmIChyZXQgPT0gMCAmJiBBUkdSKGFnYykgPj0gMCkKKwkJCXJldCA9IHB3Y19pb2N0bF9zX2N0cmwocGRldi0+Z2FpbiwgQVJHUihhZ2MpKTsKIAkJYnJlYWs7CiAJfQogCiAJY2FzZSBWSURJT0NQV0NHQUdDOgogCXsKIAkJQVJHX0RFRihpbnQsIGFnYykKLQotCQlpZiAocHdjX2dldF9hZ2MocGRldiwgQVJHQShhZ2MpKSkKLQkJCXJldCA9IC1FSU5WQUw7CisJCWlmICh2NGwyX2N0cmxfZ19jdHJsKHBkZXYtPmF1dG9nYWluKSkKKwkJCUFSR1IoYWdjKSA9IC0xOworCQllbHNlCisJCQlBUkdSKGFnYykgPSBwd2NfaW9jdGxfZ19jdHJsKHBkZXYtPmdhaW4pOwogCQlBUkdfT1VUKGFnYykKIAkJYnJlYWs7CiAJfQogCiAJY2FzZSBWSURJT0NQV0NTU0hVVFRFUjoKIAl7Ci0JCUFSR19ERUYoaW50LCBzaHV0dGVyX3NwZWVkKQotCi0JCUFSR19JTihzaHV0dGVyX3NwZWVkKQotCQlyZXQgPSBwd2Nfc2V0X3NodXR0ZXJfc3BlZWQocGRldiwgQVJHUihzaHV0dGVyX3NwZWVkKSA8IDAgPyAxIDogMCwgQVJHUihzaHV0dGVyX3NwZWVkKSk7CisJCUFSR19ERUYoaW50LCBzaHV0dGVyKQorCQlBUkdfSU4oc2h1dHRlcikKKwkJcmV0ID0gdjRsMl9jdHJsX3NfY3RybChwZGV2LT5leHBvc3VyZV9hdXRvLAorCQkJCSAgICAgICAvKiBNZW51IGlkeCAwID0gYXV0bywgaWR4IDEgPSBtYW51YWwgKi8KKwkJCQkgICAgICAgQVJHUihzaHV0dGVyKSA+PSAwKTsKKwkJaWYgKHJldCA9PSAwICYmIEFSR1Ioc2h1dHRlcikgPj0gMCkKKwkJCXJldCA9IHB3Y19pb2N0bF9zX2N0cmwocGRldi0+ZXhwb3N1cmUsIEFSR1Ioc2h1dHRlcikpOwogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ1NBV0I6CiAJewogCQlBUkdfREVGKHN0cnVjdCBwd2Nfd2hpdGViYWxhbmNlLCB3YikKLQogCQlBUkdfSU4od2IpCi0JCXJldCA9IHB3Y19zZXRfYXdiKHBkZXYsIEFSR1Iod2IpLm1vZGUpOwotCQlpZiAocmV0ID49IDAgJiYgQVJHUih3YikubW9kZSA9PSBQV0NfV0JfTUFOVUFMKSB7Ci0JCQlwd2Nfc2V0X3JlZF9nYWluKHBkZXYsIEFSR1Iod2IpLm1hbnVhbF9yZWQpOwotCQkJcHdjX3NldF9ibHVlX2dhaW4ocGRldiwgQVJHUih3YikubWFudWFsX2JsdWUpOwotCQl9CisJCXJldCA9IHY0bDJfY3RybF9zX2N0cmwocGRldi0+YXV0b193aGl0ZV9iYWxhbmNlLAorCQkJCSAgICAgICBBUkdSKHdiKS5tb2RlKTsKKwkJaWYgKHJldCA9PSAwICYmIEFSR1Iod2IpLm1vZGUgPT0gUFdDX1dCX01BTlVBTCkKKwkJCXJldCA9IHB3Y19pb2N0bF9zX2N0cmwocGRldi0+cmVkX2JhbGFuY2UsCisJCQkJCSAgICAgICBBUkdSKHdiKS5tYW51YWxfcmVkKTsKKwkJaWYgKHJldCA9PSAwICYmIEFSR1Iod2IpLm1vZGUgPT0gUFdDX1dCX01BTlVBTCkKKwkJCXJldCA9IHB3Y19pb2N0bF9zX2N0cmwocGRldi0+Ymx1ZV9iYWxhbmNlLAorCQkJCQkgICAgICAgQVJHUih3YikubWFudWFsX2JsdWUpOwogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ0dBV0I6CiAJewogCQlBUkdfREVGKHN0cnVjdCBwd2Nfd2hpdGViYWxhbmNlLCB3YikKLQotCQltZW1zZXQoQVJHQSh3YiksIDAsIHNpemVvZihzdHJ1Y3QgcHdjX3doaXRlYmFsYW5jZSkpOwotCQlBUkdSKHdiKS5tb2RlID0gcHdjX2dldF9hd2IocGRldik7Ci0JCWlmIChBUkdSKHdiKS5tb2RlIDwgMCkKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCWVsc2UgewotCQkJaWYgKEFSR1Iod2IpLm1vZGUgPT0gUFdDX1dCX01BTlVBTCkgewotCQkJCXJldCA9IHB3Y19nZXRfcmVkX2dhaW4ocGRldiwgJkFSR1Iod2IpLm1hbnVhbF9yZWQpOwotCQkJCWlmIChyZXQgPCAwKQotCQkJCQlicmVhazsKLQkJCQlyZXQgPSBwd2NfZ2V0X2JsdWVfZ2FpbihwZGV2LCAmQVJHUih3YikubWFudWFsX2JsdWUpOwotCQkJCWlmIChyZXQgPCAwKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChBUkdSKHdiKS5tb2RlID09IFBXQ19XQl9BVVRPKSB7Ci0JCQkJcmV0ID0gcHdjX3JlYWRfcmVkX2dhaW4ocGRldiwgJkFSR1Iod2IpLnJlYWRfcmVkKTsKLQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJYnJlYWs7Ci0JCQkJcmV0ID0gcHdjX3JlYWRfYmx1ZV9nYWluKHBkZXYsICZBUkdSKHdiKS5yZWFkX2JsdWUpOwotCQkJCWlmIChyZXQgPCAwKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQorCQlBUkdSKHdiKS5tb2RlID0gdjRsMl9jdHJsX2dfY3RybChwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UpOworCQlBUkdSKHdiKS5tYW51YWxfcmVkID0gQVJHUih3YikucmVhZF9yZWQgPQorCQkJcHdjX2lvY3RsX2dfY3RybChwZGV2LT5yZWRfYmFsYW5jZSk7CisJCUFSR1Iod2IpLm1hbnVhbF9ibHVlID0gQVJHUih3YikucmVhZF9ibHVlID0KKwkJCXB3Y19pb2N0bF9nX2N0cmwocGRldi0+Ymx1ZV9iYWxhbmNlKTsKIAkJQVJHX09VVCh3YikKIAkJYnJlYWs7CiAJfQpAQCAtMTU1MCwxNyArMTAwOCwyMCBAQAogCWNhc2UgVklESU9DUFdDU0NPTlRPVVI6CiAJewogCQlBUkdfREVGKGludCwgY29udG91cikKLQogCQlBUkdfSU4oY29udG91cikKLQkJcmV0ID0gcHdjX3NldF9jb250b3VyKHBkZXYsIEFSR1IoY29udG91cikpOworCQlyZXQgPSB2NGwyX2N0cmxfc19jdHJsKHBkZXYtPmF1dG9jb250b3VyLCBBUkdSKGNvbnRvdXIpIDwgMCk7CisJCWlmIChyZXQgPT0gMCAmJiBBUkdSKGNvbnRvdXIpID49IDApCisJCQlyZXQgPSBwd2NfaW9jdGxfc19jdHJsKHBkZXYtPmNvbnRvdXIsIEFSR1IoY29udG91cikpOwogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ0dDT05UT1VSOgogCXsKIAkJQVJHX0RFRihpbnQsIGNvbnRvdXIpCi0KLQkJcmV0ID0gcHdjX2dldF9jb250b3VyKHBkZXYsIEFSR0EoY29udG91cikpOworCQlpZiAodjRsMl9jdHJsX2dfY3RybChwZGV2LT5hdXRvY29udG91cikpCisJCQlBUkdSKGNvbnRvdXIpID0gLTE7CisJCWVsc2UKKwkJCUFSR1IoY29udG91cikgPSBwd2NfaW9jdGxfZ19jdHJsKHBkZXYtPmNvbnRvdXIpOwogCQlBUkdfT1VUKGNvbnRvdXIpCiAJCWJyZWFrOwogCX0KQEAgLTE1NjgsMTcgKzEwMjksMTUgQEAKIAljYXNlIFZJRElPQ1BXQ1NCQUNLTElHSFQ6CiAJewogCQlBUkdfREVGKGludCwgYmFja2xpZ2h0KQotCiAJCUFSR19JTihiYWNrbGlnaHQpCi0JCXJldCA9IHB3Y19zZXRfYmFja2xpZ2h0KHBkZXYsIEFSR1IoYmFja2xpZ2h0KSk7CisJCXJldCA9IHY0bDJfY3RybF9zX2N0cmwocGRldi0+YmFja2xpZ2h0LCBBUkdSKGJhY2tsaWdodCkpOwogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ0dCQUNLTElHSFQ6CiAJewogCQlBUkdfREVGKGludCwgYmFja2xpZ2h0KQotCi0JCXJldCA9IHB3Y19nZXRfYmFja2xpZ2h0KHBkZXYsIEFSR0EoYmFja2xpZ2h0KSk7CisJCUFSR1IoYmFja2xpZ2h0KSA9IHY0bDJfY3RybF9nX2N0cmwocGRldi0+YmFja2xpZ2h0KTsKIAkJQVJHX09VVChiYWNrbGlnaHQpCiAJCWJyZWFrOwogCX0KQEAgLTE1ODYsMTcgKzEwNDUsMTUgQEAKIAljYXNlIFZJRElPQ1BXQ1NGTElDS0VSOgogCXsKIAkJQVJHX0RFRihpbnQsIGZsaWNrZXIpCi0KIAkJQVJHX0lOKGZsaWNrZXIpCi0JCXJldCA9IHB3Y19zZXRfZmxpY2tlcihwZGV2LCBBUkdSKGZsaWNrZXIpKTsKKwkJcmV0ID0gdjRsMl9jdHJsX3NfY3RybChwZGV2LT5mbGlja2VyLCBBUkdSKGZsaWNrZXIpKTsKIAkJYnJlYWs7CiAJfQogCiAJY2FzZSBWSURJT0NQV0NHRkxJQ0tFUjoKIAl7CiAJCUFSR19ERUYoaW50LCBmbGlja2VyKQotCi0JCXJldCA9IHB3Y19nZXRfZmxpY2tlcihwZGV2LCBBUkdBKGZsaWNrZXIpKTsKKwkJQVJHUihmbGlja2VyKSA9IHY0bDJfY3RybF9nX2N0cmwocGRldi0+ZmxpY2tlcik7CiAJCUFSR19PVVQoZmxpY2tlcikKIAkJYnJlYWs7CiAJfQpAQCAtMTYwNCwxNyArMTA2MSwxNSBAQAogCWNhc2UgVklESU9DUFdDU0RZTk5PSVNFOgogCXsKIAkJQVJHX0RFRihpbnQsIGR5bm5vaXNlKQotCiAJCUFSR19JTihkeW5ub2lzZSkKLQkJcmV0ID0gcHdjX3NldF9keW5hbWljX25vaXNlKHBkZXYsIEFSR1IoZHlubm9pc2UpKTsKKwkJcmV0ID0gdjRsMl9jdHJsX3NfY3RybChwZGV2LT5ub2lzZV9yZWR1Y3Rpb24sIEFSR1IoZHlubm9pc2UpKTsKIAkJYnJlYWs7CiAJfQogCiAJY2FzZSBWSURJT0NQV0NHRFlOTk9JU0U6CiAJewogCQlBUkdfREVGKGludCwgZHlubm9pc2UpCi0KLQkJcmV0ID0gcHdjX2dldF9keW5hbWljX25vaXNlKHBkZXYsIEFSR0EoZHlubm9pc2UpKTsKKwkJQVJHUihkeW5ub2lzZSkgPSB2NGwyX2N0cmxfZ19jdHJsKHBkZXYtPm5vaXNlX3JlZHVjdGlvbik7CiAJCUFSR19PVVQoZHlubm9pc2UpOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWRlYzEuYwppbmRleCBjMjk1OTNmLi5iZTBlMDJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMxLmMKQEAgLTIyLDI5ICsyMiwxOSBAQAogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCi0KLQotCiAjaW5jbHVkZSAicHdjLWRlYzEuaCIKIAotCi12b2lkIHB3Y19kZWMxX2luaXQoaW50IHR5cGUsIGludCByZWxlYXNlLCB2b2lkICpidWZmZXIsIHZvaWQgKnRhYmxlKQoraW50IHB3Y19kZWMxX2luaXQoc3RydWN0IHB3Y19kZXZpY2UgKnB3YywgaW50IHR5cGUsIGludCByZWxlYXNlLCB2b2lkICpidWZmZXIpCiB7CisJc3RydWN0IHB3Y19kZWMxX3ByaXZhdGUgKnBkZWM7CiAKLX0KKwlpZiAocHdjLT5kZWNvbXByZXNzX2RhdGEgPT0gTlVMTCkgeworCQlwZGVjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHB3Y19kZWMxX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHBkZWMgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlwd2MtPmRlY29tcHJlc3NfZGF0YSA9IHBkZWM7CisJfQorCXBkZWMgPSBwd2MtPmRlY29tcHJlc3NfZGF0YTsKIAotdm9pZCBwd2NfZGVjMV9leGl0KHZvaWQpCi17Ci0KLQotCi19Ci0KLWludCBwd2NfZGVjMV9hbGxvYyhzdHJ1Y3QgcHdjX2RldmljZSAqcHdjKQotewotCXB3Yy0+ZGVjb21wcmVzc19kYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHB3Y19kZWMxX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAocHdjLT5kZWNvbXByZXNzX2RhdGEgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07CiAJcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMxLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMS5oCmluZGV4IDhiNjJkZGMuLmE1N2Q4NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMxLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWRlYzEuaApAQCAtMjIsOCArMjIsNiBAQAogICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KIAotCi0KICNpZm5kZWYgUFdDX0RFQzFfSAogI2RlZmluZSBQV0NfREVDMV9ICiAKQEAgLTMyLDEyICszMCw4IEBACiBzdHJ1Y3QgcHdjX2RlYzFfcHJpdmF0ZQogewogCWludCB2ZXJzaW9uOwotCiB9OwogCi1pbnQgIHB3Y19kZWMxX2FsbG9jKHN0cnVjdCBwd2NfZGV2aWNlICpwd2MpOwotdm9pZCBwd2NfZGVjMV9pbml0KGludCB0eXBlLCBpbnQgcmVsZWFzZSwgdm9pZCAqYnVmZmVyLCB2b2lkICpwcml2YXRlX2RhdGEpOwotdm9pZCBwd2NfZGVjMV9leGl0KHZvaWQpOworaW50IHB3Y19kZWMxX2luaXQoc3RydWN0IHB3Y19kZXZpY2UgKnB3YywgaW50IHR5cGUsIGludCByZWxlYXNlLCB2b2lkICpidWZmZXIpOwogCiAjZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWRlYzIzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMjMuYwppbmRleCAwYzgwMWI4Li4wNmE0ZTg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMjMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMjMuYwpAQCAtOTE2LDI3ICs5MTYsNSBAQAogCQkJcG91dF9wbGFuYXJfdiArPSBwd2MtPnZpZXcueDsKIAogCQl9Ci0KIAl9Ci0KIH0KLQotdm9pZCBwd2NfZGVjMjNfZXhpdCh2b2lkKQotewotCS8qIERvIG5vdGhpbmcgKi8KLQotfQotCi0vKioKLSAqIEFsbG9jYXRlIGEgcHJpdmF0ZSBzdHJ1Y3R1cmUgdXNlZCBieSBsb29rdXAgdGFibGUuCi0gKiBZb3UgbXVzdCBjYWxsIGtmcmVlKCkgdG8gZnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZC4KLSAqLwotaW50IHB3Y19kZWMyM19hbGxvYyhzdHJ1Y3QgcHdjX2RldmljZSAqcHdjKQotewotCXB3Yy0+ZGVjb21wcmVzc19kYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHB3Y19kZWMyM19wcml2YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHB3Yy0+ZGVjb21wcmVzc19kYXRhID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCXJldHVybiAwOwotfQotCi0vKiB2aW06IHNldCBjaW5vPSBmb3JtYXRvcHRpb25zPWNyb3FsIGNpbmRlbnQgc2hpZnR3aWR0aD04IHRhYnN0b3A9ODogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMyMy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWRlYzIzLmgKaW5kZXggMWM1NTI5OC4uYTBhYzRmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWRlYzIzLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWRlYzIzLmgKQEAgLTQ5LDE5ICs0OSw5IEBACiAKIH07CiAKLQotaW50IHB3Y19kZWMyM19hbGxvYyhzdHJ1Y3QgcHdjX2RldmljZSAqcHdjKTsKIGludCBwd2NfZGVjMjNfaW5pdChzdHJ1Y3QgcHdjX2RldmljZSAqcHdjLCBpbnQgdHlwZSwgdW5zaWduZWQgY2hhciAqY21kKTsKLXZvaWQgcHdjX2RlYzIzX2V4aXQodm9pZCk7CiB2b2lkIHB3Y19kZWMyM19kZWNvbXByZXNzKGNvbnN0IHN0cnVjdCBwd2NfZGV2aWNlICpwd2MsCiAJCQkgIGNvbnN0IHZvaWQgKnNyYywKIAkJCSAgdm9pZCAqZHN0LAogCQkJICBpbnQgZmxhZ3MpOwotCi0KLQogI2VuZGlmCi0KLQotLyogdmltOiBzZXQgY2lubz0gZm9ybWF0b3B0aW9ucz1jcm9xbCBjaW5kZW50IHNoaWZ0d2lkdGg9OCB0YWJzdG9wPTg6ICovCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWlmLmMKaW5kZXggYjBiZGU1YS4uNTFjYTM1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWlmLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWlmLmMKQEAgLTIsNiArMiw3IEBACiAgICBVU0IgYW5kIFZpZGVvNExpbnV4IGludGVyZmFjZSBwYXJ0LgogICAgKEMpIDE5OTktMjAwNCBOZW1vc29mdCBVbnYuCiAgICAoQykgMjAwNC0yMDA2IEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKyAgIChDKSAyMDExIEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CiAKICAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAogICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCkBAIC03NCw3ICs3NSw2IEBACiAjaW5jbHVkZSAicHdjLXRpbW9uLmgiCiAjaW5jbHVkZSAicHdjLWRlYzIzLmgiCiAjaW5jbHVkZSAicHdjLWRlYzEuaCIKLSNpbmNsdWRlICJwd2MtdW5jb21wcmVzcy5oIgogCiAvKiBGdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBkcml2ZXIgdGVtcGxhdGVzICovCiAKQEAgLTExNiw2ICsxMTYsNyBAQAogCiBzdGF0aWMgaW50IHVzYl9wd2NfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CiBzdGF0aWMgdm9pZCB1c2JfcHdjX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworc3RhdGljIHZvaWQgcHdjX2lzb2NfY2xlYW51cChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBwd2NfZHJpdmVyID0gewogCS5uYW1lID0JCQkiUGhpbGlwcyB3ZWJjYW0iLAkvKiBuYW1lICovCkBAIC0xMjcsMTQgKzEyOCwxMSBAQAogI2RlZmluZSBNQVhfREVWX0hJTlRTCTIwCiAjZGVmaW5lIE1BWF9JU09DX0VSUk9SUwkyMAogCi1zdGF0aWMgaW50IGRlZmF1bHRfc2l6ZSA9IFBTWl9RQ0lGOwogc3RhdGljIGludCBkZWZhdWx0X2ZwcyA9IDEwOwotc3RhdGljIGludCBkZWZhdWx0X2ZidWZzID0gMzsgICAvKiBEZWZhdWx0IG51bWJlciBvZiBmcmFtZSBidWZmZXJzICovCi0JaW50IHB3Y19tYnVmcyA9IDI7CS8qIERlZmF1bHQgbnVtYmVyIG9mIG1tYXAoKSBidWZmZXJzICovCiAjaWZkZWYgQ09ORklHX1VTQl9QV0NfREVCVUcKIAlpbnQgcHdjX3RyYWNlID0gUFdDX0RFQlVHX0xFVkVMOwogI2VuZGlmCi1zdGF0aWMgaW50IHBvd2VyX3NhdmU7CitzdGF0aWMgaW50IHBvd2VyX3NhdmUgPSAtMTsKIHN0YXRpYyBpbnQgbGVkX29uID0gMTAwLCBsZWRfb2ZmOyAvKiBkZWZhdWx0cyB0byBMRUQgdGhhdCBpcyBvbiB3aGlsZSBpbiB1c2UgKi8KIHN0YXRpYyBpbnQgcHdjX3ByZWZlcnJlZF9jb21wcmVzc2lvbiA9IDE7IC8qIDAuLjMgPSB1bmNvbXByZXNzZWQuLmhpZ2ggKi8KIHN0YXRpYyBzdHJ1Y3QgewpAQCAtMTczLDM4OSArMTcxLDIwIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogUHJpdmF0ZSBmdW5jdGlvbnMgKi8KIAotLyogSGVyZSB3ZSB3YW50IHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBtZW1vcnkuCi0gKiBUaGlzIGlzIHVzZWQgd2hlbiBpbml0aWFsaXppbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSBhcmVhLgotICovCi0KLQotCi1zdGF0aWMgdm9pZCAqcHdjX3J2bWFsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3N0cnVjdCBwd2NfZnJhbWVfYnVmICpwd2NfZ2V0X25leHRfZmlsbF9idWYoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7Ci0Jdm9pZCAqIG1lbTsKLQl1bnNpZ25lZCBsb25nIGFkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqYnVmID0gTlVMTDsKIAotCW1lbT12bWFsbG9jXzMyKHNpemUpOwotCWlmICghbWVtKQotCQlyZXR1cm4gTlVMTDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGRldi0+cXVldWVkX2J1ZnNfbG9jaywgZmxhZ3MpOworCWlmIChsaXN0X2VtcHR5KCZwZGV2LT5xdWV1ZWRfYnVmcykpCisJCWdvdG8gbGVhdmU7CiAKLQltZW1zZXQobWVtLCAwLCBzaXplKTsgLyogQ2xlYXIgdGhlIHJhbSBvdXQsIG5vIGp1bmsgdG8gdGhlIHVzZXIgKi8KLQlhZHI9KHVuc2lnbmVkIGxvbmcpIG1lbTsKLQl3aGlsZSAoc2l6ZSA+IDApCi0JIHsKLQkgICBTZXRQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7Ci0JICAgYWRyICArPSBQQUdFX1NJWkU7Ci0JICAgc2l6ZSAtPSBQQUdFX1NJWkU7Ci0JIH0KLQlyZXR1cm4gbWVtOwotfQotCi1zdGF0aWMgdm9pZCBwd2NfcnZmcmVlKHZvaWQgKiBtZW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGFkcjsKLQotCWlmICghbWVtKQotCQlyZXR1cm47Ci0KLQlhZHI9KHVuc2lnbmVkIGxvbmcpIG1lbTsKLQl3aGlsZSAoKGxvbmcpIHNpemUgPiAwKQotCSB7Ci0JICAgQ2xlYXJQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7Ci0JICAgYWRyICArPSBQQUdFX1NJWkU7Ci0JICAgc2l6ZSAtPSBQQUdFX1NJWkU7Ci0JIH0KLQl2ZnJlZShtZW0pOwotfQotCi0KLQotCi1zdGF0aWMgaW50IHB3Y19hbGxvY2F0ZV9idWZmZXJzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQotewotCWludCBpLCBlcnI7Ci0Jdm9pZCAqa2J1ZjsKLQotCVBXQ19ERUJVR19NRU1PUlkoIj4+IHB3Y19hbGxvY2F0ZV9idWZmZXJzKHBkZXYgPSAweCVwKVxuIiwgcGRldik7Ci0KLQlpZiAocGRldiA9PSBOVUxMKQotCQlyZXR1cm4gLUVOWElPOwotCi0JLyogQWxsb2NhdGUgSXNvY2hyb251b3VzIHBpcGUgYnVmZmVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhfSVNPX0JVRlM7IGkrKykgewotCQlpZiAocGRldi0+c2J1ZltpXS5kYXRhID09IE5VTEwpIHsKLQkJCWtidWYgPSBremFsbG9jKElTT19CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoa2J1ZiA9PSBOVUxMKSB7Ci0JCQkJUFdDX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgaXNvIGJ1ZmZlciAlZC5cbiIsIGkpOwotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQotCQkJUFdDX0RFQlVHX01FTU9SWSgiQWxsb2NhdGVkIGlzbyBidWZmZXIgYXQgJXAuXG4iLCBrYnVmKTsKLQkJCXBkZXYtPnNidWZbaV0uZGF0YSA9IGtidWY7Ci0JCX0KLQl9Ci0KLQkvKiBBbGxvY2F0ZSBmcmFtZSBidWZmZXIgc3RydWN0dXJlICovCi0JaWYgKHBkZXYtPmZidWYgPT0gTlVMTCkgewotCQlrYnVmID0ga3phbGxvYyhkZWZhdWx0X2ZidWZzICogc2l6ZW9mKHN0cnVjdCBwd2NfZnJhbWVfYnVmKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChrYnVmID09IE5VTEwpIHsKLQkJCVBXQ19FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUuXG4iKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCVBXQ19ERUJVR19NRU1PUlkoIkFsbG9jYXRlZCBmcmFtZSBidWZmZXIgc3RydWN0dXJlIGF0ICVwLlxuIiwga2J1Zik7Ci0JCXBkZXYtPmZidWYgPSBrYnVmOwotCX0KLQotCS8qIGNyZWF0ZSBmcmFtZSBidWZmZXJzLCBhbmQgbWFrZSBjaXJjdWxhciByaW5nICovCi0JZm9yIChpID0gMDsgaSA8IGRlZmF1bHRfZmJ1ZnM7IGkrKykgewotCQlpZiAocGRldi0+ZmJ1ZltpXS5kYXRhID09IE5VTEwpIHsKLQkJCWtidWYgPSB2emFsbG9jKFBXQ19GUkFNRV9TSVpFKTsgLyogbmVlZCB2bWFsbG9jIHNpbmNlIGZyYW1lIGJ1ZmZlciA+IDEyOEsgKi8KLQkJCWlmIChrYnVmID09IE5VTEwpIHsKLQkJCQlQV0NfRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBmcmFtZSBidWZmZXIgJWQuXG4iLCBpKTsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KLQkJCVBXQ19ERUJVR19NRU1PUlkoIkFsbG9jYXRlZCBmcmFtZSBidWZmZXIgJWQgYXQgJXAuXG4iLCBpLCBrYnVmKTsKLQkJCXBkZXYtPmZidWZbaV0uZGF0YSA9IGtidWY7Ci0JCX0KLQl9Ci0KLQkvKiBBbGxvY2F0ZSBkZWNvbXByZXNzb3IgdGFibGUgc3BhY2UgKi8KLQlpZiAoREVWSUNFX1VTRV9DT0RFQzEocGRldi0+dHlwZSkpCi0JCWVyciA9IHB3Y19kZWMxX2FsbG9jKHBkZXYpOwotCWVsc2UKLQkJZXJyID0gcHdjX2RlYzIzX2FsbG9jKHBkZXYpOwotCi0JaWYgKGVycikgewotCQlQV0NfRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBkZWNvbXByZXNzIHRhYmxlLlxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JLyogQWxsb2NhdGUgaW1hZ2UgYnVmZmVyOyBkb3VibGUgYnVmZmVyIGZvciBtbWFwKCkgKi8KLQlrYnVmID0gcHdjX3J2bWFsbG9jKHB3Y19tYnVmcyAqIHBkZXYtPmxlbl9wZXJfaW1hZ2UpOwotCWlmIChrYnVmID09IE5VTEwpIHsKLQkJUFdDX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgaW1hZ2UgYnVmZmVyKHMpLiBuZWVkZWQgKCVkKVxuIiwKLQkJCQlwd2NfbWJ1ZnMgKiBwZGV2LT5sZW5fcGVyX2ltYWdlKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCVBXQ19ERUJVR19NRU1PUlkoIkFsbG9jYXRlZCBpbWFnZSBidWZmZXIgYXQgJXAuXG4iLCBrYnVmKTsKLQlwZGV2LT5pbWFnZV9kYXRhID0ga2J1ZjsKLQlmb3IgKGkgPSAwOyBpIDwgcHdjX21idWZzOyBpKyspIHsKLQkJcGRldi0+aW1hZ2VzW2ldLm9mZnNldCA9IGkgKiBwZGV2LT5sZW5fcGVyX2ltYWdlOwotCQlwZGV2LT5pbWFnZXNbaV0udm1hX3VzZV9jb3VudCA9IDA7Ci0JfQotCWZvciAoOyBpIDwgTUFYX0lNQUdFUzsgaSsrKSB7Ci0JCXBkZXYtPmltYWdlc1tpXS5vZmZzZXQgPSAwOwotCX0KLQotCWtidWYgPSBOVUxMOwotCi0JUFdDX0RFQlVHX01FTU9SWSgiPDwgcHdjX2FsbG9jYXRlX2J1ZmZlcnMoKVxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHB3Y19mcmVlX2J1ZmZlcnMoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCi17Ci0JaW50IGk7Ci0KLQlQV0NfREVCVUdfTUVNT1JZKCJFbnRlcmluZyBmcmVlX2J1ZmZlcnMoJXApLlxuIiwgcGRldik7Ci0KLQlpZiAocGRldiA9PSBOVUxMKQotCQlyZXR1cm47Ci0JLyogUmVsZWFzZSBJc28tcGlwZSBidWZmZXJzICovCi0JZm9yIChpID0gMDsgaSA8IE1BWF9JU09fQlVGUzsgaSsrKQotCQlpZiAocGRldi0+c2J1ZltpXS5kYXRhICE9IE5VTEwpIHsKLQkJCVBXQ19ERUJVR19NRU1PUlkoIkZyZWVpbmcgSVNPIGJ1ZmZlciBhdCAlcC5cbiIsIHBkZXYtPnNidWZbaV0uZGF0YSk7Ci0JCQlrZnJlZShwZGV2LT5zYnVmW2ldLmRhdGEpOwotCQkJcGRldi0+c2J1ZltpXS5kYXRhID0gTlVMTDsKLQkJfQotCi0JLyogVGhlIHNhbWUgZm9yIGZyYW1lIGJ1ZmZlcnMgKi8KLQlpZiAocGRldi0+ZmJ1ZiAhPSBOVUxMKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBkZWZhdWx0X2ZidWZzOyBpKyspIHsKLQkJCWlmIChwZGV2LT5mYnVmW2ldLmRhdGEgIT0gTlVMTCkgewotCQkJCVBXQ19ERUJVR19NRU1PUlkoIkZyZWVpbmcgZnJhbWUgYnVmZmVyICVkIGF0ICVwLlxuIiwgaSwgcGRldi0+ZmJ1ZltpXS5kYXRhKTsKLQkJCQl2ZnJlZShwZGV2LT5mYnVmW2ldLmRhdGEpOwotCQkJCXBkZXYtPmZidWZbaV0uZGF0YSA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQkJa2ZyZWUocGRldi0+ZmJ1Zik7Ci0JCXBkZXYtPmZidWYgPSBOVUxMOwotCX0KLQotCS8qIEludGVybWVkaWF0ZSBkZWNvbXByZXNzaW9uIGJ1ZmZlciAmIHRhYmxlcyAqLwotCWlmIChwZGV2LT5kZWNvbXByZXNzX2RhdGEgIT0gTlVMTCkgewotCQlQV0NfREVCVUdfTUVNT1JZKCJGcmVlaW5nIGRlY29tcHJlc3Npb24gYnVmZmVyIGF0ICVwLlxuIiwgcGRldi0+ZGVjb21wcmVzc19kYXRhKTsKLQkJa2ZyZWUocGRldi0+ZGVjb21wcmVzc19kYXRhKTsKLQkJcGRldi0+ZGVjb21wcmVzc19kYXRhID0gTlVMTDsKLQl9Ci0KLQkvKiBSZWxlYXNlIGltYWdlIGJ1ZmZlcnMgKi8KLQlpZiAocGRldi0+aW1hZ2VfZGF0YSAhPSBOVUxMKSB7Ci0JCVBXQ19ERUJVR19NRU1PUlkoIkZyZWVpbmcgaW1hZ2UgYnVmZmVyIGF0ICVwLlxuIiwgcGRldi0+aW1hZ2VfZGF0YSk7Ci0JCXB3Y19ydmZyZWUocGRldi0+aW1hZ2VfZGF0YSwgcHdjX21idWZzICogcGRldi0+bGVuX3Blcl9pbWFnZSk7Ci0JfQotCXBkZXYtPmltYWdlX2RhdGEgPSBOVUxMOwotCi0JUFdDX0RFQlVHX01FTU9SWSgiTGVhdmluZyBmcmVlX2J1ZmZlcnMoKS5cbiIpOwotfQotCi0vKiBUaGUgZnJhbWUgJiBpbWFnZSBidWZmZXIgbWVzcy4KLQotICAgWWVzLCB0aGlzIGlzIGEgbWVzcy4gV2VsbCwgaXQgdXNlZCB0byBiZSBzaW1wbGUsIGJ1dCBhbGFzLi4uICBJbiB0aGlzCi0gICBtb2R1bGUsIDMgYnVmZmVycyBzY2hlbWVzIGFyZSB1c2VkIHRvIGdldCB0aGUgZGF0YSBmcm9tIHRoZSBVU0IgYnVzIHRvCi0gICB0aGUgdXNlciBwcm9ncmFtLiBUaGUgZmlyc3Qgc2NoZW1lIGludm9sdmVzIHRoZSBJU08gYnVmZmVycyAoY2FsbGVkIHRodXMKLSAgIHNpbmNlIHRoZXkgdHJhbnNwb3J0IElTTyBkYXRhIGZyb20gdGhlIFVTQiBjb250cm9sbGVyKSwgYW5kIG5vdCByZWFsbHkKLSAgIGludGVyZXN0aW5nLiBTdWZmaWNlcyB0byBzYXkgdGhlIGRhdGEgZnJvbSB0aGlzIGJ1ZmZlciBpcyBxdWlja2x5Ci0gICBnYXRoZXJlZCBpbiBhbiBpbnRlcnJ1cHQgaGFuZGxlciAocHdjX2lzb2NfaGFuZGxlcikgYW5kIHBsYWNlZCBpbnRvIHRoZQotICAgZnJhbWUgYnVmZmVyLgotCi0gICBUaGUgZnJhbWUgYnVmZmVyIGlzIHRoZSBzZWNvbmQgc2NoZW1lLCBhbmQgaXMgdGhlIGNlbnRyYWwgZWxlbWVudCBoZXJlLgotICAgSXQgY29sbGVjdHMgdGhlIGRhdGEgZnJvbSBhIHNpbmdsZSBmcmFtZSBmcm9tIHRoZSBjYW1lcmEgKGhlbmNlLCB0aGUKLSAgIG5hbWUpLiBGcmFtZXMgYXJlIGRlbGltaXRlZCBieSB0aGUgVVNCIGNhbWVyYSB3aXRoIGEgc2hvcnQgVVNCIHBhY2tldCwKLSAgIHNvIHRoYXQncyBlYXN5IHRvIGRldGVjdC4gVGhlIGZyYW1lIGJ1ZmZlcnMgZm9ybSBhIGxpc3QgdGhhdCBpcyBmaWxsZWQKLSAgIGJ5IHRoZSBjYW1lcmErVVNCIGNvbnRyb2xsZXIgYW5kIGRyYWluZWQgYnkgdGhlIHVzZXIgcHJvY2VzcyB0aHJvdWdoCi0gICBlaXRoZXIgcmVhZCgpIG9yIG1tYXAoKS4KLQotICAgVGhlIGltYWdlIGJ1ZmZlciBpcyB0aGUgdGhpcmQgc2NoZW1lLCBpbiB3aGljaCBmcmFtZXMgYXJlIGRlY29tcHJlc3NlZAotICAgYW5kIGNvbnZlcnRlZCBpbnRvIHBsYW5hciBmb3JtYXQuIEZvciBtbWFwKCkgdGhlcmUgaXMgbW9yZSB0aGFuCi0gICBvbmUgaW1hZ2UgYnVmZmVyIGF2YWlsYWJsZS4KLQotICAgVGhlIGZyYW1lIGJ1ZmZlcnMgcHJvdmlkZSB0aGUgaW1hZ2UgYnVmZmVyaW5nLiBJbiBjYXNlIHRoZSB1c2VyIHByb2Nlc3MKLSAgIGlzIGEgYml0IHNsb3csIHRoaXMgaW50cm9kdWNlcyBsYWcgYW5kIHNvbWUgdW5kZXNpcmVkIHNpZGUtZWZmZWN0cy4KLSAgIFRoZSBwcm9ibGVtIGFyaXNlcyB3aGVuIHRoZSBmcmFtZSBidWZmZXIgaXMgZnVsbC4gSSB1c2VkIHRvIGRyb3AgdGhlIGxhc3QKLSAgIGZyYW1lLCB3aGljaCBtYWtlcyB0aGUgZGF0YSBpbiB0aGUgcXVldWUgc3RhbGUgdmVyeSBxdWlja2x5LiBCdXQgZHJvcHBpbmcKLSAgIHRoZSBmcmFtZSBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUgcHJvdmVkIHRvIGJlIGEgbGl0dGUgYml0IG1vcmUgZGlmZmljdWx0LgotICAgSSB0cmllZCBhIGNpcmN1bGFyIGxpbmtlZCBzY2hlbWUsIGJ1dCB0aGlzIGludHJvZHVjZWQgbW9yZSBwcm9ibGVtcyB0aGFuCi0gICBpdCBzb2x2ZWQuCi0KLSAgIEJlY2F1c2UgZmlsbGluZyBhbmQgZHJhaW5pbmcgYXJlIGNvbXBsZXRlbHkgYXN5bmNocm9ub3VzIHByb2Nlc3NlcywgdGhpcwotICAgcmVxdWlyZXMgc29tZSBmaWRkbGluZyB3aXRoIHBvaW50ZXJzIGFuZCBtdXRleGVzLgotCi0gICBFdmVudHVhbGx5LCBJIGNhbWUgdXAgd2l0aCBhIHN5c3RlbSB3aXRoIDIgbGlzdHM6IGFuICdlbXB0eScgZnJhbWUgbGlzdAotICAgYW5kIGEgJ2Z1bGwnIGZyYW1lIGxpc3Q6Ci0gICAgICogSW5pdGlhbGx5LCBhbGwgZnJhbWUgYnVmZmVycyBidXQgb25lIGFyZSBvbiB0aGUgJ2VtcHR5JyBsaXN0OyB0aGUgb25lCi0gICAgICAgcmVtYWluaW5nIGJ1ZmZlciBpcyBvdXIgaW5pdGlhbCBmaWxsIGZyYW1lLgotICAgICAqIElmIGEgZnJhbWUgaXMgbmVlZGVkIGZvciBmaWxsaW5nLCB3ZSB0cnkgdG8gdGFrZSBpdCBmcm9tIHRoZSAnZW1wdHknCi0gICAgICAgbGlzdCwgdW5sZXNzIHRoYXQgbGlzdCBpcyBlbXB0eSwgaW4gd2hpY2ggY2FzZSB3ZSB0YWtlIHRoZSBidWZmZXIgYXQKLSAgICAgICB0aGUgaGVhZCBvZiB0aGUgJ2Z1bGwnIGxpc3QuCi0gICAgICogV2hlbiBvdXIgZmlsbCBidWZmZXIgaGFzIGJlZW4gZmlsbGVkLCBpdCBpcyBhcHBlbmRlZCB0byB0aGUgJ2Z1bGwnCi0gICAgICAgbGlzdC4KLSAgICAgKiBJZiBhIGZyYW1lIGlzIG5lZWRlZCBieSByZWFkKCkgb3IgbW1hcCgpLCBpdCBpcyB0YWtlbiBmcm9tIHRoZSBoZWFkIG9mCi0gICAgICAgdGhlICdmdWxsJyBsaXN0LCBoYW5kbGVkLCBhbmQgdGhlbiBhcHBlbmRlZCB0byB0aGUgJ2VtcHR5JyBsaXN0LiBJZiBubwotICAgICAgIGJ1ZmZlciBpcyBwcmVzZW50IG9uIHRoZSAnZnVsbCcgbGlzdCwgd2Ugd2FpdC4KLSAgIFRoZSBhZHZhbnRhZ2UgaXMgdGhhdCB0aGUgYnVmZmVyIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGRlY29tcHJlc3NlZC8KLSAgIGNvbnZlcnRlZCwgaXMgb24gbmVpdGhlciBsaXN0LCBhbmQgdGh1cyBub3QgaW4gb3VyIHdheSAoYW55IG90aGVyIHNjaGVtZQotICAgSSB0cmllZCBoYWQgdGhlIHByb2JsZW0gb2Ygb2xkIGRhdGEgbGluZ2VyaW5nIGluIHRoZSBxdWV1ZSkuCi0KLSAgIFdoYXRldmVyIHN0cmF0ZWd5IHlvdSBjaG9vc2UsIGl0IGFsd2F5cyByZW1haW5zIGEgdHJhZGVvZmY6IHdpdGggbW9yZQotICAgZnJhbWUgYnVmZmVycyB0aGUgY2hhbmNlcyBvZiBhIG1pc3NlZCBmcmFtZSBhcmUgcmVkdWNlZC4gT24gdGhlIG90aGVyCi0gICBoYW5kLCBvbiBzbG93ZXIgbWFjaGluZXMgaXQgaW50cm9kdWNlcyBsYWcgYmVjYXVzZSB0aGUgcXVldWUgd2lsbAotICAgYWx3YXlzIGJlIGZ1bGwuCi0gKi8KLQotLyoqCi0gIFxicmllZiBGaW5kIG5leHQgZnJhbWUgYnVmZmVyIHRvIGZpbGwuIFRha2UgZnJvbSBlbXB0eSBvciBmdWxsIGxpc3QsIHdoaWNoZXZlciBjb21lcyBmaXJzdC4KLSAqLwotc3RhdGljIGludCBwd2NfbmV4dF9maWxsX2ZyYW1lKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXJldCA9IDA7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBkZXYtPnB0cmxvY2ssIGZsYWdzKTsKLQlpZiAocGRldi0+ZmlsbF9mcmFtZSAhPSBOVUxMKSB7Ci0JCS8qIGFwcGVuZCB0byAnZnVsbCcgbGlzdCAqLwotCQlpZiAocGRldi0+ZnVsbF9mcmFtZXMgPT0gTlVMTCkgewotCQkJcGRldi0+ZnVsbF9mcmFtZXMgPSBwZGV2LT5maWxsX2ZyYW1lOwotCQkJcGRldi0+ZnVsbF9mcmFtZXNfdGFpbCA9IHBkZXYtPmZ1bGxfZnJhbWVzOwotCQl9Ci0JCWVsc2UgewotCQkJcGRldi0+ZnVsbF9mcmFtZXNfdGFpbC0+bmV4dCA9IHBkZXYtPmZpbGxfZnJhbWU7Ci0JCQlwZGV2LT5mdWxsX2ZyYW1lc190YWlsID0gcGRldi0+ZmlsbF9mcmFtZTsKLQkJfQotCX0KLQlpZiAocGRldi0+ZW1wdHlfZnJhbWVzICE9IE5VTEwpIHsKLQkJLyogV2UgaGF2ZSBlbXB0eSBmcmFtZXMgYXZhaWxhYmxlLiBUaGF0J3MgZWFzeSAqLwotCQlwZGV2LT5maWxsX2ZyYW1lID0gcGRldi0+ZW1wdHlfZnJhbWVzOwotCQlwZGV2LT5lbXB0eV9mcmFtZXMgPSBwZGV2LT5lbXB0eV9mcmFtZXMtPm5leHQ7Ci0JfQotCWVsc2UgewotCQkvKiBIbW0uIFRha2UgaXQgZnJvbSB0aGUgZnVsbCBsaXN0ICovCi0JCS8qIHNhbml0eSBjaGVjayAqLwotCQlpZiAocGRldi0+ZnVsbF9mcmFtZXMgPT0gTlVMTCkgewotCQkJUFdDX0VSUk9SKCJOZWl0aGVyIGVtcHR5IG9yIGZ1bGwgZnJhbWVzIGF2YWlsYWJsZSFcbiIpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJcGRldi0+ZmlsbF9mcmFtZSA9IHBkZXYtPmZ1bGxfZnJhbWVzOwotCQlwZGV2LT5mdWxsX2ZyYW1lcyA9IHBkZXYtPmZ1bGxfZnJhbWVzLT5uZXh0OwotCQlyZXQgPSAxOwotCX0KLQlwZGV2LT5maWxsX2ZyYW1lLT5uZXh0ID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi0vKioKLSAgXGJyaWVmIFJlc2V0IGFsbCBidWZmZXJzLCBwb2ludGVycyBhbmQgbGlzdHMsIGV4Y2VwdCBmb3IgdGhlIGltYWdlX3VzZWRbXSBidWZmZXIuCi0KLSAgSWYgdGhlIGltYWdlX3VzZWRbXSBidWZmZXIgaXMgY2xlYXJlZCB0b28sIG1tYXAoKS9WSURJT0NTWU5DIHdpbGwgcnVuIGludG8gdHJvdWJsZS4KLSAqLwotc3RhdGljIHZvaWQgcHdjX3Jlc2V0X2J1ZmZlcnMoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCVBXQ19ERUJVR19NRU1PUlkoIj4+ICVzIF9fZW50ZXJfX1xuIiwgX19mdW5jX18pOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBkZXYtPnB0cmxvY2ssIGZsYWdzKTsKLQlwZGV2LT5mdWxsX2ZyYW1lcyA9IE5VTEw7Ci0JcGRldi0+ZnVsbF9mcmFtZXNfdGFpbCA9IE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IGRlZmF1bHRfZmJ1ZnM7IGkrKykgewotCQlwZGV2LT5mYnVmW2ldLmZpbGxlZCA9IDA7Ci0JCWlmIChpID4gMCkKLQkJCXBkZXYtPmZidWZbaV0ubmV4dCA9ICZwZGV2LT5mYnVmW2kgLSAxXTsKLQkJZWxzZQotCQkJcGRldi0+ZmJ1Zi0+bmV4dCA9IE5VTEw7Ci0JfQotCXBkZXYtPmVtcHR5X2ZyYW1lcyA9ICZwZGV2LT5mYnVmW2RlZmF1bHRfZmJ1ZnMgLSAxXTsKLQlwZGV2LT5lbXB0eV9mcmFtZXNfdGFpbCA9IHBkZXYtPmZidWY7Ci0JcGRldi0+cmVhZF9mcmFtZSA9IE5VTEw7Ci0JcGRldi0+ZmlsbF9mcmFtZSA9IHBkZXYtPmVtcHR5X2ZyYW1lczsKLQlwZGV2LT5lbXB0eV9mcmFtZXMgPSBwZGV2LT5lbXB0eV9mcmFtZXMtPm5leHQ7Ci0KLQlwZGV2LT5pbWFnZV9yZWFkX3BvcyA9IDA7Ci0JcGRldi0+ZmlsbF9pbWFnZSA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOwotCi0JUFdDX0RFQlVHX01FTU9SWSgiPDwgJXMgX19sZWF2aW5nX19cbiIsIF9fZnVuY19fKTsKLX0KLQotCi0vKioKLSAgXGJyaWVmIERvIGFsbCB0aGUgaGFuZGxpbmcgZm9yIGdldHRpbmcgb25lIGZyYW1lOiBnZXQgcG9pbnRlciwgZGVjb21wcmVzcywgYWR2YW5jZSBwb2ludGVycy4KLSAqLwotaW50IHB3Y19oYW5kbGVfZnJhbWUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJldCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7Ci0JLyogRmlyc3QgZ3JhYiBvdXIgcmVhZF9mcmFtZTsgdGhpcyBpcyByZW1vdmVkIGZyb20gYWxsIGxpc3RzLCBzbwotCSAgIHdlIGNhbiByZWxlYXNlIHRoZSBsb2NrIGFmdGVyIHRoaXMgd2l0aG91dCBwcm9ibGVtcyAqLwotCWlmIChwZGV2LT5yZWFkX2ZyYW1lICE9IE5VTEwpIHsKLQkJLyogVGhpcyBjYW4ndCB0aGVvcmV0aWNhbGx5IGhhcHBlbiAqLwotCQlQV0NfRVJST1IoIkh1aD8gUmVhZCBmcmFtZSBzdGlsbCBpbiB1c2U/XG4iKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCi0JaWYgKHBkZXYtPmZ1bGxfZnJhbWVzID09IE5VTEwpIHsKLQkJUFdDX0VSUk9SKCJXb29wcy4gTm8gZnJhbWVzIHJlYWR5LlxuIik7Ci0JfQotCWVsc2UgewotCQlwZGV2LT5yZWFkX2ZyYW1lID0gcGRldi0+ZnVsbF9mcmFtZXM7Ci0JCXBkZXYtPmZ1bGxfZnJhbWVzID0gcGRldi0+ZnVsbF9mcmFtZXMtPm5leHQ7Ci0JCXBkZXYtPnJlYWRfZnJhbWUtPm5leHQgPSBOVUxMOwotCX0KLQotCWlmIChwZGV2LT5yZWFkX2ZyYW1lICE9IE5VTEwpIHsKLQkJLyogRGVjb21wcmVzc2lvbiBpcyBhIGxlbmd0aHkgcHJvY2Vzcywgc28gaXQncyBvdXRzaWRlIG9mIHRoZSBsb2NrLgotCQkgICBUaGlzIGdpdmVzIHRoZSBpc29jX2hhbmRsZXIgdGhlIG9wcG9ydHVuaXR5IHRvIGZpbGwgbW9yZSBmcmFtZXMKLQkJICAgaW4gdGhlIG1lYW4gdGltZS4KLQkJKi8KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOwotCQlyZXQgPSBwd2NfZGVjb21wcmVzcyhwZGV2KTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBkZXYtPnB0cmxvY2ssIGZsYWdzKTsKLQotCQkvKiBXZSdyZSBkb25lIHdpdGggcmVhZF9idWZmZXIsIHRhY2sgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZW1wdHkgYnVmZmVyIGxpc3QgKi8KLQkJaWYgKHBkZXYtPmVtcHR5X2ZyYW1lcyA9PSBOVUxMKSB7Ci0JCQlwZGV2LT5lbXB0eV9mcmFtZXMgPSBwZGV2LT5yZWFkX2ZyYW1lOwotCQkJcGRldi0+ZW1wdHlfZnJhbWVzX3RhaWwgPSBwZGV2LT5lbXB0eV9mcmFtZXM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwZGV2LT5lbXB0eV9mcmFtZXNfdGFpbC0+bmV4dCA9IHBkZXYtPnJlYWRfZnJhbWU7Ci0JCQlwZGV2LT5lbXB0eV9mcmFtZXNfdGFpbCA9IHBkZXYtPnJlYWRfZnJhbWU7Ci0JCX0KLQkJcGRldi0+cmVhZF9mcmFtZSA9IE5VTEw7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkZXYtPnB0cmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAgXGJyaWVmIEFkdmFuY2UgcG9pbnRlcnMgb2YgaW1hZ2UgYnVmZmVyIChhZnRlciBlYWNoIHVzZXIgcmVxdWVzdCkKLSovCi12b2lkIHB3Y19uZXh0X2ltYWdlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQotewotCXBkZXYtPmltYWdlX3VzZWRbcGRldi0+ZmlsbF9pbWFnZV0gPSAwOwotCXBkZXYtPmZpbGxfaW1hZ2UgPSAocGRldi0+ZmlsbF9pbWFnZSArIDEpICUgcHdjX21idWZzOwotfQotCi0vKioKLSAqIFByaW50IGRlYnVnIGluZm9ybWF0aW9uIHdoZW4gYSBmcmFtZSBpcyBkaXNjYXJkZWQgYmVjYXVzZSBhbGwgb2Ygb3VyIGJ1ZmZlcgotICogaXMgZnVsbAotICovCi1zdGF0aWMgdm9pZCBwd2NfZnJhbWVfZHVtcGVkKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQotewotCXBkZXYtPnZmcmFtZXNfZHVtcGVkKys7Ci0JaWYgKHBkZXYtPnZmcmFtZV9jb3VudCA8IEZSQU1FX0xPV01BUkspCi0JCXJldHVybjsKLQotCWlmIChwZGV2LT52ZnJhbWVzX2R1bXBlZCA8IDIwKQotCQlQV0NfREVCVUdfRkxPVygiRHVtcGluZyBmcmFtZSAlZFxuIiwgcGRldi0+dmZyYW1lX2NvdW50KTsKLQllbHNlIGlmIChwZGV2LT52ZnJhbWVzX2R1bXBlZCA9PSAyMCkKLQkJUFdDX0RFQlVHX0ZMT1coIkR1bXBpbmcgZnJhbWUgJWQgKGxhc3QgbWVzc2FnZSlcbiIsCi0JCQkJcGRldi0+dmZyYW1lX2NvdW50KTsKKwlidWYgPSBsaXN0X2VudHJ5KHBkZXYtPnF1ZXVlZF9idWZzLm5leHQsIHN0cnVjdCBwd2NfZnJhbWVfYnVmLCBsaXN0KTsKKwlsaXN0X2RlbCgmYnVmLT5saXN0KTsKK2xlYXZlOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkZXYtPnF1ZXVlZF9idWZzX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gYnVmOwogfQogCiBzdGF0aWMgdm9pZCBwd2Nfc25hcHNob3RfYnV0dG9uKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgZG93bikKQEAgLTU3NSw5ICsyMDQsOSBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbnQgcHdjX3Jjdl9zaG9ydF9wYWNrZXQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGNvbnN0IHN0cnVjdCBwd2NfZnJhbWVfYnVmICpmYnVmKQorc3RhdGljIHZvaWQgcHdjX2ZyYW1lX2NvbXBsZXRlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQogewotCWludCBhd2FrZSA9IDA7CisJc3RydWN0IHB3Y19mcmFtZV9idWYgKmZidWYgPSBwZGV2LT5maWxsX2J1ZjsKIAogCS8qIFRoZSBUb1VDYW0gRnVuIENNT1Mgc2Vuc29yIGNhdXNlcyB0aGUgZmlybXdhcmUgdG8gc2VuZCAyIG9yIDMgYm9ndXMKIAkgICBmcmFtZXMgb24gdGhlIFVTQiB3aXJlIGFmdGVyIGFuIGV4cG9zdXJlIGNoYW5nZS4gVGhpcyBjb25kaXRpdGlvbiBpcwpAQCAtNTg5LDcgKzIxOCw2IEBACiAJCWlmIChwdHJbMV0gPT0gMSAmJiBwdHJbMF0gJiAweDEwKSB7CiAJCQlQV0NfVFJBQ0UoIkh5dW5kYWkgQ01PUyBzZW5zb3IgYnVnLiBEcm9wcGluZyBmcmFtZS5cbiIpOwogCQkJcGRldi0+ZHJvcF9mcmFtZXMgKz0gMjsKLQkJCXBkZXYtPnZmcmFtZXNfZXJyb3IrKzsKIAkJfQogCQlpZiAoKHB0clswXSBeIHBkZXYtPnZtaXJyb3IpICYgMHgwMSkgewogCQkJcHdjX3NuYXBzaG90X2J1dHRvbihwZGV2LCBwdHJbMF0gJiAweDAxKTsKQEAgLTYxMiw4ICsyNDAsNyBAQAogCQkgICAqLwogCQlpZiAoZmJ1Zi0+ZmlsbGVkID09IDQpCiAJCQlwZGV2LT5kcm9wX2ZyYW1lcysrOwotCX0KLQllbHNlIGlmIChwZGV2LT50eXBlID09IDc0MCB8fCBwZGV2LT50eXBlID09IDcyMCkgeworCX0gZWxzZSBpZiAocGRldi0+dHlwZSA9PSA3NDAgfHwgcGRldi0+dHlwZSA9PSA3MjApIHsKIAkJdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKilmYnVmLT5kYXRhOwogCQlpZiAoKHB0clswXSBeIHBkZXYtPnZtaXJyb3IpICYgMHgwMSkgewogCQkJcHdjX3NuYXBzaG90X2J1dHRvbihwZGV2LCBwdHJbMF0gJiAweDAxKTsKQEAgLTYyMSwzMyArMjQ4LDIzIEBACiAJCXBkZXYtPnZtaXJyb3IgPSBwdHJbMF0gJiAweDAzOwogCX0KIAotCS8qIEluIGNhc2Ugd2Ugd2VyZSBpbnN0cnVjdGVkIHRvIGRyb3AgdGhlIGZyYW1lLCBkbyBzbyBzaWxlbnRseS4KLQkgICBUaGUgYnVmZmVyIHBvaW50ZXJzIGFyZSBub3QgdXBkYXRlZCBlaXRoZXIgKGJ1dCB0aGUgY291bnRlcnMgYXJlIHJlc2V0IGJlbG93KS4KLQkgICAqLwotCWlmIChwZGV2LT5kcm9wX2ZyYW1lcyA+IDApCisJLyogSW4gY2FzZSB3ZSB3ZXJlIGluc3RydWN0ZWQgdG8gZHJvcCB0aGUgZnJhbWUsIGRvIHNvIHNpbGVudGx5LiAqLworCWlmIChwZGV2LT5kcm9wX2ZyYW1lcyA+IDApIHsKIAkJcGRldi0+ZHJvcF9mcmFtZXMtLTsKLQllbHNlIHsKKwl9IGVsc2UgewogCQkvKiBDaGVjayBmb3IgdW5kZXJmbG93IGZpcnN0ICovCiAJCWlmIChmYnVmLT5maWxsZWQgPCBwZGV2LT5mcmFtZV90b3RhbF9zaXplKSB7CiAJCQlQV0NfREVCVUdfRkxPVygiRnJhbWUgYnVmZmVyIHVuZGVyZmxvdyAoJWQgYnl0ZXMpOyIKIAkJCQkgICAgICAgIiBkaXNjYXJkZWQuXG4iLCBmYnVmLT5maWxsZWQpOwotCQkJcGRldi0+dmZyYW1lc19lcnJvcisrOwotCQl9Ci0JCWVsc2UgewotCQkJLyogU2VuZCBvbmx5IG9uY2UgcGVyIEVPRiAqLwotCQkJYXdha2UgPSAxOyAvKiBkZWxheSB3YWtlX3VwcyAqLwotCi0JCQkvKiBGaW5kIG91ciBuZXh0IGZyYW1lIHRvIGZpbGwuIFRoaXMgd2lsbCBhbHdheXMgc3VjY2VlZCwgc2luY2Ugd2UKLQkJCSAqIG5pY2sgYSBmcmFtZSBmcm9tIGVpdGhlciBlbXB0eSBvciBmdWxsIGxpc3QsIGJ1dCBpZiB3ZSBoYWQgdG8KLQkJCSAqIHRha2UgaXQgZnJvbSB0aGUgZnVsbCBsaXN0LCBpdCBtZWFucyBhIGZyYW1lIGdvdCBkcm9wcGVkLgotCQkJICovCi0JCQlpZiAocHdjX25leHRfZmlsbF9mcmFtZShwZGV2KSkKLQkJCQlwd2NfZnJhbWVfZHVtcGVkKHBkZXYpOwotCisJCX0gZWxzZSB7CisJCQlmYnVmLT52Yi52NGwyX2J1Zi5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwkJCWZidWYtPnZiLnY0bDJfYnVmLnNlcXVlbmNlID0gcGRldi0+dmZyYW1lX2NvdW50OworCQkJdmIyX2J1ZmZlcl9kb25lKCZmYnVmLT52YiwgVkIyX0JVRl9TVEFURV9ET05FKTsKKwkJCXBkZXYtPmZpbGxfYnVmID0gTlVMTDsKKwkJCXBkZXYtPnZzeW5jID0gMDsKIAkJfQogCX0gLyogIWRyb3BfZnJhbWVzICovCiAJcGRldi0+dmZyYW1lX2NvdW50Kys7Ci0JcmV0dXJuIGF3YWtlOwogfQogCiAvKiBUaGlzIGdldHMgY2FsbGVkIGZvciB0aGUgSXNvY2hyb25vdXMgcGlwZSAodmlkZW8pLiBUaGlzIGlzIGRvbmUgaW4KQEAgLTY1NSwyNCArMjcyLDIwIEBACiAgKi8KIHN0YXRpYyB2b2lkIHB3Y19pc29jX2hhbmRsZXIoc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2OworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gKHN0cnVjdCBwd2NfZGV2aWNlICopdXJiLT5jb250ZXh0OwogCWludCBpLCBmc3QsIGZsZW47Ci0JaW50IGF3YWtlOwotCXN0cnVjdCBwd2NfZnJhbWVfYnVmICpmYnVmOwotCXVuc2lnbmVkIGNoYXIgKmZpbGxwdHIgPSBOVUxMLCAqaXNvX2J1ZiA9IE5VTEw7CisJdW5zaWduZWQgY2hhciAqaXNvX2J1ZiA9IE5VTEw7CiAKLQlhd2FrZSA9IDA7Ci0JcGRldiA9IChzdHJ1Y3QgcHdjX2RldmljZSAqKXVyYi0+Y29udGV4dDsKLQlpZiAocGRldiA9PSBOVUxMKSB7Ci0JCVBXQ19FUlJPUigiaXNvY19oYW5kbGVyKCkgY2FsbGVkIHdpdGggTlVMTCBkZXZpY2U/IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAodXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fCB1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCkgeworCWlmICh1cmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8IHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUIHx8CisJICAgIHVyYi0+c3RhdHVzID09IC1FU0hVVERPV04pIHsKIAkJUFdDX0RFQlVHX09QRU4oIlVSQiAoJXApIHVubGlua2VkICVzc3luY2hyb251b3VzbHkuXG4iLCB1cmIsIHVyYi0+c3RhdHVzID09IC1FTk9FTlQgPyAiIiA6ICJhIik7CiAJCXJldHVybjsKIAl9Ci0JaWYgKHVyYi0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUyAmJiB1cmItPnN0YXR1cyAhPSAwKSB7CisKKwlpZiAocGRldi0+ZmlsbF9idWYgPT0gTlVMTCkKKwkJcGRldi0+ZmlsbF9idWYgPSBwd2NfZ2V0X25leHRfZmlsbF9idWYocGRldik7CisKKwlpZiAodXJiLT5zdGF0dXMgIT0gMCkgewogCQljb25zdCBjaGFyICplcnJtc2c7CiAKIAkJZXJybXNnID0gIlVua25vd24iOwpAQCAtNjg0LDI5ICsyOTcsMjEgQEAKIAkJCWNhc2UgLUVJTFNFUToJCWVycm1zZyA9ICJDUkMvVGltZW91dCAoY291bGQgYmUgYW55dGhpbmcpIjsgYnJlYWs7CiAJCQljYXNlIC1FVElNRToJCWVycm1zZyA9ICJEZXZpY2UgZG9lcyBub3QgcmVzcG9uZCI7IGJyZWFrOwogCQl9Ci0JCVBXQ19ERUJVR19GTE9XKCJwd2NfaXNvY19oYW5kbGVyKCkgY2FsbGVkIHdpdGggc3RhdHVzICVkIFslc10uXG4iLCB1cmItPnN0YXR1cywgZXJybXNnKTsKLQkJLyogR2l2ZSB1cCBhZnRlciBhIG51bWJlciBvZiBjb250aWd1b3VzIGVycm9ycyBvbiB0aGUgVVNCIGJ1cy4KLQkJICAgQXBwZWFyYW50bHkgc29tZXRoaW5nIGlzIHdyb25nIHNvIHdlIHNpbXVsYXRlIGFuIHVucGx1ZyBldmVudC4KLQkJICovCisJCVBXQ19FUlJPUigicHdjX2lzb2NfaGFuZGxlcigpIGNhbGxlZCB3aXRoIHN0YXR1cyAlZCBbJXNdLlxuIiwKKwkJCSAgdXJiLT5zdGF0dXMsIGVycm1zZyk7CisJCS8qIEdpdmUgdXAgYWZ0ZXIgYSBudW1iZXIgb2YgY29udGlndW91cyBlcnJvcnMgKi8KIAkJaWYgKCsrcGRldi0+dmlzb2NfZXJyb3JzID4gTUFYX0lTT0NfRVJST1JTKQogCQl7Ci0JCQlQV0NfSU5GTygiVG9vIG1hbnkgSVNPQyBlcnJvcnMsIGJhaWxpbmcgb3V0LlxuIik7Ci0JCQlwZGV2LT5lcnJvcl9zdGF0dXMgPSBFSU87Ci0JCQlhd2FrZSA9IDE7Ci0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBkZXYtPmZyYW1lcSk7CisJCQlQV0NfRVJST1IoIlRvbyBtYW55IElTT0MgZXJyb3JzLCBiYWlsaW5nIG91dC5cbiIpOworCQkJaWYgKHBkZXYtPmZpbGxfYnVmKSB7CisJCQkJdmIyX2J1ZmZlcl9kb25lKCZwZGV2LT5maWxsX2J1Zi0+dmIsCisJCQkJCQlWQjJfQlVGX1NUQVRFX0VSUk9SKTsKKwkJCQlwZGV2LT5maWxsX2J1ZiA9IE5VTEw7CisJCQl9CiAJCX0KLQkJZ290byBoYW5kbGVyX2VuZDsgLy8gdWdseSwgYnV0IHByYWN0aWNhbAotCX0KLQotCWZidWYgPSBwZGV2LT5maWxsX2ZyYW1lOwotCWlmIChmYnVmID09IE5VTEwpIHsKLQkJUFdDX0VSUk9SKCJwd2NfaXNvY19oYW5kbGVyIHdpdGhvdXQgdmFsaWQgZmlsbCBmcmFtZS5cbiIpOwotCQlhd2FrZSA9IDE7CisJCXBkZXYtPnZzeW5jID0gMDsgLyogRHJvcCB0aGUgY3VycmVudCBmcmFtZSAqLwogCQlnb3RvIGhhbmRsZXJfZW5kOwogCX0KLQllbHNlIHsKLQkJZmlsbHB0ciA9IGZidWYtPmRhdGEgKyBmYnVmLT5maWxsZWQ7Ci0JfQogCiAJLyogUmVzZXQgSVNPQyBlcnJvciBjb3VudGVyLiBXZSBkaWQgZ2V0IGhlcmUsIGFmdGVyIGFsbC4gKi8KIAlwZGV2LT52aXNvY19lcnJvcnMgPSAwOwpAQCAtNzIwLDg5ICszMjUsNzMgQEAKIAkJZnN0ICA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzOwogCQlmbGVuID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoOwogCQlpc29fYnVmID0gdXJiLT50cmFuc2Zlcl9idWZmZXIgKyB1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldDsKLQkJaWYgKGZzdCA9PSAwKSB7Ci0JCQlpZiAoZmxlbiA+IDApIHsgLyogaWYgdmFsaWQgZGF0YS4uLiAqLwotCQkJCWlmIChwZGV2LT52c3luYyA+IDApIHsgLyogLi4uYW5kIHdlIGFyZSBub3Qgc3luYy1odW50aW5nLi4uICovCi0JCQkJCXBkZXYtPnZzeW5jID0gMjsKKwkJaWYgKGZzdCAhPSAwKSB7CisJCQlQV0NfRVJST1IoIklzbyBmcmFtZSAlZCBoYXMgZXJyb3IgJWRcbiIsIGksIGZzdCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoZmxlbiA+IDAgJiYgcGRldi0+dnN5bmMpIHsKKwkJCXN0cnVjdCBwd2NfZnJhbWVfYnVmICpmYnVmID0gcGRldi0+ZmlsbF9idWY7CiAKLQkJCQkJLyogLi4uY29weSBkYXRhIHRvIGZyYW1lIGJ1ZmZlciwgaWYgcG9zc2libGUgKi8KLQkJCQkJaWYgKGZsZW4gKyBmYnVmLT5maWxsZWQgPiBwZGV2LT5mcmFtZV90b3RhbF9zaXplKSB7Ci0JCQkJCQlQV0NfREVCVUdfRkxPVygiRnJhbWUgYnVmZmVyIG92ZXJmbG93IChmbGVuID0gJWQsIGZyYW1lX3RvdGFsX3NpemUgPSAlZCkuXG4iLCBmbGVuLCBwZGV2LT5mcmFtZV90b3RhbF9zaXplKTsKLQkJCQkJCXBkZXYtPnZzeW5jID0gMDsgLyogSG1tLCBsZXQncyB3YWl0IGZvciBhbiBFT0YgKGVuZC1vZi1mcmFtZSkgKi8KLQkJCQkJCXBkZXYtPnZmcmFtZXNfZXJyb3IrKzsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW1lbW1vdmUoZmlsbHB0ciwgaXNvX2J1ZiwgZmxlbik7Ci0JCQkJCQlmaWxscHRyICs9IGZsZW47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmJ1Zi0+ZmlsbGVkICs9IGZsZW47Ci0JCQl9IC8qIC4uZmxlbiA+IDAgKi8KLQotCQkJaWYgKGZsZW4gPCBwZGV2LT52bGFzdF9wYWNrZXRfc2l6ZSkgewotCQkJCS8qIFNob3J0ZXIgcGFja2V0Li4uIFdlIHByb2JhYmx5IGhhdmUgdGhlIGVuZCBvZiBhbiBpbWFnZS1mcmFtZTsKLQkJCQkgICB3YWtlIHVwIHJlYWQoKSBwcm9jZXNzIGFuZCBsZXQgc2VsZWN0KCkvcG9sbCgpIGRvIHNvbWV0aGluZy4KLQkJCQkgICBEZWNvbXByZXNzaW9uIGlzIGRvbmUgaW4gdXNlciB0aW1lIG92ZXIgdGhlcmUuCi0JCQkJICAgKi8KLQkJCQlpZiAocGRldi0+dnN5bmMgPT0gMikgewotCQkJCQlpZiAocHdjX3Jjdl9zaG9ydF9wYWNrZXQocGRldiwgZmJ1ZikpIHsKLQkJCQkJCWF3YWtlID0gMTsKLQkJCQkJCWZidWYgPSBwZGV2LT5maWxsX2ZyYW1lOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZidWYtPmZpbGxlZCA9IDA7Ci0JCQkJZmlsbHB0ciA9IGZidWYtPmRhdGE7Ci0JCQkJcGRldi0+dnN5bmMgPSAxOworCQkJaWYgKHBkZXYtPnZzeW5jID09IDEpIHsKKwkJCQlkb19nZXR0aW1lb2ZkYXkoJmZidWYtPnZiLnY0bDJfYnVmLnRpbWVzdGFtcCk7CisJCQkJcGRldi0+dnN5bmMgPSAyOwogCQkJfQogCi0JCQlwZGV2LT52bGFzdF9wYWNrZXRfc2l6ZSA9IGZsZW47Ci0JCX0gLyogLi5zdGF0dXMgPT0gMCAqLwotCQllbHNlIHsKLQkJCS8qIFRoaXMgaXMgbm9ybWFsbHkgbm90IGludGVyZXN0aW5nIHRvIHRoZSB1c2VyLCB1bmxlc3MKLQkJCSAqIHlvdSBhcmUgcmVhbGx5IGRlYnVnZ2luZyBzb21ldGhpbmcsIGRlZmF1bHQgPSAwICovCi0JCQlzdGF0aWMgaW50IGlzb19lcnJvcjsKLQkJCWlzb19lcnJvcisrOwotCQkJaWYgKGlzb19lcnJvciA8IDIwKQotCQkJCVBXQ19ERUJVR19GTE9XKCJJc28gZnJhbWUgJWQgb2YgVVNCIGhhcyBlcnJvciAlZFxuIiwgaSwgZnN0KTsKKwkJCWlmIChmbGVuICsgZmJ1Zi0+ZmlsbGVkID4gcGRldi0+ZnJhbWVfdG90YWxfc2l6ZSkgeworCQkJCVBXQ19FUlJPUigiRnJhbWUgb3ZlcmZsb3cgKCVkID4gJWQpXG4iLAorCQkJCQkgIGZsZW4gKyBmYnVmLT5maWxsZWQsCisJCQkJCSAgcGRldi0+ZnJhbWVfdG90YWxfc2l6ZSk7CisJCQkJcGRldi0+dnN5bmMgPSAwOyAvKiBMZXQncyB3YWl0IGZvciBhbiBFT0YgKi8KKwkJCX0gZWxzZSB7CisJCQkJbWVtY3B5KGZidWYtPmRhdGEgKyBmYnVmLT5maWxsZWQsIGlzb19idWYsCisJCQkJICAgICAgIGZsZW4pOworCQkJCWZidWYtPmZpbGxlZCArPSBmbGVuOworCQkJfQogCQl9CisJCWlmIChmbGVuIDwgcGRldi0+dmxhc3RfcGFja2V0X3NpemUpIHsKKwkJCS8qIFNob3J0ZXIgcGFja2V0Li4uIGVuZCBvZiBmcmFtZSAqLworCQkJaWYgKHBkZXYtPnZzeW5jID09IDIpCisJCQkJcHdjX2ZyYW1lX2NvbXBsZXRlKHBkZXYpOworCQkJaWYgKHBkZXYtPmZpbGxfYnVmID09IE5VTEwpCisJCQkJcGRldi0+ZmlsbF9idWYgPSBwd2NfZ2V0X25leHRfZmlsbF9idWYocGRldik7CisJCQlpZiAocGRldi0+ZmlsbF9idWYpIHsKKwkJCQlwZGV2LT5maWxsX2J1Zi0+ZmlsbGVkID0gMDsKKwkJCQlwZGV2LT52c3luYyA9IDE7CisJCQl9CisJCX0KKwkJcGRldi0+dmxhc3RfcGFja2V0X3NpemUgPSBmbGVuOwogCX0KIAogaGFuZGxlcl9lbmQ6Ci0JaWYgKGF3YWtlKQotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBkZXYtPmZyYW1lcSk7Ci0KLQl1cmItPmRldiA9IHBkZXYtPnVkZXY7CiAJaSA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKGkgIT0gMCkKIAkJUFdDX0VSUk9SKCJFcnJvciAoJWQpIHJlLXN1Ym1pdHRpbmcgdXJiIGluIHB3Y19pc29jX2hhbmRsZXIuXG4iLCBpKTsKIH0KIAotCi1pbnQgcHdjX2lzb2NfaW5pdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgcHdjX2lzb2NfaW5pdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKIAlzdHJ1Y3QgdXJiICp1cmI7CiAJaW50IGksIGosIHJldDsKLQogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOwogCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlkZXNjID0gTlVMTDsKIAotCWlmIChwZGV2ID09IE5VTEwpCi0JCXJldHVybiAtRUZBVUxUOwogCWlmIChwZGV2LT5pc29faW5pdCkKIAkJcmV0dXJuIDA7CisKIAlwZGV2LT52c3luYyA9IDA7CisJcGRldi0+dmxhc3RfcGFja2V0X3NpemUgPSAwOworCXBkZXYtPmZpbGxfYnVmID0gTlVMTDsKKwlwZGV2LT52ZnJhbWVfY291bnQgPSAwOworCXBkZXYtPnZpc29jX2Vycm9ycyA9IDA7CiAJdWRldiA9IHBkZXYtPnVkZXY7CiAKIAkvKiBHZXQgdGhlIGN1cnJlbnQgYWx0ZXJuYXRlIGludGVyZmFjZSwgYWRqdXN0IHBhY2tldCBzaXplICovCi0JaWYgKCF1ZGV2LT5hY3Rjb25maWcpCi0JCXJldHVybiAtRUZBVUxUOwogCWludGYgPSB1c2JfaWZudW1fdG9faWYodWRldiwgMCk7CiAJaWYgKGludGYpCiAJCWlkZXNjID0gdXNiX2FsdG51bV90b19hbHRzZXR0aW5nKGludGYsIHBkZXYtPnZhbHRlcm5hdGUpOwotCiAJaWYgKCFpZGVzYykKLQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAtRUlPOwogCiAJLyogU2VhcmNoIHZpZGVvIGVuZHBvaW50ICovCiAJcGRldi0+dm1heF9wYWNrZXRfc2l6ZSA9IC0xOwpAQCAtODI1LDM0ICs0MTQsMzIgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAorCS8qIEFsbG9jYXRlIGFuZCBpbml0IElzb2Nocm9udW91cyB1cmJzICovCiAJZm9yIChpID0gMDsgaSA8IE1BWF9JU09fQlVGUzsgaSsrKSB7CiAJCXVyYiA9IHVzYl9hbGxvY191cmIoSVNPX0ZSQU1FU19QRVJfREVTQywgR0ZQX0tFUk5FTCk7CiAJCWlmICh1cmIgPT0gTlVMTCkgewogCQkJUFdDX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgdXJiICVkXG4iLCBpKTsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlicmVhazsKKwkJCXBkZXYtPmlzb19pbml0ID0gMTsKKwkJCXB3Y19pc29jX2NsZWFudXAocGRldik7CisJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQotCQlwZGV2LT5zYnVmW2ldLnVyYiA9IHVyYjsKKwkJcGRldi0+dXJic1tpXSA9IHVyYjsKIAkJUFdDX0RFQlVHX01FTU9SWSgiQWxsb2NhdGVkIFVSQiBhdCAweCVwXG4iLCB1cmIpOwotCX0KLQlpZiAocmV0KSB7Ci0JCS8qIERlLWFsbG9jYXRlIGluIHJldmVyc2Ugb3JkZXIgKi8KLQkJd2hpbGUgKGktLSkgewotCQkJdXNiX2ZyZWVfdXJiKHBkZXYtPnNidWZbaV0udXJiKTsKLQkJCXBkZXYtPnNidWZbaV0udXJiID0gTlVMTDsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIGluaXQgVVJCIHN0cnVjdHVyZSAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhfSVNPX0JVRlM7IGkrKykgewotCQl1cmIgPSBwZGV2LT5zYnVmW2ldLnVyYjsKIAogCQl1cmItPmludGVydmFsID0gMTsgLy8gZGV2aWsKIAkJdXJiLT5kZXYgPSB1ZGV2OwogCQl1cmItPnBpcGUgPSB1c2JfcmN2aXNvY3BpcGUodWRldiwgcGRldi0+dmVuZHBvaW50KTsKLQkJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKLQkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBwZGV2LT5zYnVmW2ldLmRhdGE7CisJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVAgfCBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSB1c2JfYWxsb2NfY29oZXJlbnQodWRldiwKKwkJCQkJCQkgIElTT19CVUZGRVJfU0laRSwKKwkJCQkJCQkgIEdGUF9LRVJORUwsCisJCQkJCQkJICAmdXJiLT50cmFuc2Zlcl9kbWEpOworCQlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgeworCQkJUFdDX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgdXJiIGJ1ZmZlciAlZFxuIiwgaSk7CisJCQlwZGV2LT5pc29faW5pdCA9IDE7CisJCQlwd2NfaXNvY19jbGVhbnVwKHBkZXYpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KIAkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gSVNPX0JVRkZFUl9TSVpFOwogCQl1cmItPmNvbXBsZXRlID0gcHdjX2lzb2NfaGFuZGxlcjsKIAkJdXJiLT5jb250ZXh0ID0gcGRldjsKQEAgLTg2NiwxNCArNDUzLDE0IEBACiAKIAkvKiBsaW5rICovCiAJZm9yIChpID0gMDsgaSA8IE1BWF9JU09fQlVGUzsgaSsrKSB7Ci0JCXJldCA9IHVzYl9zdWJtaXRfdXJiKHBkZXYtPnNidWZbaV0udXJiLCBHRlBfS0VSTkVMKTsKKwkJcmV0ID0gdXNiX3N1Ym1pdF91cmIocGRldi0+dXJic1tpXSwgR0ZQX0tFUk5FTCk7CiAJCWlmIChyZXQpIHsKIAkJCVBXQ19FUlJPUigiaXNvY19pbml0KCkgc3VibWl0X3VyYiAlZCBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwgaSwgcmV0KTsKIAkJCXBkZXYtPmlzb19pbml0ID0gMTsKIAkJCXB3Y19pc29jX2NsZWFudXAocGRldik7CiAJCQlyZXR1cm4gcmV0OwogCQl9Ci0JCVBXQ19ERUJVR19NRU1PUlkoIlVSQiAweCVwIHN1Ym1pdHRlZC5cbiIsIHBkZXYtPnNidWZbaV0udXJiKTsKKwkJUFdDX0RFQlVHX01FTU9SWSgiVVJCIDB4JXAgc3VibWl0dGVkLlxuIiwgcGRldi0+dXJic1tpXSk7CiAJfQogCiAJLyogQWxsIGlzIGRvbmUuLi4gKi8KQEAgLTg4OCwxMiArNDc1LDkgQEAKIAogCS8qIFVubGlua2luZyBJU09DIGJ1ZmZlcnMgb25lIGJ5IG9uZSAqLwogCWZvciAoaSA9IDA7IGkgPCBNQVhfSVNPX0JVRlM7IGkrKykgewotCQlzdHJ1Y3QgdXJiICp1cmI7Ci0KLQkJdXJiID0gcGRldi0+c2J1ZltpXS51cmI7Ci0JCWlmICh1cmIpIHsKLQkJCVBXQ19ERUJVR19NRU1PUlkoIlVubGlua2luZyBVUkIgJXBcbiIsIHVyYik7Ci0JCQl1c2Jfa2lsbF91cmIodXJiKTsKKwkJaWYgKHBkZXYtPnVyYnNbaV0pIHsKKwkJCVBXQ19ERUJVR19NRU1PUlkoIlVubGlua2luZyBVUkIgJXBcbiIsIHBkZXYtPnVyYnNbaV0pOworCQkJdXNiX2tpbGxfdXJiKHBkZXYtPnVyYnNbaV0pOwogCQl9CiAJfQogfQpAQCAtOTA0LDQwICs0ODgsNTEgQEAKIAogCS8qIEZyZWVpbmcgSVNPQyBidWZmZXJzIG9uZSBieSBvbmUgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0lTT19CVUZTOyBpKyspIHsKLQkJc3RydWN0IHVyYiAqdXJiOwotCi0JCXVyYiA9IHBkZXYtPnNidWZbaV0udXJiOwotCQlpZiAodXJiKSB7CisJCWlmIChwZGV2LT51cmJzW2ldKSB7CiAJCQlQV0NfREVCVUdfTUVNT1JZKCJGcmVlaW5nIFVSQlxuIik7Ci0JCQl1c2JfZnJlZV91cmIodXJiKTsKLQkJCXBkZXYtPnNidWZbaV0udXJiID0gTlVMTDsKKwkJCWlmIChwZGV2LT51cmJzW2ldLT50cmFuc2Zlcl9idWZmZXIpIHsKKwkJCQl1c2JfZnJlZV9jb2hlcmVudChwZGV2LT51ZGV2LAorCQkJCQlwZGV2LT51cmJzW2ldLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAorCQkJCQlwZGV2LT51cmJzW2ldLT50cmFuc2Zlcl9idWZmZXIsCisJCQkJCXBkZXYtPnVyYnNbaV0tPnRyYW5zZmVyX2RtYSk7CisJCQl9CisJCQl1c2JfZnJlZV91cmIocGRldi0+dXJic1tpXSk7CisJCQlwZGV2LT51cmJzW2ldID0gTlVMTDsKIAkJfQogCX0KIH0KIAotdm9pZCBwd2NfaXNvY19jbGVhbnVwKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQorc3RhdGljIHZvaWQgcHdjX2lzb2NfY2xlYW51cChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKIHsKIAlQV0NfREVCVUdfT1BFTigiPj4gcHdjX2lzb2NfY2xlYW51cCgpXG4iKTsKLQlpZiAocGRldiA9PSBOVUxMKQotCQlyZXR1cm47CisKIAlpZiAocGRldi0+aXNvX2luaXQgPT0gMCkKIAkJcmV0dXJuOwogCiAJcHdjX2lzb19zdG9wKHBkZXYpOwogCXB3Y19pc29fZnJlZShwZGV2KTsKLQotCS8qIFN0b3AgY2FtZXJhLCBidXQgb25seSBpZiB3ZSBhcmUgc3VyZSB0aGUgY2FtZXJhIGlzIHN0aWxsIHRoZXJlICh1bnBsdWcKLQkgICBpcyBzaWduYWxsZWQgYnkgRVBJUEUpCi0JICovCi0JaWYgKHBkZXYtPmVycm9yX3N0YXR1cyAhPSBFUElQRSkgewotCQlQV0NfREVCVUdfT1BFTigiU2V0dGluZyBhbHRlcm5hdGUgaW50ZXJmYWNlIDAuXG4iKTsKLQkJdXNiX3NldF9pbnRlcmZhY2UocGRldi0+dWRldiwgMCwgMCk7Ci0JfQorCXVzYl9zZXRfaW50ZXJmYWNlKHBkZXYtPnVkZXYsIDAsIDApOwogCiAJcGRldi0+aXNvX2luaXQgPSAwOwogCVBXQ19ERUJVR19PUEVOKCI8PCBwd2NfaXNvY19jbGVhbnVwKClcbiIpOwogfQogCisvKgorICogUmVsZWFzZSBhbGwgcXVldWVkIGJ1ZmZlcnMsIG5vIG5lZWQgdG8gdGFrZSBxdWV1ZWRfYnVmc19sb2NrLCBzaW5jZSBhbGwKKyAqIGlzbyB1cmJzIGhhdmUgYmVlbiBraWxsZWQgd2hlbiB3ZSdyZSBjYWxsZWQgc28gcHdjX2lzb2NfaGFuZGxlciB3b24ndCBydW4uCisgKi8KK3N0YXRpYyB2b2lkIHB3Y19jbGVhbnVwX3F1ZXVlZF9idWZzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoreworCXdoaWxlICghbGlzdF9lbXB0eSgmcGRldi0+cXVldWVkX2J1ZnMpKSB7CisJCXN0cnVjdCBwd2NfZnJhbWVfYnVmICpidWY7CisKKwkJYnVmID0gbGlzdF9lbnRyeShwZGV2LT5xdWV1ZWRfYnVmcy5uZXh0LCBzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiwKKwkJCQkgbGlzdCk7CisJCWxpc3RfZGVsKCZidWYtPmxpc3QpOworCQl2YjJfYnVmZmVyX2RvbmUoJmJ1Zi0+dmIsIFZCMl9CVUZfU1RBVEVfRVJST1IpOworCX0KK30KKwogLyoqKioqKioqKgogICogc3lzZnMKICAqKioqKioqKiovCkBAIC0xMDUxLDk4ICs2NDYsMTUgQEAKIAogc3RhdGljIGludCBwd2NfdmlkZW9fb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlpbnQgaSwgcmV0OwogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwogCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2OwogCiAJUFdDX0RFQlVHX09QRU4oIj4+IHZpZGVvX29wZW4gY2FsbGVkKHZkZXYgPSAweCVwKS5cbiIsIHZkZXYpOwogCiAJcGRldiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOwotCUJVR19PTighcGRldik7Ci0JaWYgKHBkZXYtPnZvcGVuKSB7Ci0JCVBXQ19ERUJVR19PUEVOKCJJJ20gYnVzeSwgc29tZW9uZSBpcyB1c2luZyB0aGUgZGV2aWNlLlxuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQorCWlmICghcGRldi0+dWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLQlwd2NfY29uc3RydWN0KHBkZXYpOyAvKiBzZXQgbWluL21heCBzaXplcyBjb3JyZWN0ICovCi0JaWYgKCFwZGV2LT51c2JfaW5pdCkgewotCQlQV0NfREVCVUdfT1BFTigiRG9pbmcgZmlyc3QgdGltZSBpbml0aWFsaXphdGlvbi5cbiIpOwotCQlwZGV2LT51c2JfaW5pdCA9IDE7Ci0KLQkJLyogUXVlcnkgc2Vuc29yIHR5cGUgKi8KLQkJcmV0ID0gcHdjX2dldF9jbW9zX3NlbnNvcihwZGV2LCAmaSk7Ci0JCWlmIChyZXQgPj0gMCkKLQkJewotCQkJUFdDX0RFQlVHX09QRU4oIlRoaXMgJXMgY2FtZXJhIGlzIGVxdWlwcGVkIHdpdGggYSAlcyAoJWQpLlxuIiwKLQkJCQkJcGRldi0+dmRldi5uYW1lLAotCQkJCQlwd2Nfc2Vuc29yX3R5cGVfdG9fc3RyaW5nKGkpLCBpKTsKLQkJfQotCX0KLQotCS8qIFR1cm4gb24gY2FtZXJhICovCi0JaWYgKHBvd2VyX3NhdmUpIHsKLQkJaSA9IHB3Y19jYW1lcmFfcG93ZXIocGRldiwgMSk7Ci0JCWlmIChpIDwgMCkKLQkJCVBXQ19ERUJVR19PUEVOKCJGYWlsZWQgdG8gcmVzdG9yZSBwb3dlciB0byB0aGUgY2FtZXJhISAoJWQpXG4iLCBpKTsKLQl9Ci0JLyogU2V0IExFRCBvbi9vZmYgdGltZSAqLwotCWlmIChwd2Nfc2V0X2xlZHMocGRldiwgbGVkX29uLCBsZWRfb2ZmKSA8IDApCi0JCVBXQ19ERUJVR19PUEVOKCJGYWlsZWQgdG8gc2V0IExFRCBvbi9vZmYgdGltZS5cbiIpOwotCi0KLQkvKiBTbyBmYXIsIHNvIGdvb2QuIEFsbG9jYXRlIG1lbW9yeS4gKi8KLQlpID0gcHdjX2FsbG9jYXRlX2J1ZmZlcnMocGRldik7Ci0JaWYgKGkgPCAwKSB7Ci0JCVBXQ19ERUJVR19PUEVOKCJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVycyBtZW1vcnkuXG4iKTsKLQkJcHdjX2ZyZWVfYnVmZmVycyhwZGV2KTsKLQkJcmV0dXJuIGk7Ci0JfQotCi0JLyogUmVzZXQgYnVmZmVycyAmIHBhcmFtZXRlcnMgKi8KLQlwd2NfcmVzZXRfYnVmZmVycyhwZGV2KTsKLQlmb3IgKGkgPSAwOyBpIDwgcHdjX21idWZzOyBpKyspCi0JCXBkZXYtPmltYWdlX3VzZWRbaV0gPSAwOwotCXBkZXYtPnZmcmFtZV9jb3VudCA9IDA7Ci0JcGRldi0+dmZyYW1lc19kdW1wZWQgPSAwOwotCXBkZXYtPnZmcmFtZXNfZXJyb3IgPSAwOwotCXBkZXYtPnZpc29jX2Vycm9ycyA9IDA7Ci0JcGRldi0+ZXJyb3Jfc3RhdHVzID0gMDsKLQlwd2NfY29uc3RydWN0KHBkZXYpOyAvKiBzZXQgbWluL21heCBzaXplcyBjb3JyZWN0ICovCi0KLQkvKiBTZXQgc29tZSBkZWZhdWx0cyAqLwotCXBkZXYtPnZzbmFwc2hvdCA9IDA7Ci0KLQkvKiBTZXQgdmlkZW8gc2l6ZSwgZmlyc3QgdHJ5IHRoZSBsYXN0IHVzZWQgdmlkZW8gc2l6ZQotCSAgIChvciB0aGUgZGVmYXVsdCBvbmUpOyBpZiB0aGF0IGZhaWxzIHRyeSBRQ0lGLzEwIG9yIFFTSUYvMTA7Ci0JICAgaXQgdGhhdCBmYWlscyB0b28sIGdpdmUgdXAuCi0JICovCi0JaSA9IHB3Y19zZXRfdmlkZW9fbW9kZShwZGV2LCBwd2NfaW1hZ2Vfc2l6ZXNbcGRldi0+dnNpemVdLngsIHB3Y19pbWFnZV9zaXplc1twZGV2LT52c2l6ZV0ueSwgcGRldi0+dmZyYW1lcywgcGRldi0+dmNvbXByZXNzaW9uLCAwKTsKLQlpZiAoaSkJewotCQl1bnNpZ25lZCBpbnQgZGVmYXVsdF9yZXNvbHV0aW9uOwotCQlQV0NfREVCVUdfT1BFTigiRmlyc3QgYXR0ZW1wdCBhdCBzZXRfdmlkZW9fbW9kZSBmYWlsZWQuXG4iKTsKLQkJaWYgKHBkZXYtPnR5cGU+PSA3MzApCi0JCQlkZWZhdWx0X3Jlc29sdXRpb24gPSBQU1pfUVNJRjsKLQkJZWxzZQotCQkJZGVmYXVsdF9yZXNvbHV0aW9uID0gUFNaX1FDSUY7Ci0KLQkJaSA9IHB3Y19zZXRfdmlkZW9fbW9kZShwZGV2LAotCQkJCSAgICAgICBwd2NfaW1hZ2Vfc2l6ZXNbZGVmYXVsdF9yZXNvbHV0aW9uXS54LAotCQkJCSAgICAgICBwd2NfaW1hZ2Vfc2l6ZXNbZGVmYXVsdF9yZXNvbHV0aW9uXS55LAotCQkJCSAgICAgICAxMCwKLQkJCQkgICAgICAgcGRldi0+dmNvbXByZXNzaW9uLAotCQkJCSAgICAgICAwKTsKLQl9Ci0JaWYgKGkpIHsKLQkJUFdDX0RFQlVHX09QRU4oIlNlY29uZCBhdHRlbXB0IGF0IHNldF92aWRlb19tb2RlIGZhaWxlZC5cbiIpOwotCQlwd2NfZnJlZV9idWZmZXJzKHBkZXYpOwotCQlyZXR1cm4gaTsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIHRoZSB3ZWJjYW0gdG8gc2FuZSB2YWx1ZSAqLwotCXB3Y19zZXRfYnJpZ2h0bmVzcyhwZGV2LCAweDdmZmYpOwotCXB3Y19zZXRfYWdjKHBkZXYsIDEsIDApOwotCi0JcGRldi0+dm9wZW4rKzsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSB2ZGV2OwogCVBXQ19ERUJVR19PUEVOKCI8PCB2aWRlb19vcGVuKCkgcmV0dXJucyAwLlxuIik7CiAJcmV0dXJuIDA7CkBAIC0xMTU4LDIzOSArNjcwLDIxMSBAQAogCQlpZiAoZGV2aWNlX2hpbnRbaGludF0ucGRldiA9PSBwZGV2KQogCQkJZGV2aWNlX2hpbnRbaGludF0ucGRldiA9IE5VTEw7CiAKKwkvKiBGcmVlIGludGVybWVkaWF0ZSBkZWNvbXByZXNzaW9uIGJ1ZmZlciAmIHRhYmxlcyAqLworCWlmIChwZGV2LT5kZWNvbXByZXNzX2RhdGEgIT0gTlVMTCkgeworCQlQV0NfREVCVUdfTUVNT1JZKCJGcmVlaW5nIGRlY29tcHJlc3Npb24gYnVmZmVyIGF0ICVwLlxuIiwKKwkJCQkgcGRldi0+ZGVjb21wcmVzc19kYXRhKTsKKwkJa2ZyZWUocGRldi0+ZGVjb21wcmVzc19kYXRhKTsKKwkJcGRldi0+ZGVjb21wcmVzc19kYXRhID0gTlVMTDsKKwl9CisKKwl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZwZGV2LT5jdHJsX2hhbmRsZXIpOworCiAJa2ZyZWUocGRldik7CiB9CiAKLS8qIE5vdGUgdGhhdCBhbGwgY2xlYW51cCBpcyBkb25lIGluIHRoZSByZXZlcnNlIG9yZGVyIGFzIGluIF9vcGVuICovCiBzdGF0aWMgaW50IHB3Y192aWRlb19jbG9zZShzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2OwotCWludCBpOwogCiAJUFdDX0RFQlVHX09QRU4oIj4+IHZpZGVvX2Nsb3NlIGNhbGxlZCh2ZGV2ID0gMHglcCkuXG4iLCB2ZGV2KTsKIAogCXBkZXYgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKLQlpZiAocGRldi0+dm9wZW4gPT0gMCkKLQkJUFdDX0RFQlVHX01PRFVMRSgidmlkZW9fY2xvc2UoKSBjYWxsZWQgb24gY2xvc2VkIGRldmljZT9cbiIpOwotCi0JLyogRHVtcCBzdGF0aXN0aWNzLCBidXQgb25seSBpZiBhIHJlYXNvbmFibGUgYW1vdW50IG9mIGZyYW1lcyB3ZXJlCi0JICAgcHJvY2Vzc2VkICh0byBwcmV2ZW50IGVuZGxlc3MgbG9nLWVudHJpZXMgaW4gY2FzZSBvZiBzbmFwLXNob3QKLQkgICBwcm9ncmFtcykKLQkgKi8KLQlpZiAocGRldi0+dmZyYW1lX2NvdW50ID4gMjApCi0JCVBXQ19ERUJVR19NT0RVTEUoIkNsb3NpbmcgdmlkZW8gZGV2aWNlOiAlZCBmcmFtZXMgcmVjZWl2ZWQsIGR1bXBlZCAlZCBmcmFtZXMsICVkIGZyYW1lcyB3aXRoIGVycm9ycy5cbiIsIHBkZXYtPnZmcmFtZV9jb3VudCwgcGRldi0+dmZyYW1lc19kdW1wZWQsIHBkZXYtPnZmcmFtZXNfZXJyb3IpOwotCi0JaWYgKERFVklDRV9VU0VfQ09ERUMxKHBkZXYtPnR5cGUpKQotCSAgICBwd2NfZGVjMV9leGl0KCk7Ci0JZWxzZQotCSAgICBwd2NfZGVjMjNfZXhpdCgpOwotCi0JcHdjX2lzb2NfY2xlYW51cChwZGV2KTsKLQlwd2NfZnJlZV9idWZmZXJzKHBkZXYpOwotCi0JLyogVHVybiBvZmYgTEVEUyBhbmQgcG93ZXIgZG93biBjYW1lcmEsIGJ1dCBvbmx5IHdoZW4gbm90IHVucGx1Z2dlZCAqLwotCWlmICghcGRldi0+dW5wbHVnZ2VkKSB7Ci0JCS8qIFR1cm4gTEVEcyBvZmYgKi8KLQkJaWYgKHB3Y19zZXRfbGVkcyhwZGV2LCAwLCAwKSA8IDApCi0JCQlQV0NfREVCVUdfTU9EVUxFKCJGYWlsZWQgdG8gc2V0IExFRCBvbi9vZmYgdGltZS5cbiIpOwotCQlpZiAocG93ZXJfc2F2ZSkgewotCQkJaSA9IHB3Y19jYW1lcmFfcG93ZXIocGRldiwgMCk7Ci0JCQlpZiAoaSA8IDApCi0JCQkJUFdDX0VSUk9SKCJGYWlsZWQgdG8gcG93ZXIgZG93biBjYW1lcmEgKCVkKVxuIiwgaSk7Ci0JCX0KLQkJcGRldi0+dm9wZW4tLTsKLQkJUFdDX0RFQlVHX09QRU4oIjw8IHZpZGVvX2Nsb3NlKCkgdm9wZW49JWRcbiIsIHBkZXYtPnZvcGVuKTsKKwlpZiAocGRldi0+Y2FwdF9maWxlID09IGZpbGUpIHsKKwkJdmIyX3F1ZXVlX3JlbGVhc2UoJnBkZXYtPnZiX3F1ZXVlKTsKKwkJcGRldi0+Y2FwdF9maWxlID0gTlVMTDsKIAl9CiAKKwlQV0NfREVCVUdfT1BFTigiPDwgdmlkZW9fY2xvc2UoKVxuIik7CiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKglGSVhNRTogd2hhdCBhYm91dCB0d28gcGFyYWxsZWwgcmVhZHMgPz8/PwotICogICAgICBBTlNXRVI6IE5vdCBzdXBwb3J0ZWQuIFlvdSBjYW4ndCBvcGVuIHRoZSBkZXZpY2UgbW9yZSB0aGFuIG9uY2UsCi0JCWRlc3BpdGUgd2hhdCB0aGUgVjRMMSBpbnRlcmZhY2Ugc2F5cy4gRmlyc3QsIEkgZG9uJ3Qgc2VlCi0JCXRoZSBuZWVkLCBzZWNvbmQgdGhlcmUncyBubyBtZWNoYW5pc20gb2YgYWxlcnRpbmcgdGhlCi0JCTJuZC8zcmQvLi4uIHByb2Nlc3Mgb2YgZXZlbnRzIGxpa2UgY2hhbmdpbmcgaW1hZ2Ugc2l6ZS4KLQkJQW5kIEkgZG9uJ3Qgc2VlIHRoZSBwb2ludCBvZiBibG9ja2luZyB0aGF0IGZvciB0aGUKLQkJMm5kLzNyZC8uLi4gcHJvY2Vzcy4KLQkJSW4gbXVsdGktdGhyZWFkZWQgZW52aXJvbm1lbnRzIHJlYWRpbmcgcGFyYWxsZWwgZnJvbSBhbnkKLQkJZGV2aWNlIGlzIHRyaWNreSBhbnlob3cuCi0gKi8KLQogc3RhdGljIHNzaXplX3QgcHdjX3ZpZGVvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldjsKLQlpbnQgbm9ibG9jayA9IGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLOwotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCWludCBieXRlc190b19yZWFkLCBydiA9IDA7Ci0Jdm9pZCAqaW1hZ2VfYnVmZmVyX2FkZHI7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKIAotCVBXQ19ERUJVR19SRUFEKCJwd2NfdmlkZW9fcmVhZCh2ZGV2PTB4JXAsIGJ1Zj0lcCwgY291bnQ9JXpkKSBjYWxsZWQuXG4iLAotCQkJdmRldiwgYnVmLCBjb3VudCk7Ci0JaWYgKHZkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcGRldiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOwotCWlmIChwZGV2ID09IE5VTEwpCi0JCXJldHVybiAtRUZBVUxUOworCWlmICghcGRldi0+dWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAocGRldi0+ZXJyb3Jfc3RhdHVzKSB7Ci0JCXJ2ID0gLXBkZXYtPmVycm9yX3N0YXR1czsgLyogU29tZXRoaW5nIGhhcHBlbmVkLCByZXBvcnQgd2hhdC4gKi8KLQkJZ290byBlcnJfb3V0OwotCX0KKwlpZiAocGRldi0+Y2FwdF9maWxlICE9IE5VTEwgJiYKKwkgICAgcGRldi0+Y2FwdF9maWxlICE9IGZpbGUpCisJCXJldHVybiAtRUJVU1k7CiAKLQkvKiBTdGFydCB0aGUgc3RyZWFtIChpZiBub3QgYWxyZWFkeSBzdGFydGVkKSAqLwotCXJ2ID0gcHdjX2lzb2NfaW5pdChwZGV2KTsKLQlpZiAocnYpCi0JCWdvdG8gZXJyX291dDsKKwlwZGV2LT5jYXB0X2ZpbGUgPSBmaWxlOwogCi0JLyogSW4gY2FzZSB3ZSdyZSBkb2luZyBwYXJ0aWFsIHJlYWRzLCB3ZSBkb24ndCBoYXZlIHRvIHdhaXQgZm9yIGEgZnJhbWUgKi8KLQlpZiAocGRldi0+aW1hZ2VfcmVhZF9wb3MgPT0gMCkgewotCQkvKiBEbyB3YWl0IHF1ZXVlaW5nIGFjY29yZGluZyB0byB0aGUgKGRvYylib29rICovCi0JCWFkZF93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKLQkJd2hpbGUgKHBkZXYtPmZ1bGxfZnJhbWVzID09IE5VTEwpIHsKLQkJCS8qIENoZWNrIGZvciB1bnBsdWdnZWQvZXRjLiBoZXJlICovCi0JCQlpZiAocGRldi0+ZXJyb3Jfc3RhdHVzKSB7Ci0JCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnBkZXYtPmZyYW1lcSwgJndhaXQpOwotCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JCQkJcnYgPSAtcGRldi0+ZXJyb3Jfc3RhdHVzIDsKLQkJCQlnb3RvIGVycl9vdXQ7Ci0JCQl9Ci0JCQlpZiAobm9ibG9jaykgewotCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKLQkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCQkJCXJ2ID0gLUVXT1VMREJMT0NLOwotCQkJCWdvdG8gZXJyX291dDsKLQkJCX0KLQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKLQkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCQkJCXJ2ID0gLUVSRVNUQVJUU1lTOwotCQkJCWdvdG8gZXJyX291dDsKLQkJCX0KLQkJCW11dGV4X3VubG9jaygmcGRldi0+bW9kbG9jayk7Ci0JCQlzY2hlZHVsZSgpOwotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCW11dGV4X2xvY2soJnBkZXYtPm1vZGxvY2spOwotCQl9Ci0JCXJlbW92ZV93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQotCQkvKiBEZWNvbXByZXNzIGFuZCByZWxlYXNlIGZyYW1lICovCi0JCWlmIChwd2NfaGFuZGxlX2ZyYW1lKHBkZXYpKSB7Ci0JCQlydiA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGVycl9vdXQ7Ci0JCX0KLQl9Ci0KLQlQV0NfREVCVUdfUkVBRCgiQ29weWluZyBkYXRhIHRvIHVzZXIgc3BhY2UuXG4iKTsKLQlpZiAocGRldi0+cGl4Zm10ICE9IFY0TDJfUElYX0ZNVF9ZVVY0MjApCi0JCWJ5dGVzX3RvX3JlYWQgPSBwZGV2LT5mcmFtZV9zaXplICsgc2l6ZW9mKHN0cnVjdCBwd2NfcmF3X2ZyYW1lKTsKLQllbHNlCi0JCWJ5dGVzX3RvX3JlYWQgPSBwZGV2LT52aWV3LnNpemU7Ci0KLQkvKiBjb3B5IGJ5dGVzIHRvIHVzZXIgc3BhY2U7IHdlIGFsbG93IGZvciBwYXJ0aWFsIHJlYWRzICovCi0JaWYgKGNvdW50ICsgcGRldi0+aW1hZ2VfcmVhZF9wb3MgPiBieXRlc190b19yZWFkKQotCQljb3VudCA9IGJ5dGVzX3RvX3JlYWQgLSBwZGV2LT5pbWFnZV9yZWFkX3BvczsKLQlpbWFnZV9idWZmZXJfYWRkciA9IHBkZXYtPmltYWdlX2RhdGE7Ci0JaW1hZ2VfYnVmZmVyX2FkZHIgKz0gcGRldi0+aW1hZ2VzW3BkZXYtPmZpbGxfaW1hZ2VdLm9mZnNldDsKLQlpbWFnZV9idWZmZXJfYWRkciArPSBwZGV2LT5pbWFnZV9yZWFkX3BvczsKLQlpZiAoY29weV90b191c2VyKGJ1ZiwgaW1hZ2VfYnVmZmVyX2FkZHIsIGNvdW50KSkgewotCQlydiA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0JcGRldi0+aW1hZ2VfcmVhZF9wb3MgKz0gY291bnQ7Ci0JaWYgKHBkZXYtPmltYWdlX3JlYWRfcG9zID49IGJ5dGVzX3RvX3JlYWQpIHsgLyogQWxsIGRhdGEgaGFzIGJlZW4gcmVhZCAqLwotCQlwZGV2LT5pbWFnZV9yZWFkX3BvcyA9IDA7Ci0JCXB3Y19uZXh0X2ltYWdlKHBkZXYpOwotCX0KLQlyZXR1cm4gY291bnQ7Ci1lcnJfb3V0OgotCXJldHVybiBydjsKKwlyZXR1cm4gdmIyX3JlYWQoJnBkZXYtPnZiX3F1ZXVlLCBidWYsIGNvdW50LCBwcG9zLAorCQkJZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IHB3Y192aWRlb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHB3Y19kZXZpY2UgKnBkZXY7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOwogCi0JaWYgKHZkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcGRldiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOwotCWlmIChwZGV2ID09IE5VTEwpCi0JCXJldHVybiAtRUZBVUxUOworCWlmICghcGRldi0+dWRldikKKwkJcmV0dXJuIFBPTExfRVJSOwogCi0JLyogU3RhcnQgdGhlIHN0cmVhbSAoaWYgbm90IGFscmVhZHkgc3RhcnRlZCkgKi8KLQlyZXQgPSBwd2NfaXNvY19pbml0KHBkZXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlwb2xsX3dhaXQoZmlsZSwgJnBkZXYtPmZyYW1lcSwgd2FpdCk7Ci0JaWYgKHBkZXYtPmVycm9yX3N0YXR1cykKLQkJcmV0dXJuIFBPTExFUlI7Ci0JaWYgKHBkZXYtPmZ1bGxfZnJhbWVzICE9IE5VTEwpIC8qIHdlIGhhdmUgZnJhbWVzIHdhaXRpbmcgKi8KLQkJcmV0dXJuIChQT0xMSU4gfCBQT0xMUkROT1JNKTsKLQotCXJldHVybiAwOworCXJldHVybiB2YjJfcG9sbCgmcGRldi0+dmJfcXVldWUsIGZpbGUsIHdhaXQpOwogfQogCiBzdGF0aWMgaW50IHB3Y192aWRlb19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2OwotCXVuc2lnbmVkIGxvbmcgc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCXVuc2lnbmVkIGxvbmcgcGFnZSwgcG9zID0gMDsKLQlpbnQgaW5kZXg7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKIAotCVBXQ19ERUJVR19NRU1PUlkoIj4+ICVzXG4iLCBfX2Z1bmNfXyk7Ci0JcGRldiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOwotCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7Ci0Jc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OworCWlmIChwZGV2LT5jYXB0X2ZpbGUgIT0gZmlsZSkKKwkJcmV0dXJuIC1FQlVTWTsKIAotCS8qIEZpbmQgdGhlIGlkeCBidWZmZXIgZm9yIHRoaXMgbWFwcGluZyAqLwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHB3Y19tYnVmczsgaW5kZXgrKykgewotCQlwb3MgPSBwZGV2LT5pbWFnZXNbaW5kZXhdLm9mZnNldDsKLQkJaWYgKChwb3M+PlBBR0VfU0hJRlQpID09IHZtYS0+dm1fcGdvZmYpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGluZGV4ID09IE1BWF9JTUFHRVMpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChpbmRleCA9PSAwKSB7Ci0JCS8qCi0JCSAqIFNwZWNpYWwgY2FzZSBmb3IgdjRsMS4gSW4gdjRsMSwgd2UgbWFwIG9ubHkgb25lIGJpZyBidWZmZXIsCi0JCSAqIGJ1dCBpbiB2NGwyIGVhY2ggYnVmZmVyIGlzIG1hcHBlZAotCQkgKi8KLQkJdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplOwotCQl0b3RhbF9zaXplID0gcHdjX21idWZzICogcGRldi0+bGVuX3Blcl9pbWFnZTsKLQkJaWYgKHNpemUgIT0gcGRldi0+bGVuX3Blcl9pbWFnZSAmJiBzaXplICE9IHRvdGFsX3NpemUpIHsKLQkJCVBXQ19FUlJPUigiV3Jvbmcgc2l6ZSAoJWx1KSBuZWVkZWQgdG8gYmUgbGVuX3Blcl9pbWFnZT0lZCBvciB0b3RhbF9zaXplPSVsdVxuIiwKLQkJCQkgICBzaXplLCBwZGV2LT5sZW5fcGVyX2ltYWdlLCB0b3RhbF9zaXplKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIGlmIChzaXplID4gcGRldi0+bGVuX3Blcl9pbWFnZSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHZiMl9tbWFwKCZwZGV2LT52Yl9xdWV1ZSwgdm1hKTsKK30KIAotCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU87CS8qIGZyb20gMi42LjktYWNYICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVmlkZW9idWYyIG9wZXJhdGlvbnMgKi8KIAotCXBvcyArPSAodW5zaWduZWQgbG9uZylwZGV2LT5pbWFnZV9kYXRhOwotCXdoaWxlIChzaXplID4gMCkgewotCQlwYWdlID0gdm1hbGxvY190b19wZm4oKHZvaWQgKilwb3MpOwotCQlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgc3RhcnQsIHBhZ2UsIFBBR0VfU0laRSwgUEFHRV9TSEFSRUQpKQotCQkJcmV0dXJuIC1FQUdBSU47Ci0JCXN0YXJ0ICs9IFBBR0VfU0laRTsKLQkJcG9zICs9IFBBR0VfU0laRTsKLQkJaWYgKHNpemUgPiBQQUdFX1NJWkUpCi0JCQlzaXplIC09IFBBR0VfU0laRTsKLQkJZWxzZQotCQkJc2l6ZSA9IDA7Ci0JfQorc3RhdGljIGludCBxdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50ICpuYnVmZmVycywKKwkJCQl1bnNpZ25lZCBpbnQgKm5wbGFuZXMsIHVuc2lnbmVkIGxvbmcgc2l6ZXNbXSwKKwkJCQl2b2lkICphbGxvY19jdHhzW10pCit7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2YjJfZ2V0X2Rydl9wcml2KHZxKTsKKworCWlmICgqbmJ1ZmZlcnMgPCBNSU5fRlJBTUVTKQorCQkqbmJ1ZmZlcnMgPSBNSU5fRlJBTUVTOworCWVsc2UgaWYgKCpuYnVmZmVycyA+IE1BWF9GUkFNRVMpCisJCSpuYnVmZmVycyA9IE1BWF9GUkFNRVM7CisKKwkqbnBsYW5lcyA9IDE7CisKKwlzaXplc1swXSA9IFBBR0VfQUxJR04oKHBkZXYtPmFic19tYXgueCAqIHBkZXYtPmFic19tYXgueSAqIDMpIC8gMik7CisKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBidWZmZXJfaW5pdChzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHB3Y19mcmFtZV9idWYgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IHB3Y19mcmFtZV9idWYsIHZiKTsKKworCS8qIG5lZWQgdm1hbGxvYyBzaW5jZSBmcmFtZSBidWZmZXIgPiAxMjhLICovCisJYnVmLT5kYXRhID0gdnphbGxvYyhQV0NfRlJBTUVfU0laRSk7CisJaWYgKGJ1Zi0+ZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ1ZmZlcl9wcmVwYXJlKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZiMl9nZXRfZHJ2X3ByaXYodmItPnZiMl9xdWV1ZSk7CisKKwkvKiBEb24ndCBhbGxvdyBxdWVpbmcgbmV3IGJ1ZmZlcnMgYWZ0ZXIgZGV2aWNlIGRpc2Nvbm5lY3Rpb24gKi8KKwlpZiAoIXBkZXYtPnVkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnVmZmVyX2ZpbmlzaChzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2YjJfZ2V0X2Rydl9wcml2KHZiLT52YjJfcXVldWUpOworCXN0cnVjdCBwd2NfZnJhbWVfYnVmICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBwd2NfZnJhbWVfYnVmLCB2Yik7CisKKwkvKgorCSAqIEFwcGxpY2F0aW9uIGhhcyBjYWxsZWQgZHFidWYgYW5kIGlzIGdldHRpbmcgYmFjayBhIGJ1ZmZlciB3ZSd2ZQorCSAqIGZpbGxlZCwgdGFrZSB0aGUgcHdjIGRhdGEgd2UndmUgc3RvcmVkIGluIGJ1Zi0+ZGF0YSBhbmQgZGVjb21wcmVzcworCSAqIGl0IGludG8gYSB1c2FibGUgZm9ybWF0LCBzdG9yaW5nIHRoZSByZXN1bHQgaW4gdGhlIHZiMl9idWZmZXIKKwkgKi8KKwlyZXR1cm4gcHdjX2RlY29tcHJlc3MocGRldiwgYnVmKTsKK30KKworc3RhdGljIHZvaWQgYnVmZmVyX2NsZWFudXAoc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBwd2NfZnJhbWVfYnVmICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBwd2NfZnJhbWVfYnVmLCB2Yik7CisKKwl2ZnJlZShidWYtPmRhdGEpOworfQorCitzdGF0aWMgdm9pZCBidWZmZXJfcXVldWUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmIyX2dldF9kcnZfcHJpdih2Yi0+dmIyX3F1ZXVlKTsKKwlzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiwgdmIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBkZXYtPnF1ZXVlZF9idWZzX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZidWYtPmxpc3QsICZwZGV2LT5xdWV1ZWRfYnVmcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRldi0+cXVldWVkX2J1ZnNfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHN0YXJ0X3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICp2cSkKK3sKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOworCisJaWYgKCFwZGV2LT51ZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIFR1cm4gb24gY2FtZXJhIGFuZCBzZXQgTEVEUyBvbiAqLworCXB3Y19jYW1lcmFfcG93ZXIocGRldiwgMSk7CisJaWYgKHBkZXYtPnBvd2VyX3NhdmUpIHsKKwkJLyogUmVzdG9yZSB2aWRlbyBtb2RlICovCisJCXB3Y19zZXRfdmlkZW9fbW9kZShwZGV2LCBwZGV2LT52aWV3LngsIHBkZXYtPnZpZXcueSwKKwkJCQkgICBwZGV2LT52ZnJhbWVzLCBwZGV2LT52Y29tcHJlc3Npb24sCisJCQkJICAgcGRldi0+dnNuYXBzaG90KTsKKwl9CisJcHdjX3NldF9sZWRzKHBkZXYsIGxlZF9vbiwgbGVkX29mZik7CisKKwlyZXR1cm4gcHdjX2lzb2NfaW5pdChwZGV2KTsKK30KKworc3RhdGljIGludCBzdG9wX3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICp2cSkKK3sKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOworCisJaWYgKHBkZXYtPnVkZXYpIHsKKwkJcHdjX3NldF9sZWRzKHBkZXYsIDAsIDApOworCQlwd2NfY2FtZXJhX3Bvd2VyKHBkZXYsIDApOworCQlwd2NfaXNvY19jbGVhbnVwKHBkZXYpOworCX0KKwlwd2NfY2xlYW51cF9xdWV1ZWRfYnVmcyhwZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwd2NfbG9jayhzdHJ1Y3QgdmIyX3F1ZXVlICp2cSkKK3sKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOworCW11dGV4X2xvY2soJnBkZXYtPm1vZGxvY2spOworfQorCitzdGF0aWMgdm9pZCBwd2NfdW5sb2NrKHN0cnVjdCB2YjJfcXVldWUgKnZxKQoreworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CisJbXV0ZXhfdW5sb2NrKCZwZGV2LT5tb2Rsb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCB2YjJfb3BzIHB3Y192Yl9xdWV1ZV9vcHMgPSB7CisJLnF1ZXVlX3NldHVwCQk9IHF1ZXVlX3NldHVwLAorCS5idWZfaW5pdAkJPSBidWZmZXJfaW5pdCwKKwkuYnVmX3ByZXBhcmUJCT0gYnVmZmVyX3ByZXBhcmUsCisJLmJ1Zl9maW5pc2gJCT0gYnVmZmVyX2ZpbmlzaCwKKwkuYnVmX2NsZWFudXAJCT0gYnVmZmVyX2NsZWFudXAsCisJLmJ1Zl9xdWV1ZQkJPSBidWZmZXJfcXVldWUsCisJLnN0YXJ0X3N0cmVhbWluZwk9IHN0YXJ0X3N0cmVhbWluZywKKwkuc3RvcF9zdHJlYW1pbmcJCT0gc3RvcF9zdHJlYW1pbmcsCisJLndhaXRfcHJlcGFyZQkJPSBwd2NfdW5sb2NrLAorCS53YWl0X2ZpbmlzaAkJPSBwd2NfbG9jaywKK307CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBVU0IgZnVuY3Rpb25zICovCiAKQEAgLTE0MDYsNiArODkwLDcgQEAKIAlpbnQgaGludCwgcmM7CiAJaW50IGZlYXR1cmVzID0gMDsKIAlpbnQgdmlkZW9fbnIgPSAtMTsgLyogZGVmYXVsdDogdXNlIG5leHQgYXZhaWxhYmxlIGRldmljZSAqLworCWludCBteV9wb3dlcl9zYXZlID0gcG93ZXJfc2F2ZTsKIAljaGFyIHNlcmlhbF9udW1iZXJbMzBdLCAqbmFtZTsKIAogCXZlbmRvcl9pZCA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOwpAQCAtMTUxMyw2ICs5OTgsOCBAQAogCQkJUFdDX0lORk8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIDQwMDAgUHJvIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiTG9naXRlY2ggUXVpY2tDYW0gUHJvIDQwMDAiOwogCQkJdHlwZV9pZCA9IDc0MDsgLyogQ0NEIHNlbnNvciAqLworCQkJaWYgKG15X3Bvd2VyX3NhdmUgPT0gLTEpCisJCQkJbXlfcG93ZXJfc2F2ZSA9IDE7CiAJCQlicmVhazsKIAkJY2FzZSAweDA4YjM6CiAJCQlQV0NfSU5GTygiTG9naXRlY2ggUXVpY2tDYW0gWm9vbSBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CkBAIC0xNTIzLDEyICsxMDEwLDE1IEBACiAJCQlQV0NfSU5GTygiTG9naXRlY2ggUXVpY2tDYW0gWm9vbSAobmV3IG1vZGVsKSBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CiAJCQluYW1lID0gIkxvZ2l0ZWNoIFF1aWNrQ2FtIFpvb20iOwogCQkJdHlwZV9pZCA9IDc0MDsgLyogQ0NEIHNlbnNvciAqLwotCQkJcG93ZXJfc2F2ZSA9IDE7CisJCQlpZiAobXlfcG93ZXJfc2F2ZSA9PSAtMSkKKwkJCQlteV9wb3dlcl9zYXZlID0gMTsKIAkJCWJyZWFrOwogCQljYXNlIDB4MDhiNToKIAkJCVBXQ19JTkZPKCJMb2dpdGVjaCBRdWlja0NhbSBPcmJpdC9TcGhlcmUgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJMb2dpdGVjaCBRdWlja0NhbSBPcmJpdCI7CiAJCQl0eXBlX2lkID0gNzQwOyAvKiBDQ0Qgc2Vuc29yICovCisJCQlpZiAobXlfcG93ZXJfc2F2ZSA9PSAtMSkKKwkJCQlteV9wb3dlcl9zYXZlID0gMTsKIAkJCWZlYXR1cmVzIHw9IEZFQVRVUkVfTU9UT1JfUEFOVElMVDsKIAkJCWJyZWFrOwogCQljYXNlIDB4MDhiNjoKQEAgLTE1ODMsNiArMTA3Myw4IEBACiAJCQlQV0NfSU5GTygiQ3JlYXRpdmUgTGFicyBXZWJjYW0gNSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJDcmVhdGl2ZSBMYWJzIFdlYmNhbSA1IjsKIAkJCXR5cGVfaWQgPSA3MzA7CisJCQlpZiAobXlfcG93ZXJfc2F2ZSA9PSAtMSkKKwkJCQlteV9wb3dlcl9zYXZlID0gMTsKIAkJCWJyZWFrOwogCQljYXNlIDB4NDAxMToKIAkJCVBXQ19JTkZPKCJDcmVhdGl2ZSBMYWJzIFdlYmNhbSBQcm8gRXggZGV0ZWN0ZWQuXG4iKTsKQEAgLTE2NDAsNiArMTEzMiw5IEBACiAJZWxzZQogCQlyZXR1cm4gLUVOT0RFVjsgLyogTm90IGFueSBvZiB0aGUga25vdyB0eXBlczsgYnV0IHRoZSBsaXN0IGtlZXBzIGdyb3dpbmcuICovCiAKKwlpZiAobXlfcG93ZXJfc2F2ZSA9PSAtMSkKKwkJbXlfcG93ZXJfc2F2ZSA9IDA7CisKIAltZW1zZXQoc2VyaWFsX251bWJlciwgMCwgMzApOwogCXVzYl9zdHJpbmcodWRldiwgdWRldi0+ZGVzY3JpcHRvci5pU2VyaWFsTnVtYmVyLCBzZXJpYWxfbnVtYmVyLCAyOSk7CiAJUFdDX0RFQlVHX1BST0JFKCJEZXZpY2Ugc2VyaWFsIG51bWJlciBpcyAlc1xuIiwgc2VyaWFsX251bWJlcik7CkBAIC0xNjU0LDcgKzExNDksNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJcGRldi0+dHlwZSA9IHR5cGVfaWQ7Ci0JcGRldi0+dnNpemUgPSBkZWZhdWx0X3NpemU7CiAJcGRldi0+dmZyYW1lcyA9IGRlZmF1bHRfZnBzOwogCXN0cmNweShwZGV2LT5zZXJpYWwsIHNlcmlhbF9udW1iZXIpOwogCXBkZXYtPmZlYXR1cmVzID0gZmVhdHVyZXM7CkBAIC0xNjY4LDEzICsxMTYyLDI2IEBACiAJCXBkZXYtPmFuZ2xlX3JhbmdlLnRpbHRfbWluID0gLTMwMDA7CiAJCXBkZXYtPmFuZ2xlX3JhbmdlLnRpbHRfbWF4ID0gIDI1MDA7CiAJfQorCXB3Y19jb25zdHJ1Y3QocGRldik7IC8qIHNldCBtaW4vbWF4IHNpemVzIGNvcnJlY3QgKi8KIAogCW11dGV4X2luaXQoJnBkZXYtPm1vZGxvY2spOwotCXNwaW5fbG9ja19pbml0KCZwZGV2LT5wdHJsb2NrKTsKKwltdXRleF9pbml0KCZwZGV2LT51ZGV2bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnBkZXYtPnF1ZXVlZF9idWZzX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZwZGV2LT5xdWV1ZWRfYnVmcyk7CiAKIAlwZGV2LT51ZGV2ID0gdWRldjsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwZGV2LT5mcmFtZXEpOwogCXBkZXYtPnZjb21wcmVzc2lvbiA9IHB3Y19wcmVmZXJyZWRfY29tcHJlc3Npb247CisJcGRldi0+cG93ZXJfc2F2ZSA9IG15X3Bvd2VyX3NhdmU7CisKKwkvKiBJbml0IHZpZGVvYnVmMiBxdWV1ZSBzdHJ1Y3R1cmUgKi8KKwltZW1zZXQoJnBkZXYtPnZiX3F1ZXVlLCAwLCBzaXplb2YocGRldi0+dmJfcXVldWUpKTsKKwlwZGV2LT52Yl9xdWV1ZS50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCXBkZXYtPnZiX3F1ZXVlLmlvX21vZGVzID0gVkIyX01NQVAgfCBWQjJfVVNFUlBUUiB8IFZCMl9SRUFEOworCXBkZXYtPnZiX3F1ZXVlLmRydl9wcml2ID0gcGRldjsKKwlwZGV2LT52Yl9xdWV1ZS5idWZfc3RydWN0X3NpemUgPSBzaXplb2Yoc3RydWN0IHB3Y19mcmFtZV9idWYpOworCXBkZXYtPnZiX3F1ZXVlLm9wcyA9ICZwd2NfdmJfcXVldWVfb3BzOworCXBkZXYtPnZiX3F1ZXVlLm1lbV9vcHMgPSAmdmIyX3ZtYWxsb2NfbWVtb3BzOworCXZiMl9xdWV1ZV9pbml0KCZwZGV2LT52Yl9xdWV1ZSk7CiAKIAkvKiBJbml0IHZpZGVvX2RldmljZSBzdHJ1Y3R1cmUgKi8KIAltZW1jcHkoJnBkZXYtPnZkZXYsICZwd2NfdGVtcGxhdGUsIHNpemVvZihwd2NfdGVtcGxhdGUpKTsKQEAgLTE3MDcsMTQgKzEyMTQsNDAgQEAKIAlQV0NfREVCVUdfUFJPQkUoInByb2JlKCkgZnVuY3Rpb24gcmV0dXJuaW5nIHN0cnVjdCBhdCAweCVwLlxuIiwgcGRldik7CiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBwZGV2KTsKIAorI2lmZGVmIENPTkZJR19VU0JfUFdDX0RFQlVHCisJLyogUXVlcnkgc2Vuc29yIHR5cGUgKi8KKwlpZiAocHdjX2dldF9jbW9zX3NlbnNvcihwZGV2LCAmcmMpID49IDApIHsKKwkJUFdDX0RFQlVHX09QRU4oIlRoaXMgJXMgY2FtZXJhIGlzIGVxdWlwcGVkIHdpdGggYSAlcyAoJWQpLlxuIiwKKwkJCQlwZGV2LT52ZGV2Lm5hbWUsCisJCQkJcHdjX3NlbnNvcl90eXBlX3RvX3N0cmluZyhyYyksIHJjKTsKKwl9CisjZW5kaWYKKwogCS8qIFNldCB0aGUgbGVkcyBvZmYgKi8KIAlwd2Nfc2V0X2xlZHMocGRldiwgMCwgMCk7CisKKwkvKiBTZXR1cCBpbnRpYWwgdmlkZW9tb2RlICovCisJcmMgPSBwd2Nfc2V0X3ZpZGVvX21vZGUocGRldiwgcGRldi0+dmlld19tYXgueCwgcGRldi0+dmlld19tYXgueSwKKwkJCQlwZGV2LT52ZnJhbWVzLCBwZGV2LT52Y29tcHJlc3Npb24sIDApOworCWlmIChyYykKKwkJZ290byBlcnJfZnJlZV9tZW07CisKKwkvKiBSZWdpc3RlciBjb250cm9scyAoYW5kIHJlYWQgZGVmYXVsdCB2YWx1ZXMgZnJvbSBjYW1lcmEgKi8KKwlyYyA9IHB3Y19pbml0X2NvbnRyb2xzKHBkZXYpOworCWlmIChyYykgeworCQlQV0NfRVJST1IoIkZhaWxlZCB0byByZWdpc3RlciB2NGwyIGNvbnRyb2xzICglZCkuXG4iLCByYyk7CisJCWdvdG8gZXJyX2ZyZWVfbWVtOworCX0KKworCXBkZXYtPnZkZXYuY3RybF9oYW5kbGVyID0gJnBkZXYtPmN0cmxfaGFuZGxlcjsKKworCS8qIEFuZCBwb3dlcmRvd24gdGhlIGNhbWVyYSB1bnRpbCBzdHJlYW1pbmcgc3RhcnRzICovCiAJcHdjX2NhbWVyYV9wb3dlcihwZGV2LCAwKTsKIAogCXJjID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZwZGV2LT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCB2aWRlb19ucik7CiAJaWYgKHJjIDwgMCkgewogCQlQV0NfRVJST1IoIkZhaWxlZCB0byByZWdpc3RlciBhcyB2aWRlbyBkZXZpY2UgKCVkKS5cbiIsIHJjKTsKLQkJZ290byBlcnJfZnJlZV9tZW07CisJCWdvdG8gZXJyX2ZyZWVfY29udHJvbHM7CiAJfQogCXJjID0gcHdjX2NyZWF0ZV9zeXNmc19maWxlcyhwZGV2KTsKIAlpZiAocmMpCkBAIC0xNzU3LDcgKzEyOTAsMTAgQEAKIAlpZiAoaGludCA8IE1BWF9ERVZfSElOVFMpCiAJCWRldmljZV9oaW50W2hpbnRdLnBkZXYgPSBOVUxMOwogCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZwZGV2LT52ZGV2KTsKK2Vycl9mcmVlX2NvbnRyb2xzOgorCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJnBkZXYtPmN0cmxfaGFuZGxlcik7CiBlcnJfZnJlZV9tZW06CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKIAlrZnJlZShwZGV2KTsKIAlyZXR1cm4gcmM7CiB9CkBAIC0xNzY3LDMzICsxMzAzLDE3IEBACiB7CiAJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAorCW11dGV4X2xvY2soJnBkZXYtPnVkZXZsb2NrKTsKIAltdXRleF9sb2NrKCZwZGV2LT5tb2Rsb2NrKTsKLQl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCBOVUxMKTsKLQlpZiAocGRldiA9PSBOVUxMKSB7Ci0JCVBXQ19FUlJPUigicHdjX2Rpc2Nvbm5lY3QoKSBDYWxsZWQgd2l0aG91dCBwcml2YXRlIHBvaW50ZXIuXG4iKTsKLQkJZ290byBkaXNjb25uZWN0X291dDsKLQl9Ci0JaWYgKHBkZXYtPnVkZXYgPT0gTlVMTCkgewotCQlQV0NfRVJST1IoInB3Y19kaXNjb25uZWN0KCkgYWxyZWFkeSBjYWxsZWQgZm9yICVwXG4iLCBwZGV2KTsKLQkJZ290byBkaXNjb25uZWN0X291dDsKLQl9Ci0JaWYgKHBkZXYtPnVkZXYgIT0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSkgewotCQlQV0NfRVJST1IoInB3Y19kaXNjb25uZWN0KCkgV29vcHM6IHBvaW50ZXIgbWlzbWF0Y2ggdWRldi9wZGV2LlxuIik7Ci0JCWdvdG8gZGlzY29ubmVjdF9vdXQ7Ci0JfQogCi0JLyogV2UgZ290IHVucGx1Z2dlZDsgdGhpcyBpcyBzaWduYWxsZWQgYnkgYW4gRVBJUEUgZXJyb3IgY29kZSAqLwotCXBkZXYtPmVycm9yX3N0YXR1cyA9IEVQSVBFOwotCXBkZXYtPnVucGx1Z2dlZCA9IDE7Ci0KLQkvKiBBbGVydCB3YWl0aW5nIHByb2Nlc3NlcyAqLwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcGRldi0+ZnJhbWVxKTsKLQorCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CiAJLyogTm8gbmVlZCB0byBrZWVwIHRoZSB1cmJzIGFyb3VuZCBhZnRlciBkaXNjb25uZWN0aW9uICovCiAJcHdjX2lzb2NfY2xlYW51cChwZGV2KTsKKwlwd2NfY2xlYW51cF9xdWV1ZWRfYnVmcyhwZGV2KTsKKwlwZGV2LT51ZGV2ID0gTlVMTDsKIAotZGlzY29ubmVjdF9vdXQ6CiAJbXV0ZXhfdW5sb2NrKCZwZGV2LT5tb2Rsb2NrKTsKKwltdXRleF91bmxvY2soJnBkZXYtPnVkZXZsb2NrKTsKIAogCXB3Y19yZW1vdmVfc3lzZnNfZmlsZXMocGRldik7CiAJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJnBkZXYtPnZkZXYpOwpAQCAtMTgwOSwzNiArMTMyOSwyNyBAQAogICogSW5pdGlhbGl6YXRpb24gY29kZSAmIG1vZHVsZSBzdHVmZgogICovCiAKLXN0YXRpYyBjaGFyICpzaXplOwogc3RhdGljIGludCBmcHM7Ci1zdGF0aWMgaW50IGZidWZzOwotc3RhdGljIGludCBtYnVmczsKIHN0YXRpYyBpbnQgY29tcHJlc3Npb24gPSAtMTsKIHN0YXRpYyBpbnQgbGVkc1syXSA9IHsgLTEsIC0xIH07CiBzdGF0aWMgdW5zaWduZWQgaW50IGxlZHNfbmFyZ3M7CiBzdGF0aWMgY2hhciAqZGV2X2hpbnRbTUFYX0RFVl9ISU5UU107CiBzdGF0aWMgdW5zaWduZWQgaW50IGRldl9oaW50X25hcmdzOwogCi1tb2R1bGVfcGFyYW0oc2l6ZSwgY2hhcnAsIDA0NDQpOwogbW9kdWxlX3BhcmFtKGZwcywgaW50LCAwNDQ0KTsKLW1vZHVsZV9wYXJhbShmYnVmcywgaW50LCAwNDQ0KTsKLW1vZHVsZV9wYXJhbShtYnVmcywgaW50LCAwNDQ0KTsKICNpZmRlZiBDT05GSUdfVVNCX1BXQ19ERUJVRwogbW9kdWxlX3BhcmFtX25hbWVkKHRyYWNlLCBwd2NfdHJhY2UsIGludCwgMDY0NCk7CiAjZW5kaWYKLW1vZHVsZV9wYXJhbShwb3dlcl9zYXZlLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKHBvd2VyX3NhdmUsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0oY29tcHJlc3Npb24sIGludCwgMDQ0NCk7CiBtb2R1bGVfcGFyYW1fYXJyYXkobGVkcywgaW50LCAmbGVkc19uYXJncywgMDQ0NCk7CiBtb2R1bGVfcGFyYW1fYXJyYXkoZGV2X2hpbnQsIGNoYXJwLCAmZGV2X2hpbnRfbmFyZ3MsIDA0NDQpOwogCi1NT0RVTEVfUEFSTV9ERVNDKHNpemUsICJJbml0aWFsIGltYWdlIHNpemUuIE9uZSBvZiBzcWNpZiwgcXNpZiwgcWNpZiwgc2lmLCBjaWYsIHZnYSIpOwogTU9EVUxFX1BBUk1fREVTQyhmcHMsICJJbml0aWFsIGZyYW1lcyBwZXIgc2Vjb25kLiBWYXJpZXMgd2l0aCBtb2RlbCwgdXNlZnVsIHJhbmdlIDUtMzAiKTsKLU1PRFVMRV9QQVJNX0RFU0MoZmJ1ZnMsICJOdW1iZXIgb2YgaW50ZXJuYWwgZnJhbWUgYnVmZmVycyB0byByZXNlcnZlIik7Ci1NT0RVTEVfUEFSTV9ERVNDKG1idWZzLCAiTnVtYmVyIG9mIGV4dGVybmFsIChtbWFwKCllZCkgaW1hZ2UgYnVmZmVycyIpOwogI2lmZGVmIENPTkZJR19VU0JfUFdDX0RFQlVHCiBNT0RVTEVfUEFSTV9ERVNDKHRyYWNlLCAiRm9yIGRlYnVnZ2luZyBwdXJwb3NlcyIpOwogI2VuZGlmCi1NT0RVTEVfUEFSTV9ERVNDKHBvd2VyX3NhdmUsICJUdXJuIHBvd2VyIHNhdmUgZmVhdHVyZSBpbiBjYW1lcmEgb24gb3Igb2ZmIik7CitNT0RVTEVfUEFSTV9ERVNDKHBvd2VyX3NhdmUsICJUdXJuIHBvd2VyIHNhdmluZyBmb3IgbmV3IGNhbWVyYXMgb24gb3Igb2ZmIik7CiBNT0RVTEVfUEFSTV9ERVNDKGNvbXByZXNzaW9uLCAiUHJlZmVycmVkIGNvbXByZXNzaW9uIHF1YWxpdHkuIFJhbmdlIDAgKHVuY29tcHJlc3NlZCkgdG8gMyAoaGlnaCBjb21wcmVzc2lvbikiKTsKIE1PRFVMRV9QQVJNX0RFU0MobGVkcywgIkxFRCBvbixvZmYgdGltZSBpbiBtaWxsaXNlY29uZHMiKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGV2X2hpbnQsICJEZXZpY2Ugbm9kZSBoaW50cyIpOwpAQCAtMTg1MSwxNCArMTM2MiwxOSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB1c2JfcHdjX2luaXQodm9pZCkKIHsKLQlpbnQgaSwgc3o7Ci0JY2hhciAqc2l6ZW5hbWVzW1BTWl9NQVhdID0geyAic3FjaWYiLCAicXNpZiIsICJxY2lmIiwgInNpZiIsICJjaWYiLCAidmdhIiB9OworCWludCBpOwogCisjaWZkZWYgQ09ORklHX1VTQl9QV0NfREVCVUcKIAlQV0NfSU5GTygiUGhpbGlwcyB3ZWJjYW0gbW9kdWxlIHZlcnNpb24gIiBQV0NfVkVSU0lPTiAiIGxvYWRlZC5cbiIpOwogCVBXQ19JTkZPKCJTdXBwb3J0cyBQaGlsaXBzIFBDQTY0NS82NDYsIFBDVkM2NzUvNjgwLzY5MCwgUENWQzcyMFs0MF0vNzMwLzc0MC83NTAgJiBQQ1ZDODMwLzg0MC5cbiIpOwogCVBXQ19JTkZPKCJBbHNvIHN1cHBvcnRzIHRoZSBBc2tleSBWQzAxMCwgdmFyaW91cyBMb2dpdGVjaCBRdWlja2NhbXMsIFNhbXN1bmcgTVBDLUMxMCBhbmQgTVBDLUMzMCxcbiIpOwogCVBXQ19JTkZPKCJ0aGUgQ3JlYXRpdmUgV2ViQ2FtIDUgJiBQcm8gRXgsIFNPVEVDIEFmaW5hIEV5ZSBhbmQgVmlzaW9uaXRlIFZDUy1VQzMwMCBhbmQgVkNTLVVNMTAwLlxuIik7CiAKKwlpZiAocHdjX3RyYWNlID49IDApIHsKKwkJUFdDX0RFQlVHX01PRFVMRSgiVHJhY2Ugb3B0aW9uczogMHglMDR4XG4iLCBwd2NfdHJhY2UpOworCX0KKyNlbmRpZgorCiAJaWYgKGZwcykgewogCQlpZiAoZnBzIDwgNCB8fCBmcHMgPiAzMCkgewogCQkJUFdDX0VSUk9SKCJGcmFtZXJhdGUgb3V0IG9mIGJvdW5kcyAoNC0zMCkuXG4iKTsKQEAgLTE4NjgsNDEgKzEzODQsNiBAQAogCQlQV0NfREVCVUdfTU9EVUxFKCJEZWZhdWx0IGZyYW1lcmF0ZSBzZXQgdG8gJWQuXG4iLCBkZWZhdWx0X2Zwcyk7CiAJfQogCi0JaWYgKHNpemUpIHsKLQkJLyogc3RyaW5nOyB0cnkgbWF0Y2hpbmcgd2l0aCBhcnJheSAqLwotCQlmb3IgKHN6ID0gMDsgc3ogPCBQU1pfTUFYOyBzeisrKSB7Ci0JCQlpZiAoIXN0cmNtcChzaXplbmFtZXNbc3pdLCBzaXplKSkgeyAvKiBGb3VuZCEgKi8KLQkJCQlkZWZhdWx0X3NpemUgPSBzejsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoc3ogPT0gUFNaX01BWCkgewotCQkJUFdDX0VSUk9SKCJTaXplIG5vdCByZWNvZ25pemVkOyB0cnkgc2l6ZT1bc3FjaWYgfCBxc2lmIHwgcWNpZiB8IHNpZiB8IGNpZiB8IHZnYV0uXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCVBXQ19ERUJVR19NT0RVTEUoIkRlZmF1bHQgaW1hZ2Ugc2l6ZSBzZXQgdG8gJXMgWyVkeCVkXS5cbiIsIHNpemVuYW1lc1tkZWZhdWx0X3NpemVdLCBwd2NfaW1hZ2Vfc2l6ZXNbZGVmYXVsdF9zaXplXS54LCBwd2NfaW1hZ2Vfc2l6ZXNbZGVmYXVsdF9zaXplXS55KTsKLQl9Ci0JaWYgKG1idWZzKSB7Ci0JCWlmIChtYnVmcyA8IDEgfHwgbWJ1ZnMgPiBNQVhfSU1BR0VTKSB7Ci0JCQlQV0NfRVJST1IoIklsbGVnYWwgbnVtYmVyIG9mIG1tYXAoKSBidWZmZXJzOyB1c2UgYSBudW1iZXIgYmV0d2VlbiAxIGFuZCAlZC5cbiIsIE1BWF9JTUFHRVMpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJcHdjX21idWZzID0gbWJ1ZnM7Ci0JCVBXQ19ERUJVR19NT0RVTEUoIk51bWJlciBvZiBpbWFnZSBidWZmZXJzIHNldCB0byAlZC5cbiIsIHB3Y19tYnVmcyk7Ci0JfQotCWlmIChmYnVmcykgewotCQlpZiAoZmJ1ZnMgPCAyIHx8IGZidWZzID4gTUFYX0ZSQU1FUykgewotCQkJUFdDX0VSUk9SKCJJbGxlZ2FsIG51bWJlciBvZiBmcmFtZSBidWZmZXJzOyB1c2UgYSBudW1iZXIgYmV0d2VlbiAyIGFuZCAlZC5cbiIsIE1BWF9GUkFNRVMpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJZGVmYXVsdF9mYnVmcyA9IGZidWZzOwotCQlQV0NfREVCVUdfTU9EVUxFKCJOdW1iZXIgb2YgZnJhbWUgYnVmZmVycyBzZXQgdG8gJWQuXG4iLCBkZWZhdWx0X2ZidWZzKTsKLQl9Ci0jaWZkZWYgQ09ORklHX1VTQl9QV0NfREVCVUcKLQlpZiAocHdjX3RyYWNlID49IDApIHsKLQkJUFdDX0RFQlVHX01PRFVMRSgiVHJhY2Ugb3B0aW9uczogMHglMDR4XG4iLCBwd2NfdHJhY2UpOwotCX0KLSNlbmRpZgogCWlmIChjb21wcmVzc2lvbiA+PSAwKSB7CiAJCWlmIChjb21wcmVzc2lvbiA+IDMpIHsKIAkJCVBXQ19FUlJPUigiSW52YWxpZCBjb21wcmVzc2lvbiBzZXR0aW5nOyB1c2UgYSBudW1iZXIgYmV0d2VlbiAwICh1bmNvbXByZXNzZWQpIGFuZCAzIChoaWdoKS5cbiIpOwpAQCAtMTkxMSw4ICsxMzkyLDYgQEAKIAkJcHdjX3ByZWZlcnJlZF9jb21wcmVzc2lvbiA9IGNvbXByZXNzaW9uOwogCQlQV0NfREVCVUdfTU9EVUxFKCJQcmVmZXJyZWQgY29tcHJlc3Npb24gc2V0IHRvICVkLlxuIiwgcHdjX3ByZWZlcnJlZF9jb21wcmVzc2lvbik7CiAJfQotCWlmIChwb3dlcl9zYXZlKQotCQlQV0NfREVCVUdfTU9EVUxFKCJFbmFibGluZyBwb3dlciBzYXZlIG9uIG9wZW4vY2xvc2UuXG4iKTsKIAlpZiAobGVkc1swXSA+PSAwKQogCQlsZWRfb24gPSBsZWRzWzBdOwogCWlmIChsZWRzWzFdID49IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaW9jdGwuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pb2N0bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzBjYWU3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pb2N0bC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLSNpZm5kZWYgUFdDX0lPQ1RMX0gKLSNkZWZpbmUgUFdDX0lPQ1RMX0gKLQotLyogKEMpIDIwMDEtMjAwNCBOZW1vc29mdCBVbnYuCi0gICAoQykgMjAwNC0yMDA2IEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKLQotICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4Ci0gICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KLSAgIFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBzdXBwb3J0IHJlcXVlc3RzIHRvIDxsdWNAc2FpbGxhcmQub3JnPi4KLSAgIFRoZSBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBieSByZXZlcnNlLWVuZ2luZWVyaW5nIHRoZQotICAgTmVtb3NvZnQgYmluYXJ5IHB3Y3ggbW9kdWxlLiBDYXZlYXQgZW1wdG9yLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSovCi0KLS8qIFRoaXMgaXMgcHdjLWlvY3RsLmggYmVsb25naW5nIHRvIFBXQyAxMC4wLjEwCi0gICBJdCBjb250YWlucyBzdHJ1Y3R1cmVzIGFuZCBkZWZpbmVzIHRvIGNvbW11bmljYXRlIGZyb20gdXNlciBzcGFjZQotICAgZGlyZWN0bHkgdG8gdGhlIGRyaXZlci4KLSAqLwotCi0vKgotICAgQ2hhbmdlcwotICAgMjAwMS8wOC8wMyAgQWx2YXJhZG8gICBBZGRlZCBpb2N0bCBjb25zdGFudHMgdG8gYWNjZXNzIG1ldGhvZHMgZm9yCi0JCQkgIGNoYW5naW5nIHdoaXRlIGJhbGFuY2UgYW5kIHJlZC9ibHVlIGdhaW5zCi0gICAyMDAyLzEyLzE1ICBHLiBILiBGZXJuYW5kZXotVG9yaWJpbyAgIFZJRElPQ0dSRUFMU0laRQotICAgMjAwMy8xMi8xMyAgTmVtb3NmdCBVbnYuIFNvbWUgbW9kaWZpY2F0aW9ucyB0byBtYWtlIGludGVyZmFjaW5nIHRvCi0JICAgICAgIFBXQ1ggZWFzaWVyCi0gKi8KLQotLyogVGhlc2UgYXJlIHByaXZhdGUgaW9jdGwoKSBjb21tYW5kcywgc3BlY2lmaWMgZm9yIHRoZSBQaGlsaXBzIHdlYmNhbXMuCi0gICBUaGV5IGNvbnRhaW4gZnVuY3Rpb25zIG5vdCBmb3VuZCBpbiBvdGhlciB3ZWJjYW1zLCBhbmQgc2V0dGluZ3Mgbm90Ci0gICBzcGVjaWZpZWQgaW4gdGhlIFZpZGVvNExpbnV4IEFQSS4KLQotICAgVGhlICNkZWZpbmUgbmFtZXMgYXJlIGJ1aWx0IHVwIGxpa2UgZm9sbG93czoKLSAgIFZJRElPQwkJVklEZW8gSU9DdGwgcHJlZml4Ci0JIFBXQwkJUGhpbHBzIFdlYkNhbQotCSAgICBHICAgICAgICAgICBvcHRpb25hbDogR2V0Ci0JICAgIFMgICAgICAgICAgIG9wdGlvbmFsOiBTZXQKLQkgICAgIC4uLiAJdGhlIGZ1bmN0aW9uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotCi0gLyogRW51bWVyYXRpb24gb2YgaW1hZ2Ugc2l6ZXMgKi8KLSNkZWZpbmUgUFNaX1NRQ0lGCTB4MDAKLSNkZWZpbmUgUFNaX1FTSUYJMHgwMQotI2RlZmluZSBQU1pfUUNJRgkweDAyCi0jZGVmaW5lIFBTWl9TSUYJCTB4MDMKLSNkZWZpbmUgUFNaX0NJRgkJMHgwNAotI2RlZmluZSBQU1pfVkdBCQkweDA1Ci0jZGVmaW5lIFBTWl9NQVgJCTYKLQotCi0vKiBUaGUgZnJhbWUgcmF0ZSBpcyBlbmNvZGVkIGluIHRoZSB2aWRlb193aW5kb3cuZmxhZ3MgcGFyYW1ldGVyIHVzaW5nCi0gICB0aGUgdXBwZXIgMTYgYml0cywgc2luY2Ugc29tZSBmbGFncyBhcmUgZGVmaW5lZCBub3dhZGF5cy4gVGhlIGZvbGxvd2luZwotICAgZGVmaW5lcyBwcm92aWRlIGEgbWFzayBhbmQgc2hpZnQgdG8gZmlsdGVyIG91dCB0aGlzIHZhbHVlLgotICAgVGhpcyB2YWx1ZSBjYW4gYWxzbyBiZSBwYXNzaW5nIHVzaW5nIHRoZSBwcml2YXRlIGZsYWcgd2hlbiB1c2luZyB2NGwyIGFuZAotICAgVklESU9DX1NfRk1UIGlvY3RsLgotCi0gICBJbiAnU25hcHNob3QnIG1vZGUgdGhlIGNhbWVyYSBmcmVlemVzIGl0cyBhdXRvbWF0aWMgZXhwb3N1cmUgYW5kIGNvbG91cgotICAgYmFsYW5jZSBjb250cm9scy4KLSAqLwotI2RlZmluZSBQV0NfRlBTX1NISUZUCQkxNgotI2RlZmluZSBQV0NfRlBTX01BU0sJCTB4MDBGRjAwMDAKLSNkZWZpbmUgUFdDX0ZQU19GUk1BU0sJCTB4MDAzRjAwMDAKLSNkZWZpbmUgUFdDX0ZQU19TTkFQU0hPVAkweDAwNDAwMDAwCi0jZGVmaW5lIFBXQ19RTFRfTUFTSwkJMHgwMzAwMDAwMAotI2RlZmluZSBQV0NfUUxUX1NISUZUCQkyNAotCi0KLS8qIHN0cnVjdHVyZSBmb3IgdHJhbnNmZXJyaW5nIHggJiB5IGNvb3JkaW5hdGVzICovCi1zdHJ1Y3QgcHdjX2Nvb3JkCi17Ci0JaW50IHgsIHk7CQkvKiBndWVzcyB3aGF0ICovCi0JaW50IHNpemU7CQkvKiBzaXplLCBvciBvZmZzZXQgKi8KLX07Ci0KLQotLyogVXNlZCB3aXRoIFZJRElPQ1BXQ1BST0JFICovCi1zdHJ1Y3QgcHdjX3Byb2JlCi17Ci0JY2hhciBuYW1lWzMyXTsKLQlpbnQgdHlwZTsKLX07Ci0KLXN0cnVjdCBwd2Nfc2VyaWFsCi17Ci0JY2hhciBzZXJpYWxbMzBdOwkvKiBTdHJpbmcgd2l0aCBzZXJpYWwgbnVtYmVyLiBDb250YWlucyB0ZXJtaW5hdGluZyAwICovCi19OwotCi0vKiBwd2Nfd2hpdGViYWxhbmNlLm1vZGUgdmFsdWVzICovCi0jZGVmaW5lIFBXQ19XQl9JTkRPT1IJCTAKLSNkZWZpbmUgUFdDX1dCX09VVERPT1IJCTEKLSNkZWZpbmUgUFdDX1dCX0ZMCQkyCi0jZGVmaW5lIFBXQ19XQl9NQU5VQUwJCTMKLSNkZWZpbmUgUFdDX1dCX0FVVE8JCTQKLQotLyogVXNlZCB3aXRoIFZJRElPQ1BXQ1tTR11BV0IgKEF1dG8gV2hpdGUgQmFsYW5jZSkuCi0gICBTZXQgbW9kZSB0byBvbmUgb2YgdGhlIFBXQ19XQl8qIHZhbHVlcyBhYm92ZS4KLSAgICpyZWQgYW5kICpibHVlIGFyZSB0aGUgcmVzcGVjdGl2ZSBnYWlucyBvZiB0aGVzZSBjb2xvdXIgY29tcG9uZW50cyBpbnNpZGUKLSAgIHRoZSBjYW1lcmE7IHJhbmdlIDAuLjY1NTM1Ci0gICBXaGVuICdtb2RlJyA9PSBQV0NfV0JfTUFOVUFMLCAnbWFudWFsX3JlZCcgYW5kICdtYW51YWxfYmx1ZScgYXJlIHNldCBvciByZWFkOwotICAgb3RoZXJ3aXNlIHVuZGVmaW5lZC4KLSAgICdyZWFkX3JlZCcgYW5kICdyZWFkX2JsdWUnIGFyZSByZWFkLW9ubHkuCi0qLwotc3RydWN0IHB3Y193aGl0ZWJhbGFuY2UKLXsKLQlpbnQgbW9kZTsKLQlpbnQgbWFudWFsX3JlZCwgbWFudWFsX2JsdWU7CS8qIFIvVyAqLwotCWludCByZWFkX3JlZCwgcmVhZF9ibHVlOwkvKiBSL08gKi8KLX07Ci0KLS8qCi0gICAnY29udHJvbF9zcGVlZCcgYW5kICdjb250cm9sX2RlbGF5JyBhcmUgdXNlZCBpbiBhdXRvbWF0aWMgd2hpdGViYWxhbmNlIG1vZGUsCi0gICBhbmQgdGVsbCB0aGUgY2FtZXJhIGhvdyBmYXN0IGl0IHNob3VsZCByZWFjdCB0byBjaGFuZ2VzIGluIGxpZ2h0aW5nLCBhbmQKLSAgIHdpdGggaG93IG11Y2ggZGVsYXkuIFZhbGlkIHZhbHVlcyBhcmUgMC4uNjU1MzUuCi0qLwotc3RydWN0IHB3Y193Yl9zcGVlZAotewotCWludCBjb250cm9sX3NwZWVkOwotCWludCBjb250cm9sX2RlbGF5OwotCi19OwotCi0vKiBVc2VkIHdpdGggVklESU9DUFdDW1NHXUxFRCAqLwotc3RydWN0IHB3Y19sZWRzCi17Ci0JaW50IGxlZF9vbjsJCQkvKiBMZWQgb24tdGltZTsgcmFuZ2UgPSAwLi4yNTAwMCAqLwotCWludCBsZWRfb2ZmOwkJCS8qIExlZCBvZmYtdGltZTsgcmFuZ2UgPSAwLi4yNTAwMCAgKi8KLX07Ci0KLS8qIEltYWdlIHNpemUgKHVzZWQgd2l0aCBHUkVBTFNJWkUpICovCi1zdHJ1Y3QgcHdjX2ltYWdlc2l6ZQotewotCWludCB3aWR0aDsKLQlpbnQgaGVpZ2h0OwotfTsKLQotLyogRGVmaW5lcyBhbmQgc3RydWN0dXJlcyBmb3IgTW90b3JpemVkIFBhbiAmIFRpbHQgKi8KLSNkZWZpbmUgUFdDX01QVF9QQU4JCTB4MDEKLSNkZWZpbmUgUFdDX01QVF9USUxUCQkweDAyCi0jZGVmaW5lIFBXQ19NUFRfVElNRU9VVAkJMHgwNCAvKiBmb3Igc3RhdHVzICovCi0KLS8qIFNldCBhbmdsZXM7IHdoZW4gYWJzb2x1dGUgIT0gMCwgdGhlIGFuZ2xlIGlzIGFic29sdXRlIGFuZCB0aGUKLSAgIGRyaXZlciBjYWxjdWxhdGVzIHRoZSByZWxhdGl2ZSBvZmZzZXQgZm9yIHlvdS4gVGhpcyBjYW4gb25seQotICAgYmUgdXNlZCB3aXRoIFZJRElPQ1BXQ1NBTkdMRTsgVklESU9DUFdDR0FOR0xFIGFsd2F5cyByZXR1cm5zCi0gICBhYnNvbHV0ZSBhbmdsZXMuCi0gKi8KLXN0cnVjdCBwd2NfbXB0X2FuZ2xlcwotewotCWludCBhYnNvbHV0ZTsJCS8qIHdyaXRlLW9ubHkgKi8KLQlpbnQgcGFuOwkJLyogZGVncmVlcyAqIDEwMCAqLwotCWludCB0aWx0OwkJLyogZGVncmVzcyAqIDEwMCAqLwotfTsKLQotLyogUmFuZ2Ugb2YgYW5nbGVzIG9mIHRoZSBjYW1lcmEsIGJvdGggaG9yaXpvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5LgotICovCi1zdHJ1Y3QgcHdjX21wdF9yYW5nZQotewotCWludCBwYW5fbWluLCBwYW5fbWF4OwkJLyogZGVncmVlcyAqIDEwMCAqLwotCWludCB0aWx0X21pbiwgdGlsdF9tYXg7Ci19OwotCi1zdHJ1Y3QgcHdjX21wdF9zdGF0dXMKLXsKLQlpbnQgc3RhdHVzOwotCWludCB0aW1lX3BhbjsKLQlpbnQgdGltZV90aWx0OwotfTsKLQotCi0vKiBUaGlzIGlzIHVzZWQgZm9yIG91dC1vZi1rZXJuZWwgZGVjb21wcmVzc2lvbi4gV2l0aCBpdCwgeW91IGNhbiBnZXQKLSAgIGFsbCB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIGluaXRpYWxpemUgYW5kIHVzZSB0aGUgZGVjb21wcmVzc29yCi0gICByb3V0aW5lcyBpbiBzdGFuZGFsb25lIGFwcGxpY2F0aW9ucy4KLSAqLwotc3RydWN0IHB3Y192aWRlb19jb21tYW5kCi17Ci0JaW50IHR5cGU7CQkvKiBjYW1lcmEgdHlwZSAoNjQ1LCA2NzUsIDczMCwgZXRjLikgKi8KLQlpbnQgcmVsZWFzZTsJCS8qIHJlbGVhc2UgbnVtYmVyICovCi0KLQlpbnQgc2l6ZTsJCS8qIG9uZSBvZiBQU1pfKiAqLwotCWludCBhbHRlcm5hdGU7Ci0JaW50IGNvbW1hbmRfbGVuOwkvKiBsZW5ndGggb2YgVVNCIHZpZGVvIGNvbW1hbmQgKi8KLQl1bnNpZ25lZCBjaGFyIGNvbW1hbmRfYnVmWzEzXTsJLyogQWN0dWFsIFVTQiB2aWRlbyBjb21tYW5kICovCi0JaW50IGJhbmRsZW5ndGg7CQkvKiA+MCA9IGNvbXByZXNzZWQgKi8KLQlpbnQgZnJhbWVfc2l6ZTsJCS8qIFNpemUgb2Ygb25lICh1biljb21wcmVzc2VkIGZyYW1lICovCi19OwotCi0vKiBGbGFncyBmb3IgUFdDWCBzdWJyb3V0aW5lcy4gTm90IGFsbCBtb2R1bGVzIGhvbm91ciBhbGwgZmxhZ3MuICovCi0jZGVmaW5lIFBXQ1hfRkxBR19QTEFOQVIJMHgwMDAxCi0jZGVmaW5lIFBXQ1hfRkxBR19CQVlFUgkJMHgwMDA4Ci0KLQotLyogSU9DVEwgZGVmaW5pdGlvbnMgKi8KLQotIC8qIFJlc3RvcmUgdXNlciBzZXR0aW5ncyAqLwotI2RlZmluZSBWSURJT0NQV0NSVVNFUgkJX0lPKCd2JywgMTkyKQotIC8qIFNhdmUgdXNlciBzZXR0aW5ncyAqLwotI2RlZmluZSBWSURJT0NQV0NTVVNFUgkJX0lPKCd2JywgMTkzKQotIC8qIFJlc3RvcmUgZmFjdG9yeSBzZXR0aW5ncyAqLwotI2RlZmluZSBWSURJT0NQV0NGQUNUT1JZCV9JTygndicsIDE5NCkKLQotIC8qIFlvdSBjYW4gbWFuaXB1bGF0ZSB0aGUgY29tcHJlc3Npb24gZmFjdG9yLiBBIGNvbXByZXNzaW9uIHByZWZlcmVuY2Ugb2YgMAotICAgIG1lYW5zIHVzZSB1bmNvbXByZXNzZWQgbW9kZXMgd2hlbiBhdmFpbGFibGU7IDEgaXMgbG93IGNvbXByZXNzaW9uLCAyIGlzCi0gICAgbWVkaXVtIGFuZCAzIGlzIGhpZ2ggY29tcHJlc3Npb24gcHJlZmVycmVkLiBPZiBjb3Vyc2UsIHRoZSBoaWdoZXIgdGhlCi0gICAgY29tcHJlc3Npb24sIHRoZSBsb3dlciB0aGUgYmFuZHdpZHRoIHVzZWQgYnV0IG1vcmUgY2hhbmNlIG9mIGFydGVmYWN0cwotICAgIGluIHRoZSBpbWFnZS4gVGhlIGRyaXZlciBhdXRvbWF0aWNhbGx5IGNob29zZXMgYSBoaWdoZXIgY29tcHJlc3Npb24gd2hlbgotICAgIHRoZSBwcmVmZXJyZWQgbW9kZSBpcyBub3QgYXZhaWxhYmxlLgotICAqLwotIC8qIFNldCBwcmVmZXJyZWQgY29tcHJlc3Npb24gcXVhbGl0eSAoMCA9IHVuY29tcHJlc3NlZCwgMyA9IGhpZ2hlc3QgY29tcHJlc3Npb24pICovCi0jZGVmaW5lIFZJRElPQ1BXQ1NDUVVBTAkJX0lPVygndicsIDE5NSwgaW50KQotIC8qIEdldCBwcmVmZXJyZWQgY29tcHJlc3Npb24gcXVhbGl0eSAqLwotI2RlZmluZSBWSURJT0NQV0NHQ1FVQUwJCV9JT1IoJ3YnLCAxOTUsIGludCkKLQotCi0vKiBSZXRyaWV2ZSBzZXJpYWwgbnVtYmVyIG9mIGNhbWVyYSAqLwotI2RlZmluZSBWSURJT0NQV0NHU0VSSUFMCV9JT1IoJ3YnLCAxOTgsIHN0cnVjdCBwd2Nfc2VyaWFsKQotCi0gLyogVGhpcyBpcyBhIHByb2JlIGZ1bmN0aW9uOyBzaW5jZSBzbyBtYW55IGRldmljZXMgYXJlIHN1cHBvcnRlZCwgaXQKLSAgICBiZWNvbWVzIGRpZmZpY3VsdCB0byBpbmNsdWRlIGFsbCB0aGUgbmFtZXMgaW4gcHJvZ3JhbXMgdGhhdCB3YW50IHRvCi0gICAgY2hlY2sgZm9yIHRoZSBlbmhhbmNlZCBQaGlsaXBzIHN0dWZmLiBTbyBpbiBzdGVhZCwgdHJ5IHRoaXMgUFJPQkU7Ci0gICAgaXQgcmV0dXJucyBhIHN0cnVjdHVyZSB3aXRoIHRoZSBvcmlnaW5hbCBuYW1lLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICBQaGlsaXBzIHR5cGUuCi0gICAgVG8gdXNlLCBmaWxsIHRoZSBzdHJ1Y3R1cmUgd2l0aCB6ZXJvZXMsIGNhbGwgUFJPQkUgYW5kIGlmIHRoYXQgc3VjY2VlZHMsCi0gICAgY29tcGFyZSB0aGUgbmFtZSB3aXRoIHRoYXQgcmV0dXJuZWQgZnJvbSBWSURJT0NHQ0FQOyB0aGV5IHNob3VsZCBiZSB0aGUKLSAgICBzYW1lLiBJZiBzbywgeW91IGNhbiBiZSBhc3N1cmVkIGl0IGlzIGEgUGhpbGlwcyAoT0VNKSBjYW0gYW5kIHRoZSB0eXBlCi0gICAgaXMgdmFsaWQuCi0gKi8KLSNkZWZpbmUgVklESU9DUFdDUFJPQkUJCV9JT1IoJ3YnLCAxOTksIHN0cnVjdCBwd2NfcHJvYmUpCi0KLSAvKiBTZXQgQUdDIChBdXRvbWF0aWMgR2FpbiBDb250cm9sKTsgaW50IDwgMCA9IGF1dG8sIDAuLjY1NTM1ID0gZml4ZWQgKi8KLSNkZWZpbmUgVklESU9DUFdDU0FHQwkJX0lPVygndicsIDIwMCwgaW50KQotIC8qIEdldCBBR0M7IGludCA8IDAgPSBhdXRvOyA+PSAwID0gZml4ZWQsIHJhbmdlIDAuLjY1NTM1ICovCi0jZGVmaW5lIFZJRElPQ1BXQ0dBR0MJCV9JT1IoJ3YnLCAyMDAsIGludCkKLSAvKiBTZXQgc2h1dHRlciBzcGVlZDsgaW50IDwgMCA9IGF1dG87ID49IDAgPSBmaXhlZCwgcmFuZ2UgMC4uNjU1MzUgKi8KLSNkZWZpbmUgVklESU9DUFdDU1NIVVRURVIJX0lPVygndicsIDIwMSwgaW50KQotCi0gLyogQ29sb3IgY29tcGVuc2F0aW9uIChBdXRvIFdoaXRlIEJhbGFuY2UpICovCi0jZGVmaW5lIFZJRElPQ1BXQ1NBV0IgICAgICAgICAgIF9JT1coJ3YnLCAyMDIsIHN0cnVjdCBwd2Nfd2hpdGViYWxhbmNlKQotI2RlZmluZSBWSURJT0NQV0NHQVdCICAgICAgICAgICBfSU9SKCd2JywgMjAyLCBzdHJ1Y3QgcHdjX3doaXRlYmFsYW5jZSkKLQotIC8qIEF1dG8gV0Igc3BlZWQgKi8KLSNkZWZpbmUgVklESU9DUFdDU0FXQlNQRUVECV9JT1coJ3YnLCAyMDMsIHN0cnVjdCBwd2Nfd2Jfc3BlZWQpCi0jZGVmaW5lIFZJRElPQ1BXQ0dBV0JTUEVFRAlfSU9SKCd2JywgMjAzLCBzdHJ1Y3QgcHdjX3diX3NwZWVkKQotCi0gLyogTEVEcyBvbi9vZmYvYmxpbms7IGludCByYW5nZSAwLi42NTUzNSAqLwotI2RlZmluZSBWSURJT0NQV0NTTEVEICAgICAgICAgICBfSU9XKCd2JywgMjA1LCBzdHJ1Y3QgcHdjX2xlZHMpCi0jZGVmaW5lIFZJRElPQ1BXQ0dMRUQgICAgICAgICAgIF9JT1IoJ3YnLCAyMDUsIHN0cnVjdCBwd2NfbGVkcykKLQotICAvKiBDb250b3VyIChzaGFycG5lc3MpOyBpbnQgPCAwID0gYXV0bywgMC4uNjU1MzYgPSBmaXhlZCAqLwotI2RlZmluZSBWSURJT0NQV0NTQ09OVE9VUglfSU9XKCd2JywgMjA2LCBpbnQpCi0jZGVmaW5lIFZJRElPQ1BXQ0dDT05UT1VSCV9JT1IoJ3YnLCAyMDYsIGludCkKLQotICAvKiBCYWNrbGlnaHQgY29tcGVuc2F0aW9uOyAwID0gb2ZmLCBvdGhlcndpc2Ugb24gKi8KLSNkZWZpbmUgVklESU9DUFdDU0JBQ0tMSUdIVAlfSU9XKCd2JywgMjA3LCBpbnQpCi0jZGVmaW5lIFZJRElPQ1BXQ0dCQUNLTElHSFQJX0lPUigndicsIDIwNywgaW50KQotCi0gIC8qIEZsaWNrZXJsZXNzIG1vZGU7ID0gMCBvZmYsIG90aGVyd2lzZSBvbiAqLwotI2RlZmluZSBWSURJT0NQV0NTRkxJQ0tFUglfSU9XKCd2JywgMjA4LCBpbnQpCi0jZGVmaW5lIFZJRElPQ1BXQ0dGTElDS0VSCV9JT1IoJ3YnLCAyMDgsIGludCkKLQotICAvKiBEeW5hbWljIG5vaXNlIHJlZHVjdGlvbjsgMCBvZmYsIDMgPSBoaWdoIG5vaXNlIHJlZHVjdGlvbiAqLwotI2RlZmluZSBWSURJT0NQV0NTRFlOTk9JU0UJX0lPVygndicsIDIwOSwgaW50KQotI2RlZmluZSBWSURJT0NQV0NHRFlOTk9JU0UJX0lPUigndicsIDIwOSwgaW50KQotCi0gLyogUmVhbCBpbWFnZSBzaXplIGFzIHVzZWQgYnkgdGhlIGNhbWVyYTsgdGVsbHMgeW91IHdoZXRoZXIgb3Igbm90IHRoZXJlJ3MgYSBncmF5IGJvcmRlciBhcm91bmQgdGhlIGltYWdlICovCi0jZGVmaW5lIFZJRElPQ1BXQ0dSRUFMU0laRQlfSU9SKCd2JywgMjEwLCBzdHJ1Y3QgcHdjX2ltYWdlc2l6ZSkKLQotIC8qIE1vdG9yaXplZCBwYW4gJiB0aWx0IGZ1bmN0aW9ucyAqLwotI2RlZmluZSBWSURJT0NQV0NNUFRSRVNFVAlfSU9XKCd2JywgMjExLCBpbnQpCi0jZGVmaW5lIFZJRElPQ1BXQ01QVEdSQU5HRQlfSU9SKCd2JywgMjExLCBzdHJ1Y3QgcHdjX21wdF9yYW5nZSkKLSNkZWZpbmUgVklESU9DUFdDTVBUU0FOR0xFCV9JT1coJ3YnLCAyMTIsIHN0cnVjdCBwd2NfbXB0X2FuZ2xlcykKLSNkZWZpbmUgVklESU9DUFdDTVBUR0FOR0xFCV9JT1IoJ3YnLCAyMTIsIHN0cnVjdCBwd2NfbXB0X2FuZ2xlcykKLSNkZWZpbmUgVklESU9DUFdDTVBUU1RBVFVTCV9JT1IoJ3YnLCAyMTMsIHN0cnVjdCBwd2NfbXB0X3N0YXR1cykKLQotIC8qIEdldCB0aGUgVVNCIHNldC12aWRlbyBjb21tYW5kOyBuZWVkZWQgZm9yIGluaXRpYWxpemluZyBsaWJwd2N4ICovCi0jZGVmaW5lIFZJRElPQ1BXQ0dWSURDTUQJX0lPUigndicsIDIxNSwgc3RydWN0IHB3Y192aWRlb19jb21tYW5kKQotc3RydWN0IHB3Y190YWJsZV9pbml0X2J1ZmZlciB7Ci0gICBpbnQgbGVuOwotICAgY2hhciAqYnVmZmVyOwotCi19OwotI2RlZmluZSBWSURJT0NQV0NHVklEVEFCTEUJX0lPUigndicsIDIxNiwgc3RydWN0IHB3Y190YWJsZV9pbml0X2J1ZmZlcikKLQotLyoKLSAqIFRoaXMgaXMgcHJpdmF0ZSBjb21tYW5kIHVzZWQgd2hlbiBjb21tdW5pY2F0aW5nIHdpdGggdjRsMi4KLSAqIEluIHRoZSBmdXR1cmUgYWxsIHByaXZhdGUgaW9jdGwgd2lsbCBiZSByZW1vdmUvcmVwbGFjZSB0bwotICogdXNlIGludGVyZmFjZSBvZmZlciBieSB2NGwyLgotICovCi0KLSNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9TQVZFX1VTRVIgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDApCi0jZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfUkVTVE9SRV9VU0VSICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAxKQotI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfRkFDVE9SWSAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMikKLSNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9DT0xPVVJfTU9ERSAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDMpCi0jZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfQVVUT0NPTlRPVVIgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA0KQotI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX0NPTlRPVVIgICAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNSkKLSNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9CQUNLTElHSFQgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDYpCi0jZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfRkxJQ0tFUkxFU1MgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA3KQotI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX05PSVNFX1JFRFVDVElPTiAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgOCkKLQotc3RydWN0IHB3Y19yYXdfZnJhbWUgewotICAgX19sZTE2IHR5cGU7CQkvKiB0eXBlIG9mIHRoZSB3ZWJjYW0gKi8KLSAgIF9fbGUxNiB2YmFuZGxlbmd0aDsJLyogU2l6ZSBvZiA0bGluZXMgY29tcHJlc3NlZCAodXNlZCBieSB0aGUgZGVjb21wcmVzc29yKSAqLwotICAgX191OCAgIGNtZFs0XTsJLyogdGhlIGZvdXIgYnl0ZSBvZiB0aGUgY29tbWFuZCAoaW4gY2FzZSBvZiBuYWxhLAotCQkJICAgb25seSB0aGUgZmlyc3QgMyBieXRlcyBpcyBmaWxsZWQpICovCi0gICBfX3U4ICAgcmF3ZnJhbWVbMF07CS8qIGZyYW1lX3NpemUgPSBILzQqdmJhbmRsZW5ndGggKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWtpYXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2Mta2lhcmEuYwppbmRleCBmNGFlODNjLi5lNWY0ZmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2Mta2lhcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2Mta2lhcmEuYwpAQCAtNDAsNyArNDAsNiBAQAogCiAKICNpbmNsdWRlICJwd2Mta2lhcmEuaCIKLSNpbmNsdWRlICJwd2MtdW5jb21wcmVzcy5oIgogCiBjb25zdCB1bnNpZ25lZCBpbnQgS2lhcmFfZnBzX3ZlY3RvcltQV0NfRlBTX01BWF9LSUFSQV0gPSB7IDUsIDEwLCAxNSwgMjAsIDI1LCAzMCB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtbWlzYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLW1pc2MuYwppbmRleCA2YWY1YmI1Li4wYjAzMTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtbWlzYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1taXNjLmMKQEAgLTEyNiw4ICsxMjYsNCBAQAogCXBkZXYtPnBpeGZtdCA9IFY0TDJfUElYX0ZNVF9ZVVY0MjA7IC8qIGRlZmF1bHQgKi8KIAlwZGV2LT52aWV3X21pbi5zaXplID0gcGRldi0+dmlld19taW4ueCAqIHBkZXYtPnZpZXdfbWluLnk7CiAJcGRldi0+dmlld19tYXguc2l6ZSA9IHBkZXYtPnZpZXdfbWF4LnggKiBwZGV2LT52aWV3X21heC55OwotCS8qIGxlbmd0aCBvZiBpbWFnZSwgaW4gWVVWIGZvcm1hdDsgYWx3YXlzIGFsbG9jYXRlIGVub3VnaCBtZW1vcnkuICovCi0JcGRldi0+bGVuX3Blcl9pbWFnZSA9IFBBR0VfQUxJR04oKHBkZXYtPmFic19tYXgueCAqIHBkZXYtPmFic19tYXgueSAqIDMpIC8gMik7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXVuY29tcHJlc3MuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy11bmNvbXByZXNzLmMKaW5kZXggM2I3M2YyOS4uNTEyNjUwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXVuY29tcHJlc3MuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdW5jb21wcmVzcy5jCkBAIC0zMCwyNiArMzAsMTcgQEAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KIAogI2luY2x1ZGUgInB3Yy5oIgotI2luY2x1ZGUgInB3Yy11bmNvbXByZXNzLmgiCiAjaW5jbHVkZSAicHdjLWRlYzEuaCIKICNpbmNsdWRlICJwd2MtZGVjMjMuaCIKIAotaW50IHB3Y19kZWNvbXByZXNzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoraW50IHB3Y19kZWNvbXByZXNzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqZmJ1ZikKIHsKLQlzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqZmJ1ZjsKIAlpbnQgbiwgbGluZSwgY29sLCBzdHJpZGU7CiAJdm9pZCAqeXV2LCAqaW1hZ2U7CiAJdTE2ICpzcmM7CiAJdTE2ICpkc3R5LCAqZHN0dSwgKmRzdHY7CiAKLQlpZiAocGRldiA9PSBOVUxMKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWZidWYgPSBwZGV2LT5yZWFkX2ZyYW1lOwotCWlmIChmYnVmID09IE5VTEwpCi0JCXJldHVybiAtRUZBVUxUOwotCWltYWdlICA9IHBkZXYtPmltYWdlX2RhdGE7Ci0JaW1hZ2UgKz0gcGRldi0+aW1hZ2VzW3BkZXYtPmZpbGxfaW1hZ2VdLm9mZnNldDsKKwlpbWFnZSA9IHZiMl9wbGFuZV92YWRkcigmZmJ1Zi0+dmIsIDApOwogCiAJeXV2ID0gZmJ1Zi0+ZGF0YSArIHBkZXYtPmZyYW1lX2hlYWRlcl9zaXplOyAgLyogU2tpcCBoZWFkZXIgKi8KIApAQCAtNjQsOSArNTUsMTMgQEAKIAkJCSAqIGRldGVybWluZSB0aGlzIHVzaW5nIHRoZSB0eXBlIG9mIHRoZSB3ZWJjYW0gKi8KIAkJbWVtY3B5KHJhd19mcmFtZS0+Y21kLCBwZGV2LT5jbWRfYnVmLCA0KTsKIAkJbWVtY3B5KHJhd19mcmFtZSsxLCB5dXYsIHBkZXYtPmZyYW1lX3NpemUpOworCQl2YjJfc2V0X3BsYW5lX3BheWxvYWQoJmZidWYtPnZiLCAwLAorCQkJcGRldi0+ZnJhbWVfc2l6ZSArIHNpemVvZihzdHJ1Y3QgcHdjX3Jhd19mcmFtZSkpOwogCQlyZXR1cm4gMDsKIAl9CiAKKwl2YjJfc2V0X3BsYW5lX3BheWxvYWQoJmZidWYtPnZiLCAwLCBwZGV2LT52aWV3LnNpemUpOworCiAJaWYgKHBkZXYtPnZiYW5kbGVuZ3RoID09IDApIHsKIAkJLyogVW5jb21wcmVzc2VkIG1vZGUuCiAJCSAqIFdlIGNvcHkgdGhlIGRhdGEgaW50byB0aGUgb3V0cHV0IGJ1ZmZlciwgdXNpbmcgdGhlIHZpZXdwb3J0CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdW5jb21wcmVzcy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXVuY29tcHJlc3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwMjhlNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdW5jb21wcmVzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogKEMpIDE5OTktMjAwMyBOZW1vc29mdCBVbnYuCi0gICAoQykgMjAwNC0yMDA2IEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKLQotICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4Ci0gICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KLSAgIFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBzdXBwb3J0IHJlcXVlc3RzIHRvIDxsdWNAc2FpbGxhcmQub3JnPi4KLSAgIFRoZSBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBieSByZXZlcnNlLWVuZ2luZWVyaW5nIHRoZQotICAgTmVtb3NvZnQgYmluYXJ5IHB3Y3ggbW9kdWxlLiBDYXZlYXQgZW1wdG9yLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSovCi0KLS8qIFRoaXMgZmlsZSBpcyB0aGUgYnJpZGdlIGJldHdlZW4gdGhlIGtlcm5lbCBtb2R1bGUgYW5kIHRoZSBwbHVnaW47IGl0Ci0gICBkZXNjcmliZXMgdGhlIHN0cnVjdHVyZXMgYW5kIGRhdGF0eXBlcyB1c2VkIGluIGJvdGggbW9kdWxlcy4gQW55Ci0gICBzaWduaWZpY2FudCBjaGFuZ2Ugc2hvdWxkIGJlIHJlZmxlY3RlZCBieSBpbmNyZWFzaW5nIHRoZQotICAgcHdjX2RlY29tcHJlc3Nvcl92ZXJzaW9uIG1ham9yIG51bWJlci4KLSAqLwotI2lmbmRlZiBQV0NfVU5DT01QUkVTU19ICi0jZGVmaW5lIFBXQ19VTkNPTVBSRVNTX0gKLQotCi0jaW5jbHVkZSA8bWVkaWEvcHdjLWlvY3RsLmg+Ci0KLS8qIGZyb20gcHdjLWRlYy5oICovCi0jZGVmaW5lIFBXQ1hfRkxBR19QTEFOQVIgICAgICAgIDB4MDAwMQotLyogKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdjRsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdjRsLmMKaW5kZXggZjg1YzUxMi4uZTlhMGU5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXY0bC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy12NGwuYwpAQCAtMiw2ICsyLDcgQEAKICAgIFVTQiBhbmQgVmlkZW80TGludXggaW50ZXJmYWNlIHBhcnQuCiAgICAoQykgMTk5OS0yMDA0IE5lbW9zb2Z0IFVudi4KICAgIChDKSAyMDA0LTIwMDYgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorICAgKEMpIDIwMTEgSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KIAogICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CiAgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KQEAgLTMxLDE4NCArMzIsMzMwIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpbmNsdWRlICJwd2MuaCIKIAotc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBwd2NfY29udHJvbHNbXSA9IHsKLQl7Ci0JICAgIC5pZCAgICAgID0gVjRMMl9DSURfQlJJR0hUTkVTUywKLQkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCSAgICAubmFtZSAgICA9ICJCcmlnaHRuZXNzIiwKLQkgICAgLm1pbmltdW0gPSAwLAotCSAgICAubWF4aW11bSA9IDEyOCwKLQkgICAgLnN0ZXAgICAgPSAxLAotCSAgICAuZGVmYXVsdF92YWx1ZSA9IDY0LAotCX0sCi0JewotCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX0NPTlRSQVNULAotCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JICAgIC5uYW1lICAgID0gIkNvbnRyYXN0IiwKLQkgICAgLm1pbmltdW0gPSAwLAotCSAgICAubWF4aW11bSA9IDY0LAotCSAgICAuc3RlcCAgICA9IDEsCi0JICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKLQl9LAotCXsKLQkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9TQVRVUkFUSU9OLAotCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JICAgIC5uYW1lICAgID0gIlNhdHVyYXRpb24iLAotCSAgICAubWluaW11bSA9IC0xMDAsCi0JICAgIC5tYXhpbXVtID0gMTAwLAotCSAgICAuc3RlcCAgICA9IDEsCi0JICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKLQl9LAotCXsKLQkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9HQU1NQSwKLQkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCSAgICAubmFtZSAgICA9ICJHYW1tYSIsCi0JICAgIC5taW5pbXVtID0gMCwKLQkgICAgLm1heGltdW0gPSAzMiwKLQkgICAgLnN0ZXAgICAgPSAxLAotCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCi0JfSwKLQl7Ci0JICAgIC5pZCAgICAgID0gVjRMMl9DSURfUkVEX0JBTEFOQ0UsCi0JICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkgICAgLm5hbWUgICAgPSAiUmVkIEdhaW4iLAotCSAgICAubWluaW11bSA9IDAsCi0JICAgIC5tYXhpbXVtID0gMjU2LAotCSAgICAuc3RlcCAgICA9IDEsCi0JICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKLQl9LAotCXsKLQkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0UsCi0JICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkgICAgLm5hbWUgICAgPSAiQmx1ZSBHYWluIiwKLQkgICAgLm1pbmltdW0gPSAwLAotCSAgICAubWF4aW11bSA9IDI1NiwKLQkgICAgLnN0ZXAgICAgPSAxLAotCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCi0JfSwKLQl7Ci0JICAgIC5pZCAgICAgID0gVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFLAotCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JICAgIC5uYW1lICAgID0gIkF1dG8gV2hpdGUgQmFsYW5jZSIsCi0JICAgIC5taW5pbXVtID0gMCwKLQkgICAgLm1heGltdW0gPSAxLAotCSAgICAuc3RlcCAgICA9IDEsCi0JICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKLQl9LAotCXsKLQkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9FWFBPU1VSRSwKLQkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCSAgICAubmFtZSAgICA9ICJTaHV0dGVyIFNwZWVkIChFeHBvc3VyZSkiLAotCSAgICAubWluaW11bSA9IDAsCi0JICAgIC5tYXhpbXVtID0gMjU2LAotCSAgICAuc3RlcCAgICA9IDEsCi0JICAgIC5kZWZhdWx0X3ZhbHVlID0gMjAwLAotCX0sCi0JewotCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX0FVVE9HQUlOLAotCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JICAgIC5uYW1lICAgID0gIkF1dG8gR2FpbiBFbmFibGVkIiwKLQkgICAgLm1pbmltdW0gPSAwLAotCSAgICAubWF4aW11bSA9IDEsCi0JICAgIC5zdGVwICAgID0gMSwKLQkgICAgLmRlZmF1bHRfdmFsdWUgPSAxLAotCX0sCi0JewotCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX0dBSU4sCi0JICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkgICAgLm5hbWUgICAgPSAiR2FpbiBMZXZlbCIsCi0JICAgIC5taW5pbXVtID0gMCwKLQkgICAgLm1heGltdW0gPSAyNTYsCi0JICAgIC5zdGVwICAgID0gMSwKLQkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAotCX0sCi0JewotCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX1BSSVZBVEVfU0FWRV9VU0VSLAotCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0JVVFRPTiwKLQkgICAgLm5hbWUgICAgPSAiU2F2ZSBVc2VyIFNldHRpbmdzIiwKLQkgICAgLm1pbmltdW0gPSAwLAotCSAgICAubWF4aW11bSA9IDAsCi0JICAgIC5zdGVwICAgID0gMCwKLQkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAotCX0sCi0JewotCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX1BSSVZBVEVfUkVTVE9SRV9VU0VSLAotCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0JVVFRPTiwKLQkgICAgLm5hbWUgICAgPSAiUmVzdG9yZSBVc2VyIFNldHRpbmdzIiwKLQkgICAgLm1pbmltdW0gPSAwLAotCSAgICAubWF4aW11bSA9IDAsCi0JICAgIC5zdGVwICAgID0gMCwKLQkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAotCX0sCi0JewotCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX1BSSVZBVEVfUkVTVE9SRV9GQUNUT1JZLAotCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0JVVFRPTiwKLQkgICAgLm5hbWUgICAgPSAiUmVzdG9yZSBGYWN0b3J5IFNldHRpbmdzIiwKLQkgICAgLm1pbmltdW0gPSAwLAotCSAgICAubWF4aW11bSA9IDAsCi0JICAgIC5zdGVwICAgID0gMCwKLQkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAotCX0sCi0JewotCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX1BSSVZBVEVfQ09MT1VSX01PREUsCi0JICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkgICAgLm5hbWUgICAgPSAiQ29sb3VyIG1vZGUiLAotCSAgICAubWluaW11bSA9IDAsCi0JICAgIC5tYXhpbXVtID0gMSwKLQkgICAgLnN0ZXAgICAgPSAxLAotCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCi0JfSwKLQl7Ci0JICAgIC5pZCAgICAgID0gVjRMMl9DSURfUFJJVkFURV9BVVRPQ09OVE9VUiwKLQkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCSAgICAubmFtZSAgICA9ICJBdXRvIGNvbnRvdXIiLAotCSAgICAubWluaW11bSA9IDAsCi0JICAgIC5tYXhpbXVtID0gMSwKLQkgICAgLnN0ZXAgICAgPSAxLAotCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCi0JfSwKLQl7Ci0JICAgIC5pZCAgICAgID0gVjRMMl9DSURfUFJJVkFURV9DT05UT1VSLAotCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JICAgIC5uYW1lICAgID0gIkNvbnRvdXIiLAotCSAgICAubWluaW11bSA9IDAsCi0JICAgIC5tYXhpbXVtID0gNjMsCi0JICAgIC5zdGVwICAgID0gMSwKLQkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAotCX0sCi0JewotCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX1BSSVZBVEVfQkFDS0xJR0hULAotCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JICAgIC5uYW1lICAgID0gIkJhY2tsaWdodCBjb21wZW5zYXRpb24iLAotCSAgICAubWluaW11bSA9IDAsCi0JICAgIC5tYXhpbXVtID0gMSwKLQkgICAgLnN0ZXAgICAgPSAxLAotCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCi0JfSwKLQl7Ci0JICAuaWQgICAgICA9IFY0TDJfQ0lEX1BSSVZBVEVfRkxJQ0tFUkxFU1MsCi0JICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkgICAgLm5hbWUgICAgPSAiRmxpY2tlcmxlc3MiLAotCSAgICAubWluaW11bSA9IDAsCi0JICAgIC5tYXhpbXVtID0gMSwKLQkgICAgLnN0ZXAgICAgPSAxLAotCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCi0JfSwKLQl7Ci0JICAgIC5pZCAgICAgID0gVjRMMl9DSURfUFJJVkFURV9OT0lTRV9SRURVQ1RJT04sCi0JICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkgICAgLm5hbWUgICAgPSAiTm9pc2UgcmVkdWN0aW9uIiwKLQkgICAgLm1pbmltdW0gPSAwLAotCSAgICAubWF4aW11bSA9IDMsCi0JICAgIC5zdGVwICAgID0gMSwKLQkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAotCX0sCisjZGVmaW5lIFBXQ19DSURfQ1VTVE9NKGN0cmwpICgoVjRMMl9DSURfVVNFUl9CQVNFIHwgMHhmMDAwKSArIGN1c3RvbV8gIyMgY3RybCkKKworc3RhdGljIGludCBwd2NfZ192b2xhdGlsZV9jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpOworc3RhdGljIGludCBwd2Nfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgcHdjX2N0cmxfb3BzID0geworCS5nX3ZvbGF0aWxlX2N0cmwgPSBwd2NfZ192b2xhdGlsZV9jdHJsLAorCS5zX2N0cmwgPSBwd2Nfc19jdHJsLAogfTsKIAorZW51bSB7IGF3Yl9pbmRvb3IsIGF3Yl9vdXRkb29yLCBhd2JfZmwsIGF3Yl9tYW51YWwsIGF3Yl9hdXRvIH07CitlbnVtIHsgY3VzdG9tX2F1dG9jb250b3VyLCBjdXN0b21fY29udG91ciwgY3VzdG9tX25vaXNlX3JlZHVjdGlvbiwKKwljdXN0b21fc2F2ZV91c2VyLCBjdXN0b21fcmVzdG9yZV91c2VyLCBjdXN0b21fcmVzdG9yZV9mYWN0b3J5IH07CisKK2NvbnN0IGNoYXIgKiBjb25zdCBwd2NfYXV0b193aGl0ZWJhbF9xbWVudVtdID0geworCSJJbmRvb3IgKEluY2FuZGVzY2FudCBMaWdodGluZykgTW9kZSIsCisJIk91dGRvb3IgKFN1bmxpZ2h0KSBNb2RlIiwKKwkiSW5kb29yIChGbHVvcmVzY2VudCBMaWdodGluZykgTW9kZSIsCisJIk1hbnVhbCBNb2RlIiwKKwkiQXV0byBNb2RlIiwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9jb25maWcgcHdjX2F1dG9fd2hpdGVfYmFsYW5jZV9jZmcgPSB7CisJLm9wcwk9ICZwd2NfY3RybF9vcHMsCisJLmlkCT0gVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFLAorCS50eXBlCT0gVjRMMl9DVFJMX1RZUEVfTUVOVSwKKwkubWF4CT0gYXdiX2F1dG8sCisJLnFtZW51CT0gcHdjX2F1dG9fd2hpdGViYWxfcW1lbnUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9jb25maWcgcHdjX2F1dG9jb250b3VyX2NmZyA9IHsKKwkub3BzCT0gJnB3Y19jdHJsX29wcywKKwkuaWQJPSBQV0NfQ0lEX0NVU1RPTShhdXRvY29udG91ciksCisJLnR5cGUJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCS5uYW1lCT0gIkF1dG8gY29udG91ciIsCisJLm1pbgk9IDAsCisJLm1heAk9IDEsCisJLnN0ZXAJPSAxLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfY29uZmlnIHB3Y19jb250b3VyX2NmZyA9IHsKKwkub3BzCT0gJnB3Y19jdHJsX29wcywKKwkuaWQJPSBQV0NfQ0lEX0NVU1RPTShjb250b3VyKSwKKwkudHlwZQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJLm5hbWUJPSAiQ29udG91ciIsCisJLm1pbgk9IDAsCisJLm1heAk9IDYzLAorCS5zdGVwCT0gMSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX2NvbmZpZyBwd2NfYmFja2xpZ2h0X2NmZyA9IHsKKwkub3BzCT0gJnB3Y19jdHJsX29wcywKKwkuaWQJPSBWNEwyX0NJRF9CQUNLTElHSFRfQ09NUEVOU0FUSU9OLAorCS50eXBlCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkubWluCT0gMCwKKwkubWF4CT0gMSwKKwkuc3RlcAk9IDEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9jb25maWcgcHdjX2ZsaWNrZXJfY2ZnID0geworCS5vcHMJPSAmcHdjX2N0cmxfb3BzLAorCS5pZAk9IFY0TDJfQ0lEX0JBTkRfU1RPUF9GSUxURVIsCisJLnR5cGUJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCS5taW4JPSAwLAorCS5tYXgJPSAxLAorCS5zdGVwCT0gMSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX2NvbmZpZyBwd2Nfbm9pc2VfcmVkdWN0aW9uX2NmZyA9IHsKKwkub3BzCT0gJnB3Y19jdHJsX29wcywKKwkuaWQJPSBQV0NfQ0lEX0NVU1RPTShub2lzZV9yZWR1Y3Rpb24pLAorCS50eXBlCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkubmFtZQk9ICJEeW5hbWljIE5vaXNlIFJlZHVjdGlvbiIsCisJLm1pbgk9IDAsCisJLm1heAk9IDMsCisJLnN0ZXAJPSAxLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfY29uZmlnIHB3Y19zYXZlX3VzZXJfY2ZnID0geworCS5vcHMJPSAmcHdjX2N0cmxfb3BzLAorCS5pZAk9IFBXQ19DSURfQ1VTVE9NKHNhdmVfdXNlciksCisJLnR5cGUJPSBWNEwyX0NUUkxfVFlQRV9CVVRUT04sCisJLm5hbWUgICAgPSAiU2F2ZSBVc2VyIFNldHRpbmdzIiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX2NvbmZpZyBwd2NfcmVzdG9yZV91c2VyX2NmZyA9IHsKKwkub3BzCT0gJnB3Y19jdHJsX29wcywKKwkuaWQJPSBQV0NfQ0lEX0NVU1RPTShyZXN0b3JlX3VzZXIpLAorCS50eXBlCT0gVjRMMl9DVFJMX1RZUEVfQlVUVE9OLAorCS5uYW1lICAgID0gIlJlc3RvcmUgVXNlciBTZXR0aW5ncyIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9jb25maWcgcHdjX3Jlc3RvcmVfZmFjdG9yeV9jZmcgPSB7CisJLm9wcwk9ICZwd2NfY3RybF9vcHMsCisJLmlkCT0gUFdDX0NJRF9DVVNUT00ocmVzdG9yZV9mYWN0b3J5KSwKKwkudHlwZQk9IFY0TDJfQ1RSTF9UWVBFX0JVVFRPTiwKKwkubmFtZSAgICA9ICJSZXN0b3JlIEZhY3RvcnkgU2V0dGluZ3MiLAorfTsKKworaW50IHB3Y19pbml0X2NvbnRyb2xzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGRsOworCXN0cnVjdCB2NGwyX2N0cmxfY29uZmlnIGNmZzsKKwlpbnQgciwgZGVmOworCisJaGRsID0gJnBkZXYtPmN0cmxfaGFuZGxlcjsKKwlyID0gdjRsMl9jdHJsX2hhbmRsZXJfaW5pdChoZGwsIDIwKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwkvKiBCcmlnaHRuZXNzLCBjb250cmFzdCwgc2F0dXJhdGlvbiwgZ2FtbWEgKi8KKwlyID0gcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9MVU1fQ1RMLCBCUklHSFRORVNTX0ZPUk1BVFRFUiwgJmRlZik7CisJaWYgKHIgfHwgZGVmID4gMTI3KQorCQlkZWYgPSA2MzsKKwlwZGV2LT5icmlnaHRuZXNzID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmcHdjX2N0cmxfb3BzLAorCQkJCVY0TDJfQ0lEX0JSSUdIVE5FU1MsIDAsIDEyNywgMSwgZGVmKTsKKworCXIgPSBwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX0xVTV9DVEwsIENPTlRSQVNUX0ZPUk1BVFRFUiwgJmRlZik7CisJaWYgKHIgfHwgZGVmID4gNjMpCisJCWRlZiA9IDMxOworCXBkZXYtPmNvbnRyYXN0ID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmcHdjX2N0cmxfb3BzLAorCQkJCVY0TDJfQ0lEX0NPTlRSQVNULCAwLCA2MywgMSwgZGVmKTsKKworCWlmIChwZGV2LT50eXBlID49IDY3NSkgeworCQlpZiAocGRldi0+dHlwZSA8IDczMCkKKwkJCXBkZXYtPnNhdHVyYXRpb25fZm10ID0gU0FUVVJBVElPTl9NT0RFX0ZPUk1BVFRFUjI7CisJCWVsc2UKKwkJCXBkZXYtPnNhdHVyYXRpb25fZm10ID0gU0FUVVJBVElPTl9NT0RFX0ZPUk1BVFRFUjE7CisJCXIgPSBwd2NfZ2V0X3M4X2N0cmwocGRldiwgR0VUX0NIUk9NX0NUTCwgcGRldi0+c2F0dXJhdGlvbl9mbXQsCisJCQkJICAgICZkZWYpOworCQlpZiAociB8fCBkZWYgPCAtMTAwIHx8IGRlZiA+IDEwMCkKKwkJCWRlZiA9IDA7CisJCXBkZXYtPnNhdHVyYXRpb24gPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZwd2NfY3RybF9vcHMsCisJCQkJICAgICAgVjRMMl9DSURfU0FUVVJBVElPTiwgLTEwMCwgMTAwLCAxLCBkZWYpOworCX0KKworCXIgPSBwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX0xVTV9DVEwsIEdBTU1BX0ZPUk1BVFRFUiwgJmRlZik7CisJaWYgKHIgfHwgZGVmID4gMzEpCisJCWRlZiA9IDE1OworCXBkZXYtPmdhbW1hID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmcHdjX2N0cmxfb3BzLAorCQkJCVY0TDJfQ0lEX0dBTU1BLCAwLCAzMSwgMSwgZGVmKTsKKworCS8qIGF1dG8gd2hpdGUgYmFsYW5jZSwgcmVkIGdhaW4sIGJsdWUgZ2FpbiAqLworCXIgPSBwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX0NIUk9NX0NUTCwgV0JfTU9ERV9GT1JNQVRURVIsICZkZWYpOworCWlmIChyIHx8IGRlZiA+IGF3Yl9hdXRvKQorCQlkZWYgPSBhd2JfYXV0bzsKKwljZmcgPSBwd2NfYXV0b193aGl0ZV9iYWxhbmNlX2NmZzsKKwljZmcubmFtZSA9IHY0bDJfY3RybF9nZXRfbmFtZShjZmcuaWQpOworCWNmZy5kZWYgPSBkZWY7CisJcGRldi0+YXV0b193aGl0ZV9iYWxhbmNlID0gdjRsMl9jdHJsX25ld19jdXN0b20oaGRsLCAmY2ZnLCBOVUxMKTsKKwkvKiBjaGVjayBhdXRvIGNvbnRyb2xzIHRvIGF2b2lkIE5VTEwgZGVyZWYgaW4gdjRsMl9jdHJsX2F1dG9fY2x1c3RlciAqLworCWlmICghcGRldi0+YXV0b193aGl0ZV9iYWxhbmNlKQorCQlyZXR1cm4gaGRsLT5lcnJvcjsKKworCXIgPSBwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX0NIUk9NX0NUTCwKKwkJCSAgICBQUkVTRVRfTUFOVUFMX1JFRF9HQUlOX0ZPUk1BVFRFUiwgJmRlZik7CisJaWYgKHIpCisJCWRlZiA9IDEyNzsKKwlwZGV2LT5yZWRfYmFsYW5jZSA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnB3Y19jdHJsX29wcywKKwkJCQlWNEwyX0NJRF9SRURfQkFMQU5DRSwgMCwgMjU1LCAxLCBkZWYpOworCisJciA9IHB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfQ0hST01fQ1RMLAorCQkJICAgIFBSRVNFVF9NQU5VQUxfQkxVRV9HQUlOX0ZPUk1BVFRFUiwgJmRlZik7CisJaWYgKHIpCisJCWRlZiA9IDEyNzsKKwlwZGV2LT5ibHVlX2JhbGFuY2UgPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZwd2NfY3RybF9vcHMsCisJCQkJVjRMMl9DSURfQkxVRV9CQUxBTkNFLCAwLCAyNTUsIDEsIGRlZik7CisKKwl2NGwyX2N0cmxfYXV0b19jbHVzdGVyKDMsICZwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UsIGF3Yl9tYW51YWwsCisJCQkgICAgICAgcGRldi0+YXV0b193aGl0ZV9iYWxhbmNlLT5jdXIudmFsID09IGF3Yl9hdXRvKTsKKworCS8qIGF1dG9nYWluLCBnYWluICovCisJciA9IHB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfTFVNX0NUTCwgQUdDX01PREVfRk9STUFUVEVSLCAmZGVmKTsKKwlpZiAociB8fCAoZGVmICE9IDAgJiYgZGVmICE9IDB4ZmYpKQorCQlkZWYgPSAwOworCS8qIE5vdGUgYSByZWdpc3RlciB2YWx1ZSBpZiAwIG1lYW5zIGF1dG8gZ2FpbiBpcyBvbiAqLworCXBkZXYtPmF1dG9nYWluID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmcHdjX2N0cmxfb3BzLAorCQkJCVY0TDJfQ0lEX0FVVE9HQUlOLCAwLCAxLCAxLCBkZWYgPT0gMCk7CisJaWYgKCFwZGV2LT5hdXRvZ2FpbikKKwkJcmV0dXJuIGhkbC0+ZXJyb3I7CisKKwlyID0gcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9MVU1fQ1RMLCBQUkVTRVRfQUdDX0ZPUk1BVFRFUiwgJmRlZik7CisJaWYgKHIgfHwgZGVmID4gNjMpCisJCWRlZiA9IDMxOworCXBkZXYtPmdhaW4gPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZwd2NfY3RybF9vcHMsCisJCQkJVjRMMl9DSURfR0FJTiwgMCwgNjMsIDEsIGRlZik7CisKKwkvKiBhdXRvIGV4cG9zdXJlLCBleHBvc3VyZSAqLworCWlmIChERVZJQ0VfVVNFX0NPREVDMihwZGV2LT50eXBlKSkgeworCQlyID0gcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9MVU1fQ1RMLCBTSFVUVEVSX01PREVfRk9STUFUVEVSLAorCQkJCSAgICAmZGVmKTsKKwkJaWYgKHIgfHwgKGRlZiAhPSAwICYmIGRlZiAhPSAweGZmKSkKKwkJCWRlZiA9IDA7CisJCS8qCisJCSAqIGRlZiA9IDAgYXV0bywgZGVmID0gZmYgbWFudWFsCisJCSAqIG1lbnUgaWR4IDAgPSBhdXRvLCBpZHggMSA9IG1hbnVhbAorCQkgKi8KKwkJcGRldi0+ZXhwb3N1cmVfYXV0byA9IHY0bDJfY3RybF9uZXdfc3RkX21lbnUoaGRsLAorCQkJCQkmcHdjX2N0cmxfb3BzLAorCQkJCQlWNEwyX0NJRF9FWFBPU1VSRV9BVVRPLAorCQkJCQkxLCAwLCBkZWYgIT0gMCk7CisJCWlmICghcGRldi0+ZXhwb3N1cmVfYXV0bykKKwkJCXJldHVybiBoZGwtPmVycm9yOworCisJCS8qIEdFVF9MVU1fQ1RMLCBQUkVTRVRfU0hVVFRFUl9GT1JNQVRURVIgaXMgdW5yZWxpYWJsZSAqLworCQlyID0gcHdjX2dldF91MTZfY3RybChwZGV2LCBHRVRfU1RBVFVTX0NUTCwKKwkJCQkgICAgIFJFQURfU0hVVFRFUl9GT1JNQVRURVIsICZkZWYpOworCQlpZiAociB8fCBkZWYgPiA2NTUpCisJCQlkZWYgPSA2NTU7CisJCXBkZXYtPmV4cG9zdXJlID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmcHdjX2N0cmxfb3BzLAorCQkJCQlWNEwyX0NJRF9FWFBPU1VSRSwgMCwgNjU1LCAxLCBkZWYpOworCQkvKiBDT0RFQzI6IHNlcGFyYXRlIGF1dG8gZ2FpbiAmIGF1dG8gZXhwb3N1cmUgKi8KKwkJdjRsMl9jdHJsX2F1dG9fY2x1c3RlcigyLCAmcGRldi0+YXV0b2dhaW4sIDAsIHRydWUpOworCQl2NGwyX2N0cmxfYXV0b19jbHVzdGVyKDIsICZwZGV2LT5leHBvc3VyZV9hdXRvLAorCQkJCSAgICAgICBWNEwyX0VYUE9TVVJFX01BTlVBTCwgdHJ1ZSk7CisJfSBlbHNlIGlmIChERVZJQ0VfVVNFX0NPREVDMyhwZGV2LT50eXBlKSkgeworCQkvKiBHRVRfTFVNX0NUTCwgUFJFU0VUX1NIVVRURVJfRk9STUFUVEVSIGlzIHVucmVsaWFibGUgKi8KKwkJciA9IHB3Y19nZXRfdTE2X2N0cmwocGRldiwgR0VUX1NUQVRVU19DVEwsCisJCQkJICAgICBSRUFEX1NIVVRURVJfRk9STUFUVEVSLCAmZGVmKTsKKwkJaWYgKHIgfHwgZGVmID4gMjU1KQorCQkJZGVmID0gMjU1OworCQlwZGV2LT5leHBvc3VyZSA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnB3Y19jdHJsX29wcywKKwkJCQkJVjRMMl9DSURfRVhQT1NVUkUsIDAsIDI1NSwgMSwgZGVmKTsKKwkJLyogQ09ERUMzOiBib3RoIGdhaW4gYW5kIGV4cG9zdXJlIGNvbnRyb2xsZWQgYnkgYXV0b2dhaW4gKi8KKwkJcGRldi0+YXV0b2dhaW5fZXhwb19jbHVzdGVyWzBdID0gcGRldi0+YXV0b2dhaW47CisJCXBkZXYtPmF1dG9nYWluX2V4cG9fY2x1c3RlclsxXSA9IHBkZXYtPmdhaW47CisJCXBkZXYtPmF1dG9nYWluX2V4cG9fY2x1c3RlclsyXSA9IHBkZXYtPmV4cG9zdXJlOworCQl2NGwyX2N0cmxfYXV0b19jbHVzdGVyKDMsIHBkZXYtPmF1dG9nYWluX2V4cG9fY2x1c3RlciwKKwkJCQkgICAgICAgMCwgdHJ1ZSk7CisJfQorCisJLyogY29sb3IgLyBidyBzZXR0aW5nICovCisJciA9IHB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfQ0hST01fQ1RMLCBDT0xPVVJfTU9ERV9GT1JNQVRURVIsCisJCQkgJmRlZik7CisJaWYgKHIgfHwgKGRlZiAhPSAwICYmIGRlZiAhPSAweGZmKSkKKwkJZGVmID0gMHhmZjsKKwkvKiBkZWYgPSAwIGJ3LCBkZWYgPSBmZiBjb2xvciwgbWVudSBpZHggMCA9IGNvbG9yLCBpZHggMSA9IGJ3ICovCisJcGRldi0+Y29sb3JmeCA9IHY0bDJfY3RybF9uZXdfc3RkX21lbnUoaGRsLCAmcHdjX2N0cmxfb3BzLAorCQkJCVY0TDJfQ0lEX0NPTE9SRlgsIDEsIDAsIGRlZiA9PSAwKTsKKworCS8qIGF1dG9jb250b3VyLCBjb250b3VyICovCisJciA9IHB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfTFVNX0NUTCwgQVVUT19DT05UT1VSX0ZPUk1BVFRFUiwgJmRlZik7CisJaWYgKHIgfHwgKGRlZiAhPSAwICYmIGRlZiAhPSAweGZmKSkKKwkJZGVmID0gMDsKKwljZmcgPSBwd2NfYXV0b2NvbnRvdXJfY2ZnOworCWNmZy5kZWYgPSBkZWYgPT0gMDsKKwlwZGV2LT5hdXRvY29udG91ciA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJmNmZywgTlVMTCk7CisJaWYgKCFwZGV2LT5hdXRvY29udG91cikKKwkJcmV0dXJuIGhkbC0+ZXJyb3I7CisKKwlyID0gcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9MVU1fQ1RMLCBQUkVTRVRfQ09OVE9VUl9GT1JNQVRURVIsICZkZWYpOworCWlmIChyIHx8IGRlZiA+IDYzKQorCQlkZWYgPSAzMTsKKwljZmcgPSBwd2NfY29udG91cl9jZmc7CisJY2ZnLmRlZiA9IGRlZjsKKwlwZGV2LT5jb250b3VyID0gdjRsMl9jdHJsX25ld19jdXN0b20oaGRsLCAmY2ZnLCBOVUxMKTsKKworCXY0bDJfY3RybF9hdXRvX2NsdXN0ZXIoMiwgJnBkZXYtPmF1dG9jb250b3VyLCAwLCBmYWxzZSk7CisKKwkvKiBiYWNrbGlnaHQgKi8KKwlyID0gcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9MVU1fQ1RMLAorCQkJICAgIEJBQ0tfTElHSFRfQ09NUEVOU0FUSU9OX0ZPUk1BVFRFUiwgJmRlZik7CisJaWYgKHIgfHwgKGRlZiAhPSAwICYmIGRlZiAhPSAweGZmKSkKKwkJZGVmID0gMDsKKwljZmcgPSBwd2NfYmFja2xpZ2h0X2NmZzsKKwljZmcubmFtZSA9IHY0bDJfY3RybF9nZXRfbmFtZShjZmcuaWQpOworCWNmZy5kZWYgPSBkZWYgPT0gMDsKKwlwZGV2LT5iYWNrbGlnaHQgPSB2NGwyX2N0cmxfbmV3X2N1c3RvbShoZGwsICZjZmcsIE5VTEwpOworCisJLyogZmxpa2tlciByZWRpY3Rpb24gKi8KKwlyID0gcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9MVU1fQ1RMLAorCQkJICAgIEZMSUNLRVJMRVNTX01PREVfRk9STUFUVEVSLCAmZGVmKTsKKwlpZiAociB8fCAoZGVmICE9IDAgJiYgZGVmICE9IDB4ZmYpKQorCQlkZWYgPSAwOworCWNmZyA9IHB3Y19mbGlja2VyX2NmZzsKKwljZmcubmFtZSA9IHY0bDJfY3RybF9nZXRfbmFtZShjZmcuaWQpOworCWNmZy5kZWYgPSBkZWYgPT0gMDsKKwlwZGV2LT5mbGlja2VyID0gdjRsMl9jdHJsX25ld19jdXN0b20oaGRsLCAmY2ZnLCBOVUxMKTsKKworCS8qIER5bmFtaWMgbm9pc2UgcmVkdWN0aW9uICovCisJciA9IHB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfTFVNX0NUTCwKKwkJCSAgICBEWU5BTUlDX05PSVNFX0NPTlRST0xfRk9STUFUVEVSLCAmZGVmKTsKKwlpZiAociB8fCBkZWYgPiAzKQorCQlkZWYgPSAyOworCWNmZyA9IHB3Y19ub2lzZV9yZWR1Y3Rpb25fY2ZnOworCWNmZy5kZWYgPSBkZWY7CisJcGRldi0+bm9pc2VfcmVkdWN0aW9uID0gdjRsMl9jdHJsX25ld19jdXN0b20oaGRsLCAmY2ZnLCBOVUxMKTsKKworCS8qIFNhdmUgLyBSZXN0b3JlIFVzZXIgLyBGYWN0b3J5IFNldHRpbmdzICovCisJcGRldi0+c2F2ZV91c2VyID0gdjRsMl9jdHJsX25ld19jdXN0b20oaGRsLCAmcHdjX3NhdmVfdXNlcl9jZmcsIE5VTEwpOworCXBkZXYtPnJlc3RvcmVfdXNlciA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJnB3Y19yZXN0b3JlX3VzZXJfY2ZnLAorCQkJCQkJICBOVUxMKTsKKwlpZiAocGRldi0+cmVzdG9yZV91c2VyKQorCQlwZGV2LT5yZXN0b3JlX3VzZXItPmZsYWdzID0gVjRMMl9DVFJMX0ZMQUdfVVBEQVRFOworCXBkZXYtPnJlc3RvcmVfZmFjdG9yeSA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwKKwkJCQkJCSAgICAgJnB3Y19yZXN0b3JlX2ZhY3RvcnlfY2ZnLAorCQkJCQkJICAgICBOVUxMKTsKKwlpZiAocGRldi0+cmVzdG9yZV9mYWN0b3J5KQorCQlwZGV2LT5yZXN0b3JlX2ZhY3RvcnktPmZsYWdzID0gVjRMMl9DVFJMX0ZMQUdfVVBEQVRFOworCisJaWYgKCFwZGV2LT5mZWF0dXJlcyAmIEZFQVRVUkVfTU9UT1JfUEFOVElMVCkKKwkJcmV0dXJuIGhkbC0+ZXJyb3I7CisKKwkvKiBNb3RvciBwYW4gLyB0aWx0IC8gcmVzZXQgKi8KKwlwZGV2LT5tb3Rvcl9wYW4gPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZwd2NfY3RybF9vcHMsCisJCQkJVjRMMl9DSURfUEFOX1JFTEFUSVZFLCAtNDQ4MCwgNDQ4MCwgNjQsIDApOworCWlmICghcGRldi0+bW90b3JfcGFuKQorCQlyZXR1cm4gaGRsLT5lcnJvcjsKKwlwZGV2LT5tb3Rvcl90aWx0ID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmcHdjX2N0cmxfb3BzLAorCQkJCVY0TDJfQ0lEX1RJTFRfUkVMQVRJVkUsIC0xOTIwLCAxOTIwLCA2NCwgMCk7CisJcGRldi0+bW90b3JfcGFuX3Jlc2V0ID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmcHdjX2N0cmxfb3BzLAorCQkJCVY0TDJfQ0lEX1BBTl9SRVNFVCwgMCwgMCwgMCwgMCk7CisJcGRldi0+bW90b3JfdGlsdF9yZXNldCA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnB3Y19jdHJsX29wcywKKwkJCQlWNEwyX0NJRF9USUxUX1JFU0VULCAwLCAwLCAwLCAwKTsKKwl2NGwyX2N0cmxfY2x1c3Rlcig0LCAmcGRldi0+bW90b3JfcGFuKTsKKworCXJldHVybiBoZGwtPmVycm9yOworfQogCiBzdGF0aWMgdm9pZCBwd2NfdmlkaW9jX2ZpbGxfZm10KGNvbnN0IHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7CkBAIC0yODQsMTAgKzQzMSwyMSBAQAogfQogCiAvKiBpb2N0bChWSURJT0NfU0VUX0ZNVCkgKi8KLXN0YXRpYyBpbnQgcHdjX3ZpZGlvY19zZXRfZm10KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCisKK3N0YXRpYyBpbnQgcHdjX3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCWludCByZXQsIGZwcywgc25hcHNob3QsIGNvbXByZXNzaW9uLCBwaXhlbGZvcm1hdDsKIAorCWlmICghcGRldi0+dWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAocGRldi0+Y2FwdF9maWxlICE9IE5VTEwgJiYKKwkgICAgcGRldi0+Y2FwdF9maWxlICE9IGZpbGUpCisJCXJldHVybiAtRUJVU1k7CisKKwlwZGV2LT5jYXB0X2ZpbGUgPSBmaWxlOworCiAJcmV0ID0gcHdjX3ZpZGlvY190cnlfZm10KHBkZXYsIGYpOwogCWlmIChyZXQ8MCkKIAkJcmV0dXJuIHJldDsKQEAgLTMwOSw3ICs0NjcsNyBAQAogCSAgICBwaXhlbGZvcm1hdCAhPSBWNEwyX1BJWF9GTVRfUFdDMikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAocGRldi0+aXNvX2luaXQpCisJaWYgKHZiMl9pc19zdHJlYW1pbmcoJnBkZXYtPnZiX3F1ZXVlKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAogCVBXQ19ERUJVR19JT0NUTCgiVHJ5aW5nIHRvIHNldCBmb3JtYXQgdG86IHdpZHRoPSVkIGhlaWdodD0lZCBmcHM9JWQgIgpAQCAtMzQzLDEzICs1MDEsMTQgQEAKIAogc3RhdGljIGludCBwd2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CiAJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCisJaWYgKCFwZGV2LT51ZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXN0cmNweShjYXAtPmRyaXZlciwgUFdDX05BTUUpOwotCXN0cmxjcHkoY2FwLT5jYXJkLCB2ZGV2LT5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSk7CisJc3RybGNweShjYXAtPmNhcmQsIHBkZXYtPnZkZXYubmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkpOwogCXVzYl9tYWtlX3BhdGgocGRldi0+dWRldiwgY2FwLT5idXNfaW5mbywgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKLQljYXAtPnZlcnNpb24gPSBQV0NfVkVSU0lPTl9DT0RFOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0KIAkJVjRMMl9DQVBfVklERU9fQ0FQVFVSRQl8CiAJCVY0TDJfQ0FQX1NUUkVBTUlORwl8CkBAIC0zNzcsMjU1ICs1MzYsMzk2IEBACiAJcmV0dXJuIGkgPyAtRUlOVkFMIDogMDsKIH0KIAotc3RhdGljIGludCBwd2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfcXVlcnljdHJsICpjKQorc3RhdGljIGludCBwd2NfZ192b2xhdGlsZV9jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCiB7Ci0JaW50IGksIGlkeDsKLQl1MzIgaWQ7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPQorCQljb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwgc3RydWN0IHB3Y19kZXZpY2UsIGN0cmxfaGFuZGxlcik7CisJaW50IHJldCA9IDA7CiAKLQlpZCA9IGMtPmlkOwotCWlmIChpZCAmIFY0TDJfQ1RSTF9GTEFHX05FWFRfQ1RSTCkgewotCQlpZCAmPSBWNEwyX0NUUkxfSURfTUFTSzsKLQkJaWQrKzsKLQkJaWR4ID0gLTE7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHB3Y19jb250cm9scyk7IGkrKykgewotCQkJaWYgKHB3Y19jb250cm9sc1tpXS5pZCA8IGlkKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGlkeCA+PSAwCi0JCQkgJiYgcHdjX2NvbnRyb2xzW2ldLmlkID4gcHdjX2NvbnRyb2xzW2lkeF0uaWQpCi0JCQkJY29udGludWU7Ci0JCQlpZHggPSBpOwotCQl9Ci0JCWlmIChpZHggPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCW1lbWNweShjLCAmcHdjX2NvbnRyb2xzW2lkeF0sIHNpemVvZiBwd2NfY29udHJvbHNbMF0pOwotCQlyZXR1cm4gMDsKKwkvKgorCSAqIFNvbWV0aW1lcyBpdCBjYW4gdGFrZSBxdWl0ZSBsb25nIGZvciB0aGUgcHdjIHRvIGNvbXBsZXRlIHVzYiBjb250cm9sCisJICogdHJhbnNmZXJzLCBzbyByZWxlYXNlIHRoZSBtb2Rsb2NrIHRvIGdpdmUgc3RyZWFtaW5nIGJ5IGFub3RoZXIKKwkgKiBwcm9jZXNzIC8gdGhyZWFkIHRoZSBjaGFuY2UgdG8gY29udGludWUgd2l0aCBhIGRxYnVmLgorCSAqLworCW11dGV4X3VubG9jaygmcGRldi0+bW9kbG9jayk7CisKKwkvKgorCSAqIFRha2UgdGhlIHVkZXYtbG9jayB0byBwcm90ZWN0IGFnYWluc3QgdGhlIGRpc2Nvbm5lY3QgaGFuZGxlcgorCSAqIGNvbXBsZXRpbmcgYW5kIHNldHRpbmcgZGV2LT51ZGV2IHRvIE5VTEwgdW5kZXJuZWF0aCB1cy4gT3RoZXIgY29kZQorCSAqIGRvZXMgbm90IG5lZWQgdG8gZG8gdGhpcyBzaW5jZSBpdCBpcyBwcm90ZWN0ZWQgYnkgdGhlIG1vZGxvY2suCisJICovCisJbXV0ZXhfbG9jaygmcGRldi0+dWRldmxvY2spOworCisJaWYgKCFwZGV2LT51ZGV2KSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gbGVhdmU7CiAJfQotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocHdjX2NvbnRyb2xzKSAvIHNpemVvZihzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwpOyBpKyspIHsKLQkJaWYgKHB3Y19jb250cm9sc1tpXS5pZCA9PSBjLT5pZCkgewotCQkJUFdDX0RFQlVHX0lPQ1RMKCJpb2N0bChWSURJT0NfUVVFUllDVFJMKSBmb3VuZFxuIik7Ci0JCQltZW1jcHkoYywgJnB3Y19jb250cm9sc1tpXSwgc2l6ZW9mKHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCkpOwotCQkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0U6CisJCWlmIChwZGV2LT5jb2xvcl9iYWxfdmFsaWQgJiYgdGltZV9iZWZvcmUoamlmZmllcywKKwkJCQlwZGV2LT5sYXN0X2NvbG9yX2JhbF91cGRhdGUgKyBIWiAvIDQpKSB7CisJCQlwZGV2LT5yZWRfYmFsYW5jZS0+dmFsICA9IHBkZXYtPmxhc3RfcmVkX2JhbGFuY2U7CisJCQlwZGV2LT5ibHVlX2JhbGFuY2UtPnZhbCA9IHBkZXYtPmxhc3RfYmx1ZV9iYWxhbmNlOworCQkJYnJlYWs7CiAJCX0KKwkJcmV0ID0gcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9TVEFUVVNfQ1RMLAorCQkJCSAgICAgIFJFQURfUkVEX0dBSU5fRk9STUFUVEVSLAorCQkJCSAgICAgICZwZGV2LT5yZWRfYmFsYW5jZS0+dmFsKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQlyZXQgPSBwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX1NUQVRVU19DVEwsCisJCQkJICAgICAgUkVBRF9CTFVFX0dBSU5fRk9STUFUVEVSLAorCQkJCSAgICAgICZwZGV2LT5ibHVlX2JhbGFuY2UtPnZhbCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJcGRldi0+bGFzdF9yZWRfYmFsYW5jZSAgPSBwZGV2LT5yZWRfYmFsYW5jZS0+dmFsOworCQlwZGV2LT5sYXN0X2JsdWVfYmFsYW5jZSA9IHBkZXYtPmJsdWVfYmFsYW5jZS0+dmFsOworCQlwZGV2LT5sYXN0X2NvbG9yX2JhbF91cGRhdGUgPSBqaWZmaWVzOworCQlwZGV2LT5jb2xvcl9iYWxfdmFsaWQgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0FVVE9HQUlOOgorCQlpZiAocGRldi0+Z2Fpbl92YWxpZCAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLAorCQkJCXBkZXYtPmxhc3RfZ2Fpbl91cGRhdGUgKyBIWiAvIDQpKSB7CisJCQlwZGV2LT5nYWluLT52YWwgPSBwZGV2LT5sYXN0X2dhaW47CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSBwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX1NUQVRVU19DVEwsCisJCQkJICAgICAgUkVBRF9BR0NfRk9STUFUVEVSLCAmcGRldi0+Z2Fpbi0+dmFsKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQlwZGV2LT5sYXN0X2dhaW4gPSBwZGV2LT5nYWluLT52YWw7CisJCXBkZXYtPmxhc3RfZ2Fpbl91cGRhdGUgPSBqaWZmaWVzOworCQlwZGV2LT5nYWluX3ZhbGlkID0gdHJ1ZTsKKwkJaWYgKCFERVZJQ0VfVVNFX0NPREVDMyhwZGV2LT50eXBlKSkKKwkJCWJyZWFrOworCQkvKiBGYWxsIHRocm91Z2ggZm9yIENPREVDMyB3aGVyZSBhdXRvZ2FpbiBhbHNvIGNvbnRyb2xzIGV4cG8gKi8KKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE86CisJCWlmIChwZGV2LT5leHBvc3VyZV92YWxpZCAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLAorCQkJCXBkZXYtPmxhc3RfZXhwb3N1cmVfdXBkYXRlICsgSFogLyA0KSkgeworCQkJcGRldi0+ZXhwb3N1cmUtPnZhbCA9IHBkZXYtPmxhc3RfZXhwb3N1cmU7CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSBwd2NfZ2V0X3UxNl9jdHJsKHBkZXYsIEdFVF9TVEFUVVNfQ1RMLAorCQkJCSAgICAgICBSRUFEX1NIVVRURVJfRk9STUFUVEVSLAorCQkJCSAgICAgICAmcGRldi0+ZXhwb3N1cmUtPnZhbCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJcGRldi0+bGFzdF9leHBvc3VyZSA9IHBkZXYtPmV4cG9zdXJlLT52YWw7CisJCXBkZXYtPmxhc3RfZXhwb3N1cmVfdXBkYXRlID0gamlmZmllczsKKwkJcGRldi0+ZXhwb3N1cmVfdmFsaWQgPSB0cnVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOwogCX0KLQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChyZXQpCisJCVBXQ19FUlJPUigiZ19jdHJsICVzIGVycm9yICVkXG4iLCBjdHJsLT5uYW1lLCByZXQpOworCitsZWF2ZToKKwltdXRleF91bmxvY2soJnBkZXYtPnVkZXZsb2NrKTsKKwltdXRleF9sb2NrKCZwZGV2LT5tb2Rsb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHB3Y19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjKQorc3RhdGljIGludCBwd2Nfc2V0X2F3YihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAotCXN3aXRjaCAoYy0+aWQpIHsKLQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6Ci0JCWMtPnZhbHVlID0gcHdjX2dldF9icmlnaHRuZXNzKHBkZXYpOwotCQlpZiAoYy0+dmFsdWUgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6Ci0JCWMtPnZhbHVlID0gcHdjX2dldF9jb250cmFzdChwZGV2KTsKLQkJaWYgKGMtPnZhbHVlIDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046Ci0JCXJldCA9IHB3Y19nZXRfc2F0dXJhdGlvbihwZGV2LCAmYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX0dBTU1BOgotCQljLT52YWx1ZSA9IHB3Y19nZXRfZ2FtbWEocGRldik7Ci0JCWlmIChjLT52YWx1ZSA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKLQkJcmV0ID0gcHdjX2dldF9yZWRfZ2FpbihwZGV2LCAmYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQljLT52YWx1ZSA+Pj0gODsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6Ci0JCXJldCA9IHB3Y19nZXRfYmx1ZV9nYWluKHBkZXYsICZjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWMtPnZhbHVlID4+PSA4OwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRToKLQkJcmV0ID0gcHdjX2dldF9hd2IocGRldik7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWMtPnZhbHVlID0gKHJldCA9PSBQV0NfV0JfTUFOVUFMKSA/IDAgOiAxOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCXJldCA9IHB3Y19nZXRfYWdjKHBkZXYsICZjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWMtPnZhbHVlID4+PSA4OwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX0FVVE9HQUlOOgotCQlyZXQgPSBwd2NfZ2V0X2FnYyhwZGV2LCAmYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQljLT52YWx1ZSA9IChjLT52YWx1ZSA8IDApID8gMSA6IDA7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6Ci0JCXJldCA9IHB3Y19nZXRfc2h1dHRlcl9zcGVlZChwZGV2LCAmYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQ09MT1VSX01PREU6Ci0JCXJldCA9IHB3Y19nZXRfY29sb3VyX21vZGUocGRldiwgJmMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9QUklWQVRFX0FVVE9DT05UT1VSOgotCQlyZXQgPSBwd2NfZ2V0X2NvbnRvdXIocGRldiwgJmMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYy0+dmFsdWUgPSAoYy0+dmFsdWUgPT0gLTEgPyAxIDogMCk7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfUFJJVkFURV9DT05UT1VSOgotCQlyZXQgPSBwd2NfZ2V0X2NvbnRvdXIocGRldiwgJmMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYy0+dmFsdWUgPj49IDEwOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQkFDS0xJR0hUOgotCQlyZXQgPSBwd2NfZ2V0X2JhY2tsaWdodChwZGV2LCAmYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfRkxJQ0tFUkxFU1M6Ci0JCXJldCA9IHB3Y19nZXRfZmxpY2tlcihwZGV2LCAmYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQljLT52YWx1ZSA9IChjLT52YWx1ZSA/IDEgOiAwKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9QUklWQVRFX05PSVNFX1JFRFVDVElPTjoKLQkJcmV0ID0gcHdjX2dldF9keW5hbWljX25vaXNlKHBkZXYsICZjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOworCWlmIChwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UtPmlzX25ldykgeworCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0NIUk9NX0NUTCwKKwkJCQkgICAgICBXQl9NT0RFX0ZPUk1BVFRFUiwKKwkJCQkgICAgICBwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UtPnZhbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCi0JY2FzZSBWNEwyX0NJRF9QUklWQVRFX1NBVkVfVVNFUjoKLQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfUkVTVE9SRV9VU0VSOgotCWNhc2UgVjRMMl9DSURfUFJJVkFURV9SRVNUT1JFX0ZBQ1RPUlk6Ci0JCXJldHVybiAtRUlOVkFMOworCQkvKiBVcGRhdGUgdmFsIHdoZW4gY29taW5nIGZyb20gYXV0byBvciBnb2luZyB0byBhIHByZXNldCAqLworCQlpZiAocGRldi0+cmVkX2JhbGFuY2UtPmlzX3ZvbGF0aWxlIHx8CisJCSAgICBwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UtPnZhbCA9PSBhd2JfaW5kb29yIHx8CisJCSAgICBwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UtPnZhbCA9PSBhd2Jfb3V0ZG9vciB8fAorCQkgICAgcGRldi0+YXV0b193aGl0ZV9iYWxhbmNlLT52YWwgPT0gYXdiX2ZsKSB7CisJCQlpZiAoIXBkZXYtPnJlZF9iYWxhbmNlLT5pc19uZXcpCisJCQkJcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9TVEFUVVNfQ1RMLAorCQkJCQlSRUFEX1JFRF9HQUlOX0ZPUk1BVFRFUiwKKwkJCQkJJnBkZXYtPnJlZF9iYWxhbmNlLT52YWwpOworCQkJaWYgKCFwZGV2LT5ibHVlX2JhbGFuY2UtPmlzX25ldykKKwkJCQlwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX1NUQVRVU19DVEwsCisJCQkJCVJFQURfQkxVRV9HQUlOX0ZPUk1BVFRFUiwKKwkJCQkJJnBkZXYtPmJsdWVfYmFsYW5jZS0+dmFsKTsKKwkJfQorCQlpZiAocGRldi0+YXV0b193aGl0ZV9iYWxhbmNlLT52YWwgPT0gYXdiX2F1dG8pIHsKKwkJCXBkZXYtPnJlZF9iYWxhbmNlLT5pc192b2xhdGlsZSA9IHRydWU7CisJCQlwZGV2LT5ibHVlX2JhbGFuY2UtPmlzX3ZvbGF0aWxlID0gdHJ1ZTsKKwkJCXBkZXYtPmNvbG9yX2JhbF92YWxpZCA9IGZhbHNlOyAvKiBGb3JjZSBjYWNoZSB1cGRhdGUgKi8KKwkJfSBlbHNlIHsKKwkJCXBkZXYtPnJlZF9iYWxhbmNlLT5pc192b2xhdGlsZSA9IGZhbHNlOworCQkJcGRldi0+Ymx1ZV9iYWxhbmNlLT5pc192b2xhdGlsZSA9IGZhbHNlOworCQl9CiAJfQotCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJldCA9PSAwICYmIHBkZXYtPnJlZF9iYWxhbmNlLT5pc19uZXcpIHsKKwkJaWYgKHBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZS0+dmFsICE9IGF3Yl9tYW51YWwpCisJCQlyZXR1cm4gLUVCVVNZOworCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0NIUk9NX0NUTCwKKwkJCQkgICAgICBQUkVTRVRfTUFOVUFMX1JFRF9HQUlOX0ZPUk1BVFRFUiwKKwkJCQkgICAgICBwZGV2LT5yZWRfYmFsYW5jZS0+dmFsKTsKKwl9CisKKwlpZiAocmV0ID09IDAgJiYgcGRldi0+Ymx1ZV9iYWxhbmNlLT5pc19uZXcpIHsKKwkJaWYgKHBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZS0+dmFsICE9IGF3Yl9tYW51YWwpCisJCQlyZXR1cm4gLUVCVVNZOworCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0NIUk9NX0NUTCwKKwkJCQkgICAgICBQUkVTRVRfTUFOVUFMX0JMVUVfR0FJTl9GT1JNQVRURVIsCisJCQkJICAgICAgcGRldi0+Ymx1ZV9iYWxhbmNlLT52YWwpOworCX0KKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHB3Y19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjKQorLyogRm9yIENPREVDMiBtb2RlbHMgd2hpY2ggaGF2ZSBzZXBhcmF0ZSBhdXRvZ2FpbiBhbmQgYXV0byBleHBvc3VyZSAqLworc3RhdGljIGludCBwd2Nfc2V0X2F1dG9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCi0Jc3dpdGNoIChjLT5pZCkgewotCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKLQkJYy0+dmFsdWUgPDw9IDk7Ci0JCXJldCA9IHB3Y19zZXRfYnJpZ2h0bmVzcyhwZGV2LCBjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6Ci0JCWMtPnZhbHVlIDw8PSAxMDsKLQkJcmV0ID0gcHdjX3NldF9jb250cmFzdChwZGV2LCBjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKLQkJcmV0ID0gcHdjX3NldF9zYXR1cmF0aW9uKHBkZXYsIGMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9HQU1NQToKLQkJYy0+dmFsdWUgPDw9IDExOwotCQlyZXQgPSBwd2Nfc2V0X2dhbW1hKHBkZXYsIGMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKLQkJYy0+dmFsdWUgPDw9IDg7Ci0JCXJldCA9IHB3Y19zZXRfcmVkX2dhaW4ocGRldiwgYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKLQkJYy0+dmFsdWUgPDw9IDg7Ci0JCXJldCA9IHB3Y19zZXRfYmx1ZV9nYWluKHBkZXYsIGMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0U6Ci0JCWMtPnZhbHVlID0gKGMtPnZhbHVlID09IDApID8gUFdDX1dCX01BTlVBTCA6IFBXQ19XQl9BVVRPOwotCQlyZXQgPSBwd2Nfc2V0X2F3YihwZGV2LCBjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6Ci0JCWMtPnZhbHVlIDw8PSA4OwotCQlyZXQgPSBwd2Nfc2V0X3NodXR0ZXJfc3BlZWQocGRldiwgYy0+dmFsdWUgPyAwIDogMSwgYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX0FVVE9HQUlOOgotCQkvKiBhdXRvZ2FpbiBvZmYgbWVhbnMgbm90aGluZyB3aXRob3V0IGEgZ2FpbiAqLwotCQlpZiAoYy0+dmFsdWUgPT0gMCkKLQkJCXJldHVybiAwOwotCQlyZXQgPSBwd2Nfc2V0X2FnYyhwZGV2LCBjLT52YWx1ZSwgMCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJYy0+dmFsdWUgPDw9IDg7Ci0JCXJldCA9IHB3Y19zZXRfYWdjKHBkZXYsIDAsIGMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9QUklWQVRFX1NBVkVfVVNFUjoKLQkJaWYgKHB3Y19zYXZlX3VzZXIocGRldikpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfVVNFUjoKLQkJaWYgKHB3Y19yZXN0b3JlX3VzZXIocGRldikpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfRkFDVE9SWToKLQkJaWYgKHB3Y19yZXN0b3JlX2ZhY3RvcnkocGRldikpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9QUklWQVRFX0NPTE9VUl9NT0RFOgotCQlyZXQgPSBwd2Nfc2V0X2NvbG91cl9tb2RlKHBkZXYsIGMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9QUklWQVRFX0FVVE9DT05UT1VSOgotCQljLT52YWx1ZSA9IChjLT52YWx1ZSA9PSAxKSA/IC0xIDogMDsKLQkJcmV0ID0gcHdjX3NldF9jb250b3VyKHBkZXYsIGMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9QUklWQVRFX0NPTlRPVVI6Ci0JCWMtPnZhbHVlIDw8PSAxMDsKLQkJcmV0ID0gcHdjX3NldF9jb250b3VyKHBkZXYsIGMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9QUklWQVRFX0JBQ0tMSUdIVDoKLQkJcmV0ID0gcHdjX3NldF9iYWNrbGlnaHQocGRldiwgYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfRkxJQ0tFUkxFU1M6Ci0JCXJldCA9IHB3Y19zZXRfZmxpY2tlcihwZGV2LCBjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JY2FzZSBWNEwyX0NJRF9QUklWQVRFX05PSVNFX1JFRFVDVElPTjoKLQkJcmV0ID0gcHdjX3NldF9keW5hbWljX25vaXNlKHBkZXYsIGMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0KKwlpZiAocGRldi0+YXV0b2dhaW4tPmlzX25ldykgeworCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCisJCQkJICAgICAgQUdDX01PREVfRk9STUFUVEVSLAorCQkJCSAgICAgIHBkZXYtPmF1dG9nYWluLT52YWwgPyAwIDogMHhmZik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlpZiAocGRldi0+YXV0b2dhaW4tPnZhbCkKKwkJCXBkZXYtPmdhaW5fdmFsaWQgPSBmYWxzZTsgLyogRm9yY2UgY2FjaGUgdXBkYXRlICovCisJCWVsc2UgaWYgKCFwZGV2LT5nYWluLT5pc19uZXcpCisJCQlwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX1NUQVRVU19DVEwsCisJCQkJCVJFQURfQUdDX0ZPUk1BVFRFUiwKKwkJCQkJJnBkZXYtPmdhaW4tPnZhbCk7CiAJfQotCXJldHVybiAtRUlOVkFMOworCWlmIChyZXQgPT0gMCAmJiBwZGV2LT5nYWluLT5pc19uZXcpIHsKKwkJaWYgKHBkZXYtPmF1dG9nYWluLT52YWwpCisJCQlyZXR1cm4gLUVCVVNZOworCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCisJCQkJICAgICAgUFJFU0VUX0FHQ19GT1JNQVRURVIsCisJCQkJICAgICAgcGRldi0+Z2Fpbi0+dmFsKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogRm9yIENPREVDMiBtb2RlbHMgd2hpY2ggaGF2ZSBzZXBhcmF0ZSBhdXRvZ2FpbiBhbmQgYXV0byBleHBvc3VyZSAqLworc3RhdGljIGludCBwd2Nfc2V0X2V4cG9zdXJlX2F1dG8oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldCA9IDA7CisJaW50IGlzX2F1dG8gPSBwZGV2LT5leHBvc3VyZV9hdXRvLT52YWwgPT0gVjRMMl9FWFBPU1VSRV9BVVRPOworCisJaWYgKHBkZXYtPmV4cG9zdXJlX2F1dG8tPmlzX25ldykgeworCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCisJCQkJICAgICAgU0hVVFRFUl9NT0RFX0ZPUk1BVFRFUiwKKwkJCQkgICAgICBpc19hdXRvID8gMCA6IDB4ZmYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKGlzX2F1dG8pCisJCQlwZGV2LT5leHBvc3VyZV92YWxpZCA9IGZhbHNlOyAvKiBGb3JjZSBjYWNoZSB1cGRhdGUgKi8KKwkJZWxzZSBpZiAoIXBkZXYtPmV4cG9zdXJlLT5pc19uZXcpCisJCQlwd2NfZ2V0X3UxNl9jdHJsKHBkZXYsIEdFVF9TVEFUVVNfQ1RMLAorCQkJCQkgUkVBRF9TSFVUVEVSX0ZPUk1BVFRFUiwKKwkJCQkJICZwZGV2LT5leHBvc3VyZS0+dmFsKTsKKwl9CisJaWYgKHJldCA9PSAwICYmIHBkZXYtPmV4cG9zdXJlLT5pc19uZXcpIHsKKwkJaWYgKGlzX2F1dG8pCisJCQlyZXR1cm4gLUVCVVNZOworCQlyZXQgPSBwd2Nfc2V0X3UxNl9jdHJsKHBkZXYsIFNFVF9MVU1fQ1RMLAorCQkJCSAgICAgICBQUkVTRVRfU0hVVFRFUl9GT1JNQVRURVIsCisJCQkJICAgICAgIHBkZXYtPmV4cG9zdXJlLT52YWwpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBGb3IgQ09ERUMzIG1vZGVscyB3aGljaCBoYXZlIGF1dG9nYWluIGNvbnRyb2xsaW5nIGJvdGggZ2FpbiBhbmQgZXhwb3N1cmUgKi8KK3N0YXRpYyBpbnQgcHdjX3NldF9hdXRvZ2Fpbl9leHBvKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoreworCWludCByZXQgPSAwOworCisJaWYgKHBkZXYtPmF1dG9nYWluLT5pc19uZXcpIHsKKwkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9MVU1fQ1RMLAorCQkJCSAgICAgIEFHQ19NT0RFX0ZPUk1BVFRFUiwKKwkJCQkgICAgICBwZGV2LT5hdXRvZ2Fpbi0+dmFsID8gMCA6IDB4ZmYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKHBkZXYtPmF1dG9nYWluLT52YWwpIHsKKwkJCXBkZXYtPmdhaW5fdmFsaWQgICAgID0gZmFsc2U7IC8qIEZvcmNlIGNhY2hlIHVwZGF0ZSAqLworCQkJcGRldi0+ZXhwb3N1cmVfdmFsaWQgPSBmYWxzZTsgLyogRm9yY2UgY2FjaGUgdXBkYXRlICovCisJCX0gZWxzZSB7CisJCQlpZiAoIXBkZXYtPmdhaW4tPmlzX25ldykKKwkJCQlwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX1NUQVRVU19DVEwsCisJCQkJCQlSRUFEX0FHQ19GT1JNQVRURVIsCisJCQkJCQkmcGRldi0+Z2Fpbi0+dmFsKTsKKwkJCWlmICghcGRldi0+ZXhwb3N1cmUtPmlzX25ldykKKwkJCQlwd2NfZ2V0X3UxNl9jdHJsKHBkZXYsIEdFVF9TVEFUVVNfQ1RMLAorCQkJCQkJIFJFQURfU0hVVFRFUl9GT1JNQVRURVIsCisJCQkJCQkgJnBkZXYtPmV4cG9zdXJlLT52YWwpOworCQl9CisJfQorCWlmIChyZXQgPT0gMCAmJiBwZGV2LT5nYWluLT5pc19uZXcpIHsKKwkJaWYgKHBkZXYtPmF1dG9nYWluLT52YWwpCisJCQlyZXR1cm4gLUVCVVNZOworCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCisJCQkJICAgICAgUFJFU0VUX0FHQ19GT1JNQVRURVIsCisJCQkJICAgICAgcGRldi0+Z2Fpbi0+dmFsKTsKKwl9CisJaWYgKHJldCA9PSAwICYmIHBkZXYtPmV4cG9zdXJlLT5pc19uZXcpIHsKKwkJaWYgKHBkZXYtPmF1dG9nYWluLT52YWwpCisJCQlyZXR1cm4gLUVCVVNZOworCQlyZXQgPSBwd2Nfc2V0X3UxNl9jdHJsKHBkZXYsIFNFVF9MVU1fQ1RMLAorCQkJCSAgICAgICBQUkVTRVRfU0hVVFRFUl9GT1JNQVRURVIsCisJCQkJICAgICAgIHBkZXYtPmV4cG9zdXJlLT52YWwpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHB3Y19zZXRfbW90b3Ioc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKwl1OCBidWZbNF07CisKKwlidWZbMF0gPSAwOworCWlmIChwZGV2LT5tb3Rvcl9wYW5fcmVzZXQtPmlzX25ldykKKwkJYnVmWzBdIHw9IDB4MDE7CisJaWYgKHBkZXYtPm1vdG9yX3RpbHRfcmVzZXQtPmlzX25ldykKKwkJYnVmWzBdIHw9IDB4MDI7CisJaWYgKHBkZXYtPm1vdG9yX3Bhbl9yZXNldC0+aXNfbmV3IHx8IHBkZXYtPm1vdG9yX3RpbHRfcmVzZXQtPmlzX25ldykgeworCQlyZXQgPSBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsIFNFVF9NUFRfQ1RMLAorCQkJCSAgICAgICBQVF9SRVNFVF9DT05UUk9MX0ZPUk1BVFRFUiwgYnVmLCAxKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwlpZiAocGRldi0+bW90b3JfcGFuLT5pc19uZXcpIHsKKwkJYnVmWzBdID0gcGRldi0+bW90b3JfcGFuLT52YWwgJiAweEZGOworCQlidWZbMV0gPSAocGRldi0+bW90b3JfcGFuLT52YWwgPj4gOCk7CisJfQorCWlmIChwZGV2LT5tb3Rvcl90aWx0LT5pc19uZXcpIHsKKwkJYnVmWzJdID0gcGRldi0+bW90b3JfdGlsdC0+dmFsICYgMHhGRjsKKwkJYnVmWzNdID0gKHBkZXYtPm1vdG9yX3RpbHQtPnZhbCA+PiA4KTsKKwl9CisJaWYgKHBkZXYtPm1vdG9yX3Bhbi0+aXNfbmV3IHx8IHBkZXYtPm1vdG9yX3RpbHQtPmlzX25ldykgeworCQlyZXQgPSBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsIFNFVF9NUFRfQ1RMLAorCQkJCSAgICAgICBQVF9SRUxBVElWRV9DT05UUk9MX0ZPUk1BVFRFUiwKKwkJCQkgICAgICAgYnVmLCBzaXplb2YoYnVmKSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwd2Nfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCit7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPQorCQljb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwgc3RydWN0IHB3Y19kZXZpY2UsIGN0cmxfaGFuZGxlcik7CisJaW50IHJldCA9IDA7CisKKwkvKiBTZWUgdGhlIGNvbW1lbnRzIG9uIGxvY2tpbmcgaW4gcHdjX2dfdm9sYXRpbGVfY3RybCAqLworCW11dGV4X3VubG9jaygmcGRldi0+bW9kbG9jayk7CisJbXV0ZXhfbG9jaygmcGRldi0+dWRldmxvY2spOworCisJaWYgKCFwZGV2LT51ZGV2KSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gbGVhdmU7CisJfQorCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9MVU1fQ1RMLAorCQkJCSAgICAgIEJSSUdIVE5FU1NfRk9STUFUVEVSLCBjdHJsLT52YWwpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCisJCQkJICAgICAgQ09OVFJBU1RfRk9STUFUVEVSLCBjdHJsLT52YWwpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCXJldCA9IHB3Y19zZXRfczhfY3RybChwZGV2LCBTRVRfQ0hST01fQ1RMLAorCQkJCSAgICAgIHBkZXYtPnNhdHVyYXRpb25fZm10LCBjdHJsLT52YWwpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0dBTU1BOgorCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCisJCQkJICAgICAgR0FNTUFfRk9STUFUVEVSLCBjdHJsLT52YWwpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRToKKwkJcmV0ID0gcHdjX3NldF9hd2IocGRldik7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQVVUT0dBSU46CisJCWlmIChERVZJQ0VfVVNFX0NPREVDMihwZGV2LT50eXBlKSkKKwkJCXJldCA9IHB3Y19zZXRfYXV0b2dhaW4ocGRldik7CisJCWVsc2UgaWYgKERFVklDRV9VU0VfQ09ERUMzKHBkZXYtPnR5cGUpKQorCQkJcmV0ID0gcHdjX3NldF9hdXRvZ2Fpbl9leHBvKHBkZXYpOworCQllbHNlCisJCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFX0FVVE86CisJCWlmIChERVZJQ0VfVVNFX0NPREVDMihwZGV2LT50eXBlKSkKKwkJCXJldCA9IHB3Y19zZXRfZXhwb3N1cmVfYXV0byhwZGV2KTsKKwkJZWxzZQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9DT0xPUkZYOgorCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0NIUk9NX0NUTCwKKwkJCQkgICAgICBDT0xPVVJfTU9ERV9GT1JNQVRURVIsCisJCQkJICAgICAgY3RybC0+dmFsID8gMCA6IDB4ZmYpOworCQlicmVhazsKKwljYXNlIFBXQ19DSURfQ1VTVE9NKGF1dG9jb250b3VyKToKKwkJaWYgKHBkZXYtPmF1dG9jb250b3VyLT5pc19uZXcpIHsKKwkJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfTFVNX0NUTCwKKwkJCQkJQVVUT19DT05UT1VSX0ZPUk1BVFRFUiwKKwkJCQkJcGRldi0+YXV0b2NvbnRvdXItPnZhbCA/IDAgOiAweGZmKTsKKwkJfQorCQlpZiAocmV0ID09IDAgJiYgcGRldi0+Y29udG91ci0+aXNfbmV3KSB7CisJCQlpZiAocGRldi0+YXV0b2NvbnRvdXItPnZhbCkgeworCQkJCXJldCA9IC1FQlVTWTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfTFVNX0NUTCwKKwkJCQkJICAgICAgUFJFU0VUX0NPTlRPVVJfRk9STUFUVEVSLAorCQkJCQkgICAgICBwZGV2LT5jb250b3VyLT52YWwpOworCQl9CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQkFDS0xJR0hUX0NPTVBFTlNBVElPTjoKKwkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9MVU1fQ1RMLAorCQkJCSAgICAgIEJBQ0tfTElHSFRfQ09NUEVOU0FUSU9OX0ZPUk1BVFRFUiwKKwkJCQkgICAgICBjdHJsLT52YWwgPyAwIDogMHhmZik7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQkFORF9TVE9QX0ZJTFRFUjoKKwkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9MVU1fQ1RMLAorCQkJCSAgICAgIEZMSUNLRVJMRVNTX01PREVfRk9STUFUVEVSLAorCQkJCSAgICAgIGN0cmwtPnZhbCA/IDAgOiAweGZmKTsKKwkJYnJlYWs7CisJY2FzZSBQV0NfQ0lEX0NVU1RPTShub2lzZV9yZWR1Y3Rpb24pOgorCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCisJCQkJICAgICAgRFlOQU1JQ19OT0lTRV9DT05UUk9MX0ZPUk1BVFRFUiwKKwkJCQkgICAgICBjdHJsLT52YWwpOworCQlicmVhazsKKwljYXNlIFBXQ19DSURfQ1VTVE9NKHNhdmVfdXNlcik6CisJCXJldCA9IHB3Y19idXR0b25fY3RybChwZGV2LCBTQVZFX1VTRVJfREVGQVVMVFNfRk9STUFUVEVSKTsKKwkJYnJlYWs7CisJY2FzZSBQV0NfQ0lEX0NVU1RPTShyZXN0b3JlX3VzZXIpOgorCQlyZXQgPSBwd2NfYnV0dG9uX2N0cmwocGRldiwgUkVTVE9SRV9VU0VSX0RFRkFVTFRTX0ZPUk1BVFRFUik7CisJCWJyZWFrOworCWNhc2UgUFdDX0NJRF9DVVNUT00ocmVzdG9yZV9mYWN0b3J5KToKKwkJcmV0ID0gcHdjX2J1dHRvbl9jdHJsKHBkZXYsCisJCQkJICAgICAgUkVTVE9SRV9GQUNUT1JZX0RFRkFVTFRTX0ZPUk1BVFRFUik7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfUEFOX1JFTEFUSVZFOgorCQlyZXQgPSBwd2Nfc2V0X21vdG9yKHBkZXYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCWlmIChyZXQpCisJCVBXQ19FUlJPUigic19jdHJsICVzIGVycm9yICVkXG4iLCBjdHJsLT5uYW1lLCByZXQpOworCitsZWF2ZToKKwltdXRleF91bmxvY2soJnBkZXYtPnVkZXZsb2NrKTsKKwltdXRleF9sb2NrKCZwZGV2LT5tb2Rsb2NrKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHB3Y19lbnVtX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKQEAgLTY2NywxNTcgKzk2Nyw3NyBAQAogCXJldHVybiBwd2NfdmlkaW9jX3RyeV9mbXQocGRldiwgZik7CiB9CiAKLXN0YXRpYyBpbnQgcHdjX3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCitzdGF0aWMgaW50IHB3Y19yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJICAgICAgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyYikKIHsKIAlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKLQlyZXR1cm4gcHdjX3ZpZGlvY19zZXRfZm10KHBkZXYsIGYpOwotfQorCWlmIChwZGV2LT5jYXB0X2ZpbGUgIT0gTlVMTCAmJgorCSAgICBwZGV2LT5jYXB0X2ZpbGUgIT0gZmlsZSkKKwkJcmV0dXJuIC1FQlVTWTsKIAotc3RhdGljIGludCBwd2NfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyYikKLXsKLQlpbnQgbmJ1ZmZlcnM7CisJcGRldi0+Y2FwdF9maWxlID0gZmlsZTsKIAotCVBXQ19ERUJVR19JT0NUTCgiaW9jdGwoVklESU9DX1JFUUJVRlMpIGNvdW50PSVkXG4iLCByYi0+Y291bnQpOwotCWlmIChyYi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChyYi0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbmJ1ZmZlcnMgPSByYi0+Y291bnQ7Ci0JaWYgKG5idWZmZXJzIDwgMikKLQkJbmJ1ZmZlcnMgPSAyOwotCWVsc2UgaWYgKG5idWZmZXJzID4gcHdjX21idWZzKQotCQluYnVmZmVycyA9IHB3Y19tYnVmczsKLQkvKiBGb3JjZSB0byB1c2Ugb3VyICMgb2YgYnVmZmVycyAqLwotCXJiLT5jb3VudCA9IHB3Y19tYnVmczsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gdmIyX3JlcWJ1ZnMoJnBkZXYtPnZiX3F1ZXVlLCByYik7CiB9CiAKIHN0YXRpYyBpbnQgcHdjX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCiB7CiAJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCWludCBpbmRleDsKIAotCVBXQ19ERUJVR19JT0NUTCgiaW9jdGwoVklESU9DX1FVRVJZQlVGKSBpbmRleD0lZFxuIiwgYnVmLT5pbmRleCk7Ci0JaWYgKGJ1Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKLQkJUFdDX0RFQlVHX0lPQ1RMKCJpb2N0bChWSURJT0NfUVVFUllCVUYpIEJhZCB0eXBlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWluZGV4ID0gYnVmLT5pbmRleDsKLQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHB3Y19tYnVmcykgewotCQlQV0NfREVCVUdfSU9DVEwoImlvY3RsKFZJRElPQ19RVUVSWUJVRikgQmFkIGluZGV4ICVkXG4iLCBidWYtPmluZGV4KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JYnVmLT5tLm9mZnNldCA9IGluZGV4ICogcGRldi0+bGVuX3Blcl9pbWFnZTsKLQlpZiAocGRldi0+cGl4Zm10ICE9IFY0TDJfUElYX0ZNVF9ZVVY0MjApCi0JCWJ1Zi0+Ynl0ZXN1c2VkID0gcGRldi0+ZnJhbWVfc2l6ZSArIHNpemVvZihzdHJ1Y3QgcHdjX3Jhd19mcmFtZSk7Ci0JZWxzZQotCQlidWYtPmJ5dGVzdXNlZCA9IHBkZXYtPnZpZXcuc2l6ZTsKLQlidWYtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwotCWJ1Zi0+bWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKLQkvKmJ1Zi0+ZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX01BUFBFRDsqLwotCWJ1Zi0+bGVuZ3RoID0gcGRldi0+bGVuX3Blcl9pbWFnZTsKLQotCVBXQ19ERUJVR19SRUFEKCJWSURJT0NfUVVFUllCVUY6IGluZGV4PSVkXG4iLCBidWYtPmluZGV4KTsKLQlQV0NfREVCVUdfUkVBRCgiVklESU9DX1FVRVJZQlVGOiBtLm9mZnNldD0lZFxuIiwgYnVmLT5tLm9mZnNldCk7Ci0JUFdDX0RFQlVHX1JFQUQoIlZJRElPQ19RVUVSWUJVRjogYnl0ZXN1c2VkPSVkXG4iLCBidWYtPmJ5dGVzdXNlZCk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gdmIyX3F1ZXJ5YnVmKCZwZGV2LT52Yl9xdWV1ZSwgYnVmKTsKIH0KIAogc3RhdGljIGludCBwd2NfcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQogewotCVBXQ19ERUJVR19JT0NUTCgiaW9jdGwoVklESU9DX1FCVUYpIGluZGV4PSVkXG4iLCBidWYtPmluZGV4KTsKLQlpZiAoYnVmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGJ1Zi0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChidWYtPmluZGV4ID49IHB3Y19tYnVmcykKLQkJcmV0dXJuIC1FSU5WQUw7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCi0JYnVmLT5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX1FVRVVFRDsKLQlidWYtPmZsYWdzICY9IH5WNEwyX0JVRl9GTEFHX0RPTkU7CisJaWYgKCFwZGV2LT51ZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldHVybiAwOworCWlmIChwZGV2LT5jYXB0X2ZpbGUgIT0gZmlsZSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiB2YjJfcWJ1ZigmcGRldi0+dmJfcXVldWUsIGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQgcHdjX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCiB7Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCWludCByZXQ7CiAKLQlQV0NfREVCVUdfSU9DVEwoImlvY3RsKFZJRElPQ19EUUJVRilcbiIpOworCWlmICghcGRldi0+dWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoYnVmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBkZXYtPmNhcHRfZmlsZSAhPSBmaWxlKQorCQlyZXR1cm4gLUVCVVNZOwogCi0JYWRkX3dhaXRfcXVldWUoJnBkZXYtPmZyYW1lcSwgJndhaXQpOwotCXdoaWxlIChwZGV2LT5mdWxsX2ZyYW1lcyA9PSBOVUxMKSB7Ci0JCWlmIChwZGV2LT5lcnJvcl9zdGF0dXMpIHsKLQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JCQlyZXR1cm4gLXBkZXYtPmVycm9yX3N0YXR1czsKLQkJfQotCi0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnBkZXYtPmZyYW1lcSwgJndhaXQpOwotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQkJCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JCX0KLQkJbXV0ZXhfdW5sb2NrKCZwZGV2LT5tb2Rsb2NrKTsKLQkJc2NoZWR1bGUoKTsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJbXV0ZXhfbG9jaygmcGRldi0+bW9kbG9jayk7Ci0JfQotCXJlbW92ZV93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCi0JUFdDX0RFQlVHX0lPQ1RMKCJWSURJT0NfRFFCVUY6IGZyYW1lIHJlYWR5LlxuIik7Ci0JLyogRGVjb21wcmVzcyBkYXRhIGluIHBkZXYtPmltYWdlc1twZGV2LT5maWxsX2ltYWdlXSAqLwotCXJldCA9IHB3Y19oYW5kbGVfZnJhbWUocGRldik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JUFdDX0RFQlVHX0lPQ1RMKCJWSURJT0NfRFFCVUY6IGFmdGVyIHB3Y19oYW5kbGVfZnJhbWVcbiIpOwotCi0JYnVmLT5pbmRleCA9IHBkZXYtPmZpbGxfaW1hZ2U7Ci0JaWYgKHBkZXYtPnBpeGZtdCAhPSBWNEwyX1BJWF9GTVRfWVVWNDIwKQotCQlidWYtPmJ5dGVzdXNlZCA9IHBkZXYtPmZyYW1lX3NpemUgKyBzaXplb2Yoc3RydWN0IHB3Y19yYXdfZnJhbWUpOwotCWVsc2UKLQkJYnVmLT5ieXRlc3VzZWQgPSBwZGV2LT52aWV3LnNpemU7Ci0JYnVmLT5mbGFncyA9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEOwotCWJ1Zi0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Ci0JZG9fZ2V0dGltZW9mZGF5KCZidWYtPnRpbWVzdGFtcCk7Ci0JYnVmLT5zZXF1ZW5jZSA9IDA7Ci0JYnVmLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOwotCWJ1Zi0+bS5vZmZzZXQgPSBwZGV2LT5maWxsX2ltYWdlICogcGRldi0+bGVuX3Blcl9pbWFnZTsKLQlidWYtPmxlbmd0aCA9IHBkZXYtPmxlbl9wZXJfaW1hZ2U7Ci0JcHdjX25leHRfaW1hZ2UocGRldik7Ci0KLQlQV0NfREVCVUdfSU9DVEwoIlZJRElPQ19EUUJVRjogYnVmLT5pbmRleD0lZFxuIiwgYnVmLT5pbmRleCk7Ci0JUFdDX0RFQlVHX0lPQ1RMKCJWSURJT0NfRFFCVUY6IGJ1Zi0+bGVuZ3RoPSVkXG4iLCBidWYtPmxlbmd0aCk7Ci0JUFdDX0RFQlVHX0lPQ1RMKCJWSURJT0NfRFFCVUY6IG0ub2Zmc2V0PSVkXG4iLCBidWYtPm0ub2Zmc2V0KTsKLQlQV0NfREVCVUdfSU9DVEwoIlZJRElPQ19EUUJVRjogYnl0ZXN1c2VkPSVkXG4iLCBidWYtPmJ5dGVzdXNlZCk7Ci0JUFdDX0RFQlVHX0lPQ1RMKCJWSURJT0NfRFFCVUY6IGxlYXZpbmdcbiIpOwotCXJldHVybiAwOwotCisJcmV0dXJuIHZiMl9kcWJ1ZigmcGRldi0+dmJfcXVldWUsIGJ1ZiwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwogfQogCiBzdGF0aWMgaW50IHB3Y19zdHJlYW1vbihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIGVudW0gdjRsMl9idWZfdHlwZSBpKQogewogCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAotCXJldHVybiBwd2NfaXNvY19pbml0KHBkZXYpOworCWlmICghcGRldi0+dWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAocGRldi0+Y2FwdF9maWxlICE9IGZpbGUpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXR1cm4gdmIyX3N0cmVhbW9uKCZwZGV2LT52Yl9xdWV1ZSwgaSk7CiB9CiAKIHN0YXRpYyBpbnQgcHdjX3N0cmVhbW9mZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIGVudW0gdjRsMl9idWZfdHlwZSBpKQogewogCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAotCXB3Y19pc29jX2NsZWFudXAocGRldik7Ci0JcmV0dXJuIDA7CisJaWYgKCFwZGV2LT51ZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChwZGV2LT5jYXB0X2ZpbGUgIT0gZmlsZSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiB2YjJfc3RyZWFtb2ZmKCZwZGV2LT52Yl9xdWV1ZSwgaSk7CiB9CiAKIHN0YXRpYyBpbnQgcHdjX2VudW1fZnJhbWVzaXplcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCkBAIC04OTYsOSArMTExNiw2IEBACiAJLnZpZGlvY19nX2ZtdF92aWRfY2FwCQkgICAgPSBwd2NfZ19mbXRfdmlkX2NhcCwKIAkudmlkaW9jX3NfZm10X3ZpZF9jYXAJCSAgICA9IHB3Y19zX2ZtdF92aWRfY2FwLAogCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwCQkgICAgPSBwd2NfdHJ5X2ZtdF92aWRfY2FwLAotCS52aWRpb2NfcXVlcnljdHJsCQkgICAgPSBwd2NfcXVlcnljdHJsLAotCS52aWRpb2NfZ19jdHJsCQkJICAgID0gcHdjX2dfY3RybCwKLQkudmlkaW9jX3NfY3RybAkJCSAgICA9IHB3Y19zX2N0cmwsCiAJLnZpZGlvY19yZXFidWZzCQkJICAgID0gcHdjX3JlcWJ1ZnMsCiAJLnZpZGlvY19xdWVyeWJ1ZgkJICAgID0gcHdjX3F1ZXJ5YnVmLAogCS52aWRpb2NfcWJ1ZgkJCSAgICA9IHB3Y19xYnVmLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MuaAppbmRleCAwODNmOGIxLi4wZTRlMmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MuaApAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMzcsMTkgKzM2LDE2IEBACiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi12bWFsbG9jLmg+CiAjaWZkZWYgQ09ORklHX1VTQl9QV0NfSU5QVVRfRVZERVYKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2VuZGlmCiAKLSNpbmNsdWRlICJwd2MtdW5jb21wcmVzcy5oIgogI2luY2x1ZGUgPG1lZGlhL3B3Yy1pb2N0bC5oPgogCiAvKiBWZXJzaW9uIGJsb2NrICovCi0jZGVmaW5lIFBXQ19NQUpPUgkxMAotI2RlZmluZSBQV0NfTUlOT1IJMAotI2RlZmluZSBQV0NfRVhUUkFNSU5PUgkxMgotI2RlZmluZSBQV0NfVkVSU0lPTl9DT0RFIEtFUk5FTF9WRVJTSU9OKFBXQ19NQUpPUixQV0NfTUlOT1IsUFdDX0VYVFJBTUlOT1IpCi0jZGVmaW5lIFBXQ19WRVJTSU9OCSIxMC4wLjE0IgorI2RlZmluZSBQV0NfVkVSU0lPTgkiMTAuMC4xNSIKICNkZWZpbmUgUFdDX05BTUUgCSJwd2MiCiAjZGVmaW5lIFBGWAkJUFdDX05BTUUgIjogIgogCkBAIC04MSw5ICs3Nyw5IEBACiAjZGVmaW5lIFBXQ19ERUJVR19MRVZFTAkoUFdDX0RFQlVHX0xFVkVMX01PRFVMRSkKIAogI2RlZmluZSBQV0NfREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgZG8ge1wKLQkgIGlmICgoUFdDX0RFQlVHX0xFVkVMXyAjI2xldmVsKSAmIHB3Y190cmFjZSkgXAotCSAgICAgcHJpbnRrKEtFUk5fREVCVUcgUEZYIGZtdCwgIyNhcmdzKTsgXAotCSAgfSB3aGlsZSgwKQorCWlmICgoUFdDX0RFQlVHX0xFVkVMXyAjI2xldmVsKSAmIHB3Y190cmFjZSkgXAorCQlwcmludGsoS0VSTl9ERUJVRyBQRlggZm10LCAjI2FyZ3MpOyBcCisJfSB3aGlsZSAoMCkKIAogI2RlZmluZSBQV0NfRVJST1IoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9FUlIgUEZYIGZtdCwgIyNhcmdzKQogI2RlZmluZSBQV0NfV0FSTklORyhmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgUEZYIGZtdCwgIyNhcmdzKQpAQCAtMTEwLDI1ICsxMDYsMjEgQEAKICNkZWZpbmUgRkVBVFVSRV9DT0RFQzEJCQkweDAwMDIKICNkZWZpbmUgRkVBVFVSRV9DT0RFQzIJCQkweDAwMDQKIAotLyogVHVybiBjZXJ0YWluIGZlYXR1cmVzIG9uL29mZiAqLwotI2RlZmluZSBQV0NfSU5UX1BJUEUgMAotCiAvKiBJZ25vcmUgZXJyb3JzIGluIHRoZSBmaXJzdCBOIGZyYW1lcywgdG8gYWxsb3cgZm9yIHN0YXJ0dXAgZGVsYXlzICovCiAjZGVmaW5lIEZSQU1FX0xPV01BUksgNQogCiAvKiBTaXplIGFuZCBudW1iZXIgb2YgYnVmZmVycyBmb3IgdGhlIElTTyBwaXBlLiAqLwotI2RlZmluZSBNQVhfSVNPX0JVRlMJCTIKKyNkZWZpbmUgTUFYX0lTT19CVUZTCQkzCiAjZGVmaW5lIElTT19GUkFNRVNfUEVSX0RFU0MJMTAKICNkZWZpbmUgSVNPX01BWF9GUkFNRV9TSVpFCTk2MAogI2RlZmluZSBJU09fQlVGRkVSX1NJWkUgCShJU09fRlJBTUVTX1BFUl9ERVNDICogSVNPX01BWF9GUkFNRV9TSVpFKQogCi0vKiBGcmFtZSBidWZmZXJzOiBjb250YWlucyBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZCB2aWRlbyBkYXRhLiAqLwotI2RlZmluZSBNQVhfRlJBTUVTCQk1CiAvKiBNYXhpbXVtIHNpemUgYWZ0ZXIgZGVjb21wcmVzc2lvbiBpcyA2NDB4NDgwIFlVViBkYXRhLCAxLjUgKiA2NDAgKiA0ODAgKi8KICNkZWZpbmUgUFdDX0ZSQU1FX1NJWkUgCQkoNDYwODAwICsgVE9VQ0FNX0hFQURFUl9TSVpFICsgVE9VQ0FNX1RSQUlMRVJfU0laRSkKIAotLyogQWJzb2x1dGUgbWF4aW11bSBudW1iZXIgb2YgYnVmZmVycyBhdmFpbGFibGUgZm9yIG1tYXAoKSAqLwotI2RlZmluZSBNQVhfSU1BR0VTIAkJMTAKKy8qIEFic29sdXRlIG1pbmltdW0gYW5kIG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgYXZhaWxhYmxlIGZvciBtbWFwKCkgKi8KKyNkZWZpbmUgTUlOX0ZSQU1FUwkJMgorI2RlZmluZSBNQVhfRlJBTUVTCQkxNgogCiAvKiBTb21lIG1hY3JvcyB0byBxdWlja2x5IGZpbmQgdGhlIHR5cGUgb2YgYSB3ZWJjYW0gKi8KICNkZWZpbmUgREVWSUNFX1VTRV9DT0RFQzEoeCkgKCh4KTw2NzUpCkBAIC0xMzYsMTQ5ICsxMjgsMjIxIEBACiAjZGVmaW5lIERFVklDRV9VU0VfQ09ERUMzKHgpICgoeCk+PTcwMCkKICNkZWZpbmUgREVWSUNFX1VTRV9DT0RFQzIzKHgpICgoeCk+PTY3NSkKIAotLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmVzIHdlcmUgYmFzZWQgb24gY3BpYS5oLiBXaHkgcmVpbnZlbnQgdGhlIHdoZWVsPyA6LSkgKi8KLXN0cnVjdCBwd2NfaXNvX2J1ZgotewotCXZvaWQgKmRhdGE7Ci0JaW50ICBsZW5ndGg7Ci0JaW50ICByZWFkOwotCXN0cnVjdCB1cmIgKnVyYjsKLX07CisvKiBmcm9tIHB3Yy1kZWMuaCAqLworI2RlZmluZSBQV0NYX0ZMQUdfUExBTkFSICAgICAgICAweDAwMDEKKworLyogUmVxdWVzdCB0eXBlczogdmlkZW8gKi8KKyNkZWZpbmUgU0VUX0xVTV9DVEwJCQkweDAxCisjZGVmaW5lIEdFVF9MVU1fQ1RMCQkJMHgwMgorI2RlZmluZSBTRVRfQ0hST01fQ1RMCQkJMHgwMworI2RlZmluZSBHRVRfQ0hST01fQ1RMCQkJMHgwNAorI2RlZmluZSBTRVRfU1RBVFVTX0NUTAkJCTB4MDUKKyNkZWZpbmUgR0VUX1NUQVRVU19DVEwJCQkweDA2CisjZGVmaW5lIFNFVF9FUF9TVFJFQU1fQ1RMCQkweDA3CisjZGVmaW5lIEdFVF9FUF9TVFJFQU1fQ1RMCQkweDA4CisjZGVmaW5lIEdFVF9YWF9DVEwJCQkweDA5CisjZGVmaW5lIFNFVF9YWF9DVEwJCQkweDBBCisjZGVmaW5lIEdFVF9YWV9DVEwJCQkweDBCCisjZGVmaW5lIFNFVF9YWV9DVEwJCQkweDBDCisjZGVmaW5lIFNFVF9NUFRfQ1RMCQkJMHgwRAorI2RlZmluZSBHRVRfTVBUX0NUTAkJCTB4MEUKKworLyogU2VsZWN0b3JzIGZvciB0aGUgTHVtaW5hbmNlIGNvbnRyb2xzIFtHU11FVF9MVU1fQ1RMICovCisjZGVmaW5lIEFHQ19NT0RFX0ZPUk1BVFRFUgkJCTB4MjAwMAorI2RlZmluZSBQUkVTRVRfQUdDX0ZPUk1BVFRFUgkJCTB4MjEwMAorI2RlZmluZSBTSFVUVEVSX01PREVfRk9STUFUVEVSCQkJMHgyMjAwCisjZGVmaW5lIFBSRVNFVF9TSFVUVEVSX0ZPUk1BVFRFUgkJMHgyMzAwCisjZGVmaW5lIFBSRVNFVF9DT05UT1VSX0ZPUk1BVFRFUgkJMHgyNDAwCisjZGVmaW5lIEFVVE9fQ09OVE9VUl9GT1JNQVRURVIJCQkweDI1MDAKKyNkZWZpbmUgQkFDS19MSUdIVF9DT01QRU5TQVRJT05fRk9STUFUVEVSCTB4MjYwMAorI2RlZmluZSBDT05UUkFTVF9GT1JNQVRURVIJCQkweDI3MDAKKyNkZWZpbmUgRFlOQU1JQ19OT0lTRV9DT05UUk9MX0ZPUk1BVFRFUgkJMHgyODAwCisjZGVmaW5lIEZMSUNLRVJMRVNTX01PREVfRk9STUFUVEVSCQkweDI5MDAKKyNkZWZpbmUgQUVfQ09OVFJPTF9TUEVFRAkJCTB4MkEwMAorI2RlZmluZSBCUklHSFRORVNTX0ZPUk1BVFRFUgkJCTB4MkIwMAorI2RlZmluZSBHQU1NQV9GT1JNQVRURVIJCQkJMHgyQzAwCisKKy8qIFNlbGVjdG9ycyBmb3IgdGhlIENocm9taW5hbmNlIGNvbnRyb2xzIFtHU11FVF9DSFJPTV9DVEwgKi8KKyNkZWZpbmUgV0JfTU9ERV9GT1JNQVRURVIJCQkweDEwMDAKKyNkZWZpbmUgQVdCX0NPTlRST0xfU1BFRURfRk9STUFUVEVSCQkweDExMDAKKyNkZWZpbmUgQVdCX0NPTlRST0xfREVMQVlfRk9STUFUVEVSCQkweDEyMDAKKyNkZWZpbmUgUFJFU0VUX01BTlVBTF9SRURfR0FJTl9GT1JNQVRURVIJMHgxMzAwCisjZGVmaW5lIFBSRVNFVF9NQU5VQUxfQkxVRV9HQUlOX0ZPUk1BVFRFUgkweDE0MDAKKyNkZWZpbmUgQ09MT1VSX01PREVfRk9STUFUVEVSCQkJMHgxNTAwCisjZGVmaW5lIFNBVFVSQVRJT05fTU9ERV9GT1JNQVRURVIxCQkweDE2MDAKKyNkZWZpbmUgU0FUVVJBVElPTl9NT0RFX0ZPUk1BVFRFUjIJCTB4MTcwMAorCisvKiBTZWxlY3RvcnMgZm9yIHRoZSBTdGF0dXMgY29udHJvbHMgW0dTXUVUX1NUQVRVU19DVEwgKi8KKyNkZWZpbmUgU0FWRV9VU0VSX0RFRkFVTFRTX0ZPUk1BVFRFUgkJMHgwMjAwCisjZGVmaW5lIFJFU1RPUkVfVVNFUl9ERUZBVUxUU19GT1JNQVRURVIJCTB4MDMwMAorI2RlZmluZSBSRVNUT1JFX0ZBQ1RPUllfREVGQVVMVFNfRk9STUFUVEVSCTB4MDQwMAorI2RlZmluZSBSRUFEX0FHQ19GT1JNQVRURVIJCQkweDA1MDAKKyNkZWZpbmUgUkVBRF9TSFVUVEVSX0ZPUk1BVFRFUgkJCTB4MDYwMAorI2RlZmluZSBSRUFEX1JFRF9HQUlOX0ZPUk1BVFRFUgkJCTB4MDcwMAorI2RlZmluZSBSRUFEX0JMVUVfR0FJTl9GT1JNQVRURVIJCTB4MDgwMAorCisvKiBGb3JtYXR0ZXJzIGZvciB0aGUgbW90b3JpemVkIHBhbiAmIHRpbHQgW0dTXUVUX01QVF9DVEwgKi8KKyNkZWZpbmUgUFRfUkVMQVRJVkVfQ09OVFJPTF9GT1JNQVRURVIJCTB4MDEKKyNkZWZpbmUgUFRfUkVTRVRfQ09OVFJPTF9GT1JNQVRURVIJCTB4MDIKKyNkZWZpbmUgUFRfU1RBVFVTX0ZPUk1BVFRFUgkJCTB4MDMKIAogLyogaW50ZXJtZWRpYXRlIGJ1ZmZlcnMgd2l0aCByYXcgZGF0YSBmcm9tIHRoZSBVU0IgY2FtICovCiBzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZgogewotICAgdm9pZCAqZGF0YTsKLSAgIHZvbGF0aWxlIGludCBmaWxsZWQ7CQkvKiBudW1iZXIgb2YgYnl0ZXMgZmlsbGVkICovCi0gICBzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqbmV4dDsJLyogbGlzdCAqLwotfTsKLQotLyogYWRkaXRpb25uYWwgaW5mb3JtYXRpb25zIHVzZWQgd2hlbiBkZWFsaW5nIGltYWdlIGJldHdlZW4ga2VybmVsIGFuZCB1c2VybGFuZCAqLwotc3RydWN0IHB3Y19pbWdidWYKLXsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsJLyogb2Zmc2V0IG9mIHRoaXMgYnVmZmVyIGluIHRoZSBiaWcgYXJyYXkgb2YgaW1hZ2VfZGF0YSAqLwotCWludCAgIHZtYV91c2VfY291bnQ7CS8qIGNvdW50IHRoZSBudW1iZXIgb2YgdGltZSB0aGlzIG1lbW9yeSBpcyBtYXBwZWQgKi8KKwlzdHJ1Y3QgdmIyX2J1ZmZlciB2YjsJLyogY29tbW9uIHY0bCBidWZmZXIgc3R1ZmYgLS0gbXVzdCBiZSBmaXJzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl2b2lkICpkYXRhOworCWludCBmaWxsZWQ7CQkvKiBudW1iZXIgb2YgYnl0ZXMgZmlsbGVkICovCiB9OwogCiBzdHJ1Y3QgcHdjX2RldmljZQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgdmRldjsKKwlzdHJ1Y3QgbXV0ZXggbW9kbG9jazsKIAotICAgLyogUG9pbnRlciB0byBvdXIgdXNiX2RldmljZSwgbWF5IGJlIE5VTEwgYWZ0ZXIgdW5wbHVnICovCi0gICBzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwkvKiBQb2ludGVyIHRvIG91ciB1c2JfZGV2aWNlLCBtYXkgYmUgTlVMTCBhZnRlciB1bnBsdWcgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwkvKiBQcm90ZWN0cyB0aGUgc2V0dGluZyBvZiB1ZGV2IHRvIE5VTEwgYnkgb3VyIGRpc2Nvbm5lY3QgaGFuZGxlciAqLworCXN0cnVjdCBtdXRleCB1ZGV2bG9jazsKIAotICAgaW50IHR5cGU7ICAgICAgICAgICAgICAgICAgICAvKiB0eXBlIG9mIGNhbSAoNjQ1LCA2NDYsIDY3NSwgNjgwLCA2OTAsIDcyMCwgNzMwLCA3NDAsIDc1MCkgKi8KLSAgIGludCByZWxlYXNlOwkJCS8qIHJlbGVhc2UgbnVtYmVyICovCi0gICBpbnQgZmVhdHVyZXM7CQkvKiBmZWF0dXJlIGJpdHMgKi8KLSAgIGNoYXIgc2VyaWFsWzMwXTsJCS8qIHNlcmlhbCBudW1iZXIgKHN0cmluZykgKi8KLSAgIGludCBlcnJvcl9zdGF0dXM7CQkvKiBzZXQgd2hlbiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aXRoIHRoZSBjYW0gKHVucGx1Z2dlZCwgVVNCIGVycm9ycykgKi8KLSAgIGludCB1c2JfaW5pdDsJCS8qIHNldCB3aGVuIHRoZSBjYW0gaGFzIGJlZW4gaW5pdGlhbGl6ZWQgb3ZlciBVU0IgKi8KKwkvKiB0eXBlIG9mIGNhbSAoNjQ1LCA2NDYsIDY3NSwgNjgwLCA2OTAsIDcyMCwgNzMwLCA3NDAsIDc1MCkgKi8KKwlpbnQgdHlwZTsKKwlpbnQgcmVsZWFzZTsJCS8qIHJlbGVhc2UgbnVtYmVyICovCisJaW50IGZlYXR1cmVzOwkJLyogZmVhdHVyZSBiaXRzICovCisJY2hhciBzZXJpYWxbMzBdOwkvKiBzZXJpYWwgbnVtYmVyIChzdHJpbmcpICovCiAKLSAgIC8qKiogVmlkZW8gZGF0YSAqKiovCi0gICBpbnQgdm9wZW47CQkJLyogZmxhZyAqLwotICAgaW50IHZlbmRwb2ludDsJCS8qIHZpZGVvIGlzb2MgZW5kcG9pbnQgKi8KLSAgIGludCB2Y2ludGVyZmFjZTsJCS8qIHZpZGVvIGNvbnRyb2wgaW50ZXJmYWNlICovCi0gICBpbnQgdmFsdGVybmF0ZTsJCS8qIGFsdGVybmF0ZSBpbnRlcmZhY2UgbmVlZGVkICovCi0gICBpbnQgdmZyYW1lcywgdnNpemU7CQkvKiBmcmFtZXMtcGVyLXNlY29uZCAmIHNpemUgKHNlZSBQU1pfKikgKi8KLSAgIGludCBwaXhmbXQ7CQkJLyogcGl4ZWxmb3JtYXQ6IFY0TDJfUElYX0ZNVF9ZVVY0MjAgb3IgcmF3OiBfUFdDMSwgX1BXQzIgKi8KLSAgIGludCB2ZnJhbWVfY291bnQ7CQkvKiByZWNlaXZlZCBmcmFtZXMgKi8KLSAgIGludCB2ZnJhbWVzX2R1bXBlZDsgCQkvKiBjb3VudGVyIGZvciBkdW1wZWQgZnJhbWVzICovCi0gICBpbnQgdmZyYW1lc19lcnJvcjsJCS8qIGZyYW1lcyByZWNlaXZlZCBpbiBlcnJvciAqLwotICAgaW50IHZtYXhfcGFja2V0X3NpemU7CS8qIFVTQiBtYXhwYWNrZXQgc2l6ZSAqLwotICAgaW50IHZsYXN0X3BhY2tldF9zaXplOwkvKiBmb3IgZnJhbWUgc3luY2hyb25pc2F0aW9uICovCi0gICBpbnQgdmlzb2NfZXJyb3JzOwkJLyogbnVtYmVyIG9mIGNvbnRpZ3VvdXMgSVNPQyBlcnJvcnMgKi8KLSAgIGludCB2Y29tcHJlc3Npb247CQkvKiBkZXNpcmVkIGNvbXByZXNzaW9uIGZhY3RvciAqLwotICAgaW50IHZiYW5kbGVuZ3RoOwkJLyogY29tcHJlc3NlZCBiYW5kIGxlbmd0aDsgMCBpcyB1bmNvbXByZXNzZWQgKi8KLSAgIGNoYXIgdnNuYXBzaG90OwkJLyogc25hcHNob3QgbW9kZSAqLwotICAgY2hhciB2c3luYzsJCQkvKiB1c2VkIGJ5IGlzb2MgaGFuZGxlciAqLwotICAgY2hhciB2bWlycm9yOwkJLyogZm9yIFRvVUNhTSBzZXJpZXMgKi8KLQljaGFyIHVucGx1Z2dlZDsKKwkvKioqIFZpZGVvIGRhdGEgKioqLworCXN0cnVjdCBmaWxlICpjYXB0X2ZpbGU7CS8qIGZpbGUgZG9pbmcgdmlkZW8gY2FwdHVyZSAqLworCWludCB2ZW5kcG9pbnQ7CQkvKiB2aWRlbyBpc29jIGVuZHBvaW50ICovCisJaW50IHZjaW50ZXJmYWNlOwkvKiB2aWRlbyBjb250cm9sIGludGVyZmFjZSAqLworCWludCB2YWx0ZXJuYXRlOwkJLyogYWx0ZXJuYXRlIGludGVyZmFjZSBuZWVkZWQgKi8KKwlpbnQgdmZyYW1lcywgdnNpemU7CS8qIGZyYW1lcy1wZXItc2Vjb25kICYgc2l6ZSAoc2VlIFBTWl8qKSAqLworCWludCBwaXhmbXQ7CQkvKiBwaXhlbGZvcm1hdDogVjRMMl9QSVhfRk1UX1lVVjQyMCBvciBfUFdDWCAqLworCWludCB2ZnJhbWVfY291bnQ7CS8qIHJlY2VpdmVkIGZyYW1lcyAqLworCWludCB2bWF4X3BhY2tldF9zaXplOwkvKiBVU0IgbWF4cGFja2V0IHNpemUgKi8KKwlpbnQgdmxhc3RfcGFja2V0X3NpemU7CS8qIGZvciBmcmFtZSBzeW5jaHJvbmlzYXRpb24gKi8KKwlpbnQgdmlzb2NfZXJyb3JzOwkvKiBudW1iZXIgb2YgY29udGlndW91cyBJU09DIGVycm9ycyAqLworCWludCB2Y29tcHJlc3Npb247CS8qIGRlc2lyZWQgY29tcHJlc3Npb24gZmFjdG9yICovCisJaW50IHZiYW5kbGVuZ3RoOwkvKiBjb21wcmVzc2VkIGJhbmQgbGVuZ3RoOyAwIGlzIHVuY29tcHJlc3NlZCAqLworCWNoYXIgdnNuYXBzaG90OwkJLyogc25hcHNob3QgbW9kZSAqLworCWNoYXIgdnN5bmM7CQkvKiB1c2VkIGJ5IGlzb2MgaGFuZGxlciAqLworCWNoYXIgdm1pcnJvcjsJCS8qIGZvciBUb1VDYU0gc2VyaWVzICovCisJY2hhciBwb3dlcl9zYXZlOwkvKiBEbyBwb3dlcnNhdmluZyBmb3IgdGhpcyBjYW0gKi8KIAotICAgaW50IGNtZF9sZW47Ci0gICB1bnNpZ25lZCBjaGFyIGNtZF9idWZbMTNdOworCWludCBjbWRfbGVuOworCXVuc2lnbmVkIGNoYXIgY21kX2J1ZlsxM107CiAKLSAgIC8qIFRoZSBpbWFnZSBhY3F1aXNpdGlvbiByZXF1aXJlcyAzIHRvIDQgc3RlcHM6Ci0gICAgICAxLiBkYXRhIGlzIGdhdGhlcmVkIGluIHNob3J0IHBhY2tldHMgZnJvbSB0aGUgVVNCIGNvbnRyb2xsZXIKLSAgICAgIDIuIGRhdGEgaXMgc3luY2hyb25pemVkIGFuZCBwYWNrZWQgaW50byBhIGZyYW1lIGJ1ZmZlcgotICAgICAgM2EuIGluIGNhc2UgZGF0YSBpcyBjb21wcmVzc2VkLCBkZWNvbXByZXNzIGl0IGRpcmVjdGx5IGludG8gaW1hZ2UgYnVmZmVyCi0gICAgICAzYi4gaW4gY2FzZSBkYXRhIGlzIHVuY29tcHJlc3NlZCwgY29weSBpbnRvIGltYWdlIGJ1ZmZlciB3aXRoIHZpZXdwb3J0Ci0gICAgICA0LiBkYXRhIGlzIHRyYW5zZmVycmVkIHRvIHRoZSB1c2VyIHByb2Nlc3MKKwlzdHJ1Y3QgdXJiICp1cmJzW01BWF9JU09fQlVGU107CisJY2hhciBpc29faW5pdDsKIAotICAgICAgTm90ZSB0aGF0IE1BWF9JU09fQlVGUyAhPSBNQVhfRlJBTUVTICE9IE1BWF9JTUFHRVMuLi4uCi0gICAgICBXZSBoYXZlIGluIGVmZmVjdCBhIGJhY2stdG8tYmFjay1kb3VibGUtYnVmZmVyIHN5c3RlbS4KLSAgICAqLwotICAgLyogMTogaXNvYyAqLwotICAgc3RydWN0IHB3Y19pc29fYnVmIHNidWZbTUFYX0lTT19CVUZTXTsKLSAgIGNoYXIgaXNvX2luaXQ7CisJLyogdmlkZW9idWYyIHF1ZXVlIGFuZCBxdWV1ZWQgYnVmZmVycyBsaXN0ICovCisJc3RydWN0IHZiMl9xdWV1ZSB2Yl9xdWV1ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXVlZF9idWZzOworCXNwaW5sb2NrX3QgcXVldWVkX2J1ZnNfbG9jazsKIAotICAgLyogMjogZnJhbWUgKi8KLSAgIHN0cnVjdCBwd2NfZnJhbWVfYnVmICpmYnVmOwkvKiBhbGwgZnJhbWVzICovCi0gICBzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqZW1wdHlfZnJhbWVzLCAqZW1wdHlfZnJhbWVzX3RhaWw7CS8qIGFsbCBlbXB0eSBmcmFtZXMgKi8KLSAgIHN0cnVjdCBwd2NfZnJhbWVfYnVmICpmdWxsX2ZyYW1lcywgKmZ1bGxfZnJhbWVzX3RhaWw7CS8qIGFsbCBmaWxsZWQgZnJhbWVzICovCi0gICBzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqZmlsbF9mcmFtZTsJLyogZnJhbWUgY3VycmVudGx5IGJlaW5nIGZpbGxlZCAqLwotICAgc3RydWN0IHB3Y19mcmFtZV9idWYgKnJlYWRfZnJhbWU7CS8qIGZyYW1lIGN1cnJlbnRseSByZWFkIGJ5IHVzZXIgcHJvY2VzcyAqLwotICAgaW50IGZyYW1lX2hlYWRlcl9zaXplLCBmcmFtZV90cmFpbGVyX3NpemU7Ci0gICBpbnQgZnJhbWVfc2l6ZTsKLSAgIGludCBmcmFtZV90b3RhbF9zaXplOyAvKiBpbmNsdWRpbmcgaGVhZGVyICYgdHJhaWxlciAqLwotICAgaW50IGRyb3BfZnJhbWVzOworCS8qCisJICogRnJhbWUgY3VycmVudGx5IGJlaW5nIGZpbGxlZCwgdGhpcyBvbmx5IGdldHMgdG91Y2hlZCBieSB0aGUKKwkgKiBpc29jIHVyYiBjb21wbGV0ZSBoYW5kbGVyLCBhbmQgYnkgc3RyZWFtIHN0YXJ0IC8gc3RvcCBzaW5jZQorCSAqIHN0YXJ0IC8gc3RvcCB0b3VjaCBpdCBiZWZvcmUgLyBhZnRlciBzdGFydGluZyAvIGtpbGxpbmcgdGhlIHVyYnMKKwkgKiBubyBsb2NraW5nIGlzIG5lZWRlZCBhcm91bmQgdGhpcworCSAqLworCXN0cnVjdCBwd2NfZnJhbWVfYnVmICpmaWxsX2J1ZjsKIAotICAgLyogMzogZGVjb21wcmVzc2lvbiAqLwotICAgdm9pZCAqZGVjb21wcmVzc19kYXRhOwkJLyogcHJpdmF0ZSBkYXRhIGZvciBkZWNvbXByZXNzaW9uIGVuZ2luZSAqLworCWludCBmcmFtZV9oZWFkZXJfc2l6ZSwgZnJhbWVfdHJhaWxlcl9zaXplOworCWludCBmcmFtZV9zaXplOworCWludCBmcmFtZV90b3RhbF9zaXplOwkvKiBpbmNsdWRpbmcgaGVhZGVyICYgdHJhaWxlciAqLworCWludCBkcm9wX2ZyYW1lczsKIAotICAgLyogNDogaW1hZ2UgKi8KLSAgIC8qIFdlIGhhdmUgYW4gJ2ltYWdlJyBhbmQgYSAndmlldycsIHdoZXJlICdpbWFnZScgaXMgdGhlIGZpeGVkLXNpemUgaW1hZ2UKLSAgICAgIGFzIGRlbGl2ZXJlZCBieSB0aGUgY2FtZXJhLCBhbmQgJ3ZpZXcnIGlzIHRoZSBzaXplIHJlcXVlc3RlZCBieSB0aGUKLSAgICAgIHByb2dyYW0uIFRoZSBjYW1lcmEgaW1hZ2UgaXMgY2VudGVyZWQgaW4gdGhpcyB2aWV3cG9ydCwgbGFjZWQgd2l0aAotICAgICAgYSBncmF5IG9yIGJsYWNrIGJvcmRlci4gdmlld19taW4gPD0gaW1hZ2UgPD0gdmlldyA8PSB2aWV3X21heDsKLSAgICAqLwotICAgaW50IGltYWdlX21hc2s7CQkJLyogYml0bWFzayBvZiBzdXBwb3J0ZWQgc2l6ZXMgKi8KLSAgIHN0cnVjdCBwd2NfY29vcmQgdmlld19taW4sIHZpZXdfbWF4OwkvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIHZpZXdhYmxlIHNpemVzICovCi0gICBzdHJ1Y3QgcHdjX2Nvb3JkIGFic19tYXg7ICAgICAgICAgICAgLyogbWF4aW11bSBzdXBwb3J0ZWQgc2l6ZSB3aXRoIGNvbXByZXNzaW9uICovCi0gICBzdHJ1Y3QgcHdjX2Nvb3JkIGltYWdlLCB2aWV3OwkvKiBpbWFnZSBhbmQgdmlld3BvcnQgc2l6ZSAqLwotICAgc3RydWN0IHB3Y19jb29yZCBvZmZzZXQ7CQkvKiBvZmZzZXQgd2l0aGluIHRoZSB2aWV3cG9ydCAqLworCXZvaWQgKmRlY29tcHJlc3NfZGF0YTsJLyogcHJpdmF0ZSBkYXRhIGZvciBkZWNvbXByZXNzaW9uIGVuZ2luZSAqLwogCi0gICB2b2lkICppbWFnZV9kYXRhOwkJCS8qIHRvdGFsIGJ1ZmZlciwgd2hpY2ggaXMgc3ViZGl2aWRlZCBpbnRvIC4uLiAqLwotICAgc3RydWN0IHB3Y19pbWdidWYgaW1hZ2VzW01BWF9JTUFHRVNdOy8qIC4uLnNldmVyYWwgaW1hZ2VzLi4uICovCi0gICBpbnQgZmlsbF9pbWFnZTsJCQkvKiAuLi53aGljaCBhcmUgcm90YXRlZC4gKi8KLSAgIGludCBsZW5fcGVyX2ltYWdlOwkJCS8qIGxlbmd0aCBwZXIgaW1hZ2UgKi8KLSAgIGludCBpbWFnZV9yZWFkX3BvczsJCQkvKiBJbiBjYXNlIHdlIHJlYWQgZGF0YSBpbiBwaWVjZXMsIGtlZXAgdHJhY2sgb2Ygd2VyZSB3ZSBhcmUgaW4gdGhlIGltYWdlYnVmZmVyICovCi0gICBpbnQgaW1hZ2VfdXNlZFtNQVhfSU1BR0VTXTsJCS8qIEZvciBNQ0FQVFVSRSBhbmQgU1lOQyAqLworCS8qCisJICogV2UgaGF2ZSBhbiAnaW1hZ2UnIGFuZCBhICd2aWV3Jywgd2hlcmUgJ2ltYWdlJyBpcyB0aGUgZml4ZWQtc2l6ZSBpbWcKKwkgKiBhcyBkZWxpdmVyZWQgYnkgdGhlIGNhbWVyYSwgYW5kICd2aWV3JyBpcyB0aGUgc2l6ZSByZXF1ZXN0ZWQgYnkgdGhlCisJICogcHJvZ3JhbS4gVGhlIGNhbWVyYSBpbWFnZSBpcyBjZW50ZXJlZCBpbiB0aGlzIHZpZXdwb3J0LCBsYWNlZCB3aXRoCisJICogYSBncmF5IG9yIGJsYWNrIGJvcmRlci4gdmlld19taW4gPD0gaW1hZ2UgPD0gdmlldyA8PSB2aWV3X21heDsKKwkgKi8KKwlpbnQgaW1hZ2VfbWFzazsJCQkJLyogc3VwcG9ydGVkIHNpemVzICovCisJc3RydWN0IHB3Y19jb29yZCB2aWV3X21pbiwgdmlld19tYXg7CS8qIG1pbmltdW0gYW5kIG1heGltdW0gdmlldyAqLworCXN0cnVjdCBwd2NfY29vcmQgYWJzX21heDsJCS8qIG1heGltdW0gc3VwcG9ydGVkIHNpemUgKi8KKwlzdHJ1Y3QgcHdjX2Nvb3JkIGltYWdlLCB2aWV3OwkJLyogaW1hZ2UgYW5kIHZpZXdwb3J0IHNpemUgKi8KKwlzdHJ1Y3QgcHdjX2Nvb3JkIG9mZnNldDsJCS8qIG9mZnNldCBvZiB0aGUgdmlld3BvcnQgKi8KIAotICAgc3RydWN0IG11dGV4IG1vZGxvY2s7CQkvKiB0byBwcmV2ZW50IHJhY2VzIGluIHZpZGVvX29wZW4oKSwgZXRjICovCi0gICBzcGlubG9ja190IHB0cmxvY2s7CQkJLyogZm9yIG1hbmlwdWxhdGluZyB0aGUgYnVmZmVyIHBvaW50ZXJzICovCisJLyoqKiBtb3Rvcml6ZWQgcGFuL3RpbHQgZmVhdHVyZSAqLworCXN0cnVjdCBwd2NfbXB0X3JhbmdlIGFuZ2xlX3JhbmdlOworCWludCBwYW5fYW5nbGU7CQkJLyogaW4gZGVncmVlcyAqIDEwMCAqLworCWludCB0aWx0X2FuZ2xlOwkJCS8qIGFic29sdXRlIGFuZ2xlOyAwLDAgaXMgaG9tZSAqLwogCi0gICAvKioqIG1vdG9yaXplZCBwYW4vdGlsdCBmZWF0dXJlICovCi0gICBzdHJ1Y3QgcHdjX21wdF9yYW5nZSBhbmdsZV9yYW5nZTsKLSAgIGludCBwYW5fYW5nbGU7CQkJLyogaW4gZGVncmVlcyAqIDEwMCAqLwotICAgaW50IHRpbHRfYW5nbGU7CQkJLyogYWJzb2x1dGUgYW5nbGU7IDAsMCBpcyBob21lIHBvc2l0aW9uICovCi0gICBpbnQgc25hcHNob3RfYnV0dG9uX3N0YXR1czsJCS8qIHNldCB0byAxIHdoZW4gdGhlIHVzZXIgcHVzaCB0aGUgYnV0dG9uLCByZXNldCB0byAwIHdoZW4gdGhpcyB2YWx1ZSBpcyByZWFkICovCisJLyoKKwkgKiBTZXQgdG8gMSB3aGVuIHRoZSB1c2VyIHB1c2ggdGhlIGJ1dHRvbiwgcmVzZXQgdG8gMAorCSAqIHdoZW4gdGhpcyB2YWx1ZSBpcyByZWFkIGZyb20gc3lzZnMuCisJICovCisJaW50IHNuYXBzaG90X2J1dHRvbl9zdGF0dXM7CiAjaWZkZWYgQ09ORklHX1VTQl9QV0NfSU5QVVRfRVZERVYKLSAgIHN0cnVjdCBpbnB1dF9kZXYgKmJ1dHRvbl9kZXY7CS8qIHdlYmNhbSBzbmFwc2hvdCBidXR0b24gaW5wdXQgKi8KLSAgIGNoYXIgYnV0dG9uX3BoeXNbNjRdOworCXN0cnVjdCBpbnB1dF9kZXYgKmJ1dHRvbl9kZXY7CS8qIHdlYmNhbSBzbmFwc2hvdCBidXR0b24gaW5wdXQgKi8KKwljaGFyIGJ1dHRvbl9waHlzWzY0XTsKICNlbmRpZgogCi0gICAvKioqIE1pc2MuIGRhdGEgKioqLwotICAgd2FpdF9xdWV1ZV9oZWFkX3QgZnJhbWVxOwkJLyogV2hlbiB3YWl0aW5nIGZvciBhIGZyYW1lIHRvIGZpbmlzaC4uLiAqLwotI2lmIFBXQ19JTlRfUElQRQotICAgdm9pZCAqdXNiX2ludF9oYW5kbGVyOwkJLyogZm9yIHRoZSBpbnRlcnJ1cHQgZW5kcG9pbnQgKi8KLSNlbmRpZgorCS8qIGNvbnRyb2xzICovCisJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyCWN0cmxfaGFuZGxlcjsKKwl1MTYJCQkJc2F0dXJhdGlvbl9mbXQ7CisJc3RydWN0IHY0bDJfY3RybAkJKmJyaWdodG5lc3M7CisJc3RydWN0IHY0bDJfY3RybAkJKmNvbnRyYXN0OworCXN0cnVjdCB2NGwyX2N0cmwJCSpzYXR1cmF0aW9uOworCXN0cnVjdCB2NGwyX2N0cmwJCSpnYW1tYTsKKwlzdHJ1Y3QgeworCQkvKiBhd2IgLyByZWQtYmx1ZSBiYWxhbmNlIGNsdXN0ZXIgKi8KKwkJc3RydWN0IHY0bDJfY3RybAkqYXV0b193aGl0ZV9iYWxhbmNlOworCQlzdHJ1Y3QgdjRsMl9jdHJsCSpyZWRfYmFsYW5jZTsKKwkJc3RydWN0IHY0bDJfY3RybAkqYmx1ZV9iYWxhbmNlOworCQkvKiB1c2IgY3RybCB0cmFuc2ZlcnMgYXJlIHNsb3csIHNvIHdlIGNhY2hlIHRoaW5ncyAqLworCQlpbnQJCQljb2xvcl9iYWxfdmFsaWQ7CisJCXVuc2lnbmVkIGxvbmcJCWxhc3RfY29sb3JfYmFsX3VwZGF0ZTsgLyogSW4gamlmZmllcyAqLworCQlzMzIJCQlsYXN0X3JlZF9iYWxhbmNlOworCQlzMzIJCQlsYXN0X2JsdWVfYmFsYW5jZTsKKwl9OworCXN0cnVjdCB7CisJCS8qIGF1dG9nYWluIC8gZ2FpbiBjbHVzdGVyICovCisJCXN0cnVjdCB2NGwyX2N0cmwJKmF1dG9nYWluOworCQlzdHJ1Y3QgdjRsMl9jdHJsCSpnYWluOworCQlpbnQJCQlnYWluX3ZhbGlkOworCQl1bnNpZ25lZCBsb25nCQlsYXN0X2dhaW5fdXBkYXRlOyAvKiBJbiBqaWZmaWVzICovCisJCXMzMgkJCWxhc3RfZ2FpbjsKKwl9OworCXN0cnVjdCB7CisJCS8qIGV4cG9zdXJlX2F1dG8gLyBleHBvc3VyZSBjbHVzdGVyICovCisJCXN0cnVjdCB2NGwyX2N0cmwJKmV4cG9zdXJlX2F1dG87CisJCXN0cnVjdCB2NGwyX2N0cmwJKmV4cG9zdXJlOworCQlpbnQJCQlleHBvc3VyZV92YWxpZDsKKwkJdW5zaWduZWQgbG9uZwkJbGFzdF9leHBvc3VyZV91cGRhdGU7IC8qIEluIGppZmZpZXMgKi8KKwkJczMyCQkJbGFzdF9leHBvc3VyZTsKKwl9OworCXN0cnVjdCB2NGwyX2N0cmwJCSpjb2xvcmZ4OworCXN0cnVjdCB7CisJCS8qIGF1dG9jb250b3VyL2NvbnRvdXIgY2x1c3RlciAqLworCQlzdHJ1Y3QgdjRsMl9jdHJsCSphdXRvY29udG91cjsKKwkJc3RydWN0IHY0bDJfY3RybAkqY29udG91cjsKKwl9OworCXN0cnVjdCB2NGwyX2N0cmwJCSpiYWNrbGlnaHQ7CisJc3RydWN0IHY0bDJfY3RybAkJKmZsaWNrZXI7CisJc3RydWN0IHY0bDJfY3RybAkJKm5vaXNlX3JlZHVjdGlvbjsKKwlzdHJ1Y3QgdjRsMl9jdHJsCQkqc2F2ZV91c2VyOworCXN0cnVjdCB2NGwyX2N0cmwJCSpyZXN0b3JlX3VzZXI7CisJc3RydWN0IHY0bDJfY3RybAkJKnJlc3RvcmVfZmFjdG9yeTsKKwlzdHJ1Y3QgeworCQkvKiBtb3RvciBjb250cm9sIGNsdXN0ZXIgKi8KKwkJc3RydWN0IHY0bDJfY3RybAkqbW90b3JfcGFuOworCQlzdHJ1Y3QgdjRsMl9jdHJsCSptb3Rvcl90aWx0OworCQlzdHJ1Y3QgdjRsMl9jdHJsCSptb3Rvcl9wYW5fcmVzZXQ7CisJCXN0cnVjdCB2NGwyX2N0cmwJKm1vdG9yX3RpbHRfcmVzZXQ7CisJfTsKKwkvKiBDT0RFQzMgbW9kZWxzIGhhdmUgYm90aCBnYWluIGFuZCBleHBvc3VyZSBjb250cm9sbGVkIGJ5IGF1dG9nYWluICovCisJc3RydWN0IHY0bDJfY3RybAkJKmF1dG9nYWluX2V4cG9fY2x1c3RlclszXTsKIH07CiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQogLyogR2xvYmFsIHZhcmlhYmxlcyAqLwogI2lmZGVmIENPTkZJR19VU0JfUFdDX0RFQlVHCiBleHRlcm4gaW50IHB3Y190cmFjZTsKICNlbmRpZgotZXh0ZXJuIGludCBwd2NfbWJ1ZnM7Ci0KLS8qKiBmdW5jdGlvbnMgaW4gcHdjLWlmLmMgKi8KLWludCBwd2NfaGFuZGxlX2ZyYW1lKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKLXZvaWQgcHdjX25leHRfaW1hZ2Uoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOwotaW50IHB3Y19pc29jX2luaXQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOwotdm9pZCBwd2NfaXNvY19jbGVhbnVwKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKIAogLyoqIEZ1bmN0aW9ucyBpbiBwd2MtbWlzYy5jICovCiAvKiBzaXplcyBpbiBwaXhlbHMgKi8KQEAgLTI5MSw1MCArMzU1LDI1IEBACiAvKiBSZXF1ZXN0IGEgY2VydGFpbiB2aWRlbyBtb2RlLiBSZXR1cm5zIDwgMCBpZiBub3QgcG9zc2libGUgKi8KIGV4dGVybiBpbnQgcHdjX3NldF92aWRlb19tb2RlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmcmFtZXMsIGludCBjb21wcmVzc2lvbiwgaW50IHNuYXBzaG90KTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgcHdjX2dldF9mcHMoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHVuc2lnbmVkIGludCBpbmRleCwgdW5zaWduZWQgaW50IHNpemUpOwotLyogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIGltYWdlIChub3QgZnJhbWUpICovCiBleHRlcm4gaW50IHB3Y19tcHRfcmVzZXQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBmbGFncyk7CiBleHRlcm4gaW50IHB3Y19tcHRfc2V0X2FuZ2xlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgcGFuLCBpbnQgdGlsdCk7Ci0KLS8qIFZhcmlvdXMgY29udHJvbHM7IHNob3VsZCBiZSBvYnZpb3VzLiBWYWx1ZSAwLi42NTUzNSwgb3IgPCAwIG9uIGVycm9yICovCi1leHRlcm4gaW50IHB3Y19nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7Ci1leHRlcm4gaW50IHB3Y19zZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKTsKLWV4dGVybiBpbnQgcHdjX2dldF9jb250cmFzdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7Ci1leHRlcm4gaW50IHB3Y19zZXRfY29udHJhc3Qoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSk7Ci1leHRlcm4gaW50IHB3Y19nZXRfZ2FtbWEoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOwotZXh0ZXJuIGludCBwd2Nfc2V0X2dhbW1hKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpOwotZXh0ZXJuIGludCBwd2NfZ2V0X3NhdHVyYXRpb24oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpOwotZXh0ZXJuIGludCBwd2Nfc2V0X3NhdHVyYXRpb24oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSk7CiBleHRlcm4gaW50IHB3Y19zZXRfbGVkcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG9uX3ZhbHVlLCBpbnQgb2ZmX3ZhbHVlKTsKIGV4dGVybiBpbnQgcHdjX2dldF9jbW9zX3NlbnNvcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpzZW5zb3IpOwotZXh0ZXJuIGludCBwd2NfcmVzdG9yZV91c2VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKLWV4dGVybiBpbnQgcHdjX3NhdmVfdXNlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7Ci1leHRlcm4gaW50IHB3Y19yZXN0b3JlX2ZhY3Rvcnkoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOworZXh0ZXJuIGludCBzZW5kX2NvbnRyb2xfbXNnKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LAorCQkJICAgIHU4IHJlcXVlc3QsIHUxNiB2YWx1ZSwgdm9pZCAqYnVmLCBpbnQgYnVmbGVuKTsKIAotLyogZXhwb3J0ZWQgZm9yIHVzZSBieSB2NGwyIGNvbnRyb2xzICovCi1leHRlcm4gaW50IHB3Y19nZXRfcmVkX2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpOwotZXh0ZXJuIGludCBwd2Nfc2V0X3JlZF9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpOwotZXh0ZXJuIGludCBwd2NfZ2V0X2JsdWVfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSk7Ci1leHRlcm4gaW50IHB3Y19zZXRfYmx1ZV9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpOwotZXh0ZXJuIGludCBwd2NfZ2V0X2F3YihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7Ci1leHRlcm4gaW50IHB3Y19zZXRfYXdiKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbW9kZSk7Ci1leHRlcm4gaW50IHB3Y19zZXRfYWdjKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbW9kZSwgaW50IHZhbHVlKTsKLWV4dGVybiBpbnQgcHdjX2dldF9hZ2Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpOwotZXh0ZXJuIGludCBwd2Nfc2V0X3NodXR0ZXJfc3BlZWQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBtb2RlLCBpbnQgdmFsdWUpOwotZXh0ZXJuIGludCBwd2NfZ2V0X3NodXR0ZXJfc3BlZWQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpOwotCi1leHRlcm4gaW50IHB3Y19zZXRfY29sb3VyX21vZGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBjb2xvdXIpOwotZXh0ZXJuIGludCBwd2NfZ2V0X2NvbG91cl9tb2RlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKmNvbG91cik7Ci1leHRlcm4gaW50IHB3Y19zZXRfY29udG91cihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGNvbnRvdXIpOwotZXh0ZXJuIGludCBwd2NfZ2V0X2NvbnRvdXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqY29udG91cik7Ci1leHRlcm4gaW50IHB3Y19zZXRfYmFja2xpZ2h0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgYmFja2xpZ2h0KTsKLWV4dGVybiBpbnQgcHdjX2dldF9iYWNrbGlnaHQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqYmFja2xpZ2h0KTsKLWV4dGVybiBpbnQgcHdjX3NldF9mbGlja2VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgZmxpY2tlcik7Ci1leHRlcm4gaW50IHB3Y19nZXRfZmxpY2tlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpmbGlja2VyKTsKLWV4dGVybiBpbnQgcHdjX3NldF9keW5hbWljX25vaXNlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbm9pc2UpOwotZXh0ZXJuIGludCBwd2NfZ2V0X2R5bmFtaWNfbm9pc2Uoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqbm9pc2UpOworLyogQ29udHJvbCBnZXQgLyBzZXQgaGVscGVycyAqLworaW50IHB3Y19nZXRfdThfY3RybChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdTggcmVxdWVzdCwgdTE2IHZhbHVlLCBpbnQgKmRhdGEpOworaW50IHB3Y19zZXRfdThfY3RybChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdTggcmVxdWVzdCwgdTE2IHZhbHVlLCB1OCBkYXRhKTsKK2ludCBwd2NfZ2V0X3M4X2N0cmwoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHU4IHJlcXVlc3QsIHUxNiB2YWx1ZSwgaW50ICpkYXRhKTsKKyNkZWZpbmUgcHdjX3NldF9zOF9jdHJsIHB3Y19zZXRfdThfY3RybAoraW50IHB3Y19nZXRfdTE2X2N0cmwoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHU4IHJlcXVlc3QsIHUxNiB2YWx1ZSwgaW50ICpkYXQpOworaW50IHB3Y19zZXRfdTE2X2N0cmwoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHU4IHJlcXVlc3QsIHUxNiB2YWx1ZSwgdTE2IGRhdGEpOworaW50IHB3Y19idXR0b25fY3RybChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdTE2IHZhbHVlKTsKK2ludCBwd2NfaW5pdF9jb250cm9scyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7CiAKIC8qIFBvd2VyIGRvd24gb3IgdXAgdGhlIGNhbWVyYTsgbm90IHN1cHBvcnRlZCBieSBhbGwgbW9kZWxzICovCi1leHRlcm4gaW50IHB3Y19jYW1lcmFfcG93ZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBwb3dlcik7CitleHRlcm4gdm9pZCBwd2NfY2FtZXJhX3Bvd2VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgcG93ZXIpOwogCiAvKiBQcml2YXRlIGlvY3RsKClzOyBzZWUgcHdjLWlvY3RsLmggKi8KIGV4dGVybiBsb25nIHB3Y19pb2N0bChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKQEAgLTM0MywxMiArMzgyLDYgQEAKIAogLyoqIHB3Yy11bmNvbXByZXNzLmMgKi8KIC8qIEV4cGFuZCBmcmFtZSB0byBpbWFnZSwgcG9zc2libHkgaW5jbHVkaW5nIGRlY29tcHJlc3Npb24uIFVzZXMgcmVhZF9mcmFtZSBhbmQgZmlsbF9pbWFnZSAqLwotZXh0ZXJuIGludCBwd2NfZGVjb21wcmVzcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KK2ludCBwd2NfZGVjb21wcmVzcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgc3RydWN0IHB3Y19mcmFtZV9idWYgKmZidWYpOwogCiAjZW5kaWYKLS8qIHZpbTogc2V0IGNpbm89IGZvcm1hdG9wdGlvbnM9Y3JvcWwgY2luZGVudCBzaGlmdHdpZHRoPTggdGFic3RvcD04OiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9weGFfY2FtZXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuYwppbmRleCBiNDJiZmE1Li5kMDdkZjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+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+cmVhZCA9IHRwczY1OTEyX3NwaV9yZWFkOworCXRwczY1OTEyLT53cml0ZSA9IHRwczY1OTEyX3NwaV93cml0ZTsKKworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHRwczY1OTEyKTsKKworCXJldHVybiB0cHM2NTkxMl9kZXZpY2VfaW5pdCh0cHM2NTkxMik7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHRwczY1OTEyX3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisKKwl0cHM2NTkxMl9kZXZpY2VfZXhpdCh0cHM2NTkxMik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHRwczY1OTEyX3NwaV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAidHBzNjU5MTIiLAorCQkuYnVzID0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJPSB0cHM2NTkxMl9zcGlfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHRwczY1OTEyX3NwaV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdHBzNjU5MTJfc3BpX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmdHBzNjU5MTJfc3BpX2RyaXZlcik7CisJaWYgKHJldCAhPSAwKQorCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBUUFM2NTkxMiBTUEkgZHJpdmVyOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiAwOworfQorLyogaW5pdCBlYXJseSBzbyBjb25zdW1lciBkZXZpY2VzIGNhbiBjb21wbGV0ZSBzeXN0ZW0gYm9vdCAqLworc3Vic3lzX2luaXRjYWxsKHRwczY1OTEyX3NwaV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHRwczY1OTEyX3NwaV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZ0cHM2NTkxMl9zcGlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHRwczY1OTEyX3NwaV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWFyZ2FyaXRhIE9sYXlhCTxtYWdpQHNsaW1sb2dpYy5jby51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU1BJIHN1cHBvcnQgZm9yIFRQUzY1OTEyIGNoaXAgZmFtaWx5IG1mZCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHdsLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3R3bC1jb3JlLmMKaW5kZXggYTJlZGRjNy4uMDFlY2ZlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdHdsLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC90d2wtY29yZS5jCkBAIC0xMjgzLDYgKzEyODMsOCBAQAogCXsgInRwczY1OTUwIiwgMCB9LAkJLyogY2F0YWxvZyB2ZXJzaW9uIG9mIHR3bDUwMzAgKi8KIAl7ICJ0cHM2NTkzMCIsIFRQU19TVUJTRVQgfSwJLyogZmV3ZXIgTERPcyBhbmQgREFDczsgbm8gY2hhcmdlciAqLwogCXsgInRwczY1OTIwIiwgVFBTX1NVQlNFVCB9LAkvKiBmZXdlciBMRE9zOyBubyBjb2RlYyBvciBjaGFyZ2VyICovCisJeyAidHBzNjU5MjEiLCBUUFNfU1VCU0VUIH0sCS8qIGZld2VyIExET3M7IG5vIGNvZGVjLCBubyBMRUQKKwkJCQkJICAgYW5kIHZpYnJhdG9yLiBDaGFyZ2VyIGluIFVTQiBtb2R1bGUqLwogCXsgInR3bDYwMzAiLCBUV0w2MDMwX0NMQVNTIH0sCS8qICJQaG9lbml4IHBvd2VyIGNoaXAiICovCiAJeyAidHdsNjAyNSIsIFRXTDYwMzBfQ0xBU1MgfCBUV0w2MDI1X1NVQkNMQVNTIH0sIC8qICJQaG9lbml4IGxpdGUiICovCiAJeyAvKiBlbmQgb2YgbGlzdCAqLyB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHdsNDAzMC1tYWRjLmMgYi9kcml2ZXJzL21mZC90d2w0MDMwLW1hZGMuYwppbmRleCAzOTQxZGRjLi5iNWQ1OThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90d2w0MDMwLW1hZGMuYworKysgYi9kcml2ZXJzL21mZC90d2w0MDMwLW1hZGMuYwpAQCAtNTMwLDEzICs1MzAsMTMgQEAKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIodHdsNDAzMF9tYWRjLT5kZXYsCiAJCQkidW5hYmxlIHRvIHdyaXRlIHNlbCByZWdpc3RlciAweCVYXG4iLCBtZXRob2QtPnNlbCArIDEpOwotCQlyZXR1cm4gcmV0OworCQlnb3RvIG91dDsKIAl9CiAJcmV0ID0gdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9NQURDLCBjaF9sc2IsIG1ldGhvZC0+c2VsKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIodHdsNDAzMF9tYWRjLT5kZXYsCiAJCQkidW5hYmxlIHRvIHdyaXRlIHNlbCByZWdpc3RlciAweCVYXG4iLCBtZXRob2QtPnNlbCArIDEpOwotCQlyZXR1cm4gcmV0OworCQlnb3RvIG91dDsKIAl9CiAJLyogU2VsZWN0IGF2ZXJhZ2luZyBmb3IgYWxsIGNoYW5uZWxzIGlmIGRvX2F2ZyBpcyBzZXQgKi8KIAlpZiAocmVxLT5kb19hdmcpIHsKQEAgLTU0Niw3ICs1NDYsNyBAQAogCQkJZGV2X2Vycih0d2w0MDMwX21hZGMtPmRldiwKIAkJCQkidW5hYmxlIHRvIHdyaXRlIGF2ZyByZWdpc3RlciAweCVYXG4iLAogCQkJCW1ldGhvZC0+YXZnICsgMSk7Ci0JCQlyZXR1cm4gcmV0OworCQkJZ290byBvdXQ7CiAJCX0KIAkJcmV0ID0gdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9NQURDLAogCQkJCSAgICAgICBjaF9sc2IsIG1ldGhvZC0+YXZnKTsKQEAgLTU1NCw3ICs1NTQsNyBAQAogCQkJZGV2X2Vycih0d2w0MDMwX21hZGMtPmRldiwKIAkJCQkidW5hYmxlIHRvIHdyaXRlIHNlbCByZWcgMHglWFxuIiwKIAkJCQltZXRob2QtPnNlbCArIDEpOwotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gb3V0OwogCQl9CiAJfQogCWlmIChyZXEtPnR5cGUgPT0gVFdMNDAzMF9NQURDX0lSUV9PTkVTSE9UICYmIHJlcS0+ZnVuY19jYiAhPSBOVUxMKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90d2w2MDMwLXB3bS5jIGIvZHJpdmVycy9tZmQvdHdsNjAzMC1wd20uYwppbmRleCA1ZDI1YmRjLi5lOGZlZTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90d2w2MDMwLXB3bS5jCisrKyBiL2RyaXZlcnMvbWZkL3R3bDYwMzAtcHdtLmMKQEAgLTE2MSwzICsxNjEsNSBAQAogCWtmcmVlKHB3bSk7CiB9CiBFWFBPUlRfU1lNQk9MKHB3bV9mcmVlKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd204MzF4LWF1eGFkYy5jIGIvZHJpdmVycy9tZmQvd204MzF4LWF1eGFkYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MjEwOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC93bTgzMXgtYXV4YWRjLmMKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiB3bTgzMXgtYXV4YWRjLmMgIC0tICBBVVhBREMgZm9yIFdvbGZzb24gV004MzF4IFBNSUNzCisgKgorICogQ29weXJpZ2h0IDIwMDktMjAxMSBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICoKKyAqIEF1dGhvcjogTWFyayBCcm93biA8YnJvb25pZUBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzMXgvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzMXgvcGRhdGEuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzF4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzMXgvYXV4YWRjLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODMxeC9vdHAuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzF4L3JlZ3VsYXRvci5oPgorCitzdHJ1Y3Qgd204MzF4X2F1eGFkY19yZXEgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwllbnVtIHdtODMxeF9hdXhhZGMgaW5wdXQ7CisJaW50IHZhbDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOworfTsKKworc3RhdGljIGludCB3bTgzMXhfYXV4YWRjX3JlYWRfaXJxKHN0cnVjdCB3bTgzMXggKndtODMxeCwKKwkJCQkgIGVudW0gd204MzF4X2F1eGFkYyBpbnB1dCkKK3sKKwlzdHJ1Y3Qgd204MzF4X2F1eGFkY19yZXEgKnJlcTsKKwlpbnQgcmV0OworCWJvb2wgZW5hID0gZmFsc2U7CisKKwlyZXEgPSBremFsbG9jKHNpemVvZigqcmVxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXEpCisJCXJldHVybiAtRU5PTUVNOworCisJaW5pdF9jb21wbGV0aW9uKCZyZXEtPmRvbmUpOworCXJlcS0+aW5wdXQgPSBpbnB1dDsKKwlyZXEtPnZhbCA9IC1FVElNRURPVVQ7CisKKwltdXRleF9sb2NrKCZ3bTgzMXgtPmF1eGFkY19sb2NrKTsKKworCS8qIEVucXVldWUgdGhlIHJlcXVlc3QgKi8KKwlsaXN0X2FkZCgmcmVxLT5saXN0LCAmd204MzF4LT5hdXhhZGNfcGVuZGluZyk7CisKKwllbmEgPSAhd204MzF4LT5hdXhhZGNfYWN0aXZlOworCisJaWYgKGVuYSkgeworCQlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfQVVYQURDX0NPTlRST0wsCisJCQkJICAgICAgV004MzFYX0FVWF9FTkEsIFdNODMxWF9BVVhfRU5BKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBBVVhBREM6ICVkXG4iLAorCQkJCXJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIEVuYWJsZSB0aGUgY29udmVyc2lvbiBpZiBub3QgYWxyZWFkeSBydW5uaW5nICovCisJaWYgKCEod204MzF4LT5hdXhhZGNfYWN0aXZlICYgKDEgPDwgaW5wdXQpKSkgeworCQlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfQVVYQURDX1NPVVJDRSwKKwkJCQkgICAgICAxIDw8IGlucHV0LCAxIDw8IGlucHV0KTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlkZXZfZXJyKHdtODMxeC0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gc2V0IEFVWEFEQyBzb3VyY2U6ICVkXG4iLCByZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQl3bTgzMXgtPmF1eGFkY19hY3RpdmUgfD0gMSA8PCBpbnB1dDsKKwl9CisKKwkvKiBXZSBjb252ZXJ0IGF0IHRoZSBmYXN0ZXN0IHJhdGUgcG9zc2libGUgKi8KKwlpZiAoZW5hKSB7CisJCXJldCA9IHdtODMxeF9zZXRfYml0cyh3bTgzMXgsIFdNODMxWF9BVVhBRENfQ09OVFJPTCwKKwkJCQkgICAgICBXTTgzMVhfQVVYX0NWVF9FTkEgfAorCQkJCSAgICAgIFdNODMxWF9BVVhfUkFURV9NQVNLLAorCQkJCSAgICAgIFdNODMxWF9BVVhfQ1ZUX0VOQSB8CisJCQkJICAgICAgV004MzFYX0FVWF9SQVRFX01BU0spOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gc3RhcnQgQVVYQURDOiAlZFxuIiwKKwkJCQlyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJndtODMxeC0+YXV4YWRjX2xvY2spOworCisJLyogV2FpdCBmb3IgYW4gaW50ZXJydXB0ICovCisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZyZXEtPmRvbmUsIG1zZWNzX3RvX2ppZmZpZXMoNTAwKSk7CisKKwltdXRleF9sb2NrKCZ3bTgzMXgtPmF1eGFkY19sb2NrKTsKKworCWxpc3RfZGVsKCZyZXEtPmxpc3QpOworCXJldCA9IHJlcS0+dmFsOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ3bTgzMXgtPmF1eGFkY19sb2NrKTsKKworCWtmcmVlKHJlcSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgd204MzF4X2F1eGFkY19pcnEoaW50IGlycSwgdm9pZCAqaXJxX2RhdGEpCit7CisJc3RydWN0IHdtODMxeCAqd204MzF4ID0gaXJxX2RhdGE7CisJc3RydWN0IHdtODMxeF9hdXhhZGNfcmVxICpyZXE7CisJaW50IHJldCwgaW5wdXQsIHZhbDsKKworCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9BVVhBRENfREFUQSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycih3bTgzMXgtPmRldiwKKwkJCSJGYWlsZWQgdG8gcmVhZCBBVVhBREMgZGF0YTogJWRcbiIsIHJldCk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpbnB1dCA9ICgocmV0ICYgV004MzFYX0FVWF9EQVRBX1NSQ19NQVNLKQorCQkgPj4gV004MzFYX0FVWF9EQVRBX1NSQ19TSElGVCkgLSAxOworCisJaWYgKGlucHV0ID09IDE0KQorCQlpbnB1dCA9IFdNODMxWF9BVVhfQ0FMOworCisJdmFsID0gcmV0ICYgV004MzFYX0FVWF9EQVRBX01BU0s7CisKKwltdXRleF9sb2NrKCZ3bTgzMXgtPmF1eGFkY19sb2NrKTsKKworCS8qIERpc2FibGUgdGhpcyBjb252ZXJzaW9uLCB3ZSdyZSBhYm91dCB0byBjb21wbGV0ZSBhbGwgdXNlcnMgKi8KKwl3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfQVVYQURDX1NPVVJDRSwKKwkJCTEgPDwgaW5wdXQsIDApOworCXdtODMxeC0+YXV4YWRjX2FjdGl2ZSAmPSB+KDEgPDwgaW5wdXQpOworCisJLyogVHVybiBvZmYgdGhlIGVudGlyZSBjb252ZXJ0b3IgaWYgaWRsZSAqLworCWlmICghd204MzF4LT5hdXhhZGNfYWN0aXZlKQorCQl3bTgzMXhfcmVnX3dyaXRlKHdtODMxeCwgV004MzFYX0FVWEFEQ19DT05UUk9MLCAwKTsKKworCS8qIFdha2UgdXAgYW55IHRocmVhZHMgd2FpdGluZyBmb3IgdGhpcyByZXF1ZXN0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXEsICZ3bTgzMXgtPmF1eGFkY19wZW5kaW5nLCBsaXN0KSB7CisJCWlmIChyZXEtPmlucHV0ID09IGlucHV0KSB7CisJCQlyZXEtPnZhbCA9IHZhbDsKKwkJCWNvbXBsZXRlKCZyZXEtPmRvbmUpOworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZ3bTgzMXgtPmF1eGFkY19sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCB3bTgzMXhfYXV4YWRjX3JlYWRfcG9sbGVkKHN0cnVjdCB3bTgzMXggKndtODMxeCwKKwkJCQkgICAgIGVudW0gd204MzF4X2F1eGFkYyBpbnB1dCkKK3sKKwlpbnQgcmV0LCBzcmMsIHRpbWVvdXQ7CisKKwltdXRleF9sb2NrKCZ3bTgzMXgtPmF1eGFkY19sb2NrKTsKKworCXJldCA9IHdtODMxeF9zZXRfYml0cyh3bTgzMXgsIFdNODMxWF9BVVhBRENfQ09OVFJPTCwKKwkJCSAgICAgIFdNODMxWF9BVVhfRU5BLCBXTTgzMVhfQVVYX0VOQSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgQVVYQURDOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogV2UgZm9yY2UgYSBzaW5nbGUgc291cmNlIGF0IHByZXNlbnQgKi8KKwlzcmMgPSBpbnB1dDsKKwlyZXQgPSB3bTgzMXhfcmVnX3dyaXRlKHdtODMxeCwgV004MzFYX0FVWEFEQ19TT1VSQ0UsCisJCQkgICAgICAgMSA8PCBzcmMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gc2V0IEFVWEFEQyBzb3VyY2U6ICVkXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfQVVYQURDX0NPTlRST0wsCisJCQkgICAgICBXTTgzMVhfQVVYX0NWVF9FTkEsIFdNODMxWF9BVVhfQ1ZUX0VOQSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byBzdGFydCBBVVhBREM6ICVkXG4iLCByZXQpOworCQlnb3RvIGRpc2FibGU7CisJfQorCisJLyogSWYgd2UncmUgbm90IHVzaW5nIGludGVycnVwdHMgdGhlbiBwb2xsIHRoZQorCSAqIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKwl0aW1lb3V0ID0gNTsKKwl3aGlsZSAodGltZW91dCkgeworCQltc2xlZXAoMSk7CisKKwkJcmV0ID0gd204MzF4X3JlZ19yZWFkKHdtODMxeCwKKwkJCQkgICAgICBXTTgzMVhfSU5URVJSVVBUX1NUQVRVU18xKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIod204MzF4LT5kZXYsCisJCQkJIklTUiAxIHJlYWQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gZGlzYWJsZTsKKwkJfQorCisJCS8qIERpZCBpdCBjb21wbGV0ZT8gKi8KKwkJaWYgKHJldCAmIFdNODMxWF9BVVhBRENfREFUQV9FSU5UKSB7CisJCQl3bTgzMXhfcmVnX3dyaXRlKHdtODMxeCwKKwkJCQkJIFdNODMxWF9JTlRFUlJVUFRfU1RBVFVTXzEsCisJCQkJCSBXTTgzMVhfQVVYQURDX0RBVEFfRUlOVCk7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIod204MzF4LT5kZXYsCisJCQkJIkFVWEFEQyBjb252ZXJzaW9uIHRpbWVvdXRcbiIpOworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBkaXNhYmxlOworCQl9CisJfQorCisJcmV0ID0gd204MzF4X3JlZ19yZWFkKHdtODMxeCwgV004MzFYX0FVWEFEQ19EQVRBKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHdtODMxeC0+ZGV2LAorCQkJIkZhaWxlZCB0byByZWFkIEFVWEFEQyBkYXRhOiAlZFxuIiwgcmV0KTsKKwkJZ290byBkaXNhYmxlOworCX0KKworCXNyYyA9ICgocmV0ICYgV004MzFYX0FVWF9EQVRBX1NSQ19NQVNLKQorCSAgICAgICA+PiBXTTgzMVhfQVVYX0RBVEFfU1JDX1NISUZUKSAtIDE7CisKKwlpZiAoc3JjID09IDE0KQorCQlzcmMgPSBXTTgzMVhfQVVYX0NBTDsKKworCWlmIChzcmMgIT0gaW5wdXQpIHsKKwkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkRhdGEgZnJvbSBzb3VyY2UgJWQgbm90ICVkXG4iLAorCQkJc3JjLCBpbnB1dCk7CisJCXJldCA9IC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJcmV0ICY9IFdNODMxWF9BVVhfREFUQV9NQVNLOworCX0KKworZGlzYWJsZToKKwl3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfQVVYQURDX0NPTlRST0wsIFdNODMxWF9BVVhfRU5BLCAwKTsKK291dDoKKwltdXRleF91bmxvY2soJndtODMxeC0+YXV4YWRjX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogd204MzF4X2F1eGFkY19yZWFkOiBSZWFkIGEgdmFsdWUgZnJvbSB0aGUgV004MzF4IEFVWEFEQworICoKKyAqIEB3bTgzMXg6IERldmljZSB0byByZWFkIGZyb20uCisgKiBAaW5wdXQ6IEFVWEFEQyBpbnB1dCB0byByZWFkLgorICovCitpbnQgd204MzF4X2F1eGFkY19yZWFkKHN0cnVjdCB3bTgzMXggKndtODMxeCwgZW51bSB3bTgzMXhfYXV4YWRjIGlucHV0KQoreworCXJldHVybiB3bTgzMXgtPmF1eGFkY19yZWFkKHdtODMxeCwgaW5wdXQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwod204MzF4X2F1eGFkY19yZWFkKTsKKworLyoqCisgKiB3bTgzMXhfYXV4YWRjX3JlYWRfdXY6IFJlYWQgYSB2b2x0YWdlIGZyb20gdGhlIFdNODMxeCBBVVhBREMKKyAqCisgKiBAd204MzF4OiBEZXZpY2UgdG8gcmVhZCBmcm9tLgorICogQGlucHV0OiBBVVhBREMgaW5wdXQgdG8gcmVhZC4KKyAqLworaW50IHdtODMxeF9hdXhhZGNfcmVhZF91dihzdHJ1Y3Qgd204MzF4ICp3bTgzMXgsIGVudW0gd204MzF4X2F1eGFkYyBpbnB1dCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gd204MzF4X2F1eGFkY19yZWFkKHdtODMxeCwgaW5wdXQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ICo9IDE0NjU7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwod204MzF4X2F1eGFkY19yZWFkX3V2KTsKKwordm9pZCB3bTgzMXhfYXV4YWRjX2luaXQoc3RydWN0IHdtODMxeCAqd204MzF4KQoreworCWludCByZXQ7CisKKwltdXRleF9pbml0KCZ3bTgzMXgtPmF1eGFkY19sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmd204MzF4LT5hdXhhZGNfcGVuZGluZyk7CisKKwlpZiAod204MzF4LT5pcnEgJiYgd204MzF4LT5pcnFfYmFzZSkgeworCQl3bTgzMXgtPmF1eGFkY19yZWFkID0gd204MzF4X2F1eGFkY19yZWFkX2lycTsKKworCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycSh3bTgzMXgtPmlycV9iYXNlICsKKwkJCQkJICAgV004MzFYX0lSUV9BVVhBRENfREFUQSwKKwkJCQkJICAgTlVMTCwgd204MzF4X2F1eGFkY19pcnEsIDAsCisJCQkJCSAgICJhdXhhZGMiLCB3bTgzMXgpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkFVWEFEQyBJUlEgcmVxdWVzdCBmYWlsZWQ6ICVkXG4iLAorCQkJCXJldCk7CisJCQl3bTgzMXgtPmF1eGFkY19yZWFkID0gTlVMTDsKKwkJfQorCX0KKworCWlmICghd204MzF4LT5hdXhhZGNfcmVhZCkKKwkJd204MzF4LT5hdXhhZGNfcmVhZCA9IHdtODMxeF9hdXhhZGNfcmVhZF9wb2xsZWQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93bTgzMXgtY29yZS5jIGIvZHJpdmVycy9tZmQvd204MzF4LWNvcmUuYwppbmRleCAyNjVmNzVmLi4yODJlNzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93bTgzMXgtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL3dtODMxeC1jb3JlLmMKQEAgLTI5NSw3ICsyOTUsNyBAQAogCQlnb3RvIG91dDsKIAogCXIgJj0gfm1hc2s7Ci0JciB8PSB2YWw7CisJciB8PSB2YWwgJiBtYXNrOwogCiAJcmV0ID0gd204MzF4X3dyaXRlKHdtODMxeCwgcmVnLCAyLCAmcik7CiAKQEAgLTMwNiwxNDYgKzMwNiw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh3bTgzMXhfc2V0X2JpdHMpOwogCi0vKioKLSAqIHdtODMxeF9hdXhhZGNfcmVhZDogUmVhZCBhIHZhbHVlIGZyb20gdGhlIFdNODMxeCBBVVhBREMKLSAqCi0gKiBAd204MzF4OiBEZXZpY2UgdG8gcmVhZCBmcm9tLgotICogQGlucHV0OiBBVVhBREMgaW5wdXQgdG8gcmVhZC4KLSAqLwotaW50IHdtODMxeF9hdXhhZGNfcmVhZChzdHJ1Y3Qgd204MzF4ICp3bTgzMXgsIGVudW0gd204MzF4X2F1eGFkYyBpbnB1dCkKLXsKLQlpbnQgcmV0LCBzcmMsIGlycV9tYXNrZWQsIHRpbWVvdXQ7Ci0KLQkvKiBBcmUgd2UgdXNpbmcgdGhlIGludGVycnVwdD8gKi8KLQlpcnFfbWFza2VkID0gd204MzF4X3JlZ19yZWFkKHdtODMxeCwgV004MzFYX0lOVEVSUlVQVF9TVEFUVVNfMV9NQVNLKTsKLQlpcnFfbWFza2VkICY9IFdNODMxWF9BVVhBRENfREFUQV9FSU5UOwotCi0JbXV0ZXhfbG9jaygmd204MzF4LT5hdXhhZGNfbG9jayk7Ci0KLQlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfQVVYQURDX0NPTlRST0wsCi0JCQkgICAgICBXTTgzMVhfQVVYX0VOQSwgV004MzFYX0FVWF9FTkEpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIEFVWEFEQzogJWRcbiIsIHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIFdlIGZvcmNlIGEgc2luZ2xlIHNvdXJjZSBhdCBwcmVzZW50ICovCi0Jc3JjID0gaW5wdXQ7Ci0JcmV0ID0gd204MzF4X3JlZ193cml0ZSh3bTgzMXgsIFdNODMxWF9BVVhBRENfU09VUkNFLAotCQkJICAgICAgIDEgPDwgc3JjKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiRmFpbGVkIHRvIHNldCBBVVhBREMgc291cmNlOiAlZFxuIiwgcmV0KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogQ2xlYXIgYW55IG5vdGlmaWNhdGlvbiBmcm9tIGEgdmVyeSBsYXRlIGFycml2aW5nIGludGVycnVwdCAqLwotCXRyeV93YWl0X2Zvcl9jb21wbGV0aW9uKCZ3bTgzMXgtPmF1eGFkY19kb25lKTsKLQotCXJldCA9IHdtODMxeF9zZXRfYml0cyh3bTgzMXgsIFdNODMxWF9BVVhBRENfQ09OVFJPTCwKLQkJCSAgICAgIFdNODMxWF9BVVhfQ1ZUX0VOQSwgV004MzFYX0FVWF9DVlRfRU5BKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiRmFpbGVkIHRvIHN0YXJ0IEFVWEFEQzogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZGlzYWJsZTsKLQl9Ci0KLQlpZiAoaXJxX21hc2tlZCkgewotCQkvKiBJZiB3ZSdyZSBub3QgdXNpbmcgaW50ZXJydXB0cyB0aGVuIHBvbGwgdGhlCi0JCSAqIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQkJdGltZW91dCA9IDU7Ci0JCXdoaWxlICh0aW1lb3V0KSB7Ci0JCQltc2xlZXAoMSk7Ci0KLQkJCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsCi0JCQkJCSAgICAgIFdNODMxWF9JTlRFUlJVUFRfU1RBVFVTXzEpOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlkZXZfZXJyKHdtODMxeC0+ZGV2LAotCQkJCQkiSVNSIDEgcmVhZCBmYWlsZWQ6ICVkXG4iLCByZXQpOwotCQkJCWdvdG8gZGlzYWJsZTsKLQkJCX0KLQotCQkJLyogRGlkIGl0IGNvbXBsZXRlPyAqLwotCQkJaWYgKHJldCAmIFdNODMxWF9BVVhBRENfREFUQV9FSU5UKSB7Ci0JCQkJd204MzF4X3JlZ193cml0ZSh3bTgzMXgsCi0JCQkJCQkgV004MzFYX0lOVEVSUlVQVF9TVEFUVVNfMSwKLQkJCQkJCSBXTTgzMVhfQVVYQURDX0RBVEFfRUlOVCk7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCWRldl9lcnIod204MzF4LT5kZXYsCi0JCQkJCSJBVVhBREMgY29udmVyc2lvbiB0aW1lb3V0XG4iKTsKLQkJCQlyZXQgPSAtRUJVU1k7Ci0JCQkJZ290byBkaXNhYmxlOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJLyogSWYgd2UgYXJlIHVzaW5nIGludGVycnVwdHMgdGhlbiB3YWl0IGZvciB0aGUKLQkJICogaW50ZXJydXB0IHRvIGNvbXBsZXRlLiAgVXNlIGFuIGV4dHJlbWVseSBsb25nCi0JCSAqIHRpbWVvdXQgdG8gaGFuZGxlIHNpdHVhdGlvbnMgd2l0aCBoZWF2eSBsb2FkIHdoZXJlCi0JCSAqIHRoZSBub3RpZmljYXRpb24gb2YgdGhlIGludGVycnVwdCBtYXkgYmUgZGVsYXllZCBieQotCQkgKiB0aHJlYWRlZCBJUlEgaGFuZGxpbmcuICovCi0JCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ3bTgzMXgtPmF1eGFkY19kb25lLAotCQkJCQkJIG1zZWNzX3RvX2ppZmZpZXMoNTAwKSkpIHsKLQkJCWRldl9lcnIod204MzF4LT5kZXYsICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgQVVYQURDXG4iKTsKLQkJCXJldCA9IC1FQlVTWTsKLQkJCWdvdG8gZGlzYWJsZTsKLQkJfQotCX0KLQotCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9BVVhBRENfREFUQSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byByZWFkIEFVWEFEQyBkYXRhOiAlZFxuIiwgcmV0KTsKLQl9IGVsc2UgewotCQlzcmMgPSAoKHJldCAmIFdNODMxWF9BVVhfREFUQV9TUkNfTUFTSykKLQkJICAgICAgID4+IFdNODMxWF9BVVhfREFUQV9TUkNfU0hJRlQpIC0gMTsKLQotCQlpZiAoc3JjID09IDE0KQotCQkJc3JjID0gV004MzFYX0FVWF9DQUw7Ci0KLQkJaWYgKHNyYyAhPSBpbnB1dCkgewotCQkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkRhdGEgZnJvbSBzb3VyY2UgJWQgbm90ICVkXG4iLAotCQkJCXNyYywgaW5wdXQpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJfSBlbHNlIHsKLQkJCXJldCAmPSBXTTgzMVhfQVVYX0RBVEFfTUFTSzsKLQkJfQotCX0KLQotZGlzYWJsZToKLQl3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfQVVYQURDX0NPTlRST0wsIFdNODMxWF9BVVhfRU5BLCAwKTsKLW91dDoKLQltdXRleF91bmxvY2soJndtODMxeC0+YXV4YWRjX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh3bTgzMXhfYXV4YWRjX3JlYWQpOwotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgd204MzF4X2F1eGFkY19pcnEoaW50IGlycSwgdm9pZCAqaXJxX2RhdGEpCi17Ci0Jc3RydWN0IHdtODMxeCAqd204MzF4ID0gaXJxX2RhdGE7Ci0KLQljb21wbGV0ZSgmd204MzF4LT5hdXhhZGNfZG9uZSk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qKgotICogd204MzF4X2F1eGFkY19yZWFkX3V2OiBSZWFkIGEgdm9sdGFnZSBmcm9tIHRoZSBXTTgzMXggQVVYQURDCi0gKgotICogQHdtODMxeDogRGV2aWNlIHRvIHJlYWQgZnJvbS4KLSAqIEBpbnB1dDogQVVYQURDIGlucHV0IHRvIHJlYWQuCi0gKi8KLWludCB3bTgzMXhfYXV4YWRjX3JlYWRfdXYoc3RydWN0IHdtODMxeCAqd204MzF4LCBlbnVtIHdtODMxeF9hdXhhZGMgaW5wdXQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IHdtODMxeF9hdXhhZGNfcmVhZCh3bTgzMXgsIGlucHV0KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCAqPSAxNDY1OwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHdtODMxeF9hdXhhZGNfcmVhZF91dik7Ci0KIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugd204MzF4X2RjZGMxX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gV004MzFYX0RDMV9DT05UUk9MXzEsCkBAIC04NzIsNiArNzMyLDkgQEAKIAkJLnJlc291cmNlcyA9IHdtODMxeF9kY2RjNF9yZXNvdXJjZXMsCiAJfSwKIAl7CisJCS5uYW1lID0gIndtODMxeC1jbGsiLAorCX0sCisJewogCQkubmFtZSA9ICJ3bTgzMXgtZXBlIiwKIAkJLmlkID0gMSwKIAl9LApAQCAtOTc2LDExICs4MzksNiBAQAogCQkucmVzb3VyY2VzID0gd204MzF4X3Bvd2VyX3Jlc291cmNlcywKIAl9LAogCXsKLQkJLm5hbWUgPSAid204MzF4LXJ0YyIsCi0JCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfcnRjX3Jlc291cmNlcyksCi0JCS5yZXNvdXJjZXMgPSB3bTgzMXhfcnRjX3Jlc291cmNlcywKLQl9LAotCXsKIAkJLm5hbWUgPSAid204MzF4LXN0YXR1cyIsCiAJCS5pZCA9IDEsCiAJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfc3RhdHVzMV9yZXNvdXJjZXMpLApAQCAtMTAyOCw2ICs4ODYsOSBAQAogCQkucmVzb3VyY2VzID0gd204MzF4X2RjZGM0X3Jlc291cmNlcywKIAl9LAogCXsKKwkJLm5hbWUgPSAid204MzF4LWNsayIsCisJfSwKKwl7CiAJCS5uYW1lID0gIndtODMxeC1lcGUiLAogCQkuaWQgPSAxLAogCX0sCkBAIC0xMTA4LDExICs5NjksNiBAQAogCQkucmVzb3VyY2VzID0gd204MzF4X3Bvd2VyX3Jlc291cmNlcywKIAl9LAogCXsKLQkJLm5hbWUgPSAid204MzF4LXJ0YyIsCi0JCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfcnRjX3Jlc291cmNlcyksCi0JCS5yZXNvdXJjZXMgPSB3bTgzMXhfcnRjX3Jlc291cmNlcywKLQl9LAotCXsKIAkJLm5hbWUgPSAid204MzF4LXN0YXR1cyIsCiAJCS5pZCA9IDEsCiAJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfc3RhdHVzMV9yZXNvdXJjZXMpLApAQCAtMTEyNSwxMSArOTgxLDYgQEAKIAkJLnJlc291cmNlcyA9IHdtODMxeF9zdGF0dXMyX3Jlc291cmNlcywKIAl9LAogCXsKLQkJLm5hbWUgPSAid204MzF4LXRvdWNoIiwKLQkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHdtODMxeF90b3VjaF9yZXNvdXJjZXMpLAotCQkucmVzb3VyY2VzID0gd204MzF4X3RvdWNoX3Jlc291cmNlcywKLQl9LAotCXsKIAkJLm5hbWUgPSAid204MzF4LXdhdGNoZG9nIiwKIAkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHdtODMxeF93ZHRfcmVzb3VyY2VzKSwKIAkJLnJlc291cmNlcyA9IHdtODMxeF93ZHRfcmVzb3VyY2VzLApAQCAtMTE2NSw2ICsxMDE2LDkgQEAKIAkJLnJlc291cmNlcyA9IHdtODMxeF9kY2RjNF9yZXNvdXJjZXMsCiAJfSwKIAl7CisJCS5uYW1lID0gIndtODMxeC1jbGsiLAorCX0sCisJewogCQkubmFtZSA9ICJ3bTgzMXgtZXBlIiwKIAkJLmlkID0gMSwKIAl9LApAQCAtMTI2OSwxMSArMTEyMyw2IEBACiAJCS5yZXNvdXJjZXMgPSB3bTgzMXhfcG93ZXJfcmVzb3VyY2VzLAogCX0sCiAJewotCQkubmFtZSA9ICJ3bTgzMXgtcnRjIiwKLQkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHdtODMxeF9ydGNfcmVzb3VyY2VzKSwKLQkJLnJlc291cmNlcyA9IHdtODMxeF9ydGNfcmVzb3VyY2VzLAotCX0sCi0JewogCQkubmFtZSA9ICJ3bTgzMXgtc3RhdHVzIiwKIAkJLmlkID0gMSwKIAkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHdtODMxeF9zdGF0dXMxX3Jlc291cmNlcyksCkBAIC0xMjg2LDExICsxMTM1LDYgQEAKIAkJLnJlc291cmNlcyA9IHdtODMxeF9zdGF0dXMyX3Jlc291cmNlcywKIAl9LAogCXsKLQkJLm5hbWUgPSAid204MzF4LXRvdWNoIiwKLQkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHdtODMxeF90b3VjaF9yZXNvdXJjZXMpLAotCQkucmVzb3VyY2VzID0gd204MzF4X3RvdWNoX3Jlc291cmNlcywKLQl9LAotCXsKIAkJLm5hbWUgPSAid204MzF4LXdhdGNoZG9nIiwKIAkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHdtODMxeF93ZHRfcmVzb3VyY2VzKSwKIAkJLnJlc291cmNlcyA9IHdtODMxeF93ZHRfcmVzb3VyY2VzLApAQCAtMTMyNiw2ICsxMTcwLDkgQEAKIAkJLnJlc291cmNlcyA9IHdtODMyMF9kY2RjNF9idWNrX3Jlc291cmNlcywKIAl9LAogCXsKKwkJLm5hbWUgPSAid204MzF4LWNsayIsCisJfSwKKwl7CiAJCS5uYW1lID0gIndtODMxeC1ncGlvIiwKIAkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHdtODMxeF9ncGlvX3Jlc291cmNlcyksCiAJCS5yZXNvdXJjZXMgPSB3bTgzMXhfZ3Bpb19yZXNvdXJjZXMsCkBAIC0xNDA1LDExICsxMjUyLDYgQEAKIAkJLnJlc291cmNlcyA9IHdtODMxeF9vbl9yZXNvdXJjZXMsCiAJfSwKIAl7Ci0JCS5uYW1lID0gIndtODMxeC1ydGMiLAotCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUod204MzF4X3J0Y19yZXNvdXJjZXMpLAotCQkucmVzb3VyY2VzID0gd204MzF4X3J0Y19yZXNvdXJjZXMsCi0JfSwKLQl7CiAJCS5uYW1lID0gIndtODMxeC1zdGF0dXMiLAogCQkuaWQgPSAxLAogCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUod204MzF4X3N0YXR1czFfcmVzb3VyY2VzKSwKQEAgLTE0MjgsNiArMTI3MCwyMiBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IG1mZF9jZWxsIHRvdWNoX2RldnNbXSA9IHsKKwl7CisJCS5uYW1lID0gIndtODMxeC10b3VjaCIsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfdG91Y2hfcmVzb3VyY2VzKSwKKwkJLnJlc291cmNlcyA9IHdtODMxeF90b3VjaF9yZXNvdXJjZXMsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWZkX2NlbGwgcnRjX2RldnNbXSA9IHsKKwl7CisJCS5uYW1lID0gIndtODMxeC1ydGMiLAorCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUod204MzF4X3J0Y19yZXNvdXJjZXMpLAorCQkucmVzb3VyY2VzID0gd204MzF4X3J0Y19yZXNvdXJjZXMsCisJfSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgbWZkX2NlbGwgYmFja2xpZ2h0X2RldnNbXSA9IHsKIAl7CiAJCS5uYW1lID0gIndtODMxeC1iYWNrbGlnaHQiLApAQCAtMTQ0MCwxNCArMTI5OCwxMiBAQAogaW50IHdtODMxeF9kZXZpY2VfaW5pdChzdHJ1Y3Qgd204MzF4ICp3bTgzMXgsIHVuc2lnbmVkIGxvbmcgaWQsIGludCBpcnEpCiB7CiAJc3RydWN0IHdtODMxeF9wZGF0YSAqcGRhdGEgPSB3bTgzMXgtPmRldi0+cGxhdGZvcm1fZGF0YTsKLQlpbnQgcmV2OworCWludCByZXYsIHdtODMxeF9udW07CiAJZW51bSB3bTgzMXhfcGFyZW50IHBhcmVudDsKIAlpbnQgcmV0LCBpOwogCiAJbXV0ZXhfaW5pdCgmd204MzF4LT5pb19sb2NrKTsKIAltdXRleF9pbml0KCZ3bTgzMXgtPmtleV9sb2NrKTsKLQltdXRleF9pbml0KCZ3bTgzMXgtPmF1eGFkY19sb2NrKTsKLQlpbml0X2NvbXBsZXRpb24oJndtODMxeC0+YXV4YWRjX2RvbmUpOwogCWRldl9zZXRfZHJ2ZGF0YSh3bTgzMXgtPmRldiwgd204MzF4KTsKIAogCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9QQVJFTlRfSUQpOwpAQCAtMTU5Miw0NSArMTQ0OCw1MSBAQAogCQl9CiAJfQogCisJLyogTXVsdGlwbHkgYnkgMTAgYXMgd2UgaGF2ZSBtYW55IHN1YmRldmljZXMgb2YgdGhlIHNhbWUgdHlwZSAqLworCWlmIChwZGF0YSAmJiBwZGF0YS0+d204MzF4X251bSkKKwkJd204MzF4X251bSA9IHBkYXRhLT53bTgzMXhfbnVtICogMTA7CisJZWxzZQorCQl3bTgzMXhfbnVtID0gLTE7CisKIAlyZXQgPSB3bTgzMXhfaXJxX2luaXQod204MzF4LCBpcnEpOwogCWlmIChyZXQgIT0gMCkKIAkJZ290byBlcnI7CiAKLQlpZiAod204MzF4LT5pcnFfYmFzZSkgewotCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycSh3bTgzMXgtPmlycV9iYXNlICsKLQkJCQkJICAgV004MzFYX0lSUV9BVVhBRENfREFUQSwKLQkJCQkJICAgTlVMTCwgd204MzF4X2F1eGFkY19pcnEsIDAsCi0JCQkJCSAgICJhdXhhZGMiLCB3bTgzMXgpOwotCQlpZiAocmV0IDwgMCkKLQkJCWRldl9lcnIod204MzF4LT5kZXYsICJBVVhBREMgSVJRIHJlcXVlc3QgZmFpbGVkOiAlZFxuIiwKLQkJCQlyZXQpOwotCX0KKwl3bTgzMXhfYXV4YWRjX2luaXQod204MzF4KTsKIAogCS8qIFRoZSBjb3JlIGRldmljZSBpcyB1cCwgaW5zdGFudGlhdGUgdGhlIHN1YmRldmljZXMuICovCiAJc3dpdGNoIChwYXJlbnQpIHsKIAljYXNlIFdNODMxMDoKLQkJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKHdtODMxeC0+ZGV2LCAtMSwKKwkJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKHdtODMxeC0+ZGV2LCB3bTgzMXhfbnVtLAogCQkJCSAgICAgIHdtODMxMF9kZXZzLCBBUlJBWV9TSVpFKHdtODMxMF9kZXZzKSwKIAkJCQkgICAgICBOVUxMLCB3bTgzMXgtPmlycV9iYXNlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdNODMxMToKLQkJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKHdtODMxeC0+ZGV2LCAtMSwKKwkJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKHdtODMxeC0+ZGV2LCB3bTgzMXhfbnVtLAogCQkJCSAgICAgIHdtODMxMV9kZXZzLCBBUlJBWV9TSVpFKHdtODMxMV9kZXZzKSwKIAkJCQkgICAgICBOVUxMLCB3bTgzMXgtPmlycV9iYXNlKTsKKwkJaWYgKCFwZGF0YSB8fCAhcGRhdGEtPmRpc2FibGVfdG91Y2gpCisJCQltZmRfYWRkX2RldmljZXMod204MzF4LT5kZXYsIHdtODMxeF9udW0sCisJCQkJCXRvdWNoX2RldnMsIEFSUkFZX1NJWkUodG91Y2hfZGV2cyksCisJCQkJCU5VTEwsIHdtODMxeC0+aXJxX2Jhc2UpOwogCQlicmVhazsKIAogCWNhc2UgV004MzEyOgotCQlyZXQgPSBtZmRfYWRkX2RldmljZXMod204MzF4LT5kZXYsIC0xLAorCQlyZXQgPSBtZmRfYWRkX2RldmljZXMod204MzF4LT5kZXYsIHdtODMxeF9udW0sCiAJCQkJICAgICAgd204MzEyX2RldnMsIEFSUkFZX1NJWkUod204MzEyX2RldnMpLAogCQkJCSAgICAgIE5VTEwsIHdtODMxeC0+aXJxX2Jhc2UpOworCQlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+ZGlzYWJsZV90b3VjaCkKKwkJCW1mZF9hZGRfZGV2aWNlcyh3bTgzMXgtPmRldiwgd204MzF4X251bSwKKwkJCQkJdG91Y2hfZGV2cywgQVJSQVlfU0laRSh0b3VjaF9kZXZzKSwKKwkJCQkJTlVMTCwgd204MzF4LT5pcnFfYmFzZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTTgzMjA6CiAJY2FzZSBXTTgzMjE6CiAJY2FzZSBXTTgzMjU6CiAJY2FzZSBXTTgzMjY6Ci0JCXJldCA9IG1mZF9hZGRfZGV2aWNlcyh3bTgzMXgtPmRldiwgLTEsCisJCXJldCA9IG1mZF9hZGRfZGV2aWNlcyh3bTgzMXgtPmRldiwgd204MzF4X251bSwKIAkJCQkgICAgICB3bTgzMjBfZGV2cywgQVJSQVlfU0laRSh3bTgzMjBfZGV2cyksCiAJCQkJICAgICAgTlVMTCwgd204MzF4LT5pcnFfYmFzZSk7CiAJCWJyZWFrOwpAQCAtMTY0NSw5ICsxNTA3LDMwIEBACiAJCWdvdG8gZXJyX2lycTsKIAl9CiAKKwkvKiBUaGUgUlRDIGNhbiBvbmx5IGJlIHVzZWQgaWYgdGhlIDMyLjc2OGtIeiBjcnlzdGFsIGlzCisJICogZW5hYmxlZDsgdGhpcyBjYW4ndCBiZSBjb250cm9sbGVkIGJ5IHNvZnR3YXJlIGF0IHJ1bnRpbWUuCisJICovCisJcmV0ID0gd204MzF4X3JlZ19yZWFkKHdtODMxeCwgV004MzFYX0NMT0NLX0NPTlRST0xfMik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byByZWFkIGNsb2NrIHN0YXR1czogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyX2lycTsKKwl9CisKKwlpZiAocmV0ICYgV004MzFYX1hUQUxfRU5BKSB7CisJCXJldCA9IG1mZF9hZGRfZGV2aWNlcyh3bTgzMXgtPmRldiwgd204MzF4X251bSwKKwkJCQkgICAgICBydGNfZGV2cywgQVJSQVlfU0laRShydGNfZGV2cyksCisJCQkJICAgICAgTlVMTCwgd204MzF4LT5pcnFfYmFzZSk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byBhZGQgUlRDOiAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gZXJyX2lycTsKKwkJfQorCX0gZWxzZSB7CisJCWRldl9pbmZvKHdtODMxeC0+ZGV2LCAiMzIuNzY4a0h6IGNsb2NrIGRpc2FibGVkLCBubyBSVENcbiIpOworCX0KKwogCWlmIChwZGF0YSAmJiBwZGF0YS0+YmFja2xpZ2h0KSB7CiAJCS8qIFRyZWF0IGVycm9ycyBhcyBub24tY3JpdGljYWwgKi8KLQkJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKHdtODMxeC0+ZGV2LCAtMSwgYmFja2xpZ2h0X2RldnMsCisJCXJldCA9IG1mZF9hZGRfZGV2aWNlcyh3bTgzMXgtPmRldiwgd204MzF4X251bSwgYmFja2xpZ2h0X2RldnMsCiAJCQkJICAgICAgQVJSQVlfU0laRShiYWNrbGlnaHRfZGV2cyksIE5VTEwsCiAJCQkJICAgICAgd204MzF4LT5pcnFfYmFzZSk7CiAJCWlmIChyZXQgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd204MzF4LWlycS5jIGIvZHJpdmVycy9tZmQvd204MzF4LWlycS5jCmluZGV4IDQyYjkyOGUuLmFkYTE4MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3dtODMxeC1pcnEuYworKysgYi9kcml2ZXJzL21mZC93bTgzMXgtaXJxLmMKQEAgLTM0OCw2ICszNDgsMTUgQEAKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKIAlpbnQgaTsKIAorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODMxeC0+Z3Bpb191cGRhdGUpOyBpKyspIHsKKwkJaWYgKHdtODMxeC0+Z3Bpb191cGRhdGVbaV0pIHsKKwkJCXdtODMxeF9zZXRfYml0cyh3bTgzMXgsIFdNODMxWF9HUElPMV9DT05UUk9MICsgaSwKKwkJCQkJV004MzFYX0dQTl9JTlRfTU9ERSB8IFdNODMxWF9HUE5fUE9MLAorCQkJCQl3bTgzMXgtPmdwaW9fdXBkYXRlW2ldKTsKKwkJCXdtODMxeC0+Z3Bpb191cGRhdGVbaV0gPSAwOworCQl9CisJfQorCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204MzF4LT5pcnFfbWFza3NfY3VyKTsgaSsrKSB7CiAJCS8qIElmIHRoZXJlJ3MgYmVlbiBhIGNoYW5nZSBpbiB0aGUgbWFzayB3cml0ZSBpdCBiYWNrCiAJCSAqIHRvIHRoZSBoYXJkd2FyZS4gKi8KQEAgLTM4Nyw3ICszOTYsNyBAQAogc3RhdGljIGludCB3bTgzMXhfaXJxX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IHR5cGUpCiB7CiAJc3RydWN0IHdtODMxeCAqd204MzF4ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7Ci0JaW50IHZhbCwgaXJxOworCWludCBpcnE7CiAKIAlpcnEgPSBkYXRhLT5pcnEgLSB3bTgzMXgtPmlycV9iYXNlOwogCkBAIC0zOTksMjIgKzQwOCwzMCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJLyogUmViYXNlIHRoZSBJUlEgaW50byB0aGUgR1BJTyByYW5nZSBzbyB3ZSd2ZSBnb3QgYSBzZW5zaWJsZSBhcnJheQorCSAqIGluZGV4LgorCSAqLworCWlycSAtPSBXTTgzMVhfSVJRX0dQSU9fMTsKKworCS8qIFdlIHNldCB0aGUgaGlnaCBiaXQgdG8gZmxhZyB0aGF0IHdlIG5lZWQgYW4gdXBkYXRlOyBkb24ndAorCSAqIGRvIHRoZSB1cGRhdGUgaGVyZSBhcyB3ZSBjYW4gYmUgY2FsbGVkIHdpdGggdGhlIGJ1cyBsb2NrCisJICogaGVsZC4KKwkgKi8KIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKLQkJdmFsID0gV004MzFYX0dQTl9JTlRfTU9ERTsKKwkJd204MzF4LT5ncGlvX3VwZGF0ZVtpcnFdID0gMHgxMDAwMCB8IFdNODMxWF9HUE5fSU5UX01PREU7CiAJCWJyZWFrOwogCWNhc2UgSVJRX1RZUEVfRURHRV9SSVNJTkc6Ci0JCXZhbCA9IFdNODMxWF9HUE5fUE9MOworCQl3bTgzMXgtPmdwaW9fdXBkYXRlW2lycV0gPSAweDEwMDAwIHwgV004MzFYX0dQTl9QT0w7CiAJCWJyZWFrOwogCWNhc2UgSVJRX1RZUEVfRURHRV9GQUxMSU5HOgotCQl2YWwgPSAwOworCQl3bTgzMXgtPmdwaW9fdXBkYXRlW2lycV0gPSAweDEwMDAwOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyZXR1cm4gd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0dQSU8xX0NPTlRST0wgKyBpcnEsCi0JCQkgICAgICAgV004MzFYX0dQTl9JTlRfTU9ERSB8IFdNODMxWF9HUE5fUE9MLCB2YWwpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHdtODMxeF9pcnFfY2hpcCA9IHsKQEAgLTQzMiw3ICs0NDksNyBAQAogewogCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGRhdGE7CiAJdW5zaWduZWQgaW50IGk7Ci0JaW50IHByaW1hcnk7CisJaW50IHByaW1hcnksIHN0YXR1c19hZGRyOwogCWludCBzdGF0dXNfcmVnc1tXTTgzMVhfTlVNX0lSUV9SRUdTXSA9IHsgMCB9OwogCWludCByZWFkW1dNODMxWF9OVU1fSVJRX1JFR1NdID0geyAwIH07CiAJaW50ICpzdGF0dXM7CkBAIC00NjcsOCArNDg0LDkgQEAKIAkJLyogSG9wZWZ1bGx5IHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSByZWdpc3RlciB0byByZWFkCiAJCSAqIGVhY2ggdGltZSBvdGhlcndpc2Ugd2Ugb3VnaHQgdG8gZG8gYSBibG9jayByZWFkLiAqLwogCQlpZiAoIXJlYWRbb2Zmc2V0XSkgewotCQkJKnN0YXR1cyA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsCi0JCQkJICAgICBpcnFfZGF0YV90b19zdGF0dXNfcmVnKCZ3bTgzMXhfaXJxc1tpXSkpOworCQkJc3RhdHVzX2FkZHIgPSBpcnFfZGF0YV90b19zdGF0dXNfcmVnKCZ3bTgzMXhfaXJxc1tpXSk7CisKKwkJCSpzdGF0dXMgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LCBzdGF0dXNfYWRkcik7CiAJCQlpZiAoKnN0YXR1cyA8IDApIHsKIAkJCQlkZXZfZXJyKHdtODMxeC0+ZGV2LAogCQkJCQkiRmFpbGVkIHRvIHJlYWQgSVJRIHN0YXR1czogJWRcbiIsCkBAIC00NzcsMjYgKzQ5NSwyMSBAQAogCQkJfQogCiAJCQlyZWFkW29mZnNldF0gPSAxOworCisJCQkvKiBJZ25vcmUgYW55IGJpdHMgdGhhdCB3ZSBkb24ndCB0aGluayBhcmUgbWFza2VkICovCisJCQkqc3RhdHVzICY9IH53bTgzMXgtPmlycV9tYXNrc19jdXJbb2Zmc2V0XTsKKworCQkJLyogQWNrbm93bGVkZ2Ugbm93IHNvIHdlIGRvbid0IG1pc3MKKwkJCSAqIG5vdGlmaWNhdGlvbnMgd2hpbGUgd2UgaGFuZGxlLgorCQkJICovCisJCQl3bTgzMXhfcmVnX3dyaXRlKHdtODMxeCwgc3RhdHVzX2FkZHIsICpzdGF0dXMpOwogCQl9CiAKLQkJLyogUmVwb3J0IGl0IGlmIGl0IGlzbid0IG1hc2tlZCwgb3IgZm9yZ2V0IHRoZSBzdGF0dXMuICovCi0JCWlmICgoKnN0YXR1cyAmIH53bTgzMXgtPmlycV9tYXNrc19jdXJbb2Zmc2V0XSkKLQkJICAgICYgd204MzF4X2lycXNbaV0ubWFzaykKKwkJaWYgKCpzdGF0dXMgJiB3bTgzMXhfaXJxc1tpXS5tYXNrKQogCQkJaGFuZGxlX25lc3RlZF9pcnEod204MzF4LT5pcnFfYmFzZSArIGkpOwotCQllbHNlCi0JCQkqc3RhdHVzICY9IH53bTgzMXhfaXJxc1tpXS5tYXNrOwogCX0KIAogb3V0OgotCS8qIFRvdWNoc2NyZWVuIGludGVycnVwdHMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGluIHRoZSBkcml2ZXIgKi8KLQlzdGF0dXNfcmVnc1swXSAmPSB+KFdNODMxWF9UQ0hEQVRBX0VJTlQgfCBXTTgzMVhfVENIUERfRUlOVCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGF0dXNfcmVncyk7IGkrKykgewotCQlpZiAoc3RhdHVzX3JlZ3NbaV0pCi0JCQl3bTgzMXhfcmVnX3dyaXRlKHdtODMxeCwgV004MzFYX0lOVEVSUlVQVF9TVEFUVVNfMSArIGksCi0JCQkJCSBzdGF0dXNfcmVnc1tpXSk7Ci0JfQotCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC01MTUsMTMgKzUyOCwyMiBAQAogCQkJCSAweGZmZmYpOwogCX0KIAotCWlmICghcGRhdGEgfHwgIXBkYXRhLT5pcnFfYmFzZSkgewotCQlkZXZfZXJyKHdtODMxeC0+ZGV2LAotCQkJIk5vIGludGVycnVwdCBiYXNlIHNwZWNpZmllZCwgbm8gaW50ZXJydXB0c1xuIik7CisJLyogVHJ5IHRvIGR5bmFtaWNhbGx5IGFsbG9jYXRlIElSUXMgaWYgbm8gYmFzZSBpcyBzcGVjaWZpZWQgKi8KKwlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+aXJxX2Jhc2UpCisJCXdtODMxeC0+aXJxX2Jhc2UgPSAtMTsKKwllbHNlCisJCXdtODMxeC0+aXJxX2Jhc2UgPSBwZGF0YS0+aXJxX2Jhc2U7CisKKwl3bTgzMXgtPmlycV9iYXNlID0gaXJxX2FsbG9jX2Rlc2NzKHdtODMxeC0+aXJxX2Jhc2UsIDAsCisJCQkJCSAgIFdNODMxWF9OVU1fSVJRUywgMCk7CisJaWYgKHdtODMxeC0+aXJxX2Jhc2UgPCAwKSB7CisJCWRldl93YXJuKHdtODMxeC0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIElSUXM6ICVkXG4iLAorCQkJIHdtODMxeC0+aXJxX2Jhc2UpOworCQl3bTgzMXgtPmlycV9iYXNlID0gMDsKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKHBkYXRhLT5pcnFfY21vcykKKwlpZiAocGRhdGEgJiYgcGRhdGEtPmlycV9jbW9zKQogCQlpID0gMDsKIAllbHNlCiAJCWkgPSBXTTgzMVhfSVJRX09EOwpAQCAtNTQxLDcgKzU2Myw2IEBACiAJfQogCiAJd204MzF4LT5pcnEgPSBpcnE7Ci0Jd204MzF4LT5pcnFfYmFzZSA9IHBkYXRhLT5pcnFfYmFzZTsKIAogCS8qIFJlZ2lzdGVyIHRoZW0gd2l0aCBnZW5pcnEgKi8KIAlmb3IgKGN1cl9pcnEgPSB3bTgzMXgtPmlycV9iYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd204MzUwLWlycS5jIGIvZHJpdmVycy9tZmQvd204MzUwLWlycS5jCmluZGV4IGVkNGIyMmEuLjhhMWZhZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3dtODM1MC1pcnEuYworKysgYi9kcml2ZXJzL21mZC93bTgzNTAtaXJxLmMKQEAgLTQ3MywxNyArNDczLDEzIEBACiB7CiAJaW50IHJldCwgY3VyX2lycSwgaTsKIAlpbnQgZmxhZ3MgPSBJUlFGX09ORVNIT1Q7CisJaW50IGlycV9iYXNlID0gLTE7CiAKIAlpZiAoIWlycSkgewogCQlkZXZfd2Fybih3bTgzNTAtPmRldiwgIk5vIGludGVycnVwdCBzdXBwb3J0LCBubyBjb3JlIElSUVxuIik7CiAJCXJldHVybiAwOwogCX0KIAotCWlmICghcGRhdGEgfHwgIXBkYXRhLT5pcnFfYmFzZSkgewotCQlkZXZfd2Fybih3bTgzNTAtPmRldiwgIk5vIGludGVycnVwdCBzdXBwb3J0LCBubyBJUlEgYmFzZVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQogCS8qIE1hc2sgdG9wIGxldmVsIGludGVycnVwdHMgKi8KIAl3bTgzNTBfcmVnX3dyaXRlKHdtODM1MCwgV004MzUwX1NZU1RFTV9JTlRFUlJVUFRTX01BU0ssIDB4RkZGRik7CiAKQEAgLTUwMiw3ICs0OTgsMTcgQEAKIAl3bTgzNTAtPmNoaXBfaXJxID0gaXJxOwogCXdtODM1MC0+aXJxX2Jhc2UgPSBwZGF0YS0+aXJxX2Jhc2U7CiAKLQlpZiAocGRhdGEtPmlycV9oaWdoKSB7CisJaWYgKHBkYXRhICYmIHBkYXRhLT5pcnFfYmFzZSA+IDApCisJCWlycV9iYXNlID0gcGRhdGEtPmlycV9iYXNlOworCisJd204MzUwLT5pcnFfYmFzZSA9IGlycV9hbGxvY19kZXNjcyhpcnFfYmFzZSwgMCwgQVJSQVlfU0laRSh3bTgzNTBfaXJxcyksIDApOworCWlmICh3bTgzNTAtPmlycV9iYXNlIDwgMCkgeworCQlkZXZfd2Fybih3bTgzNTAtPmRldiwgIkFsbG9jYXRpbmcgaXJxcyBmYWlsZWQgd2l0aCAlZFxuIiwKKwkJCXdtODM1MC0+aXJxX2Jhc2UpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocGRhdGEgJiYgcGRhdGEtPmlycV9oaWdoKSB7CiAJCWZsYWdzIHw9IElSUUZfVFJJR0dFUl9ISUdIOwogCiAJCXdtODM1MF9zZXRfYml0cyh3bTgzNTAsIFdNODM1MF9TWVNURU1fQ09OVFJPTF8xLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd204OTk0LWNvcmUuYyBiL2RyaXZlcnMvbWZkL3dtODk5NC1jb3JlLmMKaW5kZXggZTE5OGQ0MC4uOTY0NzljOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvd204OTk0LWNvcmUuYworKysgYi9kcml2ZXJzL21mZC93bTg5OTQtY29yZS5jCkBAIC0zMTYsNyArMzE2LDcgQEAKIHN0YXRpYyBpbnQgd204OTk0X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHdtODk5NCAqd204OTk0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHJldDsKKwlpbnQgcmV0LCBpOwogCiAJLyogV2UgbWF5IGhhdmUgbGllZCB0byB0aGUgUE0gY29yZSBhYm91dCBzdXNwZW5kaW5nICovCiAJaWYgKCF3bTg5OTQtPnN1c3BlbmRlZCkKQEAgLTMyOSwxMCArMzI5LDE2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0ID0gd204OTk0X3dyaXRlKHdtODk5NCwgV004OTk0X0lOVEVSUlVQVF9TVEFUVVNfMV9NQVNLLAotCQkJICAgV004OTk0X05VTV9JUlFfUkVHUyAqIDIsICZ3bTg5OTQtPmlycV9tYXNrc19jdXIpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZXN0b3JlIGludGVycnVwdCBtYXNrczogJWRcbiIsIHJldCk7CisJLyogV3JpdGUgcmVnaXN0ZXIgYXQgYSB0aW1lIGFzIHdlIHVzZSB0aGUgY2FjaGUgb24gdGhlIENQVSBzbyBzdG9yZQorCSAqIGl0IGluIG5hdGl2ZSBlbmRpYW4uCisJICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204OTk0LT5pcnFfbWFza3NfY3VyKTsgaSsrKSB7CisJCXJldCA9IHdtODk5NF9yZWdfd3JpdGUod204OTk0LCBXTTg5OTRfSU5URVJSVVBUX1NUQVRVU18xX01BU0sKKwkJCQkgICAgICAgKyBpLCB3bTg5OTQtPmlycV9tYXNrc19jdXJbaV0pOworCQlpZiAocmV0IDwgMCkKKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlc3RvcmUgaW50ZXJydXB0IG1hc2tzOiAlZFxuIiwKKwkJCQlyZXQpOworCX0KIAogCXJldCA9IHdtODk5NF93cml0ZSh3bTg5OTQsIFdNODk5NF9MRE9fMSwgV004OTk0X05VTV9MRE9fUkVHUyAqIDIsCiAJCQkgICAmd204OTk0LT5sZG9fcmVncyk7CkBAIC00MDMsNyArNDA5LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlnb3RvIGVycjsKIAl9CiAKIAl3bTg5OTQtPnN1cHBsaWVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEpICoKQEAgLTQyNSw3ICs0MzEsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUcoKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWdvdG8gZXJyOwogCX0KIAkJCiAJcmV0ID0gcmVndWxhdG9yX2J1bGtfZ2V0KHdtODk5NC0+ZGV2LCB3bTg5OTQtPm51bV9zdXBwbGllcywKQEAgLTQ3NiwxMyArNDgyLDE4IEBACiAJCWdvdG8gZXJyX2VuYWJsZTsKIAl9CiAKLQlzd2l0Y2ggKHJldCkgewotCWNhc2UgMDoKLQljYXNlIDE6Ci0JCWlmICh3bTg5OTQtPnR5cGUgPT0gV004OTk0KQorCXN3aXRjaCAod204OTk0LT50eXBlKSB7CisJY2FzZSBXTTg5OTQ6CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoKKwkJY2FzZSAxOgogCQkJZGV2X3dhcm4od204OTk0LT5kZXYsCiAJCQkJICJyZXZpc2lvbiAlYyBub3QgZnVsbHkgc3VwcG9ydGVkXG4iLAogCQkJCSAnQScgKyByZXQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODk5NC1pcnEuYyBiL2RyaXZlcnMvbWZkL3dtODk5NC1pcnEuYwppbmRleCA3MWM2ZThmLi5kNjgyZjdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93bTg5OTQtaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvd204OTk0LWlycS5jCkBAIC0yMzEsMTIgKzIzMSw2IEBACiAJCXN0YXR1c1tpXSAmPSB+d204OTk0LT5pcnFfbWFza3NfY3VyW2ldOwogCX0KIAotCS8qIFJlcG9ydCAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODk5NF9pcnFzKTsgaSsrKSB7Ci0JCWlmIChzdGF0dXNbd204OTk0X2lycXNbaV0ucmVnIC0gMV0gJiB3bTg5OTRfaXJxc1tpXS5tYXNrKQotCQkJaGFuZGxlX25lc3RlZF9pcnEod204OTk0LT5pcnFfYmFzZSArIGkpOwotCX0KLQogCS8qIEFjayBhbnkgdW5tYXNrZWQgSVJRcyAqLwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0YXR1cyk7IGkrKykgewogCQlpZiAoc3RhdHVzW2ldKQpAQCAtMjQ0LDYgKzIzOCwxMiBAQAogCQkJCQkgc3RhdHVzW2ldKTsKIAl9CiAKKwkvKiBSZXBvcnQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg5OTRfaXJxcyk7IGkrKykgeworCQlpZiAoc3RhdHVzW3dtODk5NF9pcnFzW2ldLnJlZyAtIDFdICYgd204OTk0X2lycXNbaV0ubWFzaykKKwkJCWhhbmRsZV9uZXN0ZWRfaXJxKHdtODk5NC0+aXJxX2Jhc2UgKyBpKTsKKwl9CisKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZXNkaGMtaW14LmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWVzZGhjLWlteC5jCmluZGV4IDcxMGI3MDYuLjllYmZiNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZXNkaGMtaW14LmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1lc2RoYy1pbXguYwpAQCAtMjAsNyArMjAsOSBAQAogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL21tYy5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvLmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgogI2luY2x1ZGUgPG1hY2gvZXNkaGMuaD4KICNpbmNsdWRlICJzZGhjaS1wbHRmbS5oIgogI2luY2x1ZGUgInNkaGNpLWVzZGhjLmgiCkBAIC0yOSw3ICszMSw2IEBACiAjZGVmaW5lIFNESENJX1ZFTkRPUl9TUEVDCQkweEMwCiAjZGVmaW5lICBTREhDSV9WRU5ET1JfU1BFQ19TRElPX1FVSVJLCTB4MDAwMDAwMDIKIAotI2RlZmluZSBFU0RIQ19GTEFHX0dQSU9fRk9SX0NECQkoMSA8PCAwKQogLyoKICAqIFRoZSBDTURUWVBFIG9mIHRoZSBDTUQgcmVnaXN0ZXIgKG9mZnNldCAweEUpIHNob3VsZCBiZSBzZXQgdG8KICAqICIxMSIgd2hlbiB0aGUgU1RPUCBDTUQxMiBpcyBpc3N1ZWQgb24gaW14NTMgdG8gYWJvcnQgb25lCkBAIC00MywxMSArNDQsNjggQEAKICAqLwogI2RlZmluZSBFU0RIQ19GTEFHX01VTFRJQkxLX05PX0lOVAkoMSA8PCAxKQogCitlbnVtIGlteF9lc2RoY190eXBlIHsKKwlJTVgyNV9FU0RIQywKKwlJTVgzNV9FU0RIQywKKwlJTVg1MV9FU0RIQywKKwlJTVg1M19FU0RIQywKK307CisKIHN0cnVjdCBwbHRmbV9pbXhfZGF0YSB7CiAJaW50IGZsYWdzOwogCXUzMiBzY3JhdGNocGFkOworCWVudW0gaW14X2VzZGhjX3R5cGUgZGV2dHlwZTsKKwlzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSBib2FyZGRhdGE7CiB9OwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBpbXhfZXNkaGNfZGV2dHlwZVtdID0geworCXsKKwkJLm5hbWUgPSAic2RoY2ktZXNkaGMtaW14MjUiLAorCQkuZHJpdmVyX2RhdGEgPSBJTVgyNV9FU0RIQywKKwl9LCB7CisJCS5uYW1lID0gInNkaGNpLWVzZGhjLWlteDM1IiwKKwkJLmRyaXZlcl9kYXRhID0gSU1YMzVfRVNESEMsCisJfSwgeworCQkubmFtZSA9ICJzZGhjaS1lc2RoYy1pbXg1MSIsCisJCS5kcml2ZXJfZGF0YSA9IElNWDUxX0VTREhDLAorCX0sIHsKKwkJLm5hbWUgPSAic2RoY2ktZXNkaGMtaW14NTMiLAorCQkuZHJpdmVyX2RhdGEgPSBJTVg1M19FU0RIQywKKwl9LCB7CisJCS8qIHNlbnRpbmVsICovCisJfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIGlteF9lc2RoY19kZXZ0eXBlKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgaW14X2VzZGhjX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDI1LWVzZGhjIiwgLmRhdGEgPSAmaW14X2VzZGhjX2RldnR5cGVbSU1YMjVfRVNESENdLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDM1LWVzZGhjIiwgLmRhdGEgPSAmaW14X2VzZGhjX2RldnR5cGVbSU1YMzVfRVNESENdLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWVzZGhjIiwgLmRhdGEgPSAmaW14X2VzZGhjX2RldnR5cGVbSU1YNTFfRVNESENdLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDUzLWVzZGhjIiwgLmRhdGEgPSAmaW14X2VzZGhjX2RldnR5cGVbSU1YNTNfRVNESENdLCB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGlteF9lc2RoY19kdF9pZHMpOworCitzdGF0aWMgaW5saW5lIGludCBpc19pbXgyNV9lc2RoYyhzdHJ1Y3QgcGx0Zm1faW14X2RhdGEgKmRhdGEpCit7CisJcmV0dXJuIGRhdGEtPmRldnR5cGUgPT0gSU1YMjVfRVNESEM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2lteDM1X2VzZGhjKHN0cnVjdCBwbHRmbV9pbXhfZGF0YSAqZGF0YSkKK3sKKwlyZXR1cm4gZGF0YS0+ZGV2dHlwZSA9PSBJTVgzNV9FU0RIQzsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfaW14NTFfZXNkaGMoc3RydWN0IHBsdGZtX2lteF9kYXRhICpkYXRhKQoreworCXJldHVybiBkYXRhLT5kZXZ0eXBlID09IElNWDUxX0VTREhDOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19pbXg1M19lc2RoYyhzdHJ1Y3QgcGx0Zm1faW14X2RhdGEgKmRhdGEpCit7CisJcmV0dXJuIGRhdGEtPmRldnR5cGUgPT0gSU1YNTNfRVNESEM7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBlc2RoY19jbHJzZXRfbGUoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHUzMiBtYXNrLCB1MzIgdmFsLCBpbnQgcmVnKQogewogCXZvaWQgX19pb21lbSAqYmFzZSA9IGhvc3QtPmlvYWRkciArIChyZWcgJiB+MHgzKTsKQEAgLTYwLDE3ICsxMTgsMTQgQEAKIHsKIAlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CiAJc3RydWN0IHBsdGZtX2lteF9kYXRhICppbXhfZGF0YSA9IHBsdGZtX2hvc3QtPnByaXY7CisJc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgKmJvYXJkZGF0YSA9ICZpbXhfZGF0YS0+Ym9hcmRkYXRhOwogCi0JLyogZmFrZSBDQVJEX1BSRVNFTlQgZmxhZyBvbiBteDI1LzM1ICovCisJLyogZmFrZSBDQVJEX1BSRVNFTlQgZmxhZyAqLwogCXUzMiB2YWwgPSByZWFkbChob3N0LT5pb2FkZHIgKyByZWcpOwogCiAJaWYgKHVubGlrZWx5KChyZWcgPT0gU0RIQ0lfUFJFU0VOVF9TVEFURSkKLQkJCSYmIChpbXhfZGF0YS0+ZmxhZ3MgJiBFU0RIQ19GTEFHX0dQSU9fRk9SX0NEKSkpIHsKLQkJc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgKmJvYXJkZGF0YSA9Ci0JCQkJaG9zdC0+bW1jLT5wYXJlbnQtPnBsYXRmb3JtX2RhdGE7Ci0KLQkJaWYgKGJvYXJkZGF0YSAmJiBncGlvX2lzX3ZhbGlkKGJvYXJkZGF0YS0+Y2RfZ3BpbykKLQkJCQkmJiBncGlvX2dldF92YWx1ZShib2FyZGRhdGEtPmNkX2dwaW8pKQorCQkJJiYgZ3Bpb19pc192YWxpZChib2FyZGRhdGEtPmNkX2dwaW8pKSkgeworCQlpZiAoZ3Bpb19nZXRfdmFsdWUoYm9hcmRkYXRhLT5jZF9ncGlvKSkKIAkJCS8qIG5vIGNhcmQsIGlmIGEgdmFsaWQgZ3BpbyBzYXlzIHNvLi4uICovCiAJCQl2YWwgJj0gflNESENJX0NBUkRfUFJFU0VOVDsKIAkJZWxzZQpAQCAtODUsMTIgKzE0MCwxMiBAQAogewogCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKIAlzdHJ1Y3QgcGx0Zm1faW14X2RhdGEgKmlteF9kYXRhID0gcGx0Zm1faG9zdC0+cHJpdjsKKwlzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSAqYm9hcmRkYXRhID0gJmlteF9kYXRhLT5ib2FyZGRhdGE7CiAKIAlpZiAodW5saWtlbHkoKHJlZyA9PSBTREhDSV9JTlRfRU5BQkxFIHx8IHJlZyA9PSBTREhDSV9TSUdOQUxfRU5BQkxFKQotCQkJJiYgKGlteF9kYXRhLT5mbGFncyAmIEVTREhDX0ZMQUdfR1BJT19GT1JfQ0QpKSkKKwkJCSYmIChib2FyZGRhdGEtPmNkX3R5cGUgPT0gRVNESENfQ0RfR1BJTykpKQogCQkvKgogCQkgKiB0aGVzZSBpbnRlcnJ1cHRzIHdvbid0IHdvcmsgd2l0aCBhIGN1c3RvbSBjYXJkX2RldGVjdCBncGlvCi0JCSAqIChvbmx5IGFwcGxpZWQgdG8gbXgyNS8zNSkKIAkJICovCiAJCXZhbCAmPSB+KFNESENJX0lOVF9DQVJEX1JFTU9WRSB8IFNESENJX0lOVF9DQVJEX0lOU0VSVCk7CiAKQEAgLTE3Myw2ICsyMjgsMTcgQEAKIAkJcmV0dXJuOwogCX0KIAllc2RoY19jbHJzZXRfbGUoaG9zdCwgMHhmZiwgdmFsLCByZWcpOworCisJLyoKKwkgKiBUaGUgZXNkaGMgaGFzIGEgZGVzaWduIHZpb2xhdGlvbiB0byBTREhDIHNwZWMgd2hpY2ggdGVsbHMKKwkgKiB0aGF0IHNvZnR3YXJlIHJlc2V0IHNob3VsZCBub3QgYWZmZWN0IGNhcmQgZGV0ZWN0aW9uIGNpcmN1aXQuCisJICogQnV0IGVzZGhjIGNsZWFycyBpdHMgU1lTQ1RMIHJlZ2lzdGVyIGJpdHMgWzAuLjJdIGR1cmluZyB0aGUKKwkgKiBzb2Z0d2FyZSByZXNldC4gIFRoaXMgd2lsbCBzdG9wIHRob3NlIGNsb2NrcyB0aGF0IGNhcmQgZGV0ZWN0aW9uCisJICogY2lyY3VpdCByZWxpZXMgb24uICBUbyB3b3JrIGFyb3VuZCBpdCwgd2UgdHVybiB0aGUgY2xvY2tzIG9uIGJhY2sKKwkgKiB0byBrZWVwIGNhcmQgZGV0ZWN0aW9uIGNpcmN1aXQgZnVuY3Rpb25hbC4KKwkgKi8KKwlpZiAoKHJlZyA9PSBTREhDSV9TT0ZUV0FSRV9SRVNFVCkgJiYgKHZhbCAmIDEpKQorCQllc2RoY19jbHJzZXRfbGUoaG9zdCwgMHg3LCAweDcsIEVTREhDX1NZU1RFTV9DT05UUk9MKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBlc2RoY19wbHRmbV9nZXRfbWF4X2Nsb2NrKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KQpAQCAtMTg5LDYgKzI1NSwyNiBAQAogCXJldHVybiBjbGtfZ2V0X3JhdGUocGx0Zm1faG9zdC0+Y2xrKSAvIDI1NiAvIDE2OwogfQogCitzdGF0aWMgdW5zaWduZWQgaW50IGVzZGhjX3BsdGZtX2dldF9ybyhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CisJc3RydWN0IHBsdGZtX2lteF9kYXRhICppbXhfZGF0YSA9IHBsdGZtX2hvc3QtPnByaXY7CisJc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgKmJvYXJkZGF0YSA9ICZpbXhfZGF0YS0+Ym9hcmRkYXRhOworCisJc3dpdGNoIChib2FyZGRhdGEtPndwX3R5cGUpIHsKKwljYXNlIEVTREhDX1dQX0dQSU86CisJCWlmIChncGlvX2lzX3ZhbGlkKGJvYXJkZGF0YS0+d3BfZ3BpbykpCisJCQlyZXR1cm4gZ3Bpb19nZXRfdmFsdWUoYm9hcmRkYXRhLT53cF9ncGlvKTsKKwljYXNlIEVTREhDX1dQX0NPTlRST0xMRVI6CisJCXJldHVybiAhKHJlYWRsKGhvc3QtPmlvYWRkciArIFNESENJX1BSRVNFTlRfU1RBVEUpICYKKwkJCSAgICAgICBTREhDSV9XUklURV9QUk9URUNUKTsKKwljYXNlIEVTREhDX1dQX05PTkU6CisJCWJyZWFrOworCX0KKworCXJldHVybiAtRU5PU1lTOworfQorCiBzdGF0aWMgc3RydWN0IHNkaGNpX29wcyBzZGhjaV9lc2RoY19vcHMgPSB7CiAJLnJlYWRfbCA9IGVzZGhjX3JlYWRsX2xlLAogCS5yZWFkX3cgPSBlc2RoY19yZWFkd19sZSwKQEAgLTE5OCw2ICsyODQsNyBAQAogCS5zZXRfY2xvY2sgPSBlc2RoY19zZXRfY2xvY2ssCiAJLmdldF9tYXhfY2xvY2sgPSBlc2RoY19wbHRmbV9nZXRfbWF4X2Nsb2NrLAogCS5nZXRfbWluX2Nsb2NrID0gZXNkaGNfcGx0Zm1fZ2V0X21pbl9jbG9jaywKKwkuZ2V0X3JvID0gZXNkaGNfcGx0Zm1fZ2V0X3JvLAogfTsKIAogc3RhdGljIHN0cnVjdCBzZGhjaV9wbHRmbV9kYXRhIHNkaGNpX2VzZGhjX2lteF9wZGF0YSA9IHsKQEAgLTIwNywxNyArMjk0LDYgQEAKIAkub3BzID0gJnNkaGNpX2VzZGhjX29wcywKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZXNkaGNfcGx0Zm1fZ2V0X3JvKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KQotewotCXN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhICpib2FyZGRhdGEgPQotCQkJaG9zdC0+bW1jLT5wYXJlbnQtPnBsYXRmb3JtX2RhdGE7Ci0KLQlpZiAoYm9hcmRkYXRhICYmIGdwaW9faXNfdmFsaWQoYm9hcmRkYXRhLT53cF9ncGlvKSkKLQkJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKGJvYXJkZGF0YS0+d3BfZ3Bpbyk7Ci0JZWxzZQotCQlyZXR1cm4gLUVOT1NZUzsKLX0KLQogc3RhdGljIGlycXJldHVybl90IGNkX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBzZGhjaV9ob3N0ICpzZGhvc3QgPSAoc3RydWN0IHNkaGNpX2hvc3QgKilkYXRhOwpAQCAtMjI2LDggKzMwMiw0OCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH07CiAKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBpbnQgX19kZXZpbml0CitzZGhjaV9lc2RoY19pbXhfcHJvYmVfZHQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCSBzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSAqYm9hcmRkYXRhKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImZzbCxjYXJkLXdpcmVkIiwgTlVMTCkpCisJCWJvYXJkZGF0YS0+Y2RfdHlwZSA9IEVTREhDX0NEX1BFUk1BTkVOVDsKKworCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJmc2wsY2QtY29udHJvbGxlciIsIE5VTEwpKQorCQlib2FyZGRhdGEtPmNkX3R5cGUgPSBFU0RIQ19DRF9DT05UUk9MTEVSOworCisJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImZzbCx3cC1jb250cm9sbGVyIiwgTlVMTCkpCisJCWJvYXJkZGF0YS0+d3BfdHlwZSA9IEVTREhDX1dQX0NPTlRST0xMRVI7CisKKwlib2FyZGRhdGEtPmNkX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgImNkLWdwaW9zIiwgMCk7CisJaWYgKGdwaW9faXNfdmFsaWQoYm9hcmRkYXRhLT5jZF9ncGlvKSkKKwkJYm9hcmRkYXRhLT5jZF90eXBlID0gRVNESENfQ0RfR1BJTzsKKworCWJvYXJkZGF0YS0+d3BfZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAid3AtZ3Bpb3MiLCAwKTsKKwlpZiAoZ3Bpb19pc192YWxpZChib2FyZGRhdGEtPndwX2dwaW8pKQorCQlib2FyZGRhdGEtPndwX3R5cGUgPSBFU0RIQ19XUF9HUElPOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQKK3NkaGNpX2VzZGhjX2lteF9wcm9iZV9kdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJIHN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhICpib2FyZGRhdGEpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisjZW5kaWYKKwogc3RhdGljIGludCBfX2RldmluaXQgc2RoY2lfZXNkaGNfaW14X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQgPQorCQkJb2ZfbWF0Y2hfZGV2aWNlKGlteF9lc2RoY19kdF9pZHMsICZwZGV2LT5kZXYpOwogCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0OwogCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0OwogCXN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhICpib2FyZGRhdGE7CkBAIC0yNDIsOCArMzU4LDE0IEBACiAJcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CiAKIAlpbXhfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwbHRmbV9pbXhfZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghaW14X2RhdGEpCi0JCXJldHVybiAtRU5PTUVNOworCWlmICghaW14X2RhdGEpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfaW14X2RhdGE7CisJfQorCisJaWYgKG9mX2lkKQorCQlwZGV2LT5pZF9lbnRyeSA9IG9mX2lkLT5kYXRhOworCWlteF9kYXRhLT5kZXZ0eXBlID0gcGRldi0+aWRfZW50cnktPmRyaXZlcl9kYXRhOwogCXBsdGZtX2hvc3QtPnByaXYgPSBpbXhfZGF0YTsKIAogCWNsayA9IGNsa19nZXQobW1jX2Rldihob3N0LT5tbWMpLCBOVUxMKTsKQEAgLTI1NSw1MCArMzc3LDcyIEBACiAJY2xrX2VuYWJsZShjbGspOwogCXBsdGZtX2hvc3QtPmNsayA9IGNsazsKIAotCWlmICghY3B1X2lzX214MjUoKSkKKwlpZiAoIWlzX2lteDI1X2VzZGhjKGlteF9kYXRhKSkKIAkJaG9zdC0+cXVpcmtzIHw9IFNESENJX1FVSVJLX0JST0tFTl9USU1FT1VUX1ZBTDsKIAotCWlmIChjcHVfaXNfbXgyNSgpIHx8IGNwdV9pc19teDM1KCkpIHsKKwlpZiAoaXNfaW14MjVfZXNkaGMoaW14X2RhdGEpIHx8IGlzX2lteDM1X2VzZGhjKGlteF9kYXRhKSkKIAkJLyogRml4IGVycmF0YSBFTkdjbTA3MjA3IHByZXNlbnQgb24gaS5NWDI1IGFuZCBpLk1YMzUgKi8KIAkJaG9zdC0+cXVpcmtzIHw9IFNESENJX1FVSVJLX05PX01VTFRJQkxPQ0s7Ci0JCS8qIHdyaXRlX3Byb3RlY3QgY2FuJ3QgYmUgcm91dGVkIHRvIGNvbnRyb2xsZXIsIHVzZSBncGlvICovCi0JCXNkaGNpX2VzZGhjX29wcy5nZXRfcm8gPSBlc2RoY19wbHRmbV9nZXRfcm87Ci0JfQogCi0JaWYgKCEoY3B1X2lzX214MjUoKSB8fCBjcHVfaXNfbXgzNSgpIHx8IGNwdV9pc19teDUxKCkpKQorCWlmIChpc19pbXg1M19lc2RoYyhpbXhfZGF0YSkpCiAJCWlteF9kYXRhLT5mbGFncyB8PSBFU0RIQ19GTEFHX01VTFRJQkxLX05PX0lOVDsKIAotCWJvYXJkZGF0YSA9IGhvc3QtPm1tYy0+cGFyZW50LT5wbGF0Zm9ybV9kYXRhOwotCWlmIChib2FyZGRhdGEpIHsKKwlib2FyZGRhdGEgPSAmaW14X2RhdGEtPmJvYXJkZGF0YTsKKwlpZiAoc2RoY2lfZXNkaGNfaW14X3Byb2JlX2R0KHBkZXYsIGJvYXJkZGF0YSkgPCAwKSB7CisJCWlmICghaG9zdC0+bW1jLT5wYXJlbnQtPnBsYXRmb3JtX2RhdGEpIHsKKwkJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAibm8gYm9hcmQgZGF0YSFcbiIpOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gbm9fYm9hcmRfZGF0YTsKKwkJfQorCQlpbXhfZGF0YS0+Ym9hcmRkYXRhID0gKigoc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgKikKKwkJCQkJaG9zdC0+bW1jLT5wYXJlbnQtPnBsYXRmb3JtX2RhdGEpOworCX0KKworCS8qIHdyaXRlX3Byb3RlY3QgKi8KKwlpZiAoYm9hcmRkYXRhLT53cF90eXBlID09IEVTREhDX1dQX0dQSU8pIHsKIAkJZXJyID0gZ3Bpb19yZXF1ZXN0X29uZShib2FyZGRhdGEtPndwX2dwaW8sIEdQSU9GX0lOLCAiRVNESENfV1AiKTsKIAkJaWYgKGVycikgewogCQkJZGV2X3dhcm4obW1jX2Rldihob3N0LT5tbWMpLAotCQkJCSJubyB3cml0ZS1wcm90ZWN0IHBpbiBhdmFpbGFibGUhXG4iKTsKLQkJCWJvYXJkZGF0YS0+d3BfZ3BpbyA9IGVycjsKKwkJCQkgIm5vIHdyaXRlLXByb3RlY3QgcGluIGF2YWlsYWJsZSFcbiIpOworCQkJYm9hcmRkYXRhLT53cF9ncGlvID0gLUVJTlZBTDsKIAkJfQorCX0gZWxzZSB7CisJCWJvYXJkZGF0YS0+d3BfZ3BpbyA9IC1FSU5WQUw7CisJfQogCisJLyogY2FyZF9kZXRlY3QgKi8KKwlpZiAoYm9hcmRkYXRhLT5jZF90eXBlICE9IEVTREhDX0NEX0dQSU8pCisJCWJvYXJkZGF0YS0+Y2RfZ3BpbyA9IC1FSU5WQUw7CisKKwlzd2l0Y2ggKGJvYXJkZGF0YS0+Y2RfdHlwZSkgeworCWNhc2UgRVNESENfQ0RfR1BJTzoKIAkJZXJyID0gZ3Bpb19yZXF1ZXN0X29uZShib2FyZGRhdGEtPmNkX2dwaW8sIEdQSU9GX0lOLCAiRVNESENfQ0QiKTsKIAkJaWYgKGVycikgewotCQkJZGV2X3dhcm4obW1jX2Rldihob3N0LT5tbWMpLAorCQkJZGV2X2VycihtbWNfZGV2KGhvc3QtPm1tYyksCiAJCQkJIm5vIGNhcmQtZGV0ZWN0IHBpbiBhdmFpbGFibGUhXG4iKTsKIAkJCWdvdG8gbm9fY2FyZF9kZXRlY3RfcGluOwogCQl9CiAKLQkJLyogaS5NWDV4IGhhcyBpc3N1ZXMgdG8gYmUgcmVzZWFyY2hlZCAqLwotCQlpZiAoIWNwdV9pc19teDI1KCkgJiYgIWNwdV9pc19teDM1KCkpCi0JCQlnb3RvIG5vdF9zdXBwb3J0ZWQ7Ci0KIAkJZXJyID0gcmVxdWVzdF9pcnEoZ3Bpb190b19pcnEoYm9hcmRkYXRhLT5jZF9ncGlvKSwgY2RfaXJxLAogCQkJCSBJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfVFJJR0dFUl9SSVNJTkcsCiAJCQkJIG1tY19ob3N0bmFtZShob3N0LT5tbWMpLCBob3N0KTsKIAkJaWYgKGVycikgewotCQkJZGV2X3dhcm4obW1jX2Rldihob3N0LT5tbWMpLCAicmVxdWVzdCBpcnEgZXJyb3JcbiIpOworCQkJZGV2X2VycihtbWNfZGV2KGhvc3QtPm1tYyksICJyZXF1ZXN0IGlycSBlcnJvclxuIik7CiAJCQlnb3RvIG5vX2NhcmRfZGV0ZWN0X2lycTsKIAkJfQorCQkvKiBmYWxsIHRocm91Z2ggKi8KIAotCQlpbXhfZGF0YS0+ZmxhZ3MgfD0gRVNESENfRkxBR19HUElPX0ZPUl9DRDsKLQkJLyogTm93IHdlIGhhdmUgYSB3b3JraW5nIGNhcmRfZGV0ZWN0IGFnYWluICovCisJY2FzZSBFU0RIQ19DRF9DT05UUk9MTEVSOgorCQkvKiB3ZSBoYXZlIGEgd29ya2luZyBjYXJkX2RldGVjdCBiYWNrICovCiAJCWhvc3QtPnF1aXJrcyAmPSB+U0RIQ0lfUVVJUktfQlJPS0VOX0NBUkRfREVURUNUSU9OOworCQlicmVhazsKKworCWNhc2UgRVNESENfQ0RfUEVSTUFORU5UOgorCQlob3N0LT5tbWMtPmNhcHMgPSBNTUNfQ0FQX05PTlJFTU9WQUJMRTsKKwkJYnJlYWs7CisKKwljYXNlIEVTREhDX0NEX05PTkU6CisJCWJyZWFrOwogCX0KIAogCWVyciA9IHNkaGNpX2FkZF9ob3N0KGhvc3QpOwpAQCAtMzA3LDE2ICs0NTEsMjEgQEAKIAogCXJldHVybiAwOwogCi0gbm9fY2FyZF9kZXRlY3RfaXJxOgotCWdwaW9fZnJlZShib2FyZGRhdGEtPmNkX2dwaW8pOwotIG5vX2NhcmRfZGV0ZWN0X3BpbjoKLQlib2FyZGRhdGEtPmNkX2dwaW8gPSBlcnI7Ci0gbm90X3N1cHBvcnRlZDoKLQlrZnJlZShpbXhfZGF0YSk7Ci0gZXJyX2FkZF9ob3N0OgorZXJyX2FkZF9ob3N0OgorCWlmIChncGlvX2lzX3ZhbGlkKGJvYXJkZGF0YS0+Y2RfZ3BpbykpCisJCWZyZWVfaXJxKGdwaW9fdG9faXJxKGJvYXJkZGF0YS0+Y2RfZ3BpbyksIGhvc3QpOworbm9fY2FyZF9kZXRlY3RfaXJxOgorCWlmIChncGlvX2lzX3ZhbGlkKGJvYXJkZGF0YS0+Y2RfZ3BpbykpCisJCWdwaW9fZnJlZShib2FyZGRhdGEtPmNkX2dwaW8pOworCWlmIChncGlvX2lzX3ZhbGlkKGJvYXJkZGF0YS0+d3BfZ3BpbykpCisJCWdwaW9fZnJlZShib2FyZGRhdGEtPndwX2dwaW8pOworbm9fY2FyZF9kZXRlY3RfcGluOgorbm9fYm9hcmRfZGF0YToKIAljbGtfZGlzYWJsZShwbHRmbV9ob3N0LT5jbGspOwogCWNsa19wdXQocGx0Zm1faG9zdC0+Y2xrKTsKLSBlcnJfY2xrX2dldDoKK2Vycl9jbGtfZ2V0OgorCWtmcmVlKGlteF9kYXRhKTsKK2Vycl9pbXhfZGF0YToKIAlzZGhjaV9wbHRmbV9mcmVlKHBkZXYpOwogCXJldHVybiBlcnI7CiB9CkBAIC0zMjUsMjAgKzQ3NCwxOCBAQAogewogCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOwotCXN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhICpib2FyZGRhdGEgPSBob3N0LT5tbWMtPnBhcmVudC0+cGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgcGx0Zm1faW14X2RhdGEgKmlteF9kYXRhID0gcGx0Zm1faG9zdC0+cHJpdjsKKwlzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSAqYm9hcmRkYXRhID0gJmlteF9kYXRhLT5ib2FyZGRhdGE7CiAJaW50IGRlYWQgPSAocmVhZGwoaG9zdC0+aW9hZGRyICsgU0RIQ0lfSU5UX1NUQVRVUykgPT0gMHhmZmZmZmZmZik7CiAKIAlzZGhjaV9yZW1vdmVfaG9zdChob3N0LCBkZWFkKTsKIAotCWlmIChib2FyZGRhdGEgJiYgZ3Bpb19pc192YWxpZChib2FyZGRhdGEtPndwX2dwaW8pKQorCWlmIChncGlvX2lzX3ZhbGlkKGJvYXJkZGF0YS0+d3BfZ3BpbykpCiAJCWdwaW9fZnJlZShib2FyZGRhdGEtPndwX2dwaW8pOwogCi0JaWYgKGJvYXJkZGF0YSAmJiBncGlvX2lzX3ZhbGlkKGJvYXJkZGF0YS0+Y2RfZ3BpbykpIHsKKwlpZiAoZ3Bpb19pc192YWxpZChib2FyZGRhdGEtPmNkX2dwaW8pKSB7CisJCWZyZWVfaXJxKGdwaW9fdG9faXJxKGJvYXJkZGF0YS0+Y2RfZ3BpbyksIGhvc3QpOwogCQlncGlvX2ZyZWUoYm9hcmRkYXRhLT5jZF9ncGlvKTsKLQotCQlpZiAoIShob3N0LT5xdWlya3MgJiBTREhDSV9RVUlSS19CUk9LRU5fQ0FSRF9ERVRFQ1RJT04pKQotCQkJZnJlZV9pcnEoZ3Bpb190b19pcnEoYm9hcmRkYXRhLT5jZF9ncGlvKSwgaG9zdCk7CiAJfQogCiAJY2xrX2Rpc2FibGUocGx0Zm1faG9zdC0+Y2xrKTsKQEAgLTM1NCw3ICs1MDEsOSBAQAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJzZGhjaS1lc2RoYy1pbXgiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gaW14X2VzZGhjX2R0X2lkcywKIAl9LAorCS5pZF90YWJsZQk9IGlteF9lc2RoY19kZXZ0eXBlLAogCS5wcm9iZQkJPSBzZGhjaV9lc2RoY19pbXhfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzZGhjaV9lc2RoY19pbXhfcmVtb3ZlKSwKICNpZmRlZiBDT05GSUdfUE0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uYwppbmRleCA3MWMwY2UxLi42NDE0ZWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5jCkBAIC04NSw2ICs4NSw3IEBACiB7CiAJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3Q7CiAJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3Q7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwogCXN0cnVjdCByZXNvdXJjZSAqaW9tZW07CiAJaW50IHJldDsKIApAQCAtOTgsNyArOTksNyBAQAogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJbnZhbGlkIGlvbWVtIHNpemUhXG4iKTsKIAogCS8qIFNvbWUgUENJLWJhc2VkIE1GRCBuZWVkIHRoZSBwYXJlbnQgaGVyZSAqLwotCWlmIChwZGV2LT5kZXYucGFyZW50ICE9ICZwbGF0Zm9ybV9idXMpCisJaWYgKHBkZXYtPmRldi5wYXJlbnQgIT0gJnBsYXRmb3JtX2J1cyAmJiAhbnApCiAJCWhvc3QgPSBzZGhjaV9hbGxvY19ob3N0KHBkZXYtPmRldi5wYXJlbnQsIHNpemVvZigqcGx0Zm1faG9zdCkpOwogCWVsc2UKIAkJaG9zdCA9IHNkaGNpX2FsbG9jX2hvc3QoJnBkZXYtPmRldiwgc2l6ZW9mKCpwbHRmbV9ob3N0KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mZWMuYyBiL2RyaXZlcnMvbmV0L2ZlYy5jCmluZGV4IDViNjMxZmUuLmU4MjY2Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZlYy5jCisrKyBiL2RyaXZlcnMvbmV0L2ZlYy5jCkBAIC00NCw2ICs0NCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZlYy5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX25ldC5oPgogCiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIApAQCAtNjYsMTcgKzcwLDQyIEBACiAjZGVmaW5lIEZFQ19RVUlSS19FTkVUX01BQwkJKDEgPDwgMCkKIC8qIENvbnRyb2xsZXIgbmVlZHMgZHJpdmVyIHRvIHN3YXAgZnJhbWUgKi8KICNkZWZpbmUgRkVDX1FVSVJLX1NXQVBfRlJBTUUJCSgxIDw8IDEpCisvKiBDb250cm9sbGVyIHVzZXMgZ2Fza2V0ICovCisjZGVmaW5lIEZFQ19RVUlSS19VU0VfR0FTS0VUCQkoMSA8PCAyKQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBmZWNfZGV2dHlwZVtdID0gewogCXsKKwkJLyoga2VlcCBpdCBmb3IgY29sZGZpcmUgKi8KIAkJLm5hbWUgPSBEUklWRVJfTkFNRSwKIAkJLmRyaXZlcl9kYXRhID0gMCwKIAl9LCB7CisJCS5uYW1lID0gImlteDI1LWZlYyIsCisJCS5kcml2ZXJfZGF0YSA9IEZFQ19RVUlSS19VU0VfR0FTS0VULAorCX0sIHsKKwkJLm5hbWUgPSAiaW14MjctZmVjIiwKKwkJLmRyaXZlcl9kYXRhID0gMCwKKwl9LCB7CiAJCS5uYW1lID0gImlteDI4LWZlYyIsCiAJCS5kcml2ZXJfZGF0YSA9IEZFQ19RVUlSS19FTkVUX01BQyB8IEZFQ19RVUlSS19TV0FQX0ZSQU1FLAotCX0sCi0JeyB9CisJfSwgeworCQkvKiBzZW50aW5lbCAqLworCX0KIH07CitNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBmZWNfZGV2dHlwZSk7CisKK2VudW0gaW14X2ZlY190eXBlIHsKKwlJTVgyNV9GRUMgPSAxLCAJLyogcnVucyBvbiBpLm14MjUvNTAvNTMgKi8KKwlJTVgyN19GRUMsCS8qIHJ1bnMgb24gaS5teDI3LzM1LzUxICovCisJSU1YMjhfRkVDLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZmVjX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDI1LWZlYyIsIC5kYXRhID0gJmZlY19kZXZ0eXBlW0lNWDI1X0ZFQ10sIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14MjctZmVjIiwgLmRhdGEgPSAmZmVjX2RldnR5cGVbSU1YMjdfRkVDXSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgyOC1mZWMiLCAuZGF0YSA9ICZmZWNfZGV2dHlwZVtJTVgyOF9GRUNdLCB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGZlY19kdF9pZHMpOwogCiBzdGF0aWMgdW5zaWduZWQgY2hhciBtYWNhZGRyW0VUSF9BTEVOXTsKIG1vZHVsZV9wYXJhbV9hcnJheShtYWNhZGRyLCBieXRlLCBOVUxMLCAwKTsKQEAgLTQyNyw3ICs0NTYsNyBAQAogCiAJfSBlbHNlIHsKICNpZmRlZiBGRUNfTUlJR1NLX0VOUgotCQlpZiAoZmVwLT5waHlfaW50ZXJmYWNlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9STUlJKSB7CisJCWlmIChpZF9lbnRyeS0+ZHJpdmVyX2RhdGEgJiBGRUNfUVVJUktfVVNFX0dBU0tFVCkgewogCQkJLyogZGlzYWJsZSB0aGUgZ2Fza2V0IGFuZCB3YWl0ICovCiAJCQl3cml0ZWwoMCwgZmVwLT5od3AgKyBGRUNfTUlJR1NLX0VOUik7CiAJCQl3aGlsZSAocmVhZGwoZmVwLT5od3AgKyBGRUNfTUlJR1NLX0VOUikgJiA0KQpAQCAtNDM2LDggKzQ2NSwxMSBAQAogCQkJLyoKIAkJCSAqIGNvbmZpZ3VyZSB0aGUgZ2Fza2V0OgogCQkJICogICBSTUlJLCA1MCBNSHosIG5vIGxvb3BiYWNrLCBubyBlY2hvCisJCQkgKiAgIE1JSSwgMjUgTUh6LCBubyBsb29wYmFjaywgbm8gZWNobwogCQkJICovCi0JCQl3cml0ZWwoMSwgZmVwLT5od3AgKyBGRUNfTUlJR1NLX0NGR1IpOworCQkJd3JpdGVsKChmZXAtPnBoeV9pbnRlcmZhY2UgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1JNSUkpID8KKwkJCQkJMSA6IDAsIGZlcC0+aHdwICsgRkVDX01JSUdTS19DRkdSKTsKKwogCiAJCQkvKiByZS1lbmFibGUgdGhlIGdhc2tldCAqLwogCQkJd3JpdGVsKDIsIGZlcC0+aHdwICsgRkVDX01JSUdTS19FTlIpOwpAQCAtNzM0LDggKzc2NiwyMiBAQAogCSAqLwogCWlhcCA9IG1hY2FkZHI7CiAKKyNpZmRlZiBDT05GSUdfT0YKIAkvKgotCSAqIDIpIGZyb20gZmxhc2ggb3IgZnVzZSAodmlhIHBsYXRmb3JtIGRhdGEpCisJICogMikgZnJvbSBkZXZpY2UgdHJlZSBkYXRhCisJICovCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGlhcCkpIHsKKwkJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGZlcC0+cGRldi0+ZGV2Lm9mX25vZGU7CisJCWlmIChucCkgeworCQkJY29uc3QgY2hhciAqbWFjID0gb2ZfZ2V0X21hY19hZGRyZXNzKG5wKTsKKwkJCWlmIChtYWMpCisJCQkJaWFwID0gKHVuc2lnbmVkIGNoYXIgKikgbWFjOworCQl9CisJfQorI2VuZGlmCisKKwkvKgorCSAqIDMpIGZyb20gZmxhc2ggb3IgZnVzZSAodmlhIHBsYXRmb3JtIGRhdGEpCiAJICovCiAJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGlhcCkpIHsKICNpZmRlZiBDT05GSUdfTTUyNzIKQEAgLTc0OCw3ICs3OTQsNyBAQAogCX0KIAogCS8qCi0JICogMykgRkVDIG1hYyByZWdpc3RlcnMgc2V0IGJ5IGJvb3Rsb2FkZXIKKwkgKiA0KSBGRUMgbWFjIHJlZ2lzdGVycyBzZXQgYnkgYm9vdGxvYWRlcgogCSAqLwogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihpYXApKSB7CiAJCSooKHVuc2lnbmVkIGxvbmcgKikgJnRtcGFkZHJbMF0pID0KQEAgLTEzNTQsNiArMTQwMCw1MiBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgaW50IF9fZGV2aW5pdCBmZWNfZ2V0X3BoeV9tb2RlX2R0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCisJaWYgKG5wKQorCQlyZXR1cm4gb2ZfZ2V0X3BoeV9tb2RlKG5wKTsKKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBmZWNfcmVzZXRfcGh5KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGVyciwgcGh5X3Jlc2V0OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCisJcGh5X3Jlc2V0ID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsICJwaHktcmVzZXQtZ3Bpb3MiLCAwKTsKKwllcnIgPSBncGlvX3JlcXVlc3Rfb25lKHBoeV9yZXNldCwgR1BJT0ZfT1VUX0lOSVRfTE9XLCAicGh5LXJlc2V0Iik7CisJaWYgKGVycikgeworCQlwcl93YXJuKCJGRUM6IGZhaWxlZCB0byBnZXQgZ3BpbyBwaHktcmVzZXQ6ICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKwltc2xlZXAoMSk7CisJZ3Bpb19zZXRfdmFsdWUocGh5X3Jlc2V0LCAxKTsKKworCXJldHVybiAwOworfQorI2Vsc2UgLyogQ09ORklHX09GICovCitzdGF0aWMgaW5saW5lIGludCBmZWNfZ2V0X3BoeV9tb2RlX2R0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZlY19yZXNldF9waHkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwkvKgorCSAqIEluIGNhc2Ugb2YgcGxhdGZvcm0gcHJvYmUsIHRoZSByZXNldCBoYXMgYmVlbiBkb25lCisJICogYnkgbWFjaGluZSBjb2RlLgorCSAqLworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19PRiAqLworCiBzdGF0aWMgaW50IF9fZGV2aW5pdAogZmVjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CkBAIC0xMzYyLDYgKzE0NTQsMTEgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAlpbnQgaSwgaXJxLCByZXQgPSAwOwogCXN0cnVjdCByZXNvdXJjZSAqcjsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZDsKKworCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKGZlY19kdF9pZHMsICZwZGV2LT5kZXYpOworCWlmIChvZl9pZCkKKwkJcGRldi0+aWRfZW50cnkgPSBvZl9pZC0+ZGF0YTsKIAogCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlmICghcikKQEAgLTEzOTMsOSArMTQ5MCwxOCBAQAogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbmRldik7CiAKLQlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlmIChwZGF0YSkKLQkJZmVwLT5waHlfaW50ZXJmYWNlID0gcGRhdGEtPnBoeTsKKwlyZXQgPSBmZWNfZ2V0X3BoeV9tb2RlX2R0KHBkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJCWlmIChwZGF0YSkKKwkJCWZlcC0+cGh5X2ludGVyZmFjZSA9IHBkYXRhLT5waHk7CisJCWVsc2UKKwkJCWZlcC0+cGh5X2ludGVyZmFjZSA9IFBIWV9JTlRFUkZBQ0VfTU9ERV9NSUk7CisJfSBlbHNlIHsKKwkJZmVwLT5waHlfaW50ZXJmYWNlID0gcmV0OworCX0KKworCWZlY19yZXNldF9waHkocGRldik7CiAKIAkvKiBUaGlzIGRldmljZSBoYXMgdXAgdG8gdGhyZWUgaXJxcyBvbiBzb21lIHBsYXRmb3JtcyAqLwogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKQEAgLTE1MzAsNiArMTYzNiw3IEBACiAjaWZkZWYgQ09ORklHX1BNCiAJCS5wbQk9ICZmZWNfcG1fb3BzLAogI2VuZGlmCisJCS5vZl9tYXRjaF90YWJsZSA9IGZlY19kdF9pZHMsCiAJfSwKIAkuaWRfdGFibGUgPSBmZWNfZGV2dHlwZSwKIAkucHJvYmUJPSBmZWNfcHJvYmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9jb3JlLmMgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9jb3JlLmMKaW5kZXggNzI1Mzk5ZS4uNzBjYjdkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL2NvcmUuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgpAQCAtMjUwNiwxOCArMjUwNyw2IEBACiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2ZkZXYtPmRldi5vZl9ub2RlOwogCWNvbnN0IHZvaWQgKnA7Ci0JdW5zaWduZWQgaW50IHBsZW47Ci0JY29uc3QgY2hhciAqcG0sICpwaHlfbW9kZXNbXSA9IHsKLQkJW1BIWV9NT0RFX05BXSA9ICIiLAotCQlbUEhZX01PREVfTUlJXSA9ICJtaWkiLAotCQlbUEhZX01PREVfUk1JSV0gPSAicm1paSIsCi0JCVtQSFlfTU9ERV9TTUlJXSA9ICJzbWlpIiwKLQkJW1BIWV9NT0RFX1JHTUlJXSA9ICJyZ21paSIsCi0JCVtQSFlfTU9ERV9UQkldID0gInRiaSIsCi0JCVtQSFlfTU9ERV9HTUlJXSA9ICJnbWlpIiwKLQkJW1BIWV9NT0RFX1JUQkldID0gInJ0YmkiLAotCQlbUEhZX01PREVfU0dNSUldID0gInNnbWlpIiwKLQl9OwogCiAJLyogUmVhZCBjb25maWcgZnJvbSBkZXZpY2UtdHJlZSAqLwogCWlmIChlbWFjX3JlYWRfdWludF9wcm9wKG5wLCAibWFsLWRldmljZSIsICZkZXYtPm1hbF9waCwgMSkpCkBAIC0yNTY2LDIzICsyNTU1LDkgQEAKIAkJZGV2LT5tYWxfYnVyc3Rfc2l6ZSA9IDI1NjsKIAogCS8qIFBIWSBtb2RlIG5lZWRzIHNvbWUgZGVjb2RpbmcgKi8KLQlkZXYtPnBoeV9tb2RlID0gUEhZX01PREVfTkE7Ci0JcG0gPSBvZl9nZXRfcHJvcGVydHkobnAsICJwaHktbW9kZSIsICZwbGVuKTsKLQlpZiAocG0gIT0gTlVMTCkgewotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGh5X21vZGVzKTsgaSsrKQotCQkJaWYgKCFzdHJjYXNlY21wKHBtLCBwaHlfbW9kZXNbaV0pKSB7Ci0JCQkJZGV2LT5waHlfbW9kZSA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JfQotCi0JLyogQmFja3dhcmQgY29tcGF0IHdpdGggbm9uLWZpbmFsIERUICovCi0JaWYgKGRldi0+cGh5X21vZGUgPT0gUEhZX01PREVfTkEgJiYgcG0gIT0gTlVMTCAmJiBwbGVuID09IDQpIHsKLQkJdTMyIG5tb2RlID0gKihjb25zdCB1MzIgKilwbTsKLQkJaWYgKG5tb2RlID4gUEhZX01PREVfTkEgJiYgbm1vZGUgPD0gUEhZX01PREVfU0dNSUkpCi0JCQlkZXYtPnBoeV9tb2RlID0gbm1vZGU7Ci0JfQorCWRldi0+cGh5X21vZGUgPSBvZl9nZXRfcGh5X21vZGUobnApOworCWlmIChkZXYtPnBoeV9tb2RlIDwgMCkKKwkJZGV2LT5waHlfbW9kZSA9IFBIWV9NT0RFX05BOwogCiAJLyogQ2hlY2sgRU1BQyB2ZXJzaW9uICovCiAJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiaWJtLGVtYWM0c3luYyIpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9lbWFjLmggYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9lbWFjLmgKaW5kZXggOGE2MWI1OS4uMTU2ODI3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvZW1hYy5oCisrKyBiL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL2VtYWMuaApAQCAtMjYsNiArMjYsNyBAQAogI2RlZmluZSBfX0lCTV9ORVdFTUFDX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CiAKIC8qIEVNQUMgcmVnaXN0ZXJzIAkJCVdyaXRlIEFjY2VzcyBydWxlcyAqLwogc3RydWN0IGVtYWNfcmVncyB7CkBAIC0xMDYsMTUgKzEwNywxNSBAQAogLyoKICAqIFBIWSBtb2RlIHNldHRpbmdzIChFTUFDIDwtPiBaTUlJL1JHTUlJIGJyaWRnZSA8LT4gUEhZKQogICovCi0jZGVmaW5lIFBIWV9NT0RFX05BCTAKLSNkZWZpbmUgUEhZX01PREVfTUlJCTEKLSNkZWZpbmUgUEhZX01PREVfUk1JSQkyCi0jZGVmaW5lIFBIWV9NT0RFX1NNSUkJMwotI2RlZmluZSBQSFlfTU9ERV9SR01JSQk0Ci0jZGVmaW5lIFBIWV9NT0RFX1RCSQk1Ci0jZGVmaW5lIFBIWV9NT0RFX0dNSUkJNgotI2RlZmluZSBQSFlfTU9ERV9SVEJJCTcKLSNkZWZpbmUgUEhZX01PREVfU0dNSUkJOAorI2RlZmluZSBQSFlfTU9ERV9OQQlQSFlfSU5URVJGQUNFX01PREVfTkEKKyNkZWZpbmUgUEhZX01PREVfTUlJCVBIWV9JTlRFUkZBQ0VfTU9ERV9NSUkKKyNkZWZpbmUgUEhZX01PREVfUk1JSQlQSFlfSU5URVJGQUNFX01PREVfUk1JSQorI2RlZmluZSBQSFlfTU9ERV9TTUlJCVBIWV9JTlRFUkZBQ0VfTU9ERV9TTUlJCisjZGVmaW5lIFBIWV9NT0RFX1JHTUlJCVBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSQorI2RlZmluZSBQSFlfTU9ERV9UQkkJUEhZX0lOVEVSRkFDRV9NT0RFX1RCSQorI2RlZmluZSBQSFlfTU9ERV9HTUlJCVBIWV9JTlRFUkZBQ0VfTU9ERV9HTUlJCisjZGVmaW5lIFBIWV9NT0RFX1JUQkkJUEhZX0lOVEVSRkFDRV9NT0RFX1JUQkkKKyNkZWZpbmUgUEhZX01PREVfU0dNSUkJUEhZX0lOVEVSRkFDRV9NT0RFX1NHTUlJCiAKIC8qIEVNQUN4X01SMCAqLwogI2RlZmluZSBFTUFDX01SMF9SWEkJCQkweDgwMDAwMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9waHkuYyBiL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL3BoeS5jCmluZGV4IGFjOWQ5NjQuLmFiNGU1OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL3BoeS5jCkBAIC0yOCwxMiArMjgsMTUgQEAKICNpbmNsdWRlICJlbWFjLmgiCiAjaW5jbHVkZSAicGh5LmgiCiAKLXN0YXRpYyBpbmxpbmUgaW50IHBoeV9yZWFkKHN0cnVjdCBtaWlfcGh5ICpwaHksIGludCByZWcpCisjZGVmaW5lIHBoeV9yZWFkIF9waHlfcmVhZAorI2RlZmluZSBwaHlfd3JpdGUgX3BoeV93cml0ZQorCitzdGF0aWMgaW5saW5lIGludCBfcGh5X3JlYWQoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IHJlZykKIHsKIAlyZXR1cm4gcGh5LT5tZGlvX3JlYWQocGh5LT5kZXYsIHBoeS0+YWRkcmVzcywgcmVnKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBoeV93cml0ZShzdHJ1Y3QgbWlpX3BoeSAqcGh5LCBpbnQgcmVnLCBpbnQgdmFsKQorc3RhdGljIGlubGluZSB2b2lkIF9waHlfd3JpdGUoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IHJlZywgaW50IHZhbCkKIHsKIAlwaHktPm1kaW9fd3JpdGUocGh5LT5kZXYsIHBoeS0+YWRkcmVzcywgcmVnLCB2YWwpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYwppbmRleCAxY2Q5Mzk0Li5jZmZiYzAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYwpAQCAtODA5LDcgKzgwOSw3IEBACiAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CiAgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOwogICAgIGNoYXIgKm5hbWU7Ci0gICAgaW50IGksIGosIHJldjsKKyAgICBpbnQgaSwgcmV2LCBqID0gMDsKICAgICB1bnNpZ25lZCBpbnQgaW9hZGRyOwogICAgIHVfbG9uZyBtaXI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmdlbS5jIGIvZHJpdmVycy9uZXQvc3VuZ2VtLmMKaW5kZXggYmU3NDVhZS4uYWRlMzVkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuZ2VtLmMKKysrIGIvZHJpdmVycy9uZXQvc3VuZ2VtLmMKQEAgLTQ2LDE0ICs0NiwxNSBAQAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgogCiAjaWZkZWYgQ09ORklHX1NQQVJDCiAjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QUENfUE1BQwogI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9wbWFjX2ZlYXR1cmUuaD4KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jcy5jCmluZGV4IGMwNTJhMGQuLjU0NDFhZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NzLmMKQEAgLTY0OCw2ICs2NDgsOCBAQAogCQkJCQkgMHg3NGM1ZTQwZCksCiAJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkRfUFJPRF9JRDEoMHgwMTU2LCAweDAwMDIsICJJbnRlcnNpbCIsCiAJCQkJCSAweDRiODAxYTE3KSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRF9QUk9EX0lEMygweDAxNTYsIDB4MDAwMiwgIlZlcnNpb24gMDEuMDIiLAorCQkJCQkgMHg0Yjc0YmFhMCksCiAJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDAsICJTYW5EaXNrIiwgIkNvbm5lY3RQbHVzIiwKIAkJCQkgICAgMHg3YTk1NGJkOSwgMHg3NGJlMDBjNiksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL29yaW5vY29fY3MuYwppbmRleCAzZjdmYzRhLi5kN2RiYzAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL29yaW5vY29fY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL29yaW5vY29fY3MuYwpAQCAtMjM5LDcgKzIzOSw2IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBvcmlub2NvX2NzX2lkc1tdID0gewogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDEwMSwgMHgwNzc3KSwgLyogM0NvbSBBaXJDb25uZWN0IFBDSSA3NzdBICovCi0JUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTU2LCAweDAwMDIpLCAvKiBMdWNlbnQgT3Jpbm9jbyBhbmQgb2xkIEludGVyc2lsICovCiAJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTZiLCAweDAwMDEpLCAvKiBFcmljc3NvbiBXTEFOIENhcmQgQzExICovCiAJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMWViLCAweDA4MGEpLCAvKiBOb3J0ZWwgTmV0d29ya3MgZU1vYmlsaXR5IDgwMi4xMSBXaXJlbGVzcyBBZGFwdGVyICovCiAJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjYxLCAweDAwMDIpLCAvKiBBaXJXYXkgODAyLjExIEFkYXB0ZXIgKFBDTUNJQSkgKi8KQEAgLTI3Miw2ICsyNzEsNyBAQAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQUk9YSU0iLCAiTEFOIFBDSSBDQVJEIEhBUk1PTlkgODAyMTFCIiwgMHhjNjUzNmE1ZSwgMHg5ZjQ5NGUyNiksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlNBTVNVTkciLCAiMTFNYnBzIFdMQU4gQ2FyZCIsIDB4NDNkNzRjYjQsIDB4NTc5YmQ5MWIpLAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJTeW1ib2wgVGVjaG5vbG9naWVzIiwgIkxBNDExMSBTcGVjdHJ1bTI0IFdpcmVsZXNzIExBTiBQQyBDYXJkIiwgMHgzZjAyYjRkNiwgMHgzNjYzY2IwZSksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkRfUFJPRF9JRDMoMHgwMTU2LCAweDAwMDIsICJWZXJzaW9uIDAxLjAxIiwgMHhkMjdkZWIxYSksIC8qIEx1Y2VudCBPcmlub2NvICovCiAjaWZkZWYgQ09ORklHX0hFUk1FU19QUklTTQogCS8qIE9ubHkgZW50cmllcyB0aGF0IGNlcnRhaW5seSBpZGVudGlmeSBQcmlzbSBjaGlwc2V0ICovCiAJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMDBiLCAweDcxMDApLCAvKiBTb25pY1dBTEwgTG9uZyBSYW5nZSBXaXJlbGVzcyBDYXJkICovCkBAIC0zMjEsNiArMzIxLDkgQEAKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQzKCJJU0wzNzEwMFAiLCAweDYzMGQ1MmIyKSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQzKCJJU0wzNzEwMVAtMTAiLCAweGRkOTdhMjZiKSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQzKCJJU0wzNzMwMFAiLCAweGM5MDQ5YTM5KSwKKworCS8qIFRoaXMgbWF5IGJlIEFnZXJlIG9yIEludGVyc2lsIEZpcm13YXJlICovCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTU2LCAweDAwMDIpLAogI2VuZGlmCiAJUENNQ0lBX0RFVklDRV9OVUxMLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvYWRkcmVzcy5jIGIvZHJpdmVycy9vZi9hZGRyZXNzLmMKaW5kZXggZGExZjRiOS4uNzJjMzNmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9hZGRyZXNzLmMKKysrIGIvZHJpdmVycy9vZi9hZGRyZXNzLmMKQEAgLTYxMCw2ICs2MTAsNiBAQAogCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCBpbmRleCwgJnJlcykpCiAJCXJldHVybiBOVUxMOwogCi0JcmV0dXJuIGlvcmVtYXAocmVzLnN0YXJ0LCAxICsgcmVzLmVuZCAtIHJlcy5zdGFydCk7CisJcmV0dXJuIGlvcmVtYXAocmVzLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyZXMpKTsKIH0KIEVYUE9SVF9TWU1CT0wob2ZfaW9tYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9iYXNlLmMgYi9kcml2ZXJzL29mL2Jhc2UuYwppbmRleCAwMmVkMzY3Li4zZmYyMmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL2Jhc2UuYworKysgYi9kcml2ZXJzL29mL2Jhc2UuYwpAQCAtNjEwLDggKzYxMCw5IEBACiAgKgogICogVGhlIG91dF92YWx1ZSBpcyBtb2RpZmllZCBvbmx5IGlmIGEgdmFsaWQgdTMyIHZhbHVlIGNhbiBiZSBkZWNvZGVkLgogICovCi1pbnQgb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwgY2hhciAqcHJvcG5hbWUsCi0JCQkgICAgICAgdTMyICpvdXRfdmFsdWVzLCBzaXplX3Qgc3opCitpbnQgb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCSAgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwgdTMyICpvdXRfdmFsdWVzLAorCQkJICAgICAgIHNpemVfdCBzeikKIHsKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCBwcm9wbmFtZSwgTlVMTCk7CiAJY29uc3QgX19iZTMyICp2YWw7CkBAIC02NDUsNyArNjQ2LDcgQEAKICAqCiAgKiBUaGUgb3V0X3N0cmluZyBwb2ludGVyIGlzIG1vZGlmaWVkIG9ubHkgaWYgYSB2YWxpZCBzdHJpbmcgY2FuIGJlIGRlY29kZWQuCiAgKi8KLWludCBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjaGFyICpwcm9wbmFtZSwKK2ludCBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpwcm9wbmFtZSwKIAkJCQljb25zdCBjaGFyICoqb3V0X3N0cmluZykKIHsKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCBwcm9wbmFtZSwgTlVMTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL2dwaW8uYyBiL2RyaXZlcnMvb2YvZ3Bpby5jCmluZGV4IDMwMDc2NjIuLmVmMDEwNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvZ3Bpby5jCisrKyBiL2RyaXZlcnMvb2YvZ3Bpby5jCkBAIC0xMjcsOCArMTI3LDggQEAKICAqIGdwaW8gY2hpcHMuIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgb25seSBvbmUgc2FuaXR5IGNoZWNrOiB3aGV0aGVyIGdwaW8KICAqIGlzIGxlc3MgdGhhbiBuZ3Bpb3MgKHRoYXQgaXMgc3BlY2lmaWVkIGluIHRoZSBncGlvX2NoaXApLgogICovCi1zdGF0aWMgaW50IG9mX2dwaW9fc2ltcGxlX3hsYXRlKHN0cnVjdCBncGlvX2NoaXAgKmdjLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCWNvbnN0IHZvaWQgKmdwaW9fc3BlYywgdTMyICpmbGFncykKK2ludCBvZl9ncGlvX3NpbXBsZV94bGF0ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCSBjb25zdCB2b2lkICpncGlvX3NwZWMsIHUzMiAqZmxhZ3MpCiB7CiAJY29uc3QgX19iZTMyICpncGlvID0gZ3Bpb19zcGVjOwogCWNvbnN0IHUzMiBuID0gYmUzMl90b19jcHVwKGdwaW8pOwpAQCAtMTUyLDYgKzE1Miw3IEBACiAKIAlyZXR1cm4gbjsKIH0KK0VYUE9SVF9TWU1CT0wob2ZfZ3Bpb19zaW1wbGVfeGxhdGUpOwogCiAvKioKICAqIG9mX21tX2dwaW9jaGlwX2FkZCAtIEFkZCBtZW1vcnkgbWFwcGVkIEdQSU8gY2hpcCAoYmFuaykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2Yvb2ZfbmV0LmMgYi9kcml2ZXJzL29mL29mX25ldC5jCmluZGV4IDg2ZjMzNGEuLmJiMTg0NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2Yvb2ZfbmV0LmMKKysrIGIvZHJpdmVycy9vZi9vZl9uZXQuYwpAQCAtOCw2ICs4LDUxIEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKworLyoqCisgKiBJdCBtYXBzICdlbnVtIHBoeV9pbnRlcmZhY2VfdCcgZm91bmQgaW4gaW5jbHVkZS9saW51eC9waHkuaAorICogaW50byB0aGUgZGV2aWNlIHRyZWUgYmluZGluZyBvZiAncGh5LW1vZGUnLCBzbyB0aGF0IEV0aGVybmV0CisgKiBkZXZpY2UgZHJpdmVyIGNhbiBnZXQgcGh5IGludGVyZmFjZSBmcm9tIGRldmljZSB0cmVlLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqcGh5X21vZGVzW10gPSB7CisJW1BIWV9JTlRFUkZBQ0VfTU9ERV9OQV0JCT0gIiIsCisJW1BIWV9JTlRFUkZBQ0VfTU9ERV9NSUldCT0gIm1paSIsCisJW1BIWV9JTlRFUkZBQ0VfTU9ERV9HTUlJXQk9ICJnbWlpIiwKKwlbUEhZX0lOVEVSRkFDRV9NT0RFX1NHTUlJXQk9ICJzZ21paSIsCisJW1BIWV9JTlRFUkZBQ0VfTU9ERV9UQkldCT0gInRiaSIsCisJW1BIWV9JTlRFUkZBQ0VfTU9ERV9STUlJXQk9ICJybWlpIiwKKwlbUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJXQk9ICJyZ21paSIsCisJW1BIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSV9JRF0JPSAicmdtaWktaWQiLAorCVtQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfUlhJRF0JPSAicmdtaWktcnhpZCIsCisJW1BIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSV9UWElEXSA9ICJyZ21paS10eGlkIiwKKwlbUEhZX0lOVEVSRkFDRV9NT0RFX1JUQkldCT0gInJ0YmkiLAorCVtQSFlfSU5URVJGQUNFX01PREVfU01JSV0JPSAic21paSIsCit9OworCisvKioKKyAqIG9mX2dldF9waHlfbW9kZSAtIEdldCBwaHkgbW9kZSBmb3IgZ2l2ZW4gZGV2aWNlX25vZGUKKyAqIEBucDoJUG9pbnRlciB0byB0aGUgZ2l2ZW4gZGV2aWNlX25vZGUKKyAqCisgKiBUaGUgZnVuY3Rpb24gZ2V0cyBwaHkgaW50ZXJmYWNlIHN0cmluZyBmcm9tIHByb3BlcnR5ICdwaHktbW9kZScsCisgKiBhbmQgcmV0dXJuIGl0cyBpbmRleCBpbiBwaHlfbW9kZXMgdGFibGUsIG9yIGVycm5vIGluIGVycm9yIGNhc2UuCisgKi8KK2NvbnN0IGludCBvZl9nZXRfcGh5X21vZGUoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwljb25zdCBjaGFyICpwbTsKKwlpbnQgZXJyLCBpOworCisJZXJyID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJwaHktbW9kZSIsICZwbSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwaHlfbW9kZXMpOyBpKyspCisJCWlmICghc3RyY2FzZWNtcChwbSwgcGh5X21vZGVzW2ldKSkKKwkJCXJldHVybiBpOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvZl9nZXRfcGh5X21vZGUpOwogCiAvKioKICAqIFNlYXJjaCB0aGUgZGV2aWNlIHRyZWUgZm9yIHRoZSBiZXN0IE1BQyBhZGRyZXNzIHRvIHVzZS4gICdtYWMtYWRkcmVzcycgaXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpX3BjaWhwLmMKaW5kZXggOGYzZmFmMy4uMDk1ZjI5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpX3BjaWhwLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpX3BjaWhwLmMKQEAgLTQwOCw3ICs0MDgsNyBAQAogfQogRVhQT1JUX1NZTUJPTChhY3BpX2dldF9ocF9od19jb250cm9sX2Zyb21fZmlybXdhcmUpOwogCi1zdGF0aWMgaW50IGlzX2VqZWN0YWJsZShhY3BpX2hhbmRsZSBoYW5kbGUpCitzdGF0aWMgaW50IHBjaWhwX2lzX2VqZWN0YWJsZShhY3BpX2hhbmRsZSBoYW5kbGUpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCWFjcGlfaGFuZGxlIHRtcDsKQEAgLTQ0Miw3ICs0NDIsNyBAQAogCQlyZXR1cm4gMDsKIAlpZiAoYnJpZGdlX2hhbmRsZSAhPSBwYXJlbnRfaGFuZGxlKQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gaXNfZWplY3RhYmxlKGhhbmRsZSk7CisJcmV0dXJuIHBjaWhwX2lzX2VqZWN0YWJsZShoYW5kbGUpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYWNwaV9wY2lfY2hlY2tfZWplY3RhYmxlKTsKIApAQCAtNDUwLDcgKzQ1MCw3IEBACiBjaGVja19ob3RwbHVnKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGx2bCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJ2KQogewogCWludCAqZm91bmQgPSAoaW50ICopY29udGV4dDsKLQlpZiAoaXNfZWplY3RhYmxlKGhhbmRsZSkpIHsKKwlpZiAocGNpaHBfaXNfZWplY3RhYmxlKGhhbmRsZSkpIHsKIAkJKmZvdW5kID0gMTsKIAkJcmV0dXJuIEFFX0NUUkxfVEVSTUlOQVRFOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCmluZGV4IGE3MGZhODkuLjIyMDI4NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYwpAQCAtMTEwLDcgKzExMCw3IEBACiB9CiAKIAotc3RhdGljIHN0cnVjdCBhY3BpX2RvY2tfb3BzIGFjcGlwaHBfZG9ja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZG9ja19vcHMgYWNwaXBocF9kb2NrX29wcyA9IHsKIAkuaGFuZGxlciA9IGhhbmRsZV9ob3RwbHVnX2V2ZW50X2Z1bmMsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jb3JlLmMKaW5kZXggNDk1MmMzYi4uZjFjZTk5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2NvcmUuYwpAQCAtODQwLDggKzg0MCw5IEBACiAJLyogTmVlZCB0byByZWFkIFZJRCBlYXJseSBiL2MgaXQncyB1c2VkIHRvIGRpZmZlcmVudGlhdGUgQ1BRIGFuZCBJTlRDCiAJICogZGlzY292ZXJ5CiAJICovCi0JcmMgPSBwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfVkVORE9SX0lELCAmdmVuZG9yX2lkKTsKLQlpZiAocmMgfHwgKCh2ZW5kb3JfaWQgIT0gUENJX1ZFTkRPUl9JRF9DT01QQVEpICYmICh2ZW5kb3JfaWQgIT0gUENJX1ZFTkRPUl9JRF9JTlRFTCkpKSB7CisJdmVuZG9yX2lkID0gcGRldi0+dmVuZG9yOworCWlmICgodmVuZG9yX2lkICE9IFBDSV9WRU5ET1JfSURfQ09NUEFRKSAmJgorCSAgICAodmVuZG9yX2lkICE9IFBDSV9WRU5ET1JfSURfSU5URUwpKSB7CiAJCWVycihtc2dfSFBDX25vbl9jb21wYXFfb3JfaW50ZWwpOwogCQlyYyA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX2Rpc2FibGVfZGV2aWNlOwpAQCAtODY4LDExICs4NjksNyBAQAogCS8qIFRPRE86IFRoaXMgY29kZSBjYW4gYmUgbWFkZSB0byBzdXBwb3J0IG5vbi1Db21wYXEgb3IgSW50ZWwKIAkgKiBzdWJzeXN0ZW0gSURzCiAJICovCi0JcmMgPSBwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnN1YnN5c3RlbV92aWQpOwotCWlmIChyYykgewotCQllcnIoIiVzIDogcGNpX3JlYWRfY29uZmlnX3dvcmQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX2Rpc2FibGVfZGV2aWNlOwotCX0KKwlzdWJzeXN0ZW1fdmlkID0gcGRldi0+c3Vic3lzdGVtX3ZlbmRvcjsKIAlkYmcoIlN1YnN5c3RlbSBWZW5kb3IgSUQ6ICV4XG4iLCBzdWJzeXN0ZW1fdmlkKTsKIAlpZiAoKHN1YnN5c3RlbV92aWQgIT0gUENJX1ZFTkRPUl9JRF9DT01QQVEpICYmIChzdWJzeXN0ZW1fdmlkICE9IFBDSV9WRU5ET1JfSURfSU5URUwpKSB7CiAJCWVycihtc2dfSFBDX25vbl9jb21wYXFfb3JfaW50ZWwpOwpAQCAtODg3LDExICs4ODQsNyBAQAogCQlnb3RvIGVycl9kaXNhYmxlX2RldmljZTsKIAl9CiAKLQlyYyA9IHBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TVUJTWVNURU1fSUQsICZzdWJzeXN0ZW1fZGV2aWNlaWQpOwotCWlmIChyYykgewotCQllcnIoIiVzIDogcGNpX3JlYWRfY29uZmlnX3dvcmQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX2ZyZWVfY3RybDsKLQl9CisJc3Vic3lzdGVtX2RldmljZWlkID0gcGRldi0+c3Vic3lzdGVtX2RldmljZTsKIAogCWluZm8oIkhvdCBQbHVnIFN1YnN5c3RlbSBEZXZpY2UgSUQ6ICV4XG4iLCBzdWJzeXN0ZW1fZGV2aWNlaWQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMKaW5kZXggMDg1ZGJiNS4uMWU5YzlhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYwpAQCAtMjEzLDYgKzIxMyw5IEBACiAJCWdvdG8gZXJyX2V4aXQ7CiAJfQogCisJLyogV2FpdCBmb3IgMSBzZWNvbmQgYWZ0ZXIgY2hlY2tpbmcgbGluayB0cmFpbmluZyBzdGF0dXMgKi8KKwltc2xlZXAoMTAwMCk7CisKIAkvKiBDaGVjayBmb3IgYSBwb3dlciBmYXVsdCAqLwogCWlmIChjdHJsLT5wb3dlcl9mYXVsdF9kZXRlY3RlZCB8fCBwY2llaHBfcXVlcnlfcG93ZXJfZmF1bHQocF9zbG90KSkgewogCQljdHJsX2VycihjdHJsLCAiUG93ZXIgZmF1bHQgb24gc2xvdCAlc1xuIiwgc2xvdF9uYW1lKHBfc2xvdCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYwppbmRleCA1MGEyM2RhLi45NmRjNDczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYwpAQCAtMjc1LDE2ICsyNzUsOSBAQAogICAgICAgICAgKiBob3QtcGx1ZyBjYXBhYmxlIGRvd25zdHJlYW0gcG9ydC4gQnV0IG9sZCBjb250cm9sbGVyIG1pZ2h0CiAgICAgICAgICAqIG5vdCBpbXBsZW1lbnQgaXQuIEluIHRoaXMgY2FzZSwgd2Ugd2FpdCBmb3IgMTAwMCBtcy4KICAgICAgICAgICovCi0gICAgICAgIGlmIChjdHJsLT5saW5rX2FjdGl2ZV9yZXBvcnRpbmcpewotICAgICAgICAgICAgICAgIC8qIFdhaXQgZm9yIERhdGEgTGluayBMYXllciBMaW5rIEFjdGl2ZSBiaXQgdG8gYmUgc2V0ICovCisgICAgICAgIGlmIChjdHJsLT5saW5rX2FjdGl2ZV9yZXBvcnRpbmcpCiAgICAgICAgICAgICAgICAgcGNpZV93YWl0X2xpbmtfYWN0aXZlKGN0cmwpOwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogV2UgbXVzdCB3YWl0IGZvciAxMDAgbXMgYWZ0ZXIgdGhlIERhdGEgTGluayBMYXllcgotICAgICAgICAgICAgICAgICAqIExpbmsgQWN0aXZlIGJpdCByZWFkcyAxYiBiZWZvcmUgaW5pdGlhdGluZyBhCi0gICAgICAgICAgICAgICAgICogY29uZmlndXJhdGlvbiBhY2Nlc3MgdG8gdGhlIGhvdCBhZGRlZCBkZXZpY2UuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgbXNsZWVwKDEwMCk7Ci0gICAgICAgIH0gZWxzZQorICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgbXNsZWVwKDEwMDApOwogCiAJcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfTE5LU1RBLCAmbG5rX3N0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaS5jCmluZGV4IDY5MjY3MWIuLjA4YTk1YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5jCkBAIC0xOTA1LDcgKzE5MDUsNyBAQAogewogCWludCBwb3M7CiAJdTMyIGNhcDsKLQl1MTYgY3RybDsKKwl1MTYgZmxhZ3MsIGN0cmw7CiAJc3RydWN0IHBjaV9kZXYgKmJyaWRnZTsKIAogCWlmICghcGNpX2lzX3BjaWUoZGV2KSB8fCBkZXYtPmRldmZuKQpAQCAtMTkyMyw2ICsxOTIzLDExIEBACiAJaWYgKCFwb3MpCiAJCXJldHVybjsKIAorCS8qIEFSSSBpcyBhIFBDSWUgdjIgZmVhdHVyZSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJyaWRnZSwgcG9zICsgUENJX0VYUF9GTEFHUywgJmZsYWdzKTsKKwlpZiAoKGZsYWdzICYgUENJX0VYUF9GTEFHU19WRVJTKSA8IDIpCisJCXJldHVybjsKKwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChicmlkZ2UsIHBvcyArIFBDSV9FWFBfREVWQ0FQMiwgJmNhcCk7CiAJaWYgKCEoY2FwICYgUENJX0VYUF9ERVZDQVAyX0FSSSkpCiAJCXJldHVybjsKQEAgLTMxODYsNyArMzE5MSw3IEBACiAgKiBAcnE6IG1heGltdW0gbWVtb3J5IHJlYWQgY291bnQgaW4gYnl0ZXMKICAqICAgIHZhbGlkIHZhbHVlcyBhcmUgMTI4LCAyNTYsIDUxMiwgMTAyNCwgMjA0OCwgNDA5NgogICoKLSAqIElmIHBvc3NpYmxlIHNldHMgbWF4aW11bSByZWFkIGJ5dGUgY291bnQKKyAqIElmIHBvc3NpYmxlIHNldHMgbWF4aW11bSBtZW1vcnkgcmVhZCByZXF1ZXN0IGluIGJ5dGVzCiAgKi8KIGludCBwY2llX3NldF9yZWFkcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHJxKQogewpAQCAtMzIwOSw3ICszMjE0LDcgQEAKIAlpZiAoKGN0bCAmIFBDSV9FWFBfREVWQ1RMX1JFQURSUSkgIT0gdikgewogCQljdGwgJj0gflBDSV9FWFBfREVWQ1RMX1JFQURSUTsKIAkJY3RsIHw9IHY7Ci0JCWVyciA9IHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBjYXAgKyBQQ0lfRVhQX0RFVkNUTCwgY3RsKTsKKwkJZXJyID0gcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgY2FwICsgUENJX0VYUF9ERVZDVEwsIGN0bCk7CiAJfQogCiBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfY29yZS5jIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2NvcmUuYwppbmRleCA0MzQyMWZiLi45Njc0ZTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9jb3JlLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KICNpbmNsdWRlICJhZXJkcnYuaCIKIAogc3RhdGljIGludCBmb3JjZWxvYWQ7CkBAIC00NDUsOCArNDQ2LDcgQEAKIAlyZXR1cm4gZHJ2OwogfQogCi1zdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCByZXNldF9saW5rKHN0cnVjdCBwY2llX2RldmljZSAqYWVyZGV2LAotCQlzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgcmVzZXRfbGluayhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBwY2lfZGV2ICp1ZGV2OwogCXBjaV9lcnNfcmVzdWx0X3Qgc3RhdHVzOwpAQCAtNDg2LDcgKzQ4Niw2IEBACiAKIC8qKgogICogZG9fcmVjb3ZlcnkgLSBoYW5kbGUgbm9uZmF0YWwvZmF0YWwgZXJyb3IgcmVjb3ZlcnkgcHJvY2VzcwotICogQGFlcmRldjogcG9pbnRlciB0byBhIHBjaWVfZGV2aWNlIGRhdGEgc3RydWN0dXJlIG9mIHJvb3QgcG9ydAogICogQGRldjogcG9pbnRlciB0byBhIHBjaV9kZXYgZGF0YSBzdHJ1Y3R1cmUgb2YgYWdlbnQgZGV0ZWN0aW5nIGFuIGVycm9yCiAgKiBAc2V2ZXJpdHk6IGVycm9yIHNldmVyaXR5IHR5cGUKICAqCkBAIC00OTQsOCArNDkzLDcgQEAKICAqIGVycm9yIGRldGVjdGVkIG1lc3NhZ2UgdG8gYWxsIGRvd25zdHJlYW0gZHJpdmVycyB3aXRoaW4gYSBoaWVyYXJjaHkgaW4KICAqIHF1ZXN0aW9uIGFuZCByZXR1cm4gdGhlIHJldHVybmVkIGNvZGUuCiAgKi8KLXN0YXRpYyB2b2lkIGRvX3JlY292ZXJ5KHN0cnVjdCBwY2llX2RldmljZSAqYWVyZGV2LCBzdHJ1Y3QgcGNpX2RldiAqZGV2LAotCQlpbnQgc2V2ZXJpdHkpCitzdGF0aWMgdm9pZCBkb19yZWNvdmVyeShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgc2V2ZXJpdHkpCiB7CiAJcGNpX2Vyc19yZXN1bHRfdCBzdGF0dXMsIHJlc3VsdCA9IFBDSV9FUlNfUkVTVUxUX1JFQ09WRVJFRDsKIAllbnVtIHBjaV9jaGFubmVsX3N0YXRlIHN0YXRlOwpAQCAtNTExLDcgKzUwOSw3IEBACiAJCQlyZXBvcnRfZXJyb3JfZGV0ZWN0ZWQpOwogCiAJaWYgKHNldmVyaXR5ID09IEFFUl9GQVRBTCkgewotCQlyZXN1bHQgPSByZXNldF9saW5rKGFlcmRldiwgZGV2KTsKKwkJcmVzdWx0ID0gcmVzZXRfbGluayhkZXYpOwogCQlpZiAocmVzdWx0ICE9IFBDSV9FUlNfUkVTVUxUX1JFQ09WRVJFRCkKIAkJCWdvdG8gZmFpbGVkOwogCX0KQEAgLTU3Niw5ICs1NzQsNzMgQEAKIAkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfRVJSX0NPUl9TVEFUVVMsCiAJCQkJCWluZm8tPnN0YXR1cyk7CiAJfSBlbHNlCi0JCWRvX3JlY292ZXJ5KGFlcmRldiwgZGV2LCBpbmZvLT5zZXZlcml0eSk7CisJCWRvX3JlY292ZXJ5KGRldiwgaW5mby0+c2V2ZXJpdHkpOwogfQogCisjaWZkZWYgQ09ORklHX0FDUElfQVBFSV9QQ0lFQUVSCitzdGF0aWMgdm9pZCBhZXJfcmVjb3Zlcl93b3JrX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKworI2RlZmluZSBBRVJfUkVDT1ZFUl9SSU5HX09SREVSCQk0CisjZGVmaW5lIEFFUl9SRUNPVkVSX1JJTkdfU0laRQkJKDEgPDwgQUVSX1JFQ09WRVJfUklOR19PUkRFUikKKworc3RydWN0IGFlcl9yZWNvdmVyX2VudHJ5Cit7CisJdTgJYnVzOworCXU4CWRldmZuOworCXUxNglkb21haW47CisJaW50CXNldmVyaXR5OworfTsKKworc3RhdGljIERFRklORV9LRklGTyhhZXJfcmVjb3Zlcl9yaW5nLCBzdHJ1Y3QgYWVyX3JlY292ZXJfZW50cnksCisJCSAgICBBRVJfUkVDT1ZFUl9SSU5HX1NJWkUpOworLyoKKyAqIE11dHVhbCBleGNsdXNpb24gZm9yIHdyaXRlcnMgb2YgYWVyX3JlY292ZXJfcmluZywgcmVhZGVyIHNpZGUgZG9uJ3QKKyAqIG5lZWQgbG9jaywgYmVjYXVzZSB0aGVyZSBpcyBvbmx5IG9uZSByZWFkZXIgYW5kIGxvY2sgaXMgbm90IG5lZWRlZAorICogYmV0d2VlbiByZWFkZXIgYW5kIHdyaXRlci4KKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhhZXJfcmVjb3Zlcl9yaW5nX2xvY2spOworc3RhdGljIERFQ0xBUkVfV09SSyhhZXJfcmVjb3Zlcl93b3JrLCBhZXJfcmVjb3Zlcl93b3JrX2Z1bmMpOworCit2b2lkIGFlcl9yZWNvdmVyX3F1ZXVlKGludCBkb21haW4sIHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJICAgICAgIGludCBzZXZlcml0eSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBhZXJfcmVjb3Zlcl9lbnRyeSBlbnRyeSA9IHsKKwkJLmJ1cwkJPSBidXMsCisJCS5kZXZmbgkJPSBkZXZmbiwKKwkJLmRvbWFpbgkJPSBkb21haW4sCisJCS5zZXZlcml0eQk9IHNldmVyaXR5LAorCX07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWVyX3JlY292ZXJfcmluZ19sb2NrLCBmbGFncyk7CisJaWYgKGtmaWZvX3B1dCgmYWVyX3JlY292ZXJfcmluZywgJmVudHJ5KSkKKwkJc2NoZWR1bGVfd29yaygmYWVyX3JlY292ZXJfd29yayk7CisJZWxzZQorCQlwcl9lcnIoIkFFUiByZWNvdmVyOiBCdWZmZXIgb3ZlcmZsb3cgd2hlbiByZWNvdmVyaW5nIEFFUiBmb3IgJTA0eDolMDJ4OiUwMng6JXhcbiIsCisJCSAgICAgICBkb21haW4sIGJ1cywgUENJX1NMT1QoZGV2Zm4pLCBQQ0lfRlVOQyhkZXZmbikpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFlcl9yZWNvdmVyX3JpbmdfbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWVyX3JlY292ZXJfcXVldWUpOworCitzdGF0aWMgdm9pZCBhZXJfcmVjb3Zlcl93b3JrX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhZXJfcmVjb3Zlcl9lbnRyeSBlbnRyeTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCXdoaWxlIChrZmlmb19nZXQoJmFlcl9yZWNvdmVyX3JpbmcsICZlbnRyeSkpIHsKKwkJcGRldiA9IHBjaV9nZXRfZG9tYWluX2J1c19hbmRfc2xvdChlbnRyeS5kb21haW4sIGVudHJ5LmJ1cywKKwkJCQkJCSAgIGVudHJ5LmRldmZuKTsKKwkJaWYgKCFwZGV2KSB7CisJCQlwcl9lcnIoIkFFUiByZWNvdmVyOiBDYW4gbm90IGZpbmQgcGNpX2RldiBmb3IgJTA0eDolMDJ4OiUwMng6JXhcbiIsCisJCQkgICAgICAgZW50cnkuZG9tYWluLCBlbnRyeS5idXMsCisJCQkgICAgICAgUENJX1NMT1QoZW50cnkuZGV2Zm4pLCBQQ0lfRlVOQyhlbnRyeS5kZXZmbikpOworCQkJY29udGludWU7CisJCX0KKwkJZG9fcmVjb3ZlcnkocGRldiwgZW50cnkuc2V2ZXJpdHkpOworCX0KK30KKyNlbmRpZgorCiAvKioKICAqIGdldF9kZXZpY2VfZXJyb3JfaW5mbyAtIHJlYWQgZXJyb3Igc3RhdHVzIGZyb20gZGV2IGFuZCBzdG9yZSBpdCB0byBpbmZvCiAgKiBAZGV2OiBwb2ludGVyIHRvIHRoZSBkZXZpY2UgZXhwZWN0ZWQgdG8gaGF2ZSBhIGVycm9yIHJlY29yZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2VycnByaW50LmMgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfZXJycHJpbnQuYwppbmRleCBiMDdhNDJlLi4zZWE1MTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfZXJycHJpbnQuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfZXJycHJpbnQuYwpAQCAtMjA0LDcgKzIwNCw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfQUNQSV9BUEVJX1BDSUVBRVIKLXN0YXRpYyBpbnQgY3Blcl9zZXZlcml0eV90b19hZXIoaW50IGNwZXJfc2V2ZXJpdHkpCitpbnQgY3Blcl9zZXZlcml0eV90b19hZXIoaW50IGNwZXJfc2V2ZXJpdHkpCiB7CiAJc3dpdGNoIChjcGVyX3NldmVyaXR5KSB7CiAJY2FzZSBDUEVSX1NFVl9SRUNPVkVSQUJMRToKQEAgLTIxNSw2ICsyMTUsNyBAQAogCQlyZXR1cm4gQUVSX0NPUlJFQ1RBQkxFOwogCX0KIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGNwZXJfc2V2ZXJpdHlfdG9fYWVyKTsKIAogdm9pZCBjcGVyX3ByaW50X2Flcihjb25zdCBjaGFyICpwcmVmaXgsIGludCBjcGVyX3NldmVyaXR5LAogCQkgICAgc3RydWN0IGFlcl9jYXBhYmlsaXR5X3JlZ3MgKmFlcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3Byb2JlLmMgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCmluZGV4IDlhYjQ5MmYuLjc5NWM5MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3Byb2JlLmMKKysrIGIvZHJpdmVycy9wY2kvcHJvYmUuYwpAQCAtNjgsMjEgKzY4LDYgQEAKIH0KIHBvc3Rjb3JlX2luaXRjYWxsKHBjaWJ1c19jbGFzc19pbml0KTsKIAotLyoKLSAqIFRyYW5zbGF0ZSB0aGUgbG93IGJpdHMgb2YgdGhlIFBDSSBiYXNlCi0gKiB0byB0aGUgcmVzb3VyY2UgdHlwZQotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBwY2lfY2FsY19yZXNvdXJjZV9mbGFncyh1bnNpZ25lZCBpbnQgZmxhZ3MpCi17Ci0JaWYgKGZsYWdzICYgUENJX0JBU0VfQUREUkVTU19TUEFDRV9JTykKLQkJcmV0dXJuIElPUkVTT1VSQ0VfSU87Ci0KLQlpZiAoZmxhZ3MgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9QUkVGRVRDSCkKLQkJcmV0dXJuIElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9QUkVGRVRDSDsKLQotCXJldHVybiBJT1JFU09VUkNFX01FTTsKLX0KLQogc3RhdGljIHU2NCBwY2lfc2l6ZSh1NjQgYmFzZSwgdTY0IG1heGJhc2UsIHU2NCBtYXNrKQogewogCXU2NCBzaXplID0gbWFzayAmIG1heGJhc2U7CS8qIEZpbmQgdGhlIHNpZ25pZmljYW50IGJpdHMgKi8KQEAgLTEwMSwxOCArODYsMzkgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotc3RhdGljIGlubGluZSBlbnVtIHBjaV9iYXJfdHlwZSBkZWNvZGVfYmFyKHN0cnVjdCByZXNvdXJjZSAqcmVzLCB1MzIgYmFyKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGRlY29kZV9iYXIoc3RydWN0IHBjaV9kZXYgKmRldiwgdTMyIGJhcikKIHsKKwl1MzIgbWVtX3R5cGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwogCWlmICgoYmFyICYgUENJX0JBU0VfQUREUkVTU19TUEFDRSkgPT0gUENJX0JBU0VfQUREUkVTU19TUEFDRV9JTykgewotCQlyZXMtPmZsYWdzID0gYmFyICYgflBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKLQkJcmV0dXJuIHBjaV9iYXJfaW87CisJCWZsYWdzID0gYmFyICYgflBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKKwkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9JTzsKKwkJcmV0dXJuIGZsYWdzOwogCX0KIAotCXJlcy0+ZmxhZ3MgPSBiYXIgJiB+UENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKwlmbGFncyA9IGJhciAmIH5QQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworCWZsYWdzIHw9IElPUkVTT1VSQ0VfTUVNOworCWlmIChmbGFncyAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX1BSRUZFVENIKQorCQlmbGFncyB8PSBJT1JFU09VUkNFX1BSRUZFVENIOwogCi0JaWYgKHJlcy0+ZmxhZ3MgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0KQotCQlyZXR1cm4gcGNpX2Jhcl9tZW02NDsKLQlyZXR1cm4gcGNpX2Jhcl9tZW0zMjsKKwltZW1fdHlwZSA9IGJhciAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfTUFTSzsKKwlzd2l0Y2ggKG1lbV90eXBlKSB7CisJY2FzZSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzMyOgorCQlicmVhazsKKwljYXNlIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfMU06CisJCWRldl9pbmZvKCZkZXYtPmRldiwgIjFNIG1lbSBCQVIgdHJlYXRlZCBhcyAzMi1iaXQgQkFSXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0OgorCQlmbGFncyB8PSBJT1JFU09VUkNFX01FTV82NDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oJmRldi0+ZGV2LAorCQkJICJtZW0gdW5rbm93biB0eXBlICV4IHRyZWF0ZWQgYXMgMzItYml0IEJBUlxuIiwKKwkJCSBtZW1fdHlwZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZmxhZ3M7CiB9CiAKIC8qKgpAQCAtMTY1LDkgKzE3MSw5IEBACiAJCWwgPSAwOwogCiAJaWYgKHR5cGUgPT0gcGNpX2Jhcl91bmtub3duKSB7Ci0JCXR5cGUgPSBkZWNvZGVfYmFyKHJlcywgbCk7Ci0JCXJlcy0+ZmxhZ3MgfD0gcGNpX2NhbGNfcmVzb3VyY2VfZmxhZ3MobCkgfCBJT1JFU09VUkNFX1NJWkVBTElHTjsKLQkJaWYgKHR5cGUgPT0gcGNpX2Jhcl9pbykgeworCQlyZXMtPmZsYWdzID0gZGVjb2RlX2JhcihkZXYsIGwpOworCQlyZXMtPmZsYWdzIHw9IElPUkVTT1VSQ0VfU0laRUFMSUdOOworCQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKIAkJCWwgJj0gUENJX0JBU0VfQUREUkVTU19JT19NQVNLOwogCQkJbWFzayA9IFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSyAmICh1MzIpIElPX1NQQUNFX0xJTUlUOwogCQl9IGVsc2UgewpAQCAtMTgwLDcgKzE4Niw3IEBACiAJCW1hc2sgPSAodTMyKVBDSV9ST01fQUREUkVTU19NQVNLOwogCX0KIAotCWlmICh0eXBlID09IHBjaV9iYXJfbWVtNjQpIHsKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNXzY0KSB7CiAJCXU2NCBsNjQgPSBsOwogCQl1NjQgc3o2NCA9IHN6OwogCQl1NjQgbWFzazY0ID0gbWFzayB8ICh1NjQpfjAgPDwgMzI7CkBAIC0yMDQsNyArMjEwLDYgQEAKIAkJCWdvdG8gZmFpbDsKIAkJfQogCi0JCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU1fNjQ7CiAJCWlmICgoc2l6ZW9mKHJlc291cmNlX3NpemVfdCkgPCA4KSAmJiBsKSB7CiAJCQkvKiBBZGRyZXNzIGFib3ZlIDMyLWJpdCBib3VuZGFyeTsgZGlzYWJsZSB0aGUgQkFSICovCiAJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcG9zLCAwKTsKQEAgLTIzMCw3ICsyMzUsNyBAQAogCX0KIAogIG91dDoKLQlyZXR1cm4gKHR5cGUgPT0gcGNpX2Jhcl9tZW02NCkgPyAxIDogMDsKKwlyZXR1cm4gKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTV82NCkgPyAxIDogMDsKICBmYWlsOgogCXJlcy0+ZmxhZ3MgPSAwOwogCWdvdG8gb3V0OwpAQCAtMjg0LDEwICsyODksNiBAQAogCQlpZiAoIXJlcy0+ZW5kKQogCQkJcmVzLT5lbmQgPSBsaW1pdCArIDB4ZmZmOwogCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZkZXYtPmRldiwgIiAgYnJpZGdlIHdpbmRvdyAlcFJcbiIsIHJlcyk7Ci0JfSBlbHNlIHsKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsCi0JCQkgIiAgYnJpZGdlIHdpbmRvdyBbaW8gICUjMDZseC0lIzA2bHhdIChkaXNhYmxlZClcbiIsCi0JCQkJIGJhc2UsIGxpbWl0KTsKIAl9CiB9CiAKQEAgLTMwOCwxMCArMzA5LDYgQEAKIAkJcmVzLT5zdGFydCA9IGJhc2U7CiAJCXJlcy0+ZW5kID0gbGltaXQgKyAweGZmZmZmOwogCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZkZXYtPmRldiwgIiAgYnJpZGdlIHdpbmRvdyAlcFJcbiIsIHJlcyk7Ci0JfSBlbHNlIHsKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsCi0JCQkiICBicmlkZ2Ugd2luZG93IFttZW0gJSMwMTBseC0lIzAxMGx4XSAoZGlzYWJsZWQpXG4iLAotCQkJCQkgYmFzZSwgbGltaXQgKyAweGZmZmZmKTsKIAl9CiB9CiAKQEAgLTM1OSwxMCArMzU2LDYgQEAKIAkJcmVzLT5zdGFydCA9IGJhc2U7CiAJCXJlcy0+ZW5kID0gbGltaXQgKyAweGZmZmZmOwogCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZkZXYtPmRldiwgIiAgYnJpZGdlIHdpbmRvdyAlcFJcbiIsIHJlcyk7Ci0JfSBlbHNlIHsKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsCi0JCSAgICAgIiAgYnJpZGdlIHdpbmRvdyBbbWVtICUjMDEwbHgtJSMwMTBseCBwcmVmXSAoZGlzYWJsZWQpXG4iLAotCQkJCQkgYmFzZSwgbGltaXQgKyAweGZmZmZmKTsKIAl9CiB9CiAKQEAgLTcyNSwxMiArNzE4LDE0IEBACiAJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9TVEFUVVMsIDB4ZmZmZik7CiAKIAkJLyogUHJldmVudCBhc3NpZ25pbmcgYSBidXMgbnVtYmVyIHRoYXQgYWxyZWFkeSBleGlzdHMuCi0JCSAqIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgYnJpZGdlIGlzIGhvdC1wbHVnZ2VkICovCi0JCWlmIChwY2lfZmluZF9idXMocGNpX2RvbWFpbl9ucihidXMpLCBtYXgrMSkpCi0JCQlnb3RvIG91dDsKLQkJY2hpbGQgPSBwY2lfYWRkX25ld19idXMoYnVzLCBkZXYsICsrbWF4KTsKLQkJaWYgKCFjaGlsZCkKLQkJCWdvdG8gb3V0OworCQkgKiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGJyaWRnZSBpcyBob3QtcGx1Z2dlZCwgc28gaW4KKwkJICogdGhpcyBjYXNlIHdlIG9ubHkgcmUtc2NhbiB0aGlzIGJ1cy4gKi8KKwkJY2hpbGQgPSBwY2lfZmluZF9idXMocGNpX2RvbWFpbl9ucihidXMpLCBtYXgrMSk7CisJCWlmICghY2hpbGQpIHsKKwkJCWNoaWxkID0gcGNpX2FkZF9uZXdfYnVzKGJ1cywgZGV2LCArK21heCk7CisJCQlpZiAoIWNoaWxkKQorCQkJCWdvdG8gb3V0OworCQl9CiAJCWJ1c2VzID0gKGJ1c2VzICYgMHhmZjAwMDAwMCkKIAkJICAgICAgfCAoKHVuc2lnbmVkIGludCkoY2hpbGQtPnByaW1hcnkpICAgICA8PCAgMCkKIAkJICAgICAgfCAoKHVuc2lnbmVkIGludCkoY2hpbGQtPnNlY29uZGFyeSkgICA8PCAgOCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jIGIvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKaW5kZXggOTk5NTg0Mi4uOGExZDNjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKQEAgLTMzNiw3ICszMzYsNiBAQAogCQkvKiBDbGVhciB1cHBlciAxNiBiaXRzIG9mIEkvTyBiYXNlL2xpbWl0LiAqLwogCQlpb191cHBlcjE2ID0gMDsKIAkJbCA9IDB4MDBmMDsKLQkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBicmlkZ2Ugd2luZG93IFtpbyAgZGlzYWJsZWRdXG4iKTsKIAl9CiAJLyogVGVtcG9yYXJpbHkgZGlzYWJsZSB0aGUgSS9PIHJhbmdlIGJlZm9yZSB1cGRhdGluZyBQQ0lfSU9fQkFTRS4gKi8KIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyaWRnZSwgUENJX0lPX0JBU0VfVVBQRVIxNiwgMHgwMDAwZmZmZik7CkBAIC0zNjIsNyArMzYxLDYgQEAKIAkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBicmlkZ2Ugd2luZG93ICVwUlxuIiwgcmVzKTsKIAl9IGVsc2UgewogCQlsID0gMHgwMDAwZmZmMDsKLQkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBicmlkZ2Ugd2luZG93IFttZW0gZGlzYWJsZWRdXG4iKTsKIAl9CiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmlkZ2UsIFBDSV9NRU1PUllfQkFTRSwgbCk7CiB9CkBAIC0zOTMsNyArMzkxLDYgQEAKIAkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBicmlkZ2Ugd2luZG93ICVwUlxuIiwgcmVzKTsKIAl9IGVsc2UgewogCQlsID0gMHgwMDAwZmZmMDsKLQkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBicmlkZ2Ugd2luZG93IFttZW0gcHJlZiBkaXNhYmxlZF1cbiIpOwogCX0KIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyaWRnZSwgUENJX1BSRUZfTUVNT1JZX0JBU0UsIGwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zZXR1cC1pcnEuYyBiL2RyaXZlcnMvcGNpL3NldHVwLWlycS5jCmluZGV4IGVlYzk3MzguLmViMjE5YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3NldHVwLWlycS5jCisrKyBiL2RyaXZlcnMvcGNpL3NldHVwLWlycS5jCkBAIC0yMSw3ICsyMSw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQKIHBkZXZfZml4dXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsCiAJICAgICAgIHU4ICgqc3dpenpsZSkoc3RydWN0IHBjaV9kZXYgKiwgdTggKiksCi0JICAgICAgIGludCAoKm1hcF9pcnEpKHN0cnVjdCBwY2lfZGV2ICosIHU4LCB1OCkpCisJICAgICAgIGludCAoKm1hcF9pcnEpKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICosIHU4LCB1OCkpCiB7CiAJdTggcGluLCBzbG90OwogCWludCBpcnEgPSAwOwpAQCAtNTYsNyArNTYsNyBAQAogCiB2b2lkIF9faW5pdAogcGNpX2ZpeHVwX2lycXModTggKCpzd2l6emxlKShzdHJ1Y3QgcGNpX2RldiAqLCB1OCAqKSwKLQkgICAgICAgaW50ICgqbWFwX2lycSkoc3RydWN0IHBjaV9kZXYgKiwgdTgsIHU4KSkKKwkgICAgICAgaW50ICgqbWFwX2lycSkoY29uc3Qgc3RydWN0IHBjaV9kZXYgKiwgdTgsIHU4KSkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKIAlmb3JfZWFjaF9wY2lfZGV2KGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5jIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKaW5kZXggYmMwZTZlZS4uMzE5ZjM1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKQEAgLTc0LDggKzc0LDcgQEAKIAkJCXJlc25vLCBuZXcsIGNoZWNrKTsKIAl9CiAKLQlpZiAoKG5ldyAmIChQQ0lfQkFTRV9BRERSRVNTX1NQQUNFfFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfTUFTSykpID09Ci0JICAgIChQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX01FTU9SWXxQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0KSkgeworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU1fNjQpIHsKIAkJbmV3ID0gcmVnaW9uLnN0YXJ0ID4+IDE2ID4+IDE2OwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcmVnICsgNCwgbmV3KTsKIAkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcmVnICsgNCwgJmNoZWNrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYWxsb29uMy5jIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2JhbGxvb24zLmMKaW5kZXggNGMzZTk0Yy4uZjU2ZDdkZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYWxsb29uMy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYWxsb29uMy5jCkBAIC0xMDMsMjIgKzEwMywxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBiYWxsb29uM19wY21jaWFfc29ja2V0X2luaXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIGJhbGxvb24zX3BjbWNpYV9zb2NrZXRfc3VzcGVuZChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQogc3RhdGljIHN0cnVjdCBwY21jaWFfbG93X2xldmVsIGJhbGxvb24zX3BjbWNpYV9vcHMgPSB7CiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuaHdfaW5pdAkJPSBiYWxsb29uM19wY21jaWFfaHdfaW5pdCwKIAkuaHdfc2h1dGRvd24JCT0gYmFsbG9vbjNfcGNtY2lhX2h3X3NodXRkb3duLAogCS5zb2NrZXRfc3RhdGUJCT0gYmFsbG9vbjNfcGNtY2lhX3NvY2tldF9zdGF0ZSwKIAkuY29uZmlndXJlX3NvY2tldAk9IGJhbGxvb24zX3BjbWNpYV9jb25maWd1cmVfc29ja2V0LAotCS5zb2NrZXRfaW5pdAkJPSBiYWxsb29uM19wY21jaWFfc29ja2V0X2luaXQsCi0JLnNvY2tldF9zdXNwZW5kCQk9IGJhbGxvb24zX3BjbWNpYV9zb2NrZXRfc3VzcGVuZCwKIAkuZmlyc3QJCQk9IDAsCiAJLm5yCQkJPSAxLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94MjU1LmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY21feDI1NS5jCmluZGV4IDA1OTEzZDAuLjYzZjRkNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94MjU1LmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NtX3gyNTUuYwpAQCAtMTAyLDIzICsxMDIsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY214MjU1X3BjbWNpYV9zb2NrZXRfaW5pdChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQotc3RhdGljIHZvaWQgY214MjU1X3BjbWNpYV9zb2NrZXRfc3VzcGVuZChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQotCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgY214MjU1X3BjbWNpYV9vcHMgX19pbml0ZGF0YSA9IHsKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5od19pbml0CQk9IGNteDI1NV9wY21jaWFfaHdfaW5pdCwKIAkuaHdfc2h1dGRvd24JCT0gY214MjU1X3BjbWNpYV9zaHV0ZG93biwKIAkuc29ja2V0X3N0YXRlCQk9IGNteDI1NV9wY21jaWFfc29ja2V0X3N0YXRlLAogCS5jb25maWd1cmVfc29ja2V0CT0gY214MjU1X3BjbWNpYV9jb25maWd1cmVfc29ja2V0LAotCS5zb2NrZXRfaW5pdAkJPSBjbXgyNTVfcGNtY2lhX3NvY2tldF9pbml0LAotCS5zb2NrZXRfc3VzcGVuZAkJPSBjbXgyNTVfcGNtY2lhX3NvY2tldF9zdXNwZW5kLAogCS5ucgkJCT0gMSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94MjcwLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY21feDI3MC5jCmluZGV4IDU2NjI2NDYuLjZlZTQyYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94MjcwLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NtX3gyNzAuYwpAQCAtODIsMjMgKzgyLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGNteDI3MF9wY21jaWFfc29ja2V0X2luaXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIGNteDI3MF9wY21jaWFfc29ja2V0X3N1c3BlbmQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCi17Ci19Ci0KLQogc3RhdGljIHN0cnVjdCBwY21jaWFfbG93X2xldmVsIGNteDI3MF9wY21jaWFfb3BzIF9faW5pdGRhdGEgPSB7CiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuaHdfaW5pdAkJPSBjbXgyNzBfcGNtY2lhX2h3X2luaXQsCiAJLmh3X3NodXRkb3duCQk9IGNteDI3MF9wY21jaWFfc2h1dGRvd24sCiAJLnNvY2tldF9zdGF0ZQkJPSBjbXgyNzBfcGNtY2lhX3NvY2tldF9zdGF0ZSwKIAkuY29uZmlndXJlX3NvY2tldAk9IGNteDI3MF9wY21jaWFfY29uZmlndXJlX3NvY2tldCwKLQkuc29ja2V0X2luaXQJCT0gY214MjcwX3BjbWNpYV9zb2NrZXRfaW5pdCwKLQkuc29ja2V0X3N1c3BlbmQJCT0gY214MjcwX3BjbWNpYV9zb2NrZXRfc3VzcGVuZCwKIAkubnIJCQk9IDEsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY29saWJyaS5jIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NvbGlicmkuYwppbmRleCA0NDNjYjdmLi5jNmRlYzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY29saWJyaS5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jb2xpYnJpLmMKQEAgLTExNiwxNCArMTE2LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY29saWJyaV9wY21jaWFfc29ja2V0X2luaXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbGlicmlfcGNtY2lhX3NvY2tldF9zdXNwZW5kKHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQotewotfQotCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgY29saWJyaV9wY21jaWFfb3BzID0gewogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAKQEAgLTEzNSw5ICsxMjcsNiBAQAogCiAJLnNvY2tldF9zdGF0ZQkJPSBjb2xpYnJpX3BjbWNpYV9zb2NrZXRfc3RhdGUsCiAJLmNvbmZpZ3VyZV9zb2NrZXQJPSBjb2xpYnJpX3BjbWNpYV9jb25maWd1cmVfc29ja2V0LAotCi0JLnNvY2tldF9pbml0CQk9IGNvbGlicmlfcGNtY2lhX3NvY2tldF9pbml0LAotCS5zb2NrZXRfc3VzcGVuZAkJPSBjb2xpYnJpX3BjbWNpYV9zb2NrZXRfc3VzcGVuZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpjb2xpYnJpX3BjbWNpYV9kZXZpY2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfbWFpbnN0b25lLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfbWFpbnN0b25lLmMKaW5kZXggOTIwMTZmZS4uYWRlZDcwNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9tYWluc3RvbmUuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfbWFpbnN0b25lLmMKQEAgLTEyOCwyMiArMTI4LDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgbXN0X3BjbWNpYV9zb2NrZXRfaW5pdChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQotc3RhdGljIHZvaWQgbXN0X3BjbWNpYV9zb2NrZXRfc3VzcGVuZChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQogc3RhdGljIHN0cnVjdCBwY21jaWFfbG93X2xldmVsIG1zdF9wY21jaWFfb3BzIF9faW5pdGRhdGEgPSB7CiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuaHdfaW5pdAkJPSBtc3RfcGNtY2lhX2h3X2luaXQsCiAJLmh3X3NodXRkb3duCQk9IG1zdF9wY21jaWFfaHdfc2h1dGRvd24sCiAJLnNvY2tldF9zdGF0ZQkJPSBtc3RfcGNtY2lhX3NvY2tldF9zdGF0ZSwKIAkuY29uZmlndXJlX3NvY2tldAk9IG1zdF9wY21jaWFfY29uZmlndXJlX3NvY2tldCwKLQkuc29ja2V0X2luaXQJCT0gbXN0X3BjbWNpYV9zb2NrZXRfaW5pdCwKLQkuc29ja2V0X3N1c3BlbmQJCT0gbXN0X3BjbWNpYV9zb2NrZXRfc3VzcGVuZCwKIAkubnIJCQk9IDIsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfcGFsbWxkLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfcGFsbWxkLmMKaW5kZXggNjlmNzM2Ny4uZDU4OWFkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3BhbG1sZC5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9wYWxtbGQuYwpAQCAtNjUsMTQgKzY1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcGFsbWxkX3BjbWNpYV9zb2NrZXRfaW5pdChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQotc3RhdGljIHZvaWQgcGFsbWxkX3BjbWNpYV9zb2NrZXRfc3VzcGVuZChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQogc3RhdGljIHN0cnVjdCBwY21jaWFfbG93X2xldmVsIHBhbG1sZF9wY21jaWFfb3BzID0gewogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAKQEAgLTg0LDkgKzc2LDYgQEAKIAogCS5zb2NrZXRfc3RhdGUJCT0gcGFsbWxkX3BjbWNpYV9zb2NrZXRfc3RhdGUsCiAJLmNvbmZpZ3VyZV9zb2NrZXQJPSBwYWxtbGRfcGNtY2lhX2NvbmZpZ3VyZV9zb2NrZXQsCi0KLQkuc29ja2V0X2luaXQJCT0gcGFsbWxkX3BjbWNpYV9zb2NrZXRfaW5pdCwKLQkuc29ja2V0X3N1c3BlbmQJCT0gcGFsbWxkX3BjbWNpYV9zb2NrZXRfc3VzcGVuZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwYWxtbGRfcGNtY2lhX2RldmljZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9wYWxtdGMuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9wYWxtdGMuYwppbmRleCBkMGFkNmE3Li45YzZhMDRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfcGFsbXRjLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X3BhbG10Yy5jCkBAIC0xMTcsMTQgKzExNyw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgcGFsbXRjX3BjbWNpYV9zb2NrZXRfaW5pdChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQotc3RhdGljIHZvaWQgcGFsbXRjX3BjbWNpYV9zb2NrZXRfc3VzcGVuZChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQogc3RhdGljIHN0cnVjdCBwY21jaWFfbG93X2xldmVsIHBhbG10Y19wY21jaWFfb3BzID0gewogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAKQEAgLTEzNiw5ICsxMjgsNiBAQAogCiAJLnNvY2tldF9zdGF0ZQkJPSBwYWxtdGNfcGNtY2lhX3NvY2tldF9zdGF0ZSwKIAkuY29uZmlndXJlX3NvY2tldAk9IHBhbG10Y19wY21jaWFfY29uZmlndXJlX3NvY2tldCwKLQotCS5zb2NrZXRfaW5pdAkJPSBwYWxtdGNfcGNtY2lhX3NvY2tldF9pbml0LAotCS5zb2NrZXRfc3VzcGVuZAkJPSBwYWxtdGNfcGNtY2lhX3NvY2tldF9zdXNwZW5kLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBhbG10Y19wY21jaWFfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3BhbG10eC5jIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X3BhbG10eC5jCmluZGV4IDFhMjU4MDQuLjgwNjQ1YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9wYWxtdHguYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfcGFsbXR4LmMKQEAgLTY3LDE0ICs2Nyw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHBhbG10eF9wY21jaWFfc29ja2V0X2luaXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIHBhbG10eF9wY21jaWFfc29ja2V0X3N1c3BlbmQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCi17Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCBwYWxtdHhfcGNtY2lhX29wcyA9IHsKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCkBAIC04Niw5ICs3OCw2IEBACiAKIAkuc29ja2V0X3N0YXRlCQk9IHBhbG10eF9wY21jaWFfc29ja2V0X3N0YXRlLAogCS5jb25maWd1cmVfc29ja2V0CT0gcGFsbXR4X3BjbWNpYV9jb25maWd1cmVfc29ja2V0LAotCi0JLnNvY2tldF9pbml0CQk9IHBhbG10eF9wY21jaWFfc29ja2V0X2luaXQsCi0JLnNvY2tldF9zdXNwZW5kCQk9IHBhbG10eF9wY21jaWFfc29ja2V0X3N1c3BlbmQsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGFsbXR4X3BjbWNpYV9kZXZpY2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfc3RhcmdhdGUyLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfc3RhcmdhdGUyLmMKaW5kZXggZDA4ODAyZi4uOTM5NjIyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3N0YXJnYXRlMi5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9zdGFyZ2F0ZTIuYwpAQCAtMjgsNyArMjgsNiBAQAogCiAjaW5jbHVkZSAic29jX2NvbW1vbi5oIgogCi0jZGVmaW5lIFNHMl9TMF9CVUZGX0NUTAkJMTIwCiAjZGVmaW5lIFNHMl9TMF9QT1dFUl9DVEwJMTA4CiAjZGVmaW5lIFNHMl9TMF9HUElPX1JFU0VUCTgyCiAjZGVmaW5lIFNHMl9TMF9HUElPX0RFVEVDVAk1MwpAQCAtMzgsNiArMzcsMTEgQEAKIAl7IDAsIElSUV9HUElPKFNHMl9TMF9HUElPX0RFVEVDVCksICJQQ01DSUEwIENEIiB9LAogfTsKIAorc3RhdGljIHN0cnVjdCBncGlvIHNnMl9wY21jaWFfZ3Bpb3NbXSA9IHsKKwl7IFNHMl9TMF9HUElPX1JFU0VULCBHUElPRl9PVVRfSU5JVF9ISUdILCAiUENNQ0lBIFJlc2V0IiB9LAorCXsgU0cyX1MwX1BPV0VSX0NUTCwgR1BJT0ZfT1VUX0lOSVRfSElHSCwgIlBDTUNJQSBQb3dlciBDdHJsIiB9LAorfTsKKwogc3RhdGljIGludCBzZzJfcGNtY2lhX2h3X2luaXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCiB7CiAJc2t0LT5zb2NrZXQucGNpX2lycSA9IElSUV9HUElPKFNHMl9TMF9HUElPX1JFQURZKTsKQEAgLTEyMiwzNyArMTI2LDIzIEBACiAJaWYgKCFzZzJfcGNtY2lhX2RldmljZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyZXQgPSBncGlvX3JlcXVlc3QoU0cyX1MwX0JVRkZfQ1RMLCAiU0cyIENGIGJ1ZmYgY3RsIik7CisJcmV0ID0gZ3Bpb19yZXF1ZXN0X2FycmF5KHNnMl9wY21jaWFfZ3Bpb3MsIEFSUkFZX1NJWkUoc2cyX3BjbWNpYV9ncGlvcykpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfcHV0X3BsYXRmb3JtX2RldmljZTsKLQlyZXQgPSBncGlvX3JlcXVlc3QoU0cyX1MwX1BPV0VSX0NUTCwgIlNHMiBDRiBwb3dlciBjdGwiKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX2ZyZWVfZ3Bpb19idWZmX2N0bDsKLQlyZXQgPSBncGlvX3JlcXVlc3QoU0cyX1MwX0dQSU9fUkVTRVQsICJTRzIgQ0YgcmVzZXQiKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX2ZyZWVfZ3Bpb19wb3dlcl9jdGw7Ci0JLyogU2V0IGdwaW8gZGlyZWN0aW9ucyAqLwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChTRzJfUzBfQlVGRl9DVEwsIDApOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChTRzJfUzBfUE9XRVJfQ1RMLCAxKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoU0cyX1MwX0dQSU9fUkVTRVQsIDEpOwogCiAJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHNnMl9wY21jaWFfZGV2aWNlLAogCQkJCSAgICAgICAmc2cyX3BjbWNpYV9vcHMsCiAJCQkJICAgICAgIHNpemVvZihzZzJfcGNtY2lhX29wcykpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfZnJlZV9ncGlvX3Jlc2V0OworCQlnb3RvIGVycm9yX2ZyZWVfZ3Bpb3M7CiAKIAlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHNnMl9wY21jaWFfZGV2aWNlKTsKIAlpZiAocmV0KQotCQlnb3RvIGVycm9yX2ZyZWVfZ3Bpb19yZXNldDsKKwkJZ290byBlcnJvcl9mcmVlX2dwaW9zOwogCiAJcmV0dXJuIDA7Ci1lcnJvcl9mcmVlX2dwaW9fcmVzZXQ6Ci0JZ3Bpb19mcmVlKFNHMl9TMF9HUElPX1JFU0VUKTsKLWVycm9yX2ZyZWVfZ3Bpb19wb3dlcl9jdGw6Ci0JZ3Bpb19mcmVlKFNHMl9TMF9QT1dFUl9DVEwpOwotZXJyb3JfZnJlZV9ncGlvX2J1ZmZfY3RsOgotCWdwaW9fZnJlZShTRzJfUzBfQlVGRl9DVEwpOworZXJyb3JfZnJlZV9ncGlvczoKKwlncGlvX2ZyZWVfYXJyYXkoc2cyX3BjbWNpYV9ncGlvcywgQVJSQVlfU0laRShzZzJfcGNtY2lhX2dwaW9zKSk7CiBlcnJvcl9wdXRfcGxhdGZvcm1fZGV2aWNlOgogCXBsYXRmb3JtX2RldmljZV9wdXQoc2cyX3BjbWNpYV9kZXZpY2UpOwogCkBAIC0xNjIsOSArMTUyLDcgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzZzJfcGNtY2lhX2V4aXQodm9pZCkKIHsKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihzZzJfcGNtY2lhX2RldmljZSk7Ci0JZ3Bpb19mcmVlKFNHMl9TMF9CVUZGX0NUTCk7Ci0JZ3Bpb19mcmVlKFNHMl9TMF9QT1dFUl9DVEwpOwotCWdwaW9fZnJlZShTRzJfUzBfR1BJT19SRVNFVCk7CisJZ3Bpb19mcmVlX2FycmF5KHNnMl9wY21jaWFfZ3Bpb3MsIEFSUkFZX1NJWkUoc2cyX3BjbWNpYV9ncGlvcykpOwogfQogCiBmc19pbml0Y2FsbChzZzJfcGNtY2lhX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3ZpcGVyLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfdmlwZXIuYwppbmRleCBhNTFmMjA3Li4xMDY0YjFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfdmlwZXIuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfdmlwZXIuYwpAQCAtMTM2LDIyICsxMzYsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdmlwZXJfcGNtY2lhX3NvY2tldF9pbml0KHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQotewotfQotCi1zdGF0aWMgdm9pZCB2aXBlcl9wY21jaWFfc29ja2V0X3N1c3BlbmQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCi17Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCB2aXBlcl9wY21jaWFfb3BzID0gewogCS5vd25lciAgICAgICAgICAJPSBUSElTX01PRFVMRSwKIAkuaHdfaW5pdCAgICAgICAgCT0gdmlwZXJfcGNtY2lhX2h3X2luaXQsCiAJLmh3X3NodXRkb3duCQk9IHZpcGVyX3BjbWNpYV9od19zaHV0ZG93biwKIAkuc29ja2V0X3N0YXRlCQk9IHZpcGVyX3BjbWNpYV9zb2NrZXRfc3RhdGUsCiAJLmNvbmZpZ3VyZV9zb2NrZXQJPSB2aXBlcl9wY21jaWFfY29uZmlndXJlX3NvY2tldCwKLQkuc29ja2V0X2luaXQJCT0gdmlwZXJfcGNtY2lhX3NvY2tldF9pbml0LAotCS5zb2NrZXRfc3VzcGVuZAkJPSB2aXBlcl9wY21jaWFfc29ja2V0X3N1c3BlbmQsCiAJLm5yICAgICAgICAgCQk9IDEsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmMgYi9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmMKaW5kZXggNzY4Zjk1Ny4uYTBhOWMyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uYwpAQCAtMTg2LDggKzE4Niw4IEBACiAJc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QgPSB0b19zb2NfcGNtY2lhX3NvY2tldChzb2NrKTsKIAogCWRlYnVnKHNrdCwgMiwgImluaXRpYWxpemluZyBzb2NrZXRcbiIpOwotCi0Jc2t0LT5vcHMtPnNvY2tldF9pbml0KHNrdCk7CisJaWYgKHNrdC0+b3BzLT5zb2NrZXRfaW5pdCkKKwkJc2t0LT5vcHMtPnNvY2tldF9pbml0KHNrdCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIwNyw3ICsyMDcsOCBAQAogCiAJZGVidWcoc2t0LCAyLCAic3VzcGVuZGluZyBzb2NrZXRcbiIpOwogCi0Jc2t0LT5vcHMtPnNvY2tldF9zdXNwZW5kKHNrdCk7CisJaWYgKHNrdC0+b3BzLT5zb2NrZXRfc3VzcGVuZCkKKwkJc2t0LT5vcHMtPnNvY2tldF9zdXNwZW5kKHNrdCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvS2NvbmZpZyBiL2RyaXZlcnMvcG93ZXIvS2NvbmZpZwppbmRleCBlNTdiNTBiLi41N2RlMDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL0tjb25maWcKKysrIGIvZHJpdmVycy9wb3dlci9LY29uZmlnCkBAIC0yMzUsNCArMjM1LDE4IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYmUgYnVpbGQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKIAkgIGNhbGxlZCBncGlvLWNoYXJnZXIuCiAKK2NvbmZpZyBDSEFSR0VSX01BWDg5OTcKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYODk5Ny9NQVg4OTY2IFBNSUMgYmF0dGVyeSBjaGFyZ2VyIGRyaXZlciIKKwlkZXBlbmRzIG9uIE1GRF9NQVg4OTk3ICYmIFJFR1VMQVRPUl9NQVg4OTk3CisJaGVscAorCSAgU2F5IFkgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBiYXR0ZXJ5IGNoYXJnZXIgY29udHJvbCBzeXNmcyBhbmQKKwkgIHBsYXRmb3JtIGRhdGEgb2YgTUFYODk5Ny9MUDM5NzQgUE1JQ3MuCisKK2NvbmZpZyBDSEFSR0VSX01BWDg5OTgKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYODk5OC9MUDM5NzQgUE1JQyBiYXR0ZXJ5IGNoYXJnZXIgZHJpdmVyIgorCWRlcGVuZHMgb24gTUZEX01BWDg5OTggJiYgUkVHVUxBVE9SX01BWDg5OTgKKwloZWxwCisJICBTYXkgWSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIGJhdHRlcnkgY2hhcmdlciBjb250cm9sIHN5c2ZzIGFuZAorCSAgcGxhdGZvcm0gZGF0YSBvZiBNQVg4OTk4L0xQMzk3NCBQTUlDcy4KKwogZW5kaWYgIyBQT1dFUl9TVVBQTFkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvTWFrZWZpbGUgYi9kcml2ZXJzL3Bvd2VyL01ha2VmaWxlCmluZGV4IDAwOWE5MGYuLmI0YWYxM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wb3dlci9NYWtlZmlsZQpAQCAtMzYsMyArMzYsNSBAQAogb2JqLSQoQ09ORklHX0NIQVJHRVJfTUFYODkwMykJKz0gbWF4ODkwM19jaGFyZ2VyLm8KIG9iai0kKENPTkZJR19DSEFSR0VSX1RXTDQwMzApCSs9IHR3bDQwMzBfY2hhcmdlci5vCiBvYmotJChDT05GSUdfQ0hBUkdFUl9HUElPKQkrPSBncGlvLWNoYXJnZXIubworb2JqLSQoQ09ORklHX0NIQVJHRVJfTUFYODk5NykJKz0gbWF4ODk5N19jaGFyZ2VyLm8KK29iai0kKENPTkZJR19DSEFSR0VSX01BWDg5OTgpCSs9IG1heDg5OThfY2hhcmdlci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2FwbV9wb3dlci5jIGIvZHJpdmVycy9wb3dlci9hcG1fcG93ZXIuYwppbmRleCBkYzYyOGNiLi44YTYxMmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2FwbV9wb3dlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvYXBtX3Bvd2VyLmMKQEAgLTE0LDExICsxNCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2FwbS1lbXVsYXRpb24uaD4KIAogCi0jZGVmaW5lIFBTWV9QUk9QKHBzeSwgcHJvcCwgdmFsKSBwc3ktPmdldF9wcm9wZXJ0eShwc3ksIFwKLQkJCSBQT1dFUl9TVVBQTFlfUFJPUF8jI3Byb3AsIHZhbCkKKyNkZWZpbmUgUFNZX1BST1AocHN5LCBwcm9wLCB2YWwpIChwc3ktPmdldF9wcm9wZXJ0eShwc3ksIFwKKwkJCSBQT1dFUl9TVVBQTFlfUFJPUF8jI3Byb3AsIHZhbCkpCiAKLSNkZWZpbmUgX01QU1lfUFJPUChwcm9wLCB2YWwpIG1haW5fYmF0dGVyeS0+Z2V0X3Byb3BlcnR5KG1haW5fYmF0dGVyeSwgXAotCQkJCQkJCSBwcm9wLCB2YWwpCisjZGVmaW5lIF9NUFNZX1BST1AocHJvcCwgdmFsKSAobWFpbl9iYXR0ZXJ5LT5nZXRfcHJvcGVydHkobWFpbl9iYXR0ZXJ5LCBcCisJCQkJCQkJIHByb3AsIHZhbCkpCiAKICNkZWZpbmUgTVBTWV9QUk9QKHByb3AsIHZhbCkgX01QU1lfUFJPUChQT1dFUl9TVVBQTFlfUFJPUF8jI3Byb3AsIHZhbCkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9icTIwejc1LmMgYi9kcml2ZXJzL3Bvd2VyL2JxMjB6NzUuYwppbmRleCA1MDY1ODVlLi45YzVlNWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2JxMjB6NzUuYworKysgYi9kcml2ZXJzL3Bvd2VyL2JxMjB6NzUuYwpAQCAtMTUyLDYgKzE1MiwxMCBAQAogCWJvb2wJCQkJZ3Bpb19kZXRlY3Q7CiAJYm9vbAkJCQllbmFibGVfZGV0ZWN0aW9uOwogCWludAkJCQlpcnE7CisJaW50CQkJCWxhc3Rfc3RhdGU7CisJaW50CQkJCXBvbGxfdGltZTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCQl3b3JrOworCWludAkJCQlpZ25vcmVfY2hhbmdlczsKIH07CiAKIHN0YXRpYyBpbnQgYnEyMHo3NV9yZWFkX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBhZGRyZXNzKQpAQCAtMjc5LDYgKzI4Myw3IEBACiAJaW50IHJlZ19vZmZzZXQsIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKIAl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogeworCXN0cnVjdCBicTIwejc1X2luZm8gKmJxMjB6NzVfZGV2aWNlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJczMyIHJldDsKIAogCXJldCA9IGJxMjB6NzVfcmVhZF93b3JkX2RhdGEoY2xpZW50LApAQCAtMjkzLDE1ICsyOTgsMjQgQEAKIAlpZiAocmV0ID49IGJxMjB6NzVfZGF0YVtyZWdfb2Zmc2V0XS5taW5fdmFsdWUgJiYKIAkgICAgcmV0IDw9IGJxMjB6NzVfZGF0YVtyZWdfb2Zmc2V0XS5tYXhfdmFsdWUpIHsKIAkJdmFsLT5pbnR2YWwgPSByZXQ7Ci0JCWlmIChwc3AgPT0gUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTKSB7Ci0JCQlpZiAocmV0ICYgQkFUVEVSWV9GVUxMX0NIQVJHRUQpCi0JCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7Ci0JCQllbHNlIGlmIChyZXQgJiBCQVRURVJZX0ZVTExfRElTQ0hBUkdFRCkKLQkJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOwotCQkJZWxzZSBpZiAocmV0ICYgQkFUVEVSWV9ESVNDSEFSR0lORykKLQkJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7Ci0JCQllbHNlCi0JCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOworCQlpZiAocHNwICE9IFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUykKKwkJCXJldHVybiAwOworCisJCWlmIChyZXQgJiBCQVRURVJZX0ZVTExfQ0hBUkdFRCkKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOworCQllbHNlIGlmIChyZXQgJiBCQVRURVJZX0ZVTExfRElTQ0hBUkdFRCkKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7CisJCWVsc2UgaWYgKHJldCAmIEJBVFRFUllfRElTQ0hBUkdJTkcpCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7CisJCWVsc2UKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKKworCQlpZiAoYnEyMHo3NV9kZXZpY2UtPnBvbGxfdGltZSA9PSAwKQorCQkJYnEyMHo3NV9kZXZpY2UtPmxhc3Rfc3RhdGUgPSB2YWwtPmludHZhbDsKKwkJZWxzZSBpZiAoYnEyMHo3NV9kZXZpY2UtPmxhc3Rfc3RhdGUgIT0gdmFsLT5pbnR2YWwpIHsKKwkJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYnEyMHo3NV9kZXZpY2UtPndvcmspOworCQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmJxMjB6NzVfZGV2aWNlLT5wb3dlcl9zdXBwbHkpOworCQkJYnEyMHo3NV9kZXZpY2UtPnBvbGxfdGltZSA9IDA7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAocHNwID09IFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUykKQEAgLTU0NSw2ICs1NTksNjAgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKK3N0YXRpYyB2b2lkIGJxMjB6NzVfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCit7CisJc3RydWN0IGJxMjB6NzVfaW5mbyAqYnEyMHo3NV9kZXZpY2U7CisKKwlicTIwejc1X2RldmljZSA9IGNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBicTIwejc1X2luZm8sIHBvd2VyX3N1cHBseSk7CisKKwlpZiAoYnEyMHo3NV9kZXZpY2UtPmlnbm9yZV9jaGFuZ2VzID4gMCkgeworCQlicTIwejc1X2RldmljZS0+aWdub3JlX2NoYW5nZXMtLTsKKwkJcmV0dXJuOworCX0KKworCS8qIGNhbmNlbCBvdXRzdGFuZGluZyB3b3JrICovCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZicTIwejc1X2RldmljZS0+d29yayk7CisKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJxMjB6NzVfZGV2aWNlLT53b3JrLCBIWik7CisJYnEyMHo3NV9kZXZpY2UtPnBvbGxfdGltZSA9IGJxMjB6NzVfZGV2aWNlLT5wZGF0YS0+cG9sbF9yZXRyeV9jb3VudDsKK30KKworc3RhdGljIHZvaWQgYnEyMHo3NV9kZWxheWVkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBicTIwejc1X2luZm8gKmJxMjB6NzVfZGV2aWNlOworCXMzMiByZXQ7CisKKwlicTIwejc1X2RldmljZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYnEyMHo3NV9pbmZvLCB3b3JrLndvcmspOworCisJcmV0ID0gYnEyMHo3NV9yZWFkX3dvcmRfZGF0YShicTIwejc1X2RldmljZS0+Y2xpZW50LAorCQkJCSAgICAgYnEyMHo3NV9kYXRhW1JFR19TVEFUVVNdLmFkZHIpOworCS8qIGlmIHRoZSByZWFkIGZhaWxlZCwgZ2l2ZSB1cCBvbiB0aGlzIHdvcmsgKi8KKwlpZiAocmV0IDwgMCkgeworCQlicTIwejc1X2RldmljZS0+cG9sbF90aW1lID0gMDsKKwkJcmV0dXJuOworCX0KKworCWlmIChyZXQgJiBCQVRURVJZX0ZVTExfQ0hBUkdFRCkKKwkJcmV0ID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOworCWVsc2UgaWYgKHJldCAmIEJBVFRFUllfRlVMTF9ESVNDSEFSR0VEKQorCQlyZXQgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKKwllbHNlIGlmIChyZXQgJiBCQVRURVJZX0RJU0NIQVJHSU5HKQorCQlyZXQgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOworCWVsc2UKKwkJcmV0ID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKKworCWlmIChicTIwejc1X2RldmljZS0+bGFzdF9zdGF0ZSAhPSByZXQpIHsKKwkJYnEyMHo3NV9kZXZpY2UtPnBvbGxfdGltZSA9IDA7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZicTIwejc1X2RldmljZS0+cG93ZXJfc3VwcGx5KTsKKwkJcmV0dXJuOworCX0KKwlpZiAoYnEyMHo3NV9kZXZpY2UtPnBvbGxfdGltZSA+IDApIHsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZicTIwejc1X2RldmljZS0+d29yaywgSFopOworCQlicTIwejc1X2RldmljZS0+cG9sbF90aW1lLS07CisJCXJldHVybjsKKwl9Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGJxMjB6NzVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CkBAIC01NjYsNiArNjM0LDEzIEBACiAJYnEyMHo3NV9kZXZpY2UtPnBvd2VyX3N1cHBseS5udW1fcHJvcGVydGllcyA9CiAJCUFSUkFZX1NJWkUoYnEyMHo3NV9wcm9wZXJ0aWVzKTsKIAlicTIwejc1X2RldmljZS0+cG93ZXJfc3VwcGx5LmdldF9wcm9wZXJ0eSA9IGJxMjB6NzVfZ2V0X3Byb3BlcnR5OworCS8qIGlnbm9yZSBmaXJzdCBub3RpZmljYXRpb24gb2YgZXh0ZXJuYWwgY2hhbmdlLCBpdCBpcyBnZW5lcmF0ZWQKKwkgKiBmcm9tIHRoZSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIgY2FsbCBiYWNrCisJICovCisJYnEyMHo3NV9kZXZpY2UtPmlnbm9yZV9jaGFuZ2VzID0gMTsKKwlicTIwejc1X2RldmljZS0+bGFzdF9zdGF0ZSA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKKwlicTIwejc1X2RldmljZS0+cG93ZXJfc3VwcGx5LmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQgPQorCQlicTIwejc1X2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQ7CiAKIAlpZiAocGRhdGEpIHsKIAkJYnEyMHo3NV9kZXZpY2UtPmdwaW9fZGV0ZWN0ID0KQEAgLTYyNSw2ICs3MDAsMTAgQEAKIAlkZXZfaW5mbygmY2xpZW50LT5kZXYsCiAJCSIlczogYmF0dGVyeSBnYXMgZ2F1Z2UgZGV2aWNlIHJlZ2lzdGVyZWRcbiIsIGNsaWVudC0+bmFtZSk7CiAKKwlJTklUX0RFTEFZRURfV09SSygmYnEyMHo3NV9kZXZpY2UtPndvcmssIGJxMjB6NzVfZGVsYXllZF93b3JrKTsKKworCWJxMjB6NzVfZGV2aWNlLT5lbmFibGVfZGV0ZWN0aW9uID0gdHJ1ZTsKKwogCXJldHVybiAwOwogCiBleGl0X3BzdXBwbHk6CkBAIC02NDgsNiArNzI3LDkgQEAKIAkJZ3Bpb19mcmVlKGJxMjB6NzVfZGV2aWNlLT5wZGF0YS0+YmF0dGVyeV9kZXRlY3QpOwogCiAJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmJxMjB6NzVfZGV2aWNlLT5wb3dlcl9zdXBwbHkpOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZicTIwejc1X2RldmljZS0+d29yayk7CisKIAlrZnJlZShicTIwejc1X2RldmljZSk7CiAJYnEyMHo3NV9kZXZpY2UgPSBOVUxMOwogCkBAIC02NjEsNiArNzQzLDkgQEAKIAlzdHJ1Y3QgYnEyMHo3NV9pbmZvICpicTIwejc1X2RldmljZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXMzMiByZXQ7CiAKKwlpZiAoYnEyMHo3NV9kZXZpY2UtPnBvbGxfdGltZSA+IDApCisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYnEyMHo3NV9kZXZpY2UtPndvcmspOworCiAJLyogd3JpdGUgdG8gbWFudWZhY3R1cmVyIGFjY2VzcyB3aXRoIHNsZWVwIGNvbW1hbmQgKi8KIAlyZXQgPSBicTIwejc1X3dyaXRlX3dvcmRfZGF0YShjbGllbnQsCiAJCWJxMjB6NzVfZGF0YVtSRUdfTUFOVUZBQ1RVUkVSX0RBVEFdLmFkZHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2dwaW8tY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9ncGlvLWNoYXJnZXIuYwppbmRleCA3MThmMmM1Li5hNjRiODg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2dwaW8tY2hhcmdlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvZ3Bpby1jaGFyZ2VyLmMKQEAgLTEyNyw3ICsxMjcsNyBAQAogCQlyZXQgPSByZXF1ZXN0X2FueV9jb250ZXh0X2lycShpcnEsIGdwaW9fY2hhcmdlcl9pcnEsCiAJCQkJSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HLAogCQkJCWRldl9uYW1lKCZwZGV2LT5kZXYpLCBjaGFyZ2VyKTsKLQkJaWYgKHJldCkKKwkJaWYgKHJldCA8IDApCiAJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgaXJxOiAlZFxuIiwgcmV0KTsKIAkJZWxzZQogCQkJZ3Bpb19jaGFyZ2VyLT5pcnEgPSBpcnE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL21heDE3MDQyX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5jCmluZGV4IGM1Yzg4MDUuLjk4YmZhYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5jCkBAIC0yOSw3NCArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvd2VyL21heDE3MDQyX2JhdHRlcnkuaD4KIAotZW51bSBtYXgxNzA0Ml9yZWdpc3RlciB7Ci0JTUFYMTcwNDJfU1RBVFVTCQk9IDB4MDAsCi0JTUFYMTcwNDJfVkFMUlRfVGgJPSAweDAxLAotCU1BWDE3MDQyX1RBTFJUX1RoCT0gMHgwMiwKLQlNQVgxNzA0Ml9TQUxSVF9UaAk9IDB4MDMsCi0JTUFYMTcwNDJfQXRSYXRlCQk9IDB4MDQsCi0JTUFYMTcwNDJfUmVwQ2FwCQk9IDB4MDUsCi0JTUFYMTcwNDJfUmVwU09DCQk9IDB4MDYsCi0JTUFYMTcwNDJfQWdlCQk9IDB4MDcsCi0JTUFYMTcwNDJfVEVNUAkJPSAweDA4LAotCU1BWDE3MDQyX1ZDRUxMCQk9IDB4MDksCi0JTUFYMTcwNDJfQ3VycmVudAk9IDB4MEEsCi0JTUFYMTcwNDJfQXZnQ3VycmVudAk9IDB4MEIsCi0JTUFYMTcwNDJfUXJlc2lkdWFsCT0gMHgwQywKLQlNQVgxNzA0Ml9TT0MJCT0gMHgwRCwKLQlNQVgxNzA0Ml9BdlNPQwkJPSAweDBFLAotCU1BWDE3MDQyX1JlbUNhcAkJPSAweDBGLAotCU1BWDE3NDAyX0Z1bGxDQVAJPSAweDEwLAotCU1BWDE3MDQyX1RURQkJPSAweDExLAotCU1BWDE3MDQyX1ZfZW1wdHkJPSAweDEyLAotCi0JTUFYMTcwNDJfUlNMT1cJCT0gMHgxNCwKLQotCU1BWDE3MDQyX0F2Z1RBCQk9IDB4MTYsCi0JTUFYMTcwNDJfQ3ljbGVzCQk9IDB4MTcsCi0JTUFYMTcwNDJfRGVzaWduQ2FwCT0gMHgxOCwKLQlNQVgxNzA0Ml9BdmdWQ0VMTAk9IDB4MTksCi0JTUFYMTcwNDJfTWluTWF4VGVtcAk9IDB4MUEsCi0JTUFYMTcwNDJfTWluTWF4Vm9sdAk9IDB4MUIsCi0JTUFYMTcwNDJfTWluTWF4Q3Vycgk9IDB4MUMsCi0JTUFYMTcwNDJfQ09ORklHCQk9IDB4MUQsCi0JTUFYMTcwNDJfSUNIR1Rlcm0JPSAweDFFLAotCU1BWDE3MDQyX0F2Q2FwCQk9IDB4MUYsCi0JTUFYMTcwNDJfTWFuTmFtZQk9IDB4MjAsCi0JTUFYMTcwNDJfRGV2TmFtZQk9IDB4MjEsCi0JTUFYMTcwNDJfRGV2Q2hlbQk9IDB4MjIsCi0KLQlNQVgxNzA0Ml9UZW1wTm9tCT0gMHgyNCwKLQlNQVgxNzA0Ml9UZW1wQ29sZAk9IDB4MjUsCi0JTUFYMTcwNDJfVGVtcEhvdAk9IDB4MjYsCi0JTUFYMTcwNDJfQUlOCQk9IDB4MjcsCi0JTUFYMTcwNDJfTGVhcm5DRkcJPSAweDI4LAotCU1BWDE3MDQyX1NIRlRDRkcJPSAweDI5LAotCU1BWDE3MDQyX1JlbGF4Q0ZHCT0gMHgyQSwKLQlNQVgxNzA0Ml9NaXNjQ0ZHCT0gMHgyQiwKLQlNQVgxNzA0Ml9UR0FJTgkJPSAweDJDLAotCU1BeDE3MDQyX1RPRkYJCT0gMHgyRCwKLQlNQVgxNzA0Ml9DR0FJTgkJPSAweDJFLAotCU1BWDE3MDQyX0NPRkYJCT0gMHgyRiwKLQotCU1BWDE3MDQyX1FfZW1wdHkJPSAweDMzLAotCU1BWDE3MDQyX1RfZW1wdHkJPSAweDM0LAotCi0JTUFYMTcwNDJfUkNPTVAwCQk9IDB4MzgsCi0JTUFYMTcwNDJfVGVtcENvCQk9IDB4MzksCi0JTUFYMTcwNDJfUngJCT0gMHgzQSwKLQlNQVgxNzA0Ml9UX2VtcHR5MAk9IDB4M0IsCi0JTUFYMTcwNDJfVGFza1BlcmlvZAk9IDB4M0MsCi0JTUFYMTcwNDJfRlNUQVQJCT0gMHgzRCwKLQotCU1BWDE3MDQyX1NIRE5USU1FUgk9IDB4M0YsCi0KLQlNQVgxNzA0Ml9WRlJlbUNhcAk9IDB4NEEsCi0KLQlNQVgxNzA0Ml9RSAkJPSAweDRELAotCU1BWDE3MDQyX1FMCQk9IDB4NEUsCi19OwotCiBzdHJ1Y3QgbWF4MTcwNDJfY2hpcCB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGJhdHRlcnk7CkBAIC0xMjMsMTAgKzU1LDI3IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgbWF4MTcwNDJfc2V0X3JlZyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICAgICBzdHJ1Y3QgbWF4MTcwNDJfcmVnX2RhdGEgKmRhdGEsIGludCBzaXplKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJbWF4MTcwNDJfd3JpdGVfcmVnKGNsaWVudCwgZGF0YVtpXS5hZGRyLCBkYXRhW2ldLmRhdGEpOworfQorCiBzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgbWF4MTcwNDJfYmF0dGVyeV9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCisJUE9XRVJfU1VQUExZX1BST1BfQ1lDTEVfQ09VTlQsCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVgsCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOLAogCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAogCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQVZHLAogCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVAsCisJUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9BVkcsCiB9OwogCiBzdGF0aWMgaW50IG1heDE3MDQyX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCkBAIC0xMzcsNiArODYsMzAgQEAKIAkJCQlzdHJ1Y3QgbWF4MTcwNDJfY2hpcCwgYmF0dGVyeSk7CiAKIAlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKKwkJdmFsLT5pbnR2YWwgPSBtYXgxNzA0Ml9yZWFkX3JlZyhjaGlwLT5jbGllbnQsCisJCQkJTUFYMTcwNDJfU1RBVFVTKTsKKwkJaWYgKHZhbC0+aW50dmFsICYgTUFYMTcwNDJfU1RBVFVTX0JhdHRBYnNlbnQpCisJCQl2YWwtPmludHZhbCA9IDA7CisJCWVsc2UKKwkJCXZhbC0+aW50dmFsID0gMTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DWUNMRV9DT1VOVDoKKwkJdmFsLT5pbnR2YWwgPSBtYXgxNzA0Ml9yZWFkX3JlZyhjaGlwLT5jbGllbnQsCisJCQkJTUFYMTcwNDJfQ3ljbGVzKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWDoKKwkJdmFsLT5pbnR2YWwgPSBtYXgxNzA0Ml9yZWFkX3JlZyhjaGlwLT5jbGllbnQsCisJCQkJTUFYMTcwNDJfTWluTWF4Vm9sdCk7CisJCXZhbC0+aW50dmFsID4+PSA4OworCQl2YWwtPmludHZhbCAqPSAyMDAwMDsgLyogVW5pdHMgb2YgTFNCID0gMjBtViAqLworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOX0RFU0lHTjoKKwkJdmFsLT5pbnR2YWwgPSBtYXgxNzA0Ml9yZWFkX3JlZyhjaGlwLT5jbGllbnQsCisJCQkJTUFYMTcwNDJfVl9lbXB0eSk7CisJCXZhbC0+aW50dmFsID4+PSA3OworCQl2YWwtPmludHZhbCAqPSAxMDAwMDsgLyogVW5pdHMgb2YgTFNCID0gMTBtViAqLworCQlicmVhazsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgogCQl2YWwtPmludHZhbCA9IG1heDE3MDQyX3JlYWRfcmVnKGNoaXAtPmNsaWVudCwKIAkJCQlNQVgxNzA0Ml9WQ0VMTCkgKiA4MzsgLyogMTAwMCAvIDEyID0gODMgKi8KQEAgLTE0OSw2ICsxMjIsNTcgQEAKIAkJdmFsLT5pbnR2YWwgPSBtYXgxNzA0Ml9yZWFkX3JlZyhjaGlwLT5jbGllbnQsCiAJCQkJTUFYMTcwNDJfU09DKSAvIDI1NjsKIAkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTDoKKwkJdmFsLT5pbnR2YWwgPSBtYXgxNzA0Ml9yZWFkX3JlZyhjaGlwLT5jbGllbnQsCisJCQkJTUFYMTcwNDJfUmVwU09DKTsKKwkJaWYgKCh2YWwtPmludHZhbCAvIDI1NikgPj0gTUFYMTcwNDJfQkFUVEVSWV9GVUxMKQorCQkJdmFsLT5pbnR2YWwgPSAxOworCQllbHNlIGlmICh2YWwtPmludHZhbCA+PSAwKQorCQkJdmFsLT5pbnR2YWwgPSAwOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA6CisJCXZhbC0+aW50dmFsID0gbWF4MTcwNDJfcmVhZF9yZWcoY2hpcC0+Y2xpZW50LAorCQkJCU1BWDE3MDQyX1RFTVApOworCQkvKiBUaGUgdmFsdWUgaXMgc2lnbmVkLiAqLworCQlpZiAodmFsLT5pbnR2YWwgJiAweDgwMDApIHsKKwkJCXZhbC0+aW50dmFsID0gKDB4N2ZmZiAmIH52YWwtPmludHZhbCkgKyAxOworCQkJdmFsLT5pbnR2YWwgKj0gLTE7CisJCX0KKwkJLyogVGhlIHZhbHVlIGlzIGNvbnZlcnRlZCBpbnRvIGRlY2ktY2VudGlncmFkZSBzY2FsZSAqLworCQkvKiBVbml0cyBvZiBMU0IgPSAxIC8gMjU2IGRlZ3JlZSBDZWxzaXVzICovCisJCXZhbC0+aW50dmFsID0gdmFsLT5pbnR2YWwgKiAxMCAvIDI1NjsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVzoKKwkJaWYgKGNoaXAtPnBkYXRhLT5lbmFibGVfY3VycmVudF9zZW5zZSkgeworCQkJdmFsLT5pbnR2YWwgPSBtYXgxNzA0Ml9yZWFkX3JlZyhjaGlwLT5jbGllbnQsCisJCQkJCU1BWDE3MDQyX0N1cnJlbnQpOworCQkJaWYgKHZhbC0+aW50dmFsICYgMHg4MDAwKSB7CisJCQkJLyogTmVnYXRpdmUgKi8KKwkJCQl2YWwtPmludHZhbCA9IH52YWwtPmludHZhbCAmIDB4N2ZmZjsKKwkJCQl2YWwtPmludHZhbCsrOworCQkJCXZhbC0+aW50dmFsICo9IC0xOworCQkJfQorCQkJdmFsLT5pbnR2YWwgPj49IDQ7CisJCQl2YWwtPmludHZhbCAqPSAxMDAwMDAwICogMjUgLyBjaGlwLT5wZGF0YS0+cl9zbnM7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQVZHOgorCQlpZiAoY2hpcC0+cGRhdGEtPmVuYWJsZV9jdXJyZW50X3NlbnNlKSB7CisJCQl2YWwtPmludHZhbCA9IG1heDE3MDQyX3JlYWRfcmVnKGNoaXAtPmNsaWVudCwKKwkJCQkJTUFYMTcwNDJfQXZnQ3VycmVudCk7CisJCQlpZiAodmFsLT5pbnR2YWwgJiAweDgwMDApIHsKKwkJCQkvKiBOZWdhdGl2ZSAqLworCQkJCXZhbC0+aW50dmFsID0gfnZhbC0+aW50dmFsICYgMHg3ZmZmOworCQkJCXZhbC0+aW50dmFsKys7CisJCQkJdmFsLT5pbnR2YWwgKj0gLTE7CisJCQl9CisJCQl2YWwtPmludHZhbCAqPSAxNTYyNTAwIC8gY2hpcC0+cGRhdGEtPnJfc25zOworCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTgwLDE4ICsyMDQsMzAgQEAKIAljaGlwLT5iYXR0ZXJ5LnByb3BlcnRpZXMJPSBtYXgxNzA0Ml9iYXR0ZXJ5X3Byb3BzOwogCWNoaXAtPmJhdHRlcnkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKG1heDE3MDQyX2JhdHRlcnlfcHJvcHMpOwogCisJLyogV2hlbiBjdXJyZW50IGlzIG5vdCBtZWFzdXJlZCwKKwkgKiBDVVJSRU5UX05PVyBhbmQgQ1VSUkVOVF9BVkcgcHJvcGVydGllcyBzaG91bGQgYmUgaW52aXNpYmxlLiAqLworCWlmICghY2hpcC0+cGRhdGEtPmVuYWJsZV9jdXJyZW50X3NlbnNlKQorCQljaGlwLT5iYXR0ZXJ5Lm51bV9wcm9wZXJ0aWVzIC09IDI7CisKIAlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmY2hpcC0+YmF0dGVyeSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZDogcG93ZXIgc3VwcGx5IHJlZ2lzdGVyXG4iKTsKLQkJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CiAJCWtmcmVlKGNoaXApOwogCQlyZXR1cm4gcmV0OwogCX0KIAorCS8qIEluaXRpYWxpemUgcmVnaXN0ZXJzIGFjY29yZGluZyB0byB2YWx1ZXMgZnJvbSB0aGUgcGxhdGZvcm0gZGF0YSAqLworCWlmIChjaGlwLT5wZGF0YS0+aW5pdF9kYXRhKQorCQltYXgxNzA0Ml9zZXRfcmVnKGNsaWVudCwgY2hpcC0+cGRhdGEtPmluaXRfZGF0YSwKKwkJCQkgY2hpcC0+cGRhdGEtPm51bV9pbml0X2RhdGEpOworCiAJaWYgKCFjaGlwLT5wZGF0YS0+ZW5hYmxlX2N1cnJlbnRfc2Vuc2UpIHsKIAkJbWF4MTcwNDJfd3JpdGVfcmVnKGNsaWVudCwgTUFYMTcwNDJfQ0dBSU4sIDB4MDAwMCk7CiAJCW1heDE3MDQyX3dyaXRlX3JlZyhjbGllbnQsIE1BWDE3MDQyX01pc2NDRkcsIDB4MDAwMyk7CiAJCW1heDE3MDQyX3dyaXRlX3JlZyhjbGllbnQsIE1BWDE3MDQyX0xlYXJuQ0ZHLCAweDAwMDcpOworCX0gZWxzZSB7CisJCWlmIChjaGlwLT5wZGF0YS0+cl9zbnMgPT0gMCkKKwkJCWNoaXAtPnBkYXRhLT5yX3NucyA9IE1BWDE3MDQyX0RFRkFVTFRfU05TX1JFU0lTVE9SOwogCX0KIAogCXJldHVybiAwOwpAQCAtMjAyLDcgKzIzOCw2IEBACiAJc3RydWN0IG1heDE3MDQyX2NoaXAgKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAogCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZjaGlwLT5iYXR0ZXJ5KTsKLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKIAlrZnJlZShjaGlwKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvbWF4ODkwM19jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL21heDg5MDNfY2hhcmdlci5jCmluZGV4IDMzZmYwZTMuLmE5YjAyMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvbWF4ODkwM19jaGFyZ2VyLmMKKysrIGIvZHJpdmVycy9wb3dlci9tYXg4OTAzX2NoYXJnZXIuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Bvd2VyL21heDg5MDNfY2hhcmdlci5oPgogCiBzdHJ1Y3QgbWF4ODkwM19kYXRhIHsKLQlzdHJ1Y3QgbWF4ODkwM19wZGF0YSAqcGRhdGE7CisJc3RydWN0IG1heDg5MDNfcGRhdGEgcGRhdGE7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBwb3dlcl9zdXBwbHkgcHN5OwogCWJvb2wgZmF1bHQ7CkBAIC01Miw4ICs1Miw4IEBACiAJc3dpdGNoIChwc3ApIHsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKIAkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047Ci0JCWlmIChkYXRhLT5wZGF0YS0+Y2hnKSB7Ci0JCQlpZiAoZ3Bpb19nZXRfdmFsdWUoZGF0YS0+cGRhdGEtPmNoZykgPT0gMCkKKwkJaWYgKGRhdGEtPnBkYXRhLmNoZykgeworCQkJaWYgKGdwaW9fZ2V0X3ZhbHVlKGRhdGEtPnBkYXRhLmNoZykgPT0gMCkKIAkJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7CiAJCQllbHNlIGlmIChkYXRhLT51c2JfaW4gfHwgZGF0YS0+dGFfaW4pCiAJCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKQEAgLTgwLDcgKzgwLDcgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBtYXg4OTAzX2RjaW4oaW50IGlycSwgdm9pZCAqX2RhdGEpCiB7CiAJc3RydWN0IG1heDg5MDNfZGF0YSAqZGF0YSA9IF9kYXRhOwotCXN0cnVjdCBtYXg4OTAzX3BkYXRhICpwZGF0YSA9IGRhdGEtPnBkYXRhOworCXN0cnVjdCBtYXg4OTAzX3BkYXRhICpwZGF0YSA9ICZkYXRhLT5wZGF0YTsKIAlib29sIHRhX2luOwogCWVudW0gcG93ZXJfc3VwcGx5X3R5cGUgb2xkX3R5cGU7CiAKQEAgLTEyMSw3ICsxMjEsNyBAQAogc3RhdGljIGlycXJldHVybl90IG1heDg5MDNfdXNiaW4oaW50IGlycSwgdm9pZCAqX2RhdGEpCiB7CiAJc3RydWN0IG1heDg5MDNfZGF0YSAqZGF0YSA9IF9kYXRhOwotCXN0cnVjdCBtYXg4OTAzX3BkYXRhICpwZGF0YSA9IGRhdGEtPnBkYXRhOworCXN0cnVjdCBtYXg4OTAzX3BkYXRhICpwZGF0YSA9ICZkYXRhLT5wZGF0YTsKIAlib29sIHVzYl9pbjsKIAllbnVtIHBvd2VyX3N1cHBseV90eXBlIG9sZF90eXBlOwogCkBAIC0xNjAsNyArMTYwLDcgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBtYXg4OTAzX2ZhdWx0KGludCBpcnEsIHZvaWQgKl9kYXRhKQogewogCXN0cnVjdCBtYXg4OTAzX2RhdGEgKmRhdGEgPSBfZGF0YTsKLQlzdHJ1Y3QgbWF4ODkwM19wZGF0YSAqcGRhdGEgPSBkYXRhLT5wZGF0YTsKKwlzdHJ1Y3QgbWF4ODkwM19wZGF0YSAqcGRhdGEgPSAmZGF0YS0+cGRhdGE7CiAJYm9vbCBmYXVsdDsKIAogCWZhdWx0ID0gZ3Bpb19nZXRfdmFsdWUocGRhdGEtPmZsdCkgPyBmYWxzZSA6IHRydWU7CkBAIC0xOTMsNyArMTkzLDcgQEAKIAkJZGV2X2VycihkZXYsICJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5LlxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlkYXRhLT5wZGF0YSA9IHBkYXRhOworCW1lbWNweSgmZGF0YS0+cGRhdGEsIHBkYXRhLCBzaXplb2Yoc3RydWN0IG1heDg5MDNfcGRhdGEpKTsKIAlkYXRhLT5kZXYgPSBkZXY7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGF0YSk7CiAKQEAgLTM0OSw3ICszNDksNyBAQAogCXN0cnVjdCBtYXg4OTAzX2RhdGEgKmRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCWlmIChkYXRhKSB7Ci0JCXN0cnVjdCBtYXg4OTAzX3BkYXRhICpwZGF0YSA9IGRhdGEtPnBkYXRhOworCQlzdHJ1Y3QgbWF4ODkwM19wZGF0YSAqcGRhdGEgPSAmZGF0YS0+cGRhdGE7CiAKIAkJaWYgKHBkYXRhLT5mbHQpCiAJCQlmcmVlX2lycShncGlvX3RvX2lycShwZGF0YS0+Zmx0KSwgZGF0YSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL21heDg5OTdfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9tYXg4OTk3X2NoYXJnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTA2YjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wb3dlci9tYXg4OTk3X2NoYXJnZXIuYwpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIG1heDg5OTdfY2hhcmdlci5jIC0gUG93ZXIgc3VwcGx5IGNvbnN1bWVyIGRyaXZlciBmb3IgdGhlIE1heGltIDg5OTcvODk2NgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcworICogIE15dW5nSm9vIEhhbSA8bXl1bmdqb28uaGFtQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9tYXg4OTk3Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21heDg5OTctcHJpdmF0ZS5oPgorCitzdHJ1Y3QgY2hhcmdlcl9kYXRhIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IG1heDg5OTdfZGV2ICppb2RldjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGJhdHRlcnk7Cit9OworCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgbWF4ODk5N19iYXR0ZXJ5X3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLCAvKiAiRlVMTCIgb3IgIk5PVCBGVUxMIiBvbmx5LiAqLworCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsIC8qIHRoZSBwcmVzZW5jZSBvZiBiYXR0ZXJ5ICovCisJUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLCAvKiBjaGFyZ2VyIGlzIGFjdGl2ZSBvciBub3QgKi8KK307CisKKy8qIE5vdGUgdGhhdCB0aGUgY2hhcmdlciBjb250cm9sIGlzIGRvbmUgYnkgYSBjdXJyZW50IHJlZ3VsYXRvciAiQ0hBUkdFUiIgKi8KK3N0YXRpYyBpbnQgbWF4ODk5N19iYXR0ZXJ5X2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgY2hhcmdlcl9kYXRhICpjaGFyZ2VyID0gY29udGFpbmVyX29mKHBzeSwKKwkJCXN0cnVjdCBjaGFyZ2VyX2RhdGEsIGJhdHRlcnkpOworCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSBjaGFyZ2VyLT5pb2Rldi0+aTJjOworCWludCByZXQ7CisJdTggcmVnOworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKKwkJdmFsLT5pbnR2YWwgPSAwOworCQlyZXQgPSBtYXg4OTk3X3JlYWRfcmVnKGkyYywgTUFYODk5N19SRUdfU1RBVFVTNCwgJnJlZyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlpZiAoKHJlZyAmICgxIDw8IDApKSA9PSAweDEpCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKKworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6CisJCXZhbC0+aW50dmFsID0gMDsKKwkJcmV0ID0gbWF4ODk5N19yZWFkX3JlZyhpMmMsIE1BWDg5OTdfUkVHX1NUQVRVUzQsICZyZWcpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKChyZWcgJiAoMSA8PCAyKSkgPT0gMHgwKQorCQkJdmFsLT5pbnR2YWwgPSAxOworCisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgorCQl2YWwtPmludHZhbCA9IDA7CisJCXJldCA9IG1heDg5OTdfcmVhZF9yZWcoaTJjLCBNQVg4OTk3X1JFR19TVEFUVVM0LCAmcmVnKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCS8qIERDSU5PSyAqLworCQlpZiAocmVnICYgKDEgPDwgMSkpCisJCQl2YWwtPmludHZhbCA9IDE7CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2RldmluaXQgaW50IG1heDg5OTdfYmF0dGVyeV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBjaGFyZ2VyX2RhdGEgKmNoYXJnZXI7CisJc3RydWN0IG1heDg5OTdfZGV2ICppb2RldiA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgbWF4ODk5N19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoaW9kZXYtPmRldik7CisKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwZGF0YS0+ZW9jX21BKSB7CisJCXU4IHZhbCA9IChwZGF0YS0+ZW9jX21BIC0gNTApIC8gMTA7CisJCWlmICh2YWwgPCAwKQorCQkJdmFsID0gMDsKKwkJaWYgKHZhbCA+IDB4ZikKKwkJCXZhbCA9IDB4ZjsKKworCQlyZXQgPSBtYXg4OTk3X3VwZGF0ZV9yZWcoaW9kZXYtPmkyYywKKwkJCQlNQVg4OTk3X1JFR19NQkNDVFJMNSwgdmFsLCAweGYpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IHVzZSBpMmMgYnVzLlxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJc3dpdGNoIChwZGF0YS0+dGltZW91dCkgeworCWNhc2UgNToKKwkJcmV0ID0gbWF4ODk5N191cGRhdGVfcmVnKGlvZGV2LT5pMmMsIE1BWDg5OTdfUkVHX01CQ0NUUkwxLAorCQkJCTB4MiA8PCA0LCAweDcgPDwgNCk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJcmV0ID0gbWF4ODk5N191cGRhdGVfcmVnKGlvZGV2LT5pMmMsIE1BWDg5OTdfUkVHX01CQ0NUUkwxLAorCQkJCTB4MyA8PCA0LCAweDcgPDwgNCk7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJcmV0ID0gbWF4ODk5N191cGRhdGVfcmVnKGlvZGV2LT5pMmMsIE1BWDg5OTdfUkVHX01CQ0NUUkwxLAorCQkJCTB4NCA8PCA0LCAweDcgPDwgNCk7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJcmV0ID0gbWF4ODk5N191cGRhdGVfcmVnKGlvZGV2LT5pMmMsIE1BWDg5OTdfUkVHX01CQ0NUUkwxLAorCQkJCTB4NyA8PCA0LCAweDcgPDwgNCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImluY29ycmVjdCB0aW1lb3V0IHZhbHVlICglZClcbiIsCisJCQkJcGRhdGEtPnRpbWVvdXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IHVzZSBpMmMgYnVzLlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJY2hhcmdlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjaGFyZ2VyX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2hhcmdlciA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2hhcmdlcik7CisKKwljaGFyZ2VyLT5iYXR0ZXJ5Lm5hbWUgPSAibWF4ODk5N19wbWljIjsKKwljaGFyZ2VyLT5iYXR0ZXJ5LnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOworCWNoYXJnZXItPmJhdHRlcnkuZ2V0X3Byb3BlcnR5ID0gbWF4ODk5N19iYXR0ZXJ5X2dldF9wcm9wZXJ0eTsKKwljaGFyZ2VyLT5iYXR0ZXJ5LnByb3BlcnRpZXMgPSBtYXg4OTk3X2JhdHRlcnlfcHJvcHM7CisJY2hhcmdlci0+YmF0dGVyeS5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUobWF4ODk5N19iYXR0ZXJ5X3Byb3BzKTsKKworCWNoYXJnZXItPmRldiA9ICZwZGV2LT5kZXY7CisJY2hhcmdlci0+aW9kZXYgPSBpb2RldjsKKworCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmY2hhcmdlci0+YmF0dGVyeSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQ6IHBvd2VyIHN1cHBseSByZWdpc3RlclxuIik7CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybiAwOworZXJyOgorCWtmcmVlKGNoYXJnZXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG1heDg5OTdfYmF0dGVyeV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgY2hhcmdlcl9kYXRhICpjaGFyZ2VyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmY2hhcmdlci0+YmF0dGVyeSk7CisJa2ZyZWUoY2hhcmdlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIG1heDg5OTdfYmF0dGVyeV9pZFtdID0geworCXsgIm1heDg5OTctYmF0dGVyeSIsIDAgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1heDg5OTdfYmF0dGVyeV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibWF4ODk5Ny1iYXR0ZXJ5IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBtYXg4OTk3X2JhdHRlcnlfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKG1heDg5OTdfYmF0dGVyeV9yZW1vdmUpLAorCS5pZF90YWJsZSA9IG1heDg5OTdfYmF0dGVyeV9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1heDg5OTdfYmF0dGVyeV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbWF4ODk5N19iYXR0ZXJ5X2RyaXZlcik7Cit9CitzdWJzeXNfaW5pdGNhbGwobWF4ODk5N19iYXR0ZXJ5X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbWF4ODk5N19iYXR0ZXJ5X2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbWF4ODk5N19iYXR0ZXJ5X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChtYXg4OTk3X2JhdHRlcnlfY2xlYW51cCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiTUFYSU0gODk5Ny84OTY2IGJhdHRlcnkgY29udHJvbCBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk15dW5nSm9vIEhhbSA8bXl1bmdqb28uaGFtQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9tYXg4OTk4X2NoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvbWF4ODk5OF9jaGFyZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MyMWZhMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcG93ZXIvbWF4ODk5OF9jaGFyZ2VyLmMKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBtYXg4OTk4X2NoYXJnZXIuYyAtIFBvd2VyIHN1cHBseSBjb25zdW1lciBkcml2ZXIgZm9yIHRoZSBNYXhpbSA4OTk4L0xQMzk3NAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKiAgTXl1bmdKb28gSGFtIDxteXVuZ2pvby5oYW1Ac2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21heDg5OTguaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvbWF4ODk5OC1wcml2YXRlLmg+CisKK3N0cnVjdCBtYXg4OTk4X2JhdHRlcnlfZGF0YSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBtYXg4OTk4X2RldiAqaW9kZXY7CisJc3RydWN0IHBvd2VyX3N1cHBseSBiYXR0ZXJ5OworfTsKKworc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IG1heDg5OThfYmF0dGVyeV9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsIC8qIHRoZSBwcmVzZW5jZSBvZiBiYXR0ZXJ5ICovCisJUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLCAvKiBjaGFyZ2VyIGlzIGFjdGl2ZSBvciBub3QgKi8KK307CisKKy8qIE5vdGUgdGhhdCB0aGUgY2hhcmdlciBjb250cm9sIGlzIGRvbmUgYnkgYSBjdXJyZW50IHJlZ3VsYXRvciAiQ0hBUkdFUiIgKi8KK3N0YXRpYyBpbnQgbWF4ODk5OF9iYXR0ZXJ5X2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgbWF4ODk5OF9iYXR0ZXJ5X2RhdGEgKm1heDg5OTggPSBjb250YWluZXJfb2YocHN5LAorCQkJc3RydWN0IG1heDg5OThfYmF0dGVyeV9kYXRhLCBiYXR0ZXJ5KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gbWF4ODk5OC0+aW9kZXYtPmkyYzsKKwlpbnQgcmV0OworCXU4IHJlZzsKKworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgorCQlyZXQgPSBtYXg4OTk4X3JlYWRfcmVnKGkyYywgTUFYODk5OF9SRUdfU1RBVFVTMiwgJnJlZyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlpZiAocmVnICYgKDEgPDwgNCkpCisJCQl2YWwtPmludHZhbCA9IDA7CisJCWVsc2UKKwkJCXZhbC0+aW50dmFsID0gMTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6CisJCXJldCA9IG1heDg5OThfcmVhZF9yZWcoaTJjLCBNQVg4OTk4X1JFR19TVEFUVVMyLCAmcmVnKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWlmIChyZWcgJiAoMSA8PCAzKSkKKwkJCXZhbC0+aW50dmFsID0gMDsKKwkJZWxzZQorCQkJdmFsLT5pbnR2YWwgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9fZGV2aW5pdCBpbnQgbWF4ODk5OF9iYXR0ZXJ5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1heDg5OThfZGV2ICppb2RldiA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgbWF4ODk5OF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoaW9kZXYtPmRldik7CisJc3RydWN0IG1heDg5OThfYmF0dGVyeV9kYXRhICptYXg4OTk4OworCXN0cnVjdCBpMmNfY2xpZW50ICppMmM7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9lcnIocGRldi0+ZGV2LnBhcmVudCwgIk5vIHBsYXRmb3JtIGluaXQgZGF0YSBzdXBwbGllZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW1heDg5OTggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWF4ODk5OF9iYXR0ZXJ5X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1heDg5OTgpCisJCXJldHVybiAtRU5PTUVNOworCisJbWF4ODk5OC0+ZGV2ID0gJnBkZXYtPmRldjsKKwltYXg4OTk4LT5pb2RldiA9IGlvZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1heDg5OTgpOworCWkyYyA9IG1heDg5OTgtPmlvZGV2LT5pMmM7CisKKwkvKiBTZXR1cCAiRW5kIG9mIENoYXJnZSIgKi8KKwkvKiBJZiBFT0MgdmFsdWUgZXF1YWxzIDAsCisJICogcmVtYWluIHZhbHVlIHNldCBmcm9tIGJvb3Rsb2FkZXIgb3IgZGVmYXVsdCB2YWx1ZSAqLworCWlmIChwZGF0YS0+ZW9jID49IDEwICYmIHBkYXRhLT5lb2MgPD0gNDUpIHsKKwkJbWF4ODk5OF91cGRhdGVfcmVnKGkyYywgTUFYODk5OF9SRUdfQ0hHUjEsCisJCQkJKHBkYXRhLT5lb2MgLyA1IC0gMikgPDwgNSwgMHg3IDw8IDUpOworCX0gZWxzZSBpZiAocGRhdGEtPmVvYyA9PSAwKSB7CisJCWRldl9kYmcobWF4ODk5OC0+ZGV2LAorCQkJIkVPQyB2YWx1ZSBub3Qgc2V0OiBsZWF2ZSBpdCB1bmNoYW5nZWQuXG4iKTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKG1heDg5OTgtPmRldiwgIkludmFsaWQgRU9DIHZhbHVlXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJLyogU2V0dXAgQ2hhcmdlIFJlc3RhcnQgTGV2ZWwgKi8KKwlzd2l0Y2ggKHBkYXRhLT5yZXN0YXJ0KSB7CisJY2FzZSAxMDA6CisJCW1heDg5OThfdXBkYXRlX3JlZyhpMmMsIE1BWDg5OThfUkVHX0NIR1IxLCAweDEgPDwgMywgMHgzIDw8IDMpOworCQlicmVhazsKKwljYXNlIDE1MDoKKwkJbWF4ODk5OF91cGRhdGVfcmVnKGkyYywgTUFYODk5OF9SRUdfQ0hHUjEsIDB4MCA8PCAzLCAweDMgPDwgMyk7CisJCWJyZWFrOworCWNhc2UgMjAwOgorCQltYXg4OTk4X3VwZGF0ZV9yZWcoaTJjLCBNQVg4OTk4X1JFR19DSEdSMSwgMHgyIDw8IDMsIDB4MyA8PCAzKTsKKwkJYnJlYWs7CisJY2FzZSAtMToKKwkJbWF4ODk5OF91cGRhdGVfcmVnKGkyYywgTUFYODk5OF9SRUdfQ0hHUjEsIDB4MyA8PCAzLCAweDMgPDwgMyk7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJZGV2X2RiZyhtYXg4OTk4LT5kZXYsCisJCQkiUmVzdGFydCBMZXZlbCBub3Qgc2V0OiBsZWF2ZSBpdCB1bmNoYW5nZWQuXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihtYXg4OTk4LT5kZXYsICJJbnZhbGlkIFJlc3RhcnQgTGV2ZWxcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBTZXR1cCBDaGFyZ2UgRnVsbCBUaW1lb3V0ICovCisJc3dpdGNoIChwZGF0YS0+dGltZW91dCkgeworCWNhc2UgNToKKwkJbWF4ODk5OF91cGRhdGVfcmVnKGkyYywgTUFYODk5OF9SRUdfQ0hHUjIsIDB4MCA8PCA0LCAweDMgPDwgNCk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJbWF4ODk5OF91cGRhdGVfcmVnKGkyYywgTUFYODk5OF9SRUdfQ0hHUjIsIDB4MSA8PCA0LCAweDMgPDwgNCk7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJbWF4ODk5OF91cGRhdGVfcmVnKGkyYywgTUFYODk5OF9SRUdfQ0hHUjIsIDB4MiA8PCA0LCAweDMgPDwgNCk7CisJCWJyZWFrOworCWNhc2UgLTE6CisJCW1heDg5OThfdXBkYXRlX3JlZyhpMmMsIE1BWDg5OThfUkVHX0NIR1IyLCAweDMgPDwgNCwgMHgzIDw8IDQpOworCQlicmVhazsKKwljYXNlIDA6CisJCWRldl9kYmcobWF4ODk5OC0+ZGV2LAorCQkJIkZ1bGwgVGltZW91dCBub3Qgc2V0OiBsZWF2ZSBpdCB1bmNoYW5nZWQuXG4iKTsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKG1heDg5OTgtPmRldiwgIkludmFsaWQgRnVsbCBUaW1lb3V0IHZhbHVlXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJbWF4ODk5OC0+YmF0dGVyeS5uYW1lID0gIm1heDg5OThfcG1pYyI7CisJbWF4ODk5OC0+YmF0dGVyeS50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKKwltYXg4OTk4LT5iYXR0ZXJ5LmdldF9wcm9wZXJ0eSA9IG1heDg5OThfYmF0dGVyeV9nZXRfcHJvcGVydHk7CisJbWF4ODk5OC0+YmF0dGVyeS5wcm9wZXJ0aWVzID0gbWF4ODk5OF9iYXR0ZXJ5X3Byb3BzOworCW1heDg5OTgtPmJhdHRlcnkubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKG1heDg5OThfYmF0dGVyeV9wcm9wcyk7CisKKwlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIobWF4ODk5OC0+ZGV2LCAmbWF4ODk5OC0+YmF0dGVyeSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKG1heDg5OTgtPmRldiwgImZhaWxlZDogcG93ZXIgc3VwcGx5IHJlZ2lzdGVyXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIDA7CitlcnI6CisJa2ZyZWUobWF4ODk5OCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbWF4ODk5OF9iYXR0ZXJ5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtYXg4OTk4X2JhdHRlcnlfZGF0YSAqbWF4ODk5OCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJm1heDg5OTgtPmJhdHRlcnkpOworCWtmcmVlKG1heDg5OTgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIG1heDg5OThfYmF0dGVyeV9pZFtdID0geworCXsgIm1heDg5OTgtYmF0dGVyeSIsIFRZUEVfTUFYODk5OCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWF4ODk5OF9iYXR0ZXJ5X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtYXg4OTk4LWJhdHRlcnkiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IG1heDg5OThfYmF0dGVyeV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AobWF4ODk5OF9iYXR0ZXJ5X3JlbW92ZSksCisJLmlkX3RhYmxlID0gbWF4ODk5OF9iYXR0ZXJ5X2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWF4ODk5OF9iYXR0ZXJ5X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtYXg4OTk4X2JhdHRlcnlfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KG1heDg5OThfYmF0dGVyeV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG1heDg5OThfYmF0dGVyeV9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1heDg5OThfYmF0dGVyeV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQobWF4ODk5OF9iYXR0ZXJ5X2NsZWFudXApOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk1BWElNIDg5OTggYmF0dGVyeSBjb250cm9sIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTXl1bmdKb28gSGFtIDxteXVuZ2pvby5oYW1Ac2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOm1heDg5OTgtYmF0dGVyeSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9zM2NfYWRjX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvczNjX2FkY19iYXR0ZXJ5LmMKaW5kZXggZDM2YzI4OS4uYTY3NWUzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9zM2NfYWRjX2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL3MzY19hZGNfYmF0dGVyeS5jCkBAIC0yNjYsNyArMjY2LDcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHMzY19hZGNfYmF0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzM2NfYWRjX2JhdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBzM2NfYWRjX2NsaWVudAkqY2xpZW50OwogCXN0cnVjdCBzM2NfYWRjX2JhdF9wZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvdHdsNDAzMF9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3R3bDQwMzBfY2hhcmdlci5jCmluZGV4IDkyYzE2ZTEuLjU0YjkxOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvdHdsNDAzMF9jaGFyZ2VyLmMKKysrIGIvZHJpdmVycy9wb3dlci90d2w0MDMwX2NoYXJnZXIuYwpAQCAtNjIsNyArNjIsNyBAQAogI2RlZmluZSBUV0w0MDMwX01TVEFURUNfQ09NUExFVEU0CTB4MGUKIAogc3RhdGljIGJvb2wgYWxsb3dfdXNiOwotbW9kdWxlX3BhcmFtKGFsbG93X3VzYiwgYm9vbCwgMSk7Cittb2R1bGVfcGFyYW0oYWxsb3dfdXNiLCBib29sLCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYWxsb3dfdXNiLCAiQWxsb3cgVVNCIGNoYXJnZSBkcmF3aW5nIGRlZmF1bHQgY3VycmVudCIpOwogCiBzdHJ1Y3QgdHdsNDAzMF9iY2kgewpAQCAtNDI1LDcgKzQyNSw3IEBACiB7CiAJc3RydWN0IHR3bDQwMzBfYmNpICpiY2k7CiAJaW50IHJldDsKLQlpbnQgcmVnOworCXUzMiByZWc7CiAKIAliY2kgPSBremFsbG9jKHNpemVvZigqYmNpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGJjaSA9PSBOVUxMKQpAQCAtNDg2LDcgKzQ4Niw3IEBACiAJfQogCiAJLyogRW5hYmxlIGludGVycnVwdHMgbm93LiAqLwotCXJlZyA9IH4oVFdMNDAzMF9JQ0hHTE9XIHwgVFdMNDAzMF9JQ0hHRU9DIHwgVFdMNDAzMF9UQkFUT1IyIHwKKwlyZWcgPSB+KHUzMikoVFdMNDAzMF9JQ0hHTE9XIHwgVFdMNDAzMF9JQ0hHRU9DIHwgVFdMNDAzMF9UQkFUT1IyIHwKIAkJVFdMNDAzMF9UQkFUT1IxIHwgVFdMNDAzMF9CQVRTVFMpOwogCXJldCA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfSU5URVJSVVBUUywgcmVnLAogCQkJICAgICAgIFRXTDQwMzBfSU5URVJSVVBUU19CQ0lJTVIxQSk7CkBAIC00OTUsNyArNDk1LDcgQEAKIAkJZ290byBmYWlsX3VubWFza19pbnRlcnJ1cHRzOwogCX0KIAotCXJlZyA9IH4oVFdMNDAzMF9WQkFUT1YgfCBUV0w0MDMwX1ZCVVNPViB8IFRXTDQwMzBfQUNDSEdPVik7CisJcmVnID0gfih1MzIpKFRXTDQwMzBfVkJBVE9WIHwgVFdMNDAzMF9WQlVTT1YgfCBUV0w0MDMwX0FDQ0hHT1YpOwogCXJldCA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfSU5URVJSVVBUUywgcmVnLAogCQkJICAgICAgIFRXTDQwMzBfSU5URVJSVVBUU19CQ0lJTVIyQSk7CiAJaWYgKHJldCA8IDApCkBAIC01NzIsNyArNTcyLDcgQEAKIH0KIG1vZHVsZV9leGl0KHR3bDQwMzBfYmNpX2V4aXQpOwogCi1NT0RVTEVfQVVUSE9SKCJHcmHFvnlkYXMgSWdub3RhcyIpOworTU9EVUxFX0FVVEhPUigiR3Jhxb52eWRhcyBJZ25vdGFzIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlRXTDQwMzAgQmF0dGVyeSBDaGFyZ2VyIEludGVyZmFjZSBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BTElBUygicGxhdGZvcm06dHdsNDAzMF9iY2kiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvd204MzF4X2JhY2t1cC5jIGIvZHJpdmVycy9wb3dlci93bTgzMXhfYmFja3VwLmMKaW5kZXggMGZkMTMwZC4uZTY0OGNiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci93bTgzMXhfYmFja3VwLmMKKysrIGIvZHJpdmVycy9wb3dlci93bTgzMXhfYmFja3VwLmMKQEAgLTIyLDYgKzIyLDcgQEAKIHN0cnVjdCB3bTgzMXhfYmFja3VwIHsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXg7CiAJc3RydWN0IHBvd2VyX3N1cHBseSBiYWNrdXA7CisJY2hhciBuYW1lWzIwXTsKIH07CiAKIHN0YXRpYyBpbnQgd204MzF4X2JhY2t1cF9yZWFkX3ZvbHRhZ2Uoc3RydWN0IHdtODMxeCAqd204MzF4LApAQCAtMTYzLDYgKzE2NCw3IEBACiBzdGF0aWMgX19kZXZpbml0IGludCB3bTgzMXhfYmFja3VwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHdtODMxeCAqd204MzF4ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCB3bTgzMXhfcGRhdGEgKndtODMxeF9wZGF0YSA9IHdtODMxeC0+ZGV2LT5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCB3bTgzMXhfYmFja3VwICpkZXZkYXRhOwogCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhY2t1cDsKIAlpbnQgcmV0OwpAQCAtMTgyLDcgKzE4NCwxNCBAQAogCSAqLwogCXdtODMxeF9jb25maWdfYmFja3VwKHdtODMxeCk7CiAKLQliYWNrdXAtPm5hbWUgPSAid204MzF4LWJhY2t1cCI7CisJaWYgKHdtODMxeF9wZGF0YSAmJiB3bTgzMXhfcGRhdGEtPndtODMxeF9udW0pCisJCXNucHJpbnRmKGRldmRhdGEtPm5hbWUsIHNpemVvZihkZXZkYXRhLT5uYW1lKSwKKwkJCSAid204MzF4LWJhY2t1cC4lZCIsIHdtODMxeF9wZGF0YS0+d204MzF4X251bSk7CisJZWxzZQorCQlzbnByaW50ZihkZXZkYXRhLT5uYW1lLCBzaXplb2YoZGV2ZGF0YS0+bmFtZSksCisJCQkgIndtODMxeC1iYWNrdXAiKTsKKworCWJhY2t1cC0+bmFtZSA9IGRldmRhdGEtPm5hbWU7CiAJYmFja3VwLT50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKIAliYWNrdXAtPnByb3BlcnRpZXMgPSB3bTgzMXhfYmFja3VwX3Byb3BzOwogCWJhY2t1cC0+bnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHdtODMxeF9iYWNrdXBfcHJvcHMpOwpAQCAtMjAzLDYgKzIxMiw3IEBACiAJc3RydWN0IHdtODMxeF9iYWNrdXAgKmRldmRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZkZXZkYXRhLT5iYWNrdXApOworCWtmcmVlKGRldmRhdGEtPmJhY2t1cC5uYW1lKTsKIAlrZnJlZShkZXZkYXRhKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci93bTgzMXhfcG93ZXIuYyBiL2RyaXZlcnMvcG93ZXIvd204MzF4X3Bvd2VyLmMKaW5kZXggZGRmOGNmNS4uNmNjMmNhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci93bTgzMXhfcG93ZXIuYworKysgYi9kcml2ZXJzL3Bvd2VyL3dtODMxeF9wb3dlci5jCkBAIC0yNCw2ICsyNCw5IEBACiAJc3RydWN0IHBvd2VyX3N1cHBseSB3YWxsOwogCXN0cnVjdCBwb3dlcl9zdXBwbHkgdXNiOwogCXN0cnVjdCBwb3dlcl9zdXBwbHkgYmF0dGVyeTsKKwljaGFyIHdhbGxfbmFtZVsyMF07CisJY2hhciB1c2JfbmFtZVsyMF07CisJY2hhciBiYXR0ZXJ5X25hbWVbMjBdOwogfTsKIAogc3RhdGljIGludCB3bTgzMXhfcG93ZXJfY2hlY2tfb25saW5lKHN0cnVjdCB3bTgzMXggKndtODMxeCwgaW50IHN1cHBseSwKQEAgLTQ4Niw2ICs0ODksNyBAQAogc3RhdGljIF9fZGV2aW5pdCBpbnQgd204MzF4X3Bvd2VyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHdtODMxeCAqd204MzF4ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCB3bTgzMXhfcGRhdGEgKndtODMxeF9wZGF0YSA9IHdtODMxeC0+ZGV2LT5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCB3bTgzMXhfcG93ZXIgKnBvd2VyOwogCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnVzYjsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXR0ZXJ5OwpAQCAtNTAzLDEyICs1MDcsMjggQEAKIAliYXR0ZXJ5ID0gJnBvd2VyLT5iYXR0ZXJ5OwogCXdhbGwgPSAmcG93ZXItPndhbGw7CiAKKwlpZiAod204MzF4X3BkYXRhICYmIHdtODMxeF9wZGF0YS0+d204MzF4X251bSkgeworCQlzbnByaW50Zihwb3dlci0+d2FsbF9uYW1lLCBzaXplb2YocG93ZXItPndhbGxfbmFtZSksCisJCQkgIndtODMxeC13YWxsLiVkIiwgd204MzF4X3BkYXRhLT53bTgzMXhfbnVtKTsKKwkJc25wcmludGYocG93ZXItPmJhdHRlcnlfbmFtZSwgc2l6ZW9mKHBvd2VyLT53YWxsX25hbWUpLAorCQkJICJ3bTgzMXgtYmF0dGVyeS4lZCIsIHdtODMxeF9wZGF0YS0+d204MzF4X251bSk7CisJCXNucHJpbnRmKHBvd2VyLT51c2JfbmFtZSwgc2l6ZW9mKHBvd2VyLT53YWxsX25hbWUpLAorCQkJICJ3bTgzMXgtdXNiLiVkIiwgd204MzF4X3BkYXRhLT53bTgzMXhfbnVtKTsKKwl9IGVsc2UgeworCQlzbnByaW50Zihwb3dlci0+d2FsbF9uYW1lLCBzaXplb2YocG93ZXItPndhbGxfbmFtZSksCisJCQkgIndtODMxeC13YWxsIik7CisJCXNucHJpbnRmKHBvd2VyLT5iYXR0ZXJ5X25hbWUsIHNpemVvZihwb3dlci0+d2FsbF9uYW1lKSwKKwkJCSAid204MzF4LWJhdHRlcnkiKTsKKwkJc25wcmludGYocG93ZXItPnVzYl9uYW1lLCBzaXplb2YocG93ZXItPndhbGxfbmFtZSksCisJCQkgIndtODMxeC11c2IiKTsKKwl9CisKIAkvKiBXZSBpZ25vcmUgY29uZmlndXJhdGlvbiBmYWlsdXJlcyBzaW5jZSB3ZSBjYW4gc3RpbGwgcmVhZCBiYWNrCiAJICogdGhlIHN0YXR1cyB3aXRob3V0IGVuYWJsaW5nIHRoZSBjaGFyZ2VyLgogCSAqLwogCXdtODMxeF9jb25maWdfYmF0dGVyeSh3bTgzMXgpOwogCi0Jd2FsbC0+bmFtZSA9ICJ3bTgzMXgtd2FsbCI7CisJd2FsbC0+bmFtZSA9IHBvd2VyLT53YWxsX25hbWU7CiAJd2FsbC0+dHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TOwogCXdhbGwtPnByb3BlcnRpZXMgPSB3bTgzMXhfd2FsbF9wcm9wczsKIAl3YWxsLT5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUod204MzF4X3dhbGxfcHJvcHMpOwpAQCAtNTE3LDcgKzUzNyw3IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfa21hbGxvYzsKIAotCWJhdHRlcnktPm5hbWUgPSAid204MzF4LWJhdHRlcnkiOworCWJhdHRlcnktPm5hbWUgPSBwb3dlci0+YmF0dGVyeV9uYW1lOwogCWJhdHRlcnktPnByb3BlcnRpZXMgPSB3bTgzMXhfYmF0X3Byb3BzOwogCWJhdHRlcnktPm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRSh3bTgzMXhfYmF0X3Byb3BzKTsKIAliYXR0ZXJ5LT5nZXRfcHJvcGVydHkgPSB3bTgzMXhfYmF0X2dldF9wcm9wOwpAQCAtNTI2LDcgKzU0Niw3IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfd2FsbDsKIAotCXVzYi0+bmFtZSA9ICJ3bTgzMXgtdXNiIiwKKwl1c2ItPm5hbWUgPSBwb3dlci0+dXNiX25hbWUsCiAJdXNiLT50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfVVNCOwogCXVzYi0+cHJvcGVydGllcyA9IHdtODMxeF91c2JfcHJvcHM7CiAJdXNiLT5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUod204MzF4X3VzYl9wcm9wcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnIGIvZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZwppbmRleCAxMThlYjIxLi5jN2ZkMmMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcKQEAgLTI0OSw2ICsyNDksMTIgQEAKIAkgIHRocmVlIHN0ZXAtZG93biBjb252ZXJ0ZXJzIGFuZCB0d28gZ2VuZXJhbC1wdXJwb3NlIExETyB2b2x0YWdlIHJlZ3VsYXRvcnMuCiAJICBJdCBzdXBwb3J0cyBUSSdzIHNvZnR3YXJlIGJhc2VkIENsYXNzLTIgU21hcnRSZWZsZXggaW1wbGVtZW50YXRpb24uCiAKK2NvbmZpZyBSRUdVTEFUT1JfVFBTNjU5MTIKKwl0cmlzdGF0ZSAiVEkgVFBTNjU5MTIgUG93ZXIgcmVndWxhdG9yIgorCWRlcGVuZHMgb24gKE1GRF9UUFM2NTkxMl9JMkMgfHwgTUZEX1RQUzY1OTEyX1NQSSkKKwloZWxwCisJICAgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFRQUzY1OTEyIHZvbHRhZ2UgcmVndWxhdG9yIGNoaXAuCisKIGNvbmZpZyBSRUdVTEFUT1JfODhQTTg2MDcKIAlib29sICJNYXJ2ZWxsIDg4UE04NjA3IFBvd2VyIHJlZ3VsYXRvcnMiCiAJZGVwZW5kcyBvbiBNRkRfODhQTTg2MFg9eQpAQCAtMzA0LDUgKzMxMCwxMiBAQAogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFRQUzY1OTEwIHZvbHRhZ2UgcmVndWxhdG9yIGNoaXBzLgogCitjb25maWcgUkVHVUxBVE9SX0FBVDI4NzAKKwl0cmlzdGF0ZSAiQW5hbG9naWNUZWNoIEFBVDI4NzAgUmVndWxhdG9ycyIKKwlkZXBlbmRzIG9uIE1GRF9BQVQyODcwX0NPUkUKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIEFuYWxvZ2ljVGVjaCBBQVQyODcwIHNheSBZIHRvIGVuYWJsZSB0aGUKKwkgIHJlZ3VsYXRvciBkcml2ZXIuCisKIGVuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL01ha2VmaWxlIGIvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUKaW5kZXggMzkzMmQyZS4uMDQwZDVhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUKQEAgLTM4LDEwICszOCwxMiBAQAogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9UUFM2NTAyMykgKz0gdHBzNjUwMjMtcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfVFBTNjUwN1gpICs9IHRwczY1MDd4LXJlZ3VsYXRvci5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX1RQUzY1MjRYKSArPSB0cHM2NTI0eC1yZWd1bGF0b3Iubworb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9UUFM2NTkxMikgKz0gdHBzNjU5MTItcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfODhQTTg2MDcpICs9IDg4cG04NjA3Lm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfSVNMNjI3MUEpICs9IGlzbDYyNzFhLXJlZ3VsYXRvci5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX0FCODUwMCkJKz0gYWI4NTAwLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfREI4NTAwX1BSQ01VKSArPSBkYjg1MDAtcHJjbXUubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9UUFM2NTkxMCkgKz0gdHBzNjU5MTAtcmVndWxhdG9yLm8KK29iai0kKENPTkZJR19SRUdVTEFUT1JfQUFUMjg3MCkgKz0gYWF0Mjg3MC1yZWd1bGF0b3IubwogCiBjY2ZsYWdzLSQoQ09ORklHX1JFR1VMQVRPUl9ERUJVRykgKz0gLURERUJVRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvYWF0Mjg3MC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2FhdDI4NzAtcmVndWxhdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0MTA0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2FhdDI4NzAtcmVndWxhdG9yLmMKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL3JlZ3VsYXRvci9hYXQyODcwLXJlZ3VsYXRvci5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBOVklESUEgQ29ycG9yYXRpb24uCisgKiBBdXRob3I6IEppbiBQYXJrIDxqaW55b3VuZ3BAbnZpZGlhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvYWF0Mjg3MC5oPgorCitzdHJ1Y3QgYWF0Mjg3MF9yZWd1bGF0b3IgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXNjIGRlc2M7CisKKwljb25zdCBpbnQgKnZvbHRhZ2VzOyAvKiB1ViAqLworCisJaW50IG1pbl91VjsKKwlpbnQgbWF4X3VWOworCisJdTggZW5hYmxlX2FkZHI7CisJdTggZW5hYmxlX3NoaWZ0OworCXU4IGVuYWJsZV9tYXNrOworCisJdTggdm9sdGFnZV9hZGRyOworCXU4IHZvbHRhZ2Vfc2hpZnQ7CisJdTggdm9sdGFnZV9tYXNrOworfTsKKworc3RhdGljIGludCBhYXQyODcwX2xkb19saXN0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCisJCQkJICAgIHVuc2lnbmVkIHNlbGVjdG9yKQoreworCXN0cnVjdCBhYXQyODcwX3JlZ3VsYXRvciAqcmkgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCisJcmV0dXJuIHJpLT52b2x0YWdlc1tzZWxlY3Rvcl07Cit9CisKK3N0YXRpYyBpbnQgYWF0Mjg3MF9sZG9fc2V0X3ZvbHRhZ2Vfc2VsKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAorCQkJCSAgICAgICB1bnNpZ25lZCBzZWxlY3RvcikKK3sKKwlzdHJ1Y3QgYWF0Mjg3MF9yZWd1bGF0b3IgKnJpID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwID0gZGV2X2dldF9kcnZkYXRhKHJpLT5wZGV2LT5kZXYucGFyZW50KTsKKworCXJldHVybiBhYXQyODcwLT51cGRhdGUoYWF0Mjg3MCwgcmktPnZvbHRhZ2VfYWRkciwgcmktPnZvbHRhZ2VfbWFzaywKKwkJCShzZWxlY3RvciA8PCByaS0+dm9sdGFnZV9zaGlmdCkgJiByaS0+dm9sdGFnZV9tYXNrKTsKK30KKworc3RhdGljIGludCBhYXQyODcwX2xkb19nZXRfdm9sdGFnZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJc3RydWN0IGFhdDI4NzBfcmVndWxhdG9yICpyaSA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCA9IGRldl9nZXRfZHJ2ZGF0YShyaS0+cGRldi0+ZGV2LnBhcmVudCk7CisJdTggdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBhYXQyODcwLT5yZWFkKGFhdDI4NzAsIHJpLT52b2x0YWdlX2FkZHIsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gKHZhbCAmIHJpLT52b2x0YWdlX21hc2spID4+IHJpLT52b2x0YWdlX3NoaWZ0OworfQorCitzdGF0aWMgaW50IGFhdDI4NzBfbGRvX2VuYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3QgYWF0Mjg3MF9yZWd1bGF0b3IgKnJpID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwID0gZGV2X2dldF9kcnZkYXRhKHJpLT5wZGV2LT5kZXYucGFyZW50KTsKKworCXJldHVybiBhYXQyODcwLT51cGRhdGUoYWF0Mjg3MCwgcmktPmVuYWJsZV9hZGRyLCByaS0+ZW5hYmxlX21hc2ssCisJCQkgICAgICAgcmktPmVuYWJsZV9tYXNrKTsKK30KKworc3RhdGljIGludCBhYXQyODcwX2xkb19kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCBhYXQyODcwX3JlZ3VsYXRvciAqcmkgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCXN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzAgPSBkZXZfZ2V0X2RydmRhdGEocmktPnBkZXYtPmRldi5wYXJlbnQpOworCisJcmV0dXJuIGFhdDI4NzAtPnVwZGF0ZShhYXQyODcwLCByaS0+ZW5hYmxlX2FkZHIsIHJpLT5lbmFibGVfbWFzaywgMCk7Cit9CisKK3N0YXRpYyBpbnQgYWF0Mjg3MF9sZG9faXNfZW5hYmxlZChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3QgYWF0Mjg3MF9yZWd1bGF0b3IgKnJpID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwID0gZGV2X2dldF9kcnZkYXRhKHJpLT5wZGV2LT5kZXYucGFyZW50KTsKKwl1OCB2YWw7CisJaW50IHJldDsKKworCXJldCA9IGFhdDI4NzAtPnJlYWQoYWF0Mjg3MCwgcmktPmVuYWJsZV9hZGRyLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHZhbCAmIHJpLT5lbmFibGVfbWFzayA/IDEgOiAwOworfQorCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgYWF0Mjg3MF9sZG9fb3BzID0geworCS5saXN0X3ZvbHRhZ2UgPSBhYXQyODcwX2xkb19saXN0X3ZvbHRhZ2UsCisJLnNldF92b2x0YWdlX3NlbCA9IGFhdDI4NzBfbGRvX3NldF92b2x0YWdlX3NlbCwKKwkuZ2V0X3ZvbHRhZ2Vfc2VsID0gYWF0Mjg3MF9sZG9fZ2V0X3ZvbHRhZ2Vfc2VsLAorCS5lbmFibGUgPSBhYXQyODcwX2xkb19lbmFibGUsCisJLmRpc2FibGUgPSBhYXQyODcwX2xkb19kaXNhYmxlLAorCS5pc19lbmFibGVkID0gYWF0Mjg3MF9sZG9faXNfZW5hYmxlZCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgYWF0Mjg3MF9sZG9fdm9sdGFnZXNbXSA9IHsKKwkxMjAwMDAwLCAxMzAwMDAwLCAxNTAwMDAwLCAxNjAwMDAwLAorCTE4MDAwMDAsIDIwMDAwMDAsIDIyMDAwMDAsIDI1MDAwMDAsCisJMjYwMDAwMCwgMjcwMDAwMCwgMjgwMDAwMCwgMjkwMDAwMCwKKwkzMDAwMDAwLCAzMTAwMDAwLCAzMjAwMDAwLCAzMzAwMDAwLAorfTsKKworI2RlZmluZSBBQVQyODcwX0xETyhpZHMpCQkJCVwKKwl7CQkJCQkJXAorCQkuZGVzYyA9IHsJCQkJXAorCQkJLm5hbWUgPSAjaWRzLAkJCVwKKwkJCS5pZCA9IEFBVDI4NzBfSURfIyNpZHMsCQlcCisJCQkubl92b2x0YWdlcyA9IEFSUkFZX1NJWkUoYWF0Mjg3MF9sZG9fdm9sdGFnZXMpLAlcCisJCQkub3BzID0gJmFhdDI4NzBfbGRvX29wcywJXAorCQkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwJXAorCQkJLm93bmVyID0gVEhJU19NT0RVTEUsCQlcCisJCX0sCQkJCQlcCisJCS52b2x0YWdlcyA9IGFhdDI4NzBfbGRvX3ZvbHRhZ2VzLAlcCisJCS5taW5fdVYgPSAxMjAwMDAwLAkJCVwKKwkJLm1heF91ViA9IDMzMDAwMDAsCQkJXAorCX0KKworc3RhdGljIHN0cnVjdCBhYXQyODcwX3JlZ3VsYXRvciBhYXQyODcwX3JlZ3VsYXRvcnNbXSA9IHsKKwlBQVQyODcwX0xETyhMRE9BKSwKKwlBQVQyODcwX0xETyhMRE9CKSwKKwlBQVQyODcwX0xETyhMRE9DKSwKKwlBQVQyODcwX0xETyhMRE9EKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWF0Mjg3MF9yZWd1bGF0b3IgKmFhdDI4NzBfZ2V0X3JlZ3VsYXRvcihpbnQgaWQpCit7CisJc3RydWN0IGFhdDI4NzBfcmVndWxhdG9yICpyaSA9IE5VTEw7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhYXQyODcwX3JlZ3VsYXRvcnMpOyBpKyspIHsKKwkJcmkgPSAmYWF0Mjg3MF9yZWd1bGF0b3JzW2ldOworCQlpZiAocmktPmRlc2MuaWQgPT0gaWQpCisJCQlicmVhazsKKwl9CisKKwlpZiAoIXJpKQorCQlyZXR1cm4gTlVMTDsKKworCXJpLT5lbmFibGVfYWRkciA9IEFBVDI4NzBfTERPX0VOOworCXJpLT5lbmFibGVfc2hpZnQgPSBpZCAtIEFBVDI4NzBfSURfTERPQTsKKwlyaS0+ZW5hYmxlX21hc2sgPSAweDEgPDwgcmktPmVuYWJsZV9zaGlmdDsKKworCXJpLT52b2x0YWdlX2FkZHIgPSAoaWQgLSBBQVQyODcwX0lEX0xET0EpIC8gMiA/CisJCQkgICBBQVQyODcwX0xET19DRCA6IEFBVDI4NzBfTERPX0FCOworCXJpLT52b2x0YWdlX3NoaWZ0ID0gKGlkIC0gQUFUMjg3MF9JRF9MRE9BKSAlIDIgPyAwIDogNDsKKwlyaS0+dm9sdGFnZV9tYXNrID0gMHhGIDw8IHJpLT52b2x0YWdlX3NoaWZ0OworCisJcmV0dXJuIHJpOworfQorCitzdGF0aWMgaW50IGFhdDI4NzBfcmVndWxhdG9yX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFhdDI4NzBfcmVndWxhdG9yICpyaTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKKworCXJpID0gYWF0Mjg3MF9nZXRfcmVndWxhdG9yKHBkZXYtPmlkKTsKKwlpZiAoIXJpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkludmFsaWQgZGV2aWNlIElELCAlZFxuIiwgcGRldi0+aWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmktPnBkZXYgPSBwZGV2OworCisJcmRldiA9IHJlZ3VsYXRvcl9yZWdpc3RlcigmcmktPmRlc2MsICZwZGV2LT5kZXYsCisJCQkJICBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSwgcmkpOworCWlmIChJU19FUlIocmRldikpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHJlZ3VsYXRvciAlc1xuIiwKKwkJCXJpLT5kZXNjLm5hbWUpOworCQlyZXR1cm4gUFRSX0VSUihyZGV2KTsKKwl9CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWF0Mjg3MF9yZWd1bGF0b3JfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJlZ3VsYXRvcl91bnJlZ2lzdGVyKHJkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhYXQyODcwX3JlZ3VsYXRvcl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiYWF0Mjg3MC1yZWd1bGF0b3IiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQk9IGFhdDI4NzBfcmVndWxhdG9yX3Byb2JlLAorCS5yZW1vdmUJPSBfX2RldmV4aXRfcChhYXQyODcwX3JlZ3VsYXRvcl9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWF0Mjg3MF9yZWd1bGF0b3JfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFhdDI4NzBfcmVndWxhdG9yX2RyaXZlcik7Cit9CitzdWJzeXNfaW5pdGNhbGwoYWF0Mjg3MF9yZWd1bGF0b3JfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhYXQyODcwX3JlZ3VsYXRvcl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFhdDI4NzBfcmVndWxhdG9yX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhYXQyODcwX3JlZ3VsYXRvcl9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2dpY1RlY2ggQUFUMjg3MCBSZWd1bGF0b3IiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkppbiBQYXJrIDxqaW55b3VuZ3BAbnZpZGlhLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYwppbmRleCBkM2UzODc5Li5kOGU2YTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9hc3luYy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgpAQCAtMzMsNiArMzQsOCBAQAogCiAjaW5jbHVkZSAiZHVtbXkuaCIKIAorI2RlZmluZSByZGV2X2NyaXQocmRldiwgZm10LCAuLi4pCQkJCQlcCisJcHJfY3JpdCgiJXM6ICIgZm10LCByZGV2X2dldF9uYW1lKHJkZXYpLCAjI19fVkFfQVJHU19fKQogI2RlZmluZSByZGV2X2VycihyZGV2LCBmbXQsIC4uLikJCQkJCVwKIAlwcl9lcnIoIiVzOiAiIGZtdCwgcmRldl9nZXRfbmFtZShyZGV2KSwgIyNfX1ZBX0FSR1NfXykKICNkZWZpbmUgcmRldl93YXJuKHJkZXYsIGZtdCwgLi4uKQkJCQkJXApAQCAtNzgsMTEgKzgxLDEzIEBACiAJY2hhciAqc3VwcGx5X25hbWU7CiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHI7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisJc3RydWN0IGRlbnRyeSAqZGVidWdmczsKKyNlbmRpZgogfTsKIAogc3RhdGljIGludCBfcmVndWxhdG9yX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpOwotc3RhdGljIGludCBfcmVndWxhdG9yX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCi0JCXN0cnVjdCByZWd1bGF0b3JfZGV2ICoqc3VwcGx5X3JkZXZfcHRyKTsKK3N0YXRpYyBpbnQgX3JlZ3VsYXRvcl9kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KTsKIHN0YXRpYyBpbnQgX3JlZ3VsYXRvcl9nZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldik7CiBzdGF0aWMgaW50IF9yZWd1bGF0b3JfZ2V0X2N1cnJlbnRfbGltaXQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpOwogc3RhdGljIHVuc2lnbmVkIGludCBfcmVndWxhdG9yX2dldF9tb2RlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KTsKQEAgLTkwLDYgKzk1LDkgQEAKIAkJCQkgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpOwogc3RhdGljIGludCBfcmVndWxhdG9yX2RvX3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAogCQkJCSAgICAgaW50IG1pbl91ViwgaW50IG1heF91Vik7CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvciAqY3JlYXRlX3JlZ3VsYXRvcihzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKKwkJCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgY29uc3QgY2hhciAqc3VwcGx5X25hbWUpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqcmRldl9nZXRfbmFtZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKQEAgLTE0Myw4ICsxNTEsMTEgQEAKIAlpZiAoKm1pbl91ViA8IHJkZXYtPmNvbnN0cmFpbnRzLT5taW5fdVYpCiAJCSptaW5fdVYgPSByZGV2LT5jb25zdHJhaW50cy0+bWluX3VWOwogCi0JaWYgKCptaW5fdVYgPiAqbWF4X3VWKQorCWlmICgqbWluX3VWID4gKm1heF91VikgeworCQlyZGV2X2VycihyZGV2LCAidW5zdXBwb3J0YWJsZSB2b2x0YWdlIHJhbmdlOiAlZC0lZHVWXG4iLAorCQkJICptaW5fdVYsICptYXhfdVYpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5Nyw4ICsyMDgsMTEgQEAKIAlpZiAoKm1pbl91QSA8IHJkZXYtPmNvbnN0cmFpbnRzLT5taW5fdUEpCiAJCSptaW5fdUEgPSByZGV2LT5jb25zdHJhaW50cy0+bWluX3VBOwogCi0JaWYgKCptaW5fdUEgPiAqbWF4X3VBKQorCWlmICgqbWluX3VBID4gKm1heF91QSkgeworCQlyZGV2X2VycihyZGV2LCAidW5zdXBwb3J0YWJsZSBjdXJyZW50IHJhbmdlOiAlZC0lZHVBXG4iLAorCQkJICptaW5fdUEsICptYXhfdUEpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIxMyw2ICsyMjcsNyBAQAogCWNhc2UgUkVHVUxBVE9SX01PREVfU1RBTkRCWToKIAkJYnJlYWs7CiAJZGVmYXVsdDoKKwkJcmRldl9lcnIocmRldiwgImludmFsaWQgbW9kZSAleCBzcGVjaWZpZWRcbiIsICptb2RlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC03NzksNyArNzk0LDYgQEAKIAkJaWYgKHJldCA8IDApIHsKIAkJCXJkZXZfZXJyKHJkZXYsICJmYWlsZWQgdG8gYXBwbHkgJWR1ViBjb25zdHJhaW50XG4iLAogCQkJCSByZGV2LT5jb25zdHJhaW50cy0+bWluX3VWKTsKLQkJCXJkZXYtPmNvbnN0cmFpbnRzID0gTlVMTDsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9CkBAIC04ODIsNyArODk2LDYgQEAKIAkJcmV0ID0gc3VzcGVuZF9wcmVwYXJlKHJkZXYsIHJkZXYtPmNvbnN0cmFpbnRzLT5pbml0aWFsX3N0YXRlKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXJkZXZfZXJyKHJkZXYsICJmYWlsZWQgdG8gc2V0IHN1c3BlbmQgc3RhdGVcbiIpOwotCQkJcmRldi0+Y29uc3RyYWludHMgPSBOVUxMOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CkBAIC05MDksMTMgKzkyMiwxNSBAQAogCQlyZXQgPSBvcHMtPmVuYWJsZShyZGV2KTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXJkZXZfZXJyKHJkZXYsICJmYWlsZWQgdG8gZW5hYmxlXG4iKTsKLQkJCXJkZXYtPmNvbnN0cmFpbnRzID0gTlVMTDsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQogCiAJcHJpbnRfY29uc3RyYWludHMocmRldik7CisJcmV0dXJuIDA7CiBvdXQ6CisJa2ZyZWUocmRldi0+Y29uc3RyYWludHMpOworCXJkZXYtPmNvbnN0cmFpbnRzID0gTlVMTDsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC05MjksMjEgKzk0NCwyMCBAQAogICogY29yZSBpZiBpdCdzIGNoaWxkIGlzIGVuYWJsZWQuCiAgKi8KIHN0YXRpYyBpbnQgc2V0X3N1cHBseShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqc3VwcGx5X3JkZXYpCisJCSAgICAgIHN0cnVjdCByZWd1bGF0b3JfZGV2ICpzdXBwbHlfcmRldikKIHsKIAlpbnQgZXJyOwogCi0JZXJyID0gc3lzZnNfY3JlYXRlX2xpbmsoJnJkZXYtPmRldi5rb2JqLCAmc3VwcGx5X3JkZXYtPmRldi5rb2JqLAotCQkJCSJzdXBwbHkiKTsKLQlpZiAoZXJyKSB7Ci0JCXJkZXZfZXJyKHJkZXYsICJjb3VsZCBub3QgYWRkIGRldmljZSBsaW5rICVzIGVyciAlZFxuIiwKLQkJCSBzdXBwbHlfcmRldi0+ZGV2LmtvYmoubmFtZSwgZXJyKTsKLQkJICAgICAgIGdvdG8gb3V0OworCXJkZXZfaW5mbyhyZGV2LCAic3VwcGxpZWQgYnkgJXNcbiIsIHJkZXZfZ2V0X25hbWUoc3VwcGx5X3JkZXYpKTsKKworCXJkZXYtPnN1cHBseSA9IGNyZWF0ZV9yZWd1bGF0b3Ioc3VwcGx5X3JkZXYsICZyZGV2LT5kZXYsICJTVVBQTFkiKTsKKwlpZiAoSVNfRVJSKHJkZXYtPnN1cHBseSkpIHsKKwkJZXJyID0gUFRSX0VSUihyZGV2LT5zdXBwbHkpOworCQlyZGV2LT5zdXBwbHkgPSBOVUxMOworCQlyZXR1cm4gZXJyOwogCX0KLQlyZGV2LT5zdXBwbHkgPSBzdXBwbHlfcmRldjsKLQlsaXN0X2FkZCgmcmRldi0+c2xpc3QsICZzdXBwbHlfcmRldi0+c3VwcGx5X2xpc3QpOwotb3V0OgotCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xMDMyLDcgKzEwNDYsNyBAQAogCX0KIH0KIAotI2RlZmluZSBSRUdfU1RSX1NJWkUJMzIKKyNkZWZpbmUgUkVHX1NUUl9TSVpFCTY0CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yICpjcmVhdGVfcmVndWxhdG9yKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAogCQkJCQkgIHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTEwNTIsOCArMTA2Niw5IEBACiAKIAlpZiAoZGV2KSB7CiAJCS8qIGNyZWF0ZSBhICdyZXF1ZXN0ZWRfbWljcm9hbXBzX25hbWUnIHN5c2ZzIGVudHJ5ICovCi0JCXNpemUgPSBzY25wcmludGYoYnVmLCBSRUdfU1RSX1NJWkUsICJtaWNyb2FtcHNfcmVxdWVzdGVkXyVzIiwKLQkJCXN1cHBseV9uYW1lKTsKKwkJc2l6ZSA9IHNjbnByaW50ZihidWYsIFJFR19TVFJfU0laRSwKKwkJCQkgIm1pY3JvYW1wc19yZXF1ZXN0ZWRfJXMtJXMiLAorCQkJCSBkZXZfbmFtZShkZXYpLCBzdXBwbHlfbmFtZSk7CiAJCWlmIChzaXplID49IFJFR19TVFJfU0laRSkKIAkJCWdvdG8gb3ZlcmZsb3dfZXJyOwogCkBAIC0xMDg4LDcgKzExMDMsMjggQEAKIAkJCQkgIGRldi0+a29iai5uYW1lLCBlcnIpOwogCQkJZ290byBsaW5rX25hbWVfZXJyOwogCQl9CisJfSBlbHNlIHsKKwkJcmVndWxhdG9yLT5zdXBwbHlfbmFtZSA9IGtzdHJkdXAoc3VwcGx5X25hbWUsIEdGUF9LRVJORUwpOworCQlpZiAocmVndWxhdG9yLT5zdXBwbHlfbmFtZSA9PSBOVUxMKQorCQkJZ290byBhdHRyX2VycjsKIAl9CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwlyZWd1bGF0b3ItPmRlYnVnZnMgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIocmVndWxhdG9yLT5zdXBwbHlfbmFtZSwKKwkJCQkJCXJkZXYtPmRlYnVnZnMpOworCWlmIChJU19FUlJfT1JfTlVMTChyZWd1bGF0b3ItPmRlYnVnZnMpKSB7CisJCXJkZXZfd2FybihyZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGRpcmVjdG9yeVxuIik7CisJCXJlZ3VsYXRvci0+ZGVidWdmcyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJZGVidWdmc19jcmVhdGVfdTMyKCJ1QV9sb2FkIiwgMDQ0NCwgcmVndWxhdG9yLT5kZWJ1Z2ZzLAorCQkJCSAgICZyZWd1bGF0b3ItPnVBX2xvYWQpOworCQlkZWJ1Z2ZzX2NyZWF0ZV91MzIoIm1pbl91ViIsIDA0NDQsIHJlZ3VsYXRvci0+ZGVidWdmcywKKwkJCQkgICAmcmVndWxhdG9yLT5taW5fdVYpOworCQlkZWJ1Z2ZzX2NyZWF0ZV91MzIoIm1heF91ViIsIDA0NDQsIHJlZ3VsYXRvci0+ZGVidWdmcywKKwkJCQkgICAmcmVndWxhdG9yLT5tYXhfdVYpOworCX0KKyNlbmRpZgorCiAJbXV0ZXhfdW5sb2NrKCZyZGV2LT5tdXRleCk7CiAJcmV0dXJuIHJlZ3VsYXRvcjsKIGxpbmtfbmFtZV9lcnI6CkBAIC0xMjY3LDEzICsxMzAzLDE3IEBACiAJbXV0ZXhfbG9jaygmcmVndWxhdG9yX2xpc3RfbXV0ZXgpOwogCXJkZXYgPSByZWd1bGF0b3ItPnJkZXY7CiAKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUocmVndWxhdG9yLT5kZWJ1Z2ZzKTsKKyNlbmRpZgorCiAJLyogcmVtb3ZlIGFueSBzeXNmcyBlbnRyaWVzICovCiAJaWYgKHJlZ3VsYXRvci0+ZGV2KSB7CiAJCXN5c2ZzX3JlbW92ZV9saW5rKCZyZGV2LT5kZXYua29iaiwgcmVndWxhdG9yLT5zdXBwbHlfbmFtZSk7Ci0JCWtmcmVlKHJlZ3VsYXRvci0+c3VwcGx5X25hbWUpOwogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUocmVndWxhdG9yLT5kZXYsICZyZWd1bGF0b3ItPmRldl9hdHRyKTsKIAkJa2ZyZWUocmVndWxhdG9yLT5kZXZfYXR0ci5hdHRyLm5hbWUpOwogCX0KKwlrZnJlZShyZWd1bGF0b3ItPnN1cHBseV9uYW1lKTsKIAlsaXN0X2RlbCgmcmVndWxhdG9yLT5saXN0KTsKIAlrZnJlZShyZWd1bGF0b3IpOwogCkBAIC0xMzAxLDE5ICsxMzQxLDYgQEAKIHsKIAlpbnQgcmV0LCBkZWxheTsKIAotCWlmIChyZGV2LT51c2VfY291bnQgPT0gMCkgewotCQkvKiBkbyB3ZSBuZWVkIHRvIGVuYWJsZSB0aGUgc3VwcGx5IHJlZ3VsYXRvciBmaXJzdCAqLwotCQlpZiAocmRldi0+c3VwcGx5KSB7Ci0JCQltdXRleF9sb2NrKCZyZGV2LT5zdXBwbHktPm11dGV4KTsKLQkJCXJldCA9IF9yZWd1bGF0b3JfZW5hYmxlKHJkZXYtPnN1cHBseSk7Ci0JCQltdXRleF91bmxvY2soJnJkZXYtPnN1cHBseS0+bXV0ZXgpOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlyZGV2X2VycihyZGV2LCAiZmFpbGVkIHRvIGVuYWJsZTogJWRcbiIsIHJldCk7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KLQkJfQotCX0KLQogCS8qIGNoZWNrIHZvbHRhZ2UgYW5kIHJlcXVlc3RlZCBsb2FkIGJlZm9yZSBlbmFibGluZyAqLwogCWlmIChyZGV2LT5jb25zdHJhaW50cyAmJgogCSAgICAocmRldi0+Y29uc3RyYWludHMtPnZhbGlkX29wc19tYXNrICYgUkVHVUxBVE9SX0NIQU5HRV9EUk1TKSkKQEAgLTEzODgsMTkgKzE0MTUsMjcgQEAKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IHJlZ3VsYXRvci0+cmRldjsKIAlpbnQgcmV0ID0gMDsKIAorCWlmIChyZGV2LT5zdXBwbHkpIHsKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShyZGV2LT5zdXBwbHkpOworCQlpZiAocmV0ICE9IDApCisJCQlyZXR1cm4gcmV0OworCX0KKwogCW11dGV4X2xvY2soJnJkZXYtPm11dGV4KTsKIAlyZXQgPSBfcmVndWxhdG9yX2VuYWJsZShyZGV2KTsKIAltdXRleF91bmxvY2soJnJkZXYtPm11dGV4KTsKKworCWlmIChyZXQgIT0gMCkKKwkJcmVndWxhdG9yX2Rpc2FibGUocmRldi0+c3VwcGx5KTsKKwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZWd1bGF0b3JfZW5hYmxlKTsKIAogLyogbG9ja3MgaGVsZCBieSByZWd1bGF0b3JfZGlzYWJsZSgpICovCi1zdGF0aWMgaW50IF9yZWd1bGF0b3JfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKLQkJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKipzdXBwbHlfcmRldl9wdHIpCitzdGF0aWMgaW50IF9yZWd1bGF0b3JfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKIAlpbnQgcmV0ID0gMDsKLQkqc3VwcGx5X3JkZXZfcHRyID0gTlVMTDsKIAogCWlmIChXQVJOKHJkZXYtPnVzZV9jb3VudCA8PSAwLAogCQkgInVuYmFsYW5jZWQgZGlzYWJsZXMgZm9yICVzXG4iLCByZGV2X2dldF9uYW1lKHJkZXYpKSkKQEAgLTE0MjcsOSArMTQ2Miw2IEBACiAJCQkJCSAgICAgTlVMTCk7CiAJCX0KIAotCQkvKiBkZWNyZWFzZSBvdXIgc3VwcGxpZXMgcmVmIGNvdW50IGFuZCBkaXNhYmxlIGlmIHJlcXVpcmVkICovCi0JCSpzdXBwbHlfcmRldl9wdHIgPSByZGV2LT5zdXBwbHk7Ci0KIAkJcmRldi0+dXNlX2NvdW50ID0gMDsKIAl9IGVsc2UgaWYgKHJkZXYtPnVzZV9jb3VudCA+IDEpIHsKIApAQCAtMTQ0MCw2ICsxNDcyLDcgQEAKIAogCQlyZGV2LT51c2VfY291bnQtLTsKIAl9CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNDU4LDI5ICsxNDkxLDIxIEBACiBpbnQgcmVndWxhdG9yX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yKQogewogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gcmVndWxhdG9yLT5yZGV2OwotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpzdXBwbHlfcmRldiA9IE5VTEw7CiAJaW50IHJldCA9IDA7CiAKIAltdXRleF9sb2NrKCZyZGV2LT5tdXRleCk7Ci0JcmV0ID0gX3JlZ3VsYXRvcl9kaXNhYmxlKHJkZXYsICZzdXBwbHlfcmRldik7CisJcmV0ID0gX3JlZ3VsYXRvcl9kaXNhYmxlKHJkZXYpOwogCW11dGV4X3VubG9jaygmcmRldi0+bXV0ZXgpOwogCi0JLyogZGVjcmVhc2Ugb3VyIHN1cHBsaWVzIHJlZiBjb3VudCBhbmQgZGlzYWJsZSBpZiByZXF1aXJlZCAqLwotCXdoaWxlIChzdXBwbHlfcmRldiAhPSBOVUxMKSB7Ci0JCXJkZXYgPSBzdXBwbHlfcmRldjsKLQotCQltdXRleF9sb2NrKCZyZGV2LT5tdXRleCk7Ci0JCV9yZWd1bGF0b3JfZGlzYWJsZShyZGV2LCAmc3VwcGx5X3JkZXYpOwotCQltdXRleF91bmxvY2soJnJkZXYtPm11dGV4KTsKLQl9CisJaWYgKHJldCA9PSAwICYmIHJkZXYtPnN1cHBseSkKKwkJcmVndWxhdG9yX2Rpc2FibGUocmRldi0+c3VwcGx5KTsKIAogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZWd1bGF0b3JfZGlzYWJsZSk7CiAKIC8qIGxvY2tzIGhlbGQgYnkgcmVndWxhdG9yX2ZvcmNlX2Rpc2FibGUoKSAqLwotc3RhdGljIGludCBfcmVndWxhdG9yX2ZvcmNlX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCi0JCXN0cnVjdCByZWd1bGF0b3JfZGV2ICoqc3VwcGx5X3JkZXZfcHRyKQorc3RhdGljIGludCBfcmVndWxhdG9yX2ZvcmNlX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCiB7CiAJaW50IHJldCA9IDA7CiAKQEAgLTE0OTcsMTAgKzE1MjIsNiBAQAogCQkJUkVHVUxBVE9SX0VWRU5UX0RJU0FCTEUsIE5VTEwpOwogCX0KIAotCS8qIGRlY3JlYXNlIG91ciBzdXBwbGllcyByZWYgY291bnQgYW5kIGRpc2FibGUgaWYgcmVxdWlyZWQgKi8KLQkqc3VwcGx5X3JkZXZfcHRyID0gcmRldi0+c3VwcGx5OwotCi0JcmRldi0+dXNlX2NvdW50ID0gMDsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNTE2LDE2ICsxNTM3LDE2IEBACiBpbnQgcmVndWxhdG9yX2ZvcmNlX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yKQogewogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gcmVndWxhdG9yLT5yZGV2OwotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpzdXBwbHlfcmRldiA9IE5VTEw7CiAJaW50IHJldDsKIAogCW11dGV4X2xvY2soJnJkZXYtPm11dGV4KTsKIAlyZWd1bGF0b3ItPnVBX2xvYWQgPSAwOwotCXJldCA9IF9yZWd1bGF0b3JfZm9yY2VfZGlzYWJsZShyZGV2LCAmc3VwcGx5X3JkZXYpOworCXJldCA9IF9yZWd1bGF0b3JfZm9yY2VfZGlzYWJsZShyZWd1bGF0b3ItPnJkZXYpOwogCW11dGV4X3VubG9jaygmcmRldi0+bXV0ZXgpOwogCi0JaWYgKHN1cHBseV9yZGV2KQotCQlyZWd1bGF0b3JfZGlzYWJsZShnZXRfZGV2aWNlX3JlZ3VsYXRvcihyZGV2X2dldF9kZXYoc3VwcGx5X3JkZXYpKSk7CisJaWYgKHJkZXYtPnN1cHBseSkKKwkJd2hpbGUgKHJkZXYtPm9wZW5fY291bnQtLSkKKwkJCXJlZ3VsYXRvcl9kaXNhYmxlKHJkZXYtPnN1cHBseSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjEzNiw3ICsyMTU3LDcgQEAKIAkvKiBnZXQgaW5wdXQgdm9sdGFnZSAqLwogCWlucHV0X3VWID0gMDsKIAlpZiAocmRldi0+c3VwcGx5KQotCQlpbnB1dF91ViA9IF9yZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UocmRldi0+c3VwcGx5KTsKKwkJaW5wdXRfdVYgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UocmRldi0+c3VwcGx5KTsKIAlpZiAoaW5wdXRfdVYgPD0gMCkKIAkJaW5wdXRfdVYgPSByZGV2LT5jb25zdHJhaW50cy0+aW5wdXRfdVY7CiAJaWYgKGlucHV0X3VWIDw9IDApIHsKQEAgLTIyMDYsMTcgKzIyMjcsOCBAQAogc3RhdGljIHZvaWQgX25vdGlmaWVyX2NhbGxfY2hhaW4oc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCiAJCQkJICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpkYXRhKQogewotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpfcmRldjsKLQogCS8qIGNhbGwgcmRldiBjaGFpbiBmaXJzdCAqLwogCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnJkZXYtPm5vdGlmaWVyLCBldmVudCwgTlVMTCk7Ci0KLQkvKiBub3cgbm90aWZ5IHJlZ3VsYXRvciB3ZSBzdXBwbHkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KF9yZGV2LCAmcmRldi0+c3VwcGx5X2xpc3QsIHNsaXN0KSB7Ci0JCW11dGV4X2xvY2soJl9yZGV2LT5tdXRleCk7Ci0JCV9ub3RpZmllcl9jYWxsX2NoYWluKF9yZGV2LCBldmVudCwgZGF0YSk7Ci0JCW11dGV4X3VubG9jaygmX3JkZXYtPm11dGV4KTsKLQl9CiB9CiAKIC8qKgpAQCAtMjI2NCw2ICsyMjc2LDEzIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZWd1bGF0b3JfYnVsa19nZXQpOwogCitzdGF0aWMgdm9pZCByZWd1bGF0b3JfYnVsa19lbmFibGVfYXN5bmModm9pZCAqZGF0YSwgYXN5bmNfY29va2llX3QgY29va2llKQoreworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhICpidWxrID0gZGF0YTsKKworCWJ1bGstPnJldCA9IHJlZ3VsYXRvcl9lbmFibGUoYnVsay0+Y29uc3VtZXIpOworfQorCiAvKioKICAqIHJlZ3VsYXRvcl9idWxrX2VuYWJsZSAtIGVuYWJsZSBtdWx0aXBsZSByZWd1bGF0b3IgY29uc3VtZXJzCiAgKgpAQCAtMjI3OSwyMSArMjI5OCwzMyBAQAogaW50IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShpbnQgbnVtX2NvbnN1bWVycywKIAkJCSAgc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgKmNvbnN1bWVycykKIHsKKwlMSVNUX0hFQUQoYXN5bmNfZG9tYWluKTsKIAlpbnQgaTsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCisJZm9yIChpID0gMDsgaSA8IG51bV9jb25zdW1lcnM7IGkrKykKKwkJYXN5bmNfc2NoZWR1bGVfZG9tYWluKHJlZ3VsYXRvcl9idWxrX2VuYWJsZV9hc3luYywKKwkJCQkgICAgICAmY29uc3VtZXJzW2ldLCAmYXN5bmNfZG9tYWluKTsKKworCWFzeW5jX3N5bmNocm9uaXplX2Z1bGxfZG9tYWluKCZhc3luY19kb21haW4pOworCisJLyogSWYgYW55IGNvbnN1bWVyIGZhaWxlZCB3ZSBuZWVkIHRvIHVud2luZCBhbnkgdGhhdCBzdWNjZWVkZWQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbnN1bWVyczsgaSsrKSB7Ci0JCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoY29uc3VtZXJzW2ldLmNvbnN1bWVyKTsKLQkJaWYgKHJldCAhPSAwKQorCQlpZiAoY29uc3VtZXJzW2ldLnJldCAhPSAwKSB7CisJCQlyZXQgPSBjb25zdW1lcnNbaV0ucmV0OwogCQkJZ290byBlcnI7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIAogZXJyOgotCXByX2VycigiRmFpbGVkIHRvIGVuYWJsZSAlczogJWRcbiIsIGNvbnN1bWVyc1tpXS5zdXBwbHksIHJldCk7Ci0JZm9yICgtLWk7IGkgPj0gMDsgLS1pKQotCQlyZWd1bGF0b3JfZGlzYWJsZShjb25zdW1lcnNbaV0uY29uc3VtZXIpOworCWZvciAoaSA9IDA7IGkgPCBudW1fY29uc3VtZXJzOyBpKyspCisJCWlmIChjb25zdW1lcnNbaV0ucmV0ID09IDApCisJCQlyZWd1bGF0b3JfZGlzYWJsZShjb25zdW1lcnNbaV0uY29uc3VtZXIpOworCQllbHNlCisJCQlwcl9lcnIoIkZhaWxlZCB0byBlbmFibGUgJXM6ICVkXG4iLAorCQkJICAgICAgIGNvbnN1bWVyc1tpXS5zdXBwbHksIGNvbnN1bWVyc1tpXS5yZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI1ODksOSArMjYyMCw3IEBACiAJcmRldi0+b3duZXIgPSByZWd1bGF0b3JfZGVzYy0+b3duZXI7CiAJcmRldi0+ZGVzYyA9IHJlZ3VsYXRvcl9kZXNjOwogCUlOSVRfTElTVF9IRUFEKCZyZGV2LT5jb25zdW1lcl9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmcmRldi0+c3VwcGx5X2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZyZGV2LT5saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmcmRldi0+c2xpc3QpOwogCUJMT0NLSU5HX0lOSVRfTk9USUZJRVJfSEVBRCgmcmRldi0+bm90aWZpZXIpOwogCiAJLyogcHJlZm9ybSBhbnkgcmVndWxhdG9yIHNwZWNpZmljIGluaXQgKi8KQEAgLTI2NzIsNiArMjcwMSw3IEBACiAJdW5zZXRfcmVndWxhdG9yX3N1cHBsaWVzKHJkZXYpOwogCiBzY3J1YjoKKwlrZnJlZShyZGV2LT5jb25zdHJhaW50cyk7CiAJZGV2aWNlX3VucmVnaXN0ZXIoJnJkZXYtPmRldik7CiAJLyogZGV2aWNlIGNvcmUgZnJlZXMgcmRldiAqLwogCXJkZXYgPSBFUlJfUFRSKHJldCk7CkBAIC0yNzAzLDcgKzI3MzMsNyBAQAogCXVuc2V0X3JlZ3VsYXRvcl9zdXBwbGllcyhyZGV2KTsKIAlsaXN0X2RlbCgmcmRldi0+bGlzdCk7CiAJaWYgKHJkZXYtPnN1cHBseSkKLQkJc3lzZnNfcmVtb3ZlX2xpbmsoJnJkZXYtPmRldi5rb2JqLCAic3VwcGx5Iik7CisJCXJlZ3VsYXRvcl9wdXQocmRldi0+c3VwcGx5KTsKIAlkZXZpY2VfdW5yZWdpc3RlcigmcmRldi0+ZGV2KTsKIAlrZnJlZShyZGV2LT5jb25zdHJhaW50cyk7CiAJbXV0ZXhfdW5sb2NrKCZyZWd1bGF0b3JfbGlzdF9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9kdW1teS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvZHVtbXkuYwppbmRleCBjNzQxMGJkLi5mNmVmNjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9kdW1teS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2R1bW15LmMKQEAgLTM2LDYgKzM2LDI5IEBACiAJLm9wcyA9ICZkdW1teV9vcHMsCiB9OwogCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkdW1teV9yZWd1bGF0b3JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0OworCisJZHVtbXlfcmVndWxhdG9yX3JkZXYgPSByZWd1bGF0b3JfcmVnaXN0ZXIoJmR1bW15X2Rlc2MsIE5VTEwsCisJCQkJCQkgICZkdW1teV9pbml0ZGF0YSwgTlVMTCk7CisJaWYgKElTX0VSUihkdW1teV9yZWd1bGF0b3JfcmRldikpIHsKKwkJcmV0ID0gUFRSX0VSUihkdW1teV9yZWd1bGF0b3JfcmRldik7CisJCXByX2VycigiRmFpbGVkIHRvIHJlZ2lzdGVyIHJlZ3VsYXRvcjogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGR1bW15X3JlZ3VsYXRvcl9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGR1bW15X3JlZ3VsYXRvcl9wcm9iZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJCT0gInJlZy1kdW1teSIsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmR1bW15X3BkZXY7CiAKIHZvaWQgX19pbml0IHJlZ3VsYXRvcl9kdW1teV9pbml0KHZvaWQpCkBAIC01NSwxMiArNzgsOSBAQAogCQlyZXR1cm47CiAJfQogCi0JZHVtbXlfcmVndWxhdG9yX3JkZXYgPSByZWd1bGF0b3JfcmVnaXN0ZXIoJmR1bW15X2Rlc2MsIE5VTEwsCi0JCQkJCQkgICZkdW1teV9pbml0ZGF0YSwgTlVMTCk7Ci0JaWYgKElTX0VSUihkdW1teV9yZWd1bGF0b3JfcmRldikpIHsKLQkJcmV0ID0gUFRSX0VSUihkdW1teV9yZWd1bGF0b3JfcmRldik7Ci0JCXByX2VycigiRmFpbGVkIHRvIHJlZ2lzdGVyIHJlZ3VsYXRvcjogJWRcbiIsIHJldCk7CisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZkdW1teV9yZWd1bGF0b3JfZHJpdmVyKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gcmVnaXN0ZXIgZHVtbXkgcmVndWxhdG9yIGRyaXZlcjogJWRcbiIsIHJldCk7CiAJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGR1bW15X3BkZXYpOwotCQlyZXR1cm47CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjU5MTAtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMC1yZWd1bGF0b3IuYwppbmRleCA1NWRkNGU2Li42NmQyZDYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMC1yZWd1bGF0b3IuYwpAQCAtNDksNyArNDksNiBAQAogI2RlZmluZSBUUFM2NTkxMV9SRUdfTERPNwkJMTEKICNkZWZpbmUgVFBTNjU5MTFfUkVHX0xETzgJCTEyCiAKLSNkZWZpbmUgVFBTNjU5MTBfTlVNX1JFR1VMQVRPUgkJMTMKICNkZWZpbmUgVFBTNjU5MTBfU1VQUExZX1NUQVRFX0VOQUJMRUQJMHgxCiAKIC8qIHN1cHBvcnRlZCBWSU8gdm9sdGFnZXMgaW4gbWlsaXZvbHRzICovCkBAIC0yNjQsMTEgKzI2MywxMiBAQAogfTsKIAogc3RydWN0IHRwczY1OTEwX3JlZyB7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXNjIGRlc2NbVFBTNjU5MTBfTlVNX1JFR1VMQVRPUl07CisJc3RydWN0IHJlZ3VsYXRvcl9kZXNjICpkZXNjOwogCXN0cnVjdCB0cHM2NTkxMCAqbWZkOwotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2W1RQUzY1OTEwX05VTV9SRUdVTEFUT1JdOwotCXN0cnVjdCB0cHNfaW5mbyAqaW5mb1tUUFM2NTkxMF9OVU1fUkVHVUxBVE9SXTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKnJkZXY7CisJc3RydWN0IHRwc19pbmZvICoqaW5mbzsKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJaW50IG51bV9yZWd1bGF0b3JzOwogCWludCBtb2RlOwogCWludCAgKCpnZXRfY3RybF9yZWcpKGludCk7CiB9OwpAQCAtNzU5LDggKzc1OSwxMyBAQAogCQltdWx0ID0gKHNlbGVjdG9yIC8gVkREMV8yX05VTV9WT0xUUykgKyAxOwogCQl2b2x0ID0gVkREMV8yX01JTl9WT0xUICsKIAkJCQkoc2VsZWN0b3IgJSBWREQxXzJfTlVNX1ZPTFRTKSAqIFZERDFfMl9PRkZTRVQ7CisJCWJyZWFrOwogCWNhc2UgVFBTNjU5MTFfUkVHX1ZERENUUkw6CiAJCXZvbHQgPSBWRERDVFJMX01JTl9WT0xUICsgKHNlbGVjdG9yICogVkREQ1RSTF9PRkZTRVQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJcmV0dXJuICB2b2x0ICogMTAwICogbXVsdDsKQEAgLTg5NywxNiArOTAyLDQyIEBACiAJc3dpdGNoKHRwczY1OTEwX2NoaXBfaWQodHBzNjU5MTApKSB7CiAJY2FzZSBUUFM2NTkxMDoKIAkJcG1pYy0+Z2V0X2N0cmxfcmVnID0gJnRwczY1OTEwX2dldF9jdHJsX3JlZ2lzdGVyOworCQlwbWljLT5udW1fcmVndWxhdG9ycyA9IEFSUkFZX1NJWkUodHBzNjU5MTBfcmVncyk7CiAJCWluZm8gPSB0cHM2NTkxMF9yZWdzOworCQlicmVhazsKIAljYXNlIFRQUzY1OTExOgogCQlwbWljLT5nZXRfY3RybF9yZWcgPSAmdHBzNjU5MTFfZ2V0X2N0cmxfcmVnaXN0ZXI7CisJCXBtaWMtPm51bV9yZWd1bGF0b3JzID0gQVJSQVlfU0laRSh0cHM2NTkxMV9yZWdzKTsKIAkJaW5mbyA9IHRwczY1OTExX3JlZ3M7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByX2VycigiSW52YWxpZCB0cHMgY2hpcCB2ZXJzaW9uXG4iKTsKKwkJa2ZyZWUocG1pYyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBUUFM2NTkxMF9OVU1fUkVHVUxBVE9SOyBpKyssIGluZm8rKywgcmVnX2RhdGErKykgeworCXBtaWMtPmRlc2MgPSBrY2FsbG9jKHBtaWMtPm51bV9yZWd1bGF0b3JzLAorCQkJc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3JfZGVzYyksIEdGUF9LRVJORUwpOworCWlmICghcG1pYy0+ZGVzYykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX3BtaWM7CisJfQorCisJcG1pYy0+aW5mbyA9IGtjYWxsb2MocG1pYy0+bnVtX3JlZ3VsYXRvcnMsCisJCQlzaXplb2Yoc3RydWN0IHRwc19pbmZvICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBtaWMtPmluZm8pIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9kZXNjOworCX0KKworCXBtaWMtPnJkZXYgPSBrY2FsbG9jKHBtaWMtPm51bV9yZWd1bGF0b3JzLAorCQkJc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3JfZGV2ICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBtaWMtPnJkZXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9pbmZvOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwbWljLT5udW1fcmVndWxhdG9yczsgaSsrLCBpbmZvKyssIHJlZ19kYXRhKyspIHsKIAkJLyogUmVnaXN0ZXIgdGhlIHJlZ3VsYXRvcnMgKi8KIAkJcG1pYy0+aW5mb1tpXSA9IGluZm87CiAKQEAgLTkzOCw3ICs5NjksNyBAQAogCQkJCSJmYWlsZWQgdG8gcmVnaXN0ZXIgJXMgcmVndWxhdG9yXG4iLAogCQkJCXBkZXYtPm5hbWUpOwogCQkJZXJyID0gUFRSX0VSUihyZGV2KTsKLQkJCWdvdG8gZXJyOworCQkJZ290byBlcnJfdW5yZWdpc3Rlcl9yZWd1bGF0b3I7CiAJCX0KIAogCQkvKiBTYXZlIHJlZ3VsYXRvciBmb3IgY2xlYW51cCAqLwpAQCAtOTQ2LDIzICs5NzcsMzEgQEAKIAl9CiAJcmV0dXJuIDA7CiAKLWVycjoKK2Vycl91bnJlZ2lzdGVyX3JlZ3VsYXRvcjoKIAl3aGlsZSAoLS1pID49IDApCiAJCXJlZ3VsYXRvcl91bnJlZ2lzdGVyKHBtaWMtPnJkZXZbaV0pOwotCisJa2ZyZWUocG1pYy0+cmRldik7CitlcnJfZnJlZV9pbmZvOgorCWtmcmVlKHBtaWMtPmluZm8pOworZXJyX2ZyZWVfZGVzYzoKKwlrZnJlZShwbWljLT5kZXNjKTsKK2Vycl9mcmVlX3BtaWM6CiAJa2ZyZWUocG1pYyk7CiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBfX2RldmV4aXQgdHBzNjU5MTBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHRwczY1OTEwX3JlZyAqdHBzNjU5MTBfcmVnID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHRwczY1OTEwX3JlZyAqcG1pYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFRQUzY1OTEwX05VTV9SRUdVTEFUT1I7IGkrKykKLQkJcmVndWxhdG9yX3VucmVnaXN0ZXIodHBzNjU5MTBfcmVnLT5yZGV2W2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgcG1pYy0+bnVtX3JlZ3VsYXRvcnM7IGkrKykKKwkJcmVndWxhdG9yX3VucmVnaXN0ZXIocG1pYy0+cmRldltpXSk7CiAKLQlrZnJlZSh0cHM2NTkxMF9yZWcpOworCWtmcmVlKHBtaWMtPnJkZXYpOworCWtmcmVlKHBtaWMtPmluZm8pOworCWtmcmVlKHBtaWMtPmRlc2MpOworCWtmcmVlKHBtaWMpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMi1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEyLXJlZ3VsYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOTMxM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMi1yZWd1bGF0b3IuYwpAQCAtMCwwICsxLDgwMCBAQAorLyoKKyAqIHRwczY1OTEyLmMgIC0tICBUSSB0cHM2NTkxMgorICoKKyAqIENvcHlyaWdodCAyMDExIFRleGFzIEluc3RydW1lbnRzIEluYy4KKyAqCisgKiBBdXRob3I6IE1hcmdhcml0YSBPbGF5YSBDYWJyZXJhIDxtYWdpQHNsaW1sb2dpYy5jby51az4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiB3bTgzNTAgaW1wbGVtZW50YXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3RwczY1OTEyLmg+CisKKy8qIERDREMncyAqLworI2RlZmluZSBUUFM2NTkxMl9SRUdfRENEQzEJMAorI2RlZmluZSBUUFM2NTkxMl9SRUdfRENEQzIJMQorI2RlZmluZSBUUFM2NTkxMl9SRUdfRENEQzMJMgorI2RlZmluZSBUUFM2NTkxMl9SRUdfRENEQzQJMworCisvKiBMRE9zICovCisjZGVmaW5lIFRQUzY1OTEyX1JFR19MRE8xCTQKKyNkZWZpbmUgVFBTNjU5MTJfUkVHX0xETzIJNQorI2RlZmluZSBUUFM2NTkxMl9SRUdfTERPMwk2CisjZGVmaW5lIFRQUzY1OTEyX1JFR19MRE80CTcKKyNkZWZpbmUgVFBTNjU5MTJfUkVHX0xETzUJOAorI2RlZmluZSBUUFM2NTkxMl9SRUdfTERPNgk5CisjZGVmaW5lIFRQUzY1OTEyX1JFR19MRE83CTEwCisjZGVmaW5lIFRQUzY1OTEyX1JFR19MRE84CTExCisjZGVmaW5lIFRQUzY1OTEyX1JFR19MRE85CTEyCisjZGVmaW5lIFRQUzY1OTEyX1JFR19MRE8xMAkxMworCisjZGVmaW5lIFRQUzY1OTEyX01BWF9SRUdfSUQJVFBTNjU5MTJfUkVHX0xET18xMAorCisvKiBOdW1iZXIgb2Ygc3RlcC1kb3duIGNvbnZlcnRlcnMgYXZhaWxhYmxlICovCisjZGVmaW5lIFRQUzY1OTEyX05VTV9EQ0RDCTQKKworLyogTnVtYmVyIG9mIExETyB2b2x0YWdlIHJlZ3VsYXRvcnMgIGF2YWlsYWJsZSAqLworI2RlZmluZSBUUFM2NTkxMl9OVU1fTERPCTEwCisKKy8qIE51bWJlciBvZiB0b3RhbCByZWd1bGF0b3JzIGF2YWlsYWJsZSAqLworI2RlZmluZSBUUFM2NTkxMl9OVU1fUkVHVUxBVE9SCQkoVFBTNjU5MTJfTlVNX0RDREMgKyBUUFM2NTkxMl9OVU1fTERPKQorCisjZGVmaW5lIFRQUzY1OTEyX1JFR19FTkFCTEVECTB4ODAKKyNkZWZpbmUgT1BfU0VMUkVHX01BU0sJCTB4NDAKKyNkZWZpbmUgT1BfU0VMUkVHX1NISUZUCQk2CisKK3N0cnVjdCB0cHNfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHBzX2luZm8gdHBzNjU5MTJfcmVnc1tdID0geworCXsKKwkJLm5hbWUgPSAiRENEQzEiLAorCX0sCisJeworCQkubmFtZSA9ICJEQ0RDMiIsCisJfSwKKwl7CisJCS5uYW1lID0gIkRDREMzIiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiRENEQzQiLAorCX0sCisJeworCQkubmFtZSA9ICJMRE8xIiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTERPMiIsCisJfSwKKwl7CisJCS5uYW1lID0gIkxETzMiLAorCX0sCisJeworCQkubmFtZSA9ICJMRE80IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTERPNSIsCisJfSwKKwl7CisJCS5uYW1lID0gIkxETzYiLAorCX0sCisJeworCQkubmFtZSA9ICJMRE83IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTERPOCIsCisJfSwKKwl7CisJCS5uYW1lID0gIkxETzkiLAorCX0sCisJeworCQkubmFtZSA9ICJMRE8xMCIsCisJfSwKK307CisKK3N0cnVjdCB0cHM2NTkxMl9yZWcgeworCXN0cnVjdCByZWd1bGF0b3JfZGVzYyBkZXNjW1RQUzY1OTEyX05VTV9SRUdVTEFUT1JdOworCXN0cnVjdCB0cHM2NTkxMiAqbWZkOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2W1RQUzY1OTEyX05VTV9SRUdVTEFUT1JdOworCXN0cnVjdCB0cHNfaW5mbyAqaW5mb1tUUFM2NTkxMl9OVU1fUkVHVUxBVE9SXTsKKwkvKiBmb3IgcmVhZC93cml0ZSBhY2Nlc3MgKi8KKwlzdHJ1Y3QgbXV0ZXggaW9fbG9jazsKKwlpbnQgbW9kZTsKKwlpbnQgKCpnZXRfY3RybF9yZWcpKGludCk7CisJaW50IGRjZGMxX3JhbmdlOworCWludCBkY2RjMl9yYW5nZTsKKwlpbnQgZGNkYzNfcmFuZ2U7CisJaW50IGRjZGM0X3JhbmdlOworCWludCBwd21fbW9kZV9yZWc7CisJaW50IGVjb19yZWc7Cit9OworCitzdGF0aWMgaW50IHRwczY1OTEyX2dldF9yYW5nZShzdHJ1Y3QgdHBzNjU5MTJfcmVnICpwbWljLCBpbnQgaWQpCit7CisJc3RydWN0IHRwczY1OTEyICptZmQgPSBwbWljLT5tZmQ7CisKKwlpZiAoaWQgPiBUUFM2NTkxMl9SRUdfRENEQzQpCisJCXJldHVybiAwOworCisJc3dpdGNoIChpZCkgeworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREMxOgorCQlwbWljLT5kY2RjMV9yYW5nZSA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwKKwkJCQkJCQlUUFM2NTkxMl9EQ0RDMV9MSU1JVCk7CisJCWlmIChwbWljLT5kY2RjMV9yYW5nZSA8IDApCisJCQlyZXR1cm4gcG1pYy0+ZGNkYzFfcmFuZ2U7CisJCXBtaWMtPmRjZGMxX3JhbmdlID0gKHBtaWMtPmRjZGMxX3JhbmdlICYKKwkJCURDRENfTElNSVRfUkFOR0VfTUFTSykgPj4gRENEQ19MSU1JVF9SQU5HRV9TSElGVDsKKwkJcmV0dXJuIHBtaWMtPmRjZGMxX3JhbmdlOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREMyOgorCQlwbWljLT5kY2RjMl9yYW5nZSA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwKKwkJCQkJCQlUUFM2NTkxMl9EQ0RDMl9MSU1JVCk7CisJCWlmIChwbWljLT5kY2RjMl9yYW5nZSA8IDApCisJCQlyZXR1cm4gcG1pYy0+ZGNkYzJfcmFuZ2U7CisJCXBtaWMtPmRjZGMyX3JhbmdlID0gKHBtaWMtPmRjZGMyX3JhbmdlICYKKwkJCURDRENfTElNSVRfUkFOR0VfTUFTSykgPj4gRENEQ19MSU1JVF9SQU5HRV9TSElGVDsKKwkJcmV0dXJuIHBtaWMtPmRjZGMyX3JhbmdlOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREMzOgorCQlwbWljLT5kY2RjM19yYW5nZSA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwKKwkJCQkJCQlUUFM2NTkxMl9EQ0RDM19MSU1JVCk7CisJCWlmIChwbWljLT5kY2RjM19yYW5nZSA8IDApCisJCQlyZXR1cm4gcG1pYy0+ZGNkYzNfcmFuZ2U7CisJCXBtaWMtPmRjZGMzX3JhbmdlID0gKHBtaWMtPmRjZGMzX3JhbmdlICYKKwkJCURDRENfTElNSVRfUkFOR0VfTUFTSykgPj4gRENEQ19MSU1JVF9SQU5HRV9TSElGVDsKKwkJcmV0dXJuIHBtaWMtPmRjZGMzX3JhbmdlOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREM0OgorCQlwbWljLT5kY2RjNF9yYW5nZSA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwKKwkJCQkJCQlUUFM2NTkxMl9EQ0RDNF9MSU1JVCk7CisJCWlmIChwbWljLT5kY2RjNF9yYW5nZSA8IDApCisJCQlyZXR1cm4gcG1pYy0+ZGNkYzRfcmFuZ2U7CisJCXBtaWMtPmRjZGM0X3JhbmdlID0gKHBtaWMtPmRjZGM0X3JhbmdlICYKKwkJCURDRENfTElNSVRfUkFOR0VfTUFTSykgPj4gRENEQ19MSU1JVF9SQU5HRV9TSElGVDsKKwkJcmV0dXJuIHBtaWMtPmRjZGM0X3JhbmdlOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdHBzNjU5MTJfdnNlbF90b191dl9yYW5nZTAodTggdnNlbCkKK3sKKwl1bnNpZ25lZCBsb25nIHV2OworCisJdXYgPSAoKHZzZWwgKiAxMjUwMCkgKyA1MDAwMDApOworCXJldHVybiB1djsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdHBzNjU5MTJfdnNlbF90b191dl9yYW5nZTEodTggdnNlbCkKK3sKKwl1bnNpZ25lZCBsb25nIHV2OworCisJIHV2ID0gKCh2c2VsICogMTI1MDApICsgNzAwMDAwKTsKKwlyZXR1cm4gdXY7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRwczY1OTEyX3ZzZWxfdG9fdXZfcmFuZ2UyKHU4IHZzZWwpCit7CisJdW5zaWduZWQgbG9uZyB1djsKKworCXV2ID0gKCh2c2VsICogMjUwMDApICsgNTAwMDAwKTsKKwlyZXR1cm4gdXY7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRwczY1OTEyX3ZzZWxfdG9fdXZfcmFuZ2UzKHU4IHZzZWwpCit7CisJdW5zaWduZWQgbG9uZyB1djsKKworCWlmICh2c2VsID09IDB4M2YpCisJCXV2ID0gMzgwMDAwMDsKKwllbHNlCisJCXV2ID0gKCh2c2VsICogNTAwMDApICsgNTAwMDAwKTsKKworCXJldHVybiB1djsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdHBzNjU5MTJfdnNlbF90b191dl9sZG8odTggdnNlbCkKK3sKKwl1bnNpZ25lZCBsb25nIHV2ID0gMDsKKworCWlmICh2c2VsIDw9IDMyKQorCQl1diA9ICgodnNlbCAqIDI1MDAwKSArIDgwMDAwMCk7CisJZWxzZSBpZiAodnNlbCA+IDMyICYmIHZzZWwgPD0gNjApCisJCXV2ID0gKCgodnNlbCAtIDMyKSAqIDUwMDAwKSArIDE2MDAwMDApOworCWVsc2UgaWYgKHZzZWwgPiA2MCkKKwkJdXYgPSAoKCh2c2VsIC0gNjApICogMTAwMDAwKSArIDMwMDAwMDApOworCisJcmV0dXJuIHV2OworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX2dldF9jdHJsX3JlZ2lzdGVyKGludCBpZCkKK3sKKwlzd2l0Y2ggKGlkKSB7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzE6CisJCXJldHVybiBUUFM2NTkxMl9EQ0RDMV9BVlM7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzI6CisJCXJldHVybiBUUFM2NTkxMl9EQ0RDMl9BVlM7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzM6CisJCXJldHVybiBUUFM2NTkxMl9EQ0RDM19BVlM7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzQ6CisJCXJldHVybiBUUFM2NTkxMl9EQ0RDNF9BVlM7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPMToKKwkJcmV0dXJuIFRQUzY1OTEyX0xETzFfQVZTOworCWNhc2UgVFBTNjU5MTJfUkVHX0xETzI6CisJCXJldHVybiBUUFM2NTkxMl9MRE8yX0FWUzsKKwljYXNlIFRQUzY1OTEyX1JFR19MRE8zOgorCQlyZXR1cm4gVFBTNjU5MTJfTERPM19BVlM7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPNDoKKwkJcmV0dXJuIFRQUzY1OTEyX0xETzRfQVZTOworCWNhc2UgVFBTNjU5MTJfUkVHX0xETzU6CisJCXJldHVybiBUUFM2NTkxMl9MRE81OworCWNhc2UgVFBTNjU5MTJfUkVHX0xETzY6CisJCXJldHVybiBUUFM2NTkxMl9MRE82OworCWNhc2UgVFBTNjU5MTJfUkVHX0xETzc6CisJCXJldHVybiBUUFM2NTkxMl9MRE83OworCWNhc2UgVFBTNjU5MTJfUkVHX0xETzg6CisJCXJldHVybiBUUFM2NTkxMl9MRE84OworCWNhc2UgVFBTNjU5MTJfUkVHX0xETzk6CisJCXJldHVybiBUUFM2NTkxMl9MRE85OworCWNhc2UgVFBTNjU5MTJfUkVHX0xETzEwOgorCQlyZXR1cm4gVFBTNjU5MTJfTERPMTA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgaW50IHRwczY1OTEyX2dldF9kY2RjX3NlbF9yZWdpc3RlcihzdHJ1Y3QgdHBzNjU5MTJfcmVnICpwbWljLCBpbnQgaWQpCit7CisJc3RydWN0IHRwczY1OTEyICptZmQgPSBwbWljLT5tZmQ7CisJaW50IG9wdnNlbCA9IDAsIHNyID0gMDsKKwl1OCByZWcgPSAwOworCisJaWYgKGlkIDwgVFBTNjU5MTJfUkVHX0RDREMxIHx8IGlkID4gVFBTNjU5MTJfUkVHX0RDREM0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoaWQpIHsKKwljYXNlIFRQUzY1OTEyX1JFR19EQ0RDMToKKwkJb3B2c2VsID0gdHBzNjU5MTJfcmVnX3JlYWQobWZkLCBUUFM2NTkxMl9EQ0RDMV9PUCk7CisJCXNyID0gKChvcHZzZWwgJiBPUF9TRUxSRUdfTUFTSykgPj4gT1BfU0VMUkVHX1NISUZUKTsKKwkJaWYgKHNyKQorCQkJcmVnID0gVFBTNjU5MTJfRENEQzFfQVZTOworCQllbHNlCisJCQlyZWcgPSBUUFM2NTkxMl9EQ0RDMV9PUDsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzI6CisJCW9wdnNlbCA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgVFBTNjU5MTJfRENEQzJfT1ApOworCQlzciA9IChvcHZzZWwgJiBPUF9TRUxSRUdfTUFTSykgPj4gT1BfU0VMUkVHX1NISUZUOworCQlpZiAoc3IpCisJCQlyZWcgPSBUUFM2NTkxMl9EQ0RDMl9BVlM7CisJCWVsc2UKKwkJCXJlZyA9IFRQUzY1OTEyX0RDREMyX09QOworCQlicmVhazsKKwljYXNlIFRQUzY1OTEyX1JFR19EQ0RDMzoKKwkJb3B2c2VsID0gdHBzNjU5MTJfcmVnX3JlYWQobWZkLCBUUFM2NTkxMl9EQ0RDM19PUCk7CisJCXNyID0gKG9wdnNlbCAmIE9QX1NFTFJFR19NQVNLKSA+PiBPUF9TRUxSRUdfU0hJRlQ7CisJCWlmIChzcikKKwkJCXJlZyA9IFRQUzY1OTEyX0RDREMzX0FWUzsKKwkJZWxzZQorCQkJcmVnID0gVFBTNjU5MTJfRENEQzNfT1A7CisJCWJyZWFrOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREM0OgorCQlvcHZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0RDREM0X09QKTsKKwkJc3IgPSAob3B2c2VsICYgT1BfU0VMUkVHX01BU0spID4+IE9QX1NFTFJFR19TSElGVDsKKwkJaWYgKHNyKQorCQkJcmVnID0gVFBTNjU5MTJfRENEQzRfQVZTOworCQllbHNlCisJCQlyZWcgPSBUUFM2NTkxMl9EQ0RDNF9PUDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZWc7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjU5MTJfZ2V0X2xkb19zZWxfcmVnaXN0ZXIoc3RydWN0IHRwczY1OTEyX3JlZyAqcG1pYywgaW50IGlkKQoreworCXN0cnVjdCB0cHM2NTkxMiAqbWZkID0gcG1pYy0+bWZkOworCWludCBvcHZzZWwgPSAwLCBzciA9IDA7CisJdTggcmVnID0gMDsKKworCWlmIChpZCA8IFRQUzY1OTEyX1JFR19MRE8xIHx8IGlkID4gVFBTNjU5MTJfUkVHX0xETzEwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoaWQpIHsKKwljYXNlIFRQUzY1OTEyX1JFR19MRE8xOgorCQlvcHZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0xETzFfT1ApOworCQlzciA9IChvcHZzZWwgJiBPUF9TRUxSRUdfTUFTSykgPj4gT1BfU0VMUkVHX1NISUZUOworCQlpZiAoc3IpCisJCQlyZWcgPSBUUFM2NTkxMl9MRE8xX0FWUzsKKwkJZWxzZQorCQkJcmVnID0gVFBTNjU5MTJfTERPMV9PUDsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPMjoKKwkJb3B2c2VsID0gdHBzNjU5MTJfcmVnX3JlYWQobWZkLCBUUFM2NTkxMl9MRE8yX09QKTsKKwkJc3IgPSAob3B2c2VsICYgT1BfU0VMUkVHX01BU0spID4+IE9QX1NFTFJFR19TSElGVDsKKwkJaWYgKHNyKQorCQkJcmVnID0gVFBTNjU5MTJfTERPMl9BVlM7CisJCWVsc2UKKwkJCXJlZyA9IFRQUzY1OTEyX0xETzJfT1A7CisJCWJyZWFrOworCWNhc2UgVFBTNjU5MTJfUkVHX0xETzM6CisJCW9wdnNlbCA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgVFBTNjU5MTJfTERPM19PUCk7CisJCXNyID0gKG9wdnNlbCAmIE9QX1NFTFJFR19NQVNLKSA+PiBPUF9TRUxSRUdfU0hJRlQ7CisJCWlmIChzcikKKwkJCXJlZyA9IFRQUzY1OTEyX0xETzNfQVZTOworCQllbHNlCisJCQlyZWcgPSBUUFM2NTkxMl9MRE8zX09QOworCQlicmVhazsKKwljYXNlIFRQUzY1OTEyX1JFR19MRE80OgorCQlvcHZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0xETzRfT1ApOworCQlzciA9IChvcHZzZWwgJiBPUF9TRUxSRUdfTUFTSykgPj4gT1BfU0VMUkVHX1NISUZUOworCQlpZiAoc3IpCisJCQlyZWcgPSBUUFM2NTkxMl9MRE80X0FWUzsKKwkJZWxzZQorCQkJcmVnID0gVFBTNjU5MTJfTERPNF9PUDsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPNToKKwkJcmVnID0gVFBTNjU5MTJfTERPNTsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPNjoKKwkJcmVnID0gVFBTNjU5MTJfTERPNjsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPNzoKKwkJcmVnID0gVFBTNjU5MTJfTERPNzsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPODoKKwkJcmVnID0gVFBTNjU5MTJfTERPODsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPOToKKwkJcmVnID0gVFBTNjU5MTJfTERPOTsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPMTA6CisJCXJlZyA9IFRQUzY1OTEyX0xETzEwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmVnOworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX2dldF9tb2RlX3JlZ2l0ZXJzKHN0cnVjdCB0cHM2NTkxMl9yZWcgKnBtaWMsIGludCBpZCkKK3sKKwlzd2l0Y2ggKGlkKSB7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzE6CisJCXBtaWMtPnB3bV9tb2RlX3JlZyA9IFRQUzY1OTEyX0RDREMxX0NUUkw7CisJCXBtaWMtPmVjb19yZWcgPSBUUFM2NTkxMl9EQ0RDMV9BVlM7CisJCWJyZWFrOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREMyOgorCQlwbWljLT5wd21fbW9kZV9yZWcgPSBUUFM2NTkxMl9EQ0RDMl9DVFJMOworCQlwbWljLT5lY29fcmVnID0gVFBTNjU5MTJfRENEQzJfQVZTOworCQlicmVhazsKKwljYXNlIFRQUzY1OTEyX1JFR19EQ0RDMzoKKwkJcG1pYy0+cHdtX21vZGVfcmVnID0gVFBTNjU5MTJfRENEQzNfQ1RSTDsKKwkJcG1pYy0+ZWNvX3JlZyA9IFRQUzY1OTEyX0RDREMzX0FWUzsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzQ6CisJCXBtaWMtPnB3bV9tb2RlX3JlZyA9IFRQUzY1OTEyX0RDREM0X0NUUkw7CisJCXBtaWMtPmVjb19yZWcgPSBUUFM2NTkxMl9EQ0RDNF9BVlM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX3JlZ19pc19lbmFibGVkKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCit7CisJc3RydWN0IHRwczY1OTEyX3JlZyAqcG1pYyA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdHBzNjU5MTIgKm1mZCA9IHBtaWMtPm1mZDsKKwlpbnQgcmVnLCB2YWx1ZSwgaWQgPSByZGV2X2dldF9pZChkZXYpOworCisJaWYgKGlkIDwgVFBTNjU5MTJfUkVHX0RDREMxIHx8IGlkID4gVFBTNjU5MTJfUkVHX0xETzEwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlZyA9IHBtaWMtPmdldF9jdHJsX3JlZyhpZCk7CisJaWYgKHJlZyA8IDApCisJCXJldHVybiByZWc7CisKKwl2YWx1ZSA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgcmVnKTsKKwlpZiAodmFsdWUgPCAwKQorCQlyZXR1cm4gdmFsdWU7CisKKwlyZXR1cm4gdmFsdWUgJiBUUFM2NTkxMl9SRUdfRU5BQkxFRDsKK30KKworc3RhdGljIGludCB0cHM2NTkxMl9yZWdfZW5hYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCit7CisJc3RydWN0IHRwczY1OTEyX3JlZyAqcG1pYyA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdHBzNjU5MTIgKm1mZCA9IHBtaWMtPm1mZDsKKwlpbnQgaWQgPSByZGV2X2dldF9pZChkZXYpOworCWludCByZWc7CisKKwlpZiAoaWQgPCBUUFM2NTkxMl9SRUdfRENEQzEgfHwgaWQgPiBUUFM2NTkxMl9SRUdfTERPMTApCisJCXJldHVybiAtRUlOVkFMOworCisJcmVnID0gcG1pYy0+Z2V0X2N0cmxfcmVnKGlkKTsKKwlpZiAocmVnIDwgMCkKKwkJcmV0dXJuIHJlZzsKKworCXJldHVybiB0cHM2NTkxMl9zZXRfYml0cyhtZmQsIHJlZywgVFBTNjU5MTJfUkVHX0VOQUJMRUQpOworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX3JlZ19kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCit7CisJc3RydWN0IHRwczY1OTEyX3JlZyAqcG1pYyA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdHBzNjU5MTIgKm1mZCA9IHBtaWMtPm1mZDsKKwlpbnQgaWQgPSByZGV2X2dldF9pZChkZXYpLCByZWc7CisKKwlyZWcgPSBwbWljLT5nZXRfY3RybF9yZWcoaWQpOworCWlmIChyZWcgPCAwKQorCQlyZXR1cm4gcmVnOworCisJcmV0dXJuIHRwczY1OTEyX2NsZWFyX2JpdHMobWZkLCByZWcsIFRQUzY1OTEyX1JFR19FTkFCTEVEKTsKK30KKworc3RhdGljIGludCB0cHM2NTkxMl9zZXRfbW9kZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgdHBzNjU5MTJfcmVnICpwbWljID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB0cHM2NTkxMiAqbWZkID0gcG1pYy0+bWZkOworCWludCBwd21fbW9kZSwgZWNvLCBpZCA9IHJkZXZfZ2V0X2lkKGRldik7CisKKwl0cHM2NTkxMl9nZXRfbW9kZV9yZWdpdGVycyhwbWljLCBpZCk7CisKKwlwd21fbW9kZSA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgcG1pYy0+cHdtX21vZGVfcmVnKTsKKwllY28gPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIHBtaWMtPmVjb19yZWcpOworCisJcHdtX21vZGUgJj0gRENEQ0NUUkxfRENEQ19NT0RFX01BU0s7CisJZWNvICY9IERDRENfQVZTX0VDT19NQVNLOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBSRUdVTEFUT1JfTU9ERV9GQVNUOgorCQkvKiBWZXJpZnkgaWYgbW9kZSBhbHJlZHkgc2V0ICovCisJCWlmIChwd21fbW9kZSAmJiAhZWNvKQorCQkJYnJlYWs7CisJCXRwczY1OTEyX3NldF9iaXRzKG1mZCwgcG1pYy0+cHdtX21vZGVfcmVnLCBEQ0RDQ1RSTF9EQ0RDX01PREVfTUFTSyk7CisJCXRwczY1OTEyX2NsZWFyX2JpdHMobWZkLCBwbWljLT5lY29fcmVnLCBEQ0RDX0FWU19FQ09fTUFTSyk7CisJCWJyZWFrOworCWNhc2UgUkVHVUxBVE9SX01PREVfTk9STUFMOgorCWNhc2UgUkVHVUxBVE9SX01PREVfSURMRToKKwkJaWYgKCFwd21fbW9kZSAmJiAhZWNvKQorCQkJYnJlYWs7CisJCXRwczY1OTEyX2NsZWFyX2JpdHMobWZkLCBwbWljLT5wd21fbW9kZV9yZWcsIERDRENDVFJMX0RDRENfTU9ERV9NQVNLKTsKKwkJdHBzNjU5MTJfY2xlYXJfYml0cyhtZmQsIHBtaWMtPmVjb19yZWcsIERDRENfQVZTX0VDT19NQVNLKTsKKwkJYnJlYWs7CisJY2FzZSBSRUdVTEFUT1JfTU9ERV9TVEFOREJZOgorCQlpZiAoIXB3bV9tb2RlICYmIGVjbykKKwkJCWJyZWFrOworCQl0cHM2NTkxMl9jbGVhcl9iaXRzKG1mZCwgcG1pYy0+cHdtX21vZGVfcmVnLCBEQ0RDQ1RSTF9EQ0RDX01PREVfTUFTSyk7CisJCXRwczY1OTEyX3NldF9iaXRzKG1mZCwgcG1pYy0+ZWNvX3JlZywgRENEQ19BVlNfRUNPX01BU0spOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB0cHM2NTkxMl9nZXRfbW9kZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2KQoreworCXN0cnVjdCB0cHM2NTkxMl9yZWcgKnBtaWMgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRwczY1OTEyICptZmQgPSBwbWljLT5tZmQ7CisJaW50IHB3bV9tb2RlLCBlY28sIG1vZGUgPSAwLCBpZCA9IHJkZXZfZ2V0X2lkKGRldik7CisKKwl0cHM2NTkxMl9nZXRfbW9kZV9yZWdpdGVycyhwbWljLCBpZCk7CisKKwlwd21fbW9kZSA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgcG1pYy0+cHdtX21vZGVfcmVnKTsKKwllY28gPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIHBtaWMtPmVjb19yZWcpOworCisJcHdtX21vZGUgJj0gRENEQ0NUUkxfRENEQ19NT0RFX01BU0s7CisJZWNvICY9IERDRENfQVZTX0VDT19NQVNLOworCisJaWYgKHB3bV9tb2RlICYmICFlY28pCisJCW1vZGUgPSBSRUdVTEFUT1JfTU9ERV9GQVNUOworCWVsc2UgaWYgKCFwd21fbW9kZSAmJiAhZWNvKQorCQltb2RlID0gUkVHVUxBVE9SX01PREVfTk9STUFMOworCWVsc2UgaWYgKCFwd21fbW9kZSAmJiBlY28pCisJCW1vZGUgPSBSRUdVTEFUT1JfTU9ERV9TVEFOREJZOworCisJcmV0dXJuIG1vZGU7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjU5MTJfZ2V0X3ZvbHRhZ2VfZGNkYyhzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2KQoreworCXN0cnVjdCB0cHM2NTkxMl9yZWcgKnBtaWMgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRwczY1OTEyICptZmQgPSBwbWljLT5tZmQ7CisJaW50IGlkID0gcmRldl9nZXRfaWQoZGV2KSwgdm9sdGFnZSA9IDAsIHJhbmdlOworCWludCBvcHZzZWwgPSAwLCBhdnNlbCA9IDAsIHNyLCB2c2VsOworCisJc3dpdGNoIChpZCkgeworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREMxOgorCQlvcHZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0RDREMxX09QKTsKKwkJYXZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0RDREMxX0FWUyk7CisJCXJhbmdlID0gcG1pYy0+ZGNkYzFfcmFuZ2U7CisJCWJyZWFrOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREMyOgorCQlvcHZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0RDREMyX09QKTsKKwkJYXZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0RDREMyX0FWUyk7CisJCXJhbmdlID0gcG1pYy0+ZGNkYzJfcmFuZ2U7CisJCWJyZWFrOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREMzOgorCQlvcHZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0RDREMzX09QKTsKKwkJYXZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0RDREMzX0FWUyk7CisJCXJhbmdlID0gcG1pYy0+ZGNkYzNfcmFuZ2U7CisJCWJyZWFrOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREM0OgorCQlvcHZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0RDREM0X09QKTsKKwkJYXZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0RDREM0X0FWUyk7CisJCXJhbmdlID0gcG1pYy0+ZGNkYzRfcmFuZ2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNyID0gKG9wdnNlbCAmIE9QX1NFTFJFR19NQVNLKSA+PiBPUF9TRUxSRUdfU0hJRlQ7CisJaWYgKHNyKQorCQl2c2VsID0gYXZzZWw7CisJZWxzZQorCQl2c2VsID0gb3B2c2VsOworCXZzZWwgJj0gMHgzRjsKKworCXN3aXRjaCAocmFuZ2UpIHsKKwljYXNlIDA6CisJCS8qIDAuNSAtIDEuMjg3NVYgaW4gMTIuNW1WIHN0ZXBzICovCisJCXZvbHRhZ2UgPSB0cHM2NTkxMl92c2VsX3RvX3V2X3JhbmdlMCh2c2VsKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkvKiAwLjcgLSAxLjQ4NzVWIGluIDEyLjVtViBzdGVwcyAqLworCQl2b2x0YWdlID0gdHBzNjU5MTJfdnNlbF90b191dl9yYW5nZTEodnNlbCk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJLyogMC41IC0gMi4wNzVWIGluIDI1bVYgc3RlcHMgKi8KKwkJdm9sdGFnZSA9IHRwczY1OTEyX3ZzZWxfdG9fdXZfcmFuZ2UyKHZzZWwpOworCQlicmVhazsKKwljYXNlIDM6CisJCS8qIDAuNSAtIDMuOFYgaW4gNTBtViBzdGVwcyAqLworCQl2b2x0YWdlID0gdHBzNjU5MTJfdnNlbF90b191dl9yYW5nZTModnNlbCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gdm9sdGFnZTsKK30KKworc3RhdGljIGludCB0cHM2NTkxMl9zZXRfdm9sdGFnZV9kY2RjKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYsCisJCQkJCQl1bnNpZ25lZCBzZWxlY3RvcikKK3sKKwlzdHJ1Y3QgdHBzNjU5MTJfcmVnICpwbWljID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB0cHM2NTkxMiAqbWZkID0gcG1pYy0+bWZkOworCWludCBpZCA9IHJkZXZfZ2V0X2lkKGRldik7CisJaW50IHZhbHVlOworCXU4IHJlZzsKKworCXJlZyA9IHRwczY1OTEyX2dldF9kY2RjX3NlbF9yZWdpc3RlcihwbWljLCBpZCk7CisJdmFsdWUgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIHJlZyk7CisJdmFsdWUgJj0gMHhDMDsKKwlyZXR1cm4gdHBzNjU5MTJfcmVnX3dyaXRlKG1mZCwgcmVnLCBzZWxlY3RvciB8IHZhbHVlKTsKK30KKworc3RhdGljIGludCB0cHM2NTkxMl9nZXRfdm9sdGFnZV9sZG8oc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdHBzNjU5MTJfcmVnICpwbWljID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB0cHM2NTkxMiAqbWZkID0gcG1pYy0+bWZkOworCWludCBpZCA9IHJkZXZfZ2V0X2lkKGRldik7CisJaW50IHZzZWwgPSAwOworCXU4IHJlZzsKKworCXJlZyA9IHRwczY1OTEyX2dldF9sZG9fc2VsX3JlZ2lzdGVyKHBtaWMsIGlkKTsKKwl2c2VsID0gdHBzNjU5MTJfcmVnX3JlYWQobWZkLCByZWcpOworCXZzZWwgJj0gMHgzRjsKKworCXJldHVybiB0cHM2NTkxMl92c2VsX3RvX3V2X2xkbyh2c2VsKTsKK30KKworc3RhdGljIGludCB0cHM2NTkxMl9zZXRfdm9sdGFnZV9sZG8oc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldiwKKwkJCQkJCXVuc2lnbmVkIHNlbGVjdG9yKQoreworCXN0cnVjdCB0cHM2NTkxMl9yZWcgKnBtaWMgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRwczY1OTEyICptZmQgPSBwbWljLT5tZmQ7CisJaW50IGlkID0gcmRldl9nZXRfaWQoZGV2KSwgcmVnLCB2YWx1ZTsKKworCXJlZyA9IHRwczY1OTEyX2dldF9sZG9fc2VsX3JlZ2lzdGVyKHBtaWMsIGlkKTsKKwl2YWx1ZSA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgcmVnKTsKKwl2YWx1ZSAmPSAweEMwOworCXJldHVybiB0cHM2NTkxMl9yZWdfd3JpdGUobWZkLCByZWcsIHNlbGVjdG9yIHwgdmFsdWUpOworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX2xpc3Rfdm9sdGFnZV9kY2RjKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYsCisJCQkJCXVuc2lnbmVkIHNlbGVjdG9yKQoreworCXN0cnVjdCB0cHM2NTkxMl9yZWcgKnBtaWMgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJhbmdlLCB2b2x0YWdlID0gMCwgaWQgPSByZGV2X2dldF9pZChkZXYpOworCisJc3dpdGNoIChpZCkgeworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREMxOgorCQlyYW5nZSA9IHBtaWMtPmRjZGMxX3JhbmdlOworCQlicmVhazsKKwljYXNlIFRQUzY1OTEyX1JFR19EQ0RDMjoKKwkJcmFuZ2UgPSBwbWljLT5kY2RjMl9yYW5nZTsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzM6CisJCXJhbmdlID0gcG1pYy0+ZGNkYzNfcmFuZ2U7CisJCWJyZWFrOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREM0OgorCQlyYW5nZSA9IHBtaWMtPmRjZGM0X3JhbmdlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHJhbmdlKSB7CisJY2FzZSAwOgorCQkvKiAwLjUgLSAxLjI4NzVWIGluIDEyLjVtViBzdGVwcyAqLworCQl2b2x0YWdlID0gdHBzNjU5MTJfdnNlbF90b191dl9yYW5nZTAoc2VsZWN0b3IpOworCQlicmVhazsKKwljYXNlIDE6CisJCS8qIDAuNyAtIDEuNDg3NVYgaW4gMTIuNW1WIHN0ZXBzICovCisJCXZvbHRhZ2UgPSB0cHM2NTkxMl92c2VsX3RvX3V2X3JhbmdlMShzZWxlY3Rvcik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJLyogMC41IC0gMi4wNzVWIGluIDI1bVYgc3RlcHMgKi8KKwkJdm9sdGFnZSA9IHRwczY1OTEyX3ZzZWxfdG9fdXZfcmFuZ2UyKHNlbGVjdG9yKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQkvKiAwLjUgLSAzLjhWIGluIDUwbVYgc3RlcHMgKi8KKwkJdm9sdGFnZSA9IHRwczY1OTEyX3ZzZWxfdG9fdXZfcmFuZ2UzKHNlbGVjdG9yKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiB2b2x0YWdlOworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX2xpc3Rfdm9sdGFnZV9sZG8oc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldiwKKwkJCQkJdW5zaWduZWQgc2VsZWN0b3IpCit7CisJaW50IGxkbyA9IHJkZXZfZ2V0X2lkKGRldik7CisKKwlpZiAobGRvIDwgVFBTNjU5MTJfUkVHX0xETzEgfHwgbGRvID4gVFBTNjU5MTJfUkVHX0xETzEwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiB0cHM2NTkxMl92c2VsX3RvX3V2X2xkbyhzZWxlY3Rvcik7Cit9CisKKy8qIE9wZXJhdGlvbnMgcGVybWl0dGVkIG9uIERDREN4ICovCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgdHBzNjU5MTJfb3BzX2RjZGMgPSB7CisJLmlzX2VuYWJsZWQgPSB0cHM2NTkxMl9yZWdfaXNfZW5hYmxlZCwKKwkuZW5hYmxlID0gdHBzNjU5MTJfcmVnX2VuYWJsZSwKKwkuZGlzYWJsZSA9IHRwczY1OTEyX3JlZ19kaXNhYmxlLAorCS5zZXRfbW9kZSA9IHRwczY1OTEyX3NldF9tb2RlLAorCS5nZXRfbW9kZSA9IHRwczY1OTEyX2dldF9tb2RlLAorCS5nZXRfdm9sdGFnZSA9IHRwczY1OTEyX2dldF92b2x0YWdlX2RjZGMsCisJLnNldF92b2x0YWdlX3NlbCA9IHRwczY1OTEyX3NldF92b2x0YWdlX2RjZGMsCisJLmxpc3Rfdm9sdGFnZSA9IHRwczY1OTEyX2xpc3Rfdm9sdGFnZV9kY2RjLAorfTsKKworLyogT3BlcmF0aW9ucyBwZXJtaXR0ZWQgb24gTERPeCAqLworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHRwczY1OTEyX29wc19sZG8gPSB7CisJLmlzX2VuYWJsZWQgPSB0cHM2NTkxMl9yZWdfaXNfZW5hYmxlZCwKKwkuZW5hYmxlID0gdHBzNjU5MTJfcmVnX2VuYWJsZSwKKwkuZGlzYWJsZSA9IHRwczY1OTEyX3JlZ19kaXNhYmxlLAorCS5nZXRfdm9sdGFnZSA9IHRwczY1OTEyX2dldF92b2x0YWdlX2xkbywKKwkuc2V0X3ZvbHRhZ2Vfc2VsID0gdHBzNjU5MTJfc2V0X3ZvbHRhZ2VfbGRvLAorCS5saXN0X3ZvbHRhZ2UgPSB0cHM2NTkxMl9saXN0X3ZvbHRhZ2VfbGRvLAorfTsKKworc3RhdGljIF9fZGV2aW5pdCBpbnQgdHBzNjU5MTJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCB0cHNfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqcmVnX2RhdGE7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CisJc3RydWN0IHRwczY1OTEyX3JlZyAqcG1pYzsKKwlzdHJ1Y3QgdHBzNjU5MTJfYm9hcmQgKnBtaWNfcGxhdF9kYXRhOworCWludCBpLCBlcnI7CisKKwlwbWljX3BsYXRfZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEodHBzNjU5MTItPmRldik7CisJaWYgKCFwbWljX3BsYXRfZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZWdfZGF0YSA9IHBtaWNfcGxhdF9kYXRhLT50cHM2NTkxMl9wbWljX2luaXRfZGF0YTsKKworCXBtaWMgPSBremFsbG9jKHNpemVvZigqcG1pYyksIEdGUF9LRVJORUwpOworCWlmICghcG1pYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9pbml0KCZwbWljLT5pb19sb2NrKTsKKwlwbWljLT5tZmQgPSB0cHM2NTkxMjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwbWljKTsKKworCXBtaWMtPmdldF9jdHJsX3JlZyA9ICZ0cHM2NTkxMl9nZXRfY3RybF9yZWdpc3RlcjsKKwlpbmZvID0gdHBzNjU5MTJfcmVnczsKKworCWZvciAoaSA9IDA7IGkgPCBUUFM2NTkxMl9OVU1fUkVHVUxBVE9SOyBpKyssIGluZm8rKywgcmVnX2RhdGErKykgeworCQlpbnQgcmFuZ2UgPSAwOworCQkvKiBSZWdpc3RlciB0aGUgcmVndWxhdG9ycyAqLworCQlwbWljLT5pbmZvW2ldID0gaW5mbzsKKworCQlwbWljLT5kZXNjW2ldLm5hbWUgPSBpbmZvLT5uYW1lOworCQlwbWljLT5kZXNjW2ldLmlkID0gaTsKKwkJcG1pYy0+ZGVzY1tpXS5uX3ZvbHRhZ2VzID0gNjQ7CisJCXBtaWMtPmRlc2NbaV0ub3BzID0gKGkgPiBUUFM2NTkxMl9SRUdfRENEQzQgPworCQkJJnRwczY1OTEyX29wc19sZG8gOiAmdHBzNjU5MTJfb3BzX2RjZGMpOworCQlwbWljLT5kZXNjW2ldLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRTsKKwkJcG1pYy0+ZGVzY1tpXS5vd25lciA9IFRISVNfTU9EVUxFOworCQlyYW5nZSA9IHRwczY1OTEyX2dldF9yYW5nZShwbWljLCBpKTsKKwkJcmRldiA9IHJlZ3VsYXRvcl9yZWdpc3RlcigmcG1pYy0+ZGVzY1tpXSwKKwkJCQkJdHBzNjU5MTItPmRldiwgcmVnX2RhdGEsIHBtaWMpOworCQlpZiAoSVNfRVJSKHJkZXYpKSB7CisJCQlkZXZfZXJyKHRwczY1OTEyLT5kZXYsCisJCQkJImZhaWxlZCB0byByZWdpc3RlciAlcyByZWd1bGF0b3JcbiIsCisJCQkJcGRldi0+bmFtZSk7CisJCQllcnIgPSBQVFJfRVJSKHJkZXYpOworCQkJZ290byBlcnI7CisJCX0KKworCQkvKiBTYXZlIHJlZ3VsYXRvciBmb3IgY2xlYW51cCAqLworCQlwbWljLT5yZGV2W2ldID0gcmRldjsKKwl9CisJcmV0dXJuIDA7CisKK2VycjoKKwl3aGlsZSAoLS1pID49IDApCisJCXJlZ3VsYXRvcl91bnJlZ2lzdGVyKHBtaWMtPnJkZXZbaV0pOworCisJa2ZyZWUocG1pYyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgdHBzNjU5MTJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRwczY1OTEyX3JlZyAqdHBzNjU5MTJfcmVnID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVFBTNjU5MTJfTlVNX1JFR1VMQVRPUjsgaSsrKQorCQlyZWd1bGF0b3JfdW5yZWdpc3Rlcih0cHM2NTkxMl9yZWctPnJkZXZbaV0pOworCisJa2ZyZWUodHBzNjU5MTJfcmVnKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdHBzNjU5MTJfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInRwczY1OTEyLXBtaWMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IHRwczY1OTEyX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh0cHM2NTkxMl9yZW1vdmUpLAorfTsKKworLyoqCisgKiB0cHM2NTkxMl9pbml0CisgKgorICogTW9kdWxlIGluaXQgZnVuY3Rpb24KKyAqLworc3RhdGljIGludCBfX2luaXQgdHBzNjU5MTJfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRwczY1OTEyX2RyaXZlcik7Cit9CitzdWJzeXNfaW5pdGNhbGwodHBzNjU5MTJfaW5pdCk7CisKKy8qKgorICogdHBzNjU5MTJfY2xlYW51cAorICoKKyAqIE1vZHVsZSBleGl0IGZ1bmN0aW9uCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCB0cHM2NTkxMl9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRwczY1OTEyX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh0cHM2NTkxMl9jbGVhbnVwKTsKKworTU9EVUxFX0FVVEhPUigiTWFyZ2FyaXRhIE9sYXlhIENhYnJlcmEgPG1hZ2lAc2xpbWxvZ2ljLmNvLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUUFM2NTkxMiB2b2x0YWdlIHJlZ3VsYXRvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06dHBzNjU5MTItcG1pYyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHdsLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdHdsLXJlZ3VsYXRvci5jCmluZGV4IDg3ZmUwZjcuLmVlODc0N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3R3bC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90d2wtcmVndWxhdG9yLmMKQEAgLTgzNSw4ICs4MzUsOCBAQAogCQkJcmVtYXBfY29uZikgXAogCQlUV0xfRklYRURfTERPKGxhYmVsLCBvZmZzZXQsIG1Wb2x0cywgbnVtLCB0dXJub25fZGVsYXksIFwKIAkJCXJlbWFwX2NvbmYsIFRXTDQwMzAsIHR3bDQwMzBmaXhlZF9vcHMpCi0jZGVmaW5lIFRXTDYwMzBfRklYRURfTERPKGxhYmVsLCBvZmZzZXQsIG1Wb2x0cywgbnVtLCB0dXJub25fZGVsYXkpIFwKLQkJVFdMX0ZJWEVEX0xETyhsYWJlbCwgb2Zmc2V0LCBtVm9sdHMsIG51bSwgdHVybm9uX2RlbGF5LCBcCisjZGVmaW5lIFRXTDYwMzBfRklYRURfTERPKGxhYmVsLCBvZmZzZXQsIG1Wb2x0cywgdHVybm9uX2RlbGF5KSBcCisJCVRXTF9GSVhFRF9MRE8obGFiZWwsIG9mZnNldCwgbVZvbHRzLCAweDAsIHR1cm5vbl9kZWxheSwgXAogCQkJMHgwLCBUV0w2MDMwLCB0d2w2MDMwZml4ZWRfb3BzKQogCiAjZGVmaW5lIFRXTDQwMzBfQURKVVNUQUJMRV9MRE8obGFiZWwsIG9mZnNldCwgbnVtLCB0dXJub25fZGVsYXksIHJlbWFwX2NvbmYpIHsgXApAQCAtODU2LDI0ICs4NTYsMjIgQEAKIAkJfSwgXAogCX0KIAotI2RlZmluZSBUV0w2MDMwX0FESlVTVEFCTEVfTERPKGxhYmVsLCBvZmZzZXQsIG1pbl9tVm9sdHMsIG1heF9tVm9sdHMsIG51bSkgeyBcCisjZGVmaW5lIFRXTDYwMzBfQURKVVNUQUJMRV9MRE8obGFiZWwsIG9mZnNldCwgbWluX21Wb2x0cywgbWF4X21Wb2x0cykgeyBcCiAJLmJhc2UgPSBvZmZzZXQsIFwKLQkuaWQgPSBudW0sIFwKIAkubWluX21WID0gbWluX21Wb2x0cywgXAogCS5tYXhfbVYgPSBtYXhfbVZvbHRzLCBcCiAJLmRlc2MgPSB7IFwKIAkJLm5hbWUgPSAjbGFiZWwsIFwKIAkJLmlkID0gVFdMNjAzMF9SRUdfIyNsYWJlbCwgXAotCQkubl92b2x0YWdlcyA9IChtYXhfbVZvbHRzIC0gbWluX21Wb2x0cykvMTAwLCBcCisJCS5uX3ZvbHRhZ2VzID0gKG1heF9tVm9sdHMgLSBtaW5fbVZvbHRzKS8xMDAgKyAxLCBcCiAJCS5vcHMgPSAmdHdsNjAzMGxkb19vcHMsIFwKIAkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwgXAogCQkub3duZXIgPSBUSElTX01PRFVMRSwgXAogCQl9LCBcCiAJfQogCi0jZGVmaW5lIFRXTDYwMjVfQURKVVNUQUJMRV9MRE8obGFiZWwsIG9mZnNldCwgbWluX21Wb2x0cywgbWF4X21Wb2x0cywgbnVtKSB7IFwKKyNkZWZpbmUgVFdMNjAyNV9BREpVU1RBQkxFX0xETyhsYWJlbCwgb2Zmc2V0LCBtaW5fbVZvbHRzLCBtYXhfbVZvbHRzKSB7IFwKIAkuYmFzZSA9IG9mZnNldCwgXAotCS5pZCA9IG51bSwgXAogCS5taW5fbVYgPSBtaW5fbVZvbHRzLCBcCiAJLm1heF9tViA9IG1heF9tVm9sdHMsIFwKIAkuZGVzYyA9IHsgXApAQCAtOTAzLDkgKzkwMSw4IEBACiAJCX0sIFwKIAl9CiAKLSNkZWZpbmUgVFdMNjAzMF9GSVhFRF9SRVNPVVJDRShsYWJlbCwgb2Zmc2V0LCBudW0sIHR1cm5vbl9kZWxheSkgeyBcCisjZGVmaW5lIFRXTDYwMzBfRklYRURfUkVTT1VSQ0UobGFiZWwsIG9mZnNldCwgdHVybm9uX2RlbGF5KSB7IFwKIAkuYmFzZSA9IG9mZnNldCwgXAotCS5pZCA9IG51bSwgXAogCS5kZWxheSA9IHR1cm5vbl9kZWxheSwgXAogCS5kZXNjID0geyBcCiAJCS5uYW1lID0gI2xhYmVsLCBcCkBAIC05MTYsOSArOTEzLDggQEAKIAkJfSwgXAogCX0KIAotI2RlZmluZSBUV0w2MDI1X0FESlVTVEFCTEVfU01QUyhsYWJlbCwgb2Zmc2V0LCBudW0pIHsgXAorI2RlZmluZSBUV0w2MDI1X0FESlVTVEFCTEVfU01QUyhsYWJlbCwgb2Zmc2V0KSB7IFwKIAkuYmFzZSA9IG9mZnNldCwgXAotCS5pZCA9IG51bSwgXAogCS5taW5fbVYgPSA2MDAsIFwKIAkubWF4X21WID0gMjEwMCwgXAogCS5kZXNjID0geyBcCkBAIC05NjEsMzIgKzk1NywzMiBAQAogCS8qIDYwMzAgUkVHIHdpdGggYmFzZSBhcyBQTUMgU2xhdmUgTWlzYyA6IDB4MDAzMCAqLwogCS8qIFR1cm5vbi1kZWxheSBhbmQgcmVtYXAgY29uZmlndXJhdGlvbiB2YWx1ZXMgZm9yIDYwMzAgYXJlIG5vdAogCSAgIHZlcmlmaWVkIHNpbmNlIHRoZSBzcGVjaWZpY2F0aW9uIGlzIG5vdCBwdWJsaWMgKi8KLQlUV0w2MDMwX0FESlVTVEFCTEVfTERPKFZBVVgxXzYwMzAsIDB4NTQsIDEwMDAsIDMzMDAsIDEpLAotCVRXTDYwMzBfQURKVVNUQUJMRV9MRE8oVkFVWDJfNjAzMCwgMHg1OCwgMTAwMCwgMzMwMCwgMiksCi0JVFdMNjAzMF9BREpVU1RBQkxFX0xETyhWQVVYM182MDMwLCAweDVjLCAxMDAwLCAzMzAwLCAzKSwKLQlUV0w2MDMwX0FESlVTVEFCTEVfTERPKFZNTUMsIDB4NjgsIDEwMDAsIDMzMDAsIDQpLAotCVRXTDYwMzBfQURKVVNUQUJMRV9MRE8oVlBQLCAweDZjLCAxMDAwLCAzMzAwLCA1KSwKLQlUV0w2MDMwX0FESlVTVEFCTEVfTERPKFZVU0lNLCAweDc0LCAxMDAwLCAzMzAwLCA3KSwKLQlUV0w2MDMwX0ZJWEVEX0xETyhWQU5BLCAweDUwLCAyMTAwLCAxNSwgMCksCi0JVFdMNjAzMF9GSVhFRF9MRE8oVkNYSU8sIDB4NjAsIDE4MDAsIDE2LCAwKSwKLQlUV0w2MDMwX0ZJWEVEX0xETyhWREFDLCAweDY0LCAxODAwLCAxNywgMCksCi0JVFdMNjAzMF9GSVhFRF9MRE8oVlVTQiwgMHg3MCwgMzMwMCwgMTgsIDApLAotCVRXTDYwMzBfRklYRURfUkVTT1VSQ0UoQ0xLMzJLRywgMHg4QywgNDgsIDApLAorCVRXTDYwMzBfQURKVVNUQUJMRV9MRE8oVkFVWDFfNjAzMCwgMHg1NCwgMTAwMCwgMzMwMCksCisJVFdMNjAzMF9BREpVU1RBQkxFX0xETyhWQVVYMl82MDMwLCAweDU4LCAxMDAwLCAzMzAwKSwKKwlUV0w2MDMwX0FESlVTVEFCTEVfTERPKFZBVVgzXzYwMzAsIDB4NWMsIDEwMDAsIDMzMDApLAorCVRXTDYwMzBfQURKVVNUQUJMRV9MRE8oVk1NQywgMHg2OCwgMTAwMCwgMzMwMCksCisJVFdMNjAzMF9BREpVU1RBQkxFX0xETyhWUFAsIDB4NmMsIDEwMDAsIDMzMDApLAorCVRXTDYwMzBfQURKVVNUQUJMRV9MRE8oVlVTSU0sIDB4NzQsIDEwMDAsIDMzMDApLAorCVRXTDYwMzBfRklYRURfTERPKFZBTkEsIDB4NTAsIDIxMDAsIDApLAorCVRXTDYwMzBfRklYRURfTERPKFZDWElPLCAweDYwLCAxODAwLCAwKSwKKwlUV0w2MDMwX0ZJWEVEX0xETyhWREFDLCAweDY0LCAxODAwLCAwKSwKKwlUV0w2MDMwX0ZJWEVEX0xETyhWVVNCLCAweDcwLCAzMzAwLCAwKSwKKwlUV0w2MDMwX0ZJWEVEX1JFU09VUkNFKENMSzMyS0csIDB4OEMsIDApLAogCiAJLyogNjAyNSBhcmUgcmVuYW1lZCBjb21wYXJlZCB0byA2MDMwIHZlcnNpb25zICovCi0JVFdMNjAyNV9BREpVU1RBQkxFX0xETyhMRE8yLCAweDU0LCAxMDAwLCAzMzAwLCAxKSwKLQlUV0w2MDI1X0FESlVTVEFCTEVfTERPKExETzQsIDB4NTgsIDEwMDAsIDMzMDAsIDIpLAotCVRXTDYwMjVfQURKVVNUQUJMRV9MRE8oTERPMywgMHg1YywgMTAwMCwgMzMwMCwgMyksCi0JVFdMNjAyNV9BREpVU1RBQkxFX0xETyhMRE81LCAweDY4LCAxMDAwLCAzMzAwLCA0KSwKLQlUV0w2MDI1X0FESlVTVEFCTEVfTERPKExETzEsIDB4NmMsIDEwMDAsIDMzMDAsIDUpLAotCVRXTDYwMjVfQURKVVNUQUJMRV9MRE8oTERPNywgMHg3NCwgMTAwMCwgMzMwMCwgNyksCi0JVFdMNjAyNV9BREpVU1RBQkxFX0xETyhMRE82LCAweDYwLCAxMDAwLCAzMzAwLCAxNiksCi0JVFdMNjAyNV9BREpVU1RBQkxFX0xETyhMRE9MTiwgMHg2NCwgMTAwMCwgMzMwMCwgMTcpLAotCVRXTDYwMjVfQURKVVNUQUJMRV9MRE8oTERPVVNCLCAweDcwLCAxMDAwLCAzMzAwLCAxOCksCisJVFdMNjAyNV9BREpVU1RBQkxFX0xETyhMRE8yLCAweDU0LCAxMDAwLCAzMzAwKSwKKwlUV0w2MDI1X0FESlVTVEFCTEVfTERPKExETzQsIDB4NTgsIDEwMDAsIDMzMDApLAorCVRXTDYwMjVfQURKVVNUQUJMRV9MRE8oTERPMywgMHg1YywgMTAwMCwgMzMwMCksCisJVFdMNjAyNV9BREpVU1RBQkxFX0xETyhMRE81LCAweDY4LCAxMDAwLCAzMzAwKSwKKwlUV0w2MDI1X0FESlVTVEFCTEVfTERPKExETzEsIDB4NmMsIDEwMDAsIDMzMDApLAorCVRXTDYwMjVfQURKVVNUQUJMRV9MRE8oTERPNywgMHg3NCwgMTAwMCwgMzMwMCksCisJVFdMNjAyNV9BREpVU1RBQkxFX0xETyhMRE82LCAweDYwLCAxMDAwLCAzMzAwKSwKKwlUV0w2MDI1X0FESlVTVEFCTEVfTERPKExET0xOLCAweDY0LCAxMDAwLCAzMzAwKSwKKwlUV0w2MDI1X0FESlVTVEFCTEVfTERPKExET1VTQiwgMHg3MCwgMTAwMCwgMzMwMCksCiAKLQlUV0w2MDI1X0FESlVTVEFCTEVfU01QUyhTTVBTMywgMHgzNCwgMSksCi0JVFdMNjAyNV9BREpVU1RBQkxFX1NNUFMoU01QUzQsIDB4MTAsIDIpLAotCVRXTDYwMjVfQURKVVNUQUJMRV9TTVBTKFZJTywgMHgxNiwgMyksCisJVFdMNjAyNV9BREpVU1RBQkxFX1NNUFMoU01QUzMsIDB4MzQpLAorCVRXTDYwMjVfQURKVVNUQUJMRV9TTVBTKFNNUFM0LCAweDEwKSwKKwlUV0w2MDI1X0FESlVTVEFCTEVfU01QUyhWSU8sIDB4MTYpLAogfTsKIAogc3RhdGljIHU4IHR3bF9nZXRfc21wc19vZmZzZXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1kY2RjLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtZGNkYy5jCmluZGV4IGEwOTgyZTguLmJkMzUzMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1kY2RjLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204MzF4LWRjZGMuYwpAQCAtMjY3LDIzICsyNjcsNiBAQAogCXJldHVybiB2c2VsOwogfQogCi1zdGF0aWMgaW50IHdtODMxeF9idWNrdl9zZWxlY3RfbWF4X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCi0JCQkJCSAgIGludCBtaW5fdVYsIGludCBtYXhfdVYpCi17Ci0JdTE2IHZzZWw7Ci0KLQlpZiAobWF4X3VWIDwgNjAwMDAwIHx8IG1heF91ViA+IDE4MDAwMDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdnNlbCA9ICgobWF4X3VWIC0gNjAwMDAwKSAvIDEyNTAwKSArIDg7Ci0KLQlpZiAod204MzF4X2J1Y2t2X2xpc3Rfdm9sdGFnZShyZGV2LCB2c2VsKSA8IG1pbl91ViB8fAotCSAgICB3bTgzMXhfYnVja3ZfbGlzdF92b2x0YWdlKHJkZXYsIHZzZWwpIDwgbWF4X3VWKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiB2c2VsOwotfQotCiBzdGF0aWMgaW50IHdtODMxeF9idWNrdl9zZXRfZHZzKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCBpbnQgc3RhdGUpCiB7CiAJc3RydWN0IHdtODMxeF9kY2RjICpkY2RjID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKQEAgLTMzOCwyOCArMzIxLDIzIEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQkvKiBTZXQgdGhlIGhpZ2ggdm9sdGFnZSBhcyB0aGUgRFZTIHZvbHRhZ2UuICBUaGlzIGlzIG9wdGltaXNlZAotCSAqIGZvciBDUFVmcmVxIHVzYWdlLCBtb3N0IHByb2Nlc3NvcnMgd2lsbCBrZWVwIHRoZSBtYXhpbXVtCi0JICogdm9sdGFnZSBjb25zdGFudCBhbmQgbG93ZXIgdGhlIG1pbmltdW0gd2l0aCB0aGUgZnJlcXVlbmN5LiAqLwotCXZzZWwgPSB3bTgzMXhfYnVja3Zfc2VsZWN0X21heF92b2x0YWdlKHJkZXYsIG1pbl91ViwgbWF4X3VWKTsKLQlpZiAodnNlbCA8IDApIHsKLQkJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIC0gYXQgd29yc3QgdGhlIHNhbWUgdnNlbAotCQkgKiBzaG91bGQgYmUgY2hvc2VuICovCi0JCVdBUk5fT04odnNlbCA8IDApOwotCQlyZXR1cm4gMDsKKwkvKgorCSAqIElmIHRoaXMgVlNFTCBpcyBoaWdoZXIgdGhhbiB0aGUgbGFzdCBvbmUgd2UndmUgc2VlbiB0aGVuCisJICogcmVtZW1iZXIgaXQgYXMgdGhlIERWUyBWU0VMLiAgVGhpcyBpcyBvcHRpbWlzZWQgZm9yIENQVWZyZXEKKwkgKiB1c2FnZSB3aGVyZSB3ZSB3YW50IHRvIGdldCB0byB0aGUgaGlnaGVzdCB2b2x0YWdlIHZlcnkKKwkgKiBxdWlja2x5LgorCSAqLworCWlmICh2c2VsID4gZGNkYy0+ZHZzX3ZzZWwpIHsKKwkJcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeCwgZHZzX3JlZywKKwkJCQkgICAgICBXTTgzMVhfREMxX0RWU19WU0VMX01BU0ssCisJCQkJICAgICAgZGNkYy0+ZHZzX3ZzZWwpOworCQlpZiAocmV0ID09IDApCisJCQlkY2RjLT5kdnNfdnNlbCA9IHZzZWw7CisJCWVsc2UKKwkJCWRldl93YXJuKHdtODMxeC0+ZGV2LAorCQkJCSAiRmFpbGVkIHRvIHNldCBEQ0RDIERWUyBWU0VMOiAlZFxuIiwgcmV0KTsKIAl9CiAKLQkvKiBEb24ndCBib3RoZXIgaWYgaXQncyB0aGUgc2FtZSBWU0VMIHdlJ3JlIGFscmVhZHkgdXNpbmcgKi8KLQlpZiAodnNlbCA9PSBkY2RjLT5vbl92c2VsKQotCQlyZXR1cm4gMDsKLQotCXJldCA9IHdtODMxeF9zZXRfYml0cyh3bTgzMXgsIGR2c19yZWcsIFdNODMxWF9EQzFfRFZTX1ZTRUxfTUFTSywgdnNlbCk7Ci0JaWYgKHJldCA9PSAwKQotCQlkY2RjLT5kdnNfdnNlbCA9IHZzZWw7Ci0JZWxzZQotCQlkZXZfd2Fybih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byBzZXQgRENEQyBEVlMgVlNFTDogJWRcbiIsCi0JCQkgcmV0KTsKLQogCXJldHVybiAwOwogfQogCkBAIC00NTYsMjcgKzQzNCw2IEBACiAJaWYgKCFwZGF0YSB8fCAhcGRhdGEtPmR2c19ncGlvKQogCQlyZXR1cm47CiAKLQlzd2l0Y2ggKHBkYXRhLT5kdnNfY29udHJvbF9zcmMpIHsKLQljYXNlIDE6Ci0JCWN0cmwgPSAyIDw8IFdNODMxWF9EQzFfRFZTX1NSQ19TSElGVDsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQljdHJsID0gMyA8PCBXTTgzMVhfREMxX0RWU19TUkNfU0hJRlQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIod204MzF4LT5kZXYsICJJbnZhbGlkIERWUyBjb250cm9sIHNvdXJjZSAlZCBmb3IgJXNcbiIsCi0JCQlwZGF0YS0+ZHZzX2NvbnRyb2xfc3JjLCBkY2RjLT5uYW1lKTsKLQkJcmV0dXJuOwotCX0KLQotCXJldCA9IHdtODMxeF9zZXRfYml0cyh3bTgzMXgsIGRjZGMtPmJhc2UgKyBXTTgzMVhfRENEQ19EVlNfQ09OVFJPTCwKLQkJCSAgICAgIFdNODMxWF9EQzFfRFZTX1NSQ19NQVNLLCBjdHJsKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiRmFpbGVkIHRvIHNldCAlcyBEVlMgc291cmNlOiAlZFxuIiwKLQkJCWRjZGMtPm5hbWUsIHJldCk7Ci0JCXJldHVybjsKLQl9Ci0KIAlyZXQgPSBncGlvX3JlcXVlc3QocGRhdGEtPmR2c19ncGlvLCAiRENEQyBEVlMiKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiRmFpbGVkIHRvIGdldCAlcyBEVlMgR1BJTzogJWRcbiIsCkBAIC00OTgsMTcgKzQ1NSw1NyBAQAogCX0KIAogCWRjZGMtPmR2c19ncGlvID0gcGRhdGEtPmR2c19ncGlvOworCisJc3dpdGNoIChwZGF0YS0+ZHZzX2NvbnRyb2xfc3JjKSB7CisJY2FzZSAxOgorCQljdHJsID0gMiA8PCBXTTgzMVhfREMxX0RWU19TUkNfU0hJRlQ7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJY3RybCA9IDMgPDwgV004MzFYX0RDMV9EVlNfU1JDX1NISUZUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiSW52YWxpZCBEVlMgY29udHJvbCBzb3VyY2UgJWQgZm9yICVzXG4iLAorCQkJcGRhdGEtPmR2c19jb250cm9sX3NyYywgZGNkYy0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBJZiBEVlNfVlNFTCBpcyBzZXQgdG8gdGhlIG1pbmltdW0gdmFsdWUgdGhlbiByYWlzZSBpdCB0byBPTl9WU0VMCisJICogdG8gbWFrZSBib290c3RyYXBwaW5nIGEgYml0IHNtb290aGVyLgorCSAqLworCWlmICghZGNkYy0+ZHZzX3ZzZWwpIHsKKwkJcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeCwKKwkJCQkgICAgICBkY2RjLT5iYXNlICsgV004MzFYX0RDRENfRFZTX0NPTlRST0wsCisJCQkJICAgICAgV004MzFYX0RDMV9EVlNfVlNFTF9NQVNLLCBkY2RjLT5vbl92c2VsKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJZGNkYy0+ZHZzX3ZzZWwgPSBkY2RjLT5vbl92c2VsOworCQllbHNlCisJCQlkZXZfd2Fybih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byBzZXQgRFZTX1ZTRUw6ICVkXG4iLAorCQkJCSByZXQpOworCX0KKworCXJldCA9IHdtODMxeF9zZXRfYml0cyh3bTgzMXgsIGRjZGMtPmJhc2UgKyBXTTgzMVhfRENEQ19EVlNfQ09OVFJPTCwKKwkJCSAgICAgIFdNODMxWF9EQzFfRFZTX1NSQ19NQVNLLCBjdHJsKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiRmFpbGVkIHRvIHNldCAlcyBEVlMgc291cmNlOiAlZFxuIiwKKwkJCWRjZGMtPm5hbWUsIHJldCk7CisJfQogfQogCiBzdGF0aWMgX19kZXZpbml0IGludCB3bTgzMXhfYnVja3ZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHdtODMxeF9wZGF0YSAqcGRhdGEgPSB3bTgzMXgtPmRldi0+cGxhdGZvcm1fZGF0YTsKLQlpbnQgaWQgPSBwZGV2LT5pZCAlIEFSUkFZX1NJWkUocGRhdGEtPmRjZGMpOworCWludCBpZDsKIAlzdHJ1Y3Qgd204MzF4X2RjZGMgKmRjZGM7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IHJldCwgaXJxOwogCisJaWYgKHBkYXRhICYmIHBkYXRhLT53bTgzMXhfbnVtKQorCQlpZCA9IChwZGF0YS0+d204MzF4X251bSAqIDEwKSArIDE7CisJZWxzZQorCQlpZCA9IDA7CisJaWQgPSBwZGV2LT5pZCAtIGlkOworCiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiUHJvYmluZyBEQ0RDJWRcbiIsIGlkICsgMSk7CiAKIAlpZiAocGRhdGEgPT0gTlVMTCB8fCBwZGF0YS0+ZGNkY1tpZF0gPT0gTlVMTCkKQEAgLTU0NSw3ICs1NDIsNyBAQAogCX0KIAlkY2RjLT5vbl92c2VsID0gcmV0ICYgV004MzFYX0RDMV9PTl9WU0VMX01BU0s7CiAKLQlyZXQgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LCBkY2RjLT5iYXNlICsgV004MzFYX0RDRENfT05fQ09ORklHKTsKKwlyZXQgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LCBkY2RjLT5iYXNlICsgV004MzFYX0RDRENfRFZTX0NPTlRST0wpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gcmVhZCBEVlMgVlNFTDogJWRcbiIsIHJldCk7CiAJCWdvdG8gZXJyOwpAQCAtNzA5LDExICs3MDYsMTcgQEAKIHsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHdtODMxeF9wZGF0YSAqcGRhdGEgPSB3bTgzMXgtPmRldi0+cGxhdGZvcm1fZGF0YTsKLQlpbnQgaWQgPSBwZGV2LT5pZCAlIEFSUkFZX1NJWkUocGRhdGEtPmRjZGMpOworCWludCBpZDsKIAlzdHJ1Y3Qgd204MzF4X2RjZGMgKmRjZGM7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IHJldCwgaXJxOwogCisJaWYgKHBkYXRhICYmIHBkYXRhLT53bTgzMXhfbnVtKQorCQlpZCA9IChwZGF0YS0+d204MzF4X251bSAqIDEwKSArIDE7CisJZWxzZQorCQlpZCA9IDA7CisJaWQgPSBwZGV2LT5pZCAtIGlkOworCiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiUHJvYmluZyBEQ0RDJWRcbiIsIGlkICsgMSk7CiAKIAlpZiAocGRhdGEgPT0gTlVMTCB8fCBwZGF0YS0+ZGNkY1tpZF0gPT0gTlVMTCkKQEAgLTEwNDYsMyArMTA0OSw0IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOndtODMxeC1idWNrdiIpOwogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp3bTgzMXgtYnVja3AiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06d204MzF4LWVwZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3Ivd204MzF4LWxkby5jIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204MzF4LWxkby5jCmluZGV4IDIyMjBjZjguLjY3MDk3MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1sZG8uYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtbGRvLmMKQEAgLTMxMCwxMSArMzEwLDE3IEBACiB7CiAJc3RydWN0IHdtODMxeCAqd204MzF4ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwogCXN0cnVjdCB3bTgzMXhfcGRhdGEgKnBkYXRhID0gd204MzF4LT5kZXYtPnBsYXRmb3JtX2RhdGE7Ci0JaW50IGlkID0gcGRldi0+aWQgJSBBUlJBWV9TSVpFKHBkYXRhLT5sZG8pOworCWludCBpZDsKIAlzdHJ1Y3Qgd204MzF4X2xkbyAqbGRvOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWludCByZXQsIGlycTsKIAorCWlmIChwZGF0YSAmJiBwZGF0YS0+d204MzF4X251bSkKKwkJaWQgPSAocGRhdGEtPndtODMxeF9udW0gKiAxMCkgKyAxOworCWVsc2UKKwkJaWQgPSAwOworCWlkID0gcGRldi0+aWQgLSBpZDsKKwogCWRldl9kYmcoJnBkZXYtPmRldiwgIlByb2JpbmcgTERPJWRcbiIsIGlkICsgMSk7CiAKIAlpZiAocGRhdGEgPT0gTlVMTCB8fCBwZGF0YS0+bGRvW2lkXSA9PSBOVUxMKQpAQCAtNTc0LDExICs1ODAsMTcgQEAKIHsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHdtODMxeF9wZGF0YSAqcGRhdGEgPSB3bTgzMXgtPmRldi0+cGxhdGZvcm1fZGF0YTsKLQlpbnQgaWQgPSBwZGV2LT5pZCAlIEFSUkFZX1NJWkUocGRhdGEtPmxkbyk7CisJaW50IGlkOwogCXN0cnVjdCB3bTgzMXhfbGRvICpsZG87CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IHJldCwgaXJxOwogCisJaWYgKHBkYXRhICYmIHBkYXRhLT53bTgzMXhfbnVtKQorCQlpZCA9IChwZGF0YS0+d204MzF4X251bSAqIDEwKSArIDE7CisJZWxzZQorCQlpZCA9IDA7CisJaWQgPSBwZGV2LT5pZCAtIGlkOworCiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiUHJvYmluZyBMRE8lZFxuIiwgaWQgKyAxKTsKIAogCWlmIChwZGF0YSA9PSBOVUxMIHx8IHBkYXRhLT5sZG9baWRdID09IE5VTEwpCkBAIC03NjQsMTEgKzc3NiwxOCBAQAogewogCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKIAlzdHJ1Y3Qgd204MzF4X3BkYXRhICpwZGF0YSA9IHdtODMxeC0+ZGV2LT5wbGF0Zm9ybV9kYXRhOwotCWludCBpZCA9IHBkZXYtPmlkICUgQVJSQVlfU0laRShwZGF0YS0+bGRvKTsKKwlpbnQgaWQ7CiAJc3RydWN0IHdtODMxeF9sZG8gKmxkbzsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlpbnQgcmV0OwogCisJaWYgKHBkYXRhICYmIHBkYXRhLT53bTgzMXhfbnVtKQorCQlpZCA9IChwZGF0YS0+d204MzF4X251bSAqIDEwKSArIDE7CisJZWxzZQorCQlpZCA9IDA7CisJaWQgPSBwZGV2LT5pZCAtIGlkOworCisKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICJQcm9iaW5nIExETyVkXG4iLCBpZCArIDEpOwogCiAJaWYgKHBkYXRhID09IE5VTEwgfHwgcGRhdGEtPmxkb1tpZF0gPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODk5NC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODk5NC1yZWd1bGF0b3IuYwppbmRleCAzNWIyOTU4Li4xYTZhNjkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci93bTg5OTQtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204OTk0LXJlZ3VsYXRvci5jCkBAIC00Myw3ICs0Myw3IEBACiAJaWYgKCFsZG8tPmVuYWJsZSkKIAkJcmV0dXJuIDA7CiAKLQlncGlvX3NldF92YWx1ZShsZG8tPmVuYWJsZSwgMSk7CisJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAobGRvLT5lbmFibGUsIDEpOwogCWxkby0+aXNfZW5hYmxlZCA9IHRydWU7CiAKIAlyZXR1cm4gMDsKQEAgLTU3LDcgKzU3LDcgQEAKIAlpZiAoIWxkby0+ZW5hYmxlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWdwaW9fc2V0X3ZhbHVlKGxkby0+ZW5hYmxlLCAwKTsKKwlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChsZG8tPmVuYWJsZSwgMCk7CiAJbGRvLT5pc19lbmFibGVkID0gZmFsc2U7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1vbWFwLmMgYi9kcml2ZXJzL3J0Yy9ydGMtb21hcC5jCmluZGV4IGJjYWU4ZGQuLjc3ODkwMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1vbWFwLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLW9tYXAuYwpAQCAtMzY4LDcgKzM2OCw3IEBACiAJCXByX2luZm8oIiVzOiBhbHJlYWR5IHJ1bm5pbmdcbiIsIHBkZXYtPm5hbWUpOwogCiAJLyogZm9yY2UgdG8gMjQgaG91ciBtb2RlICovCi0JbmV3X2N0cmwgPSByZWcgJiB+KE9NQVBfUlRDX0NUUkxfU1BMSVR8T01BUF9SVENfQ1RSTF9BVVRPX0NPTVApOworCW5ld19jdHJsID0gcmVnICYgKE9NQVBfUlRDX0NUUkxfU1BMSVR8T01BUF9SVENfQ1RSTF9BVVRPX0NPTVApOwogCW5ld19jdHJsIHw9IE9NQVBfUlRDX0NUUkxfU1RPUDsKIAogCS8qIEJPQVJELVNQRUNJRklDIENVU1RPTUlaQVRJT04gQ0FOIEdPIEhFUkU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYwppbmRleCA0MzI0NDRhLi5hMWQzZGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIAogI2luY2x1ZGUgPGFzbS9jY3dkZXYuaD4KICNpbmNsdWRlIDxhc20vZWJjZGljLmg+CkBAIC04ODgsMTEgKzg4OSwxMSBAQAogewogCWNoYXIgKmJ1ZmZlcjsKIAotCWJ1ZmZlciA9IGttYWxsb2ModXNlcl9sZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlidWZmZXIgPSB2bWFsbG9jKHVzZXJfbGVuICsgMSk7CiAJaWYgKGJ1ZmZlciA9PSBOVUxMKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAlpZiAoY29weV9mcm9tX3VzZXIoYnVmZmVyLCB1c2VyX2J1ZiwgdXNlcl9sZW4pICE9IDApIHsKLQkJa2ZyZWUoYnVmZmVyKTsKKwkJdmZyZWUoYnVmZmVyKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CiAJfQogCS8qIGdvdCB0aGUgc3RyaW5nLCBub3cgc3RyaXAgbGluZWZlZWQuICovCkBAIC05MzAsNyArOTMxLDcgQEAKIAkJZGFzZF9wcm9maWxlX29mZihwcm9mKTsKIAl9IGVsc2UKIAkJcmMgPSAtRUlOVkFMOwotCWtmcmVlKGJ1ZmZlcik7CisJdmZyZWUoYnVmZmVyKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTEwNDIsNyArMTA0Myw3IEBACiAJCWRhc2RfZ2xvYmFsX3Byb2ZpbGVfbGV2ZWwgPSBEQVNEX1BST0ZJTEVfT0ZGOwogCX0gZWxzZQogCQlyYyA9IC1FSU5WQUw7Ci0Ja2ZyZWUoYnVmZmVyKTsKKwl2ZnJlZShidWZmZXIpOwogCXJldHVybiByYzsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jCmluZGV4IDMwZmI5NzkuLjZlODM1YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMKQEAgLTE0NjEsNiArMTQ2MSwxNSBAQAogCQkJCSJSZWFkIGRldmljZSBjaGFyYWN0ZXJpc3RpYyBmYWlsZWQsIHJjPSVkIiwgcmMpOwogCQlnb3RvIG91dF9lcnIzOwogCX0KKworCWlmICgoZGV2aWNlLT5mZWF0dXJlcyAmIERBU0RfRkVBVFVSRV9VU0VSQVcpICYmCisJICAgICEocHJpdmF0ZS0+cmRjX2RhdGEuZmFjaWxpdGllcy5SVF9pbl9MUikpIHsKKwkJZGV2X2VycigmZGV2aWNlLT5jZGV2LT5kZXYsICJUaGUgc3RvcmFnZSBzZXJ2ZXIgZG9lcyBub3QgIgorCQkJInN1cHBvcnQgcmF3LXRyYWNrIGFjY2Vzc1xuIik7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZXJyMzsKKwl9CisKIAkvKiBmaW5kIHRoZSB2YWxpZCBjeWxpbmRlciBzaXplICovCiAJaWYgKHByaXZhdGUtPnJkY19kYXRhLm5vX2N5bCA9PSBMVl9DT01QQVRfQ1lMICYmCiAJICAgIHByaXZhdGUtPnJkY19kYXRhLmxvbmdfbm9fY3lsKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfcHJvYy5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfcHJvYy5jCmluZGV4IDZjM2M1MzYuLmUxMjk4OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX3Byb2MuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9wcm9jLmMKQEAgLTMxMiwxNCArMzEyLDE0IEBACiAJCXByX2luZm8oIlRoZSBzdGF0aXN0aWNzIGhhdmUgYmVlbiByZXNldFxuIik7CiAJfSBlbHNlCiAJCWdvdG8gb3V0X3BhcnNlX2Vycm9yOwotCWtmcmVlKGJ1ZmZlcik7CisJdmZyZWUoYnVmZmVyKTsKIAlyZXR1cm4gdXNlcl9sZW47CiBvdXRfcGFyc2VfZXJyb3I6CiAJcmMgPSAtRUlOVkFMOwogCXByX3dhcm5pbmcoIiVzIGlzIG5vdCBhIHN1cHBvcnRlZCB2YWx1ZSBmb3IgL3Byb2MvZGFzZC9zdGF0aXN0aWNzXG4iLAogCQlzdHIpOwogb3V0X2Vycm9yOgotCWtmcmVlKGJ1ZmZlcik7CisJdmZyZWUoYnVmZmVyKTsKIAlyZXR1cm4gcmM7CiAjZWxzZQogCXByX3dhcm5pbmcoIi9wcm9jL2Rhc2Qvc3RhdGlzdGljczogaXMgbm90IGFjdGl2YXRlZCBpbiB0aGlzIGtlcm5lbFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2FzeW5jLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2FzeW5jLmMKaW5kZXggN2FkMzBlNy4uNWY5ZjkyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9hc3luYy5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfYXN5bmMuYwpAQCAtODIsMTIgKzgyLDkgQEAKIAkJCXJldHVybiAtRUZBVUxUOwogCX0gZWxzZSB7CiAJCWxlbiA9ICpjb3VudDsKLQkJcmMgPSBjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZikpOwotCQlpZiAocmMgIT0gMCkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9ICdcMCc7Ci0JCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDAsICZ2YWwpICE9IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmMgPSBrc3RydG91bF9mcm9tX3VzZXIoYnVmZmVyLCBsZW4sIDAsICZ2YWwpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CiAJCWlmICh2YWwgIT0gMCAmJiB2YWwgIT0gMSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQljYWxsaG9tZV9lbmFibGVkID0gdmFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9xZGlvLmggYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uaAppbmRleCA3YmM2NDNmLi5lNWM5NjY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uaAorKysgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uaApAQCAtMTQsNiArMTQsOCBAQAogI2luY2x1ZGUgImNoc2MuaCIKIAogI2RlZmluZSBRRElPX0JVU1lfQklUX1BBVElFTkNFCQkoMTAwIDw8IDEyKQkvKiAxMDAgbWljcm9zZWNvbmRzICovCisjZGVmaW5lIFFESU9fQlVTWV9CSVRfUkVUUllfREVMQVkJMTAJCS8qIDEwIG1pbGxpc2Vjb25kcyAqLworI2RlZmluZSBRRElPX0JVU1lfQklUX1JFVFJJRVMJCTEwMDAJCS8qID0gMTBzIHJldHJ5IHRpbWUgKi8KICNkZWZpbmUgUURJT19JTlBVVF9USFJFU0hPTEQJCSg1MDAgPDwgMTIpCS8qIDUwMCBtaWNyb3NlY29uZHMgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vcWRpb19kZWJ1Zy5jIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvX2RlYnVnLmMKaW5kZXggZjhiMDNhNi4uMGU2MTVjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX2RlYnVnLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvX2RlYnVnLmMKQEAgLTE4OCwxOSArMTg4LDEzIEBACiAJc3RydWN0IHFkaW9faXJxICppcnFfcHRyID0gc2VxLT5wcml2YXRlOwogCXN0cnVjdCBxZGlvX3EgKnE7CiAJdW5zaWduZWQgbG9uZyB2YWw7Ci0JY2hhciBidWZbOF07CiAJaW50IHJldCwgaTsKIAogCWlmICghaXJxX3B0cikKIAkJcmV0dXJuIDA7Ci0JaWYgKGNvdW50ID49IHNpemVvZihidWYpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoY29weV9mcm9tX3VzZXIoJmJ1ZiwgdWJ1ZiwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlidWZbY291bnRdID0gMDsKIAotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOwotCWlmIChyZXQgPCAwKQorCXJldCA9IGtzdHJ0b3VsX2Zyb21fdXNlcih1YnVmLCBjb3VudCwgMTAsICZ2YWwpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlzd2l0Y2ggKHZhbCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX21haW4uYyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpb19tYWluLmMKaW5kZXggZTU4MTY5Yy4uMjg4YzkxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fbWFpbi5jCkBAIC0zMTMsNyArMzEzLDcgQEAKIAl1bnNpZ25lZCBsb25nIHNjaGlkID0gKigodTMyICopICZxLT5pcnFfcHRyLT5zY2hpZCk7CiAJdW5zaWduZWQgaW50IGZjID0gUURJT19TSUdBX1dSSVRFOwogCXU2NCBzdGFydF90aW1lID0gMDsKLQlpbnQgY2M7CisJaW50IHJldHJpZXMgPSAwLCBjYzsKIAogCWlmIChpc19xZWJzbShxKSkgewogCQlzY2hpZCA9IHEtPmlycV9wdHItPnNjaF90b2tlbjsKQEAgLTMyNSw2ICszMjUsNyBAQAogCS8qIGhpcGVyc29ja2V0IGJ1c3kgY29uZGl0aW9uICovCiAJaWYgKHVubGlrZWx5KCpidXN5X2JpdCkpIHsKIAkJV0FSTl9PTihxdWV1ZV90eXBlKHEpICE9IFFESU9fSVFESU9fUUZNVCB8fCBjYyAhPSAyKTsKKwkJcmV0cmllcysrOwogCiAJCWlmICghc3RhcnRfdGltZSkgewogCQkJc3RhcnRfdGltZSA9IGdldF9jbG9jaygpOwpAQCAtMzMzLDYgKzMzNCwxMSBAQAogCQlpZiAoKGdldF9jbG9jaygpIC0gc3RhcnRfdGltZSkgPCBRRElPX0JVU1lfQklUX1BBVElFTkNFKQogCQkJZ290byBhZ2FpbjsKIAl9CisJaWYgKHJldHJpZXMpIHsKKwkJREJGX0RFVl9FVkVOVChEQkZfV0FSTiwgcS0+aXJxX3B0ciwKKwkJCSAgICAgICIlNHggY2MyIEJCMTolMWQiLCBTQ0hfTk8ocSksIHEtPm5yKTsKKwkJREJGX0RFVl9FVkVOVChEQkZfV0FSTiwgcS0+aXJxX3B0ciwgImNvdW50OiV1IiwgcmV0cmllcyk7CisJfQogCXJldHVybiBjYzsKIH0KIApAQCAtNzI4LDEzICs3MzQsMTQgQEAKIAogc3RhdGljIGludCBxZGlvX2tpY2tfb3V0Ym91bmRfcShzdHJ1Y3QgcWRpb19xICpxKQogeworCWludCByZXRyaWVzID0gMCwgY2M7CiAJdW5zaWduZWQgaW50IGJ1c3lfYml0OwotCWludCBjYzsKIAogCWlmICghbmVlZF9zaWdhX291dChxKSkKIAkJcmV0dXJuIDA7CiAKIAlEQkZfREVWX0VWRU5UKERCRl9JTkZPLCBxLT5pcnFfcHRyLCAic2lnYS13OiUxZCIsIHEtPm5yKTsKK3JldHJ5OgogCXFwZXJmX2luYyhxLCBzaWdhX3dyaXRlKTsKIAogCWNjID0gcWRpb19zaWdhX291dHB1dChxLCAmYnVzeV9iaXQpOwpAQCAtNzQzLDcgKzc1MCwxMSBAQAogCQlicmVhazsKIAljYXNlIDI6CiAJCWlmIChidXN5X2JpdCkgewotCQkJREJGX0VSUk9SKCIlNHggY2MyIFJFUDolMWQiLCBTQ0hfTk8ocSksIHEtPm5yKTsKKwkJCXdoaWxlICgrK3JldHJpZXMgPCBRRElPX0JVU1lfQklUX1JFVFJJRVMpIHsKKwkJCQltZGVsYXkoUURJT19CVVNZX0JJVF9SRVRSWV9ERUxBWSk7CisJCQkJZ290byByZXRyeTsKKwkJCX0KKwkJCURCRl9FUlJPUigiJTR4IGNjMiBCQkM6JTFkIiwgU0NIX05PKHEpLCBxLT5ucik7CiAJCQljYyB8PSBRRElPX0VSUk9SX1NJR0FfQlVTWTsKIAkJfSBlbHNlCiAJCQlEQkZfREVWX0VWRU5UKERCRl9JTkZPLCBxLT5pcnFfcHRyLCAic2lnYS13IGNjMjolMWQiLCBxLT5ucik7CkBAIC03NTMsNiArNzY0LDEwIEBACiAJCURCRl9FUlJPUigiJTR4IFNJR0EtVzolMWQiLCBTQ0hfTk8ocSksIGNjKTsKIAkJYnJlYWs7CiAJfQorCWlmIChyZXRyaWVzKSB7CisJCURCRl9FUlJPUigiJTR4IGNjMiBCQjI6JTFkIiwgU0NIX05PKHEpLCBxLT5ucik7CisJCURCRl9FUlJPUigiY291bnQ6JXUiLCByZXRyaWVzKTsKKwl9CiAJcmV0dXJuIGNjOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYS5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmEuaAppbmRleCAzYjBhZjExLi5hNzk2ZGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYS5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhLmgKQEAgLTI3LDYgKzI3LDcgQEAKIHN0cnVjdCBiZmFfczsKIAogdHlwZWRlZiB2b2lkICgqYmZhX2lzcl9mdW5jX3QpIChzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmaV9tc2dfcyAqbSk7Cit0eXBlZGVmIHZvaWQgKCpiZmFfY2JfY2Jmbl9zdGF0dXNfdCkgKHZvaWQgKmNiYXJnLCBiZmFfc3RhdHVzX3Qgc3RhdHVzKTsKIAogLyoKICAqIEludGVycnVwdCBtZXNzYWdlIGhhbmRsZXJzCkBAIC0xMjEsNiArMTIyLDcgQEAKICNkZWZpbmUgYmZhX2NiX3F1ZXVlKF9fYmZhLCBfX2hjYl9xZSwgX19jYmZuLCBfX2NiYXJnKSBkbyB7CVwKIAkJKF9faGNiX3FlKS0+Y2JmbiAgPSAoX19jYmZuKTsgICAgICBcCiAJCShfX2hjYl9xZSktPmNiYXJnID0gKF9fY2JhcmcpOyAgICAgIFwKKwkJKF9faGNiX3FlKS0+cHJlX3JtdiA9IEJGQV9GQUxTRTsJCVwKIAkJbGlzdF9hZGRfdGFpbCgmKF9faGNiX3FlKS0+cWUsICYoX19iZmEpLT5jb21wX3EpOyAgICAgIFwKIAl9IHdoaWxlICgwKQogCkBAIC0xMzUsNiArMTM3LDExIEBACiAJCX0JCQkJCQkJXAogCX0gd2hpbGUgKDApCiAKKyNkZWZpbmUgYmZhX2NiX3F1ZXVlX3N0YXR1cyhfX2JmYSwgX19oY2JfcWUsIF9fc3RhdHVzKSBkbyB7CQlcCisJCShfX2hjYl9xZSktPmZ3X3N0YXR1cyA9IChfX3N0YXR1cyk7CQkJXAorCQlsaXN0X2FkZF90YWlsKCYoX19oY2JfcWUpLT5xZSwgJihfX2JmYSktPmNvbXBfcSk7CVwKK30gd2hpbGUgKDApCisKICNkZWZpbmUgYmZhX2NiX3F1ZXVlX2RvbmUoX19oY2JfcWUpIGRvIHsJXAogCQkoX19oY2JfcWUpLT5vbmNlID0gQkZBX0ZBTFNFOwlcCiAJfSB3aGlsZSAoMCkKQEAgLTE3Nyw3ICsxODQsNyBAQAogc3RydWN0IGJmYV9od2lmX3MgewogCXZvaWQgKCpod19yZWdpbml0KShzdHJ1Y3QgYmZhX3MgKmJmYSk7CiAJdm9pZCAoKmh3X3JlcXFfYWNrKShzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJlcXEpOwotCXZvaWQgKCpod19yc3BxX2Fjaykoc3RydWN0IGJmYV9zICpiZmEsIGludCByc3BxKTsKKwl2b2lkICgqaHdfcnNwcV9hY2spKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcnNwcSwgdTMyIGNpKTsKIAl2b2lkICgqaHdfbXNpeF9pbml0KShzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IG52ZWNzKTsKIAl2b2lkICgqaHdfbXNpeF9jdHJsX2luc3RhbGwpKHN0cnVjdCBiZmFfcyAqYmZhKTsKIAl2b2lkICgqaHdfbXNpeF9xdWV1ZV9pbnN0YWxsKShzdHJ1Y3QgYmZhX3MgKmJmYSk7CkBAIC0yNjgsMTAgKzI3NSw4IEBACiAJKChfX2JmYSktPmlvY2ZjLmh3aWYuaHdfbXNpeF9xdWV1ZV9pbnN0YWxsKF9fYmZhKSkKICNkZWZpbmUgYmZhX21zaXhfdW5pbnN0YWxsKF9fYmZhKQkJCQkJXAogCSgoX19iZmEpLT5pb2NmYy5od2lmLmh3X21zaXhfdW5pbnN0YWxsKF9fYmZhKSkKLSNkZWZpbmUgYmZhX2lzcl9yc3BxX2FjayhfX2JmYSwgX19xdWV1ZSkgZG8gewkJCQlcCi0JaWYgKChfX2JmYSktPmlvY2ZjLmh3aWYuaHdfcnNwcV9hY2spCQkJCVwKLQkJKF9fYmZhKS0+aW9jZmMuaHdpZi5od19yc3BxX2FjayhfX2JmYSwgX19xdWV1ZSk7CVwKLX0gd2hpbGUgKDApCisjZGVmaW5lIGJmYV9pc3JfcnNwcV9hY2soX19iZmEsIF9fcXVldWUsIF9fY2kpCQkJCVwKKwkoKF9fYmZhKS0+aW9jZmMuaHdpZi5od19yc3BxX2FjayhfX2JmYSwgX19xdWV1ZSwgX19jaSkpCiAjZGVmaW5lIGJmYV9pc3JfcmVxcV9hY2soX19iZmEsIF9fcXVldWUpIGRvIHsJCQkJXAogCWlmICgoX19iZmEpLT5pb2NmYy5od2lmLmh3X3JlcXFfYWNrKQkJCQlcCiAJCShfX2JmYSktPmlvY2ZjLmh3aWYuaHdfcmVxcV9hY2soX19iZmEsIF9fcXVldWUpOwlcCkBAIC0zMTEsNyArMzE2LDcgQEAKIHZvaWQgYmZhX21zaXhfbHB1X2VycihzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHZlYyk7CiAKIHZvaWQgYmZhX2h3Y2JfcmVnaW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSk7Ci12b2lkIGJmYV9od2NiX3JzcHFfYWNrKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcnNwcSk7Cit2b2lkIGJmYV9od2NiX3JzcHFfYWNrKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcnNwcSwgdTMyIGNpKTsKIHZvaWQgYmZhX2h3Y2JfbXNpeF9pbml0KHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgbnZlY3MpOwogdm9pZCBiZmFfaHdjYl9tc2l4X2N0cmxfaW5zdGFsbChzdHJ1Y3QgYmZhX3MgKmJmYSk7CiB2b2lkIGJmYV9od2NiX21zaXhfcXVldWVfaW5zdGFsbChzdHJ1Y3QgYmZhX3MgKmJmYSk7CkBAIC0zMjQsNyArMzI5LDggQEAKIHZvaWQgYmZhX2h3Y3RfcmVnaW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSk7CiB2b2lkIGJmYV9od2N0Ml9yZWdpbml0KHN0cnVjdCBiZmFfcyAqYmZhKTsKIHZvaWQgYmZhX2h3Y3RfcmVxcV9hY2soc3RydWN0IGJmYV9zICpiZmEsIGludCByc3BxKTsKLXZvaWQgYmZhX2h3Y3RfcnNwcV9hY2soc3RydWN0IGJmYV9zICpiZmEsIGludCByc3BxKTsKK3ZvaWQgYmZhX2h3Y3RfcnNwcV9hY2soc3RydWN0IGJmYV9zICpiZmEsIGludCByc3BxLCB1MzIgY2kpOwordm9pZCBiZmFfaHdjdDJfcnNwcV9hY2soc3RydWN0IGJmYV9zICpiZmEsIGludCByc3BxLCB1MzIgY2kpOwogdm9pZCBiZmFfaHdjdF9tc2l4X2luaXQoc3RydWN0IGJmYV9zICpiZmEsIGludCBudmVjcyk7CiB2b2lkIGJmYV9od2N0X21zaXhfY3RybF9pbnN0YWxsKHN0cnVjdCBiZmFfcyAqYmZhKTsKIHZvaWQgYmZhX2h3Y3RfbXNpeF9xdWV1ZV9pbnN0YWxsKHN0cnVjdCBiZmFfcyAqYmZhKTsKQEAgLTM3Niw2ICszODIsMjIgQEAKICNkZWZpbmUgYmZhX2dldF9md19jbG9ja19yZXMoX19iZmEpCQlcCiAJKChfX2JmYSktPmlvY2ZjLmNmZ3JzcC0+ZndjZmcuZndfdGlja19yZXMpCiAKKy8qCisgKiBsdW4gbWFzayBtYWNyb3MgcmV0dXJuIE5VTEwgd2hlbiBtaW4gY2ZnIGlzIGVuYWJsZWQgYW5kIHRoZXJlIGlzCisgKiBubyBtZW1vcnkgYWxsb2NhdGVkIGZvciBsdW5tYXNrLgorICovCisjZGVmaW5lIGJmYV9nZXRfbHVuX21hc2soX19iZmEpCQkJCQlcCisJKCgmKF9fYmZhKS0+bW9kdWxlcy5kY29uZl9tb2QpLT5taW5fY2ZnKSA/IE5VTEwgOglcCisJICgmKEJGQV9EQ09ORl9NT0QoX19iZmEpLT5kY29uZi0+bHVuX21hc2spKQorCisjZGVmaW5lIGJmYV9nZXRfbHVuX21hc2tfbGlzdChfYmZhKQkJCQlcCisJKCgmKF9iZmEpLT5tb2R1bGVzLmRjb25mX21vZCktPm1pbl9jZmcpID8gTlVMTCA6CVwKKwkgKGJmYV9nZXRfbHVuX21hc2soX2JmYSktPmx1bl9saXN0KQorCisjZGVmaW5lIGJmYV9nZXRfbHVuX21hc2tfc3RhdHVzKF9iZmEpCQkJCVwKKwkoKCgmKF9iZmEpLT5tb2R1bGVzLmRjb25mX21vZCktPm1pbl9jZmcpCQlcCisJID8gQkZBX0xVTk1BU0tfTUlOQ0ZHIDogKChiZmFfZ2V0X2x1bl9tYXNrKF9iZmEpKS0+c3RhdHVzKSkKKwogdm9pZCBiZmFfZ2V0X3BjaWlkcyhzdHJ1Y3QgYmZhX3BjaWlkX3MgKipwY2lpZHMsIGludCAqbnBjaWlkcyk7CiB2b2lkIGJmYV9jZmdfZ2V0X2RlZmF1bHQoc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnKTsKIHZvaWQgYmZhX2NmZ19nZXRfbWluKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZyk7CkBAIC00MDYsNyArNDI4LDIyIEBACiAKIHZvaWQgYmZhX2lvY2ZjX2VuYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSk7CiB2b2lkIGJmYV9pb2NmY19kaXNhYmxlKHN0cnVjdCBiZmFfcyAqYmZhKTsKK3ZvaWQgYmZhX2lvY2ZjX2NiX2Rjb25mX21vZGluaXQoc3RydWN0IGJmYV9zICpiZmEsIGJmYV9zdGF0dXNfdCBzdGF0dXMpOwogI2RlZmluZSBiZmFfdGltZXJfc3RhcnQoX2JmYSwgX3RpbWVyLCBfdGltZXJjYiwgX2FyZywgX3RpbWVvdXQpCQlcCiAJYmZhX3RpbWVyX2JlZ2luKCYoX2JmYSktPnRpbWVyX21vZCwgX3RpbWVyLCBfdGltZXJjYiwgX2FyZywgX3RpbWVvdXQpCiAKK3N0cnVjdCBiZmFfY2JfcGVuZGluZ19xX3MgeworCXN0cnVjdCBiZmFfY2JfcWVfcwloY2JfcWU7CisJdm9pZAkJCSpkYXRhOyAgLyogRHJpdmVyIGJ1ZmZlciAqLworfTsKKworLyogQ29tbW9uIG1hY3JvcyB0byBvcGVyYXRlIG9uIHBlbmRpbmcgc3RhdHMvYXR0ciBhcGlzICovCisjZGVmaW5lIGJmYV9wZW5kaW5nX3FfaW5pdChfX3FlLCBfX2NiZm4sIF9fY2JhcmcsIF9fZGF0YSkgZG8gewlcCisJYmZhX3FfcWVfaW5pdCgmKChfX3FlKS0+aGNiX3FlLnFlKSk7CQkJXAorCShfX3FlKS0+aGNiX3FlLmNiZm4gPSAoX19jYmZuKTsJCQkJXAorCShfX3FlKS0+aGNiX3FlLmNiYXJnID0gKF9fY2JhcmcpOwkJCVwKKwkoX19xZSktPmhjYl9xZS5wcmVfcm12ID0gQkZBX1RSVUU7CQkJXAorCShfX3FlKS0+ZGF0YSA9IChfX2RhdGEpOwkJCQlcCit9IHdoaWxlICgwKQorCiAjZW5kaWYgLyogX19CRkFfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9jb3JlLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9jb3JlLmMKaW5kZXggYzM4ZTU4OS4uNGJkNTQ2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfY29yZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2NvcmUuYwpAQCAtMzMsNiArMzMsNyBAQAogCSZoYWxfbW9kX3VmLAogCSZoYWxfbW9kX3Jwb3J0LAogCSZoYWxfbW9kX2ZjcCwKKwkmaGFsX21vZF9kY29uZiwKIAlOVUxMCiB9OwogCkBAIC0yMzcsOCArMjM4LDYgQEAKIAl1MzIJcGksIGNpOwogCXN0cnVjdCBsaXN0X2hlYWQgKndhaXRxOwogCi0JYmZhX2lzcl9yc3BxX2FjayhiZmEsIHFpZCk7Ci0KIAljaSA9IGJmYV9yc3BxX2NpKGJmYSwgcWlkKTsKIAlwaSA9IGJmYV9yc3BxX3BpKGJmYSwgcWlkKTsKIApAQCAtMjUxLDExICsyNTAsOSBAQAogCX0KIAogCS8qCi0JICogdXBkYXRlIENJCisJICogYWNrbm93bGVkZ2UgUk1FIGNvbXBsZXRpb25zIGFuZCB1cGRhdGUgQ0kKIAkgKi8KLQliZmFfcnNwcV9jaShiZmEsIHFpZCkgPSBwaTsKLQl3cml0ZWwocGksIGJmYS0+aW9jZmMuYmZhX3JlZ3Mucm1lX3FfY2lbcWlkXSk7Ci0JbW1pb3diKCk7CisJYmZhX2lzcl9yc3BxX2FjayhiZmEsIHFpZCwgY2kpOwogCiAJLyoKIAkgKiBSZXN1bWUgYW55IHBlbmRpbmcgcmVxdWVzdHMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcmVxcS4KQEAgLTMyNSwyMyArMzIyLDE5IEBACiAJaW50IHF1ZXVlOwogCiAJaW50ciA9IHJlYWRsKGJmYS0+aW9jZmMuYmZhX3JlZ3MuaW50cl9zdGF0dXMpOwotCWlmICghaW50cikKLQkJcmV0dXJuIEJGQV9GQUxTRTsKIAogCXFpbnRyID0gaW50ciAmIChfX0hGTl9JTlRfUk1FX01BU0sgfCBfX0hGTl9JTlRfQ1BFX01BU0spOwogCWlmIChxaW50cikKIAkJd3JpdGVsKHFpbnRyLCBiZmEtPmlvY2ZjLmJmYV9yZWdzLmludHJfc3RhdHVzKTsKIAogCS8qCi0JICogUk1FIGNvbXBsZXRpb24gcXVldWUgaW50ZXJydXB0CisJICogVW5jb25kaXRpb25hbCBSTUUgY29tcGxldGlvbiBxdWV1ZSBpbnRlcnJ1cHQKIAkgKi8KLQlxaW50ciA9IGludHIgJiBfX0hGTl9JTlRfUk1FX01BU0s7Ci0JaWYgKHFpbnRyICYmIGJmYS0+cXVldWVfcHJvY2VzcykgeworCWlmIChiZmEtPnF1ZXVlX3Byb2Nlc3MpIHsKIAkJZm9yIChxdWV1ZSA9IDA7IHF1ZXVlIDwgQkZJX0lPQ19NQVhfQ1FTOyBxdWV1ZSsrKQogCQkJYmZhX2lzcl9yc3BxKGJmYSwgcXVldWUpOwogCX0KIAotCWludHIgJj0gfnFpbnRyOwogCWlmICghaW50cikKIAkJcmV0dXJuIEJGQV9UUlVFOwogCkBAIC00MzIsNyArNDI1LDggQEAKIAkJCQkgICBfX0hGTl9JTlRfTUJPWF9MUFUxX0NUMik7CiAJCWludHIgICAgJj0gX19IRk5fSU5UX0VSUl9NQVNLX0NUMjsKIAl9IGVsc2UgewotCQloYWx0X2lzciA9IGludHIgJiBfX0hGTl9JTlRfTExfSEFMVDsKKwkJaGFsdF9pc3IgPSBiZmFfYXNpY19pZF9jdChiZmEtPmlvYy5wY2lkZXYuZGV2aWNlX2lkKSA/CisJCQkJCSAgKGludHIgJiBfX0hGTl9JTlRfTExfSEFMVCkgOiAwOwogCQlwc3NfaXNyICA9IGludHIgJiBfX0hGTl9JTlRfRVJSX1BTUzsKIAkJbHB1X2lzciAgPSBpbnRyICYgKF9fSEZOX0lOVF9NQk9YX0xQVTAgfCBfX0hGTl9JTlRfTUJPWF9MUFUxKTsKIAkJaW50ciAgICAmPSBfX0hGTl9JTlRfRVJSX01BU0s7CkBAIC01NzgsNyArNTcyLDcgQEAKIAl9IGVsc2UgewogCQlpb2NmYy0+aHdpZi5od19yZWdpbml0ID0gYmZhX2h3Y2JfcmVnaW5pdDsKIAkJaW9jZmMtPmh3aWYuaHdfcmVxcV9hY2sgPSBOVUxMOwotCQlpb2NmYy0+aHdpZi5od19yc3BxX2FjayA9IE5VTEw7CisJCWlvY2ZjLT5od2lmLmh3X3JzcHFfYWNrID0gYmZhX2h3Y2JfcnNwcV9hY2s7CiAJCWlvY2ZjLT5od2lmLmh3X21zaXhfaW5pdCA9IGJmYV9od2NiX21zaXhfaW5pdDsKIAkJaW9jZmMtPmh3aWYuaHdfbXNpeF9jdHJsX2luc3RhbGwgPSBiZmFfaHdjYl9tc2l4X2N0cmxfaW5zdGFsbDsKIAkJaW9jZmMtPmh3aWYuaHdfbXNpeF9xdWV1ZV9pbnN0YWxsID0gYmZhX2h3Y2JfbXNpeF9xdWV1ZV9pbnN0YWxsOwpAQCAtNTk1LDcgKzU4OSw3IEBACiAJaWYgKGJmYV9hc2ljX2lkX2N0MihiZmFfaW9jX2RldmlkKCZiZmEtPmlvYykpKSB7CiAJCWlvY2ZjLT5od2lmLmh3X3JlZ2luaXQgPSBiZmFfaHdjdDJfcmVnaW5pdDsKIAkJaW9jZmMtPmh3aWYuaHdfaXNyX21vZGVfc2V0ID0gTlVMTDsKLQkJaW9jZmMtPmh3aWYuaHdfcnNwcV9hY2sgPSBOVUxMOworCQlpb2NmYy0+aHdpZi5od19yc3BxX2FjayA9IGJmYV9od2N0Ml9yc3BxX2FjazsKIAl9CiAKIAlpb2NmYy0+aHdpZi5od19yZWdpbml0KGJmYSk7CkBAIC02ODUsNyArNjc5LDcgQEAKIAogCWJmYS0+cXVldWVfcHJvY2VzcyA9IEJGQV9UUlVFOwogCWZvciAoaSA9IDA7IGkgPCBCRklfSU9DX01BWF9DUVM7IGkrKykKLQkJYmZhX2lzcl9yc3BxX2FjayhiZmEsIGkpOworCQliZmFfaXNyX3JzcHFfYWNrKGJmYSwgaSwgYmZhX3JzcHFfY2koYmZhLCBpKSk7CiAKIAlmb3IgKGkgPSAwOyBoYWxfbW9kc1tpXTsgaSsrKQogCQloYWxfbW9kc1tpXS0+c3RhcnQoYmZhKTsKQEAgLTcwOSw3ICs3MDMsNyBAQAogCXN0cnVjdCBiZmFfcwkqYmZhID0gYmZhX2FyZzsKIAogCWlmIChjb21wbGV0ZSkgewotCQlpZiAoYmZhLT5pb2NmYy5jZmdkb25lKQorCQlpZiAoYmZhLT5pb2NmYy5jZmdkb25lICYmIEJGQV9EQ09ORl9NT0QoYmZhKS0+Zmxhc2hkb25lKQogCQkJYmZhX2NiX2luaXQoYmZhLT5iZmFkLCBCRkFfU1RBVFVTX09LKTsKIAkJZWxzZQogCQkJYmZhX2NiX2luaXQoYmZhLT5iZmFkLCBCRkFfU1RBVFVTX0ZBSUxFRCk7CkBAIC04MjIsOSArODE2LDExIEBACiAJICovCiAJYmZhX2ZjcG9ydF9pbml0KGJmYSk7CiAKLQlpZiAoaW9jZmMtPmFjdGlvbiA9PSBCRkFfSU9DRkNfQUNUX0lOSVQpCi0JCWJmYV9jYl9xdWV1ZShiZmEsICZpb2NmYy0+aW5pdF9oY2JfcWUsIGJmYV9pb2NmY19pbml0X2NiLCBiZmEpOwotCWVsc2UgeworCWlmIChpb2NmYy0+YWN0aW9uID09IEJGQV9JT0NGQ19BQ1RfSU5JVCkgeworCQlpZiAoQkZBX0RDT05GX01PRChiZmEpLT5mbGFzaGRvbmUgPT0gQkZBX1RSVUUpCisJCQliZmFfY2JfcXVldWUoYmZhLCAmaW9jZmMtPmluaXRfaGNiX3FlLAorCQkJCWJmYV9pb2NmY19pbml0X2NiLCBiZmEpOworCX0gZWxzZSB7CiAJCWlmIChiZmEtPmlvY2ZjLmFjdGlvbiA9PSBCRkFfSU9DRkNfQUNUX0VOQUJMRSkKIAkJCWJmYV9jYl9xdWV1ZShiZmEsICZiZmEtPmlvY2ZjLmVuX2hjYl9xZSwKIAkJCQkJYmZhX2lvY2ZjX2VuYWJsZV9jYiwgYmZhKTsKQEAgLTEwNDUsNiArMTA0MSw3IEBACiAJfQogCiAJYmZhX2lvY2ZjX3NlbmRfY2ZnKGJmYSk7CisJYmZhX2Rjb25mX21vZGluaXQoYmZhKTsKIH0KIAogLyoKQEAgLTEyMDcsNyArMTIwNCw5IEBACiAJYmZhLT5pb2NmYy5hY3Rpb24gPSBCRkFfSU9DRkNfQUNUX1NUT1A7CiAKIAliZmEtPnF1ZXVlX3Byb2Nlc3MgPSBCRkFfRkFMU0U7Ci0JYmZhX2lvY19kaXNhYmxlKCZiZmEtPmlvYyk7CisJYmZhX2Rjb25mX21vZGV4aXQoYmZhKTsKKwlpZiAoQkZBX0RDT05GX01PRChiZmEpLT5mbGFzaGRvbmUgPT0gQkZBX1RSVUUpCisJCWJmYV9pb2NfZGlzYWJsZSgmYmZhLT5pb2MpOwogfQogCiB2b2lkCkBAIC0xNTQwLDEwICsxNTM5LDE3IEBACiAJc3RydWN0IGxpc3RfaGVhZAkJKnFlOwogCXN0cnVjdCBsaXN0X2hlYWQJCSpxZW47CiAJc3RydWN0IGJmYV9jYl9xZV9zCSpoY2JfcWU7CisJYmZhX2NiX2NiZm5fc3RhdHVzX3QJY2JmbjsKIAogCWxpc3RfZm9yX2VhY2hfc2FmZShxZSwgcWVuLCBjb21wX3EpIHsKIAkJaGNiX3FlID0gKHN0cnVjdCBiZmFfY2JfcWVfcyAqKSBxZTsKLQkJaGNiX3FlLT5jYmZuKGhjYl9xZS0+Y2JhcmcsIEJGQV9UUlVFKTsKKwkJaWYgKGhjYl9xZS0+cHJlX3JtdikgeworCQkJLyogcWUgaXMgaW52YWxpZCBhZnRlciByZXR1cm4sIGRlcXVldWUgYmVmb3JlIGNiZm4oKSAqLworCQkJbGlzdF9kZWwocWUpOworCQkJY2JmbiA9IChiZmFfY2JfY2Jmbl9zdGF0dXNfdCkoaGNiX3FlLT5jYmZuKTsKKwkJCWNiZm4oaGNiX3FlLT5jYmFyZywgaGNiX3FlLT5md19zdGF0dXMpOworCQl9IGVsc2UKKwkJCWhjYl9xZS0+Y2JmbihoY2JfcWUtPmNiYXJnLCBCRkFfVFJVRSk7CiAJfQogfQogCkBAIC0xNTU2LDEwICsxNTYyLDIwIEBACiAJd2hpbGUgKCFsaXN0X2VtcHR5KGNvbXBfcSkpIHsKIAkJYmZhX3FfZGVxKGNvbXBfcSwgJnFlKTsKIAkJaGNiX3FlID0gKHN0cnVjdCBiZmFfY2JfcWVfcyAqKSBxZTsKKwkJV0FSTl9PTihoY2JfcWUtPnByZV9ybXYpOwogCQloY2JfcWUtPmNiZm4oaGNiX3FlLT5jYmFyZywgQkZBX0ZBTFNFKTsKIAl9CiB9CiAKK3ZvaWQKK2JmYV9pb2NmY19jYl9kY29uZl9tb2Rpbml0KHN0cnVjdCBiZmFfcyAqYmZhLCBiZmFfc3RhdHVzX3Qgc3RhdHVzKQoreworCWlmIChiZmEtPmlvY2ZjLmFjdGlvbiA9PSBCRkFfSU9DRkNfQUNUX0lOSVQpIHsKKwkJaWYgKGJmYS0+aW9jZmMuY2ZnZG9uZSA9PSBCRkFfVFJVRSkKKwkJCWJmYV9jYl9xdWV1ZShiZmEsICZiZmEtPmlvY2ZjLmluaXRfaGNiX3FlLAorCQkJCWJmYV9pb2NmY19pbml0X2NiLCBiZmEpOworCX0KK30KIAogLyoKICAqIFJldHVybiB0aGUgbGlzdCBvZiBQQ0kgdmVuZG9yL2RldmljZSBpZCBsaXN0cyBzdXBwb3J0ZWQgYnkgdGhpcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZGVmcy5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZGVmcy5oCmluZGV4IGVkOGQzMWIuLjdiM2QyMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2RlZnMuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9kZWZzLmgKQEAgLTE0NCw2ICsxNDQsNyBAQAogCUJGQV9TVEFUVVNfSU5WTERfREZTWgk9IDI0LAkvKiAgSW52YWxpZCBNYXggZGF0YSBmaWVsZCBzaXplICovCiAJQkZBX1NUQVRVU19DTURfTk9UU1VQUCAgPSAyNiwgICAvKiAgQ29tbWFuZC9BUEkgbm90IHN1cHBvcnRlZCAqLwogCUJGQV9TVEFUVVNfRkFCUklDX1JKVAk9IDI5LAkvKiAgUmVqZWN0IGZyb20gYXR0YWNoZWQgZmFicmljICovCisJQkZBX1NUQVRVU19VTktOT1dOX1ZXV04gPSAzMCwJLyogIFZQT1JUIFBXV04gbm90IGZvdW5kICovCiAJQkZBX1NUQVRVU19QT1JUX09GRkxJTkUgPSAzNCwJLyogIFBvcnQgaXMgbm90IG9ubGluZSAqLwogCUJGQV9TVEFUVVNfVlBPUlRfV1dOX0JQCT0gNDYsCS8qICBXV04gaXMgc2FtZSBhcyBiYXNlIHBvcnQncyBXV04gKi8KIAlCRkFfU1RBVFVTX1BPUlRfTk9UX0RJU0FCTEVEID0gNDcsIC8qIFBvcnQgbm90IGRpc2FibGVkIGRpc2FibGUgcG9ydCAqLwpAQCAtMTY0LDYgKzE2NSw4IEBACiAJQkZBX1NUQVRVU19JTlZBTElEX01BQyAgPSAxMzQsIC8qICBJbnZhbGlkIE1BQyBhZGRyZXNzICovCiAJQkZBX1NUQVRVU19QQkMJCT0gMTU0LCAvKiAgT3BlcmF0aW9uIG5vdCBhbGxvd2VkIGZvciBwcmUtYm9vdAogCQkJCQkqICBjb25maWd1cmF0aW9uICovCisJQkZBX1NUQVRVU19CQURfRldDRkcgPSAxNTYsCS8qIEJhZCBmaXJtd2FyZSBjb25maWd1cmF0aW9uICovCisJQkZBX1NUQVRVU19JTlZBTElEX1ZFTkRPUiA9IDE1OCwgLyogSW52YWxpZCBzd2l0Y2ggdmVuZG9yICovCiAJQkZBX1NUQVRVU19TRlBfTk9UX1JFQURZID0gMTU5LAkvKiBTRlAgaW5mbyBpcyBub3QgcmVhZHkuIFJldHJ5ICovCiAJQkZBX1NUQVRVU19UUlVOS19FTkFCTEVEID0gMTY0LCAvKiBUcnVuayBpcyBhbHJlYWR5IGVuYWJsZWQgb24KIAkJCQkJICogdGhpcyBhZGFwdGVyICovCkBAIC0xNzIsMTEgKzE3NSwxNSBAQAogCUJGQV9TVEFUVVNfSU9QUk9GSUxFX09GRiA9IDE3NSwgLyogSU8gcHJvZmlsZSBPRkYgKi8KIAlCRkFfU1RBVFVTX1BIWV9OT1RfUFJFU0VOVCA9IDE4MywgLyogUEhZIG1vZHVsZSBub3QgcHJlc2VudCAqLwogCUJGQV9TVEFUVVNfRkVBVFVSRV9OT1RfU1VQUE9SVEVEID0gMTkyLAkvKiBGZWF0dXJlIG5vdCBzdXBwb3J0ZWQgKi8KKwlCRkFfU1RBVFVTX0VOVFJZX0VYSVNUUyA9IDE5MywJLyogRW50cnkgYWxyZWFkeSBleGlzdHMgKi8KKwlCRkFfU1RBVFVTX0VOVFJZX05PVF9FWElTVFMgPSAxOTQsIC8qIEVudHJ5IGRvZXMgbm90IGV4aXN0ICovCisJQkZBX1NUQVRVU19OT19DSEFOR0UgPSAxOTUsCS8qIEZlYXR1cmUgYWxyZWFkeSBpbiB0aGF0IHN0YXRlICovCiAJQkZBX1NUQVRVU19GQUFfRU5BQkxFRCA9IDE5NywJLyogRkFBIGlzIGFscmVhZHkgZW5hYmxlZCAqLwogCUJGQV9TVEFUVVNfRkFBX0RJU0FCTEVEID0gMTk4LAkvKiBGQUEgaXMgYWxyZWFkeSBkaXNhYmxlZCAqLwogCUJGQV9TVEFUVVNfRkFBX0FDUVVJUkVEID0gMTk5LAkvKiBGQUEgaXMgYWxyZWFkeSBhY3F1aXJlZCAqLwogCUJGQV9TVEFUVVNfRkFBX0FDUV9BRERSID0gMjAwLAkvKiBBY3F1aXJpbmcgYWRkciAqLwogCUJGQV9TVEFUVVNfRVJST1JfVFJVTktfRU5BQkxFRCA9IDIwMywJLyogVHJ1bmsgZW5hYmxlZCBvbiBhZGFwdGVyICovCisJQkZBX1NUQVRVU19NQVhfRU5UUllfUkVBQ0hFRCA9IDIxMiwJLyogTUFYIGVudHJ5IHJlYWNoZWQgKi8KIAlCRkFfU1RBVFVTX01BWF9WQUwJCS8qIFVua25vd24gZXJyb3IgY29kZSAqLwogfTsKICNkZWZpbmUgYmZhX3N0YXR1c190IGVudW0gYmZhX3N0YXR1cwpAQCAtMzU5LDYgKzM2NiwxMzkgQEAKIH07CiAKIC8qCisgKgkJCUFFTiByZWxhdGVkIGRlZmluaXRpb25zCisgKi8KK2VudW0gYmZhX2Flbl9jYXRlZ29yeSB7CisJQkZBX0FFTl9DQVRfQURBUFRFUgk9IDEsCisJQkZBX0FFTl9DQVRfUE9SVAk9IDIsCisJQkZBX0FFTl9DQVRfTFBPUlQJPSAzLAorCUJGQV9BRU5fQ0FUX1JQT1JUCT0gNCwKKwlCRkFfQUVOX0NBVF9JVE5JTQk9IDUsCisJQkZBX0FFTl9DQVRfQVVESVQJPSA4LAorCUJGQV9BRU5fQ0FUX0lPQwkJPSA5LAorfTsKKworLyogQkZBIGFkYXB0ZXIgbGV2ZWwgZXZlbnRzICovCitlbnVtIGJmYV9hZGFwdGVyX2Flbl9ldmVudCB7CisJQkZBX0FEQVBURVJfQUVOX0FERAk9IDEsCS8qIE5ldyBBZGFwdGVyIGZvdW5kIGV2ZW50ICovCisJQkZBX0FEQVBURVJfQUVOX1JFTU9WRQk9IDIsCS8qIEFkYXB0ZXIgcmVtb3ZlZCBldmVudCAqLworfTsKKworc3RydWN0IGJmYV9hZGFwdGVyX2Flbl9kYXRhX3MgeworCWNoYXIJc2VyaWFsX251bVtCRkFfQURBUFRFUl9TRVJJQUxfTlVNX0xFTl07CisJdTMyCW5wb3J0czsgLyogTnVtYmVyIG9mIE5Qb3J0cyAqLworCXd3bl90CXB3d247ICAgLyogV1dOIG9mIG9uZSBvZiBpdHMgcGh5c2ljYWwgcG9ydCAqLworfTsKKworLyogQkZBIHBoeXNpY2FsIHBvcnQgTGV2ZWwgZXZlbnRzICovCitlbnVtIGJmYV9wb3J0X2Flbl9ldmVudCB7CisJQkZBX1BPUlRfQUVOX09OTElORQk9IDEsICAgIC8qIFBoeXNpY2FsIFBvcnQgb25saW5lIGV2ZW50ICovCisJQkZBX1BPUlRfQUVOX09GRkxJTkUJPSAyLCAgICAvKiBQaHlzaWNhbCBQb3J0IG9mZmxpbmUgZXZlbnQgKi8KKwlCRkFfUE9SVF9BRU5fUkxJUgk9IDMsICAgIC8qIFJMSVIgZXZlbnQsIG5vdCBzdXBwb3J0ZWQgKi8KKwlCRkFfUE9SVF9BRU5fU0ZQX0lOU0VSVAk9IDQsICAgIC8qIFNGUCBpbnNlcnRlZCBldmVudCAqLworCUJGQV9QT1JUX0FFTl9TRlBfUkVNT1ZFCT0gNSwgICAgLyogU0ZQIHJlbW92ZWQgZXZlbnQgKi8KKwlCRkFfUE9SVF9BRU5fU0ZQX1BPTQk9IDYsICAgIC8qIFNGUCBQT00gZXZlbnQgKi8KKwlCRkFfUE9SVF9BRU5fRU5BQkxFCT0gNywgICAgLyogUGh5c2ljYWwgUG9ydCBlbmFibGUgZXZlbnQgKi8KKwlCRkFfUE9SVF9BRU5fRElTQUJMRQk9IDgsICAgIC8qIFBoeXNpY2FsIFBvcnQgZGlzYWJsZSBldmVudCAqLworCUJGQV9QT1JUX0FFTl9BVVRIX09OCT0gOSwgICAgLyogUGh5c2ljYWwgUG9ydCBhdXRoIHN1Y2Nlc3MgZXZlbnQgKi8KKwlCRkFfUE9SVF9BRU5fQVVUSF9PRkYJPSAxMCwgICAvKiBQaHlzaWNhbCBQb3J0IGF1dGggZmFpbCBldmVudCAqLworCUJGQV9QT1JUX0FFTl9ESVNDT05ORUNUCT0gMTEsICAgLyogUGh5c2ljYWwgUG9ydCBkaXNjb25uZWN0IGV2ZW50ICovCisJQkZBX1BPUlRfQUVOX1FPU19ORUcJPSAxMiwgICAvKiBCYXNlIFBvcnQgUU9TIG5lZ290aWF0aW9uIGV2ZW50ICovCisJQkZBX1BPUlRfQUVOX0ZBQlJJQ19OQU1FX0NIQU5HRQk9IDEzLCAvKiBGYWJyaWMgTmFtZS9XV04gY2hhbmdlICovCisJQkZBX1BPUlRfQUVOX1NGUF9BQ0NFU1NfRVJST1IJPSAxNCwgLyogU0ZQIHJlYWQgZXJyb3IgZXZlbnQgKi8KKwlCRkFfUE9SVF9BRU5fU0ZQX1VOU1VQUE9SVAk9IDE1LCAvKiBVbnN1cHBvcnRlZCBTRlAgZXZlbnQgKi8KK307CisKK2VudW0gYmZhX3BvcnRfYWVuX3NmcF9wb20geworCUJGQV9QT1JUX0FFTl9TRlBfUE9NX0dSRUVOID0gMSwgLyogTm9ybWFsICovCisJQkZBX1BPUlRfQUVOX1NGUF9QT01fQU1CRVIgPSAyLCAvKiBXYXJuaW5nICovCisJQkZBX1BPUlRfQUVOX1NGUF9QT01fUkVEICAgPSAzLCAvKiBDcml0aWNhbCAqLworCUJGQV9QT1JUX0FFTl9TRlBfUE9NX01BWCAgID0gQkZBX1BPUlRfQUVOX1NGUF9QT01fUkVECit9OworCitzdHJ1Y3QgYmZhX3BvcnRfYWVuX2RhdGFfcyB7CisJd3duX3QJCXB3d247CQkvKiBXV04gb2YgdGhlIHBoeXNpY2FsIHBvcnQgKi8KKwl3d25fdAkJZnd3bjsJCS8qIFdXTiBvZiB0aGUgZmFicmljIHBvcnQgKi8KKwl1MzIJCXBoeV9wb3J0X251bTsJLyogRm9yIFNGUCByZWxhdGVkIGV2ZW50cyAqLworCXUxNgkJaW9jX3R5cGU7CisJdTE2CQlsZXZlbDsJCS8qIE9ubHkgdHJhbnNpdGlvbnMgd2lsbCBiZSBpbmZvcm1lZCAqLworCW1hY190CQltYWM7CQkvKiBNQUMgYWRkcmVzcyBvZiB0aGUgZXRoZXJuZXQgcG9ydCAqLworCXUxNgkJcnN2ZDsKK307CisKKy8qIEJGQSBBRU4gbG9naWNhbCBwb3J0IGV2ZW50cyAqLworZW51bSBiZmFfbHBvcnRfYWVuX2V2ZW50IHsKKwlCRkFfTFBPUlRfQUVOX05FVwk9IDEsCQkvKiBMUG9ydCBjcmVhdGVkIGV2ZW50ICovCisJQkZBX0xQT1JUX0FFTl9ERUxFVEUJPSAyLAkJLyogTFBvcnQgZGVsZXRlZCBldmVudCAqLworCUJGQV9MUE9SVF9BRU5fT05MSU5FCT0gMywJCS8qIExQb3J0IG9ubGluZSBldmVudCAqLworCUJGQV9MUE9SVF9BRU5fT0ZGTElORQk9IDQsCQkvKiBMUG9ydCBvZmZsaW5lIGV2ZW50ICovCisJQkZBX0xQT1JUX0FFTl9ESVNDT05ORUNUID0gNSwJCS8qIExQb3J0IGRpc2Nvbm5lY3QgZXZlbnQgKi8KKwlCRkFfTFBPUlRfQUVOX05FV19QUk9QCT0gNiwJCS8qIFZQb3J0IGNyZWF0ZWQgZXZlbnQgKi8KKwlCRkFfTFBPUlRfQUVOX0RFTEVURV9QUk9QID0gNywJCS8qIFZQb3J0IGRlbGV0ZWQgZXZlbnQgKi8KKwlCRkFfTFBPUlRfQUVOX05FV19TVEFOREFSRCA9IDgsCQkvKiBWUG9ydCBjcmVhdGVkIGV2ZW50ICovCisJQkZBX0xQT1JUX0FFTl9ERUxFVEVfU1RBTkRBUkQgPSA5LAkvKiBWUG9ydCBkZWxldGVkIGV2ZW50ICovCisJQkZBX0xQT1JUX0FFTl9OUElWX0RVUF9XV04gPSAxMCwJLyogVlBvcnQgd2l0aCBkdXBsaWNhdGUgV1dOICovCisJQkZBX0xQT1JUX0FFTl9OUElWX0ZBQlJJQ19NQVggPSAxMSwJLyogTWF4IE5QSVYgaW4gZmFicmljL2Zwb3J0ICovCisJQkZBX0xQT1JUX0FFTl9OUElWX1VOS05PV04gPSAxMiwJLyogVW5rbm93biBOUElWIEVycm9yIGNvZGUgKi8KK307CisKK3N0cnVjdCBiZmFfbHBvcnRfYWVuX2RhdGFfcyB7CisJdTE2CXZmX2lkOwkvKiB2Zl9pZCBvZiB0aGlzIGxvZ2ljYWwgcG9ydCAqLworCXUxNglyb2xlczsJLyogTG9naWNhbCBwb3J0IG1vZGUsSU0vVE0vSVAgZXRjICovCisJdTMyCXJzdmQ7CisJd3duX3QJcHB3d247CS8qIFdXTiBvZiBpdHMgcGh5c2ljYWwgcG9ydCAqLworCXd3bl90CWxwd3duOwkvKiBXV04gb2YgdGhpcyBsb2dpY2FsIHBvcnQgKi8KK307CisKKy8qIEJGQSBJVE5JTSBldmVudHMgKi8KK2VudW0gYmZhX2l0bmltX2Flbl9ldmVudCB7CisJQkZBX0lUTklNX0FFTl9PTkxJTkUJID0gMSwJLyogVGFyZ2V0IG9ubGluZSAqLworCUJGQV9JVE5JTV9BRU5fT0ZGTElORQkgPSAyLAkvKiBUYXJnZXQgb2ZmbGluZSAqLworCUJGQV9JVE5JTV9BRU5fRElTQ09OTkVDVCA9IDMsCS8qIFRhcmdldCBkaXNjb25uZWN0ZWQgKi8KK307CisKK3N0cnVjdCBiZmFfaXRuaW1fYWVuX2RhdGFfcyB7CisJdTE2CQl2Zl9pZDsJCS8qIHZmX2lkIG9mIHRoZSBJVCBuZXh1cyAqLworCXUxNgkJcnN2ZFszXTsKKwl3d25fdAkJcHB3d247CQkvKiBXV04gb2YgaXRzIHBoeXNpY2FsIHBvcnQgKi8KKwl3d25fdAkJbHB3d247CQkvKiBXV04gb2YgbG9naWNhbCBwb3J0ICovCisJd3duX3QJCXJwd3duOwkJLyogV1dOIG9mIHJlbW90ZSh0YXJnZXQpIHBvcnQgKi8KK307CisKKy8qIEJGQSBhdWRpdCBldmVudHMgKi8KK2VudW0gYmZhX2F1ZGl0X2Flbl9ldmVudCB7CisJQkZBX0FVRElUX0FFTl9BVVRIX0VOQUJMRQk9IDEsCisJQkZBX0FVRElUX0FFTl9BVVRIX0RJU0FCTEUJPSAyLAorCUJGQV9BVURJVF9BRU5fRkxBU0hfRVJBU0UJPSAzLAorCUJGQV9BVURJVF9BRU5fRkxBU0hfVVBEQVRFCT0gNCwKK307CisKK3N0cnVjdCBiZmFfYXVkaXRfYWVuX2RhdGFfcyB7CisJd3duX3QJcHd3bjsKKwlpbnQJcGFydGl0aW9uX2luc3Q7CisJaW50CXBhcnRpdGlvbl90eXBlOworfTsKKworLyogQkZBIElPQyBsZXZlbCBldmVudHMgKi8KK2VudW0gYmZhX2lvY19hZW5fZXZlbnQgeworCUJGQV9JT0NfQUVOX0hCR09PRCAgPSAxLAkvKiBIZWFydCBCZWF0IHJlc3RvcmUgZXZlbnQJKi8KKwlCRkFfSU9DX0FFTl9IQkZBSUwgID0gMiwJLyogSGVhcnQgQmVhdCBmYWlsdXJlIGV2ZW50CSovCisJQkZBX0lPQ19BRU5fRU5BQkxFICA9IDMsCS8qIElPQyBlbmFibGVkIGV2ZW50CQkqLworCUJGQV9JT0NfQUVOX0RJU0FCTEUgPSA0LAkvKiBJT0MgZGlzYWJsZWQgZXZlbnQJCSovCisJQkZBX0lPQ19BRU5fRldNSVNNQVRDSCAgPSA1LAkvKiBJT0MgZmlybXdhcmUgbWlzbWF0Y2gJKi8KKwlCRkFfSU9DX0FFTl9GV0NGR19FUlJPUiA9IDYsCS8qIElPQyBmaXJtd2FyZSBjb25maWcgZXJyb3IJKi8KKwlCRkFfSU9DX0FFTl9JTlZBTElEX1ZFTkRPUiA9IDcsCisJQkZBX0lPQ19BRU5fSU5WQUxJRF9OV1dOID0gOCwJLyogWmVybyBOV1dOCQkJKi8KKwlCRkFfSU9DX0FFTl9JTlZBTElEX1BXV04gPSA5CS8qIFplcm8gUFdXTgkJCSovCit9OworCitzdHJ1Y3QgYmZhX2lvY19hZW5fZGF0YV9zIHsKKwl3d25fdAlwd3duOworCXUxNglpb2NfdHlwZTsKKwltYWNfdAltYWM7Cit9OworCisvKgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtZmcgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tCiAgKi8KIApAQCAtNTIwLDYgKzY2MCwyMCBAQAogLyoKICAqIEJPT1QgYm9vdCBjb25maWd1cmF0b24KICAqLworc3RydWN0IGJmYV9ib290X2NmZ19zIHsKKwl1OAkJdmVyc2lvbjsKKwl1OAkJcnN2ZDE7CisJdTE2CQljaGtzdW07CisJdTgJCWVuYWJsZTsJCS8qIGVuYWJsZS9kaXNhYmxlIFNBTiBib290ICovCisJdTgJCXNwZWVkOyAgICAgICAgICAvKiBib290IHNwZWVkIHNldHRpbmdzICovCisJdTgJCXRvcG9sb2d5OyAgICAgICAvKiBib290IHRvcG9sb2d5IHNldHRpbmcgKi8KKwl1OAkJYm9vdG9wdDsgICAgICAgIC8qIGJmYV9ib290X2Jvb3RvcHRfdCAqLworCXUzMgkJbmJsdW5zOyAgICAgICAgIC8qIG51bWJlciBvZiBib290IGx1bnMgKi8KKwl1MzIJCXJzdmQyOworCXN0cnVjdCBiZmFfYm9vdF9ib290bHVuX3MgYmx1bltCRkFfQk9PVF9CT09UTFVOX01BWF07CisJc3RydWN0IGJmYV9ib290X2Jvb3RsdW5fcyBibHVuX2Rpc2NbQkZBX0JPT1RfQk9PVExVTl9NQVhdOworfTsKKwogc3RydWN0IGJmYV9ib290X3BiY19zIHsKIAl1OCAgICAgICAgICAgICAgZW5hYmxlOyAgICAgICAgIC8qICBlbmFibGUvZGlzYWJsZSBTQU4gYm9vdCAqLwogCXU4ICAgICAgICAgICAgICBzcGVlZDsgICAgICAgICAgLyogIGJvb3Qgc3BlZWQgc2V0dGluZ3MgKi8KQEAgLTUyOSw2ICs2ODMsMTUgQEAKIAlzdHJ1Y3QgYmZhX2Jvb3RfYm9vdGx1bl9zIHBibHVuW0JGQV9QUkVCT09UX0JPT1RMVU5fTUFYXTsKIH07CiAKK3N0cnVjdCBiZmFfZXRoYm9vdF9jZmdfcyB7CisJdTgJCXZlcnNpb247CisJdTgJCXJzdmQxOworCXUxNgkJY2hrc3VtOworCXU4CQllbmFibGU7CS8qIGVuYWJsZS9kaXNhYmxlIEV0aC9QWEUgYm9vdCAqLworCXU4CQlyc3ZkMjsKKwl1MTYJCXZsYW47Cit9OworCiAvKgogICogQVNJQyBibG9jayBjb25maWd1cmF0aW9uIHJlbGF0ZWQgc3RydWN0dXJlcwogICovCkBAIC01ODcsNiArNzUwLDE0IEBACiAgKi8KICNkZWZpbmUgU0ZQX0RJQUdNT05fU0laRQkxMCAvKiBudW0gYnl0ZXMgb2YgZGlhZyBtb25pdG9yIGRhdGEgKi8KIAorLyogU0ZQIHN0YXRlIGNoYW5nZSBub3RpZmljYXRpb24gZXZlbnQgKi8KKyNkZWZpbmUgQkZBX1NGUF9TQ05fUkVNT1ZFRAkwCisjZGVmaW5lIEJGQV9TRlBfU0NOX0lOU0VSVEVECTEKKyNkZWZpbmUgQkZBX1NGUF9TQ05fUE9NCQkyCisjZGVmaW5lIEJGQV9TRlBfU0NOX0ZBSUxFRAkzCisjZGVmaW5lIEJGQV9TRlBfU0NOX1VOU1VQUE9SVAk0CisjZGVmaW5lIEJGQV9TRlBfU0NOX1ZBTElECTUKKwogZW51bSBiZmFfZGVmc19zZnBfbWVkaWFfZSB7CiAJQkZBX1NGUF9NRURJQV9VTktOT1dOCT0gMHgwMCwKIAlCRkFfU0ZQX01FRElBX0NVCT0gMHgwMSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2RlZnNfc3ZjLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9kZWZzX3N2Yy5oCmluZGV4IDBiOTc1MjUuLjg2M2M2YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2RlZnNfc3ZjLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZGVmc19zdmMuaApAQCAtMjY4LDYgKzI2OCw3IEBACiAgICAgdTMyICAgIGVycm9yX3Jlc2V0czsgICAgICAgLyogIGVycm9yIHJlc2V0cyBpbml0aWF0ZWQgYnkgdXBzbSAgICAgICovCiAgICAgdTMyICAgIHN5bmNfbG9zdDsgICAgICAgICAgLyogIFN5bmMgbG9zcyBjb3VudCAgICAgICAgICAgICAgICAgICAgICovCiAgICAgdTMyICAgIHNpZ19sb3N0OyAgICAgICAgICAgLyogIFNpZ25hbCBsb3NzIGNvdW50ICAgICAgICAgICAgICAgICAgICovCisJdTMyCWFzbjhnX2F0dGVtcHRzOwkvKiBTTlNNIEhXU00gYXQgOEdicHMgYXR0ZW1wdHMgKi8KIH07CiAKIHN0cnVjdCBiZmFfZndfcG9ydF9waHlzbV9zdGF0c19zIHsKQEAgLTQ2OCw2ICs0NjksNyBAQAogICogUW9TIHN0YXRlcwogICovCiBlbnVtIGJmYV9xb3Nfc3RhdGUgeworCUJGQV9RT1NfRElTQUJMRUQgPSAwLAkJLyogUW9TIGlzIGRpc2FibGVkICovCiAJQkZBX1FPU19PTkxJTkUgPSAxLAkJLyogIFFvUyBpcyBvbmxpbmUgKi8KIAlCRkFfUU9TX09GRkxJTkUgPSAyLAkJLyogIFFvUyBpcyBvZmZsaW5lICovCiB9OwpAQCAtNjcwLDYgKzY3MiwxMiBAQAogCXUzMgl0bV9pb2Nkb3duczsJCS8qICBUTSBjbGVhbmVkLXVwIGR1ZSB0byBJT0MgZG93biAgICovCiAJdTMyCXRtX2NsZWFudXBzOwkJLyogIFRNIGNsZWFudXAgcmVxdWVzdHMJKi8KIAl1MzIJdG1fY2xlYW51cF9jb21wczsJLyogIFRNIGNsZWFudXAgY29tcGxldGlvbnMJKi8KKwl1MzIJbG1fbHVuX2Fjcm9zc19zZzsJLyogIExNIGx1biBpcyBhY3Jvc3Mgc2cgZGF0YSBidWYgKi8KKwl1MzIJbG1fbHVuX25vdF9zdXA7CQkvKiAgTE0gbHVuIG5vdCBzdXBwb3J0ZWQgKi8KKwl1MzIJbG1fcnBsX2RhdGFfY2hhbmdlZDsJLyogIExNIHJlcG9ydC1sdW4gZGF0YSBjaGFuZ2VkICovCisJdTMyCWxtX3dpcmVfcmVzaWR1ZV9jaGFuZ2VkOyAvKiBMTSByZXBvcnQtbHVuIHJzcCByZXNpZHVlIGNoYW5nZWQgKi8KKwl1MzIJbG1fc21hbGxfYnVmX2FkZHJlc2lkdWU7IC8qIExNIGJ1ZiBzbWFsbGVyIHRoYW4gcmVwb3J0ZWQgY250ICovCisJdTMyCWxtX2x1bl9ub3RfcmR5OwkJLyogTE0gbHVuIG5vdCByZWFkeSAqLwogfTsKIAogLyogTW9kaWZ5IGNoYXIqIHBvcnRfc3R0W10gaW4gYmZhbF9wb3J0LmMgaWYgYSBuZXcgc3RhdGUgd2FzIGFkZGVkICovCkBAIC03ODUsOCArNzkzLDUxIEBACiAJQ0VFX0lTQ1NJX1BSSV9QRkNfT0ZGCQkJPSA0MiwKIAlDRUVfSVNDU0lfUFJJX09WRVJMQVBfRkNPRV9QUkkJCT0gNDMKIH07CisKKyNkZWZpbmUgTUFYX0xVTl9NQVNLX0NGRyAxNgorCisvKgorICogSW5pdGlhbGx5IGZsYXNoIGNvbnRlbnQgbWF5IGJlIGZmZi4gT24gbWFraW5nIExVTiBtYXNrIGVuYWJsZSBhbmQgZGlzYWJsZQorICogc3RhdGUgY2huYWdlLiAgd2hlbiByZXBvcnQgbHVuIGNvbW1hbmQgaXMgYmVpbmcgcHJvY2Vzc2VkIGl0IGdvZXMgZnJvbQorICogQkZBX0xVTl9NQVNLX0FDVElWRSB0byBCRkFfTFVOX01BU0tfRkVUQ0ggYW5kIGNvbWVzIGJhY2sgdG8KKyAqIEJGQV9MVU5fTUFTS19BQ1RJVkUuCisgKi8KK2VudW0gYmZhX2lvaW1fbHVuX21hc2tfc3RhdGVfcyB7CisJQkZBX0lPSU1fTFVOX01BU0tfSU5BQ1RJVkUgPSAwLAorCUJGQV9JT0lNX0xVTl9NQVNLX0FDVElWRSA9IDEsCisJQkZBX0lPSU1fTFVOX01BU0tfRkVUQ0hFRCA9IDIsCit9OworCitlbnVtIGJmYV9sdW5tYXNrX3N0YXRlX3MgeworCUJGQV9MVU5NQVNLX0RJU0FCTEVEID0gMHgwMCwKKwlCRkFfTFVOTUFTS19FTkFCTEVEID0gMHgwMSwKKwlCRkFfTFVOTUFTS19NSU5DRkcgPSAweDAyLAorCUJGQV9MVU5NQVNLX1VOSU5JVElBTElaRUQgPSAweGZmLAorfTsKKwogI3ByYWdtYSBwYWNrKDEpCiAvKgorICogTFVOIG1hc2sgY29uZmlndXJhdGlvbgorICovCitzdHJ1Y3QgYmZhX2x1bl9tYXNrX3MgeworCXd3bl90CQlscF93d247CisJd3duX3QJCXJwX3d3bjsKKwlzdHJ1Y3Qgc2NzaV9sdW4JbHVuOworCXU4CQl1YTsKKwl1OAkJcnN2ZFszXTsKKwl1MTYJCXJwX3RhZzsKKwl1OAkJbHBfdGFnOworCXU4CQlzdGF0ZTsKK307CisKKyNkZWZpbmUgTUFYX0xVTl9NQVNLX0NGRyAxNgorc3RydWN0IGJmYV9sdW5tYXNrX2NmZ19zIHsKKwl1MzIJc3RhdHVzOworCXUzMglyc3ZkOworCXN0cnVjdCBiZmFfbHVuX21hc2tfcwlsdW5fbGlzdFtNQVhfTFVOX01BU0tfQ0ZHXTsKK307CisKKy8qCiAgKiAgICAgIFBoeXNpY2FsIHBvcnQgY29uZmlndXJhdGlvbgogICovCiBzdHJ1Y3QgYmZhX3BvcnRfY2ZnX3MgewpAQCAtMTIyOCw0ICsxMjc5LDUyIEBACiAKICNwcmFnbWEgcGFjaygpCiAKKy8qCisgKgkJCUFFTiByZWxhdGVkIGRlZmluaXRpb25zCisgKi8KKyNkZWZpbmUgQkZBRF9OTF9WRU5ET1JfSUQgKCgodTY0KTB4MDEgPDwgU0NTSV9OTF9WSURfVFlQRV9TSElGVCkgXAorCQkJICAgfCBCRkFfUENJX1ZFTkRPUl9JRF9CUk9DQURFKQorCisvKiBCRkEgcmVtb3RlIHBvcnQgZXZlbnRzICovCitlbnVtIGJmYV9ycG9ydF9hZW5fZXZlbnQgeworCUJGQV9SUE9SVF9BRU5fT05MSU5FICAgICA9IDEsICAgLyogUlBvcnQgb25saW5lIGV2ZW50ICovCisJQkZBX1JQT1JUX0FFTl9PRkZMSU5FICAgID0gMiwgICAvKiBSUG9ydCBvZmZsaW5lIGV2ZW50ICovCisJQkZBX1JQT1JUX0FFTl9ESVNDT05ORUNUID0gMywgICAvKiBSUG9ydCBkaXNjb25uZWN0IGV2ZW50ICovCisJQkZBX1JQT1JUX0FFTl9RT1NfUFJJTyAgID0gNCwgICAvKiBRT1MgcHJpb3JpdHkgY2hhbmdlIGV2ZW50ICovCisJQkZBX1JQT1JUX0FFTl9RT1NfRkxPV0lEID0gNSwgICAvKiBRT1MgZmxvdyBJZCBjaGFuZ2UgZXZlbnQgKi8KK307CisKK3N0cnVjdCBiZmFfcnBvcnRfYWVuX2RhdGFfcyB7CisJdTE2ICAgICAgICAgICAgIHZmX2lkOyAgLyogdmZfaWQgb2YgdGhpcyBsb2dpY2FsIHBvcnQgKi8KKwl1MTYgICAgICAgICAgICAgcnN2ZFszXTsKKwl3d25fdCAgICAgICAgICAgcHB3d247ICAvKiBXV04gb2YgaXRzIHBoeXNpY2FsIHBvcnQgKi8KKwl3d25fdCAgICAgICAgICAgbHB3d247ICAvKiBXV04gb2YgdGhpcyBsb2dpY2FsIHBvcnQgKi8KKwl3d25fdCAgICAgICAgICAgcnB3d247ICAvKiBXV04gb2YgdGhpcyByZW1vdGUgcG9ydCAqLworCXVuaW9uIHsKKwkJc3RydWN0IGJmYV9ycG9ydF9xb3NfYXR0cl9zIHFvczsKKwl9IHByaXY7Cit9OworCit1bmlvbiBiZmFfYWVuX2RhdGFfdSB7CisJc3RydWN0IGJmYV9hZGFwdGVyX2Flbl9kYXRhX3MJYWRhcHRlcjsKKwlzdHJ1Y3QgYmZhX3BvcnRfYWVuX2RhdGFfcwlwb3J0OworCXN0cnVjdCBiZmFfbHBvcnRfYWVuX2RhdGFfcwlscG9ydDsKKwlzdHJ1Y3QgYmZhX3Jwb3J0X2Flbl9kYXRhX3MJcnBvcnQ7CisJc3RydWN0IGJmYV9pdG5pbV9hZW5fZGF0YV9zCWl0bmltOworCXN0cnVjdCBiZmFfYXVkaXRfYWVuX2RhdGFfcwlhdWRpdDsKKwlzdHJ1Y3QgYmZhX2lvY19hZW5fZGF0YV9zCWlvYzsKK307CisKKyNkZWZpbmUgQkZBX0FFTl9NQVhfRU5UUlkJNTEyCisKK3N0cnVjdCBiZmFfYWVuX2VudHJ5X3MgeworCXN0cnVjdCBsaXN0X2hlYWQJcWU7CisJZW51bSBiZmFfYWVuX2NhdGVnb3J5ICAgYWVuX2NhdGVnb3J5OworCXUzMiAgICAgICAgICAgICAgICAgICAgIGFlbl90eXBlOworCXVuaW9uIGJmYV9hZW5fZGF0YV91ICAgIGFlbl9kYXRhOworCXN0cnVjdCB0aW1ldmFsICAgICAgICAgIGFlbl90djsKKwl1MzIgICAgICAgICAgICAgICAgICAgICBzZXFfbnVtOworCXUzMiAgICAgICAgICAgICAgICAgICAgIGJmYWRfbnVtOworfTsKKwogI2VuZGlmIC8qIF9fQkZBX0RFRlNfU1ZDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjLmgKaW5kZXggOGQwYjg4Zi4uNTBiNmExYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmMuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mYy5oCkBAIC01Niw2ICs1NiwxNjEgQEAKIAogI2RlZmluZSBTQ1NJX01BWF9BTExPQ19MRU4gICAgICAweEZGICAgIC8qIG1heGltdW0gYWxsb2NhcmlvbiBsZW5ndGggKi8KIAorI2RlZmluZSBTQ1NJX1NFTlNFX0NVUl9FUlIJMHg3MAorI2RlZmluZSBTQ1NJX1NFTlNFX0RFRl9FUlIJMHg3MQorCisvKgorICogU0NTSSBhZGRpdGlvbmFsIHNlbnNlIGNvZGVzCisgKi8KKyNkZWZpbmUgU0NTSV9BU0NfTFVOX05PVF9SRUFEWQkJMHgwNAorI2RlZmluZSBTQ1NJX0FTQ19MVU5fTk9UX1NVUFBPUlRFRAkweDI1CisjZGVmaW5lIFNDU0lfQVNDX1RPQ0MJCQkweDNGCisKKy8qCisgKiBTQ1NJIGFkZGl0aW9uYWwgc2Vuc2UgY29kZSBxdWFsaWZpZXJzCisgKi8KKyNkZWZpbmUgU0NTSV9BU0NRX01BTl9JTlRSX1JFUQkJMHgwMwkvKiBtYW51YWwgaW50ZXJ2ZW50aW9uIHJlcSAqLworI2RlZmluZSBTQ1NJX0FTQ1FfUkxfREFUQV9DSEFOR0VECTB4MEUJLyogcmVwb3J0IGx1bnMgZGF0YSBjaGFuZ2VkICovCisKKy8qCisgKiBNZXRob2RzIG9mIHJlcG9ydGluZyBpbmZvcm1hdGlvbmFsIGV4Y2VwdGlvbnMKKyAqLworI2RlZmluZSBTQ1NJX01QX0lFQ19VTklUX0FUVE4JCTB4MgkvKiBnZW5lcmF0ZSB1bml0IGF0dGVudGlvbiAqLworCitzdHJ1Y3Qgc2NzaV9yZXBvcnRfbHVuc19kYXRhX3MgeworCXUzMgkJbHVuX2xpc3RfbGVuZ3RoOwkvKiBsZW5ndGggb2YgTFVOIGxpc3QgbGVuZ3RoICovCisJdTMyCQlyZXNlcnZlZDsKKwlzdHJ1Y3Qgc2NzaV9sdW4JbHVuWzFdOwkJCS8qIGZpcnN0IExVTiBpbiBsdW4gbGlzdCAqLworfTsKKworc3RydWN0IHNjc2lfaW5xdWlyeV92ZW5kb3JfcyB7CisJdTgJdmVuZG9yX2lkWzhdOworfTsKKworc3RydWN0IHNjc2lfaW5xdWlyeV9wcm9kaWRfcyB7CisJdTgJcHJvZHVjdF9pZFsxNl07Cit9OworCitzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X3Byb2RyZXZfcyB7CisJdTgJcHJvZHVjdF9yZXZbNF07Cit9OworCitzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGFfcyB7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJdTgJCXBlcmlwaGVyYWxfcXVhbDozOwkvKiBwZXJpcGhlcmFsIHF1YWxpZmllciAqLworCXU4CQlkZXZpY2VfdHlwZTo1OwkJLyogcGVyaXBoZXJhbCBkZXZpY2UgdHlwZSAqLworCXU4CQlybWI6MTsJCQkvKiByZW1vdmFibGUgbWVkaXVtIGJpdCAqLworCXU4CQlkZXZpY2VfdHlwZV9tb2Q6NzsJLyogZGV2aWNlIHR5cGUgbW9kaWZpZXIgKi8KKwl1OAkJdmVyc2lvbjsKKwl1OAkJYWVuYzoxOwkJLyogYXN5bmMgZXZ0IG5vdGlmaWNhdGlvbiBjYXBhYmlsaXR5ICovCisJdTgJCXRybV9pb3A6MTsJLyogdGVybWluYXRlIEkvTyBwcm9jZXNzICovCisJdTgJCW5vcm1fYWNhOjE7CS8qIG5vcm1hbCBBQ0Egc3VwcG9ydGVkICovCisJdTgJCWhpX3N1cHBvcnQ6MTsJLyogU0NTSS0zOiBzdXBwb3J0cyBSRVBPUlQgTFVOUyAqLworCXU4CQlyc3BfZGF0YV9mb3JtYXQ6NDsKKwl1OAkJYWRkaXRpb25hbF9sZW47CisJdTgJCXNjY3M6MTsKKwl1OAkJcmVzZXJ2ZWQxOjc7CisJdTgJCXJlc2VydmVkMjoxOworCXU4CQllbmNfc2VydjoxOwkvKiBlbmNsb3N1cmUgc2VydmljZSBjb21wb25lbnQgKi8KKwl1OAkJcmVzZXJ2ZWQzOjE7CisJdTgJCW11bHRpX3BvcnQ6MTsJLyogbXVsdGktcG9ydCBkZXZpY2UgKi8KKwl1OAkJbV9jaG5ncjoxOwkvKiBkZXZpY2UgaW4gbWVkaXVtIHRyYW5zcG9ydCBlbGVtZW50ICovCisJdTgJCWFja19yZXFfcToxOwkvKiBTSVAgc3BlY2lmaWMgYml0ICovCisJdTgJCWFkZHIzMjoxOwkvKiBTSVAgc3BlY2lmaWMgYml0ICovCisJdTgJCWFkZHIxNjoxOwkvKiBTSVAgc3BlY2lmaWMgYml0ICovCisJdTgJCXJlbF9hZHI6MTsJLyogcmVsYXRpdmUgYWRkcmVzcyAqLworCXU4CQl3X2J1czMyOjE7CisJdTgJCXdfYnVzMTY6MTsKKwl1OAkJc3luY2hyb25vdXM6MTsKKwl1OAkJbGlua2VkX2NvbW1hbmRzOjE7CisJdTgJCXRyYW5zX2RpczoxOworCXU4CQljbWRfcXVldWU6MTsJLyogY29tbWFuZCBxdWV1ZWluZyBzdXBwb3J0ZWQgKi8KKwl1OAkJc29mdF9yZXNldDoxOwkvKiBzb2Z0IHJlc2V0IGFsdGVybmF0aXZlIChWUykgKi8KKyNlbHNlCisJdTgJCWRldmljZV90eXBlOjU7CS8qIHBlcmlwaGVyYWwgZGV2aWNlIHR5cGUgKi8KKwl1OAkJcGVyaXBoZXJhbF9xdWFsOjM7IC8qIHBlcmlwaGVyYWwgcXVhbGlmaWVyICovCisJdTgJCWRldmljZV90eXBlX21vZDo3OyAvKiBkZXZpY2UgdHlwZSBtb2RpZmllciAqLworCXU4CQlybWI6MTsJCS8qIHJlbW92YWJsZSBtZWRpdW0gYml0ICovCisJdTgJCXZlcnNpb247CisJdTgJCXJzcF9kYXRhX2Zvcm1hdDo0OworCXU4CQloaV9zdXBwb3J0OjE7CS8qIFNDU0ktMzogc3VwcG9ydHMgUkVQT1JUIExVTlMgKi8KKwl1OAkJbm9ybV9hY2E6MTsJLyogbm9ybWFsIEFDQSBzdXBwb3J0ZWQgKi8KKwl1OAkJdGVybWluYXRlX2lvcDoxOy8qIHRlcm1pbmF0ZSBJL08gcHJvY2VzcyAqLworCXU4CQlhZW5jOjE7CQkvKiBhc3luYyBldnQgbm90aWZpY2F0aW9uIGNhcGFiaWxpdHkgKi8KKwl1OAkJYWRkaXRpb25hbF9sZW47CisJdTgJCXJlc2VydmVkMTo3OworCXU4CQlzY2NzOjE7CisJdTgJCWFkZHIxNjoxOwkvKiBTSVAgc3BlY2lmaWMgYml0ICovCisJdTgJCWFkZHIzMjoxOwkvKiBTSVAgc3BlY2lmaWMgYml0ICovCisJdTgJCWFja19yZXFfcToxOwkvKiBTSVAgc3BlY2lmaWMgYml0ICovCisJdTgJCW1fY2huZ3I6MTsJLyogZGV2aWNlIGluIG1lZGl1bSB0cmFuc3BvcnQgZWxlbWVudCAqLworCXU4CQltdWx0aV9wb3J0OjE7CS8qIG11bHRpLXBvcnQgZGV2aWNlICovCisJdTgJCXJlc2VydmVkMzoxOwkvKiBUQkQgLSBWZW5kb3IgU3BlY2lmaWMgKi8KKwl1OAkJZW5jX3NlcnY6MTsJLyogZW5jbG9zdXJlIHNlcnZpY2UgY29tcG9uZW50ICovCisJdTgJCXJlc2VydmVkMjoxOworCXU4CQlzb2Z0X3Nlc2V0OjE7CS8qIHNvZnQgcmVzZXQgYWx0ZXJuYXRpdmUgKFZTKSAqLworCXU4CQljbWRfcXVldWU6MTsJLyogY29tbWFuZCBxdWV1ZWluZyBzdXBwb3J0ZWQgKi8KKwl1OAkJdHJhbnNfZGlzOjE7CisJdTgJCWxpbmtlZF9jb21tYW5kczoxOworCXU4CQlzeW5jaHJvbm91czoxOworCXU4CQl3X2J1czE2OjE7CisJdTgJCXdfYnVzMzI6MTsKKwl1OAkJcmVsX2FkcjoxOwkvKiByZWxhdGl2ZSBhZGRyZXNzICovCisjZW5kaWYKKwlzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X3ZlbmRvcl9zCXZlbmRvcl9pZDsKKwlzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X3Byb2RpZF9zCXByb2R1Y3RfaWQ7CisJc3RydWN0IHNjc2lfaW5xdWlyeV9wcm9kcmV2X3MJcHJvZHVjdF9yZXY7CisJdTgJCXZlbmRvcl9zcGVjaWZpY1syMF07CisJdTgJCXJlc2VydmVkNFs0MF07Cit9OworCisvKgorICoJU0NTSSBzZW5zZSBkYXRhIGZvcm1hdAorICovCitzdHJ1Y3Qgc2NzaV9zZW5zZV9zIHsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwl1OAkJdmFsaWQ6MTsKKwl1OAkJcnNwX2NvZGU6NzsKKyNlbHNlCisJdTgJCXJzcF9jb2RlOjc7CisJdTgJCXZhbGlkOjE7CisjZW5kaWYKKwl1OAkJc2VnX251bTsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwl1OAkJZmlsZV9tYXJrOjE7CisJdTgJCWVvbToxOwkJLyogZW5kIG9mIG1lZGlhICovCisJdTgJCWlsaToxOwkJLyogaW5jb3JyZWN0IGxlbmd0aCBpbmRpY2F0b3IgKi8KKwl1OAkJcmVzZXJ2ZWQ6MTsKKwl1OAkJc2Vuc2Vfa2V5OjQ7CisjZWxzZQorCXU4CQlzZW5zZV9rZXk6NDsKKwl1OAkJcmVzZXJ2ZWQ6MTsKKwl1OAkJaWxpOjE7CQkvKiBpbmNvcnJlY3QgbGVuZ3RoIGluZGljYXRvciAqLworCXU4CQllb206MTsJCS8qIGVuZCBvZiBtZWRpYSAqLworCXU4CQlmaWxlX21hcms6MTsKKyNlbmRpZgorCXU4CQlpbmZvcm1hdGlvbls0XTsJLyogZGV2aWNlLXR5cGUgb3IgY21kIHNwZWNpZmljIGluZm8gKi8KKwl1OAkJYWRkX3NlbnNlX2xlbmd0aDsgLyogYWRkaXRpb25hbCBzZW5zZSBsZW5ndGggKi8KKwl1OAkJY29tbWFuZF9pbmZvWzRdOy8qIGNvbW1hbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KKwl1OAkJYXNjOwkJLyogYWRkaXRpb25hbCBzZW5zZSBjb2RlICovCisJdTgJCWFzY3E7CQkvKiBhZGRpdGlvbmFsIHNlbnNlIGNvZGUgcXVhbGlmaWVyICovCisJdTgJCWZydV9jb2RlOwkvKiBmaWVsZCByZXBsYWNlYWJsZSB1bml0IGNvZGUgKi8KKyNpZmRlZiBfX0JJR19FTkRJQU4KKwl1OAkJc2tzdjoxOwkJLyogc2Vuc2Uga2V5IHNwZWNpZmljIHZhbGlkICovCisJdTgJCWNfZDoxOwkJLyogY29tbWFuZC9kYXRhIGJpdCAqLworCXU4CQlyZXMxOjI7CisJdTgJCWJwdjoxOwkJLyogYml0IHBvaW50ZXIgdmFsaWQgKi8KKwl1OAkJYnBvaW50ZXI6MzsJLyogYml0IHBvaW50ZXIgKi8KKyNlbHNlCisJdTgJCWJwb2ludGVyOjM7CS8qIGJpdCBwb2ludGVyICovCisJdTgJCWJwdjoxOwkJLyogYml0IHBvaW50ZXIgdmFsaWQgKi8KKwl1OAkJcmVzMToyOworCXU4CQljX2Q6MTsJCS8qIGNvbW1hbmQvZGF0YSBiaXQgKi8KKwl1OAkJc2tzdjoxOwkJLyogc2Vuc2Uga2V5IHNwZWNpZmljIHZhbGlkICovCisjZW5kaWYKKwl1OAkJZnBvaW50ZXJbMl07CS8qIGZpZWxkIHBvaW50ZXIgKi8KK307CisKIC8qCiAgKiBGaWJyZSBDaGFubmVsIEhlYWRlciBTdHJ1Y3R1cmUgKEZDSFMpIGRlZmluaXRpb24KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNwaW0uYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltLmMKaW5kZXggYTRlNzk1MS4uZTA3YmQ0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNwaW0uYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BpbS5jCkBAIC0yNCw2ICsyNCw5IEBACiAgKiAgQkZBIElUTklNIFJlbGF0ZWQgZGVmaW5pdGlvbnMKICAqLwogc3RhdGljIHZvaWQgYmZhX2l0bmltX3VwZGF0ZV9kZWxfaXRuX3N0YXRzKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0pOworc3RhdGljIGJmYV9ib29sZWFuX3QgYmZhX2lvaW1fbG1fcHJvY19ycGxfZGF0YShzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSk7CitzdGF0aWMgYmZhX2Jvb2xlYW5fdCBiZmFfaW9pbV9sbV9wcm9jX2lucV9kYXRhKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKTsKK3N0YXRpYyB2b2lkIGJmYV9pb2ltX2xtX2luaXQoc3RydWN0IGJmYV9zICpiZmEpOwogCiAjZGVmaW5lIEJGQV9JVE5JTV9GUk9NX1RBRyhfZmNwaW0sIF90YWcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJKCgoX2ZjcGltKS0+aXRuaW1fYXJyICsgKChfdGFnKSAmICgoX2ZjcGltKS0+bnVtX2l0bmltcyAtIDEpKSkpCkBAIC01Nyw2ICs2MCwxNCBAQAogCX0JCQkJCQkJCVwKIH0gd2hpbGUgKDApCiAKKyNkZWZpbmUgYmZhX2lvaW1fcnBfd3duKF9faW9pbSkJCQkJCQlcCisJKCgoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqKQkJCQkJXAorCSAoX19pb2ltKS0+aXRuaW0tPnJwb3J0LT5ycG9ydF9kcnYpLT5wd3duKQorCisjZGVmaW5lIGJmYV9pb2ltX2xwX3d3bihfX2lvaW0pCQkJCQkJXAorCSgoQkZBX0xQU19GUk9NX1RBRyhCRkFfTFBTX01PRCgoX19pb2ltKS0+YmZhKSwJCQlcCisJKF9faW9pbSktPml0bmltLT5ycG9ydC0+cnBvcnRfaW5mby5scF90YWcpKS0+cHd3bikJCVwKKwogI2RlZmluZSBiZmFfaXRuaW1fc2xlcl9jYihfX2l0bmltKSBkbyB7CQkJCQlcCiAJaWYgKChfX2l0bmltKS0+YmZhLT5mY3MpCQkJCQlcCiAJCWJmYV9jYl9pdG5pbV9zbGVyKChfX2l0bmltKS0+ZGl0bik7ICAgICAgXApAQCAtNjYsNiArNzcsMTggQEAKIAl9CQkJCQkJCQlcCiB9IHdoaWxlICgwKQogCitlbnVtIGJmYV9pb2ltX2xtX3N0YXR1cyB7CisJQkZBX0lPSU1fTE1fUFJFU0VOVCA9IDEsCisJQkZBX0lPSU1fTE1fTFVOX05PVF9TVVAgPSAyLAorCUJGQV9JT0lNX0xNX1JQTF9EQVRBX0NIQU5HRUQgPSAzLAorCUJGQV9JT0lNX0xNX0xVTl9OT1RfUkRZID0gNCwKK307CisKK2VudW0gYmZhX2lvaW1fbG1fdWFfc3RhdHVzIHsKKwlCRkFfSU9JTV9MTV9VQV9SRVNFVCA9IDAsCisJQkZBX0lPSU1fTE1fVUFfU0VUID0gMSwKK307CisKIC8qCiAgKiAgaXRuaW0gc3RhdGUgbWFjaGluZSBldmVudAogICovCkBAIC0xMjIsNiArMTQ1LDkgQEAKIAlCRkFfSU9JTV9TTV9UTURPTkUJPSAxNiwJLyogIElPIGNsZWFudXAgZnJvbSB0c2tpbSAqLwogCUJGQV9JT0lNX1NNX0hXRkFJTAk9IDE3LAkvKiAgSU9DIGgvdyBmYWlsdXJlIGV2ZW50ICovCiAJQkZBX0lPSU1fU01fSU9UT1YJPSAxOCwJLyogIElUTiBvZmZsaW5lIFRPViAqLworCUJGQV9JT0lNX1NNX0xNX0xVTl9OT1RfU1VQID0gMTksLyogIGx1bm1hc2sgbHVuIG5vdCBzdXBwb3J0ZWQgKi8KKwlCRkFfSU9JTV9TTV9MTV9SUExfREMgPSAyMCwJLyogIGx1bm1hc2sgcmVwb3J0LWx1biBkYXRhIGNoYW5nZWQgKi8KKwlCRkFfSU9JTV9TTV9MTV9MVU5fTk9UX1JEWSA9IDIxLC8qICBsdW5tYXNrIGx1biBub3QgcmVhZHkgKi8KIH07CiAKIApAQCAtMjE5LDYgKzI0NSw5IEBACiBzdGF0aWMgdm9pZCBfX2JmYV9jYl9pb2ltX2ZhaWxlZCh2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSk7CiBzdGF0aWMgdm9pZCBfX2JmYV9jYl9pb2ltX3BhdGh0b3Yodm9pZCAqY2JhcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpOwogc3RhdGljIGJmYV9ib29sZWFuX3QgICAgYmZhX2lvaW1faXNfYWJvcnRhYmxlKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKTsKK3N0YXRpYyB2b2lkIF9fYmZhX2NiX2lvaW1fbG1fbHVuX25vdF9zdXAodm9pZCAqY2JhcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpOworc3RhdGljIHZvaWQgX19iZmFfY2JfaW9pbV9sbV9ycGxfZGModm9pZCAqY2JhcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpOworc3RhdGljIHZvaWQgX19iZmFfY2JfaW9pbV9sbV9sdW5fbm90X3JkeSh2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSk7CiAKIC8qCiAgKiBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIEJGQSBJTyBzdGF0ZSBtYWNoaW5lCkBAIC00MTYsNiArNDQ1LDEyIEBACiAJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCBvdXRwdXRfcmVxcyk7CiAJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCByZF90aHJvdWdocHV0KTsKIAliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIHdyX3Rocm91Z2hwdXQpOworCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgbG1fbHVuX2Fjcm9zc19zZyk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCBsbV9sdW5fbm90X3N1cCk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCBsbV9ycGxfZGF0YV9jaGFuZ2VkKTsKKwliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIGxtX3dpcmVfcmVzaWR1ZV9jaGFuZ2VkKTsKKwliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIGxtX3NtYWxsX2J1Zl9hZGRyZXNpZHVlKTsKKwliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIGxtX2x1bl9ub3RfcmR5KTsKIH0KIAogYmZhX3N0YXR1c190CkBAIC00MzcsNiArNDcyLDU5IEBACiAJcmV0dXJuIEJGQV9TVEFUVVNfT0s7CiB9CiAKK3ZvaWQKK2JmYV9pb2ltX3Byb2ZpbGVfY29tcChzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSkKK3sKKwlzdHJ1Y3QgYmZhX2l0bmltX2xhdGVuY3lfcyAqaW9fbGF0ID0KKwkJCSYoaW9pbS0+aXRuaW0tPmlvcHJvZmlsZS5pb19sYXRlbmN5KTsKKwl1MzIgdmFsLCBpZHg7CisKKwl2YWwgPSAodTMyKShqaWZmaWVzIC0gaW9pbS0+c3RhcnRfdGltZSk7CisJaWR4ID0gYmZhX2lvaW1fZ2V0X2luZGV4KHNjc2lfYnVmZmxlbigoc3RydWN0IHNjc2lfY21uZCAqKWlvaW0tPmRpbykpOworCWJmYV9pdG5pbV9pb3Byb2ZpbGVfdXBkYXRlKGlvaW0tPml0bmltLCBpZHgpOworCisJaW9fbGF0LT5jb3VudFtpZHhdKys7CisJaW9fbGF0LT5taW5baWR4XSA9IChpb19sYXQtPm1pbltpZHhdIDwgdmFsKSA/IGlvX2xhdC0+bWluW2lkeF0gOiB2YWw7CisJaW9fbGF0LT5tYXhbaWR4XSA9IChpb19sYXQtPm1heFtpZHhdID4gdmFsKSA/IGlvX2xhdC0+bWF4W2lkeF0gOiB2YWw7CisJaW9fbGF0LT5hdmdbaWR4XSArPSB2YWw7Cit9CisKK3ZvaWQKK2JmYV9pb2ltX3Byb2ZpbGVfc3RhcnQoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pCit7CisJaW9pbS0+c3RhcnRfdGltZSA9IGppZmZpZXM7Cit9CisKK2JmYV9zdGF0dXNfdAorYmZhX2ZjcGltX3Byb2ZpbGVfb24oc3RydWN0IGJmYV9zICpiZmEsIHUzMiB0aW1lKQoreworCXN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW07CisJc3RydWN0IGJmYV9mY3BpbV9zICpmY3BpbSA9IEJGQV9GQ1BJTShiZmEpOworCXN0cnVjdCBsaXN0X2hlYWQgKnFlLCAqcWVuOworCisJLyogYWNjdW11bGF0ZSBJTyBzdGF0cyBmcm9tIGl0bmltICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHFlLCBxZW4sICZmY3BpbS0+aXRuaW1fcSkgeworCQlpdG5pbSA9IChzdHJ1Y3QgYmZhX2l0bmltX3MgKikgcWU7CisJCWJmYV9pdG5pbV9jbGVhcl9zdGF0cyhpdG5pbSk7CisJfQorCWZjcGltLT5pb19wcm9maWxlID0gQkZBX1RSVUU7CisJZmNwaW0tPmlvX3Byb2ZpbGVfc3RhcnRfdGltZSA9IHRpbWU7CisJZmNwaW0tPnByb2ZpbGVfY29tcCA9IGJmYV9pb2ltX3Byb2ZpbGVfY29tcDsKKwlmY3BpbS0+cHJvZmlsZV9zdGFydCA9IGJmYV9pb2ltX3Byb2ZpbGVfc3RhcnQ7CisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKK2JmYV9zdGF0dXNfdAorYmZhX2ZjcGltX3Byb2ZpbGVfb2ZmKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfZmNwaW1fcyAqZmNwaW0gPSBCRkFfRkNQSU0oYmZhKTsKKwlmY3BpbS0+aW9fcHJvZmlsZSA9IEJGQV9GQUxTRTsKKwlmY3BpbS0+aW9fcHJvZmlsZV9zdGFydF90aW1lID0gMDsKKwlmY3BpbS0+cHJvZmlsZV9jb21wID0gTlVMTDsKKwlmY3BpbS0+cHJvZmlsZV9zdGFydCA9IE5VTEw7CisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKIHUxNgogYmZhX2ZjcGltX3FkZXB0aF9nZXQoc3RydWN0IGJmYV9zICpiZmEpCiB7CkBAIC0xNDAxLDYgKzE0ODksMjYgQEAKIAkJIGJmYV9zbV9jbXBfc3RhdGUoaXRuaW0sIGJmYV9pdG5pbV9zbV9pb2NkaXNhYmxlKSk7CiB9CiAKKyNkZWZpbmUgYmZhX2lvX2xhdF9jbG9ja19yZXNfZGl2CUhaCisjZGVmaW5lIGJmYV9pb19sYXRfY2xvY2tfcmVzX211bAkxMDAwCitiZmFfc3RhdHVzX3QKK2JmYV9pdG5pbV9nZXRfaW9wcm9maWxlKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0sCisJCQlzdHJ1Y3QgYmZhX2l0bmltX2lvcHJvZmlsZV9zICppb3Byb2ZpbGUpCit7CisJc3RydWN0IGJmYV9mY3BpbV9zICpmY3BpbSA9IEJGQV9GQ1BJTShpdG5pbS0+YmZhKTsKKwlpZiAoIWZjcGltLT5pb19wcm9maWxlKQorCQlyZXR1cm4gQkZBX1NUQVRVU19JT1BST0ZJTEVfT0ZGOworCisJaXRuaW0tPmlvcHJvZmlsZS5pbmRleCA9IEJGQV9JT0JVQ0tFVF9NQVg7CisJaXRuaW0tPmlvcHJvZmlsZS5pb19wcm9maWxlX3N0YXJ0X3RpbWUgPQorCQkJCWJmYV9pb19wcm9maWxlX3N0YXJ0X3RpbWUoaXRuaW0tPmJmYSk7CisJaXRuaW0tPmlvcHJvZmlsZS5jbG9ja19yZXNfbXVsID0gYmZhX2lvX2xhdF9jbG9ja19yZXNfbXVsOworCWl0bmltLT5pb3Byb2ZpbGUuY2xvY2tfcmVzX2RpdiA9IGJmYV9pb19sYXRfY2xvY2tfcmVzX2RpdjsKKwkqaW9wcm9maWxlID0gaXRuaW0tPmlvcHJvZmlsZTsKKworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCiB2b2lkCiBiZmFfaXRuaW1fY2xlYXJfc3RhdHMoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSkKIHsKQEAgLTE0NjksNyArMTU3NywyOCBAQAogCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2hjYik7CiAJCVdBUk5fT04oIWJmYV9xX2lzX29uX3EoJmlvaW0tPml0bmltLT5wZW5kaW5nX3EsIGlvaW0pKTsKIAkJYmZhX2NiX3F1ZXVlKGlvaW0tPmJmYSwgJmlvaW0tPmhjYl9xZSwKLQkJCQlfX2JmYV9jYl9pb2ltX2Fib3J0LCBpb2ltKTsKKwkJCV9fYmZhX2NiX2lvaW1fYWJvcnQsIGlvaW0pOworCQlicmVhazsKKworCWNhc2UgQkZBX0lPSU1fU01fTE1fTFVOX05PVF9TVVA6CisJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiKTsKKwkJYmZhX2lvaW1fbW92ZV90b19jb21wX3EoaW9pbSk7CisJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsCisJCQlfX2JmYV9jYl9pb2ltX2xtX2x1bl9ub3Rfc3VwLCBpb2ltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JT0lNX1NNX0xNX1JQTF9EQzoKKwkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9oY2IpOworCQliZmFfaW9pbV9tb3ZlX3RvX2NvbXBfcShpb2ltKTsKKwkJYmZhX2NiX3F1ZXVlKGlvaW0tPmJmYSwgJmlvaW0tPmhjYl9xZSwKKwkJCQlfX2JmYV9jYl9pb2ltX2xtX3JwbF9kYywgaW9pbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSU9JTV9TTV9MTV9MVU5fTk9UX1JEWToKKwkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9oY2IpOworCQliZmFfaW9pbV9tb3ZlX3RvX2NvbXBfcShpb2ltKTsKKwkJYmZhX2NiX3F1ZXVlKGlvaW0tPmJmYSwgJmlvaW0tPmhjYl9xZSwKKwkJCV9fYmZhX2NiX2lvaW1fbG1fbHVuX25vdF9yZHksIGlvaW0pOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC0yMDA5LDYgKzIxMzgsMjY0IEBACiAJfQogfQogCisvKgorICogVGhpcyBpcyBjYWxsZWQgZnJvbSBiZmFfZmNwaW1fc3RhcnQgYWZ0ZXIgdGhlIGJmYV9pbml0KCkgd2l0aCBmbGFzaCByZWFkCisgKiBpcyBjb21wbGV0ZSBieSBkcml2ZXIuIG5vdyBpbnZhbGlkYXRlIHRoZSBzdGFsZSBjb250ZW50IG9mIGx1biBtYXNrCisgKiBsaWtlIHVuaXQgYXR0ZW50aW9uLCBycCB0YWcgYW5kIGxwIHRhZy4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9pb2ltX2xtX2luaXQoc3RydWN0IGJmYV9zICpiZmEpCit7CisJc3RydWN0IGJmYV9sdW5fbWFza19zICpsdW5tX2xpc3Q7CisJaW50CWk7CisKKwlpZiAoYmZhX2dldF9sdW5fbWFza19zdGF0dXMoYmZhKSA9PSBCRkFfTFVOTUFTS19NSU5DRkcpCisJCXJldHVybjsKKworCWx1bm1fbGlzdCA9IGJmYV9nZXRfbHVuX21hc2tfbGlzdChiZmEpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTFVOX01BU0tfQ0ZHOyBpKyspIHsKKwkJbHVubV9saXN0W2ldLnVhID0gQkZBX0lPSU1fTE1fVUFfUkVTRVQ7CisJCWx1bm1fbGlzdFtpXS5scF90YWcgPSBCRkFfTFBfVEFHX0lOVkFMSUQ7CisJCWx1bm1fbGlzdFtpXS5ycF90YWcgPSBCRkFfUlBPUlRfVEFHX0lOVkFMSUQ7CisJfQorfQorCisvKgorICogVmFsaWRhdGUgTFVOIGZvciBMVU4gbWFza2luZworICovCitzdGF0aWMgZW51bSBiZmFfaW9pbV9sbV9zdGF0dXMKK2JmYV9pb2ltX2xtX2NoZWNrKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltLCBzdHJ1Y3QgYmZhX2xwc19zICpscHMsCisJCXN0cnVjdCBiZmFfcnBvcnRfcyAqcnAsIHN0cnVjdCBzY3NpX2x1biBsdW4pCit7CisJdTggaTsKKwlzdHJ1Y3QgYmZhX2x1bl9tYXNrX3MgKmx1bl9saXN0ID0gYmZhX2dldF9sdW5fbWFza19saXN0KGlvaW0tPmJmYSk7CisJc3RydWN0IHNjc2lfY21uZCAqY21uZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopaW9pbS0+ZGlvOworCXN0cnVjdCBzY3NpX2NkYl9zICpjZGIgPSAoc3RydWN0IHNjc2lfY2RiX3MgKiljbW5kLT5jbW5kOworCisJaWYgKChjZGItPnNjc2lfY2RiWzBdID09IFJFUE9SVF9MVU5TKSAmJgorCSAgICAoc2NzaWx1bl90b19pbnQoKHN0cnVjdCBzY3NpX2x1biAqKSZsdW4pID09IDApKSB7CisJCWlvaW0tPnByb2NfcnNwX2RhdGEgPSBiZmFfaW9pbV9sbV9wcm9jX3JwbF9kYXRhOworCQlyZXR1cm4gQkZBX0lPSU1fTE1fUFJFU0VOVDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xVTl9NQVNLX0NGRzsgaSsrKSB7CisKKwkJaWYgKGx1bl9saXN0W2ldLnN0YXRlICE9IEJGQV9JT0lNX0xVTl9NQVNLX0FDVElWRSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgoc2NzaWx1bl90b19pbnQoKHN0cnVjdCBzY3NpX2x1biAqKSZsdW5fbGlzdFtpXS5sdW4pID09CisJCSAgICBzY3NpbHVuX3RvX2ludCgoc3RydWN0IHNjc2lfbHVuICopJmx1bikpCisJCSAgICAmJiAocnAtPnJwb3J0X3RhZyA9PSBsdW5fbGlzdFtpXS5ycF90YWcpCisJCSAgICAmJiAoKHU4KWlvaW0tPml0bmltLT5ycG9ydC0+cnBvcnRfaW5mby5scF90YWcgPT0KKwkJCQkJCWx1bl9saXN0W2ldLmxwX3RhZykpIHsKKwkJCWJmYV90cmMoaW9pbS0+YmZhLCBsdW5fbGlzdFtpXS5ycF90YWcpOworCQkJYmZhX3RyYyhpb2ltLT5iZmEsIGx1bl9saXN0W2ldLmxwX3RhZyk7CisJCQliZmFfdHJjKGlvaW0tPmJmYSwgc2NzaWx1bl90b19pbnQoCisJCQkJKHN0cnVjdCBzY3NpX2x1biAqKSZsdW5fbGlzdFtpXS5sdW4pKTsKKworCQkJaWYgKChsdW5fbGlzdFtpXS51YSA9PSBCRkFfSU9JTV9MTV9VQV9TRVQpICYmCisJCQkgICAgKChjZGItPnNjc2lfY2RiWzBdICE9IElOUVVJUlkpIHx8CisJCQkgICAgKGNkYi0+c2NzaV9jZGJbMF0gIT0gUkVQT1JUX0xVTlMpKSkgeworCQkJCWx1bl9saXN0W2ldLnVhID0gQkZBX0lPSU1fTE1fVUFfUkVTRVQ7CisJCQkJcmV0dXJuIEJGQV9JT0lNX0xNX1JQTF9EQVRBX0NIQU5HRUQ7CisJCQl9CisKKwkJCWlmIChjZGItPnNjc2lfY2RiWzBdID09IFJFUE9SVF9MVU5TKQorCQkJCWlvaW0tPnByb2NfcnNwX2RhdGEgPSBiZmFfaW9pbV9sbV9wcm9jX3JwbF9kYXRhOworCisJCQlyZXR1cm4gQkZBX0lPSU1fTE1fUFJFU0VOVDsKKwkJfQorCX0KKworCWlmICgoY2RiLT5zY3NpX2NkYlswXSA9PSBJTlFVSVJZKSAmJgorCSAgICAoc2NzaWx1bl90b19pbnQoKHN0cnVjdCBzY3NpX2x1biAqKSZsdW4pID09IDApKSB7CisJCWlvaW0tPnByb2NfcnNwX2RhdGEgPSBiZmFfaW9pbV9sbV9wcm9jX2lucV9kYXRhOworCQlyZXR1cm4gQkZBX0lPSU1fTE1fUFJFU0VOVDsKKwl9CisKKwlpZiAoY2RiLT5zY3NpX2NkYlswXSA9PSBURVNUX1VOSVRfUkVBRFkpCisJCXJldHVybiBCRkFfSU9JTV9MTV9MVU5fTk9UX1JEWTsKKworCXJldHVybiBCRkFfSU9JTV9MTV9MVU5fTk9UX1NVUDsKK30KKworc3RhdGljIGJmYV9ib29sZWFuX3QKK2JmYV9pb2ltX2xtX3Byb2NfcnNwX2RhdGFfZHVtbXkoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pCit7CisJcmV0dXJuIEJGQV9UUlVFOworfQorCitzdGF0aWMgdm9pZAorYmZhX2lvaW1fbG1fZmV0Y2hfbHVuKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltLCB1OCAqcmxfZGF0YSwgaW50IG9mZnNldCwKKwkJaW50IGJ1Zl9sdW5fY250KQoreworCXN0cnVjdCBiZmFfbHVuX21hc2tfcyAqbHVuX2xpc3QgPSBiZmFfZ2V0X2x1bl9tYXNrX2xpc3QoaW9pbS0+YmZhKTsKKwlzdHJ1Y3Qgc2NzaV9sdW4gKmx1bl9kYXRhID0gKHN0cnVjdCBzY3NpX2x1biAqKShybF9kYXRhICsgb2Zmc2V0KTsKKwlzdHJ1Y3Qgc2NzaV9sdW4gbHVuOworCWludCBpLCBqOworCisJYmZhX3RyYyhpb2ltLT5iZmEsIGJ1Zl9sdW5fY250KTsKKwlmb3IgKGogPSAwOyBqIDwgYnVmX2x1bl9jbnQ7IGorKykgeworCQlsdW4gPSAqKChzdHJ1Y3Qgc2NzaV9sdW4gKikobHVuX2RhdGEgKyBqKSk7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfTFVOX01BU0tfQ0ZHOyBpKyspIHsKKwkJCWlmIChsdW5fbGlzdFtpXS5zdGF0ZSAhPSBCRkFfSU9JTV9MVU5fTUFTS19BQ1RJVkUpCisJCQkJY29udGludWU7CisJCQlpZiAoKGx1bl9saXN0W2ldLnJwX3d3biA9PSBiZmFfaW9pbV9ycF93d24oaW9pbSkpICYmCisJCQkgICAgKGx1bl9saXN0W2ldLmxwX3d3biA9PSBiZmFfaW9pbV9scF93d24oaW9pbSkpICYmCisJCQkgICAgKHNjc2lsdW5fdG9faW50KChzdHJ1Y3Qgc2NzaV9sdW4gKikmbHVuX2xpc3RbaV0ubHVuKQorCQkJCT09IHNjc2lsdW5fdG9faW50KChzdHJ1Y3Qgc2NzaV9sdW4gKikmbHVuKSkpIHsKKwkJCQlsdW5fbGlzdFtpXS5zdGF0ZSA9IEJGQV9JT0lNX0xVTl9NQVNLX0ZFVENIRUQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gLyogbmV4dCBsdW4gaW4gbWFzayBEQiAqLworCX0gLyogbmV4dCBsdW4gaW4gYnVmICovCit9CisKK3N0YXRpYyBpbnQKK2JmYV9pb2ltX2xtX3VwZGF0ZV9sdW5fc2coc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0sIHUzMiAqcGdkbGVuLAorCQlzdHJ1Y3Qgc2NzaV9yZXBvcnRfbHVuc19kYXRhX3MgKnJsKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSAoc3RydWN0IHNjc2lfY21uZCAqKWlvaW0tPmRpbzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gc2NzaV9zZ2xpc3QoY21uZCk7CisJc3RydWN0IGJmYV9sdW5fbWFza19zICpsdW5fbGlzdCA9IGJmYV9nZXRfbHVuX21hc2tfbGlzdChpb2ltLT5iZmEpOworCXN0cnVjdCBzY3NpX2x1biAqcHJldl9ybF9kYXRhID0gTlVMTCwgKmJhc2VfcmxfZGF0YTsKKwlpbnQgaSwgaiwgc2dlaWQsIGx1bl9mZXRjaGVkX2NudCA9IDAsIHByZXZfc2dfbGVuID0gMCwgYmFzZV9jb3VudDsKKwlpbnQgbHVuX2Fjcm9zc19zZ19ieXRlcywgYnl0ZXNfZnJvbV9uZXh0X2J1ZjsKKwl1NjQJbGFzdF9sdW4sIHRlbXBfbGFzdF9sdW47CisKKwkvKiBmZXRjaCBsdW5zIGZyb20gdGhlIGZpcnN0IHNnIGVsZW1lbnQgKi8KKwliZmFfaW9pbV9sbV9mZXRjaF9sdW4oaW9pbSwgKHU4ICopKHJsLT5sdW4pLCAwLAorCQkJKHNnX2RtYV9sZW4oc2cpIC8gc2l6ZW9mKHN0cnVjdCBzY3NpX2x1bikpIC0gMSk7CisKKwkvKiBmZXRjaCBsdW5zIGZyb20gbXVsdGlwbGUgc2cgZWxlbWVudHMgKi8KKwlzY3NpX2Zvcl9lYWNoX3NnKGNtbmQsIHNnLCBzY3NpX3NnX2NvdW50KGNtbmQpLCBzZ2VpZCkgeworCQlpZiAoc2dlaWQgPT0gMCkgeworCQkJcHJldl9zZ19sZW4gPSBzZ19kbWFfbGVuKHNnKTsKKwkJCXByZXZfcmxfZGF0YSA9IChzdHJ1Y3Qgc2NzaV9sdW4gKikKKwkJCQkJcGh5c190b192aXJ0KHNnX2RtYV9hZGRyZXNzKHNnKSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIGlmIHRoZSBidWYgaXMgaGF2aW5nIG1vcmUgZGF0YSAqLworCQlsdW5fYWNyb3NzX3NnX2J5dGVzID0gcHJldl9zZ19sZW4gJSBzaXplb2Yoc3RydWN0IHNjc2lfbHVuKTsKKwkJaWYgKGx1bl9hY3Jvc3Nfc2dfYnl0ZXMpIHsKKwkJCWJmYV90cmMoaW9pbS0+YmZhLCBsdW5fYWNyb3NzX3NnX2J5dGVzKTsKKwkJCWJmYV9zdGF0cyhpb2ltLT5pdG5pbSwgbG1fbHVuX2Fjcm9zc19zZyk7CisJCQlieXRlc19mcm9tX25leHRfYnVmID0gc2l6ZW9mKHN0cnVjdCBzY3NpX2x1bikgLQorCQkJCQkgICAgICBsdW5fYWNyb3NzX3NnX2J5dGVzOworCisJCQkvKiBmcm9tIG5leHQgYnVmIHRha2UgaGlnaGVyIGJ5dGVzICovCisJCQl0ZW1wX2xhc3RfbHVuID0gKigodTY0ICopCisJCQkJCSAgcGh5c190b192aXJ0KHNnX2RtYV9hZGRyZXNzKHNnKSkpOworCQkJbGFzdF9sdW4gfD0gdGVtcF9sYXN0X2x1biA+PgorCQkJCSAgICAobHVuX2Fjcm9zc19zZ19ieXRlcyAqIEJJVFNfUEVSX0JZVEUpOworCisJCQkvKiBmcm9tIHByZXYgYnVmIHRha2UgaGlnaGVyIGJ5dGVzICovCisJCQl0ZW1wX2xhc3RfbHVuID0gKigodTY0ICopKHByZXZfcmxfZGF0YSArCisJCQkJCSAgKHByZXZfc2dfbGVuIC0gbHVuX2Fjcm9zc19zZ19ieXRlcykpKTsKKwkJCXRlbXBfbGFzdF9sdW4gPj49IGJ5dGVzX2Zyb21fbmV4dF9idWYgKiBCSVRTX1BFUl9CWVRFOworCQkJbGFzdF9sdW4gPSBsYXN0X2x1biB8ICh0ZW1wX2xhc3RfbHVuIDw8CisJCQkJICAgKGJ5dGVzX2Zyb21fbmV4dF9idWYgKiBCSVRTX1BFUl9CWVRFKSk7CisKKwkJCWJmYV9pb2ltX2xtX2ZldGNoX2x1bihpb2ltLCAodTggKikmbGFzdF9sdW4sIDAsIDEpOworCQl9IGVsc2UKKwkJCWJ5dGVzX2Zyb21fbmV4dF9idWYgPSAwOworCisJCSpwZ2RsZW4gKz0gc2dfZG1hX2xlbihzZyk7CisJCXByZXZfc2dfbGVuID0gc2dfZG1hX2xlbihzZyk7CisJCXByZXZfcmxfZGF0YSA9IChzdHJ1Y3Qgc2NzaV9sdW4gKikKKwkJCQlwaHlzX3RvX3ZpcnQoc2dfZG1hX2FkZHJlc3Moc2cpKTsKKwkJYmZhX2lvaW1fbG1fZmV0Y2hfbHVuKGlvaW0sICh1OCAqKXByZXZfcmxfZGF0YSwKKwkJCQlieXRlc19mcm9tX25leHRfYnVmLAorCQkJCXNnX2RtYV9sZW4oc2cpIC8gc2l6ZW9mKHN0cnVjdCBzY3NpX2x1bikpOworCX0KKworCS8qIHVwZGF0ZSB0aGUgcmVwb3J0IGx1bnMgZGF0YSAtIGJhc2VkIG9uIGZldGNoZWQgbHVucyAqLworCXNnID0gc2NzaV9zZ2xpc3QoY21uZCk7CisJYmFzZV9ybF9kYXRhID0gKHN0cnVjdCBzY3NpX2x1biAqKXJsLT5sdW47CisJYmFzZV9jb3VudCA9IChzZ19kbWFfbGVuKHNnKSAvIHNpemVvZihzdHJ1Y3Qgc2NzaV9sdW4pKSAtIDE7CisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBNQVhfTFVOX01BU0tfQ0ZHOyBpKyspIHsKKwkJaWYgKGx1bl9saXN0W2ldLnN0YXRlID09IEJGQV9JT0lNX0xVTl9NQVNLX0ZFVENIRUQpIHsKKwkJCWJhc2VfcmxfZGF0YVtqXSA9IGx1bl9saXN0W2ldLmx1bjsKKwkJCWx1bl9saXN0W2ldLnN0YXRlID0gQkZBX0lPSU1fTFVOX01BU0tfQUNUSVZFOworCQkJaisrOworCQkJbHVuX2ZldGNoZWRfY250Kys7CisJCX0KKworCQlpZiAoaiA+IGJhc2VfY291bnQpIHsKKwkJCWogPSAwOworCQkJc2cgPSBzZ19uZXh0KHNnKTsKKwkJCWJhc2VfcmxfZGF0YSA9IChzdHJ1Y3Qgc2NzaV9sdW4gKikKKwkJCQkJcGh5c190b192aXJ0KHNnX2RtYV9hZGRyZXNzKHNnKSk7CisJCQliYXNlX2NvdW50ID0gc2dfZG1hX2xlbihzZykgLyBzaXplb2Yoc3RydWN0IHNjc2lfbHVuKTsKKwkJfQorCX0KKworCWJmYV90cmMoaW9pbS0+YmZhLCBsdW5fZmV0Y2hlZF9jbnQpOworCXJldHVybiBsdW5fZmV0Y2hlZF9jbnQ7Cit9CisKK3N0YXRpYyBiZmFfYm9vbGVhbl90CitiZmFfaW9pbV9sbV9wcm9jX2lucV9kYXRhKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKQoreworCXN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YV9zICppbnE7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHNjc2lfc2dsaXN0KChzdHJ1Y3Qgc2NzaV9jbW5kICopaW9pbS0+ZGlvKTsKKworCWlvaW0tPnByb2NfcnNwX2RhdGEgPSBiZmFfaW9pbV9sbV9wcm9jX3JzcF9kYXRhX2R1bW15OworCWlucSA9IChzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGFfcyAqKXBoeXNfdG9fdmlydChzZ19kbWFfYWRkcmVzcyhzZykpOworCisJYmZhX3RyYyhpb2ltLT5iZmEsIGlucS0+ZGV2aWNlX3R5cGUpOworCWlucS0+cGVyaXBoZXJhbF9xdWFsID0gU0NTSV9JTlFfUFFfTk9UX0NPTjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJmYV9ib29sZWFuX3QKK2JmYV9pb2ltX2xtX3Byb2NfcnBsX2RhdGEoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21uZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopaW9pbS0+ZGlvOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBzY3NpX3NnbGlzdChjbW5kKTsKKwlzdHJ1Y3QgYmZpX2lvaW1fcnNwX3MgKm07CisJc3RydWN0IHNjc2lfcmVwb3J0X2x1bnNfZGF0YV9zICpybCA9IE5VTEw7CisJaW50IGx1bl9jb3VudCA9IDAsIGx1bl9mZXRjaGVkX2NudCA9IDA7CisJdTMyIHJlc2lkdWUsIHBnZGxlbiA9IDA7CisKKwlpb2ltLT5wcm9jX3JzcF9kYXRhID0gYmZhX2lvaW1fbG1fcHJvY19yc3BfZGF0YV9kdW1teTsKKwlpZiAoYmZhX2dldF9sdW5fbWFza19zdGF0dXMoaW9pbS0+YmZhKSAhPSBCRkFfTFVOTUFTS19FTkFCTEVEKQorCQlyZXR1cm4gQkZBX1RSVUU7CisKKwltID0gKHN0cnVjdCBiZmlfaW9pbV9yc3BfcyAqKSAmaW9pbS0+aW9zcC0+Y29tcF9yc3Btc2c7CisJaWYgKG0tPnNjc2lfc3RhdHVzID09IFNDU0lfU1RBVFVTX0NIRUNLX0NPTkRJVElPTikKKwkJcmV0dXJuIEJGQV9UUlVFOworCisJcGdkbGVuID0gc2dfZG1hX2xlbihzZyk7CisJYmZhX3RyYyhpb2ltLT5iZmEsIHBnZGxlbik7CisJcmwgPSAoc3RydWN0IHNjc2lfcmVwb3J0X2x1bnNfZGF0YV9zICopcGh5c190b192aXJ0KHNnX2RtYV9hZGRyZXNzKHNnKSk7CisJbHVuX2NvdW50ID0gY3B1X3RvX2JlMzIocmwtPmx1bl9saXN0X2xlbmd0aCkgLyBzaXplb2Yoc3RydWN0IHNjc2lfbHVuKTsKKwlsdW5fZmV0Y2hlZF9jbnQgPSBiZmFfaW9pbV9sbV91cGRhdGVfbHVuX3NnKGlvaW0sICZwZ2RsZW4sIHJsKTsKKworCWlmIChsdW5fY291bnQgPT0gbHVuX2ZldGNoZWRfY250KQorCQlyZXR1cm4gQkZBX1RSVUU7CisKKwliZmFfdHJjKGlvaW0tPmJmYSwgbHVuX2NvdW50KTsKKwliZmFfdHJjKGlvaW0tPmJmYSwgbHVuX2ZldGNoZWRfY250KTsKKwliZmFfdHJjKGlvaW0tPmJmYSwgYmUzMl90b19jcHUocmwtPmx1bl9saXN0X2xlbmd0aCkpOworCisJaWYgKGJlMzJfdG9fY3B1KHJsLT5sdW5fbGlzdF9sZW5ndGgpIDw9IHBnZGxlbikKKwkJcmwtPmx1bl9saXN0X2xlbmd0aCA9IGJlMzJfdG9fY3B1KGx1bl9mZXRjaGVkX2NudCkgKgorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc2NzaV9sdW4pOworCWVsc2UKKwkJYmZhX3N0YXRzKGlvaW0tPml0bmltLCBsbV9zbWFsbF9idWZfYWRkcmVzaWR1ZSk7CisKKwliZmFfdHJjKGlvaW0tPmJmYSwgYmUzMl90b19jcHUocmwtPmx1bl9saXN0X2xlbmd0aCkpOworCWJmYV90cmMoaW9pbS0+YmZhLCBiZTMyX3RvX2NwdShtLT5yZXNpZHVlKSk7CisKKwlyZXNpZHVlID0gYmUzMl90b19jcHUobS0+cmVzaWR1ZSk7CisJcmVzaWR1ZSArPSAobHVuX2NvdW50IC0gbHVuX2ZldGNoZWRfY250KSAqIHNpemVvZihzdHJ1Y3Qgc2NzaV9sdW4pOworCWJmYV9zdGF0cyhpb2ltLT5pdG5pbSwgbG1fd2lyZV9yZXNpZHVlX2NoYW5nZWQpOworCW0tPnJlc2lkdWUgPSBiZTMyX3RvX2NwdShyZXNpZHVlKTsKKwliZmFfdHJjKGlvaW0tPmJmYSwgaW9pbS0+bnNnZXMpOworCXJldHVybiBCRkFfRkFMU0U7Cit9CiAKIHN0YXRpYyB2b2lkCiBfX2JmYV9jYl9pb2ltX2dvb2RfY29tcCh2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSkKQEAgLTIwNjgsNiArMjQ1NSwyOTkgQEAKIH0KIAogc3RhdGljIHZvaWQKK19fYmZhX2NiX2lvaW1fbG1fbHVuX25vdF9zdXAodm9pZCAqY2JhcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpCit7CisJc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0gPSBjYmFyZzsKKwlpbnQgc25zX2xlbiA9IDB4RDsKKwl1MzIgcmVzaWR1ZSA9IHNjc2lfYnVmZmxlbigoc3RydWN0IHNjc2lfY21uZCAqKWlvaW0tPmRpbyk7CisJc3RydWN0IHNjc2lfc2Vuc2VfcyAqc25zaW5mbzsKKworCWlmICghY29tcGxldGUpIHsKKwkJYmZhX3NtX3NlbmRfZXZlbnQoaW9pbSwgQkZBX0lPSU1fU01fSENCKTsKKwkJcmV0dXJuOworCX0KKworCXNuc2luZm8gPSAoc3RydWN0IHNjc2lfc2Vuc2VfcyAqKUJGQV9TTlNJTkZPX0ZST01fVEFHKAorCQkJCQlpb2ltLT5mY3BpbS0+ZmNwLCBpb2ltLT5pb3RhZyk7CisJc25zaW5mby0+cnNwX2NvZGUgPSBTQ1NJX1NFTlNFX0NVUl9FUlI7CisJc25zaW5mby0+YWRkX3NlbnNlX2xlbmd0aCA9IDB4YTsKKwlzbnNpbmZvLT5hc2MgPSBTQ1NJX0FTQ19MVU5fTk9UX1NVUFBPUlRFRDsKKwlzbnNpbmZvLT5zZW5zZV9rZXkgPSBJTExFR0FMX1JFUVVFU1Q7CisJYmZhX3RyYyhpb2ltLT5iZmEsIHJlc2lkdWUpOworCWJmYV9jYl9pb2ltX2RvbmUoaW9pbS0+YmZhLT5iZmFkLCBpb2ltLT5kaW8sIEJGSV9JT0lNX1NUU19PSywKKwkJCVNDU0lfU1RBVFVTX0NIRUNLX0NPTkRJVElPTiwgc25zX2xlbiwKKwkJCSh1OCAqKXNuc2luZm8sIHJlc2lkdWUpOworfQorCitzdGF0aWMgdm9pZAorX19iZmFfY2JfaW9pbV9sbV9ycGxfZGModm9pZCAqY2JhcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpCit7CisJc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0gPSBjYmFyZzsKKwlpbnQgc25zX2xlbiA9IDB4RDsKKwl1MzIgcmVzaWR1ZSA9IHNjc2lfYnVmZmxlbigoc3RydWN0IHNjc2lfY21uZCAqKWlvaW0tPmRpbyk7CisJc3RydWN0IHNjc2lfc2Vuc2VfcyAqc25zaW5mbzsKKworCWlmICghY29tcGxldGUpIHsKKwkJYmZhX3NtX3NlbmRfZXZlbnQoaW9pbSwgQkZBX0lPSU1fU01fSENCKTsKKwkJcmV0dXJuOworCX0KKworCXNuc2luZm8gPSAoc3RydWN0IHNjc2lfc2Vuc2VfcyAqKUJGQV9TTlNJTkZPX0ZST01fVEFHKGlvaW0tPmZjcGltLT5mY3AsCisJCQkJCQkgICAgICAgaW9pbS0+aW90YWcpOworCXNuc2luZm8tPnJzcF9jb2RlID0gU0NTSV9TRU5TRV9DVVJfRVJSOworCXNuc2luZm8tPnNlbnNlX2tleSA9IFNDU0lfTVBfSUVDX1VOSVRfQVRUTjsKKwlzbnNpbmZvLT5hc2MgPSBTQ1NJX0FTQ19UT0NDOworCXNuc2luZm8tPmFkZF9zZW5zZV9sZW5ndGggPSAweDY7CisJc25zaW5mby0+YXNjcSA9IFNDU0lfQVNDUV9STF9EQVRBX0NIQU5HRUQ7CisJYmZhX3RyYyhpb2ltLT5iZmEsIHJlc2lkdWUpOworCWJmYV9jYl9pb2ltX2RvbmUoaW9pbS0+YmZhLT5iZmFkLCBpb2ltLT5kaW8sIEJGSV9JT0lNX1NUU19PSywKKwkJCVNDU0lfU1RBVFVTX0NIRUNLX0NPTkRJVElPTiwgc25zX2xlbiwKKwkJCSh1OCAqKXNuc2luZm8sIHJlc2lkdWUpOworfQorCitzdGF0aWMgdm9pZAorX19iZmFfY2JfaW9pbV9sbV9sdW5fbm90X3JkeSh2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSkKK3sKKwlzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSA9IGNiYXJnOworCWludCBzbnNfbGVuID0gMHhEOworCXUzMiByZXNpZHVlID0gc2NzaV9idWZmbGVuKChzdHJ1Y3Qgc2NzaV9jbW5kICopaW9pbS0+ZGlvKTsKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9zICpzbnNpbmZvOworCisJaWYgKCFjb21wbGV0ZSkgeworCQliZmFfc21fc2VuZF9ldmVudChpb2ltLCBCRkFfSU9JTV9TTV9IQ0IpOworCQlyZXR1cm47CisJfQorCisJc25zaW5mbyA9IChzdHJ1Y3Qgc2NzaV9zZW5zZV9zICopQkZBX1NOU0lORk9fRlJPTV9UQUcoCisJCQkJCWlvaW0tPmZjcGltLT5mY3AsIGlvaW0tPmlvdGFnKTsKKwlzbnNpbmZvLT5yc3BfY29kZSA9IFNDU0lfU0VOU0VfQ1VSX0VSUjsKKwlzbnNpbmZvLT5hZGRfc2Vuc2VfbGVuZ3RoID0gMHhhOworCXNuc2luZm8tPnNlbnNlX2tleSA9IE5PVF9SRUFEWTsKKwlzbnNpbmZvLT5hc2MgPSBTQ1NJX0FTQ19MVU5fTk9UX1JFQURZOworCXNuc2luZm8tPmFzY3EgPSBTQ1NJX0FTQ1FfTUFOX0lOVFJfUkVROworCWJmYV90cmMoaW9pbS0+YmZhLCByZXNpZHVlKTsKKwliZmFfY2JfaW9pbV9kb25lKGlvaW0tPmJmYS0+YmZhZCwgaW9pbS0+ZGlvLCBCRklfSU9JTV9TVFNfT0ssCisJCQlTQ1NJX1NUQVRVU19DSEVDS19DT05ESVRJT04sIHNuc19sZW4sCisJCQkodTggKilzbnNpbmZvLCByZXNpZHVlKTsKK30KKwordm9pZAorYmZhX2ZjcGltX2x1bm1hc2tfcnBfdXBkYXRlKHN0cnVjdCBiZmFfcyAqYmZhLCB3d25fdCBscF93d24sIHd3bl90IHJwX3d3biwKKwkJCXUxNiBycF90YWcsIHU4IGxwX3RhZykKK3sKKwlzdHJ1Y3QgYmZhX2x1bl9tYXNrX3MgKmx1bl9saXN0OworCXU4CWk7CisKKwlpZiAoYmZhX2dldF9sdW5fbWFza19zdGF0dXMoYmZhKSA9PSBCRkFfTFVOTUFTS19NSU5DRkcpCisJCXJldHVybjsKKworCWx1bl9saXN0ID0gYmZhX2dldF9sdW5fbWFza19saXN0KGJmYSk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9MVU5fTUFTS19DRkc7IGkrKykgeworCQlpZiAobHVuX2xpc3RbaV0uc3RhdGUgPT0gQkZBX0lPSU1fTFVOX01BU0tfQUNUSVZFKSB7CisJCQlpZiAoKGx1bl9saXN0W2ldLmxwX3d3biA9PSBscF93d24pICYmCisJCQkgICAgKGx1bl9saXN0W2ldLnJwX3d3biA9PSBycF93d24pKSB7CisJCQkJbHVuX2xpc3RbaV0ucnBfdGFnID0gcnBfdGFnOworCQkJCWx1bl9saXN0W2ldLmxwX3RhZyA9IGxwX3RhZzsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAqIHNldCBVQSBmb3IgYWxsIGFjdGl2ZSBsdW5zIGluIExNIERCCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9pbV9sbV9zZXRfdWEoc3RydWN0IGJmYV9zICpiZmEpCit7CisJc3RydWN0IGJmYV9sdW5fbWFza19zCSpsdW5tX2xpc3Q7CisJaW50CWk7CisKKwlsdW5tX2xpc3QgPSBiZmFfZ2V0X2x1bl9tYXNrX2xpc3QoYmZhKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xVTl9NQVNLX0NGRzsgaSsrKSB7CisJCWlmIChsdW5tX2xpc3RbaV0uc3RhdGUgIT0gQkZBX0lPSU1fTFVOX01BU0tfQUNUSVZFKQorCQkJY29udGludWU7CisJCWx1bm1fbGlzdFtpXS51YSA9IEJGQV9JT0lNX0xNX1VBX1NFVDsKKwl9Cit9CisKK2JmYV9zdGF0dXNfdAorYmZhX2ZjcGltX2x1bm1hc2tfdXBkYXRlKHN0cnVjdCBiZmFfcyAqYmZhLCB1MzIgdXBkYXRlKQoreworCXN0cnVjdCBiZmFfbHVubWFza19jZmdfcwkqbHVuX21hc2s7CisKKwliZmFfdHJjKGJmYSwgYmZhX2dldF9sdW5fbWFza19zdGF0dXMoYmZhKSk7CisJaWYgKGJmYV9nZXRfbHVuX21hc2tfc3RhdHVzKGJmYSkgPT0gQkZBX0xVTk1BU0tfTUlOQ0ZHKQorCQlyZXR1cm4gQkZBX1NUQVRVU19GQUlMRUQ7CisKKwlpZiAoYmZhX2dldF9sdW5fbWFza19zdGF0dXMoYmZhKSA9PSB1cGRhdGUpCisJCXJldHVybiBCRkFfU1RBVFVTX05PX0NIQU5HRTsKKworCWx1bl9tYXNrID0gYmZhX2dldF9sdW5fbWFzayhiZmEpOworCWx1bl9tYXNrLT5zdGF0dXMgPSB1cGRhdGU7CisKKwlpZiAoYmZhX2dldF9sdW5fbWFza19zdGF0dXMoYmZhKSA9PSBCRkFfTFVOTUFTS19FTkFCTEVEKQorCQliZmFfaW9pbV9sbV9zZXRfdWEoYmZhKTsKKworCXJldHVybiAgYmZhX2Rjb25mX3VwZGF0ZShiZmEpOworfQorCitiZmFfc3RhdHVzX3QKK2JmYV9mY3BpbV9sdW5tYXNrX2NsZWFyKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCWludCBpOworCXN0cnVjdCBiZmFfbHVuX21hc2tfcwkqbHVubV9saXN0OworCisJYmZhX3RyYyhiZmEsIGJmYV9nZXRfbHVuX21hc2tfc3RhdHVzKGJmYSkpOworCWlmIChiZmFfZ2V0X2x1bl9tYXNrX3N0YXR1cyhiZmEpID09IEJGQV9MVU5NQVNLX01JTkNGRykKKwkJcmV0dXJuIEJGQV9TVEFUVVNfRkFJTEVEOworCisJbHVubV9saXN0ID0gYmZhX2dldF9sdW5fbWFza19saXN0KGJmYSk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9MVU5fTUFTS19DRkc7IGkrKykgeworCQlpZiAobHVubV9saXN0W2ldLnN0YXRlID09IEJGQV9JT0lNX0xVTl9NQVNLX0FDVElWRSkgeworCQkJaWYgKGx1bm1fbGlzdFtpXS5ycF90YWcgIT0gQkZBX1JQT1JUX1RBR19JTlZBTElEKQorCQkJCWJmYV9ycG9ydF91bnNldF9sdW5tYXNrKGJmYSwKKwkJCQkgIEJGQV9SUE9SVF9GUk9NX1RBRyhiZmEsIGx1bm1fbGlzdFtpXS5ycF90YWcpKTsKKwkJfQorCX0KKworCW1lbXNldChsdW5tX2xpc3QsIDAsIHNpemVvZihzdHJ1Y3QgYmZhX2x1bl9tYXNrX3MpICogTUFYX0xVTl9NQVNLX0NGRyk7CisJcmV0dXJuIGJmYV9kY29uZl91cGRhdGUoYmZhKTsKK30KKworYmZhX3N0YXR1c190CitiZmFfZmNwaW1fbHVubWFza19xdWVyeShzdHJ1Y3QgYmZhX3MgKmJmYSwgdm9pZCAqYnVmKQoreworCXN0cnVjdCBiZmFfbHVubWFza19jZmdfcyAqbHVuX21hc2s7CisKKwliZmFfdHJjKGJmYSwgYmZhX2dldF9sdW5fbWFza19zdGF0dXMoYmZhKSk7CisJaWYgKGJmYV9nZXRfbHVuX21hc2tfc3RhdHVzKGJmYSkgPT0gQkZBX0xVTk1BU0tfTUlOQ0ZHKQorCQlyZXR1cm4gQkZBX1NUQVRVU19GQUlMRUQ7CisKKwlsdW5fbWFzayA9IGJmYV9nZXRfbHVuX21hc2soYmZhKTsKKwltZW1jcHkoYnVmLCBsdW5fbWFzaywgc2l6ZW9mKHN0cnVjdCBiZmFfbHVubWFza19jZmdfcykpOworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCitiZmFfc3RhdHVzX3QKK2JmYV9mY3BpbV9sdW5tYXNrX2FkZChzdHJ1Y3QgYmZhX3MgKmJmYSwgdTE2IHZmX2lkLCB3d25fdCAqcHd3biwKKwkJICAgICAgd3duX3QgcnB3d24sIHN0cnVjdCBzY3NpX2x1biBsdW4pCit7CisJc3RydWN0IGJmYV9sdW5fbWFza19zICpsdW5tX2xpc3Q7CisJc3RydWN0IGJmYV9ycG9ydF9zICpycCA9IE5VTEw7CisJaW50IGksIGZyZWVfaW5kZXggPSBNQVhfTFVOX01BU0tfQ0ZHICsgMTsKKwlzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zICpwb3J0ID0gTlVMTDsKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycF9mY3M7CisKKwliZmFfdHJjKGJmYSwgYmZhX2dldF9sdW5fbWFza19zdGF0dXMoYmZhKSk7CisJaWYgKGJmYV9nZXRfbHVuX21hc2tfc3RhdHVzKGJmYSkgPT0gQkZBX0xVTk1BU0tfTUlOQ0ZHKQorCQlyZXR1cm4gQkZBX1NUQVRVU19GQUlMRUQ7CisKKwlwb3J0ID0gYmZhX2Zjc19sb29rdXBfcG9ydCgmKChzdHJ1Y3QgYmZhZF9zICopYmZhLT5iZmFkKS0+YmZhX2ZjcywKKwkJCQkgICB2Zl9pZCwgKnB3d24pOworCWlmIChwb3J0KSB7CisJCSpwd3duID0gcG9ydC0+cG9ydF9jZmcucHd3bjsKKwkJcnBfZmNzID0gYmZhX2Zjc19scG9ydF9nZXRfcnBvcnRfYnlfcHd3bihwb3J0LCBycHd3bik7CisJCXJwID0gcnBfZmNzLT5iZmFfcnBvcnQ7CisJfQorCisJbHVubV9saXN0ID0gYmZhX2dldF9sdW5fbWFza19saXN0KGJmYSk7CisJLyogaWYgZW50cnkgZXhpc3RzICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9MVU5fTUFTS19DRkc7IGkrKykgeworCQlpZiAobHVubV9saXN0W2ldLnN0YXRlICE9IEJGQV9JT0lNX0xVTl9NQVNLX0FDVElWRSkKKwkJCWZyZWVfaW5kZXggPSBpOworCQlpZiAoKGx1bm1fbGlzdFtpXS5scF93d24gPT0gKnB3d24pICYmCisJCSAgICAobHVubV9saXN0W2ldLnJwX3d3biA9PSBycHd3bikgJiYKKwkJICAgIChzY3NpbHVuX3RvX2ludCgoc3RydWN0IHNjc2lfbHVuICopJmx1bm1fbGlzdFtpXS5sdW4pID09CisJCSAgICAgc2NzaWx1bl90b19pbnQoKHN0cnVjdCBzY3NpX2x1biAqKSZsdW4pKSkKKwkJCXJldHVybiAgQkZBX1NUQVRVU19FTlRSWV9FWElTVFM7CisJfQorCisJaWYgKGZyZWVfaW5kZXggPiBNQVhfTFVOX01BU0tfQ0ZHKQorCQlyZXR1cm4gQkZBX1NUQVRVU19NQVhfRU5UUllfUkVBQ0hFRDsKKworCWlmIChycCkgeworCQlsdW5tX2xpc3RbZnJlZV9pbmRleF0ubHBfdGFnID0gYmZhX2xwc19nZXRfdGFnX2Zyb21fcGlkKGJmYSwKKwkJCQkJCSAgIHJwLT5ycG9ydF9pbmZvLmxvY2FsX3BpZCk7CisJCWx1bm1fbGlzdFtmcmVlX2luZGV4XS5ycF90YWcgPSBycC0+cnBvcnRfdGFnOworCX0gZWxzZSB7CisJCWx1bm1fbGlzdFtmcmVlX2luZGV4XS5scF90YWcgPSBCRkFfTFBfVEFHX0lOVkFMSUQ7CisJCWx1bm1fbGlzdFtmcmVlX2luZGV4XS5ycF90YWcgPSBCRkFfUlBPUlRfVEFHX0lOVkFMSUQ7CisJfQorCisJbHVubV9saXN0W2ZyZWVfaW5kZXhdLmxwX3d3biA9ICpwd3duOworCWx1bm1fbGlzdFtmcmVlX2luZGV4XS5ycF93d24gPSBycHd3bjsKKwlsdW5tX2xpc3RbZnJlZV9pbmRleF0ubHVuID0gbHVuOworCWx1bm1fbGlzdFtmcmVlX2luZGV4XS5zdGF0ZSA9IEJGQV9JT0lNX0xVTl9NQVNLX0FDVElWRTsKKworCS8qIHNldCBmb3IgYWxsIGx1bnMgaW4gdGhpcyBycCAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfTFVOX01BU0tfQ0ZHOyBpKyspIHsKKwkJaWYgKChsdW5tX2xpc3RbaV0ubHBfd3duID09ICpwd3duKSAmJgorCQkgICAgKGx1bm1fbGlzdFtpXS5ycF93d24gPT0gcnB3d24pKQorCQkJbHVubV9saXN0W2ldLnVhID0gQkZBX0lPSU1fTE1fVUFfU0VUOworCX0KKworCXJldHVybiBiZmFfZGNvbmZfdXBkYXRlKGJmYSk7Cit9CisKK2JmYV9zdGF0dXNfdAorYmZhX2ZjcGltX2x1bm1hc2tfZGVsZXRlKHN0cnVjdCBiZmFfcyAqYmZhLCB1MTYgdmZfaWQsIHd3bl90ICpwd3duLAorCQkJIHd3bl90IHJwd3duLCBzdHJ1Y3Qgc2NzaV9sdW4gbHVuKQoreworCXN0cnVjdCBiZmFfbHVuX21hc2tfcwkqbHVubV9saXN0OworCXN0cnVjdCBiZmFfcnBvcnRfcwkqcnAgPSBOVUxMOworCXN0cnVjdCBiZmFfZmNzX2xwb3J0X3MgKnBvcnQgPSBOVUxMOworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwX2ZjczsKKwlpbnQJaTsKKworCS8qIGluIG1pbiBjZmcgbHVubV9saXN0IGNvdWxkIGJlIE5VTEwgYnV0ICBubyBjb21tYW5kcyBzaG91bGQgcnVuLiAqLworCWlmIChiZmFfZ2V0X2x1bl9tYXNrX3N0YXR1cyhiZmEpID09IEJGQV9MVU5NQVNLX01JTkNGRykKKwkJcmV0dXJuIEJGQV9TVEFUVVNfRkFJTEVEOworCisJYmZhX3RyYyhiZmEsIGJmYV9nZXRfbHVuX21hc2tfc3RhdHVzKGJmYSkpOworCWJmYV90cmMoYmZhLCAqcHd3bik7CisJYmZhX3RyYyhiZmEsIHJwd3duKTsKKwliZmFfdHJjKGJmYSwgc2NzaWx1bl90b19pbnQoKHN0cnVjdCBzY3NpX2x1biAqKSZsdW4pKTsKKworCWlmICgqcHd3biA9PSAwKSB7CisJCXBvcnQgPSBiZmFfZmNzX2xvb2t1cF9wb3J0KAorCQkJCSYoKHN0cnVjdCBiZmFkX3MgKiliZmEtPmJmYWQpLT5iZmFfZmNzLAorCQkJCXZmX2lkLCAqcHd3bik7CisJCWlmIChwb3J0KSB7CisJCQkqcHd3biA9IHBvcnQtPnBvcnRfY2ZnLnB3d247CisJCQlycF9mY3MgPSBiZmFfZmNzX2xwb3J0X2dldF9ycG9ydF9ieV9wd3duKHBvcnQsIHJwd3duKTsKKwkJCXJwID0gcnBfZmNzLT5iZmFfcnBvcnQ7CisJCX0KKwl9CisKKwlsdW5tX2xpc3QgPSBiZmFfZ2V0X2x1bl9tYXNrX2xpc3QoYmZhKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xVTl9NQVNLX0NGRzsgaSsrKSB7CisJCWlmICgobHVubV9saXN0W2ldLmxwX3d3biA9PSAqcHd3bikgJiYKKwkJICAgIChsdW5tX2xpc3RbaV0ucnBfd3duID09IHJwd3duKSAmJgorCQkgICAgKHNjc2lsdW5fdG9faW50KChzdHJ1Y3Qgc2NzaV9sdW4gKikmbHVubV9saXN0W2ldLmx1bikgPT0KKwkJICAgICBzY3NpbHVuX3RvX2ludCgoc3RydWN0IHNjc2lfbHVuICopJmx1bikpKSB7CisJCQlsdW5tX2xpc3RbaV0ubHBfd3duID0gMDsKKwkJCWx1bm1fbGlzdFtpXS5ycF93d24gPSAwOworCQkJaW50X3RvX3Njc2lsdW4oMCwgJmx1bm1fbGlzdFtpXS5sdW4pOworCQkJbHVubV9saXN0W2ldLnN0YXRlID0gQkZBX0lPSU1fTFVOX01BU0tfSU5BQ1RJVkU7CisJCQlpZiAobHVubV9saXN0W2ldLnJwX3RhZyAhPSBCRkFfUlBPUlRfVEFHX0lOVkFMSUQpIHsKKwkJCQlsdW5tX2xpc3RbaV0ucnBfdGFnID0gQkZBX1JQT1JUX1RBR19JTlZBTElEOworCQkJCWx1bm1fbGlzdFtpXS5scF90YWcgPSBCRkFfTFBfVEFHX0lOVkFMSUQ7CisJCQl9CisJCQlyZXR1cm4gYmZhX2Rjb25mX3VwZGF0ZShiZmEpOworCQl9CisJfQorCisJLyogc2V0IGZvciBhbGwgbHVucyBpbiB0aGlzIHJwICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9MVU5fTUFTS19DRkc7IGkrKykgeworCQlpZiAoKGx1bm1fbGlzdFtpXS5scF93d24gPT0gKnB3d24pICYmCisJCSAgICAobHVubV9saXN0W2ldLnJwX3d3biA9PSBycHd3bikpCisJCQlsdW5tX2xpc3RbaV0udWEgPSBCRkFfSU9JTV9MTV9VQV9TRVQ7CisJfQorCisJcmV0dXJuIEJGQV9TVEFUVVNfRU5UUllfTk9UX0VYSVNUUzsKK30KKworc3RhdGljIHZvaWQKIF9fYmZhX2NiX2lvaW1fZmFpbGVkKHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKQogewogCXN0cnVjdCBiZmFfaW9pbV9zICppb2ltID0gY2Jhcmc7CkBAIC0yMDc3LDYgKzI3NTcsNyBAQAogCQlyZXR1cm47CiAJfQogCisJaW9pbS0+cHJvY19yc3BfZGF0YSA9IGJmYV9pb2ltX2xtX3Byb2NfcnNwX2RhdGFfZHVtbXk7CiAJYmZhX2NiX2lvaW1fZG9uZShpb2ltLT5iZmEtPmJmYWQsIGlvaW0tPmRpbywgQkZJX0lPSU1fU1RTX0FCT1JURUQsCiAJCQkgIDAsIDAsIE5VTEwsIDApOwogfQpAQCAtMjA5Miw2ICsyNzczLDcgQEAKIAkJcmV0dXJuOwogCX0KIAorCWlvaW0tPnByb2NfcnNwX2RhdGEgPSBiZmFfaW9pbV9sbV9wcm9jX3JzcF9kYXRhX2R1bW15OwogCWJmYV9jYl9pb2ltX2RvbmUoaW9pbS0+YmZhLT5iZmFkLCBpb2ltLT5kaW8sIEJGSV9JT0lNX1NUU19QQVRIVE9WLAogCQkJICAwLCAwLCBOVUxMLCAwKTsKIH0KQEAgLTIxMDYsNiArMjc4OCw3IEBACiAJCXJldHVybjsKIAl9CiAKKwlpb2ltLT5wcm9jX3JzcF9kYXRhID0gYmZhX2lvaW1fbG1fcHJvY19yc3BfZGF0YV9kdW1teTsKIAliZmFfY2JfaW9pbV9hYm9ydChpb2ltLT5iZmEtPmJmYWQsIGlvaW0tPmRpbyk7CiB9CiAKQEAgLTI0NDksNiArMzEzMiw3IEBACiAJCWlvaW0tPmJmYSAgICAgPSBmY3BpbS0+YmZhOwogCQlpb2ltLT5mY3BpbSAgID0gZmNwaW07CiAJCWlvaW0tPmlvc3AgICAgPSBpb3NwOworCQlpb2ltLT5wcm9jX3JzcF9kYXRhID0gYmZhX2lvaW1fbG1fcHJvY19yc3BfZGF0YV9kdW1teTsKIAkJSU5JVF9MSVNUX0hFQUQoJmlvaW0tPnNncGdfcSk7CiAJCWJmYV9yZXFxX3dpbml0KCZpb2ltLT5pb3NwLT5yZXFxX3dhaXQsCiAJCQkJICAgYmZhX2lvaW1fcXJlc3VtZSwgaW9pbSk7CkBAIC0yNDg2LDYgKzMxNzAsNyBAQAogCQkJZXZ0ID0gQkZBX0lPSU1fU01fRE9ORTsKIAkJZWxzZQogCQkJZXZ0ID0gQkZBX0lPSU1fU01fQ09NUDsKKwkJaW9pbS0+cHJvY19yc3BfZGF0YShpb2ltKTsKIAkJYnJlYWs7CiAKIAljYXNlIEJGSV9JT0lNX1NUU19USU1FRE9VVDoKQEAgLTI1MjEsNiArMzIwNiw3IEBACiAJCWlmIChyc3AtPmFib3J0X3RhZyAhPSBpb2ltLT5hYm9ydF90YWcpIHsKIAkJCWJmYV90cmMoaW9pbS0+YmZhLCByc3AtPmFib3J0X3RhZyk7CiAJCQliZmFfdHJjKGlvaW0tPmJmYSwgaW9pbS0+YWJvcnRfdGFnKTsKKwkJCWlvaW0tPnByb2NfcnNwX2RhdGEgPSBiZmFfaW9pbV9sbV9wcm9jX3JzcF9kYXRhX2R1bW15OwogCQkJcmV0dXJuOwogCQl9CiAKQEAgLTI1MzksNiArMzIyNSw3IEBACiAJCVdBUk5fT04oMSk7CiAJfQogCisJaW9pbS0+cHJvY19yc3BfZGF0YSA9IGJmYV9pb2ltX2xtX3Byb2NfcnNwX2RhdGFfZHVtbXk7CiAJYmZhX3NtX3NlbmRfZXZlbnQoaW9pbSwgZXZ0KTsKIH0KIApAQCAtMjU1Niw3ICszMjQzLDE2IEBACiAJV0FSTl9PTihCRkFfSU9JTV9UQUdfMl9JRChpb2ltLT5pb3RhZykgIT0gaW90YWcpOwogCiAJYmZhX2lvaW1fY2JfcHJvZmlsZV9jb21wKGZjcGltLCBpb2ltKTsKLQliZmFfc21fc2VuZF9ldmVudChpb2ltLCBCRkFfSU9JTV9TTV9DT01QX0dPT0QpOworCisJaWYgKGJmYV9nZXRfbHVuX21hc2tfc3RhdHVzKGJmYSkgIT0gQkZBX0xVTk1BU0tfRU5BQkxFRCkgIHsKKwkJYmZhX3NtX3NlbmRfZXZlbnQoaW9pbSwgQkZBX0lPSU1fU01fQ09NUF9HT09EKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpb2ltLT5wcm9jX3JzcF9kYXRhKGlvaW0pID09IEJGQV9UUlVFKQorCQliZmFfc21fc2VuZF9ldmVudChpb2ltLCBCRkFfSU9JTV9TTV9DT01QX0dPT0QpOworCWVsc2UKKwkJYmZhX3NtX3NlbmRfZXZlbnQoaW9pbSwgQkZBX0lPSU1fU01fQ09NUCk7CiB9CiAKIC8qCkBAIC0yNjY4LDYgKzMzNjQsMzUgQEAKIHZvaWQKIGJmYV9pb2ltX3N0YXJ0KHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKQogeworCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSAoc3RydWN0IHNjc2lfY21uZCAqKWlvaW0tPmRpbzsKKwlzdHJ1Y3QgYmZhX2xwc19zCSpscHM7CisJZW51bSBiZmFfaW9pbV9sbV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBzY3NpX2x1biBzY3NpbHVuOworCisJaWYgKGJmYV9nZXRfbHVuX21hc2tfc3RhdHVzKGlvaW0tPmJmYSkgPT0gQkZBX0xVTk1BU0tfRU5BQkxFRCkgeworCQlscHMgPSBCRkFfSU9JTV9UT19MUFMoaW9pbSk7CisJCWludF90b19zY3NpbHVuKGNtbmQtPmRldmljZS0+bHVuLCAmc2NzaWx1bik7CisJCXN0YXR1cyA9IGJmYV9pb2ltX2xtX2NoZWNrKGlvaW0sIGxwcywKKwkJCQlpb2ltLT5pdG5pbS0+cnBvcnQsIHNjc2lsdW4pOworCQlpZiAoc3RhdHVzID09IEJGQV9JT0lNX0xNX0xVTl9OT1RfUkRZKSB7CisJCQliZmFfc21fc2VuZF9ldmVudChpb2ltLCBCRkFfSU9JTV9TTV9MTV9MVU5fTk9UX1JEWSk7CisJCQliZmFfc3RhdHMoaW9pbS0+aXRuaW0sIGxtX2x1bl9ub3RfcmR5KTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChzdGF0dXMgPT0gQkZBX0lPSU1fTE1fTFVOX05PVF9TVVApIHsKKwkJCWJmYV9zbV9zZW5kX2V2ZW50KGlvaW0sIEJGQV9JT0lNX1NNX0xNX0xVTl9OT1RfU1VQKTsKKwkJCWJmYV9zdGF0cyhpb2ltLT5pdG5pbSwgbG1fbHVuX25vdF9zdXApOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKHN0YXR1cyA9PSBCRkFfSU9JTV9MTV9SUExfREFUQV9DSEFOR0VEKSB7CisJCQliZmFfc21fc2VuZF9ldmVudChpb2ltLCBCRkFfSU9JTV9TTV9MTV9SUExfREMpOworCQkJYmZhX3N0YXRzKGlvaW0tPml0bmltLCBsbV9ycGxfZGF0YV9jaGFuZ2VkKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwogCWJmYV9pb2ltX2NiX3Byb2ZpbGVfc3RhcnQoaW9pbS0+ZmNwaW0sIGlvaW0pOwogCiAJLyoKQEAgLTM0MTEsNiArNDEzNiwxMyBAQAogc3RhdGljIHZvaWQKIGJmYV9mY3Bfc3RhcnQoc3RydWN0IGJmYV9zICpiZmEpCiB7CisJc3RydWN0IGJmYV9mY3BfbW9kX3MgKmZjcCA9IEJGQV9GQ1BfTU9EKGJmYSk7CisKKwkvKgorCSAqIGJmYV9pbml0KCkgd2l0aCBmbGFzaCByZWFkIGlzIGNvbXBsZXRlLiBub3cgaW52YWxpZGF0ZSB0aGUgc3RhbGUKKwkgKiBjb250ZW50IG9mIGx1biBtYXNrIGxpa2UgdW5pdCBhdHRlbnRpb24sIHJwIHRhZyBhbmQgbHAgdGFnLgorCSAqLworCWJmYV9pb2ltX2xtX2luaXQoZmNwLT5iZmEpOwogfQogCiBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNwaW0uaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltLmgKaW5kZXggNTdiNjk1YS4uMTA4MGJjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNwaW0uaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BpbS5oCkBAIC03OSwxNCArNzksMjIgQEAKIAlpZiAobiA+PSAoMVVMKTw8MjIpCiAJCXJldHVybiBCRkFfSU9CVUNLRVRfTUFYIC0gMTsKIAluID4+PSA4OwotCWlmIChuID49ICgxVUwpPDwxNikKLQkJbiA+Pj0gMTY7IHBvcyArPSAxNjsKLQlpZiAobiA+PSAxIDw8IDgpCi0JCW4gPj49IDg7IHBvcyArPSA4OwotCWlmIChuID49IDEgPDwgNCkKLQkJbiA+Pj0gNDsgcG9zICs9IDQ7Ci0JaWYgKG4gPj0gMSA8PCAyKQotCQluID4+PSAyOyBwb3MgKz0gMjsKKwlpZiAobiA+PSAoMVVMKTw8MTYpIHsKKwkJbiA+Pj0gMTY7CisJCXBvcyArPSAxNjsKKwl9CisJaWYgKG4gPj0gMSA8PCA4KSB7CisJCW4gPj49IDg7CisJCXBvcyArPSA4OworCX0KKwlpZiAobiA+PSAxIDw8IDQpIHsKKwkJbiA+Pj0gNDsKKwkJcG9zICs9IDQ7CisJfQorCWlmIChuID49IDEgPDwgMikgeworCQluID4+PSAyOworCQlwb3MgKz0gMjsKKwl9CiAJaWYgKG4gPj0gMSA8PCAxKQogCQlwb3MgKz0gMTsKIApAQCAtMTAyLDYgKzExMCw3IEBACiBzdHJ1Y3QgYmZhZF90c2tpbV9zOwogCiB0eXBlZGVmIHZvaWQgICAgKCpiZmFfZmNwaW1fcHJvZmlsZV90KSAoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pOwordHlwZWRlZiBiZmFfYm9vbGVhbl90ICgqYmZhX2lvaW1fbG1fcHJvY19yc3BfZGF0YV90KSAoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pOwogCiBzdHJ1Y3QgYmZhX2ZjcGltX3MgewogCXN0cnVjdCBiZmFfcwkJKmJmYTsKQEAgLTExNSw3ICsxMjQsNyBAQAogCXUzMgkJCXBhdGhfdG92OwogCXUxNgkJCXFfZGVwdGg7CiAJdTgJCQlyZXFxOwkJLyogIFJlcXVlc3QgcXVldWUgdG8gYmUgdXNlZCAqLwotCXU4CQkJcnN2ZDsKKwl1OAkJCWx1bl9tYXNraW5nX3BlbmRpbmc7CiAJc3RydWN0IGxpc3RfaGVhZAlpdG5pbV9xOwkvKiAgcXVldWUgb2YgYWN0aXZlIGl0bmltICovCiAJc3RydWN0IGxpc3RfaGVhZAlpb2ltX3Jlc2ZyZWVfcTsgLyogIElPcyB3YWl0aW5nIGZvciBmL3cgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWlvaW1fY29tcF9xOwkvKiAgSU8gZ2xvYmFsIGNvbXAgUQkqLwpAQCAtMTcwLDcgKzE3OSw5IEBACiAJYmZhX2NiX2NiZm5fdAkJaW9fY2JmbjsJLyogIElPIGNvbXBsZXRpb24gaGFuZGxlciAqLwogCXN0cnVjdCBiZmFfaW9pbV9zcF9zCSppb3NwOwkJLyogIHNsb3ctcGF0aCBJTyBoYW5kbGluZyAqLwogCXU4CQkJcmVxcTsJCS8qICBSZXF1ZXN0IHF1ZXVlIGZvciBJL08gKi8KKwl1OAkJCW1vZGU7CQkvKiAgSU8gaXMgcGFzc3Rocm91Z2ggb3Igbm90ICovCiAJdTY0CQkJc3RhcnRfdGltZTsJLyogIElPJ3MgUHJvZmlsZSBzdGFydCB2YWwgKi8KKwliZmFfaW9pbV9sbV9wcm9jX3JzcF9kYXRhX3QgcHJvY19yc3BfZGF0YTsgLyogUlNQIGRhdGEgYWRqdXN0ICovCiB9OwogCiBzdHJ1Y3QgYmZhX2lvaW1fc3BfcyB7CkBAIC0yNTAsNiArMjYxLDEwIEBACiAJKF9faW9pbSktPmlvdGFnIHw9IGsgPDwgQkZBX0lPSU1fUkVUUllfVEFHX09GRlNFVDsJCVwKIH0gd2hpbGUgKDApCiAKKyNkZWZpbmUgQkZBX0lPSU1fVE9fTFBTKF9faW9pbSkJCVwKKwlCRkFfTFBTX0ZST01fVEFHKEJGQV9MUFNfTU9EKF9faW9pbS0+YmZhKSwJXAorCQlfX2lvaW0tPml0bmltLT5ycG9ydC0+cnBvcnRfaW5mby5scF90YWcpCisKIHN0YXRpYyBpbmxpbmUgYmZhX2Jvb2xlYW5fdAogYmZhX2lvaW1fbWF4cmV0cnlfcmVhY2hlZChzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSkKIHsKQEAgLTI5Nyw2ICszMTIsOCBAQAogCQkJc3RydWN0IGJmYV9pdG5pbV9pb3N0YXRzX3MgKnN0YXRzLCB1OCBscF90YWcpOwogdm9pZCBiZmFfZmNwaW1fYWRkX3N0YXRzKHN0cnVjdCBiZmFfaXRuaW1faW9zdGF0c19zICpmY3BpbV9zdGF0cywKIAkJCXN0cnVjdCBiZmFfaXRuaW1faW9zdGF0c19zICppdG5pbV9zdGF0cyk7CitiZmFfc3RhdHVzX3QgYmZhX2ZjcGltX3Byb2ZpbGVfb24oc3RydWN0IGJmYV9zICpiZmEsIHUzMiB0aW1lKTsKK2JmYV9zdGF0dXNfdCBiZmFfZmNwaW1fcHJvZmlsZV9vZmYoc3RydWN0IGJmYV9zICpiZmEpOwogCiAjZGVmaW5lIGJmYV9mY3BpbV9pb3JlZGlyZWN0X2VuYWJsZWQoX19iZmEpCQkJCVwKIAkoKChzdHJ1Y3QgYmZhX2ZjcGltX3MgKikoQkZBX0ZDUElNKF9fYmZhKSkpLT5pb3JlZGlyZWN0KQpAQCAtMzk3LDQgKzQxNCwxNCBAQAogdm9pZCBiZmFfY2JfdHNraW1fZG9uZSh2b2lkICpiZmFkLCBzdHJ1Y3QgYmZhZF90c2tpbV9zICpkdHNrLAogCQkJZW51bSBiZmlfdHNraW1fc3RhdHVzIHRza19zdGF0dXMpOwogCit2b2lkCWJmYV9mY3BpbV9sdW5tYXNrX3JwX3VwZGF0ZShzdHJ1Y3QgYmZhX3MgKmJmYSwgd3duX3QgbHBfd3duLAorCQkJd3duX3QgcnBfd3duLCB1MTYgcnBfdGFnLCB1OCBscF90YWcpOworYmZhX3N0YXR1c190CWJmYV9mY3BpbV9sdW5tYXNrX3VwZGF0ZShzdHJ1Y3QgYmZhX3MgKmJmYSwgdTMyIG9uX29mZik7CitiZmFfc3RhdHVzX3QJYmZhX2ZjcGltX2x1bm1hc2tfcXVlcnkoc3RydWN0IGJmYV9zICpiZmEsIHZvaWQgKmJ1Zik7CitiZmFfc3RhdHVzX3QJYmZhX2ZjcGltX2x1bm1hc2tfZGVsZXRlKHN0cnVjdCBiZmFfcyAqYmZhLCB1MTYgdmZfaWQsCisJCQkJd3duX3QgKnB3d24sIHd3bl90IHJwd3duLCBzdHJ1Y3Qgc2NzaV9sdW4gbHVuKTsKK2JmYV9zdGF0dXNfdAliZmFfZmNwaW1fbHVubWFza19hZGQoc3RydWN0IGJmYV9zICpiZmEsIHUxNiB2Zl9pZCwKKwkJCQl3d25fdCAqcHd3biwgd3duX3QgcnB3d24sIHN0cnVjdCBzY3NpX2x1biBsdW4pOworYmZhX3N0YXR1c190CWJmYV9mY3BpbV9sdW5tYXNrX2NsZWFyKHN0cnVjdCBiZmFfcyAqYmZhKTsKKwogI2VuZGlmIC8qIF9fQkZBX0ZDUElNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3MuYwppbmRleCBhOWIyMmJjLi5lYWFjNTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3MuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3MuYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlICJiZmFkX2Rydi5oIgorI2luY2x1ZGUgImJmYWRfaW0uaCIKICNpbmNsdWRlICJiZmFfZmNzLmgiCiAjaW5jbHVkZSAiYmZhX2ZjYnVpbGQuaCIKIApAQCAtMTMyNyw2ICsxMzI4LDI5IEBACiAJYmZhX3RyYyhmYWJyaWMtPmZjcywgc3RhdHVzKTsKIH0KIAorCisvKgorICogU2VuZCBBRU4gbm90aWZpY2F0aW9uCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX2ZhYnJpY19hZW5fcG9zdChzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zICpwb3J0LAorCQkJZW51bSBiZmFfcG9ydF9hZW5fZXZlbnQgZXZlbnQpCit7CisJc3RydWN0IGJmYWRfcyAqYmZhZCA9IChzdHJ1Y3QgYmZhZF9zICopcG9ydC0+ZmFicmljLT5mY3MtPmJmYWQ7CisJc3RydWN0IGJmYV9hZW5fZW50cnlfcyAgKmFlbl9lbnRyeTsKKworCWJmYWRfZ2V0X2Flbl9lbnRyeShiZmFkLCBhZW5fZW50cnkpOworCWlmICghYWVuX2VudHJ5KQorCQlyZXR1cm47CisKKwlhZW5fZW50cnktPmFlbl9kYXRhLnBvcnQucHd3biA9IGJmYV9mY3NfbHBvcnRfZ2V0X3B3d24ocG9ydCk7CisJYWVuX2VudHJ5LT5hZW5fZGF0YS5wb3J0LmZ3d24gPSBiZmFfZmNzX2xwb3J0X2dldF9mYWJyaWNfbmFtZShwb3J0KTsKKworCS8qIFNlbmQgdGhlIEFFTiBub3RpZmljYXRpb24gKi8KKwliZmFkX2ltX3Bvc3RfdmVuZG9yX2V2ZW50KGFlbl9lbnRyeSwgYmZhZCwgKytwb3J0LT5mY3MtPmZjc19hZW5fc2VxLAorCQkJCSAgQkZBX0FFTl9DQVRfUE9SVCwgZXZlbnQpOworfQorCiAvKgogICoKICAqIEBwYXJhbVtpbl0gZmFicmljIC0gZmFicmljCkBAIC0xMzU4LDYgKzEzODIsOCBAQAogCQlCRkFfTE9HKEtFUk5fV0FSTklORywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJCSJCYXNlIHBvcnQgV1dOID0gJXMgRmFicmljIFdXTiA9ICVzXG4iLAogCQkJcHd3bl9wdHIsIGZ3d25fcHRyKTsKKwkJYmZhX2Zjc19mYWJyaWNfYWVuX3Bvc3QoJmZhYnJpYy0+YnBvcnQsCisJCQkJQkZBX1BPUlRfQUVOX0ZBQlJJQ19OQU1FX0NIQU5HRSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3MuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjcy5oCmluZGV4IGE1ZjFmYWYuLmU3NWUwN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjcy5oCkBAIC02NzUsNiArNjc1LDcgQEAKIAlzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcyBmYWJyaWM7IC8qICBiYXNlIGZhYnJpYyBzdGF0ZSBtYWNoaW5lICovCiAJc3RydWN0IGJmYV9mY3Nfc3RhdHNfcwlzdGF0czsJLyogIEZDUyBzdGF0aXN0aWNzICovCiAJc3RydWN0IGJmYV93Y19zCQl3YzsJLyogIHdhaXRpbmcgY291bnRlciAqLworCWludAkJCWZjc19hZW5fc2VxOwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19mY3BpbS5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX2ZjcGltLmMKaW5kZXggMjliNDEwOC4uOTI3Mjg0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX2ZjcGltLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX2ZjcGltLmMKQEAgLTM3LDYgKzM3LDggQEAKIAkJCSBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cCwgdm9pZCAqY2JhcmcsCiAJCQkgICAgYmZhX3N0YXR1c190IHJlcV9zdGF0dXMsIHUzMiByc3BfbGVuLAogCQkJICAgIHUzMiByZXNpZF9sZW4sIHN0cnVjdCBmY2hzX3MgKnJzcF9mY2hzKTsKK3N0YXRpYyB2b2lkCWJmYV9mY3NfaXRuaW1fYWVuX3Bvc3Qoc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0sCisJCQllbnVtIGJmYV9pdG5pbV9hZW5fZXZlbnQgZXZlbnQpOwogCiAvKgogICogIGZjc19pdG5pbV9zbSBGQ1MgaXRuaW0gc3RhdGUgbWFjaGluZSBldmVudHMKQEAgLTI2OSw2ICsyNzEsNyBAQAogCQlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJIlRhcmdldCAoV1dOID0gJXMpIGlzIG9ubGluZSBmb3IgaW5pdGlhdG9yIChXV04gPSAlcylcbiIsCiAJCXJwd3duX2J1ZiwgbHB3d25fYnVmKTsKKwkJYmZhX2Zjc19pdG5pbV9hZW5fcG9zdChpdG5pbSwgQkZBX0lUTklNX0FFTl9PTkxJTkUpOwogCQlicmVhazsKIAogCWNhc2UgQkZBX0ZDU19JVE5JTV9TTV9PRkZMSU5FOgpAQCAtMzA1LDE0ICszMDgsMTcgQEAKIAkJYmZhX2l0bmltX29mZmxpbmUoaXRuaW0tPmJmYV9pdG5pbSk7CiAJCXd3bjJzdHIobHB3d25fYnVmLCBiZmFfZmNzX2xwb3J0X2dldF9wd3duKGl0bmltLT5ycG9ydC0+cG9ydCkpOwogCQl3d24yc3RyKHJwd3duX2J1ZiwgaXRuaW0tPnJwb3J0LT5wd3duKTsKLQkJaWYgKGJmYV9mY3NfbHBvcnRfaXNfb25saW5lKGl0bmltLT5ycG9ydC0+cG9ydCkgPT0gQkZBX1RSVUUpCisJCWlmIChiZmFfZmNzX2xwb3J0X2lzX29ubGluZShpdG5pbS0+cnBvcnQtPnBvcnQpID09IEJGQV9UUlVFKSB7CiAJCQlCRkFfTE9HKEtFUk5fRVJSLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkJIlRhcmdldCAoV1dOID0gJXMpIGNvbm5lY3Rpdml0eSBsb3N0IGZvciAiCiAJCQkiaW5pdGlhdG9yIChXV04gPSAlcylcbiIsIHJwd3duX2J1ZiwgbHB3d25fYnVmKTsKLQkJZWxzZQorCQkJYmZhX2Zjc19pdG5pbV9hZW5fcG9zdChpdG5pbSwgQkZBX0lUTklNX0FFTl9ESVNDT05ORUNUKTsKKwkJfSBlbHNlIHsKIAkJCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkJIlRhcmdldCAoV1dOID0gJXMpIG9mZmxpbmVkIGJ5IGluaXRpYXRvciAoV1dOID0gJXMpXG4iLAogCQkJcnB3d25fYnVmLCBscHd3bl9idWYpOworCQkJYmZhX2Zjc19pdG5pbV9hZW5fcG9zdChpdG5pbSwgQkZBX0lUTklNX0FFTl9PRkZMSU5FKTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQkZBX0ZDU19JVE5JTV9TTV9ERUxFVEU6CkBAIC0zODIsNiArMzg4LDMzIEBACiB9CiAKIHN0YXRpYyB2b2lkCitiZmFfZmNzX2l0bmltX2Flbl9wb3N0KHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltLAorCQkJZW51bSBiZmFfaXRuaW1fYWVuX2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0ID0gaXRuaW0tPnJwb3J0OworCXN0cnVjdCBiZmFkX3MgKmJmYWQgPSAoc3RydWN0IGJmYWRfcyAqKWl0bmltLT5mY3MtPmJmYWQ7CisJc3RydWN0IGJmYV9hZW5fZW50cnlfcwkqYWVuX2VudHJ5OworCisJLyogRG9uJ3QgcG9zdCBldmVudHMgZm9yIHdlbGwga25vd24gYWRkcmVzc2VzICovCisJaWYgKEJGQV9GQ1NfUElEX0lTX1dLQShycG9ydC0+cGlkKSkKKwkJcmV0dXJuOworCisJYmZhZF9nZXRfYWVuX2VudHJ5KGJmYWQsIGFlbl9lbnRyeSk7CisJaWYgKCFhZW5fZW50cnkpCisJCXJldHVybjsKKworCWFlbl9lbnRyeS0+YWVuX2RhdGEuaXRuaW0udmZfaWQgPSBycG9ydC0+cG9ydC0+ZmFicmljLT52Zl9pZDsKKwlhZW5fZW50cnktPmFlbl9kYXRhLml0bmltLnBwd3duID0gYmZhX2Zjc19scG9ydF9nZXRfcHd3bigKKwkJCQkJYmZhX2Zjc19nZXRfYmFzZV9wb3J0KGl0bmltLT5mY3MpKTsKKwlhZW5fZW50cnktPmFlbl9kYXRhLml0bmltLmxwd3duID0gYmZhX2Zjc19scG9ydF9nZXRfcHd3bihycG9ydC0+cG9ydCk7CisJYWVuX2VudHJ5LT5hZW5fZGF0YS5pdG5pbS5ycHd3biA9IHJwb3J0LT5wd3duOworCisJLyogU2VuZCB0aGUgQUVOIG5vdGlmaWNhdGlvbiAqLworCWJmYWRfaW1fcG9zdF92ZW5kb3JfZXZlbnQoYWVuX2VudHJ5LCBiZmFkLCArK3Jwb3J0LT5mY3MtPmZjc19hZW5fc2VxLAorCQkJCSAgQkZBX0FFTl9DQVRfSVROSU0sIGV2ZW50KTsKK30KKworc3RhdGljIHZvaWQKIGJmYV9mY3NfaXRuaW1fc2VuZF9wcmxpKHZvaWQgKml0bmltX2NiYXJnLCBzdHJ1Y3QgYmZhX2ZjeHBfcyAqZmN4cF9hbGxvY2VkKQogewogCXN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltID0gaXRuaW1fY2Jhcmc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfbHBvcnQuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19scG9ydC5jCmluZGV4IGY4MjUxYTkuLmQ0Zjk1MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19scG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19scG9ydC5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgImJmYWRfZHJ2LmgiCisjaW5jbHVkZSAiYmZhZF9pbS5oIgogI2luY2x1ZGUgImJmYV9mY3MuaCIKICNpbmNsdWRlICJiZmFfZmNidWlsZC5oIgogI2luY2x1ZGUgImJmYV9mYy5oIgpAQCAtMzAwLDYgKzMwMSwzMSBAQAogICovCiAKIC8qCisgKiBTZW5kIEFFTiBub3RpZmljYXRpb24KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfbHBvcnRfYWVuX3Bvc3Qoc3RydWN0IGJmYV9mY3NfbHBvcnRfcyAqcG9ydCwKKwkJCWVudW0gYmZhX2xwb3J0X2Flbl9ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3QgYmZhZF9zICpiZmFkID0gKHN0cnVjdCBiZmFkX3MgKilwb3J0LT5mYWJyaWMtPmZjcy0+YmZhZDsKKwlzdHJ1Y3QgYmZhX2Flbl9lbnRyeV9zICAqYWVuX2VudHJ5OworCisJYmZhZF9nZXRfYWVuX2VudHJ5KGJmYWQsIGFlbl9lbnRyeSk7CisJaWYgKCFhZW5fZW50cnkpCisJCXJldHVybjsKKworCWFlbl9lbnRyeS0+YWVuX2RhdGEubHBvcnQudmZfaWQgPSBwb3J0LT5mYWJyaWMtPnZmX2lkOworCWFlbl9lbnRyeS0+YWVuX2RhdGEubHBvcnQucm9sZXMgPSBwb3J0LT5wb3J0X2NmZy5yb2xlczsKKwlhZW5fZW50cnktPmFlbl9kYXRhLmxwb3J0LnBwd3duID0gYmZhX2Zjc19scG9ydF9nZXRfcHd3bigKKwkJCQkJYmZhX2Zjc19nZXRfYmFzZV9wb3J0KHBvcnQtPmZjcykpOworCWFlbl9lbnRyeS0+YWVuX2RhdGEubHBvcnQubHB3d24gPSBiZmFfZmNzX2xwb3J0X2dldF9wd3duKHBvcnQpOworCisJLyogU2VuZCB0aGUgQUVOIG5vdGlmaWNhdGlvbiAqLworCWJmYWRfaW1fcG9zdF92ZW5kb3JfZXZlbnQoYWVuX2VudHJ5LCBiZmFkLCArK3BvcnQtPmZjcy0+ZmNzX2Flbl9zZXEsCisJCQkJICBCRkFfQUVOX0NBVF9MUE9SVCwgZXZlbnQpOworfQorCisvKgogICogU2VuZCBhIExTIHJlamVjdAogICovCiBzdGF0aWMgdm9pZApAQCAtNTkzLDYgKzYxOSw3IEBACiAJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCSJMb2dpY2FsIHBvcnQgb25saW5lOiBXV04gPSAlcyBSb2xlID0gJXNcbiIsCiAJCWxwd3duX2J1ZiwgIkluaXRpYXRvciIpOworCWJmYV9mY3NfbHBvcnRfYWVuX3Bvc3QocG9ydCwgQkZBX0xQT1JUX0FFTl9PTkxJTkUpOwogCiAJYmZhZC0+YmZhZF9mbGFncyB8PSBCRkFEX1BPUlRfT05MSU5FOwogfQpAQCAtNjExLDE0ICs2MzgsMTcgQEAKIAogCXd3bjJzdHIobHB3d25fYnVmLCBiZmFfZmNzX2xwb3J0X2dldF9wd3duKHBvcnQpKTsKIAlpZiAoYmZhX3NtX2NtcF9zdGF0ZShwb3J0LT5mYWJyaWMsCi0JCQliZmFfZmNzX2ZhYnJpY19zbV9vbmxpbmUpID09IEJGQV9UUlVFKQorCQkJYmZhX2Zjc19mYWJyaWNfc21fb25saW5lKSA9PSBCRkFfVFJVRSkgewogCQlCRkFfTE9HKEtFUk5fRVJSLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkiTG9naWNhbCBwb3J0IGxvc3QgZmFicmljIGNvbm5lY3Rpdml0eTogV1dOID0gJXMgUm9sZSA9ICVzXG4iLAogCQlscHd3bl9idWYsICJJbml0aWF0b3IiKTsKLQllbHNlCisJCWJmYV9mY3NfbHBvcnRfYWVuX3Bvc3QocG9ydCwgQkZBX0xQT1JUX0FFTl9ESVNDT05ORUNUKTsKKwl9IGVsc2UgewogCQlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJIkxvZ2ljYWwgcG9ydCB0YWtlbiBvZmZsaW5lOiBXV04gPSAlcyBSb2xlID0gJXNcbiIsCiAJCWxwd3duX2J1ZiwgIkluaXRpYXRvciIpOworCQliZmFfZmNzX2xwb3J0X2Flbl9wb3N0KHBvcnQsIEJGQV9MUE9SVF9BRU5fT0ZGTElORSk7CisJfQogCiAJbGlzdF9mb3JfZWFjaF9zYWZlKHFlLCBxZW4sICZwb3J0LT5ycG9ydF9xKSB7CiAJCXJwb3J0ID0gKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKikgcWU7CkBAIC02NzYsNiArNzA2LDcgQEAKIAlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJIkxvZ2ljYWwgcG9ydCBkZWxldGVkOiBXV04gPSAlcyBSb2xlID0gJXNcbiIsCiAJCWxwd3duX2J1ZiwgIkluaXRpYXRvciIpOworCWJmYV9mY3NfbHBvcnRfYWVuX3Bvc3QocG9ydCwgQkZBX0xQT1JUX0FFTl9ERUxFVEUpOwogCiAJLyogQmFzZSBwb3J0IHdpbGwgYmUgZGVsZXRlZCBieSB0aGUgT1MgZHJpdmVyICovCiAJaWYgKHBvcnQtPnZwb3J0KSB7CkBAIC05NzMsNiArMTAwNCw3IEBACiAJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCSJOZXcgbG9naWNhbCBwb3J0IGNyZWF0ZWQ6IFdXTiA9ICVzIFJvbGUgPSAlc1xuIiwKIAkJbHB3d25fYnVmLCAiSW5pdGlhdG9yIik7CisJYmZhX2Zjc19scG9ydF9hZW5fcG9zdChscG9ydCwgQkZBX0xQT1JUX0FFTl9ORVcpOwogCiAJYmZhX3NtX3NldF9zdGF0ZShscG9ydCwgYmZhX2Zjc19scG9ydF9zbV91bmluaXQpOwogCWJmYV9zbV9zZW5kX2V2ZW50KGxwb3J0LCBCRkFfRkNTX1BPUlRfU01fQ1JFQVRFKTsKQEAgLTU1NTksNiArNTU5MSwzMSBAQAogICogIGZjc192cG9ydF9wcml2YXRlIEZDUyB2aXJ0dWFsIHBvcnQgcHJpdmF0ZSBmdW5jdGlvbnMKICAqLwogLyoKKyAqIFNlbmQgQUVOIG5vdGlmaWNhdGlvbgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc192cG9ydF9hZW5fcG9zdChzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zICpwb3J0LAorCQkgICAgICAgZW51bSBiZmFfbHBvcnRfYWVuX2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCBiZmFkX3MgKmJmYWQgPSAoc3RydWN0IGJmYWRfcyAqKXBvcnQtPmZhYnJpYy0+ZmNzLT5iZmFkOworCXN0cnVjdCBiZmFfYWVuX2VudHJ5X3MgICphZW5fZW50cnk7CisKKwliZmFkX2dldF9hZW5fZW50cnkoYmZhZCwgYWVuX2VudHJ5KTsKKwlpZiAoIWFlbl9lbnRyeSkKKwkJcmV0dXJuOworCisJYWVuX2VudHJ5LT5hZW5fZGF0YS5scG9ydC52Zl9pZCA9IHBvcnQtPmZhYnJpYy0+dmZfaWQ7CisJYWVuX2VudHJ5LT5hZW5fZGF0YS5scG9ydC5yb2xlcyA9IHBvcnQtPnBvcnRfY2ZnLnJvbGVzOworCWFlbl9lbnRyeS0+YWVuX2RhdGEubHBvcnQucHB3d24gPSBiZmFfZmNzX2xwb3J0X2dldF9wd3duKAorCQkJCQliZmFfZmNzX2dldF9iYXNlX3BvcnQocG9ydC0+ZmNzKSk7CisJYWVuX2VudHJ5LT5hZW5fZGF0YS5scG9ydC5scHd3biA9IGJmYV9mY3NfbHBvcnRfZ2V0X3B3d24ocG9ydCk7CisKKwkvKiBTZW5kIHRoZSBBRU4gbm90aWZpY2F0aW9uICovCisJYmZhZF9pbV9wb3N0X3ZlbmRvcl9ldmVudChhZW5fZW50cnksIGJmYWQsICsrcG9ydC0+ZmNzLT5mY3NfYWVuX3NlcSwKKwkJCQkgIEJGQV9BRU5fQ0FUX0xQT1JULCBldmVudCk7Cit9CisKKy8qCiAgKiBUaGlzIHJvdXRpbmUgd2lsbCBiZSBjYWxsZWQgdG8gc2VuZCBhIEZESVNDIGNvbW1hbmQuCiAgKi8KIHN0YXRpYyB2b2lkCkBAIC01NTg1LDggKzU2NDIsMTEgQEAKIAljYXNlIEZDX0xTX1JKVF9FWFBfSU5WQUxJRF9OUE9SVF9JRDogLyogYnkgQ2lzY28gKi8KIAkJaWYgKHZwb3J0LT5mZGlzY19yZXRyaWVzIDwgQkZBX0ZDU19WUE9SVF9NQVhfUkVUUklFUykKIAkJCWJmYV9zbV9zZW5kX2V2ZW50KHZwb3J0LCBCRkFfRkNTX1ZQT1JUX1NNX1JTUF9FUlJPUik7Ci0JCWVsc2UKKwkJZWxzZSB7CisJCQliZmFfZmNzX3Zwb3J0X2Flbl9wb3N0KCZ2cG9ydC0+bHBvcnQsCisJCQkJCUJGQV9MUE9SVF9BRU5fTlBJVl9EVVBfV1dOKTsKIAkJCWJmYV9zbV9zZW5kX2V2ZW50KHZwb3J0LCBCRkFfRkNTX1ZQT1JUX1NNX1JTUF9EVVBfV1dOKTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgRkNfTFNfUkpUX0VYUF9JTlNVRkZfUkVTOgpAQCAtNTU5NiwxMSArNTY1NiwxNyBAQAogCQkgKi8KIAkJaWYgKHZwb3J0LT5mZGlzY19yZXRyaWVzIDwgQkZBX0ZDU19WUE9SVF9NQVhfUkVUUklFUykKIAkJCWJmYV9zbV9zZW5kX2V2ZW50KHZwb3J0LCBCRkFfRkNTX1ZQT1JUX1NNX1JTUF9FUlJPUik7Ci0JCWVsc2UKKwkJZWxzZSB7CisJCQliZmFfZmNzX3Zwb3J0X2Flbl9wb3N0KCZ2cG9ydC0+bHBvcnQsCisJCQkJCUJGQV9MUE9SVF9BRU5fTlBJVl9GQUJSSUNfTUFYKTsKIAkJCWJmYV9zbV9zZW5kX2V2ZW50KHZwb3J0LCBCRkFfRkNTX1ZQT1JUX1NNX1JTUF9GQUlMRUQpOworCQl9CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKKwkJaWYgKHZwb3J0LT5mZGlzY19yZXRyaWVzID09IDApCisJCQliZmFfZmNzX3Zwb3J0X2Flbl9wb3N0KCZ2cG9ydC0+bHBvcnQsCisJCQkJCUJGQV9MUE9SVF9BRU5fTlBJVl9VTktOT1dOKTsKIAkJYmZhX3NtX3NlbmRfZXZlbnQodnBvcnQsIEJGQV9GQ1NfVlBPUlRfU01fUlNQX0VSUk9SKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfcnBvcnQuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19ycG9ydC5jCmluZGV4IDJjNTE0NDUuLjUyNjI4ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19ycG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19ycG9ydC5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgImJmYWRfZHJ2LmgiCisjaW5jbHVkZSAiYmZhZF9pbS5oIgogI2luY2x1ZGUgImJmYV9mY3MuaCIKICNpbmNsdWRlICJiZmFfZmNidWlsZC5oIgogCkBAIC0yMDQxLDYgKzIwNDIsMzUgQEAKIH0KIAogc3RhdGljIHZvaWQKK2JmYV9mY3NfcnBvcnRfYWVuX3Bvc3Qoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQsCisJCQllbnVtIGJmYV9ycG9ydF9hZW5fZXZlbnQgZXZlbnQsCisJCQlzdHJ1Y3QgYmZhX3Jwb3J0X2Flbl9kYXRhX3MgKmRhdGEpCit7CisJc3RydWN0IGJmYV9mY3NfbHBvcnRfcyAqcG9ydCA9IHJwb3J0LT5wb3J0OworCXN0cnVjdCBiZmFkX3MgKmJmYWQgPSAoc3RydWN0IGJmYWRfcyAqKXBvcnQtPmZjcy0+YmZhZDsKKwlzdHJ1Y3QgYmZhX2Flbl9lbnRyeV9zICAqYWVuX2VudHJ5OworCisJYmZhZF9nZXRfYWVuX2VudHJ5KGJmYWQsIGFlbl9lbnRyeSk7CisJaWYgKCFhZW5fZW50cnkpCisJCXJldHVybjsKKworCWlmIChldmVudCA9PSBCRkFfUlBPUlRfQUVOX1FPU19QUklPKQorCQlhZW5fZW50cnktPmFlbl9kYXRhLnJwb3J0LnByaXYucW9zID0gZGF0YS0+cHJpdi5xb3M7CisJZWxzZSBpZiAoZXZlbnQgPT0gQkZBX1JQT1JUX0FFTl9RT1NfRkxPV0lEKQorCQlhZW5fZW50cnktPmFlbl9kYXRhLnJwb3J0LnByaXYucW9zID0gZGF0YS0+cHJpdi5xb3M7CisKKwlhZW5fZW50cnktPmFlbl9kYXRhLnJwb3J0LnZmX2lkID0gcnBvcnQtPnBvcnQtPmZhYnJpYy0+dmZfaWQ7CisJYWVuX2VudHJ5LT5hZW5fZGF0YS5ycG9ydC5wcHd3biA9IGJmYV9mY3NfbHBvcnRfZ2V0X3B3d24oCisJCQkJCWJmYV9mY3NfZ2V0X2Jhc2VfcG9ydChycG9ydC0+ZmNzKSk7CisJYWVuX2VudHJ5LT5hZW5fZGF0YS5ycG9ydC5scHd3biA9IGJmYV9mY3NfbHBvcnRfZ2V0X3B3d24ocnBvcnQtPnBvcnQpOworCWFlbl9lbnRyeS0+YWVuX2RhdGEucnBvcnQucnB3d24gPSBycG9ydC0+cHd3bjsKKworCS8qIFNlbmQgdGhlIEFFTiBub3RpZmljYXRpb24gKi8KKwliZmFkX2ltX3Bvc3RfdmVuZG9yX2V2ZW50KGFlbl9lbnRyeSwgYmZhZCwgKytycG9ydC0+ZmNzLT5mY3NfYWVuX3NlcSwKKwkJCQkgIEJGQV9BRU5fQ0FUX1JQT1JULCBldmVudCk7Cit9CisKK3N0YXRpYyB2b2lkCiBiZmFfZmNzX3Jwb3J0X29ubGluZV9hY3Rpb24oc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQpCiB7CiAJc3RydWN0IGJmYV9mY3NfbHBvcnRfcyAqcG9ydCA9IHJwb3J0LT5wb3J0OwpAQCAtMjA2MywxMCArMjA5MywxMiBAQAogCiAJd3duMnN0cihscHd3bl9idWYsIGJmYV9mY3NfbHBvcnRfZ2V0X3B3d24ocG9ydCkpOwogCXd3bjJzdHIocnB3d25fYnVmLCBycG9ydC0+cHd3bik7Ci0JaWYgKCFCRkFfRkNTX1BJRF9JU19XS0EocnBvcnQtPnBpZCkpCisJaWYgKCFCRkFfRkNTX1BJRF9JU19XS0EocnBvcnQtPnBpZCkpIHsKIAkJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCSJSZW1vdGUgcG9ydCAoV1dOID0gJXMpIG9ubGluZSBmb3IgbG9naWNhbCBwb3J0IChXV04gPSAlcylcbiIsCiAJCXJwd3duX2J1ZiwgbHB3d25fYnVmKTsKKwkJYmZhX2Zjc19ycG9ydF9hZW5fcG9zdChycG9ydCwgQkZBX1JQT1JUX0FFTl9PTkxJTkUsIE5VTEwpOworCX0KIH0KIAogc3RhdGljIHZvaWQKQEAgLTIwODMsMTYgKzIxMTUsMjEgQEAKIAl3d24yc3RyKGxwd3duX2J1ZiwgYmZhX2Zjc19scG9ydF9nZXRfcHd3bihwb3J0KSk7CiAJd3duMnN0cihycHd3bl9idWYsIHJwb3J0LT5wd3duKTsKIAlpZiAoIUJGQV9GQ1NfUElEX0lTX1dLQShycG9ydC0+cGlkKSkgewotCQlpZiAoYmZhX2Zjc19scG9ydF9pc19vbmxpbmUocnBvcnQtPnBvcnQpID09IEJGQV9UUlVFKQorCQlpZiAoYmZhX2Zjc19scG9ydF9pc19vbmxpbmUocnBvcnQtPnBvcnQpID09IEJGQV9UUlVFKSB7CiAJCQlCRkFfTE9HKEtFUk5fRVJSLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkJCSJSZW1vdGUgcG9ydCAoV1dOID0gJXMpIGNvbm5lY3Rpdml0eSBsb3N0IGZvciAiCiAJCQkJImxvZ2ljYWwgcG9ydCAoV1dOID0gJXMpXG4iLAogCQkJCXJwd3duX2J1ZiwgbHB3d25fYnVmKTsKLQkJZWxzZQorCQkJYmZhX2Zjc19ycG9ydF9hZW5fcG9zdChycG9ydCwKKwkJCQlCRkFfUlBPUlRfQUVOX0RJU0NPTk5FQ1QsIE5VTEwpOworCQl9IGVsc2UgewogCQkJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCQkJIlJlbW90ZSBwb3J0IChXV04gPSAlcykgb2ZmbGluZWQgYnkgIgogCQkJCSJsb2dpY2FsIHBvcnQgKFdXTiA9ICVzKVxuIiwKIAkJCQlycHd3bl9idWYsIGxwd3duX2J1Zik7CisJCQliZmFfZmNzX3Jwb3J0X2Flbl9wb3N0KHJwb3J0LAorCQkJCUJGQV9SUE9SVF9BRU5fT0ZGTElORSwgTlVMTCk7CisJCX0KIAl9CiAKIAlpZiAoYmZhX2Zjc19scG9ydF9pc19pbml0aWF0b3IocG9ydCkpIHsKQEAgLTIzNjYsOCArMjQwMywxMSBAQAogCQlzdHJ1Y3QgYmZhX3Jwb3J0X3Fvc19hdHRyX3MgbmV3X3Fvc19hdHRyKQogewogCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0ID0gKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKikgY2Jhcmc7CisJc3RydWN0IGJmYV9ycG9ydF9hZW5fZGF0YV9zIGFlbl9kYXRhOwogCiAJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cHd3bik7CisJYWVuX2RhdGEucHJpdi5xb3MgPSBuZXdfcW9zX2F0dHI7CisJYmZhX2Zjc19ycG9ydF9hZW5fcG9zdChycG9ydCwgQkZBX1JQT1JUX0FFTl9RT1NfRkxPV0lELCAmYWVuX2RhdGEpOwogfQogCiAvKgpAQCAtMjM5MCw4ICsyNDMwLDExIEBACiAJCXN0cnVjdCBiZmFfcnBvcnRfcW9zX2F0dHJfcyBuZXdfcW9zX2F0dHIpCiB7CiAJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqKSBjYmFyZzsKKwlzdHJ1Y3QgYmZhX3Jwb3J0X2Flbl9kYXRhX3MgYWVuX2RhdGE7CiAKIAliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5wd3duKTsKKwlhZW5fZGF0YS5wcml2LnFvcyA9IG5ld19xb3NfYXR0cjsKKwliZmFfZmNzX3Jwb3J0X2Flbl9wb3N0KHJwb3J0LCBCRkFfUlBPUlRfQUVOX1FPU19QUklPLCAmYWVuX2RhdGEpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaHdfY2IuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2h3X2NiLmMKaW5kZXggZTdmZmQ4Mi4uZWEyNGQ0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaHdfY2IuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9od19jYi5jCkBAIC00MiwxMSArNDIsMzYgQEAKIAkJCWJmYS0+aW9jZmMuYmZhX3JlZ3MuaW50cl9zdGF0dXMpOwogfQogCisvKgorICogQWN0aW9ucyB0byByZXNwb25kIFJNRSBJbnRlcnJ1cHQgZm9yIENyb3NzYm93IEFTSUM6CisgKiAtIFdyaXRlIDEgdG8gSW50ZXJydXB0IFN0YXR1cyByZWdpc3RlcgorICogICAgICAgICAgICAgIElOVFggLSBkb25lIGluIGJmYV9pbnR4KCkKKyAqICAgICAgICAgICAgICBNU0lYIC0gZG9uZSBpbiBiZmFfaHdjYl9yc3BxX2Fja19tc2l4KCkKKyAqIC0gVXBkYXRlIENJIChvbmx5IGlmIG5ldyBDSSkKKyAqLwogc3RhdGljIHZvaWQKLWJmYV9od2NiX3JzcHFfYWNrX21zaXgoc3RydWN0IGJmYV9zICpiZmEsIGludCByc3BxKQorYmZhX2h3Y2JfcnNwcV9hY2tfbXNpeChzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEsIHUzMiBjaSkKIHsKIAl3cml0ZWwoX19IRk5fSU5UX1JNRV9RMCA8PCBSTUVfUV9OVU0oYmZhX2lvY19wY2lmbigmYmZhLT5pb2MpLCByc3BxKSwKLQkJCWJmYS0+aW9jZmMuYmZhX3JlZ3MuaW50cl9zdGF0dXMpOworCQliZmEtPmlvY2ZjLmJmYV9yZWdzLmludHJfc3RhdHVzKTsKKworCWlmIChiZmFfcnNwcV9jaShiZmEsIHJzcHEpID09IGNpKQorCQlyZXR1cm47CisKKwliZmFfcnNwcV9jaShiZmEsIHJzcHEpID0gY2k7CisJd3JpdGVsKGNpLCBiZmEtPmlvY2ZjLmJmYV9yZWdzLnJtZV9xX2NpW3JzcHFdKTsKKwltbWlvd2IoKTsKK30KKwordm9pZAorYmZhX2h3Y2JfcnNwcV9hY2soc3RydWN0IGJmYV9zICpiZmEsIGludCByc3BxLCB1MzIgY2kpCit7CisJaWYgKGJmYV9yc3BxX2NpKGJmYSwgcnNwcSkgPT0gY2kpCisJCXJldHVybjsKKworCWJmYV9yc3BxX2NpKGJmYSwgcnNwcSkgPSBjaTsKKwl3cml0ZWwoY2ksIGJmYS0+aW9jZmMuYmZhX3JlZ3Mucm1lX3FfY2lbcnNwcV0pOworCW1taW93YigpOwogfQogCiB2b2lkCkBAIC0xNDksOCArMTc0LDEzIEBACiB2b2lkCiBiZmFfaHdjYl9pc3JfbW9kZV9zZXQoc3RydWN0IGJmYV9zICpiZmEsIGJmYV9ib29sZWFuX3QgbXNpeCkKIHsKLQliZmEtPmlvY2ZjLmh3aWYuaHdfcmVxcV9hY2sgPSBiZmFfaHdjYl9yZXFxX2Fja19tc2l4OwotCWJmYS0+aW9jZmMuaHdpZi5od19yc3BxX2FjayA9IGJmYV9od2NiX3JzcHFfYWNrX21zaXg7CisJaWYgKG1zaXgpIHsKKwkJYmZhLT5pb2NmYy5od2lmLmh3X3JlcXFfYWNrID0gYmZhX2h3Y2JfcmVxcV9hY2tfbXNpeDsKKwkJYmZhLT5pb2NmYy5od2lmLmh3X3JzcHFfYWNrID0gYmZhX2h3Y2JfcnNwcV9hY2tfbXNpeDsKKwl9IGVsc2UgeworCQliZmEtPmlvY2ZjLmh3aWYuaHdfcmVxcV9hY2sgPSBOVUxMOworCQliZmEtPmlvY2ZjLmh3aWYuaHdfcnNwcV9hY2sgPSBiZmFfaHdjYl9yc3BxX2FjazsKKwl9CiB9CiAKIHZvaWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2h3X2N0LmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9od19jdC5jCmluZGV4IDk4OWJiY2UuLjYzNzUyN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2h3X2N0LmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaHdfY3QuYwpAQCAtNjQsMTMgKzY0LDM2IEBACiAJd3JpdGVsKHIzMiwgYmZhLT5pb2NmYy5iZmFfcmVncy5jcGVfcV9jdHJsW3JlcXFdKTsKIH0KIAorLyoKKyAqIEFjdGlvbnMgdG8gcmVzcG9uZCBSTUUgSW50ZXJydXB0IGZvciBDYXRhcHVsdCBBU0lDOgorICogLSBXcml0ZSAxIHRvIEludGVycnVwdCBTdGF0dXMgcmVnaXN0ZXIgKElOVHggb25seSAtIGRvbmUgaW4gYmZhX2ludHgoKSkKKyAqIC0gQWNrbm93bGVkZ2UgYnkgd3JpdGluZyB0byBSTUUgUXVldWUgQ29udHJvbCByZWdpc3RlcgorICogLSBVcGRhdGUgQ0kKKyAqLwogdm9pZAotYmZhX2h3Y3RfcnNwcV9hY2soc3RydWN0IGJmYV9zICpiZmEsIGludCByc3BxKQorYmZhX2h3Y3RfcnNwcV9hY2soc3RydWN0IGJmYV9zICpiZmEsIGludCByc3BxLCB1MzIgY2kpCiB7CiAJdTMyCXIzMjsKIAogCXIzMiA9IHJlYWRsKGJmYS0+aW9jZmMuYmZhX3JlZ3Mucm1lX3FfY3RybFtyc3BxXSk7CiAJd3JpdGVsKHIzMiwgYmZhLT5pb2NmYy5iZmFfcmVncy5ybWVfcV9jdHJsW3JzcHFdKTsKKworCWJmYV9yc3BxX2NpKGJmYSwgcnNwcSkgPSBjaTsKKwl3cml0ZWwoY2ksIGJmYS0+aW9jZmMuYmZhX3JlZ3Mucm1lX3FfY2lbcnNwcV0pOworCW1taW93YigpOworfQorCisvKgorICogQWN0aW9ucyB0byByZXNwb25kIFJNRSBJbnRlcnJ1cHQgZm9yIENhdGFwdWx0MiBBU0lDOgorICogLSBXcml0ZSAxIHRvIEludGVycnVwdCBTdGF0dXMgcmVnaXN0ZXIgKElOVHggb25seSAtIGRvbmUgaW4gYmZhX2ludHgoKSkKKyAqIC0gVXBkYXRlIENJCisgKi8KK3ZvaWQKK2JmYV9od2N0Ml9yc3BxX2FjayhzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEsIHUzMiBjaSkKK3sKKwliZmFfcnNwcV9jaShiZmEsIHJzcHEpID0gY2k7CisJd3JpdGVsKGNpLCBiZmEtPmlvY2ZjLmJmYV9yZWdzLnJtZV9xX2NpW3JzcHFdKTsKKwltbWlvd2IoKTsKIH0KIAogdm9pZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuYwppbmRleCBkNmMyYmYzLi4xYWM1YWVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuYwpAQCAtMTYsNiArMTYsNyBAQAogICovCiAKICNpbmNsdWRlICJiZmFkX2Rydi5oIgorI2luY2x1ZGUgImJmYWRfaW0uaCIKICNpbmNsdWRlICJiZmFfaW9jLmgiCiAjaW5jbHVkZSAiYmZpX3JlZy5oIgogI2luY2x1ZGUgImJmYV9kZWZzLmgiCkBAIC00NTgsNiArNDU5LDcgQEAKIAlpb2MtPmNiZm4tPmVuYWJsZV9jYmZuKGlvYy0+YmZhLCBCRkFfU1RBVFVTX09LKTsKIAliZmFfaW9jX2V2ZW50X25vdGlmeShpb2MsIEJGQV9JT0NfRV9FTkFCTEVEKTsKIAlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwgIklPQyBlbmFibGVkXG4iKTsKKwliZmFfaW9jX2Flbl9wb3N0KGlvYywgQkZBX0lPQ19BRU5fRU5BQkxFKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTUwMiw2ICs1MDQsNyBAQAogCXN0cnVjdCBiZmFkX3MgKmJmYWQgPSAoc3RydWN0IGJmYWRfcyAqKWlvYy0+YmZhLT5iZmFkOwogCWJmYV9mc21fc2VuZF9ldmVudCgmaW9jLT5pb2NwZiwgSU9DUEZfRV9ESVNBQkxFKTsKIAlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwgIklPQyBkaXNhYmxlZFxuIik7CisJYmZhX2lvY19hZW5fcG9zdChpb2MsIEJGQV9JT0NfQUVOX0RJU0FCTEUpOwogfQogCiAvKgpAQCAtMTk2Niw2ICsxOTY5LDcgQEAKIAogCUJGQV9MT0coS0VSTl9DUklULCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkiSGVhcnQgQmVhdCBvZiBJT0MgaGFzIGZhaWxlZFxuIik7CisJYmZhX2lvY19hZW5fcG9zdChpb2MsIEJGQV9JT0NfQUVOX0hCRkFJTCk7CiAKIH0KIApAQCAtMTk4MCw2ICsxOTg0LDcgQEAKIAlCRkFfTE9HKEtFUk5fV0FSTklORywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJIlJ1bm5pbmcgZmlybXdhcmUgdmVyc2lvbiBpcyBpbmNvbXBhdGlibGUgIgogCQkid2l0aCB0aGUgZHJpdmVyIHZlcnNpb25cbiIpOworCWJmYV9pb2NfYWVuX3Bvc3QoaW9jLCBCRkFfSU9DX0FFTl9GV01JU01BVENIKTsKIH0KIAogYmZhX3N0YXR1c190CkBAIC0yNjc5LDYgKzI2ODQsNDMgQEAKIH0KIAogLyoKKyAqIFNlbmQgQUVOIG5vdGlmaWNhdGlvbgorICovCit2b2lkCitiZmFfaW9jX2Flbl9wb3N0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgZW51bSBiZmFfaW9jX2Flbl9ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3QgYmZhZF9zICpiZmFkID0gKHN0cnVjdCBiZmFkX3MgKilpb2MtPmJmYS0+YmZhZDsKKwlzdHJ1Y3QgYmZhX2Flbl9lbnRyeV9zCSphZW5fZW50cnk7CisJZW51bSBiZmFfaW9jX3R5cGVfZSBpb2NfdHlwZTsKKworCWJmYWRfZ2V0X2Flbl9lbnRyeShiZmFkLCBhZW5fZW50cnkpOworCWlmICghYWVuX2VudHJ5KQorCQlyZXR1cm47CisKKwlpb2NfdHlwZSA9IGJmYV9pb2NfZ2V0X3R5cGUoaW9jKTsKKwlzd2l0Y2ggKGlvY190eXBlKSB7CisJY2FzZSBCRkFfSU9DX1RZUEVfRkM6CisJCWFlbl9lbnRyeS0+YWVuX2RhdGEuaW9jLnB3d24gPSBpb2MtPmF0dHItPnB3d247CisJCWJyZWFrOworCWNhc2UgQkZBX0lPQ19UWVBFX0ZDb0U6CisJCWFlbl9lbnRyeS0+YWVuX2RhdGEuaW9jLnB3d24gPSBpb2MtPmF0dHItPnB3d247CisJCWFlbl9lbnRyeS0+YWVuX2RhdGEuaW9jLm1hYyA9IGJmYV9pb2NfZ2V0X21hYyhpb2MpOworCQlicmVhazsKKwljYXNlIEJGQV9JT0NfVFlQRV9MTDoKKwkJYWVuX2VudHJ5LT5hZW5fZGF0YS5pb2MubWFjID0gYmZhX2lvY19nZXRfbWFjKGlvYyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk5fT04oaW9jX3R5cGUgIT0gQkZBX0lPQ19UWVBFX0ZDKTsKKwkJYnJlYWs7CisJfQorCisJLyogU2VuZCB0aGUgQUVOIG5vdGlmaWNhdGlvbiAqLworCWFlbl9lbnRyeS0+YWVuX2RhdGEuaW9jLmlvY190eXBlID0gaW9jX3R5cGU7CisJYmZhZF9pbV9wb3N0X3ZlbmRvcl9ldmVudChhZW5fZW50cnksIGJmYWQsICsraW9jLT5pb2NfYWVuX3NlcSwKKwkJCQkgIEJGQV9BRU5fQ0FUX0lPQywgZXZlbnQpOworfQorCisvKgogICogUmV0cmlldmUgc2F2ZWQgZmlybXdhcmUgdHJhY2UgZnJvbSBhIHByaW9yIElPQyBmYWlsdXJlLgogICovCiBiZmFfc3RhdHVzX3QKQEAgLTI4NzksNiArMjkyMSwxMCBAQAogewogCWlmIChiZmFfaW9jX2dldF90eXBlKGlvYykgPT0gQkZBX0lPQ19UWVBFX0xMKQogCQlyZXR1cm47CisJaWYgKGlvYy0+YXR0ci0+bnd3biA9PSAwKQorCQliZmFfaW9jX2Flbl9wb3N0KGlvYywgQkZBX0lPQ19BRU5fSU5WQUxJRF9OV1dOKTsKKwlpZiAoaW9jLT5hdHRyLT5wd3duID09IDApCisJCWJmYV9pb2NfYWVuX3Bvc3QoaW9jLCBCRkFfSU9DX0FFTl9JTlZBTElEX1BXV04pOwogfQogCiAvKgpAQCAtMzQ0Myw2ICszNDg5LDU0IEBACiB9CiAKIC8qCisgKiBTRlAncyBTdGF0ZSBDaGFuZ2UgTm90aWZpY2F0aW9uIHBvc3QgdG8gQUVOCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfc2ZwX3Njbl9hZW5fcG9zdChzdHJ1Y3QgYmZhX3NmcF9zICpzZnAsIHN0cnVjdCBiZmlfc2ZwX3Njbl9zICpyc3ApCit7CisJc3RydWN0IGJmYWRfcyAqYmZhZCA9IChzdHJ1Y3QgYmZhZF9zICopc2ZwLT5pb2MtPmJmYS0+YmZhZDsKKwlzdHJ1Y3QgYmZhX2Flbl9lbnRyeV9zICAqYWVuX2VudHJ5OworCWVudW0gYmZhX3BvcnRfYWVuX2V2ZW50IGFlbl9ldnQgPSAwOworCisJYmZhX3RyYyhzZnAsICgoKHU2NClyc3AtPnBvbWx2bCkgPDwgMTYpIHwgKCgodTY0KXJzcC0+c2ZwaWQpIDw8IDgpIHwKKwkJICAgICAgKCh1NjQpcnNwLT5ldmVudCkpOworCisJYmZhZF9nZXRfYWVuX2VudHJ5KGJmYWQsIGFlbl9lbnRyeSk7CisJaWYgKCFhZW5fZW50cnkpCisJCXJldHVybjsKKworCWFlbl9lbnRyeS0+YWVuX2RhdGEucG9ydC5pb2NfdHlwZSA9IGJmYV9pb2NfZ2V0X3R5cGUoc2ZwLT5pb2MpOworCWFlbl9lbnRyeS0+YWVuX2RhdGEucG9ydC5wd3duID0gc2ZwLT5pb2MtPmF0dHItPnB3d247CisJYWVuX2VudHJ5LT5hZW5fZGF0YS5wb3J0Lm1hYyA9IGJmYV9pb2NfZ2V0X21hYyhzZnAtPmlvYyk7CisKKwlzd2l0Y2ggKHJzcC0+ZXZlbnQpIHsKKwljYXNlIEJGQV9TRlBfU0NOX0lOU0VSVEVEOgorCQlhZW5fZXZ0ID0gQkZBX1BPUlRfQUVOX1NGUF9JTlNFUlQ7CisJCWJyZWFrOworCWNhc2UgQkZBX1NGUF9TQ05fUkVNT1ZFRDoKKwkJYWVuX2V2dCA9IEJGQV9QT1JUX0FFTl9TRlBfUkVNT1ZFOworCQlicmVhazsKKwljYXNlIEJGQV9TRlBfU0NOX0ZBSUxFRDoKKwkJYWVuX2V2dCA9IEJGQV9QT1JUX0FFTl9TRlBfQUNDRVNTX0VSUk9SOworCQlicmVhazsKKwljYXNlIEJGQV9TRlBfU0NOX1VOU1VQUE9SVDoKKwkJYWVuX2V2dCA9IEJGQV9QT1JUX0FFTl9TRlBfVU5TVVBQT1JUOworCQlicmVhazsKKwljYXNlIEJGQV9TRlBfU0NOX1BPTToKKwkJYWVuX2V2dCA9IEJGQV9QT1JUX0FFTl9TRlBfUE9NOworCQlhZW5fZW50cnktPmFlbl9kYXRhLnBvcnQubGV2ZWwgPSByc3AtPnBvbWx2bDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYmZhX3RyYyhzZnAsIHJzcC0+ZXZlbnQpOworCQlXQVJOX09OKDEpOworCX0KKworCS8qIFNlbmQgdGhlIEFFTiBub3RpZmljYXRpb24gKi8KKwliZmFkX2ltX3Bvc3RfdmVuZG9yX2V2ZW50KGFlbl9lbnRyeSwgYmZhZCwgKytzZnAtPmlvYy0+aW9jX2Flbl9zZXEsCisJCQkJICBCRkFfQUVOX0NBVF9QT1JULCBhZW5fZXZ0KTsKK30KKworLyoKICAqCVNGUCBnZXQgZGF0YSBzZW5kCiAgKi8KIHN0YXRpYyB2b2lkCkBAIC0zNDgyLDYgKzM1NzYsNTAgQEAKIH0KIAogLyoKKyAqCVNGUCBzY24gaGFuZGxlcgorICovCitzdGF0aWMgdm9pZAorYmZhX3NmcF9zY24oc3RydWN0IGJmYV9zZnBfcyAqc2ZwLCBzdHJ1Y3QgYmZpX21ibXNnX3MgKm1zZykKK3sKKwlzdHJ1Y3QgYmZpX3NmcF9zY25fcyAqcnNwID0gKHN0cnVjdCBiZmlfc2ZwX3Njbl9zICopIG1zZzsKKworCXN3aXRjaCAocnNwLT5ldmVudCkgeworCWNhc2UgQkZBX1NGUF9TQ05fSU5TRVJURUQ6CisJCXNmcC0+c3RhdGUgPSBCRkFfU0ZQX1NUQVRFX0lOU0VSVEVEOworCQlzZnAtPmRhdGFfdmFsaWQgPSAwOworCQliZmFfc2ZwX3Njbl9hZW5fcG9zdChzZnAsIHJzcCk7CisJCWJyZWFrOworCWNhc2UgQkZBX1NGUF9TQ05fUkVNT1ZFRDoKKwkJc2ZwLT5zdGF0ZSA9IEJGQV9TRlBfU1RBVEVfUkVNT1ZFRDsKKwkJc2ZwLT5kYXRhX3ZhbGlkID0gMDsKKwkJYmZhX3NmcF9zY25fYWVuX3Bvc3Qoc2ZwLCByc3ApOworCQkgYnJlYWs7CisJY2FzZSBCRkFfU0ZQX1NDTl9GQUlMRUQ6CisJCXNmcC0+c3RhdGUgPSBCRkFfU0ZQX1NUQVRFX0ZBSUxFRDsKKwkJc2ZwLT5kYXRhX3ZhbGlkID0gMDsKKwkJYmZhX3NmcF9zY25fYWVuX3Bvc3Qoc2ZwLCByc3ApOworCQlicmVhazsKKwljYXNlIEJGQV9TRlBfU0NOX1VOU1VQUE9SVDoKKwkJc2ZwLT5zdGF0ZSA9IEJGQV9TRlBfU1RBVEVfVU5TVVBQT1JUOworCQliZmFfc2ZwX3Njbl9hZW5fcG9zdChzZnAsIHJzcCk7CisJCWlmICghc2ZwLT5sb2NrKQorCQkJYmZhX3NmcF9nZXRkYXRhKHNmcCwgQkZJX1NGUF9NRU1fQUxMKTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfU0ZQX1NDTl9QT006CisJCWJmYV9zZnBfc2NuX2Flbl9wb3N0KHNmcCwgcnNwKTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfU0ZQX1NDTl9WQUxJRDoKKwkJc2ZwLT5zdGF0ZSA9IEJGQV9TRlBfU1RBVEVfVkFMSUQ7CisJCWlmICghc2ZwLT5sb2NrKQorCQkJYmZhX3NmcF9nZXRkYXRhKHNmcCwgQkZJX1NGUF9NRU1fQUxMKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYmZhX3RyYyhzZnAsIHJzcC0+ZXZlbnQpOworCQlXQVJOX09OKDEpOworCX0KK30KKworLyoKICAqIFNGUCBzaG93IGNvbXBsZXRlCiAgKi8KIHN0YXRpYyB2b2lkCkBAIC0zNjQ1LDcgKzM3ODMsNyBAQAogCQlicmVhazsKIAogCWNhc2UgQkZJX1NGUF9JMkhfU0NOOgotCQliZmFfdHJjKHNmcCwgbXNnLT5taC5tc2dfaWQpOworCQliZmFfc2ZwX3NjbihzZnAsIG1zZyk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTM4MzgsNiArMzk3NiwyNiBAQAogCUJGQV9ST1VORFVQKDB4MDEwMDAwICsgc2l6ZW9mKHN0cnVjdCBiZmFfbWZnX2Jsb2NrX3MpLCBCRkFfRkxBU0hfU0VHX1NaKQogCiBzdGF0aWMgdm9pZAorYmZhX2ZsYXNoX2Flbl9hdWRpdF9wb3N0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgZW51bSBiZmFfYXVkaXRfYWVuX2V2ZW50IGV2ZW50LAorCQkJaW50IGluc3QsIGludCB0eXBlKQoreworCXN0cnVjdCBiZmFkX3MgKmJmYWQgPSAoc3RydWN0IGJmYWRfcyAqKWlvYy0+YmZhLT5iZmFkOworCXN0cnVjdCBiZmFfYWVuX2VudHJ5X3MgICphZW5fZW50cnk7CisKKwliZmFkX2dldF9hZW5fZW50cnkoYmZhZCwgYWVuX2VudHJ5KTsKKwlpZiAoIWFlbl9lbnRyeSkKKwkJcmV0dXJuOworCisJYWVuX2VudHJ5LT5hZW5fZGF0YS5hdWRpdC5wd3duID0gaW9jLT5hdHRyLT5wd3duOworCWFlbl9lbnRyeS0+YWVuX2RhdGEuYXVkaXQucGFydGl0aW9uX2luc3QgPSBpbnN0OworCWFlbl9lbnRyeS0+YWVuX2RhdGEuYXVkaXQucGFydGl0aW9uX3R5cGUgPSB0eXBlOworCisJLyogU2VuZCB0aGUgQUVOIG5vdGlmaWNhdGlvbiAqLworCWJmYWRfaW1fcG9zdF92ZW5kb3JfZXZlbnQoYWVuX2VudHJ5LCBiZmFkLCArK2lvYy0+aW9jX2Flbl9zZXEsCisJCQkJICBCRkFfQUVOX0NBVF9BVURJVCwgZXZlbnQpOworfQorCitzdGF0aWMgdm9pZAogYmZhX2ZsYXNoX2NiKHN0cnVjdCBiZmFfZmxhc2hfcyAqZmxhc2gpCiB7CiAJZmxhc2gtPm9wX2J1c3kgPSAwOwpAQCAtMzk3OCw2ICs0MTM2LDcgQEAKIAkJc3RydWN0IGJmaV9mbGFzaF9lcmFzZV9yc3BfcyAqZXJhc2U7CiAJCXN0cnVjdCBiZmlfZmxhc2hfd3JpdGVfcnNwX3MgKndyaXRlOwogCQlzdHJ1Y3QgYmZpX2ZsYXNoX3JlYWRfcnNwX3MgKnJlYWQ7CisJCXN0cnVjdCBiZmlfZmxhc2hfZXZlbnRfcyAqZXZlbnQ7CiAJCXN0cnVjdCBiZmlfbWJtc2dfcyAgICptc2c7CiAJfSBtOwogCkBAIC00MDYxLDggKzQyMjAsMTkgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIEJGSV9GTEFTSF9JMkhfQk9PVF9WRVJfUlNQOgorCQlicmVhazsKIAljYXNlIEJGSV9GTEFTSF9JMkhfRVZFTlQ6Ci0JCWJmYV90cmMoZmxhc2gsIG1zZy0+bWgubXNnX2lkKTsKKwkJc3RhdHVzID0gYmUzMl90b19jcHUobS5ldmVudC0+c3RhdHVzKTsKKwkJYmZhX3RyYyhmbGFzaCwgc3RhdHVzKTsKKwkJaWYgKHN0YXR1cyA9PSBCRkFfU1RBVFVTX0JBRF9GV0NGRykKKwkJCWJmYV9pb2NfYWVuX3Bvc3QoZmxhc2gtPmlvYywgQkZBX0lPQ19BRU5fRldDRkdfRVJST1IpOworCQllbHNlIGlmIChzdGF0dXMgPT0gQkZBX1NUQVRVU19JTlZBTElEX1ZFTkRPUikgeworCQkJdTMyIHBhcmFtOworCQkJcGFyYW0gPSBiZTMyX3RvX2NwdShtLmV2ZW50LT5wYXJhbSk7CisJCQliZmFfdHJjKGZsYXNoLCBwYXJhbSk7CisJCQliZmFfaW9jX2Flbl9wb3N0KGZsYXNoLT5pb2MsCisJCQkJQkZBX0lPQ19BRU5fSU5WQUxJRF9WRU5ET1IpOworCQl9CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTQyMDQsNiArNDM3NCw4IEBACiAJZmxhc2gtPmluc3RhbmNlID0gaW5zdGFuY2U7CiAKIAliZmFfZmxhc2hfZXJhc2Vfc2VuZChmbGFzaCk7CisJYmZhX2ZsYXNoX2Flbl9hdWRpdF9wb3N0KGZsYXNoLT5pb2MsIEJGQV9BVURJVF9BRU5fRkxBU0hfRVJBU0UsCisJCQkJaW5zdGFuY2UsIHR5cGUpOwogCXJldHVybiBCRkFfU1RBVFVTX09LOwogfQogCkBAIC01NDE2LDMgKzU1ODgsMzk2IEBACiAJCVdBUk5fT04oMSk7CiAJfQogfQorCisvKgorICoJRENPTkYgbW9kdWxlIHNwZWNpZmljCisgKi8KKworQkZBX01PRFVMRShkY29uZik7CisKKy8qCisgKiBEQ09ORiBzdGF0ZSBtYWNoaW5lIGV2ZW50cworICovCitlbnVtIGJmYV9kY29uZl9ldmVudCB7CisJQkZBX0RDT05GX1NNX0lOSVQJCT0gMSwJLyogZGNvbmYgSW5pdCAqLworCUJGQV9EQ09ORl9TTV9GTEFTSF9DT01QCQk9IDIsCS8qIHJlYWQvd3JpdGUgdG8gZmxhc2ggKi8KKwlCRkFfRENPTkZfU01fV1IJCQk9IDMsCS8qIGJpbmRpbmcgY2hhbmdlLCBtYXAgKi8KKwlCRkFfRENPTkZfU01fVElNRU9VVAkJPSA0LAkvKiBTdGFydCB0aW1lciAqLworCUJGQV9EQ09ORl9TTV9FWElUCQk9IDUsCS8qIGV4aXQgZGNvbmYgbW9kdWxlICovCisJQkZBX0RDT05GX1NNX0lPQ0RJU0FCTEUJCT0gNiwJLyogSU9DIGRpc2FibGUgZXZlbnQgKi8KK307CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgRENPTkYgc3RhdGUgbWFjaGluZSAqLworc3RhdGljIHZvaWQgYmZhX2Rjb25mX3NtX3VuaW5pdChzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiwKKwkJCQllbnVtIGJmYV9kY29uZl9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCBiZmFfZGNvbmZfc21fZmxhc2hfcmVhZChzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiwKKwkJCQllbnVtIGJmYV9kY29uZl9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCBiZmFfZGNvbmZfc21fcmVhZHkoc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYsCisJCQkJZW51bSBiZmFfZGNvbmZfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgYmZhX2Rjb25mX3NtX2RpcnR5KHN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mLAorCQkJCWVudW0gYmZhX2Rjb25mX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkIGJmYV9kY29uZl9zbV9zeW5jKHN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mLAorCQkJCWVudW0gYmZhX2Rjb25mX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkIGJmYV9kY29uZl9zbV9maW5hbF9zeW5jKHN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mLAorCQkJCWVudW0gYmZhX2Rjb25mX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkIGJmYV9kY29uZl9zbV9pb2Nkb3duX2RpcnR5KHN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mLAorCQkJCWVudW0gYmZhX2Rjb25mX2V2ZW50IGV2ZW50KTsKKworc3RhdGljIHZvaWQgYmZhX2Rjb25mX2NiZm4odm9pZCAqZGNvbmYsIGJmYV9zdGF0dXNfdCBzdGF0dXMpOworc3RhdGljIHZvaWQgYmZhX2Rjb25mX3RpbWVyKHZvaWQgKmNiYXJnKTsKK3N0YXRpYyBiZmFfc3RhdHVzX3QgYmZhX2Rjb25mX2ZsYXNoX3dyaXRlKHN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mKTsKK3N0YXRpYyB2b2lkIGJmYV9kY29uZl9pbml0X2NiKHZvaWQgKmFyZywgYmZhX3N0YXR1c190IHN0YXR1cyk7CisKKy8qCisgKiBCZWdpbmluZyBzdGF0ZSBvZiBkY29uZiBtb2R1bGUuIFdhaXRpbmcgZm9yIGFuIGV2ZW50IHRvIHN0YXJ0LgorICovCitzdGF0aWMgdm9pZAorYmZhX2Rjb25mX3NtX3VuaW5pdChzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiwgZW51bSBiZmFfZGNvbmZfZXZlbnQgZXZlbnQpCit7CisJYmZhX3N0YXR1c190IGJmYV9zdGF0dXM7CisJYmZhX3RyYyhkY29uZi0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfRENPTkZfU01fSU5JVDoKKwkJaWYgKGRjb25mLT5taW5fY2ZnKSB7CisJCQliZmFfdHJjKGRjb25mLT5iZmEsIGRjb25mLT5taW5fY2ZnKTsKKwkJCXJldHVybjsKKwkJfQorCQliZmFfc21fc2V0X3N0YXRlKGRjb25mLCBiZmFfZGNvbmZfc21fZmxhc2hfcmVhZCk7CisJCWRjb25mLT5mbGFzaGRvbmUgPSBCRkFfRkFMU0U7CisJCWJmYV90cmMoZGNvbmYtPmJmYSwgZGNvbmYtPmZsYXNoZG9uZSk7CisJCWJmYV9zdGF0dXMgPSBiZmFfZmxhc2hfcmVhZF9wYXJ0KEJGQV9GTEFTSChkY29uZi0+YmZhKSwKKwkJCQkJQkZBX0ZMQVNIX1BBUlRfRFJWLCBkY29uZi0+aW5zdGFuY2UsCisJCQkJCWRjb25mLT5kY29uZiwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBiZmFfZGNvbmZfcyksIDAsCisJCQkJCWJmYV9kY29uZl9pbml0X2NiLCBkY29uZi0+YmZhKTsKKwkJaWYgKGJmYV9zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykgeworCQkJYmZhX2Rjb25mX2luaXRfY2IoZGNvbmYtPmJmYSwgQkZBX1NUQVRVU19GQUlMRUQpOworCQkJYmZhX3NtX3NldF9zdGF0ZShkY29uZiwgYmZhX2Rjb25mX3NtX3VuaW5pdCk7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCRkFfRENPTkZfU01fRVhJVDoKKwkJZGNvbmYtPmZsYXNoZG9uZSA9IEJGQV9UUlVFOworCWNhc2UgQkZBX0RDT05GX1NNX0lPQ0RJU0FCTEU6CisJY2FzZSBCRkFfRENPTkZfU01fV1I6CisJY2FzZSBCRkFfRENPTkZfU01fRkxBU0hfQ09NUDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYmZhX3NtX2ZhdWx0KGRjb25mLT5iZmEsIGV2ZW50KTsKKwl9Cit9CisKKy8qCisgKiBSZWFkIGZsYXNoIGZvciBkY29uZiBlbnRyaWVzIGFuZCBtYWtlIGEgY2FsbCBiYWNrIHRvIHRoZSBkcml2ZXIgb25jZSBkb25lLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Rjb25mX3NtX2ZsYXNoX3JlYWQoc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYsCisJCQllbnVtIGJmYV9kY29uZl9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGRjb25mLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9EQ09ORl9TTV9GTEFTSF9DT01QOgorCQliZmFfc21fc2V0X3N0YXRlKGRjb25mLCBiZmFfZGNvbmZfc21fcmVhZHkpOworCQlicmVhazsKKwljYXNlIEJGQV9EQ09ORl9TTV9USU1FT1VUOgorCQliZmFfc21fc2V0X3N0YXRlKGRjb25mLCBiZmFfZGNvbmZfc21fcmVhZHkpOworCQlicmVhazsKKwljYXNlIEJGQV9EQ09ORl9TTV9FWElUOgorCQlkY29uZi0+Zmxhc2hkb25lID0gQkZBX1RSVUU7CisJCWJmYV90cmMoZGNvbmYtPmJmYSwgZGNvbmYtPmZsYXNoZG9uZSk7CisJY2FzZSBCRkFfRENPTkZfU01fSU9DRElTQUJMRToKKwkJYmZhX3NtX3NldF9zdGF0ZShkY29uZiwgYmZhX2Rjb25mX3NtX3VuaW5pdCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChkY29uZi0+YmZhLCBldmVudCk7CisJfQorfQorCisvKgorICogRENPTkYgTW9kdWxlIGlzIGluIHJlYWR5IHN0YXRlLiBIYXMgY29tcGxldGVkIHRoZSBpbml0aWFsaXphdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9kY29uZl9zbV9yZWFkeShzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiwgZW51bSBiZmFfZGNvbmZfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhkY29uZi0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfRENPTkZfU01fV1I6CisJCWJmYV90aW1lcl9zdGFydChkY29uZi0+YmZhLCAmZGNvbmYtPnRpbWVyLAorCQkJYmZhX2Rjb25mX3RpbWVyLCBkY29uZiwgQkZBX0RDT05GX1VQREFURV9UT1YpOworCQliZmFfc21fc2V0X3N0YXRlKGRjb25mLCBiZmFfZGNvbmZfc21fZGlydHkpOworCQlicmVhazsKKwljYXNlIEJGQV9EQ09ORl9TTV9FWElUOgorCQlkY29uZi0+Zmxhc2hkb25lID0gQkZBX1RSVUU7CisJCWJmYV90cmMoZGNvbmYtPmJmYSwgZGNvbmYtPmZsYXNoZG9uZSk7CisJCWJmYV9zbV9zZXRfc3RhdGUoZGNvbmYsIGJmYV9kY29uZl9zbV91bmluaXQpOworCQlicmVhazsKKwljYXNlIEJGQV9EQ09ORl9TTV9JTklUOgorCWNhc2UgQkZBX0RDT05GX1NNX0lPQ0RJU0FCTEU6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChkY29uZi0+YmZhLCBldmVudCk7CisJfQorfQorCisvKgorICogZW50cmllcyBhcmUgZGlydHksIHdyaXRlIGJhY2sgdG8gdGhlIGZsYXNoLgorICovCisKK3N0YXRpYyB2b2lkCitiZmFfZGNvbmZfc21fZGlydHkoc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYsIGVudW0gYmZhX2Rjb25mX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoZGNvbmYtPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0RDT05GX1NNX1RJTUVPVVQ6CisJCWJmYV9zbV9zZXRfc3RhdGUoZGNvbmYsIGJmYV9kY29uZl9zbV9zeW5jKTsKKwkJYmZhX2Rjb25mX2ZsYXNoX3dyaXRlKGRjb25mKTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfRENPTkZfU01fV1I6CisJCWJmYV90aW1lcl9zdG9wKCZkY29uZi0+dGltZXIpOworCQliZmFfdGltZXJfc3RhcnQoZGNvbmYtPmJmYSwgJmRjb25mLT50aW1lciwKKwkJCWJmYV9kY29uZl90aW1lciwgZGNvbmYsIEJGQV9EQ09ORl9VUERBVEVfVE9WKTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfRENPTkZfU01fRVhJVDoKKwkJYmZhX3RpbWVyX3N0b3AoJmRjb25mLT50aW1lcik7CisJCWJmYV90aW1lcl9zdGFydChkY29uZi0+YmZhLCAmZGNvbmYtPnRpbWVyLAorCQkJYmZhX2Rjb25mX3RpbWVyLCBkY29uZiwgQkZBX0RDT05GX1VQREFURV9UT1YpOworCQliZmFfc21fc2V0X3N0YXRlKGRjb25mLCBiZmFfZGNvbmZfc21fZmluYWxfc3luYyk7CisJCWJmYV9kY29uZl9mbGFzaF93cml0ZShkY29uZik7CisJCWJyZWFrOworCWNhc2UgQkZBX0RDT05GX1NNX0ZMQVNIX0NPTVA6CisJCWJyZWFrOworCWNhc2UgQkZBX0RDT05GX1NNX0lPQ0RJU0FCTEU6CisJCWJmYV90aW1lcl9zdG9wKCZkY29uZi0+dGltZXIpOworCQliZmFfc21fc2V0X3N0YXRlKGRjb25mLCBiZmFfZGNvbmZfc21faW9jZG93bl9kaXJ0eSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChkY29uZi0+YmZhLCBldmVudCk7CisJfQorfQorCisvKgorICogU3luYyB0aGUgZGNvbmYgZW50cmllcyB0byB0aGUgZmxhc2guCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZGNvbmZfc21fZmluYWxfc3luYyhzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiwKKwkJCWVudW0gYmZhX2Rjb25mX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoZGNvbmYtPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0RDT05GX1NNX0lPQ0RJU0FCTEU6CisJY2FzZSBCRkFfRENPTkZfU01fRkxBU0hfQ09NUDoKKwkJYmZhX3RpbWVyX3N0b3AoJmRjb25mLT50aW1lcik7CisJY2FzZSBCRkFfRENPTkZfU01fVElNRU9VVDoKKwkJYmZhX3NtX3NldF9zdGF0ZShkY29uZiwgYmZhX2Rjb25mX3NtX3VuaW5pdCk7CisJCWRjb25mLT5mbGFzaGRvbmUgPSBCRkFfVFJVRTsKKwkJYmZhX3RyYyhkY29uZi0+YmZhLCBkY29uZi0+Zmxhc2hkb25lKTsKKwkJYmZhX2lvY19kaXNhYmxlKCZkY29uZi0+YmZhLT5pb2MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQliZmFfc21fZmF1bHQoZGNvbmYtPmJmYSwgZXZlbnQpOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9kY29uZl9zbV9zeW5jKHN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mLCBlbnVtIGJmYV9kY29uZl9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGRjb25mLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9EQ09ORl9TTV9GTEFTSF9DT01QOgorCQliZmFfc21fc2V0X3N0YXRlKGRjb25mLCBiZmFfZGNvbmZfc21fcmVhZHkpOworCQlicmVhazsKKwljYXNlIEJGQV9EQ09ORl9TTV9XUjoKKwkJYmZhX3RpbWVyX3N0YXJ0KGRjb25mLT5iZmEsICZkY29uZi0+dGltZXIsCisJCQliZmFfZGNvbmZfdGltZXIsIGRjb25mLCBCRkFfRENPTkZfVVBEQVRFX1RPVik7CisJCWJmYV9zbV9zZXRfc3RhdGUoZGNvbmYsIGJmYV9kY29uZl9zbV9kaXJ0eSk7CisJCWJyZWFrOworCWNhc2UgQkZBX0RDT05GX1NNX0VYSVQ6CisJCWJmYV90aW1lcl9zdGFydChkY29uZi0+YmZhLCAmZGNvbmYtPnRpbWVyLAorCQkJYmZhX2Rjb25mX3RpbWVyLCBkY29uZiwgQkZBX0RDT05GX1VQREFURV9UT1YpOworCQliZmFfc21fc2V0X3N0YXRlKGRjb25mLCBiZmFfZGNvbmZfc21fZmluYWxfc3luYyk7CisJCWJyZWFrOworCWNhc2UgQkZBX0RDT05GX1NNX0lPQ0RJU0FCTEU6CisJCWJmYV9zbV9zZXRfc3RhdGUoZGNvbmYsIGJmYV9kY29uZl9zbV9pb2Nkb3duX2RpcnR5KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYmZhX3NtX2ZhdWx0KGRjb25mLT5iZmEsIGV2ZW50KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZGNvbmZfc21faW9jZG93bl9kaXJ0eShzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiwKKwkJCWVudW0gYmZhX2Rjb25mX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoZGNvbmYtPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0RDT05GX1NNX0lOSVQ6CisJCWJmYV90aW1lcl9zdGFydChkY29uZi0+YmZhLCAmZGNvbmYtPnRpbWVyLAorCQkJYmZhX2Rjb25mX3RpbWVyLCBkY29uZiwgQkZBX0RDT05GX1VQREFURV9UT1YpOworCQliZmFfc21fc2V0X3N0YXRlKGRjb25mLCBiZmFfZGNvbmZfc21fZGlydHkpOworCQlicmVhazsKKwljYXNlIEJGQV9EQ09ORl9TTV9FWElUOgorCQlkY29uZi0+Zmxhc2hkb25lID0gQkZBX1RSVUU7CisJCWJmYV9zbV9zZXRfc3RhdGUoZGNvbmYsIGJmYV9kY29uZl9zbV91bmluaXQpOworCQlicmVhazsKKwljYXNlIEJGQV9EQ09ORl9TTV9JT0NESVNBQkxFOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQliZmFfc21fZmF1bHQoZGNvbmYtPmJmYSwgZXZlbnQpOworCX0KK30KKworLyoKKyAqIENvbXB1dGUgYW5kIHJldHVybiBtZW1vcnkgbmVlZGVkIGJ5IERSVl9DRkcgbW9kdWxlLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Rjb25mX21lbWluZm8oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLCBzdHJ1Y3QgYmZhX21lbWluZm9fcyAqbWVtaW5mbywKKwkJICBzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX21lbV9rdmFfcyAqZGNvbmZfa3ZhID0gQkZBX01FTV9EQ09ORl9LVkEoYmZhKTsKKworCWlmIChjZmctPmRydmNmZy5taW5fY2ZnKQorCQliZmFfbWVtX2t2YV9zZXR1cChtZW1pbmZvLCBkY29uZl9rdmEsCisJCQkJc2l6ZW9mKHN0cnVjdCBiZmFfZGNvbmZfaGRyX3MpKTsKKwllbHNlCisJCWJmYV9tZW1fa3ZhX3NldHVwKG1lbWluZm8sIGRjb25mX2t2YSwKKwkJCQlzaXplb2Yoc3RydWN0IGJmYV9kY29uZl9zKSk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZGNvbmZfYXR0YWNoKHN0cnVjdCBiZmFfcyAqYmZhLCB2b2lkICpiZmFkLCBzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsCisJCXN0cnVjdCBiZmFfcGNpZGV2X3MgKnBjaWRldikKK3sKKwlzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiA9IEJGQV9EQ09ORl9NT0QoYmZhKTsKKworCWRjb25mLT5iZmFkID0gYmZhZDsKKwlkY29uZi0+YmZhID0gYmZhOworCWRjb25mLT5pbnN0YW5jZSA9IGJmYS0+aW9jLnBvcnRfaWQ7CisJYmZhX3RyYyhiZmEsIGRjb25mLT5pbnN0YW5jZSk7CisKKwlkY29uZi0+ZGNvbmYgPSAoc3RydWN0IGJmYV9kY29uZl9zICopIGJmYV9tZW1fa3ZhX2N1cnAoZGNvbmYpOworCWlmIChjZmctPmRydmNmZy5taW5fY2ZnKSB7CisJCWJmYV9tZW1fa3ZhX2N1cnAoZGNvbmYpICs9IHNpemVvZihzdHJ1Y3QgYmZhX2Rjb25mX2hkcl9zKTsKKwkJZGNvbmYtPm1pbl9jZmcgPSBCRkFfVFJVRTsKKwkJLyoKKwkJICogU2V0IHRoZSBmbGFzaGRvbmUgZmxhZyB0byBUUlVFIGV4cGxpY2l0bHkgYXMgbm8gZmxhc2gKKwkJICogd3JpdGUgd2lsbCBoYXBwZW4gaW4gbWluX2NmZyBtb2RlLgorCQkgKi8KKwkJZGNvbmYtPmZsYXNoZG9uZSA9IEJGQV9UUlVFOworCX0gZWxzZSB7CisJCWRjb25mLT5taW5fY2ZnID0gQkZBX0ZBTFNFOworCQliZmFfbWVtX2t2YV9jdXJwKGRjb25mKSArPSBzaXplb2Yoc3RydWN0IGJmYV9kY29uZl9zKTsKKwl9CisKKwliZmFfZGNvbmZfcmVhZF9kYXRhX3ZhbGlkKGJmYSkgPSBCRkFfRkFMU0U7CisJYmZhX3NtX3NldF9zdGF0ZShkY29uZiwgYmZhX2Rjb25mX3NtX3VuaW5pdCk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZGNvbmZfaW5pdF9jYih2b2lkICphcmcsIGJmYV9zdGF0dXNfdCBzdGF0dXMpCit7CisJc3RydWN0IGJmYV9zICpiZmEgPSBhcmc7CisJc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYgPSBCRkFfRENPTkZfTU9EKGJmYSk7CisKKwlkY29uZi0+Zmxhc2hkb25lID0gQkZBX1RSVUU7CisJYmZhX3RyYyhiZmEsIGRjb25mLT5mbGFzaGRvbmUpOworCWJmYV9pb2NmY19jYl9kY29uZl9tb2Rpbml0KGJmYSwgc3RhdHVzKTsKKwlpZiAoc3RhdHVzID09IEJGQV9TVEFUVVNfT0spIHsKKwkJYmZhX2Rjb25mX3JlYWRfZGF0YV92YWxpZChiZmEpID0gQkZBX1RSVUU7CisJCWlmIChkY29uZi0+ZGNvbmYtPmhkci5zaWduYXR1cmUgIT0gQkZJX0RDT05GX1NJR05BVFVSRSkKKwkJCWRjb25mLT5kY29uZi0+aGRyLnNpZ25hdHVyZSA9IEJGSV9EQ09ORl9TSUdOQVRVUkU7CisJCWlmIChkY29uZi0+ZGNvbmYtPmhkci52ZXJzaW9uICE9IEJGSV9EQ09ORl9WRVJTSU9OKQorCQkJZGNvbmYtPmRjb25mLT5oZHIudmVyc2lvbiA9IEJGSV9EQ09ORl9WRVJTSU9OOworCX0KKwliZmFfc21fc2VuZF9ldmVudChkY29uZiwgQkZBX0RDT05GX1NNX0ZMQVNIX0NPTVApOworfQorCit2b2lkCitiZmFfZGNvbmZfbW9kaW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiA9IEJGQV9EQ09ORl9NT0QoYmZhKTsKKwliZmFfc21fc2VuZF9ldmVudChkY29uZiwgQkZBX0RDT05GX1NNX0lOSVQpOworfQorc3RhdGljIHZvaWQKK2JmYV9kY29uZl9zdGFydChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKK30KKworc3RhdGljIHZvaWQKK2JmYV9kY29uZl9zdG9wKHN0cnVjdCBiZmFfcyAqYmZhKQoreworfQorCitzdGF0aWMgdm9pZCBiZmFfZGNvbmZfdGltZXIodm9pZCAqY2JhcmcpCit7CisJc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYgPSBjYmFyZzsKKwliZmFfc21fc2VuZF9ldmVudChkY29uZiwgQkZBX0RDT05GX1NNX1RJTUVPVVQpOworfQorc3RhdGljIHZvaWQKK2JmYV9kY29uZl9pb2NkaXNhYmxlKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mID0gQkZBX0RDT05GX01PRChiZmEpOworCWJmYV9zbV9zZW5kX2V2ZW50KGRjb25mLCBCRkFfRENPTkZfU01fSU9DRElTQUJMRSk7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZGNvbmZfZGV0YWNoKHN0cnVjdCBiZmFfcyAqYmZhKQoreworfQorCitzdGF0aWMgYmZhX3N0YXR1c190CitiZmFfZGNvbmZfZmxhc2hfd3JpdGUoc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYpCit7CisJYmZhX3N0YXR1c190IGJmYV9zdGF0dXM7CisJYmZhX3RyYyhkY29uZi0+YmZhLCAwKTsKKworCWJmYV9zdGF0dXMgPSBiZmFfZmxhc2hfdXBkYXRlX3BhcnQoQkZBX0ZMQVNIKGRjb25mLT5iZmEpLAorCQkJCUJGQV9GTEFTSF9QQVJUX0RSViwgZGNvbmYtPmluc3RhbmNlLAorCQkJCWRjb25mLT5kY29uZiwgIHNpemVvZihzdHJ1Y3QgYmZhX2Rjb25mX3MpLCAwLAorCQkJCWJmYV9kY29uZl9jYmZuLCBkY29uZik7CisJaWYgKGJmYV9zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykKKwkJV0FSTl9PTihiZmFfc3RhdHVzKTsKKwliZmFfdHJjKGRjb25mLT5iZmEsIGJmYV9zdGF0dXMpOworCisJcmV0dXJuIGJmYV9zdGF0dXM7Cit9CisKK2JmYV9zdGF0dXNfdAorYmZhX2Rjb25mX3VwZGF0ZShzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiA9IEJGQV9EQ09ORl9NT0QoYmZhKTsKKwliZmFfdHJjKGRjb25mLT5iZmEsIDApOworCWlmIChiZmFfc21fY21wX3N0YXRlKGRjb25mLCBiZmFfZGNvbmZfc21faW9jZG93bl9kaXJ0eSkpCisJCXJldHVybiBCRkFfU1RBVFVTX0ZBSUxFRDsKKworCWlmIChkY29uZi0+bWluX2NmZykgeworCQliZmFfdHJjKGRjb25mLT5iZmEsIGRjb25mLT5taW5fY2ZnKTsKKwkJcmV0dXJuIEJGQV9TVEFUVVNfRkFJTEVEOworCX0KKworCWJmYV9zbV9zZW5kX2V2ZW50KGRjb25mLCBCRkFfRENPTkZfU01fV1IpOworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Rjb25mX2NiZm4odm9pZCAqYXJnLCBiZmFfc3RhdHVzX3Qgc3RhdHVzKQoreworCXN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mID0gYXJnOworCVdBUk5fT04oc3RhdHVzKTsKKwliZmFfc21fc2VuZF9ldmVudChkY29uZiwgQkZBX0RDT05GX1NNX0ZMQVNIX0NPTVApOworfQorCit2b2lkCitiZmFfZGNvbmZfbW9kZXhpdChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiA9IEJGQV9EQ09ORl9NT0QoYmZhKTsKKwlCRkFfRENPTkZfTU9EKGJmYSktPmZsYXNoZG9uZSA9IEJGQV9GQUxTRTsKKwliZmFfdHJjKGJmYSwgQkZBX0RDT05GX01PRChiZmEpLT5mbGFzaGRvbmUpOworCWJmYV9zbV9zZW5kX2V2ZW50KGRjb25mLCBCRkFfRENPTkZfU01fRVhJVCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5oCmluZGV4IGM1ZWNkMmUuLjU0NmQ0NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5oCkBAIC0zMjcsNiArMzI3LDcgQEAKIAllbnVtIGJmYV9tb2RlX3MJCXBvcnRfbW9kZTsKIAl1OAkJCWFkX2NhcF9ibTsJLyogYWRhcHRlciBjYXAgYml0IG1hc2sgKi8KIAl1OAkJCXBvcnRfbW9kZV9jZmc7CS8qIGNvbmZpZyBwb3J0IG1vZGUgKi8KKwlpbnQJCQlpb2NfYWVuX3NlcTsKIH07CiAKIHN0cnVjdCBiZmFfaW9jX2h3aWZfcyB7CkBAIC0zNjYsNiArMzY3LDggQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCXFlOwogCWJmYV9jYl9jYmZuX3QJY2JmbjsKIAliZmFfYm9vbGVhbl90CW9uY2U7CisJYmZhX2Jvb2xlYW5fdAlwcmVfcm12OwkvKiBzZXQgZm9yIHN0YWNrIGJhc2VkIHFlKHMpICovCisJYmZhX3N0YXR1c190CWZ3X3N0YXR1czsJLyogdG8gYWNjZXNzIGZ3IHN0YXR1cyBpbiBjb21wIHByb2MgKi8KIAl2b2lkCQkqY2Jhcmc7CiB9OwogCkBAIC02NTgsNyArNjYxLDYgQEAKIAlzdHJ1Y3QgYmZhX2lvY19ub3RpZnlfcwlpb2Nfbm90aWZ5OyAvKiBpb2MgZXZlbnQgbm90aWZ5ICovCiAJc3RydWN0IGJmYV9tZW1fZG1hX3MJcGh5X2RtYTsKIH07Ci0KICNkZWZpbmUgQkZBX1BIWShfX2JmYSkJKCYoX19iZmEpLT5tb2R1bGVzLnBoeSkKICNkZWZpbmUgQkZBX01FTV9QSFlfRE1BKF9fYmZhKQkoJihCRkFfUEhZKF9fYmZhKS0+cGh5X2RtYSkpCiAKQEAgLTY4NCw2ICs2ODYsNDkgQEAKIHZvaWQgYmZhX3BoeV9pbnRyKHZvaWQgKnBoeWFyZywgc3RydWN0IGJmaV9tYm1zZ19zICptc2cpOwogCiAvKgorICogRHJpdmVyIENvbmZpZyggZGNvbmYpIHNwZWNpZmljCisgKi8KKyNkZWZpbmUgQkZJX0RDT05GX1NJR05BVFVSRQkweGFiY2RhYmNkCisjZGVmaW5lIEJGSV9EQ09ORl9WRVJTSU9OCTEKKworI3ByYWdtYSBwYWNrKDEpCitzdHJ1Y3QgYmZhX2Rjb25mX2hkcl9zIHsKKwl1MzIJc2lnbmF0dXJlOworCXUzMgl2ZXJzaW9uOworfTsKKworc3RydWN0IGJmYV9kY29uZl9zIHsKKwlzdHJ1Y3QgYmZhX2Rjb25mX2hkcl9zCQloZHI7CisJc3RydWN0IGJmYV9sdW5tYXNrX2NmZ19zCWx1bl9tYXNrOworfTsKKyNwcmFnbWEgcGFjaygpCisKK3N0cnVjdCBiZmFfZGNvbmZfbW9kX3MgeworCWJmYV9zbV90CQlzbTsKKwl1OAkJCWluc3RhbmNlOworCWJmYV9ib29sZWFuX3QJCWZsYXNoZG9uZTsKKwliZmFfYm9vbGVhbl90CQlyZWFkX2RhdGFfdmFsaWQ7CisJYmZhX2Jvb2xlYW5fdAkJbWluX2NmZzsKKwlzdHJ1Y3QgYmZhX3RpbWVyX3MJdGltZXI7CisJc3RydWN0IGJmYV9zCQkqYmZhOworCXZvaWQJCQkqYmZhZDsKKwl2b2lkCQkJKnRyY21vZDsKKwlzdHJ1Y3QgYmZhX2Rjb25mX3MJKmRjb25mOworCXN0cnVjdCBiZmFfbWVtX2t2YV9zCWt2YV9zZWc7Cit9OworCisjZGVmaW5lIEJGQV9EQ09ORl9NT0QoX19iZmEpCVwKKwkoJihfX2JmYSktPm1vZHVsZXMuZGNvbmZfbW9kKQorI2RlZmluZSBCRkFfTUVNX0RDT05GX0tWQShfX2JmYSkJKCYoQkZBX0RDT05GX01PRChfX2JmYSktPmt2YV9zZWcpKQorI2RlZmluZSBiZmFfZGNvbmZfcmVhZF9kYXRhX3ZhbGlkKF9fYmZhKQlcCisJKEJGQV9EQ09ORl9NT0QoX19iZmEpLT5yZWFkX2RhdGFfdmFsaWQpCisjZGVmaW5lIEJGQV9EQ09ORl9VUERBVEVfVE9WCTUwMDAJLyogbWVtdGVzdCB0aW1lb3V0IGluIG1zZWMgKi8KKwordm9pZAliZmFfZGNvbmZfbW9kaW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSk7Cit2b2lkCWJmYV9kY29uZl9tb2RleGl0KHN0cnVjdCBiZmFfcyAqYmZhKTsKK2JmYV9zdGF0dXNfdAliZmFfZGNvbmZfdXBkYXRlKHN0cnVjdCBiZmFfcyAqYmZhKTsKKworLyoKICAqCUlPQyBzcGVjZmljIG1hY3JvcwogICovCiAjZGVmaW5lIGJmYV9pb2NfcGNpZm4oX19pb2MpCQkoKF9faW9jKS0+cGNpZGV2LnBjaV9mdW5jKQpAQCAtODAzLDYgKzg0OCw3IEBACiAJCQlzdHJ1Y3QgYmZpX2lvY19pbWFnZV9oZHJfcyAqZndoZHIpOwogYmZhX2Jvb2xlYW5fdCBiZmFfaW9jX2Z3dmVyX2NtcChzdHJ1Y3QgYmZhX2lvY19zICppb2MsCiAJCQlzdHJ1Y3QgYmZpX2lvY19pbWFnZV9oZHJfcyAqZndoZHIpOwordm9pZCBiZmFfaW9jX2Flbl9wb3N0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgZW51bSBiZmFfaW9jX2Flbl9ldmVudCBldmVudCk7CiBiZmFfc3RhdHVzX3QgYmZhX2lvY19md19zdGF0c19nZXQoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCB2b2lkICpzdGF0cyk7CiBiZmFfc3RhdHVzX3QgYmZhX2lvY19md19zdGF0c19jbGVhcihzdHJ1Y3QgYmZhX2lvY19zICppb2MpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9tb2R1bGVzLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9tb2R1bGVzLmgKaW5kZXggMWM2ZWZkNC4uMmQzNmU0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfbW9kdWxlcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX21vZHVsZXMuaApAQCAtNDQsNiArNDQsNyBAQAogCXN0cnVjdCBiZmFfZmxhc2hfcwlmbGFzaDsJCS8qICBmbGFzaCBtb2R1bGUgKi8KIAlzdHJ1Y3QgYmZhX2RpYWdfcwlkaWFnX21vZDsJLyogIGRpYWdub3N0aWNzIG1vZHVsZQkqLwogCXN0cnVjdCBiZmFfcGh5X3MJcGh5OwkJLyogIHBoeSBtb2R1bGUJCSovCisJc3RydWN0IGJmYV9kY29uZl9tb2RfcwlkY29uZl9tb2Q7CS8qICBEQ09ORiBjb21tb24gbW9kdWxlCSovCiB9OwogCiAvKgpAQCAtMTE5LDYgKzEyMCw3IEBACiAJc3RydWN0IGxpc3RfaGVhZAlyZXFxX3dhaXRxW0JGSV9JT0NfTUFYX0NRU107CiAJYmZhX2Jvb2xlYW5fdAkJZmNzOwkJLyogIEZDUyBpcyBhdHRhY2hlZCB0byBCRkEgKi8KIAlzdHJ1Y3QgYmZhX21zaXhfcwltc2l4OworCWludAkJCWJmYV9hZW5fc2VxOwogfTsKIAogZXh0ZXJuIGJmYV9ib29sZWFuX3QgYmZhX2F1dG9fcmVjb3ZlcjsKQEAgLTEzMCw1ICsxMzIsNiBAQAogZXh0ZXJuIHN0cnVjdCBiZmFfbW9kdWxlX3MgaGFsX21vZF91ZjsKIGV4dGVybiBzdHJ1Y3QgYmZhX21vZHVsZV9zIGhhbF9tb2RfcnBvcnQ7CiBleHRlcm4gc3RydWN0IGJmYV9tb2R1bGVfcyBoYWxfbW9kX2ZjcDsKK2V4dGVybiBzdHJ1Y3QgYmZhX21vZHVsZV9zIGhhbF9tb2RfZGNvbmY7CiAKICNlbmRpZiAvKiBfX0JGQV9NT0RVTEVTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfc3ZjLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9zdmMuYwppbmRleCAyMWNhYWVmLi5hYThhMGVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9zdmMuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9zdmMuYwpAQCAtMTYsNiArMTYsNyBAQAogICovCiAKICNpbmNsdWRlICJiZmFkX2Rydi5oIgorI2luY2x1ZGUgImJmYWRfaW0uaCIKICNpbmNsdWRlICJiZmFfcGxvZy5oIgogI2luY2x1ZGUgImJmYV9jcy5oIgogI2luY2x1ZGUgImJmYV9tb2R1bGVzLmgiCkBAIC0yMDA3LDYgKzIwMDgsMjQgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkCitiZmFfZmNwb3J0X2Flbl9wb3N0KHN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCwgZW51bSBiZmFfcG9ydF9hZW5fZXZlbnQgZXZlbnQpCit7CisJc3RydWN0IGJmYWRfcyAqYmZhZCA9IChzdHJ1Y3QgYmZhZF9zICopZmNwb3J0LT5iZmEtPmJmYWQ7CisJc3RydWN0IGJmYV9hZW5fZW50cnlfcyAgKmFlbl9lbnRyeTsKKworCWJmYWRfZ2V0X2Flbl9lbnRyeShiZmFkLCBhZW5fZW50cnkpOworCWlmICghYWVuX2VudHJ5KQorCQlyZXR1cm47CisKKwlhZW5fZW50cnktPmFlbl9kYXRhLnBvcnQuaW9jX3R5cGUgPSBiZmFfZ2V0X3R5cGUoZmNwb3J0LT5iZmEpOworCWFlbl9lbnRyeS0+YWVuX2RhdGEucG9ydC5wd3duID0gZmNwb3J0LT5wd3duOworCisJLyogU2VuZCB0aGUgQUVOIG5vdGlmaWNhdGlvbiAqLworCWJmYWRfaW1fcG9zdF92ZW5kb3JfZXZlbnQoYWVuX2VudHJ5LCBiZmFkLCArK2ZjcG9ydC0+YmZhLT5iZmFfYWVuX3NlcSwKKwkJCQkgIEJGQV9BRU5fQ0FUX1BPUlQsIGV2ZW50KTsKK30KKwogLyoKICAqIEZDIFBPUlQgc3RhdGUgbWFjaGluZSBmdW5jdGlvbnMKICAqLwpAQCAtMjA5NSw2ICsyMTE0LDcgQEAKIAkJd3duMnN0cihwd3duX2J1ZiwgZmNwb3J0LT5wd3duKTsKIAkJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCQkiQmFzZSBwb3J0IGRpc2FibGVkOiBXV04gPSAlc1xuIiwgcHd3bl9idWYpOworCQliZmFfZmNwb3J0X2Flbl9wb3N0KGZjcG9ydCwgQkZBX1BPUlRfQUVOX0RJU0FCTEUpOwogCQlicmVhazsKIAogCWNhc2UgQkZBX0ZDUE9SVF9TTV9MSU5LVVA6CkBAIC0yMTU1LDYgKzIxNzUsNyBAQAogCQl3d24yc3RyKHB3d25fYnVmLCBmY3BvcnQtPnB3d24pOwogCQlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJCSJCYXNlIHBvcnQgZGlzYWJsZWQ6IFdXTiA9ICVzXG4iLCBwd3duX2J1Zik7CisJCWJmYV9mY3BvcnRfYWVuX3Bvc3QoZmNwb3J0LCBCRkFfUE9SVF9BRU5fRElTQUJMRSk7CiAJCWJyZWFrOwogCiAJY2FzZSBCRkFfRkNQT1JUX1NNX1NUT1A6CkBAIC0yMjA4LDYgKzIyMjksMTIgQEAKIAkJd3duMnN0cihwd3duX2J1ZiwgZmNwb3J0LT5wd3duKTsKIAkJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCQkiQmFzZSBwb3J0IG9ubGluZTogV1dOID0gJXNcbiIsIHB3d25fYnVmKTsKKwkJYmZhX2ZjcG9ydF9hZW5fcG9zdChmY3BvcnQsIEJGQV9QT1JUX0FFTl9PTkxJTkUpOworCisJCS8qIElmIFFvUyBpcyBlbmFibGVkIGFuZCBpdCBpcyBub3Qgb25saW5lLCBzZW5kIEFFTiAqLworCQlpZiAoZmNwb3J0LT5jZmcucW9zX2VuYWJsZWQgJiYKKwkJICAgIGZjcG9ydC0+cW9zX2F0dHIuc3RhdGUgIT0gQkZBX1FPU19PTkxJTkUpCisJCQliZmFfZmNwb3J0X2Flbl9wb3N0KGZjcG9ydCwgQkZBX1BPUlRfQUVOX1FPU19ORUcpOwogCQlicmVhazsKIAogCWNhc2UgQkZBX0ZDUE9SVF9TTV9MSU5LRE9XTjoKQEAgLTIyMzQsNiArMjI2MSw3IEBACiAJCXd3bjJzdHIocHd3bl9idWYsIGZjcG9ydC0+cHd3bik7CiAJCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkJIkJhc2UgcG9ydCBkaXNhYmxlZDogV1dOID0gJXNcbiIsIHB3d25fYnVmKTsKKwkJYmZhX2ZjcG9ydF9hZW5fcG9zdChmY3BvcnQsIEJGQV9QT1JUX0FFTl9ESVNBQkxFKTsKIAkJYnJlYWs7CiAKIAljYXNlIEJGQV9GQ1BPUlRfU01fU1RPUDoKQEAgLTIyNzksOCArMjMwNywxMCBAQAogCQl3d24yc3RyKHB3d25fYnVmLCBmY3BvcnQtPnB3d24pOwogCQlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJCSJCYXNlIHBvcnQgb2ZmbGluZTogV1dOID0gJXNcbiIsIHB3d25fYnVmKTsKKwkJYmZhX2ZjcG9ydF9hZW5fcG9zdChmY3BvcnQsIEJGQV9QT1JUX0FFTl9PRkZMSU5FKTsKIAkJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCQkiQmFzZSBwb3J0IGRpc2FibGVkOiBXV04gPSAlc1xuIiwgcHd3bl9idWYpOworCQliZmFfZmNwb3J0X2Flbl9wb3N0KGZjcG9ydCwgQkZBX1BPUlRfQUVOX0RJU0FCTEUpOwogCQlicmVhazsKIAogCWNhc2UgQkZBX0ZDUE9SVF9TTV9MSU5LRE9XTjoKQEAgLTIyOTAsMjYgKzIzMjAsMzIgQEAKIAkJYmZhX3Bsb2dfc3RyKGZjcG9ydC0+YmZhLT5wbG9nLCBCRkFfUExfTUlEX0hBTCwKIAkJCQlCRkFfUExfRUlEX1BPUlRfU1RfQ0hBTkdFLCAwLCAiUG9ydCBMaW5rZG93biIpOwogCQl3d24yc3RyKHB3d25fYnVmLCBmY3BvcnQtPnB3d24pOwotCQlpZiAoQkZBX1BPUlRfSVNfRElTQUJMRUQoZmNwb3J0LT5iZmEpKQorCQlpZiAoQkZBX1BPUlRfSVNfRElTQUJMRUQoZmNwb3J0LT5iZmEpKSB7CiAJCQlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJCQkiQmFzZSBwb3J0IG9mZmxpbmU6IFdXTiA9ICVzXG4iLCBwd3duX2J1Zik7Ci0JCWVsc2UKKwkJCWJmYV9mY3BvcnRfYWVuX3Bvc3QoZmNwb3J0LCBCRkFfUE9SVF9BRU5fT0ZGTElORSk7CisJCX0gZWxzZSB7CiAJCQlCRkFfTE9HKEtFUk5fRVJSLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkJCSJCYXNlIHBvcnQgKFdXTiA9ICVzKSAiCiAJCQkJImxvc3QgZmFicmljIGNvbm5lY3Rpdml0eVxuIiwgcHd3bl9idWYpOworCQkJYmZhX2ZjcG9ydF9hZW5fcG9zdChmY3BvcnQsIEJGQV9QT1JUX0FFTl9ESVNDT05ORUNUKTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQkZBX0ZDUE9SVF9TTV9TVE9QOgogCQliZmFfc21fc2V0X3N0YXRlKGZjcG9ydCwgYmZhX2ZjcG9ydF9zbV9zdG9wcGVkKTsKIAkJYmZhX2ZjcG9ydF9yZXNldF9saW5raW5mbyhmY3BvcnQpOwogCQl3d24yc3RyKHB3d25fYnVmLCBmY3BvcnQtPnB3d24pOwotCQlpZiAoQkZBX1BPUlRfSVNfRElTQUJMRUQoZmNwb3J0LT5iZmEpKQorCQlpZiAoQkZBX1BPUlRfSVNfRElTQUJMRUQoZmNwb3J0LT5iZmEpKSB7CiAJCQlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJCQkiQmFzZSBwb3J0IG9mZmxpbmU6IFdXTiA9ICVzXG4iLCBwd3duX2J1Zik7Ci0JCWVsc2UKKwkJCWJmYV9mY3BvcnRfYWVuX3Bvc3QoZmNwb3J0LCBCRkFfUE9SVF9BRU5fT0ZGTElORSk7CisJCX0gZWxzZSB7CiAJCQlCRkFfTE9HKEtFUk5fRVJSLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkJCSJCYXNlIHBvcnQgKFdXTiA9ICVzKSAiCiAJCQkJImxvc3QgZmFicmljIGNvbm5lY3Rpdml0eVxuIiwgcHd3bl9idWYpOworCQkJYmZhX2ZjcG9ydF9hZW5fcG9zdChmY3BvcnQsIEJGQV9QT1JUX0FFTl9ESVNDT05ORUNUKTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQkZBX0ZDUE9SVF9TTV9IV0ZBSUw6CkBAIC0yMzE3LDEzICsyMzUzLDE2IEBACiAJCWJmYV9mY3BvcnRfcmVzZXRfbGlua2luZm8oZmNwb3J0KTsKIAkJYmZhX2ZjcG9ydF9zY24oZmNwb3J0LCBCRkFfUE9SVF9MSU5LRE9XTiwgQkZBX0ZBTFNFKTsKIAkJd3duMnN0cihwd3duX2J1ZiwgZmNwb3J0LT5wd3duKTsKLQkJaWYgKEJGQV9QT1JUX0lTX0RJU0FCTEVEKGZjcG9ydC0+YmZhKSkKKwkJaWYgKEJGQV9QT1JUX0lTX0RJU0FCTEVEKGZjcG9ydC0+YmZhKSkgewogCQkJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCQkJIkJhc2UgcG9ydCBvZmZsaW5lOiBXV04gPSAlc1xuIiwgcHd3bl9idWYpOwotCQllbHNlCisJCQliZmFfZmNwb3J0X2Flbl9wb3N0KGZjcG9ydCwgQkZBX1BPUlRfQUVOX09GRkxJTkUpOworCQl9IGVsc2UgewogCQkJQkZBX0xPRyhLRVJOX0VSUiwgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJCQkiQmFzZSBwb3J0IChXV04gPSAlcykgIgogCQkJCSJsb3N0IGZhYnJpYyBjb25uZWN0aXZpdHlcbiIsIHB3d25fYnVmKTsKKwkJCWJmYV9mY3BvcnRfYWVuX3Bvc3QoZmNwb3J0LCBCRkFfUE9SVF9BRU5fRElTQ09OTkVDVCk7CisJCX0KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMjQ1NCw2ICsyNDkzLDcgQEAKIAkJd3duMnN0cihwd3duX2J1ZiwgZmNwb3J0LT5wd3duKTsKIAkJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCQkiQmFzZSBwb3J0IGVuYWJsZWQ6IFdXTiA9ICVzXG4iLCBwd3duX2J1Zik7CisJCWJmYV9mY3BvcnRfYWVuX3Bvc3QoZmNwb3J0LCBCRkFfUE9SVF9BRU5fRU5BQkxFKTsKIAkJYnJlYWs7CiAKIAljYXNlIEJGQV9GQ1BPUlRfU01fU1RPUDoKQEAgLTI1MDgsNiArMjU0OCw3IEBACiAJCXd3bjJzdHIocHd3bl9idWYsIGZjcG9ydC0+cHd3bik7CiAJCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkJIkJhc2UgcG9ydCBlbmFibGVkOiBXV04gPSAlc1xuIiwgcHd3bl9idWYpOworCQliZmFfZmNwb3J0X2Flbl9wb3N0KGZjcG9ydCwgQkZBX1BPUlRfQUVOX0VOQUJMRSk7CiAJCWJyZWFrOwogCiAJY2FzZSBCRkFfRkNQT1JUX1NNX0RJU0FCTEU6CkBAIC0yODc0LDYgKzI5MTUsOSBAQAogCiAJcG9ydF9jZmctPnRybF9kZWZfc3BlZWQgPSBCRkFfUE9SVF9TUEVFRF8xR0JQUzsKIAorCUlOSVRfTElTVF9IRUFEKCZmY3BvcnQtPnN0YXRzX3BlbmRpbmdfcSk7CisJSU5JVF9MSVNUX0hFQUQoJmZjcG9ydC0+c3RhdHNjbHJfcGVuZGluZ19xKTsKKwogCWJmYV9yZXFxX3dpbml0KCZmY3BvcnQtPnJlcXFfd2FpdCwgYmZhX2ZjcG9ydF9xcmVzdW1lLCBmY3BvcnQpOwogfQogCkBAIC0zMTAyLDMwICszMTQ2LDM4IEBACiBzdGF0aWMgdm9pZAogX19iZmFfY2JfZmNwb3J0X3N0YXRzX2dldCh2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSkKIHsKLQlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSBjYmFyZzsKKwlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSAoc3RydWN0IGJmYV9mY3BvcnRfcyAqKWNiYXJnOworCXN0cnVjdCBiZmFfY2JfcGVuZGluZ19xX3MgKmNiOworCXN0cnVjdCBsaXN0X2hlYWQgKnFlLCAqcWVuOworCXVuaW9uIGJmYV9mY3BvcnRfc3RhdHNfdSAqcmV0OwogCiAJaWYgKGNvbXBsZXRlKSB7Ci0JCWlmIChmY3BvcnQtPnN0YXRzX3N0YXR1cyA9PSBCRkFfU1RBVFVTX09LKSB7Ci0JCQlzdHJ1Y3QgdGltZXZhbCB0djsKKwkJc3RydWN0IHRpbWV2YWwgdHY7CisJCWlmIChmY3BvcnQtPnN0YXRzX3N0YXR1cyA9PSBCRkFfU1RBVFVTX09LKQorCQkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CiAKLQkJCS8qIFN3YXAgRkMgUW9TIG9yIEZDb0Ugc3RhdHMgKi8KLQkJCWlmIChiZmFfaW9jX2dldF9mY21vZGUoJmZjcG9ydC0+YmZhLT5pb2MpKSB7Ci0JCQkJYmZhX2ZjcG9ydF9xb3Nfc3RhdHNfc3dhcCgKLQkJCQkJJmZjcG9ydC0+c3RhdHNfcmV0LT5mY3FvcywKLQkJCQkJJmZjcG9ydC0+c3RhdHMtPmZjcW9zKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYmZhX2ZjcG9ydF9mY29lX3N0YXRzX3N3YXAoCi0JCQkJCSZmY3BvcnQtPnN0YXRzX3JldC0+ZmNvZSwKLQkJCQkJJmZjcG9ydC0+c3RhdHMtPmZjb2UpOwotCi0JCQkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7Ci0JCQkJZmNwb3J0LT5zdGF0c19yZXQtPmZjb2Uuc2Vjc19yZXNldCA9CisJCWxpc3RfZm9yX2VhY2hfc2FmZShxZSwgcWVuLCAmZmNwb3J0LT5zdGF0c19wZW5kaW5nX3EpIHsKKwkJCWJmYV9xX2RlcSgmZmNwb3J0LT5zdGF0c19wZW5kaW5nX3EsICZxZSk7CisJCQljYiA9IChzdHJ1Y3QgYmZhX2NiX3BlbmRpbmdfcV9zICopcWU7CisJCQlpZiAoZmNwb3J0LT5zdGF0c19zdGF0dXMgPT0gQkZBX1NUQVRVU19PSykgeworCQkJCXJldCA9ICh1bmlvbiBiZmFfZmNwb3J0X3N0YXRzX3UgKiljYi0+ZGF0YTsKKwkJCQkvKiBTd2FwIEZDIFFvUyBvciBGQ29FIHN0YXRzICovCisJCQkJaWYgKGJmYV9pb2NfZ2V0X2ZjbW9kZSgmZmNwb3J0LT5iZmEtPmlvYykpCisJCQkJCWJmYV9mY3BvcnRfcW9zX3N0YXRzX3N3YXAoJnJldC0+ZmNxb3MsCisJCQkJCQkJJmZjcG9ydC0+c3RhdHMtPmZjcW9zKTsKKwkJCQllbHNlIHsKKwkJCQkJYmZhX2ZjcG9ydF9mY29lX3N0YXRzX3N3YXAoJnJldC0+ZmNvZSwKKwkJCQkJCQkmZmNwb3J0LT5zdGF0cy0+ZmNvZSk7CisJCQkJCXJldC0+ZmNvZS5zZWNzX3Jlc2V0ID0KIAkJCQkJdHYudHZfc2VjIC0gZmNwb3J0LT5zdGF0c19yZXNldF90aW1lOworCQkJCX0KIAkJCX0KKwkJCWJmYV9jYl9xdWV1ZV9zdGF0dXMoZmNwb3J0LT5iZmEsICZjYi0+aGNiX3FlLAorCQkJCQlmY3BvcnQtPnN0YXRzX3N0YXR1cyk7CiAJCX0KLQkJZmNwb3J0LT5zdGF0c19jYmZuKGZjcG9ydC0+c3RhdHNfY2JhcmcsIGZjcG9ydC0+c3RhdHNfc3RhdHVzKTsKKwkJZmNwb3J0LT5zdGF0c19zdGF0dXMgPSBCRkFfU1RBVFVTX09LOwogCX0gZWxzZSB7Ci0JCWZjcG9ydC0+c3RhdHNfYnVzeSA9IEJGQV9GQUxTRTsKKwkJSU5JVF9MSVNUX0hFQUQoJmZjcG9ydC0+c3RhdHNfcGVuZGluZ19xKTsKIAkJZmNwb3J0LT5zdGF0c19zdGF0dXMgPSBCRkFfU1RBVFVTX09LOwogCX0KIH0KQEAgLTMxNDMsOCArMzE5NSw3IEBACiAJfQogCiAJZmNwb3J0LT5zdGF0c19zdGF0dXMgPSBCRkFfU1RBVFVTX0VUSU1FUjsKLQliZmFfY2JfcXVldWUoZmNwb3J0LT5iZmEsICZmY3BvcnQtPmhjYl9xZSwgX19iZmFfY2JfZmNwb3J0X3N0YXRzX2dldCwKLQkJZmNwb3J0KTsKKwlfX2JmYV9jYl9mY3BvcnRfc3RhdHNfZ2V0KGZjcG9ydCwgQkZBX1RSVUUpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMzE3NCw3ICszMjI1LDkgQEAKIHN0YXRpYyB2b2lkCiBfX2JmYV9jYl9mY3BvcnRfc3RhdHNfY2xyKHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKQogewotCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IGNiYXJnOworCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IChzdHJ1Y3QgYmZhX2ZjcG9ydF9zICopIGNiYXJnOworCXN0cnVjdCBiZmFfY2JfcGVuZGluZ19xX3MgKmNiOworCXN0cnVjdCBsaXN0X2hlYWQgKnFlLCAqcWVuOwogCiAJaWYgKGNvbXBsZXRlKSB7CiAJCXN0cnVjdCB0aW1ldmFsIHR2OwpAQCAtMzE4NCwxMCArMzIzNywxNSBAQAogCQkgKi8KIAkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CiAJCWZjcG9ydC0+c3RhdHNfcmVzZXRfdGltZSA9IHR2LnR2X3NlYzsKLQotCQlmY3BvcnQtPnN0YXRzX2NiZm4oZmNwb3J0LT5zdGF0c19jYmFyZywgZmNwb3J0LT5zdGF0c19zdGF0dXMpOworCQlsaXN0X2Zvcl9lYWNoX3NhZmUocWUsIHFlbiwgJmZjcG9ydC0+c3RhdHNjbHJfcGVuZGluZ19xKSB7CisJCQliZmFfcV9kZXEoJmZjcG9ydC0+c3RhdHNjbHJfcGVuZGluZ19xLCAmcWUpOworCQkJY2IgPSAoc3RydWN0IGJmYV9jYl9wZW5kaW5nX3FfcyAqKXFlOworCQkJYmZhX2NiX3F1ZXVlX3N0YXR1cyhmY3BvcnQtPmJmYSwgJmNiLT5oY2JfcWUsCisJCQkJCQlmY3BvcnQtPnN0YXRzX3N0YXR1cyk7CisJCX0KKwkJZmNwb3J0LT5zdGF0c19zdGF0dXMgPSBCRkFfU1RBVFVTX09LOwogCX0gZWxzZSB7Ci0JCWZjcG9ydC0+c3RhdHNfYnVzeSA9IEJGQV9GQUxTRTsKKwkJSU5JVF9MSVNUX0hFQUQoJmZjcG9ydC0+c3RhdHNjbHJfcGVuZGluZ19xKTsKIAkJZmNwb3J0LT5zdGF0c19zdGF0dXMgPSBCRkFfU1RBVFVTX09LOwogCX0KIH0KQEAgLTMyMDUsOCArMzI2Myw3IEBACiAJfQogCiAJZmNwb3J0LT5zdGF0c19zdGF0dXMgPSBCRkFfU1RBVFVTX0VUSU1FUjsKLQliZmFfY2JfcXVldWUoZmNwb3J0LT5iZmEsICZmY3BvcnQtPmhjYl9xZSwKLQkJCV9fYmZhX2NiX2ZjcG9ydF9zdGF0c19jbHIsIGZjcG9ydCk7CisJX19iZmFfY2JfZmNwb3J0X3N0YXRzX2NscihmY3BvcnQsIEJGQV9UUlVFKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTM0MDIsNiArMzQ1OSwxMSBAQAogCQkJCWZjcG9ydC0+dXNlX2ZsYXNoX2NmZyA9IEJGQV9GQUxTRTsKIAkJCX0KIAorCQkJaWYgKGZjcG9ydC0+Y2ZnLnFvc19lbmFibGVkKQorCQkJCWZjcG9ydC0+cW9zX2F0dHIuc3RhdGUgPSBCRkFfUU9TX09GRkxJTkU7CisJCQllbHNlCisJCQkJZmNwb3J0LT5xb3NfYXR0ci5zdGF0ZSA9IEJGQV9RT1NfRElTQUJMRUQ7CisKIAkJCWJmYV9zbV9zZW5kX2V2ZW50KGZjcG9ydCwgQkZBX0ZDUE9SVF9TTV9GV1JTUCk7CiAJCX0KIAkJYnJlYWs7CkBAIC0zNDI2LDI4ICszNDg4LDI2IEBACiAJCS8qCiAJCSAqIGNoZWNrIGZvciB0aW1lciBwb3AgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIHJzcAogCQkgKi8KLQkJaWYgKGZjcG9ydC0+c3RhdHNfYnVzeSA9PSBCRkFfRkFMU0UgfHwKLQkJICAgIGZjcG9ydC0+c3RhdHNfc3RhdHVzID09IEJGQV9TVEFUVVNfRVRJTUVSKQorCQlpZiAobGlzdF9lbXB0eSgmZmNwb3J0LT5zdGF0c19wZW5kaW5nX3EpIHx8CisJCSAgICAoZmNwb3J0LT5zdGF0c19zdGF0dXMgPT0gQkZBX1NUQVRVU19FVElNRVIpKQogCQkJYnJlYWs7CiAKIAkJYmZhX3RpbWVyX3N0b3AoJmZjcG9ydC0+dGltZXIpOwogCQlmY3BvcnQtPnN0YXRzX3N0YXR1cyA9IGkyaG1zZy5wc3RhdHNnZXRfcnNwLT5zdGF0dXM7Ci0JCWJmYV9jYl9xdWV1ZShmY3BvcnQtPmJmYSwgJmZjcG9ydC0+aGNiX3FlLAotCQkJCV9fYmZhX2NiX2ZjcG9ydF9zdGF0c19nZXQsIGZjcG9ydCk7CisJCV9fYmZhX2NiX2ZjcG9ydF9zdGF0c19nZXQoZmNwb3J0LCBCRkFfVFJVRSk7CiAJCWJyZWFrOwogCiAJY2FzZSBCRklfRkNQT1JUX0kySF9TVEFUU19DTEVBUl9SU1A6CiAJCS8qCiAJCSAqIGNoZWNrIGZvciB0aW1lciBwb3AgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIHJzcAogCQkgKi8KLQkJaWYgKGZjcG9ydC0+c3RhdHNfYnVzeSA9PSBCRkFfRkFMU0UgfHwKLQkJICAgIGZjcG9ydC0+c3RhdHNfc3RhdHVzID09IEJGQV9TVEFUVVNfRVRJTUVSKQorCQlpZiAobGlzdF9lbXB0eSgmZmNwb3J0LT5zdGF0c2Nscl9wZW5kaW5nX3EpIHx8CisJCSAgICAoZmNwb3J0LT5zdGF0c19zdGF0dXMgPT0gQkZBX1NUQVRVU19FVElNRVIpKQogCQkJYnJlYWs7CiAKIAkJYmZhX3RpbWVyX3N0b3AoJmZjcG9ydC0+dGltZXIpOwogCQlmY3BvcnQtPnN0YXRzX3N0YXR1cyA9IEJGQV9TVEFUVVNfT0s7Ci0JCWJmYV9jYl9xdWV1ZShmY3BvcnQtPmJmYSwgJmZjcG9ydC0+aGNiX3FlLAotCQkJCV9fYmZhX2NiX2ZjcG9ydF9zdGF0c19jbHIsIGZjcG9ydCk7CisJCV9fYmZhX2NiX2ZjcG9ydF9zdGF0c19jbHIoZmNwb3J0LCBCRkFfVFJVRSk7CiAJCWJyZWFrOwogCiAJY2FzZSBCRklfRkNQT1JUX0kySF9FTkFCTEVfQUVOOgpAQCAtMzc3OSwyNSArMzgzOSwyNSBAQAogICogRmV0Y2ggcG9ydCBzdGF0aXN0aWNzIChGQ1FvUyBvciBGQ29FKS4KICAqLwogYmZhX3N0YXR1c190Ci1iZmFfZmNwb3J0X2dldF9zdGF0cyhzdHJ1Y3QgYmZhX3MgKmJmYSwgdW5pb24gYmZhX2ZjcG9ydF9zdGF0c191ICpzdGF0cywKLQliZmFfY2JfcG9ydF90IGNiZm4sIHZvaWQgKmNiYXJnKQorYmZhX2ZjcG9ydF9nZXRfc3RhdHMoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFfY2JfcGVuZGluZ19xX3MgKmNiKQogewogCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IEJGQV9GQ1BPUlRfTU9EKGJmYSk7CiAKLQlpZiAoZmNwb3J0LT5zdGF0c19idXN5KSB7Ci0JCWJmYV90cmMoYmZhLCBmY3BvcnQtPnN0YXRzX2J1c3kpOworCWlmIChiZmFfaW9jX2lzX2Rpc2FibGVkKCZiZmEtPmlvYykpCisJCXJldHVybiBCRkFfU1RBVFVTX0lPQ19ESVNBQkxFRDsKKworCWlmICghbGlzdF9lbXB0eSgmZmNwb3J0LT5zdGF0c2Nscl9wZW5kaW5nX3EpKQogCQlyZXR1cm4gQkZBX1NUQVRVU19ERVZCVVNZOwotCX0KIAotCWZjcG9ydC0+c3RhdHNfYnVzeSAgPSBCRkFfVFJVRTsKLQlmY3BvcnQtPnN0YXRzX3JldCAgID0gc3RhdHM7Ci0JZmNwb3J0LT5zdGF0c19jYmZuICA9IGNiZm47Ci0JZmNwb3J0LT5zdGF0c19jYmFyZyA9IGNiYXJnOworCWlmIChsaXN0X2VtcHR5KCZmY3BvcnQtPnN0YXRzX3BlbmRpbmdfcSkpIHsKKwkJbGlzdF9hZGRfdGFpbCgmY2ItPmhjYl9xZS5xZSwgJmZjcG9ydC0+c3RhdHNfcGVuZGluZ19xKTsKKwkJYmZhX2ZjcG9ydF9zZW5kX3N0YXRzX2dldChmY3BvcnQpOworCQliZmFfdGltZXJfc3RhcnQoYmZhLCAmZmNwb3J0LT50aW1lciwKKwkJCQliZmFfZmNwb3J0X3N0YXRzX2dldF90aW1lb3V0LAorCQkJCWZjcG9ydCwgQkZBX0ZDUE9SVF9TVEFUU19UT1YpOworCX0gZWxzZQorCQlsaXN0X2FkZF90YWlsKCZjYi0+aGNiX3FlLnFlLCAmZmNwb3J0LT5zdGF0c19wZW5kaW5nX3EpOwogCi0JYmZhX2ZjcG9ydF9zZW5kX3N0YXRzX2dldChmY3BvcnQpOwotCi0JYmZhX3RpbWVyX3N0YXJ0KGJmYSwgJmZjcG9ydC0+dGltZXIsIGJmYV9mY3BvcnRfc3RhdHNfZ2V0X3RpbWVvdXQsCi0JCQlmY3BvcnQsIEJGQV9GQ1BPUlRfU1RBVFNfVE9WKTsKIAlyZXR1cm4gQkZBX1NUQVRVU19PSzsKIH0KIApAQCAtMzgwNSwyNyArMzg2NSwyNSBAQAogICogUmVzZXQgcG9ydCBzdGF0aXN0aWNzIChGQ1FvUyBvciBGQ29FKS4KICAqLwogYmZhX3N0YXR1c190Ci1iZmFfZmNwb3J0X2NsZWFyX3N0YXRzKHN0cnVjdCBiZmFfcyAqYmZhLCBiZmFfY2JfcG9ydF90IGNiZm4sIHZvaWQgKmNiYXJnKQorYmZhX2ZjcG9ydF9jbGVhcl9zdGF0cyhzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYV9jYl9wZW5kaW5nX3FfcyAqY2IpCiB7CiAJc3RydWN0IGJmYV9mY3BvcnRfcyAqZmNwb3J0ID0gQkZBX0ZDUE9SVF9NT0QoYmZhKTsKIAotCWlmIChmY3BvcnQtPnN0YXRzX2J1c3kpIHsKLQkJYmZhX3RyYyhiZmEsIGZjcG9ydC0+c3RhdHNfYnVzeSk7CisJaWYgKCFsaXN0X2VtcHR5KCZmY3BvcnQtPnN0YXRzX3BlbmRpbmdfcSkpCiAJCXJldHVybiBCRkFfU1RBVFVTX0RFVkJVU1k7Ci0JfQogCi0JZmNwb3J0LT5zdGF0c19idXN5ICA9IEJGQV9UUlVFOwotCWZjcG9ydC0+c3RhdHNfY2JmbiAgPSBjYmZuOwotCWZjcG9ydC0+c3RhdHNfY2JhcmcgPSBjYmFyZzsKKwlpZiAobGlzdF9lbXB0eSgmZmNwb3J0LT5zdGF0c2Nscl9wZW5kaW5nX3EpKSB7CisJCWxpc3RfYWRkX3RhaWwoJmNiLT5oY2JfcWUucWUsICZmY3BvcnQtPnN0YXRzY2xyX3BlbmRpbmdfcSk7CisJCWJmYV9mY3BvcnRfc2VuZF9zdGF0c19jbGVhcihmY3BvcnQpOworCQliZmFfdGltZXJfc3RhcnQoYmZhLCAmZmNwb3J0LT50aW1lciwKKwkJCQliZmFfZmNwb3J0X3N0YXRzX2Nscl90aW1lb3V0LAorCQkJCWZjcG9ydCwgQkZBX0ZDUE9SVF9TVEFUU19UT1YpOworCX0gZWxzZQorCQlsaXN0X2FkZF90YWlsKCZjYi0+aGNiX3FlLnFlLCAmZmNwb3J0LT5zdGF0c2Nscl9wZW5kaW5nX3EpOwogCi0JYmZhX2ZjcG9ydF9zZW5kX3N0YXRzX2NsZWFyKGZjcG9ydCk7Ci0KLQliZmFfdGltZXJfc3RhcnQoYmZhLCAmZmNwb3J0LT50aW1lciwgYmZhX2ZjcG9ydF9zdGF0c19jbHJfdGltZW91dCwKLQkJCWZjcG9ydCwgQkZBX0ZDUE9SVF9TVEFUU19UT1YpOwogCXJldHVybiBCRkFfU1RBVFVTX09LOwogfQogCi0KIC8qCiAgKiBGZXRjaCBwb3J0IGF0dHJpYnV0ZXMuCiAgKi8KQEAgLTQ2MTksNiArNDY3Nyw3IEBACiAJCXJwID0gQkZBX1JQT1JUX0ZST01fVEFHKGJmYSwgbXNnLmNyZWF0ZV9yc3AtPmJmYV9oYW5kbGUpOwogCQlycC0+ZndfaGFuZGxlID0gbXNnLmNyZWF0ZV9yc3AtPmZ3X2hhbmRsZTsKIAkJcnAtPnFvc19hdHRyID0gbXNnLmNyZWF0ZV9yc3AtPnFvc19hdHRyOworCQliZmFfcnBvcnRfc2V0X2x1bm1hc2soYmZhLCBycCk7CiAJCVdBUk5fT04obXNnLmNyZWF0ZV9yc3AtPnN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKTsKIAkJYmZhX3NtX3NlbmRfZXZlbnQocnAsIEJGQV9SUE9SVF9TTV9GV1JTUCk7CiAJCWJyZWFrOwpAQCAtNDYyNiw2ICs0Njg1LDcgQEAKIAljYXNlIEJGSV9SUE9SVF9JMkhfREVMRVRFX1JTUDoKIAkJcnAgPSBCRkFfUlBPUlRfRlJPTV9UQUcoYmZhLCBtc2cuZGVsZXRlX3JzcC0+YmZhX2hhbmRsZSk7CiAJCVdBUk5fT04obXNnLmRlbGV0ZV9yc3AtPnN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKTsKKwkJYmZhX3Jwb3J0X3Vuc2V0X2x1bm1hc2soYmZhLCBycCk7CiAJCWJmYV9zbV9zZW5kX2V2ZW50KHJwLCBCRkFfUlBPUlRfU01fRldSU1ApOwogCQlicmVhazsKIApAQCAtNDcwNiw2ICs0NzY2LDM3IEBACiAJYmZhX3NtX3NlbmRfZXZlbnQocnBvcnQsIEJGQV9SUE9SVF9TTV9TRVRfU1BFRUQpOwogfQogCisvKiBTZXQgUnBvcnQgTFVOIE1hc2sgKi8KK3ZvaWQKK2JmYV9ycG9ydF9zZXRfbHVubWFzayhzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYV9ycG9ydF9zICpycCkKK3sKKwlzdHJ1Y3QgYmZhX2xwc19tb2RfcwkqbHBzX21vZCA9IEJGQV9MUFNfTU9EKGJmYSk7CisJd3duX3QJbHBfd3duLCBycF93d247CisJdTggbHBfdGFnID0gKHU4KXJwLT5ycG9ydF9pbmZvLmxwX3RhZzsKKworCXJwX3d3biA9ICgoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqKXJwLT5ycG9ydF9kcnYpLT5wd3duOworCWxwX3d3biA9IChCRkFfTFBTX0ZST01fVEFHKGxwc19tb2QsIHJwLT5ycG9ydF9pbmZvLmxwX3RhZykpLT5wd3duOworCisJQkZBX0xQU19GUk9NX1RBRyhscHNfbW9kLCBycC0+cnBvcnRfaW5mby5scF90YWcpLT5sdW5fbWFzayA9CisJCQkJCXJwLT5sdW5fbWFzayA9IEJGQV9UUlVFOworCWJmYV9mY3BpbV9sdW5tYXNrX3JwX3VwZGF0ZShiZmEsIGxwX3d3biwgcnBfd3duLCBycC0+cnBvcnRfdGFnLCBscF90YWcpOworfQorCisvKiBVbnNldCBScG9ydCBMVU4gbWFzayAqLwordm9pZAorYmZhX3Jwb3J0X3Vuc2V0X2x1bm1hc2soc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFfcnBvcnRfcyAqcnApCit7CisJc3RydWN0IGJmYV9scHNfbW9kX3MJKmxwc19tb2QgPSBCRkFfTFBTX01PRChiZmEpOworCXd3bl90CWxwX3d3biwgcnBfd3duOworCisJcnBfd3duID0gKChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICopcnAtPnJwb3J0X2RydiktPnB3d247CisJbHBfd3duID0gKEJGQV9MUFNfRlJPTV9UQUcobHBzX21vZCwgcnAtPnJwb3J0X2luZm8ubHBfdGFnKSktPnB3d247CisKKwlCRkFfTFBTX0ZST01fVEFHKGxwc19tb2QsIHJwLT5ycG9ydF9pbmZvLmxwX3RhZyktPmx1bl9tYXNrID0KKwkJCQlycC0+bHVuX21hc2sgPSBCRkFfRkFMU0U7CisJYmZhX2ZjcGltX2x1bm1hc2tfcnBfdXBkYXRlKGJmYSwgbHBfd3duLCBycF93d24sCisJCQlCRkFfUlBPUlRfVEFHX0lOVkFMSUQsIEJGQV9MUF9UQUdfSU5WQUxJRCk7Cit9CiAKIC8qCiAgKiBTR1BHIHJlbGF0ZWQgZnVuY3Rpb25zCkBAIC01NTE3LDExICs1NjA4LDI5IEBACiAJCXJldHVybiBCRkFfU1RBVFVTX1BPUlRfTk9UX0RJU0FCTEVEOwogCX0KIAotCS8qIENoZWNrIGlmIHRoZSBzcGVlZCBpcyBzdXBwb3J0ZWQgKi8KLQliZmFfZmNwb3J0X2dldF9hdHRyKGJmYSwgJmF0dHIpOwotCWJmYV90cmMoZmNkaWFnLCBhdHRyLnNwZWVkX3N1cHBvcnRlZCk7Ci0JaWYgKHNwZWVkID4gYXR0ci5zcGVlZF9zdXBwb3J0ZWQpCi0JCXJldHVybiBCRkFfU1RBVFVTX1VOU1VQUF9TUEVFRDsKKwkvKgorCSAqIENoZWNrIGlmIGlucHV0IHNwZWVkIGlzIHN1cHBvcnRlZCBieSB0aGUgcG9ydCBtb2RlCisJICovCisJaWYgKGJmYV9pb2NfZ2V0X3R5cGUoJmJmYS0+aW9jKSA9PSBCRkFfSU9DX1RZUEVfRkMpIHsKKwkJaWYgKCEoc3BlZWQgPT0gQkZBX1BPUlRfU1BFRURfMUdCUFMgfHwKKwkJICAgICAgc3BlZWQgPT0gQkZBX1BPUlRfU1BFRURfMkdCUFMgfHwKKwkJICAgICAgc3BlZWQgPT0gQkZBX1BPUlRfU1BFRURfNEdCUFMgfHwKKwkJICAgICAgc3BlZWQgPT0gQkZBX1BPUlRfU1BFRURfOEdCUFMgfHwKKwkJICAgICAgc3BlZWQgPT0gQkZBX1BPUlRfU1BFRURfMTZHQlBTIHx8CisJCSAgICAgIHNwZWVkID09IEJGQV9QT1JUX1NQRUVEX0FVVE8pKSB7CisJCQliZmFfdHJjKGZjZGlhZywgc3BlZWQpOworCQkJcmV0dXJuIEJGQV9TVEFUVVNfVU5TVVBQX1NQRUVEOworCQl9CisJCWJmYV9mY3BvcnRfZ2V0X2F0dHIoYmZhLCAmYXR0cik7CisJCWJmYV90cmMoZmNkaWFnLCBhdHRyLnNwZWVkX3N1cHBvcnRlZCk7CisJCWlmIChzcGVlZCA+IGF0dHIuc3BlZWRfc3VwcG9ydGVkKQorCQkJcmV0dXJuIEJGQV9TVEFUVVNfVU5TVVBQX1NQRUVEOworCX0gZWxzZSB7CisJCWlmIChzcGVlZCAhPSBCRkFfUE9SVF9TUEVFRF8xMEdCUFMpIHsKKwkJCWJmYV90cmMoZmNkaWFnLCBzcGVlZCk7CisJCQlyZXR1cm4gQkZBX1NUQVRVU19VTlNVUFBfU1BFRUQ7CisJCX0KKwl9CiAKIAkvKiBGb3IgTWV6eiBjYXJkLCBwb3J0IHNwZWVkIGVudGVyZWQgbmVlZHMgdG8gYmUgY2hlY2tlZCAqLwogCWlmIChiZmFfbWZnX2lzX21lenooYmZhLT5pb2MuYXR0ci0+Y2FyZF90eXBlKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfc3ZjLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9zdmMuaAppbmRleCBmYmU1MTNhLi45NWFkYjg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9zdmMuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9zdmMuaApAQCAtMjk3LDYgKzI5Nyw3IEBACiAJdm9pZAkJKnJwb3J0X2RydjsJLyogIGZjcy9kcml2ZXIgcnBvcnQgb2JqZWN0CSAgICAqLwogCXUxNglmd19oYW5kbGU7CS8qICBmaXJtd2FyZSBycG9ydCBoYW5kbGUJICAgICovCiAJdTE2CXJwb3J0X3RhZzsJLyogIEJGQSBycG9ydCB0YWcJCSAgICAqLworCXU4CWx1bl9tYXNrOwkvKiAgTFVOIG1hc2sgZmxhZwkJICAgICovCiAJc3RydWN0IGJmYV9ycG9ydF9pbmZvX3MgcnBvcnRfaW5mbzsgLyogIHJwb3J0IGluZm8gZnJvbSBmY3MvZHJpdmVyICovCiAJc3RydWN0IGJmYV9yZXFxX3dhaXRfcyByZXFxX3dhaXQ7IC8qICB0byB3YWl0IGZvciByb29tIGluIHJlcXEgICAgICovCiAJc3RydWN0IGJmYV9jYl9xZV9zIGhjYl9xZTsJLyogIEJGQSBjYWxsYmFjayBxZWxlbQkJICAgICovCkBAIC00MDQsNiArNDA1LDcgQEAKIAl1OAkJYmJfc2NuOwkJLyogIGxvY2FsIEJCX1NDTgkJKi8KIAl1OAkJbHNyanRfcnNuOwkvKiAgTFNSSlQgcmVhc29uCQkqLwogCXU4CQlsc3JqdF9leHBsOwkvKiAgTFNSSlQgZXhwbGFuYXRpb24JCSovCisJdTgJCWx1bl9tYXNrOwkvKiAgTFVOIG1hc2sgZmxhZwkJKi8KIAl3d25fdAkJcHd3bjsJCS8qICBwb3J0IHd3biBvZiBscG9ydAkJKi8KIAl3d25fdAkJbnd3bjsJCS8qICBub2RlIHd3biBvZiBscG9ydAkJKi8KIAl3d25fdAkJcHJfcHd3bjsJLyogIHBvcnQgd3duIG9mIGxwb3J0IHBlZXIJKi8KQEAgLTQ0MSw3ICs0NDMsNiBAQAogICovCiAKICNkZWZpbmUgQkZBX0ZDUE9SVChfYmZhKQkoJigoX2JmYSktPm1vZHVsZXMucG9ydCkpCi10eXBlZGVmIHZvaWQgKCpiZmFfY2JfcG9ydF90KSAodm9pZCAqY2JhcmcsIGVudW0gYmZhX3N0YXR1cyBzdGF0dXMpOwogCiAvKgogICogTGluayBub3RpZmljYXRpb24gZGF0YSBzdHJ1Y3R1cmUKQEAgLTQ5NSwxMyArNDk2LDExIEBACiAJdTgJCQkqc3RhdHNfa3ZhOwogCXU2NAkJc3RhdHNfcGE7CiAJdW5pb24gYmZhX2ZjcG9ydF9zdGF0c191ICpzdGF0czsKLQl1bmlvbiBiZmFfZmNwb3J0X3N0YXRzX3UgKnN0YXRzX3JldDsgLyogIGRyaXZlciBzdGF0cyBsb2NhdGlvbiAqLwogCWJmYV9zdGF0dXNfdAkJc3RhdHNfc3RhdHVzOyAvKiAgc3RhdHMvc3RhdHNjbHIgc3RhdHVzICovCi0JYmZhX2Jvb2xlYW5fdAkJc3RhdHNfYnVzeTsgLyogIG91dHN0YW5kaW5nIHN0YXRzL3N0YXRzY2xyICovCisJc3RydWN0IGxpc3RfaGVhZAlzdGF0c19wZW5kaW5nX3E7CisJc3RydWN0IGxpc3RfaGVhZAlzdGF0c2Nscl9wZW5kaW5nX3E7CiAJYmZhX2Jvb2xlYW5fdAkJc3RhdHNfcWZ1bGw7CiAJdTMyCQlzdGF0c19yZXNldF90aW1lOyAvKiAgc3RhdHMgcmVzZXQgdGltZSBzdGFtcCAqLwotCWJmYV9jYl9wb3J0X3QJCXN0YXRzX2NiZm47IC8qICBkcml2ZXIgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLQl2b2lkCQkJKnN0YXRzX2NiYXJnOyAvKiAqITwgdXNlciBjYWxsYmFjayBhcmcgKi8KIAliZmFfYm9vbGVhbl90CQlkaWFnX2J1c3k7IC8qICBkaWFnIGJ1c3kgc3RhdHVzICovCiAJYmZhX2Jvb2xlYW5fdAkJYmVhY29uOyAvKiAgcG9ydCBiZWFjb24gc3RhdHVzICovCiAJYmZhX2Jvb2xlYW5fdAkJbGlua19lMmVfYmVhY29uOyAvKiAgbGluayBiZWFjb24gc3RhdHVzICovCkBAIC01NTIsMTAgKzU1MSw5IEBACiAJCQliZmFfYm9vbGVhbl90IGxpbmtfZTJlX2JlYWNvbik7CiBiZmFfYm9vbGVhbl90CWJmYV9mY3BvcnRfaXNfbGlua3VwKHN0cnVjdCBiZmFfcyAqYmZhKTsKIGJmYV9zdGF0dXNfdCBiZmFfZmNwb3J0X2dldF9zdGF0cyhzdHJ1Y3QgYmZhX3MgKmJmYSwKLQkJCQkgIHVuaW9uIGJmYV9mY3BvcnRfc3RhdHNfdSAqc3RhdHMsCi0JCQkJICBiZmFfY2JfcG9ydF90IGNiZm4sIHZvaWQgKmNiYXJnKTsKLWJmYV9zdGF0dXNfdCBiZmFfZmNwb3J0X2NsZWFyX3N0YXRzKHN0cnVjdCBiZmFfcyAqYmZhLCBiZmFfY2JfcG9ydF90IGNiZm4sCi0JCQkJICAgIHZvaWQgKmNiYXJnKTsKKwkJCXN0cnVjdCBiZmFfY2JfcGVuZGluZ19xX3MgKmNiKTsKK2JmYV9zdGF0dXNfdCBiZmFfZmNwb3J0X2NsZWFyX3N0YXRzKHN0cnVjdCBiZmFfcyAqYmZhLAorCQkJc3RydWN0IGJmYV9jYl9wZW5kaW5nX3FfcyAqY2IpOwogYmZhX2Jvb2xlYW5fdCBiZmFfZmNwb3J0X2lzX3Fvc19lbmFibGVkKHN0cnVjdCBiZmFfcyAqYmZhKTsKIGJmYV9ib29sZWFuX3QgYmZhX2ZjcG9ydF9pc190cnVua19lbmFibGVkKHN0cnVjdCBiZmFfcyAqYmZhKTsKIGJmYV9zdGF0dXNfdCBiZmFfZmNwb3J0X2lzX3BiY2Rpc2FibGVkKHN0cnVjdCBiZmFfcyAqYmZhKTsKQEAgLTU3OCw2ICs1NzYsMTkgQEAKIAkJCSAgICAgICBzdHJ1Y3QgYmZhX3Jwb3J0X3Fvc19hdHRyX3MgbmV3X3Fvc19hdHRyKTsKIAogLyoKKyAqCVJwb3J0IExVTiBtYXNraW5nIHJlbGF0ZWQKKyAqLworI2RlZmluZSBCRkFfUlBPUlRfVEFHX0lOVkFMSUQJMHhmZmZmCisjZGVmaW5lIEJGQV9MUF9UQUdfSU5WQUxJRAkweGZmCit2b2lkCWJmYV9ycG9ydF9zZXRfbHVubWFzayhzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYV9ycG9ydF9zICpycCk7Cit2b2lkCWJmYV9ycG9ydF91bnNldF9sdW5tYXNrKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwKTsKK2JmYV9ib29sZWFuX3QJYmZhX3Jwb3J0X2x1bm1hc2tfYWN0aXZlKHN0cnVjdCBiZmFfcnBvcnRfcyAqcnApOword3duX3QJYmZhX3Jwb3J0X2dldF9wd3duKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwKTsKK3N0cnVjdCBiZmFfcnBvcnRfcyAqYmZhX3Jwb3J0X2dldF9ieV93d24oc3RydWN0IGJmYV9zICpiZmEsIHUxNiB2Zl9pZCwKKwkJCQkJIHd3bl90ICpscHd3biwgd3duX3QgcnB3d24pOwordm9pZCAqYmZhX2NiX2dldF9ycF9ieV93d24odm9pZCAqYXJnLCB1MTYgdmZfaWQsIHd3bl90ICpscHd3biwgd3duX3QgcnB3d24pOworCisvKgogICogYmZhIGZjeHAgQVBJIGZ1bmN0aW9ucwogICovCiBzdHJ1Y3QgYmZhX2ZjeHBfcyAqYmZhX2ZjeHBfYWxsb2Modm9pZCAqYmZhZF9mY3hwLCBzdHJ1Y3QgYmZhX3MgKmJmYSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZC5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkLmMKaW5kZXggYmViMzBhNy4uNjZmYjcyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkLmMKQEAgLTEzNDgsNyArMTM0OCw3IEBACiBiZmFkX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBpZCkKIHsKIAlzdHJ1Y3QgYmZhZF9zCSpiZmFkOwotCWludAkJZXJyb3IgPSAtRU5PREVWLCByZXR2YWw7CisJaW50CQllcnJvciA9IC1FTk9ERVYsIHJldHZhbCwgaTsKIAogCS8qIEZvciBzaW5nbGUgcG9ydCBjYXJkcyAtIG9ubHkgY2xhaW0gZnVuY3Rpb24gMCAqLwogCWlmICgocGRldi0+ZGV2aWNlID09IEJGQV9QQ0lfREVWSUNFX0lEX0ZDXzhHMVApICYmCkBAIC0xMzcyLDYgKzEzNzIsMTIgQEAKIAliZmFfdHJjX2luaXQoYmZhZC0+dHJjbW9kKTsKIAliZmFfdHJjKGJmYWQsIGJmYWRfaW5zdCk7CiAKKwkvKiBBRU4gSU5JVCAqLworCUlOSVRfTElTVF9IRUFEKCZiZmFkLT5mcmVlX2Flbl9xKTsKKwlJTklUX0xJU1RfSEVBRCgmYmZhZC0+YWN0aXZlX2Flbl9xKTsKKwlmb3IgKGkgPSAwOyBpIDwgQkZBX0FFTl9NQVhfRU5UUlk7IGkrKykKKwkJbGlzdF9hZGRfdGFpbCgmYmZhZC0+YWVuX2xpc3RbaV0ucWUsICZiZmFkLT5mcmVlX2Flbl9xKTsKKwogCWlmICghKGJmYWRfbG9hZF9md2ltZyhwZGV2KSkpIHsKIAkJa2ZyZWUoYmZhZC0+dHJjbW9kKTsKIAkJZ290byBvdXRfYWxsb2NfdHJhY2VfZmFpbHVyZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9ic2cuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9ic2cuYwppbmRleCA4OWY4NjNlLi4wNmZjMDBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfYnNnLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2JzZy5jCkBAIC01Niw3ICs1Niw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOwogCWlmIChiZmFkLT5kaXNhYmxlX2FjdGl2ZSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIEVCVVNZOworCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWJmYWQtPmRpc2FibGVfYWN0aXZlID0gQkZBX1RSVUU7CkBAIC05MCw2ICs5MCw3IEBACiAJYmZhX2dldF9hZGFwdGVyX3NlcmlhbF9udW0oJmJmYWQtPmJmYSwgaW9jbWQtPnNlcmlhbG51bSk7CiAJaW9jbWQtPmZhY3Rvcnlud3duID0gcGF0dHIuZmFjdG9yeW53d247CiAJaW9jbWQtPmZhY3Rvcnlwd3duID0gcGF0dHIuZmFjdG9yeXB3d247CisJaW9jbWQtPmJmYWRfbnVtID0gYmZhZC0+aW5zdF9ubzsKIAlpbV9wb3J0ID0gYmZhZC0+cHBvcnQuaW1fcG9ydDsKIAlpb2NtZC0+aG9zdCA9IGltX3BvcnQtPnNob3N0LT5ob3N0X25vOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOwpAQCAtMTc4LDYgKzE3OSwzOCBAQAogfQogCiBpbnQKK2JmYWRfaW9jbWRfaW9jX3Jlc2V0X3N0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCwgdW5zaWduZWQgaW50IHZfY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2dlbl9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqKWNtZDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJaWYgKHZfY21kID09IElPQ01EX0lPQ19SRVNFVF9TVEFUUykgeworCQliZmFfaW9jX2NsZWFyX3N0YXRzKCZiZmFkLT5iZmEpOworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwl9IGVsc2UgaWYgKHZfY21kID09IElPQ01EX0lPQ19SRVNFVF9GV1NUQVRTKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJaW9jbWQtPnN0YXR1cyA9IGJmYV9pb2NfZndfc3RhdHNfY2xlYXIoJmJmYWQtPmJmYS5pb2MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2lvY19zZXRfbmFtZShzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQsIHVuc2lnbmVkIGludCB2X2NtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19pb2NfbmFtZV9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19pb2NfbmFtZV9zICopIGNtZDsKKworCWlmICh2X2NtZCA9PSBJT0NNRF9JT0NfU0VUX0FEQVBURVJfTkFNRSkKKwkJc3RyY3B5KGJmYWQtPmFkYXB0ZXJfbmFtZSwgaW9jbWQtPm5hbWUpOworCWVsc2UgaWYgKHZfY21kID09IElPQ01EX0lPQ19TRVRfUE9SVF9OQU1FKQorCQlzdHJjcHkoYmZhZC0+cG9ydF9uYW1lLCBpb2NtZC0+bmFtZSk7CisKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwlyZXR1cm4gMDsKK30KKworaW50CiBiZmFkX2lvY21kX2lvY2ZjX2dldF9hdHRyKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKIHsKIAlzdHJ1Y3QgYmZhX2JzZ19pb2NmY19hdHRyX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2lvY2ZjX2F0dHJfcyAqKWNtZDsKQEAgLTMwNiw2ICszMzksODEgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50CitiZmFkX2lvY21kX3BvcnRfcmVzZXRfc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2dlbl9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcCBmY29tcDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9wb3J0X2NsZWFyX3N0YXRzKCZiZmFkLT5iZmEubW9kdWxlcy5wb3J0LAorCQkJCQliZmFkX2hjYl9jb21wLCAmZmNvbXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJYmZhX3RyYyhiZmFkLCBpb2NtZC0+c3RhdHVzKTsKKwkJcmV0dXJuIDA7CisJfQorCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWlvY21kLT5zdGF0dXMgPSBmY29tcC5zdGF0dXM7CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9zZXRfcG9ydF9jZmcoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqaW9jbWQsIHVuc2lnbmVkIGludCB2X2NtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19wb3J0X2NmZ19zICpjbWQgPSAoc3RydWN0IGJmYV9ic2dfcG9ydF9jZmdfcyAqKWlvY21kOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKHZfY21kID09IElPQ01EX1BPUlRfQ0ZHX1RPUE8pCisJCWNtZC0+c3RhdHVzID0gYmZhX2ZjcG9ydF9jZmdfdG9wb2xvZ3koJmJmYWQtPmJmYSwgY21kLT5wYXJhbSk7CisJZWxzZSBpZiAodl9jbWQgPT0gSU9DTURfUE9SVF9DRkdfU1BFRUQpCisJCWNtZC0+c3RhdHVzID0gYmZhX2ZjcG9ydF9jZmdfc3BlZWQoJmJmYWQtPmJmYSwgY21kLT5wYXJhbSk7CisJZWxzZSBpZiAodl9jbWQgPT0gSU9DTURfUE9SVF9DRkdfQUxQQSkKKwkJY21kLT5zdGF0dXMgPSBiZmFfZmNwb3J0X2NmZ19oYXJkYWxwYSgmYmZhZC0+YmZhLCBjbWQtPnBhcmFtKTsKKwllbHNlIGlmICh2X2NtZCA9PSBJT0NNRF9QT1JUX0NMUl9BTFBBKQorCQljbWQtPnN0YXR1cyA9IGJmYV9mY3BvcnRfY2xyX2hhcmRhbHBhKCZiZmFkLT5iZmEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9wb3J0X2NmZ19tYXhmcnNpemUoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX3BvcnRfY2ZnX21heGZyc2l6ZV9zICppb2NtZCA9CisJCQkJKHN0cnVjdCBiZmFfYnNnX3BvcnRfY2ZnX21heGZyc2l6ZV9zICopY21kOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9mY3BvcnRfY2ZnX21heGZyc2l6ZSgmYmZhZC0+YmZhLCBpb2NtZC0+bWF4ZnJzaXplKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfcG9ydF9jZmdfYmJzYyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQsIHVuc2lnbmVkIGludCB2X2NtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfZ2VuX3MgKiljbWQ7CisJc3RydWN0IGJmYV9mY3BvcnRfcyAqZmNwb3J0ID0gQkZBX0ZDUE9SVF9NT0QoJmJmYWQtPmJmYSk7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAoYmZhX2lvY19nZXRfdHlwZSgmYmZhZC0+YmZhLmlvYykgPT0gQkZBX0lPQ19UWVBFX0ZDKSB7CisJCWlmICh2X2NtZCA9PSBJT0NNRF9QT1JUX0JCU0NfRU5BQkxFKQorCQkJZmNwb3J0LT5jZmcuYmJfc2NuX3N0YXRlID0gQkZBX1RSVUU7CisJCWVsc2UgaWYgKHZfY21kID09IElPQ01EX1BPUlRfQkJTQ19ESVNBQkxFKQorCQkJZmNwb3J0LT5jZmcuYmJfc2NuX3N0YXRlID0gQkZBX0ZBTFNFOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50CiBiZmFkX2lvY21kX2xwb3J0X2dldF9hdHRyKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKIHsKQEAgLTM1NCw2ICs0NjIsNDAgQEAKIH0KIAogaW50CitiZmFkX2lvY21kX2xwb3J0X3Jlc2V0X3N0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zICpmY3NfcG9ydDsKKwlzdHJ1Y3QgYmZhX2JzZ19yZXNldF9zdGF0c19zICppb2NtZCA9CisJCQkoc3RydWN0IGJmYV9ic2dfcmVzZXRfc3RhdHNfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhX2ZjcGltX3MgKmZjcGltID0gQkZBX0ZDUElNKCZiZmFkLT5iZmEpOworCXN0cnVjdCBsaXN0X2hlYWQgKnFlLCAqcWVuOworCXN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW07CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlmY3NfcG9ydCA9IGJmYV9mY3NfbG9va3VwX3BvcnQoJmJmYWQtPmJmYV9mY3MsCisJCQkJaW9jbWQtPnZmX2lkLCBpb2NtZC0+dnB3d24pOworCWlmIChmY3NfcG9ydCA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19VTktOT1dOX0xXV047CisJCWdvdG8gb3V0OworCX0KKworCWJmYV9mY3NfbHBvcnRfY2xlYXJfc3RhdHMoZmNzX3BvcnQpOworCS8qIGNsZWFyIElPIHN0YXRzIGZyb20gYWxsIGFjdGl2ZSBpdG5pbXMgKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUocWUsIHFlbiwgJmZjcGltLT5pdG5pbV9xKSB7CisJCWl0bmltID0gKHN0cnVjdCBiZmFfaXRuaW1fcyAqKSBxZTsKKwkJaWYgKGl0bmltLT5ycG9ydC0+cnBvcnRfaW5mby5scF90YWcgIT0gZmNzX3BvcnQtPmxwX3RhZykKKwkJCWNvbnRpbnVlOworCQliZmFfaXRuaW1fY2xlYXJfc3RhdHMoaXRuaW0pOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CiBiZmFkX2lvY21kX2xwb3J0X2dldF9pb3N0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKIHsKIAlzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zICpmY3NfcG9ydDsKQEAgLTM4OSw3ICs1MzEsNyBAQAogCXZvaWQJKmlvY21kX2J1ZnB0cjsKIAogCWlmIChpb2NtZC0+bnJwb3J0cyA9PSAwKQotCQlyZXR1cm4gRUlOVkFMOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChiZmFkX2Noa19pb2NtZF9zeihwYXlsb2FkX2xlbiwKIAkJCXNpemVvZihzdHJ1Y3QgYmZhX2JzZ19scG9ydF9nZXRfcnBvcnRzX3MpLApAQCAtNTM5LDYgKzY4MSwxNTIgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50CitiZmFkX2lvY21kX3Jwb3J0X2Nscl9zdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfcnBvcnRfcmVzZXRfc3RhdHNfcyAqaW9jbWQgPQorCQkJCShzdHJ1Y3QgYmZhX2JzZ19ycG9ydF9yZXNldF9zdGF0c19zICopY21kOworCXN0cnVjdCBiZmFfZmNzX2xwb3J0X3MgKmZjc19wb3J0OworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKmZjc19ycG9ydDsKKwlzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwb3J0OworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJZmNzX3BvcnQgPSBiZmFfZmNzX2xvb2t1cF9wb3J0KCZiZmFkLT5iZmFfZmNzLAorCQkJCWlvY21kLT52Zl9pZCwgaW9jbWQtPnB3d24pOworCWlmIChmY3NfcG9ydCA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19VTktOT1dOX0xXV047CisJCWdvdG8gb3V0OworCX0KKworCWZjc19ycG9ydCA9IGJmYV9mY3NfcnBvcnRfbG9va3VwKGZjc19wb3J0LCBpb2NtZC0+cnB3d24pOworCWlmIChmY3NfcnBvcnQgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVU5LTk9XTl9SV1dOOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1zZXQoKGNoYXIgKikmZmNzX3Jwb3J0LT5zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBiZmFfcnBvcnRfc3RhdHNfcykpOworCXJwb3J0ID0gYmZhX2Zjc19ycG9ydF9nZXRfaGFscnBvcnQoZmNzX3Jwb3J0KTsKKwltZW1zZXQoJnJwb3J0LT5zdGF0cywgMCwgc2l6ZW9mKHJwb3J0LT5zdGF0cykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfcnBvcnRfc2V0X3NwZWVkKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19ycG9ydF9zZXRfc3BlZWRfcyAqaW9jbWQgPQorCQkJCShzdHJ1Y3QgYmZhX2JzZ19ycG9ydF9zZXRfc3BlZWRfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zICpmY3NfcG9ydDsKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpmY3NfcnBvcnQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlmY3NfcG9ydCA9IGJmYV9mY3NfbG9va3VwX3BvcnQoJmJmYWQtPmJmYV9mY3MsCisJCQkJaW9jbWQtPnZmX2lkLCBpb2NtZC0+cHd3bik7CisJaWYgKGZjc19wb3J0ID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fTFdXTjsKKwkJZ290byBvdXQ7CisJfQorCisJZmNzX3Jwb3J0ID0gYmZhX2Zjc19ycG9ydF9sb29rdXAoZmNzX3BvcnQsIGlvY21kLT5ycHd3bik7CisJaWYgKGZjc19ycG9ydCA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19VTktOT1dOX1JXV047CisJCWdvdG8gb3V0OworCX0KKworCWZjc19ycG9ydC0+cnBmLmFzc2lnbmVkX3NwZWVkICA9IGlvY21kLT5zcGVlZDsKKwkvKiBTZXQgdGhpcyBzcGVlZCBpbiBmL3cgb25seSBpZiB0aGUgUlBTQyBzcGVlZCBpcyBub3QgYXZhaWxhYmxlICovCisJaWYgKGZjc19ycG9ydC0+cnBmLnJwc2Nfc3BlZWQgPT0gQkZBX1BPUlRfU1BFRURfVU5LTk9XTikKKwkJYmZhX3Jwb3J0X3NwZWVkKGZjc19ycG9ydC0+YmZhX3Jwb3J0LCBpb2NtZC0+c3BlZWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfdnBvcnRfZ2V0X2F0dHIoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKmZjc192cG9ydDsKKwlzdHJ1Y3QgYmZhX2JzZ192cG9ydF9hdHRyX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX3Zwb3J0X2F0dHJfcyAqKWNtZDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWZjc192cG9ydCA9IGJmYV9mY3NfdnBvcnRfbG9va3VwKCZiZmFkLT5iZmFfZmNzLAorCQkJCWlvY21kLT52Zl9pZCwgaW9jbWQtPnZwd3duKTsKKwlpZiAoZmNzX3Zwb3J0ID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fVldXTjsKKwkJZ290byBvdXQ7CisJfQorCisJYmZhX2Zjc192cG9ydF9nZXRfYXR0cihmY3NfdnBvcnQsICZpb2NtZC0+dnBvcnRfYXR0cik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF92cG9ydF9nZXRfc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKmZjc192cG9ydDsKKwlzdHJ1Y3QgYmZhX2JzZ192cG9ydF9zdGF0c19zICppb2NtZCA9CisJCQkJKHN0cnVjdCBiZmFfYnNnX3Zwb3J0X3N0YXRzX3MgKiljbWQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlmY3NfdnBvcnQgPSBiZmFfZmNzX3Zwb3J0X2xvb2t1cCgmYmZhZC0+YmZhX2ZjcywKKwkJCQlpb2NtZC0+dmZfaWQsIGlvY21kLT52cHd3bik7CisJaWYgKGZjc192cG9ydCA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19VTktOT1dOX1ZXV047CisJCWdvdG8gb3V0OworCX0KKworCW1lbWNweSgodm9pZCAqKSZpb2NtZC0+dnBvcnRfc3RhdHMsICh2b2lkICopJmZjc192cG9ydC0+dnBvcnRfc3RhdHMsCisJCXNpemVvZihzdHJ1Y3QgYmZhX3Zwb3J0X3N0YXRzX3MpKTsKKwltZW1jcHkoKHZvaWQgKikmaW9jbWQtPnZwb3J0X3N0YXRzLnBvcnRfc3RhdHMsCisJICAgICAgICh2b2lkICopJmZjc192cG9ydC0+bHBvcnQuc3RhdHMsCisJCXNpemVvZihzdHJ1Y3QgYmZhX2xwb3J0X3N0YXRzX3MpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3Zwb3J0X2Nscl9zdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqZmNzX3Zwb3J0OworCXN0cnVjdCBiZmFfYnNnX3Jlc2V0X3N0YXRzX3MgKmlvY21kID0KKwkJCQkoc3RydWN0IGJmYV9ic2dfcmVzZXRfc3RhdHNfcyAqKWNtZDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWZjc192cG9ydCA9IGJmYV9mY3NfdnBvcnRfbG9va3VwKCZiZmFkLT5iZmFfZmNzLAorCQkJCWlvY21kLT52Zl9pZCwgaW9jbWQtPnZwd3duKTsKKwlpZiAoZmNzX3Zwb3J0ID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fVldXTjsKKwkJZ290byBvdXQ7CisJfQorCisJbWVtc2V0KCZmY3NfdnBvcnQtPnZwb3J0X3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IGJmYV92cG9ydF9zdGF0c19zKSk7CisJbWVtc2V0KCZmY3NfdnBvcnQtPmxwb3J0LnN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IGJmYV9scG9ydF9zdGF0c19zKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQKIGJmYWRfaW9jbWRfZmFicmljX2dldF9scG9ydHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kLAogCQkJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuKQpAQCAtNTgyLDYgKzg3MCw2NiBAQAogfQogCiBpbnQKK2JmYWRfaW9jbWRfcmF0ZWxpbShzdHJ1Y3QgYmZhZF9zICpiZmFkLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICpwY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2dlbl9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqKXBjbWQ7CisJc3RydWN0IGJmYV9mY3BvcnRfcyAqZmNwb3J0ID0gQkZBX0ZDUE9SVF9NT0QoJmJmYWQtPmJmYSk7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCWlmIChjbWQgPT0gSU9DTURfUkFURUxJTV9FTkFCTEUpCisJCWZjcG9ydC0+Y2ZnLnJhdGVsaW1pdCA9IEJGQV9UUlVFOworCWVsc2UgaWYgKGNtZCA9PSBJT0NNRF9SQVRFTElNX0RJU0FCTEUpCisJCWZjcG9ydC0+Y2ZnLnJhdGVsaW1pdCA9IEJGQV9GQUxTRTsKKworCWlmIChmY3BvcnQtPmNmZy50cmxfZGVmX3NwZWVkID09IEJGQV9QT1JUX1NQRUVEX1VOS05PV04pCisJCWZjcG9ydC0+Y2ZnLnRybF9kZWZfc3BlZWQgPSBCRkFfUE9SVF9TUEVFRF8xR0JQUzsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9yYXRlbGltX3NwZWVkKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKnBjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfdHJsX3NwZWVkX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX3RybF9zcGVlZF9zICopcGNtZDsKKwlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSBCRkFfRkNQT1JUX01PRCgmYmZhZC0+YmZhKTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJLyogQXV0byBhbmQgc3BlZWRzIGdyZWF0ZXIgdGhhbiB0aGUgc3VwcG9ydGVkIHNwZWVkLCBhcmUgaW52YWxpZCAqLworCWlmICgoaW9jbWQtPnNwZWVkID09IEJGQV9QT1JUX1NQRUVEX0FVVE8pIHx8CisJICAgIChpb2NtZC0+c3BlZWQgPiBmY3BvcnQtPnNwZWVkX3N1cCkpIHsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVU5TVVBQX1NQRUVEOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZmNwb3J0LT5jZmcudHJsX2RlZl9zcGVlZCA9IGlvY21kLT5zcGVlZDsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfY2ZnX2ZjcGltKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9zICopY21kOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJYmZhX2ZjcGltX3BhdGhfdG92X3NldCgmYmZhZC0+YmZhLCBpb2NtZC0+cGFyYW0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCXJldHVybiAwOworfQorCitpbnQKIGJmYWRfaW9jbWRfZmNwaW1fZ2V0X21vZHN0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKIHsKIAlzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9tb2RzdGF0c19zICppb2NtZCA9CkBAIC02MDQsNiArOTUyLDI4IEBACiB9CiAKIGludAorYmZhZF9pb2NtZF9mY3BpbV9jbHJfbW9kc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2ZjcGltX21vZHN0YXRzY2xyX3MgKmlvY21kID0KKwkJCQkoc3RydWN0IGJmYV9ic2dfZmNwaW1fbW9kc3RhdHNjbHJfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhX2ZjcGltX3MgKmZjcGltID0gQkZBX0ZDUElNKCZiZmFkLT5iZmEpOworCXN0cnVjdCBsaXN0X2hlYWQgKnFlLCAqcWVuOworCXN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW07CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocWUsIHFlbiwgJmZjcGltLT5pdG5pbV9xKSB7CisJCWl0bmltID0gKHN0cnVjdCBiZmFfaXRuaW1fcyAqKSBxZTsKKwkJYmZhX2l0bmltX2NsZWFyX3N0YXRzKGl0bmltKTsKKwl9CisJbWVtc2V0KCZmY3BpbS0+ZGVsX2l0bl9zdGF0cywgMCwKKwkJc2l6ZW9mKHN0cnVjdCBiZmFfZmNwaW1fZGVsX2l0bl9zdGF0c19zKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJcmV0dXJuIDA7Cit9CisKK2ludAogYmZhZF9pb2NtZF9mY3BpbV9nZXRfZGVsX2l0bl9zdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCiB7CiAJc3RydWN0IGJmYV9ic2dfZmNwaW1fZGVsX2l0bl9zdGF0c19zICppb2NtZCA9CkBAIC02NzAsNiArMTA0MCwzNSBAQAogfQogCiBzdGF0aWMgaW50CitiZmFkX2lvY21kX2l0bmltX3Jlc2V0X3N0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19ycG9ydF9yZXNldF9zdGF0c19zICppb2NtZCA9CisJCQkoc3RydWN0IGJmYV9ic2dfcnBvcnRfcmVzZXRfc3RhdHNfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zCSpmY3NfcG9ydDsKKwlzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zCSppdG5pbTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWZjc19wb3J0ID0gYmZhX2Zjc19sb29rdXBfcG9ydCgmYmZhZC0+YmZhX2ZjcywKKwkJCQlpb2NtZC0+dmZfaWQsIGlvY21kLT5wd3duKTsKKwlpZiAoIWZjc19wb3J0KQorCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19VTktOT1dOX0xXV047CisJZWxzZSB7CisJCWl0bmltID0gYmZhX2Zjc19pdG5pbV9sb29rdXAoZmNzX3BvcnQsIGlvY21kLT5ycHd3bik7CisJCWlmIChpdG5pbSA9PSBOVUxMKQorCQkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVU5LTk9XTl9SV1dOOworCQllbHNlIHsKKwkJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCQkJYmZhX2Zjc19pdG5pbV9zdGF0c19jbGVhcihmY3NfcG9ydCwgaW9jbWQtPnJwd3duKTsKKwkJCWJmYV9pdG5pbV9jbGVhcl9zdGF0cyhiZmFfZmNzX2l0bmltX2dldF9oYWxpdG4oaXRuaW0pKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CiBiZmFkX2lvY21kX2l0bmltX2dldF9pdG5zdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCiB7CiAJc3RydWN0IGJmYV9ic2dfaXRuaW1faXRuc3RhdHNfcyAqaW9jbWQgPQpAQCAtMTUxMSwxMSArMTkxMCw1NDUgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBCRkFfREVCVUdfRldfQ09SRV9DSFVOS19TWgkweDQwMDBVIC8qIDE2SyBjaHVua3MgZm9yIEZXIGR1bXAgKi8KK2ludAorYmZhZF9pb2NtZF9kZWJ1Z19md19jb3JlKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCwKKwkJCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbikKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19kZWJ1Z19zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19kZWJ1Z19zICopY21kOworCXZvaWQJKmlvY21kX2J1ZnB0cjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJaWYgKGJmYWRfY2hrX2lvY21kX3N6KHBheWxvYWRfbGVuLCBzaXplb2Yoc3RydWN0IGJmYV9ic2dfZGVidWdfcyksCisJCQlCRkFfREVCVUdfRldfQ09SRV9DSFVOS19TWikgIT0gQkZBX1NUQVRVU19PSykgeworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19WRVJTSU9OX0ZBSUw7CisJCXJldHVybiAwOworCX0KKworCWlmIChpb2NtZC0+YnVmc3ogPCBCRkFfREVCVUdfRldfQ09SRV9DSFVOS19TWiB8fAorCQkJIUlTX0FMSUdORUQoaW9jbWQtPmJ1ZnN6LCBzaXplb2YodTE2KSkgfHwKKwkJCSFJU19BTElHTkVEKGlvY21kLT5vZmZzZXQsIHNpemVvZih1MzIpKSkgeworCQliZmFfdHJjKGJmYWQsIEJGQV9ERUJVR19GV19DT1JFX0NIVU5LX1NaKTsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpb2NtZF9idWZwdHIgPSAoY2hhciAqKWlvY21kICsgc2l6ZW9mKHN0cnVjdCBiZmFfYnNnX2RlYnVnX3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX2lvY19kZWJ1Z19md2NvcmUoJmJmYWQtPmJmYS5pb2MsIGlvY21kX2J1ZnB0ciwKKwkJCQkodTMyICopJmlvY21kLT5vZmZzZXQsICZpb2NtZC0+YnVmc3opOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfZGVidWdfY3RsKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCwgdW5zaWduZWQgaW50IHZfY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2dlbl9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqKWNtZDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJaWYgKHZfY21kID09IElPQ01EX0RFQlVHX0ZXX1NUQVRFX0NMUikgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWJmYWQtPmJmYS5pb2MuZGJnX2Z3c2F2ZV9vbmNlID0gQkZBX1RSVUU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCX0gZWxzZSBpZiAodl9jbWQgPT0gSU9DTURfREVCVUdfUE9SVExPR19DTFIpCisJCWJmYWQtPnBsb2dfYnVmLmhlYWQgPSBiZmFkLT5wbG9nX2J1Zi50YWlsID0gMDsKKwllbHNlIGlmICh2X2NtZCA9PSBJT0NNRF9ERUJVR19TVEFSVF9EVFJDKQorCQliZmFfdHJjX2luaXQoYmZhZC0+dHJjbW9kKTsKKwllbHNlIGlmICh2X2NtZCA9PSBJT0NNRF9ERUJVR19TVE9QX0RUUkMpCisJCWJmYV90cmNfc3RvcChiZmFkLT50cmNtb2QpOworCisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9wb3JnbG9nX2N0bChzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfcG9ydGxvZ2N0bF9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19wb3J0bG9nY3RsX3MgKiljbWQ7CisKKwlpZiAoaW9jbWQtPmN0bCA9PSBCRkFfVFJVRSkKKwkJYmZhZC0+cGxvZ19idWYucGxvZ19lbmFibGVkID0gMTsKKwllbHNlCisJCWJmYWQtPnBsb2dfYnVmLnBsb2dfZW5hYmxlZCA9IDA7CisKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2ZjcGltX2NmZ19wcm9maWxlKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCwgdW5zaWduZWQgaW50IHZfY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2ZjcGltX3Byb2ZpbGVfcyAqaW9jbWQgPQorCQkJCShzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9wcm9maWxlX3MgKiljbWQ7CisJc3RydWN0IHRpbWV2YWwgIHR2OworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKHZfY21kID09IElPQ01EX0ZDUElNX1BST0ZJTEVfT04pCisJCWlvY21kLT5zdGF0dXMgPSBiZmFfZmNwaW1fcHJvZmlsZV9vbigmYmZhZC0+YmZhLCB0di50dl9zZWMpOworCWVsc2UgaWYgKHZfY21kID09IElPQ01EX0ZDUElNX1BST0ZJTEVfT0ZGKQorCQlpb2NtZC0+c3RhdHVzID0gYmZhX2ZjcGltX3Byb2ZpbGVfb2ZmKCZiZmFkLT5iZmEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2JmYWRfaW9jbWRfaXRuaW1fZ2V0X2lvcHJvZmlsZShzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfaXRuaW1faW9wcm9maWxlX3MgKmlvY21kID0KKwkJCQkoc3RydWN0IGJmYV9ic2dfaXRuaW1faW9wcm9maWxlX3MgKiljbWQ7CisJc3RydWN0IGJmYV9mY3NfbHBvcnRfcyAqZmNzX3BvcnQ7CisJc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW07CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWZjc19wb3J0ID0gYmZhX2Zjc19sb29rdXBfcG9ydCgmYmZhZC0+YmZhX2ZjcywKKwkJCQlpb2NtZC0+dmZfaWQsIGlvY21kLT5scHd3bik7CisJaWYgKCFmY3NfcG9ydCkKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVU5LTk9XTl9MV1dOOworCWVsc2UgeworCQlpdG5pbSA9IGJmYV9mY3NfaXRuaW1fbG9va3VwKGZjc19wb3J0LCBpb2NtZC0+cnB3d24pOworCQlpZiAoaXRuaW0gPT0gTlVMTCkKKwkJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fUldXTjsKKwkJZWxzZQorCQkJaW9jbWQtPnN0YXR1cyA9IGJmYV9pdG5pbV9nZXRfaW9wcm9maWxlKAorCQkJCQkJYmZhX2Zjc19pdG5pbV9nZXRfaGFsaXRuKGl0bmltKSwKKwkJCQkJCSZpb2NtZC0+aW9wcm9maWxlKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9mY3BvcnRfZ2V0X3N0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19mY3BvcnRfc3RhdHNfcyAqaW9jbWQgPQorCQkJCShzdHJ1Y3QgYmZhX2JzZ19mY3BvcnRfc3RhdHNfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcCBmY29tcDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXN0cnVjdCBiZmFfY2JfcGVuZGluZ19xX3MgY2JfcWU7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWJmYV9wZW5kaW5nX3FfaW5pdCgmY2JfcWUsIChiZmFfY2JfY2Jmbl90KWJmYWRfaGNiX2NvbXAsCisJCQkgICAmZmNvbXAsICZpb2NtZC0+c3RhdHMpOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX2ZjcG9ydF9nZXRfc3RhdHMoJmJmYWQtPmJmYSwgJmNiX3FlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAoaW9jbWQtPnN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCWJmYV90cmMoYmZhZCwgaW9jbWQtPnN0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlpb2NtZC0+c3RhdHVzID0gZmNvbXAuc3RhdHVzOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfZmNwb3J0X3Jlc2V0X3N0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfZ2VuX3MgKiljbWQ7CisJc3RydWN0IGJmYWRfaGFsX2NvbXAgZmNvbXA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlzdHJ1Y3QgYmZhX2NiX3BlbmRpbmdfcV9zIGNiX3FlOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwliZmFfcGVuZGluZ19xX2luaXQoJmNiX3FlLCAoYmZhX2NiX2NiZm5fdCliZmFkX2hjYl9jb21wLCAmZmNvbXAsIE5VTEwpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfZmNwb3J0X2NsZWFyX3N0YXRzKCZiZmFkLT5iZmEsICZjYl9xZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykgeworCQliZmFfdHJjKGJmYWQsIGlvY21kLT5zdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2Jvb3RfY2ZnKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19ib290X3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2Jvb3RfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcCBmY29tcDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9mbGFzaF91cGRhdGVfcGFydChCRkFfRkxBU0goJmJmYWQtPmJmYSksCisJCQlCRkFfRkxBU0hfUEFSVF9CT09ULCBQQ0lfRlVOQyhiZmFkLT5wY2lkZXYtPmRldmZuKSwKKwkJCSZpb2NtZC0+Y2ZnLCBzaXplb2Yoc3RydWN0IGJmYV9ib290X2NmZ19zKSwgMCwKKwkJCWJmYWRfaGNiX2NvbXAsICZmY29tcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykKKwkJZ290byBvdXQ7CisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2Jvb3RfcXVlcnkoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2Jvb3RfcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfYm9vdF9zICopY21kOworCXN0cnVjdCBiZmFkX2hhbF9jb21wIGZjb21wOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX2ZsYXNoX3JlYWRfcGFydChCRkFfRkxBU0goJmJmYWQtPmJmYSksCisJCQlCRkFfRkxBU0hfUEFSVF9CT09ULCBQQ0lfRlVOQyhiZmFkLT5wY2lkZXYtPmRldmZuKSwKKwkJCSZpb2NtZC0+Y2ZnLCBzaXplb2Yoc3RydWN0IGJmYV9ib290X2NmZ19zKSwgMCwKKwkJCWJmYWRfaGNiX2NvbXAsICZmY29tcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykKKwkJZ290byBvdXQ7CisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3ByZWJvb3RfcXVlcnkoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX3ByZWJvb3RfcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfcHJlYm9vdF9zICopY21kOworCXN0cnVjdCBiZmlfaW9jZmNfY2ZncnNwX3MgKmNmZ3JzcCA9IGJmYWQtPmJmYS5pb2NmYy5jZmdyc3A7CisJc3RydWN0IGJmYV9ib290X3BiY19zICpwYmNmZyA9ICZpb2NtZC0+Y2ZnOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJcGJjZmctPmVuYWJsZSA9IGNmZ3JzcC0+cGJjX2NmZy5ib290X2VuYWJsZWQ7CisJcGJjZmctPm5ibHVucyA9IGNmZ3JzcC0+cGJjX2NmZy5uYmx1bnM7CisJcGJjZmctPnNwZWVkID0gY2ZncnNwLT5wYmNfY2ZnLnBvcnRfc3BlZWQ7CisJbWVtY3B5KHBiY2ZnLT5wYmx1biwgY2ZncnNwLT5wYmNfY2ZnLmJsdW4sIHNpemVvZihwYmNmZy0+cGJsdW4pKTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfZXRoYm9vdF9jZmcoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2V0aGJvb3RfcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfZXRoYm9vdF9zICopY21kOworCXN0cnVjdCBiZmFkX2hhbF9jb21wIGZjb21wOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX2ZsYXNoX3VwZGF0ZV9wYXJ0KEJGQV9GTEFTSCgmYmZhZC0+YmZhKSwKKwkJCQlCRkFfRkxBU0hfUEFSVF9QWEVDRkcsCisJCQkJYmZhZC0+YmZhLmlvYy5wb3J0X2lkLCAmaW9jbWQtPmNmZywKKwkJCQlzaXplb2Yoc3RydWN0IGJmYV9ldGhib290X2NmZ19zKSwgMCwKKwkJCQliZmFkX2hjYl9jb21wLCAmZmNvbXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spCisJCWdvdG8gb3V0OworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWlvY21kLT5zdGF0dXMgPSBmY29tcC5zdGF0dXM7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9ldGhib290X3F1ZXJ5KHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19ldGhib290X3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2V0aGJvb3RfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcCBmY29tcDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9mbGFzaF9yZWFkX3BhcnQoQkZBX0ZMQVNIKCZiZmFkLT5iZmEpLAorCQkJCUJGQV9GTEFTSF9QQVJUX1BYRUNGRywKKwkJCQliZmFkLT5iZmEuaW9jLnBvcnRfaWQsICZpb2NtZC0+Y2ZnLAorCQkJCXNpemVvZihzdHJ1Y3QgYmZhX2V0aGJvb3RfY2ZnX3MpLCAwLAorCQkJCWJmYWRfaGNiX2NvbXAsICZmY29tcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykKKwkJZ290byBvdXQ7CisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2NmZ190cnVuayhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQsIHVuc2lnbmVkIGludCB2X2NtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfZ2VuX3MgKiljbWQ7CisJc3RydWN0IGJmYV9mY3BvcnRfcyAqZmNwb3J0ID0gQkZBX0ZDUE9SVF9NT0QoJmJmYWQtPmJmYSk7CisJc3RydWN0IGJmYV9mY3BvcnRfdHJ1bmtfcyAqdHJ1bmsgPSAmZmNwb3J0LT50cnVuazsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJaWYgKHZfY21kID09IElPQ01EX1RSVU5LX0VOQUJMRSkgeworCQl0cnVuay0+YXR0ci5zdGF0ZSA9IEJGQV9UUlVOS19PRkZMSU5FOworCQliZmFfZmNwb3J0X2Rpc2FibGUoJmJmYWQtPmJmYSk7CisJCWZjcG9ydC0+Y2ZnLnRydW5rZWQgPSBCRkFfVFJVRTsKKwl9IGVsc2UgaWYgKHZfY21kID09IElPQ01EX1RSVU5LX0RJU0FCTEUpIHsKKwkJdHJ1bmstPmF0dHIuc3RhdGUgPSBCRkFfVFJVTktfRElTQUJMRUQ7CisJCWJmYV9mY3BvcnRfZGlzYWJsZSgmYmZhZC0+YmZhKTsKKwkJZmNwb3J0LT5jZmcudHJ1bmtlZCA9IEJGQV9GQUxTRTsKKwl9CisKKwlpZiAoIWJmYV9mY3BvcnRfaXNfZGlzYWJsZWQoJmJmYWQtPmJmYSkpCisJCWJmYV9mY3BvcnRfZW5hYmxlKCZiZmFkLT5iZmEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3RydW5rX2dldF9hdHRyKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ190cnVua19hdHRyX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX3RydW5rX2F0dHJfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSBCRkFfRkNQT1JUX01PRCgmYmZhZC0+YmZhKTsKKwlzdHJ1Y3QgYmZhX2ZjcG9ydF90cnVua19zICp0cnVuayA9ICZmY3BvcnQtPnRydW5rOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJbWVtY3B5KCh2b2lkICopJmlvY21kLT5hdHRyLCAodm9pZCAqKSZ0cnVuay0+YXR0ciwKKwkJc2l6ZW9mKHN0cnVjdCBiZmFfdHJ1bmtfYXR0cl9zKSk7CisJaW9jbWQtPmF0dHIucG9ydF9pZCA9IGJmYV9scHNfZ2V0X2Jhc2VfcGlkKCZiZmFkLT5iZmEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9xb3Moc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kLCB1bnNpZ25lZCBpbnQgdl9jbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZ2VuX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2dlbl9zICopY21kOworCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IEJGQV9GQ1BPUlRfTU9EKCZiZmFkLT5iZmEpOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKGJmYV9pb2NfZ2V0X3R5cGUoJmJmYWQtPmJmYS5pb2MpID09IEJGQV9JT0NfVFlQRV9GQykgeworCQlpZiAodl9jbWQgPT0gSU9DTURfUU9TX0VOQUJMRSkKKwkJCWZjcG9ydC0+Y2ZnLnFvc19lbmFibGVkID0gQkZBX1RSVUU7CisJCWVsc2UgaWYgKHZfY21kID09IElPQ01EX1FPU19ESVNBQkxFKQorCQkJZmNwb3J0LT5jZmcucW9zX2VuYWJsZWQgPSBCRkFfRkFMU0U7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9xb3NfZ2V0X2F0dHIoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX3Fvc19hdHRyX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX3Fvc19hdHRyX3MgKiljbWQ7CisJc3RydWN0IGJmYV9mY3BvcnRfcyAqZmNwb3J0ID0gQkZBX0ZDUE9SVF9NT0QoJmJmYWQtPmJmYSk7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+YXR0ci5zdGF0ZSA9IGZjcG9ydC0+cW9zX2F0dHIuc3RhdGU7CisJaW9jbWQtPmF0dHIudG90YWxfYmJfY3IgPSBiZTMyX3RvX2NwdShmY3BvcnQtPnFvc19hdHRyLnRvdGFsX2JiX2NyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfcW9zX2dldF92Y19hdHRyKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19xb3NfdmNfYXR0cl9zICppb2NtZCA9CisJCQkJKHN0cnVjdCBiZmFfYnNnX3Fvc192Y19hdHRyX3MgKiljbWQ7CisJc3RydWN0IGJmYV9mY3BvcnRfcyAqZmNwb3J0ID0gQkZBX0ZDUE9SVF9NT0QoJmJmYWQtPmJmYSk7CisJc3RydWN0IGJmYV9xb3NfdmNfYXR0cl9zICpiZmFfdmNfYXR0ciA9ICZmY3BvcnQtPnFvc192Y19hdHRyOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdTMyCWkgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5hdHRyLnRvdGFsX3ZjX2NvdW50ID0gYmUxNl90b19jcHUoYmZhX3ZjX2F0dHItPnRvdGFsX3ZjX2NvdW50KTsKKwlpb2NtZC0+YXR0ci5zaGFyZWRfY3JlZGl0ICA9IGJlMTZfdG9fY3B1KGJmYV92Y19hdHRyLT5zaGFyZWRfY3JlZGl0KTsKKwlpb2NtZC0+YXR0ci5lbHBfb3Btb2RlX2ZsYWdzICA9CisJCQkJYmUzMl90b19jcHUoYmZhX3ZjX2F0dHItPmVscF9vcG1vZGVfZmxhZ3MpOworCisJLyogSW5kaXZpZHVhbCBWQyBpbmZvICovCisJd2hpbGUgKGkgPCBpb2NtZC0+YXR0ci50b3RhbF92Y19jb3VudCkgeworCQlpb2NtZC0+YXR0ci52Y19pbmZvW2ldLnZjX2NyZWRpdCA9CisJCQkJYmZhX3ZjX2F0dHItPnZjX2luZm9baV0udmNfY3JlZGl0OworCQlpb2NtZC0+YXR0ci52Y19pbmZvW2ldLmJvcnJvd19jcmVkaXQgPQorCQkJCWJmYV92Y19hdHRyLT52Y19pbmZvW2ldLmJvcnJvd19jcmVkaXQ7CisJCWlvY21kLT5hdHRyLnZjX2luZm9baV0ucHJpb3JpdHkgPQorCQkJCWJmYV92Y19hdHRyLT52Y19pbmZvW2ldLnByaW9yaXR5OworCQlpKys7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9xb3NfZ2V0X3N0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19mY3BvcnRfc3RhdHNfcyAqaW9jbWQgPQorCQkJCShzdHJ1Y3QgYmZhX2JzZ19mY3BvcnRfc3RhdHNfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcCBmY29tcDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXN0cnVjdCBiZmFfY2JfcGVuZGluZ19xX3MgY2JfcWU7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWJmYV9wZW5kaW5nX3FfaW5pdCgmY2JfcWUsIChiZmFfY2JfY2Jmbl90KWJmYWRfaGNiX2NvbXAsCisJCQkgICAmZmNvbXAsICZpb2NtZC0+c3RhdHMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCVdBUk5fT04oIWJmYV9pb2NfZ2V0X2ZjbW9kZSgmYmZhZC0+YmZhLmlvYykpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfZmNwb3J0X2dldF9zdGF0cygmYmZhZC0+YmZhLCAmY2JfcWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJYmZhX3RyYyhiZmFkLCBpb2NtZC0+c3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWlvY21kLT5zdGF0dXMgPSBmY29tcC5zdGF0dXM7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9xb3NfcmVzZXRfc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2dlbl9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcCBmY29tcDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXN0cnVjdCBiZmFfY2JfcGVuZGluZ19xX3MgY2JfcWU7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWJmYV9wZW5kaW5nX3FfaW5pdCgmY2JfcWUsIChiZmFfY2JfY2Jmbl90KWJmYWRfaGNiX2NvbXAsCisJCQkgICAmZmNvbXAsIE5VTEwpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCVdBUk5fT04oIWJmYV9pb2NfZ2V0X2ZjbW9kZSgmYmZhZC0+YmZhLmlvYykpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfZmNwb3J0X2NsZWFyX3N0YXRzKCZiZmFkLT5iZmEsICZjYl9xZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykgeworCQliZmFfdHJjKGJmYWQsIGlvY21kLT5zdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3ZmX2dldF9zdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfdmZfc3RhdHNfcyAqaW9jbWQgPQorCQkJKHN0cnVjdCBiZmFfYnNnX3ZmX3N0YXRzX3MgKiljbWQ7CisJc3RydWN0IGJmYV9mY3NfZmFicmljX3MJKmZjc192ZjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWZjc192ZiA9IGJmYV9mY3NfdmZfbG9va3VwKCZiZmFkLT5iZmFfZmNzLCBpb2NtZC0+dmZfaWQpOworCWlmIChmY3NfdmYgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVU5LTk9XTl9WRklEOworCQlnb3RvIG91dDsKKwl9CisJbWVtY3B5KCh2b2lkICopJmlvY21kLT5zdGF0cywgKHZvaWQgKikmZmNzX3ZmLT5zdGF0cywKKwkJc2l6ZW9mKHN0cnVjdCBiZmFfdmZfc3RhdHNfcykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfdmZfY2xyX3N0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ192Zl9yZXNldF9zdGF0c19zICppb2NtZCA9CisJCQkoc3RydWN0IGJmYV9ic2dfdmZfcmVzZXRfc3RhdHNfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcwkqZmNzX3ZmOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJZmNzX3ZmID0gYmZhX2Zjc192Zl9sb29rdXAoJmJmYWQtPmJmYV9mY3MsIGlvY21kLT52Zl9pZCk7CisJaWYgKGZjc192ZiA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19VTktOT1dOX1ZGSUQ7CisJCWdvdG8gb3V0OworCX0KKwltZW1zZXQoKHZvaWQgKikmZmNzX3ZmLT5zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBiZmFfdmZfc3RhdHNfcykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfbHVubWFzayhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpwY21kLCB1bnNpZ25lZCBpbnQgdl9jbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZ2VuX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2dlbl9zICopcGNtZDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmICh2X2NtZCA9PSBJT0NNRF9GQ1BJTV9MVU5NQVNLX0VOQUJMRSkKKwkJaW9jbWQtPnN0YXR1cyA9IGJmYV9mY3BpbV9sdW5tYXNrX3VwZGF0ZSgmYmZhZC0+YmZhLCBCRkFfVFJVRSk7CisJZWxzZSBpZiAodl9jbWQgPT0gSU9DTURfRkNQSU1fTFVOTUFTS19ESVNBQkxFKQorCQlpb2NtZC0+c3RhdHVzID0gYmZhX2ZjcGltX2x1bm1hc2tfdXBkYXRlKCZiZmFkLT5iZmEsIEJGQV9GQUxTRSk7CisJZWxzZSBpZiAodl9jbWQgPT0gSU9DTURfRkNQSU1fTFVOTUFTS19DTEVBUikKKwkJaW9jbWQtPnN0YXR1cyA9IGJmYV9mY3BpbV9sdW5tYXNrX2NsZWFyKCZiZmFkLT5iZmEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfZmNwaW1fbHVubWFza19xdWVyeShzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZmNwaW1fbHVubWFza19xdWVyeV9zICppb2NtZCA9CisJCQkoc3RydWN0IGJmYV9ic2dfZmNwaW1fbHVubWFza19xdWVyeV9zICopY21kOworCXN0cnVjdCBiZmFfbHVubWFza19jZmdfcyAqbHVuX21hc2sgPSAmaW9jbWQtPmx1bl9tYXNrOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9mY3BpbV9sdW5tYXNrX3F1ZXJ5KCZiZmFkLT5iZmEsIGx1bl9tYXNrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2ZjcGltX2NmZ19sdW5tYXNrKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCwgdW5zaWduZWQgaW50IHZfY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2ZjcGltX2x1bm1hc2tfcyAqaW9jbWQgPQorCQkJCShzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9sdW5tYXNrX3MgKiljbWQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAodl9jbWQgPT0gSU9DTURfRkNQSU1fTFVOTUFTS19BREQpCisJCWlvY21kLT5zdGF0dXMgPSBiZmFfZmNwaW1fbHVubWFza19hZGQoJmJmYWQtPmJmYSwgaW9jbWQtPnZmX2lkLAorCQkJCQkmaW9jbWQtPnB3d24sIGlvY21kLT5ycHd3biwgaW9jbWQtPmx1bik7CisJZWxzZSBpZiAodl9jbWQgPT0gSU9DTURfRkNQSU1fTFVOTUFTS19ERUxFVEUpCisJCWlvY21kLT5zdGF0dXMgPSBiZmFfZmNwaW1fbHVubWFza19kZWxldGUoJmJmYWQtPmJmYSwKKwkJCQkJaW9jbWQtPnZmX2lkLCAmaW9jbWQtPnB3d24sCisJCQkJCWlvY21kLT5ycHd3biwgaW9jbWQtPmx1bik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQKIGJmYWRfaW9jbWRfaGFuZGxlcihzdHJ1Y3QgYmZhZF9zICpiZmFkLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICppb2NtZCwKIAkJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuKQogewotCWludCByYyA9IEVJTlZBTDsKKwlpbnQgcmMgPSAtRUlOVkFMOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIElPQ01EX0lPQ19FTkFCTEU6CkBAIC0xNTM2LDYgKzI0NjksMTQgQEAKIAljYXNlIElPQ01EX0lPQ19HRVRfRldTVEFUUzoKIAkJcmMgPSBiZmFkX2lvY21kX2lvY19nZXRfZndzdGF0cyhiZmFkLCBpb2NtZCwgcGF5bG9hZF9sZW4pOwogCQlicmVhazsKKwljYXNlIElPQ01EX0lPQ19SRVNFVF9TVEFUUzoKKwljYXNlIElPQ01EX0lPQ19SRVNFVF9GV1NUQVRTOgorCQlyYyA9IGJmYWRfaW9jbWRfaW9jX3Jlc2V0X3N0YXRzKGJmYWQsIGlvY21kLCBjbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0lPQ19TRVRfQURBUFRFUl9OQU1FOgorCWNhc2UgSU9DTURfSU9DX1NFVF9QT1JUX05BTUU6CisJCXJjID0gYmZhZF9pb2NtZF9pb2Nfc2V0X25hbWUoYmZhZCwgaW9jbWQsIGNtZCk7CisJCWJyZWFrOwogCWNhc2UgSU9DTURfSU9DRkNfR0VUX0FUVFI6CiAJCXJjID0gYmZhZF9pb2NtZF9pb2NmY19nZXRfYXR0cihiZmFkLCBpb2NtZCk7CiAJCWJyZWFrOwpAQCAtMTU1NCwxMiArMjQ5NSwzMSBAQAogCWNhc2UgSU9DTURfUE9SVF9HRVRfU1RBVFM6CiAJCXJjID0gYmZhZF9pb2NtZF9wb3J0X2dldF9zdGF0cyhiZmFkLCBpb2NtZCwgcGF5bG9hZF9sZW4pOwogCQlicmVhazsKKwljYXNlIElPQ01EX1BPUlRfUkVTRVRfU1RBVFM6CisJCXJjID0gYmZhZF9pb2NtZF9wb3J0X3Jlc2V0X3N0YXRzKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9QT1JUX0NGR19UT1BPOgorCWNhc2UgSU9DTURfUE9SVF9DRkdfU1BFRUQ6CisJY2FzZSBJT0NNRF9QT1JUX0NGR19BTFBBOgorCWNhc2UgSU9DTURfUE9SVF9DTFJfQUxQQToKKwkJcmMgPSBiZmFkX2lvY21kX3NldF9wb3J0X2NmZyhiZmFkLCBpb2NtZCwgY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9QT1JUX0NGR19NQVhGUlNaOgorCQlyYyA9IGJmYWRfaW9jbWRfcG9ydF9jZmdfbWF4ZnJzaXplKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9QT1JUX0JCU0NfRU5BQkxFOgorCWNhc2UgSU9DTURfUE9SVF9CQlNDX0RJU0FCTEU6CisJCXJjID0gYmZhZF9pb2NtZF9wb3J0X2NmZ19iYnNjKGJmYWQsIGlvY21kLCBjbWQpOworCQlicmVhazsKIAljYXNlIElPQ01EX0xQT1JUX0dFVF9BVFRSOgogCQlyYyA9IGJmYWRfaW9jbWRfbHBvcnRfZ2V0X2F0dHIoYmZhZCwgaW9jbWQpOwogCQlicmVhazsKIAljYXNlIElPQ01EX0xQT1JUX0dFVF9TVEFUUzoKIAkJcmMgPSBiZmFkX2lvY21kX2xwb3J0X2dldF9zdGF0cyhiZmFkLCBpb2NtZCk7CiAJCWJyZWFrOworCWNhc2UgSU9DTURfTFBPUlRfUkVTRVRfU1RBVFM6CisJCXJjID0gYmZhZF9pb2NtZF9scG9ydF9yZXNldF9zdGF0cyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOwogCWNhc2UgSU9DTURfTFBPUlRfR0VUX0lPU1RBVFM6CiAJCXJjID0gYmZhZF9pb2NtZF9scG9ydF9nZXRfaW9zdGF0cyhiZmFkLCBpb2NtZCk7CiAJCWJyZWFrOwpAQCAtMTU3NSwxMiArMjUzNSw0MCBAQAogCWNhc2UgSU9DTURfUlBPUlRfR0VUX1NUQVRTOgogCQlyYyA9IGJmYWRfaW9jbWRfcnBvcnRfZ2V0X3N0YXRzKGJmYWQsIGlvY21kKTsKIAkJYnJlYWs7CisJY2FzZSBJT0NNRF9SUE9SVF9SRVNFVF9TVEFUUzoKKwkJcmMgPSBiZmFkX2lvY21kX3Jwb3J0X2Nscl9zdGF0cyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfUlBPUlRfU0VUX1NQRUVEOgorCQlyYyA9IGJmYWRfaW9jbWRfcnBvcnRfc2V0X3NwZWVkKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9WUE9SVF9HRVRfQVRUUjoKKwkJcmMgPSBiZmFkX2lvY21kX3Zwb3J0X2dldF9hdHRyKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9WUE9SVF9HRVRfU1RBVFM6CisJCXJjID0gYmZhZF9pb2NtZF92cG9ydF9nZXRfc3RhdHMoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX1ZQT1JUX1JFU0VUX1NUQVRTOgorCQlyYyA9IGJmYWRfaW9jbWRfdnBvcnRfY2xyX3N0YXRzKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CiAJY2FzZSBJT0NNRF9GQUJSSUNfR0VUX0xQT1JUUzoKIAkJcmMgPSBiZmFkX2lvY21kX2ZhYnJpY19nZXRfbHBvcnRzKGJmYWQsIGlvY21kLCBwYXlsb2FkX2xlbik7CiAJCWJyZWFrOworCWNhc2UgSU9DTURfUkFURUxJTV9FTkFCTEU6CisJY2FzZSBJT0NNRF9SQVRFTElNX0RJU0FCTEU6CisJCXJjID0gYmZhZF9pb2NtZF9yYXRlbGltKGJmYWQsIGNtZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX1JBVEVMSU1fREVGX1NQRUVEOgorCQlyYyA9IGJmYWRfaW9jbWRfcmF0ZWxpbV9zcGVlZChiZmFkLCBjbWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9GQ1BJTV9GQUlMT1ZFUjoKKwkJcmMgPSBiZmFkX2lvY21kX2NmZ19mY3BpbShiZmFkLCBpb2NtZCk7CisJCWJyZWFrOwogCWNhc2UgSU9DTURfRkNQSU1fTU9EU1RBVFM6CiAJCXJjID0gYmZhZF9pb2NtZF9mY3BpbV9nZXRfbW9kc3RhdHMoYmZhZCwgaW9jbWQpOwogCQlicmVhazsKKwljYXNlIElPQ01EX0ZDUElNX01PRFNUQVRTQ0xSOgorCQlyYyA9IGJmYWRfaW9jbWRfZmNwaW1fY2xyX21vZHN0YXRzKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CiAJY2FzZSBJT0NNRF9GQ1BJTV9ERUxfSVROX1NUQVRTOgogCQlyYyA9IGJmYWRfaW9jbWRfZmNwaW1fZ2V0X2RlbF9pdG5fc3RhdHMoYmZhZCwgaW9jbWQpOwogCQlicmVhazsKQEAgLTE1OTAsNiArMjU3OCw5IEBACiAJY2FzZSBJT0NNRF9JVE5JTV9HRVRfSU9TVEFUUzoKIAkJcmMgPSBiZmFkX2lvY21kX2l0bmltX2dldF9pb3N0YXRzKGJmYWQsIGlvY21kKTsKIAkJYnJlYWs7CisJY2FzZSBJT0NNRF9JVE5JTV9SRVNFVF9TVEFUUzoKKwkJcmMgPSBiZmFkX2lvY21kX2l0bmltX3Jlc2V0X3N0YXRzKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CiAJY2FzZSBJT0NNRF9JVE5JTV9HRVRfSVROU1RBVFM6CiAJCXJjID0gYmZhZF9pb2NtZF9pdG5pbV9nZXRfaXRuc3RhdHMoYmZhZCwgaW9jbWQpOwogCQlicmVhazsKQEAgLTE3MDIsMTEgKzI2OTMsOTIgQEAKIAljYXNlIElPQ01EX0RFQlVHX1BPUlRMT0c6CiAJCXJjID0gYmZhZF9pb2NtZF9wb3JnbG9nX2dldChiZmFkLCBpb2NtZCk7CiAJCWJyZWFrOworCWNhc2UgSU9DTURfREVCVUdfRldfQ09SRToKKwkJcmMgPSBiZmFkX2lvY21kX2RlYnVnX2Z3X2NvcmUoYmZhZCwgaW9jbWQsIHBheWxvYWRfbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9ERUJVR19GV19TVEFURV9DTFI6CisJY2FzZSBJT0NNRF9ERUJVR19QT1JUTE9HX0NMUjoKKwljYXNlIElPQ01EX0RFQlVHX1NUQVJUX0RUUkM6CisJY2FzZSBJT0NNRF9ERUJVR19TVE9QX0RUUkM6CisJCXJjID0gYmZhZF9pb2NtZF9kZWJ1Z19jdGwoYmZhZCwgaW9jbWQsIGNtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfREVCVUdfUE9SVExPR19DVEw6CisJCXJjID0gYmZhZF9pb2NtZF9wb3JnbG9nX2N0bChiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfRkNQSU1fUFJPRklMRV9PTjoKKwljYXNlIElPQ01EX0ZDUElNX1BST0ZJTEVfT0ZGOgorCQlyYyA9IGJmYWRfaW9jbWRfZmNwaW1fY2ZnX3Byb2ZpbGUoYmZhZCwgaW9jbWQsIGNtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfSVROSU1fR0VUX0lPUFJPRklMRToKKwkJcmMgPSBiZmFkX2lvY21kX2l0bmltX2dldF9pb3Byb2ZpbGUoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0ZDUE9SVF9HRVRfU1RBVFM6CisJCXJjID0gYmZhZF9pb2NtZF9mY3BvcnRfZ2V0X3N0YXRzKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9GQ1BPUlRfUkVTRVRfU1RBVFM6CisJCXJjID0gYmZhZF9pb2NtZF9mY3BvcnRfcmVzZXRfc3RhdHMoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0JPT1RfQ0ZHOgorCQlyYyA9IGJmYWRfaW9jbWRfYm9vdF9jZmcoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0JPT1RfUVVFUlk6CisJCXJjID0gYmZhZF9pb2NtZF9ib290X3F1ZXJ5KGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9QUkVCT09UX1FVRVJZOgorCQlyYyA9IGJmYWRfaW9jbWRfcHJlYm9vdF9xdWVyeShiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfRVRIQk9PVF9DRkc6CisJCXJjID0gYmZhZF9pb2NtZF9ldGhib290X2NmZyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfRVRIQk9PVF9RVUVSWToKKwkJcmMgPSBiZmFkX2lvY21kX2V0aGJvb3RfcXVlcnkoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX1RSVU5LX0VOQUJMRToKKwljYXNlIElPQ01EX1RSVU5LX0RJU0FCTEU6CisJCXJjID0gYmZhZF9pb2NtZF9jZmdfdHJ1bmsoYmZhZCwgaW9jbWQsIGNtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfVFJVTktfR0VUX0FUVFI6CisJCXJjID0gYmZhZF9pb2NtZF90cnVua19nZXRfYXR0cihiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfUU9TX0VOQUJMRToKKwljYXNlIElPQ01EX1FPU19ESVNBQkxFOgorCQlyYyA9IGJmYWRfaW9jbWRfcW9zKGJmYWQsIGlvY21kLCBjbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX1FPU19HRVRfQVRUUjoKKwkJcmMgPSBiZmFkX2lvY21kX3Fvc19nZXRfYXR0cihiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfUU9TX0dFVF9WQ19BVFRSOgorCQlyYyA9IGJmYWRfaW9jbWRfcW9zX2dldF92Y19hdHRyKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9RT1NfR0VUX1NUQVRTOgorCQlyYyA9IGJmYWRfaW9jbWRfcW9zX2dldF9zdGF0cyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfUU9TX1JFU0VUX1NUQVRTOgorCQlyYyA9IGJmYWRfaW9jbWRfcW9zX3Jlc2V0X3N0YXRzKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9WRl9HRVRfU1RBVFM6CisJCXJjID0gYmZhZF9pb2NtZF92Zl9nZXRfc3RhdHMoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX1ZGX1JFU0VUX1NUQVRTOgorCQlyYyA9IGJmYWRfaW9jbWRfdmZfY2xyX3N0YXRzKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9GQ1BJTV9MVU5NQVNLX0VOQUJMRToKKwljYXNlIElPQ01EX0ZDUElNX0xVTk1BU0tfRElTQUJMRToKKwljYXNlIElPQ01EX0ZDUElNX0xVTk1BU0tfQ0xFQVI6CisJCXJjID0gYmZhZF9pb2NtZF9sdW5tYXNrKGJmYWQsIGlvY21kLCBjbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0ZDUElNX0xVTk1BU0tfUVVFUlk6CisJCXJjID0gYmZhZF9pb2NtZF9mY3BpbV9sdW5tYXNrX3F1ZXJ5KGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9GQ1BJTV9MVU5NQVNLX0FERDoKKwljYXNlIElPQ01EX0ZDUElNX0xVTk1BU0tfREVMRVRFOgorCQlyYyA9IGJmYWRfaW9jbWRfZmNwaW1fY2ZnX2x1bm1hc2soYmZhZCwgaW9jbWQsIGNtZCk7CisJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJjID0gRUlOVkFMOworCQlyYyA9IC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KLQlyZXR1cm4gLXJjOworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2JzZy5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2JzZy5oCmluZGV4IDk5YjBlOGEuLmU4NTlhZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9ic2cuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfYnNnLmgKQEAgLTMwLDI0ICszMCw0OCBAQAogCUlPQ01EX0lPQ19HRVRfSU5GTywKIAlJT0NNRF9JT0NfR0VUX1NUQVRTLAogCUlPQ01EX0lPQ19HRVRfRldTVEFUUywKKwlJT0NNRF9JT0NfUkVTRVRfU1RBVFMsCisJSU9DTURfSU9DX1JFU0VUX0ZXU1RBVFMsCisJSU9DTURfSU9DX1NFVF9BREFQVEVSX05BTUUsCisJSU9DTURfSU9DX1NFVF9QT1JUX05BTUUsCiAJSU9DTURfSU9DRkNfR0VUX0FUVFIsCiAJSU9DTURfSU9DRkNfU0VUX0lOVFIsCiAJSU9DTURfUE9SVF9FTkFCTEUsCiAJSU9DTURfUE9SVF9ESVNBQkxFLAogCUlPQ01EX1BPUlRfR0VUX0FUVFIsCiAJSU9DTURfUE9SVF9HRVRfU1RBVFMsCisJSU9DTURfUE9SVF9SRVNFVF9TVEFUUywKKwlJT0NNRF9QT1JUX0NGR19UT1BPLAorCUlPQ01EX1BPUlRfQ0ZHX1NQRUVELAorCUlPQ01EX1BPUlRfQ0ZHX0FMUEEsCisJSU9DTURfUE9SVF9DRkdfTUFYRlJTWiwKKwlJT0NNRF9QT1JUX0NMUl9BTFBBLAorCUlPQ01EX1BPUlRfQkJTQ19FTkFCTEUsCisJSU9DTURfUE9SVF9CQlNDX0RJU0FCTEUsCiAJSU9DTURfTFBPUlRfR0VUX0FUVFIsCiAJSU9DTURfTFBPUlRfR0VUX1JQT1JUUywKIAlJT0NNRF9MUE9SVF9HRVRfU1RBVFMsCisJSU9DTURfTFBPUlRfUkVTRVRfU1RBVFMsCiAJSU9DTURfTFBPUlRfR0VUX0lPU1RBVFMsCiAJSU9DTURfUlBPUlRfR0VUX0FUVFIsCiAJSU9DTURfUlBPUlRfR0VUX0FERFIsCiAJSU9DTURfUlBPUlRfR0VUX1NUQVRTLAorCUlPQ01EX1JQT1JUX1JFU0VUX1NUQVRTLAorCUlPQ01EX1JQT1JUX1NFVF9TUEVFRCwKKwlJT0NNRF9WUE9SVF9HRVRfQVRUUiwKKwlJT0NNRF9WUE9SVF9HRVRfU1RBVFMsCisJSU9DTURfVlBPUlRfUkVTRVRfU1RBVFMsCiAJSU9DTURfRkFCUklDX0dFVF9MUE9SVFMsCisJSU9DTURfUkFURUxJTV9FTkFCTEUsCisJSU9DTURfUkFURUxJTV9ESVNBQkxFLAorCUlPQ01EX1JBVEVMSU1fREVGX1NQRUVELAorCUlPQ01EX0ZDUElNX0ZBSUxPVkVSLAogCUlPQ01EX0ZDUElNX01PRFNUQVRTLAorCUlPQ01EX0ZDUElNX01PRFNUQVRTQ0xSLAogCUlPQ01EX0ZDUElNX0RFTF9JVE5fU1RBVFMsCiAJSU9DTURfSVROSU1fR0VUX0FUVFIsCiAJSU9DTURfSVROSU1fR0VUX0lPU1RBVFMsCisJSU9DTURfSVROSU1fUkVTRVRfU1RBVFMsCiAJSU9DTURfSVROSU1fR0VUX0lUTlNUQVRTLAogCUlPQ01EX0lPQ19QQ0lGTl9DRkcsCiAJSU9DTURfRkNQT1JUX0VOQUJMRSwKQEAgLTg2LDYgKzExMCwzOSBAQAogCUlPQ01EX1BIWV9SRUFEX0ZXLAogCUlPQ01EX1ZIQkFfUVVFUlksCiAJSU9DTURfREVCVUdfUE9SVExPRywKKwlJT0NNRF9ERUJVR19GV19DT1JFLAorCUlPQ01EX0RFQlVHX0ZXX1NUQVRFX0NMUiwKKwlJT0NNRF9ERUJVR19QT1JUTE9HX0NMUiwKKwlJT0NNRF9ERUJVR19TVEFSVF9EVFJDLAorCUlPQ01EX0RFQlVHX1NUT1BfRFRSQywKKwlJT0NNRF9ERUJVR19QT1JUTE9HX0NUTCwKKwlJT0NNRF9GQ1BJTV9QUk9GSUxFX09OLAorCUlPQ01EX0ZDUElNX1BST0ZJTEVfT0ZGLAorCUlPQ01EX0lUTklNX0dFVF9JT1BST0ZJTEUsCisJSU9DTURfRkNQT1JUX0dFVF9TVEFUUywKKwlJT0NNRF9GQ1BPUlRfUkVTRVRfU1RBVFMsCisJSU9DTURfQk9PVF9DRkcsCisJSU9DTURfQk9PVF9RVUVSWSwKKwlJT0NNRF9QUkVCT09UX1FVRVJZLAorCUlPQ01EX0VUSEJPT1RfQ0ZHLAorCUlPQ01EX0VUSEJPT1RfUVVFUlksCisJSU9DTURfVFJVTktfRU5BQkxFLAorCUlPQ01EX1RSVU5LX0RJU0FCTEUsCisJSU9DTURfVFJVTktfR0VUX0FUVFIsCisJSU9DTURfUU9TX0VOQUJMRSwKKwlJT0NNRF9RT1NfRElTQUJMRSwKKwlJT0NNRF9RT1NfR0VUX0FUVFIsCisJSU9DTURfUU9TX0dFVF9WQ19BVFRSLAorCUlPQ01EX1FPU19HRVRfU1RBVFMsCisJSU9DTURfUU9TX1JFU0VUX1NUQVRTLAorCUlPQ01EX1ZGX0dFVF9TVEFUUywKKwlJT0NNRF9WRl9SRVNFVF9TVEFUUywKKwlJT0NNRF9GQ1BJTV9MVU5NQVNLX0VOQUJMRSwKKwlJT0NNRF9GQ1BJTV9MVU5NQVNLX0RJU0FCTEUsCisJSU9DTURfRkNQSU1fTFVOTUFTS19DTEVBUiwKKwlJT0NNRF9GQ1BJTV9MVU5NQVNLX1FVRVJZLAorCUlPQ01EX0ZDUElNX0xVTk1BU0tfQURELAorCUlPQ01EX0ZDUElNX0xVTk1BU0tfREVMRVRFLAogfTsKIAogc3RydWN0IGJmYV9ic2dfZ2VuX3MgewpAQCAtOTQsNiArMTUxLDQzIEBACiAJdTE2CQlyc3ZkOwogfTsKIAorc3RydWN0IGJmYV9ic2dfcG9ydGxvZ2N0bF9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCWJmYV9ib29sZWFuX3QJY3RsOworCWludAkJaW5zdF9ubzsKK307CisKK3N0cnVjdCBiZmFfYnNnX2ZjcGltX3Byb2ZpbGVfcyB7CisJYmZhX3N0YXR1c190ICAgIHN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJcnN2ZDsKK307CisKK3N0cnVjdCBiZmFfYnNnX2l0bmltX2lvcHJvZmlsZV9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQl2Zl9pZDsKKwl3d25fdAkJbHB3d247CisJd3duX3QJCXJwd3duOworCXN0cnVjdCBiZmFfaXRuaW1faW9wcm9maWxlX3MgaW9wcm9maWxlOworfTsKKworc3RydWN0IGJmYV9ic2dfZmNwb3J0X3N0YXRzX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXJzdmQ7CisJdW5pb24gYmZhX2ZjcG9ydF9zdGF0c191IHN0YXRzOworfTsKKworc3RydWN0IGJmYV9ic2dfaW9jX25hbWVfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJcnN2ZDsKKwljaGFyCQluYW1lW0JGQV9BREFQVEVSX1NZTV9OQU1FX0xFTl07Cit9OworCiBzdHJ1Y3QgYmZhX2JzZ19pb2NfaW5mb19zIHsKIAliZmFfc3RhdHVzX3QJc3RhdHVzOwogCXUxNgkJYmZhZF9udW07CkBAIC0xNjQsNiArMjU4LDIwIEBACiAJc3RydWN0IGJmYV9wb3J0X2F0dHJfcwlhdHRyOwogfTsKIAorc3RydWN0IGJmYV9ic2dfcG9ydF9jZmdfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJcnN2ZDsKKwl1MzIJCXBhcmFtOworCXUzMgkJcnN2ZDE7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19wb3J0X2NmZ19tYXhmcnNpemVfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJbWF4ZnJzaXplOworfTsKKwogc3RydWN0IGJmYV9ic2dfcG9ydF9zdGF0c19zIHsKIAliZmFfc3RhdHVzX3QJc3RhdHVzOwogCXUxNgkJYmZhZF9udW07CkBAIC0yMzcsNiArMzQ1LDQ3IEBACiAJdTMyCQlsdW47CiB9OwogCitzdHJ1Y3QgYmZhX2JzZ19ycG9ydF9yZXNldF9zdGF0c19zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQl2Zl9pZDsKKwl3d25fdAkJcHd3bjsKKwl3d25fdAkJcnB3d247Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19ycG9ydF9zZXRfc3BlZWRfcyB7CisJYmZhX3N0YXR1c190CQlzdGF0dXM7CisJdTE2CQkJYmZhZF9udW07CisJdTE2CQkJdmZfaWQ7CisJZW51bSBiZmFfcG9ydF9zcGVlZAlzcGVlZDsKKwl1MzIJCQlyc3ZkOworCXd3bl90CQkJcHd3bjsKKwl3d25fdAkJCXJwd3duOworfTsKKworc3RydWN0IGJmYV9ic2dfdnBvcnRfYXR0cl9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQl2Zl9pZDsKKwl3d25fdAkJdnB3d247CisJc3RydWN0IGJmYV92cG9ydF9hdHRyX3MgdnBvcnRfYXR0cjsKK307CisKK3N0cnVjdCBiZmFfYnNnX3Zwb3J0X3N0YXRzX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXZmX2lkOworCXd3bl90CQl2cHd3bjsKKwlzdHJ1Y3QgYmZhX3Zwb3J0X3N0YXRzX3MgdnBvcnRfc3RhdHM7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19yZXNldF9zdGF0c19zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQl2Zl9pZDsKKwl3d25fdAkJdnB3d247Cit9OworCiBzdHJ1Y3QgYmZhX2JzZ19mYWJyaWNfZ2V0X2xwb3J0c19zIHsKIAliZmFfc3RhdHVzX3QJc3RhdHVzOwogCXUxNgkJYmZhZF9udW07CkBAIC0yNDYsNiArMzk1LDE5IEBACiAJdTMyCQlyc3ZkOwogfTsKIAorc3RydWN0IGJmYV9ic2dfdHJsX3NwZWVkX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXJzdmQ7CisJZW51bSBiZmFfcG9ydF9zcGVlZCBzcGVlZDsKK307CisKK3N0cnVjdCBiZmFfYnNnX2ZjcGltX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXBhcmFtOworfTsKKwogc3RydWN0IGJmYV9ic2dfZmNwaW1fbW9kc3RhdHNfcyB7CiAJYmZhX3N0YXR1c190CXN0YXR1czsKIAl1MTYJCWJmYWRfbnVtOwpAQCAtMjU4LDYgKzQyMCwxMSBAQAogCXN0cnVjdCBiZmFfZmNwaW1fZGVsX2l0bl9zdGF0c19zIG1vZHN0YXRzOwogfTsKIAorc3RydWN0IGJmYV9ic2dfZmNwaW1fbW9kc3RhdHNjbHJfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworfTsKKwogc3RydWN0IGJmYV9ic2dfaXRuaW1fYXR0cl9zIHsKIAliZmFfc3RhdHVzX3QJc3RhdHVzOwogCXUxNgkJYmZhZF9udW07CkBAIC00ODUsNiArNjUyLDc2IEBACiAJc3RydWN0IGJmYV92aGJhX2F0dHJfcwlhdHRyOwogfTsKIAorc3RydWN0IGJmYV9ic2dfYm9vdF9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCXN0cnVjdCBiZmFfYm9vdF9jZmdfcwljZmc7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19wcmVib290X3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXJzdmQ7CisJc3RydWN0IGJmYV9ib290X3BiY19zCWNmZzsKK307CisKK3N0cnVjdCBiZmFfYnNnX2V0aGJvb3RfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJcnN2ZDsKKwlzdHJ1Y3QgIGJmYV9ldGhib290X2NmZ19zICBjZmc7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ190cnVua19hdHRyX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXJzdmQ7CisJc3RydWN0IGJmYV90cnVua19hdHRyX3MgYXR0cjsKK307CisKK3N0cnVjdCBiZmFfYnNnX3Fvc19hdHRyX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXJzdmQ7CisJc3RydWN0IGJmYV9xb3NfYXR0cl9zCWF0dHI7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19xb3NfdmNfYXR0cl9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCXN0cnVjdCBiZmFfcW9zX3ZjX2F0dHJfcyBhdHRyOworfTsKKworc3RydWN0IGJmYV9ic2dfdmZfc3RhdHNfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJdmZfaWQ7CisJc3RydWN0IGJmYV92Zl9zdGF0c19zCXN0YXRzOworfTsKKworc3RydWN0IGJmYV9ic2dfdmZfcmVzZXRfc3RhdHNfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJdmZfaWQ7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9sdW5tYXNrX3F1ZXJ5X3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwlzdHJ1Y3QgYmZhX2x1bm1hc2tfY2ZnX3MgbHVuX21hc2s7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9sdW5tYXNrX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXZmX2lkOworCXd3bl90CQlwd3duOworCXd3bl90CQlycHd3bjsKKwlzdHJ1Y3Qgc2NzaV9sdW4JbHVuOworfTsKKwogc3RydWN0IGJmYV9ic2dfZmNwdF9zIHsKIAliZmFfc3RhdHVzX3QgICAgc3RhdHVzOwogCXUxNgkJdmZfaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfZHJ2LmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfZHJ2LmgKaW5kZXggNDg2NjFhMi4uYmRhOTk5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2Rydi5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9kcnYuaApAQCAtNTYsNyArNTYsNyBAQAogI2lmZGVmIEJGQV9EUklWRVJfVkVSU0lPTgogI2RlZmluZSBCRkFEX0RSSVZFUl9WRVJTSU9OICAgIEJGQV9EUklWRVJfVkVSU0lPTgogI2Vsc2UKLSNkZWZpbmUgQkZBRF9EUklWRVJfVkVSU0lPTiAgICAiMy4wLjIuMSIKKyNkZWZpbmUgQkZBRF9EUklWRVJfVkVSU0lPTiAgICAiMy4wLjIuMiIKICNlbmRpZgogCiAjZGVmaW5lIEJGQURfUFJPVE9fTkFNRSBGQ1BJX05BTUUKQEAgLTIyNCw2ICsyMjQsMTAgQEAKIAljaGFyICpyZWdkYXRhOwogCXUzMiByZWdsZW47CiAJc3RydWN0IGRlbnRyeSAqYmZhZF9kZW50cnlfZmlsZXNbNV07CisJc3RydWN0IGxpc3RfaGVhZAlmcmVlX2Flbl9xOworCXN0cnVjdCBsaXN0X2hlYWQJYWN0aXZlX2Flbl9xOworCXN0cnVjdCBiZmFfYWVuX2VudHJ5X3MJYWVuX2xpc3RbQkZBX0FFTl9NQVhfRU5UUlldOworCXNwaW5sb2NrX3QJCWJmYWRfYWVuX3NwaW5sb2NrOwogfTsKIAogLyogQkZBRCBzdGF0ZSBtYWNoaW5lIGV2ZW50cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW0uYwppbmRleCBmMmJmODEyLi4wMTMxMjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW0uYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW0uYwpAQCAtNjU2LDYgKzY1NiwzMSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOwogfQogCitzdGF0aWMgdm9pZCBiZmFkX2Flbl9pbV9ub3RpZnlfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGJmYWRfaW1fcyAqaW0gPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGJmYWRfaW1fcywgYWVuX2ltX25vdGlmeV93b3JrKTsKKwlzdHJ1Y3QgYmZhX2Flbl9lbnRyeV9zICphZW5fZW50cnk7CisJc3RydWN0IGJmYWRfcyAqYmZhZCA9IGltLT5iZmFkOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gYmZhZC0+cHBvcnQuaW1fcG9ydC0+c2hvc3Q7CisJdm9pZCAqZXZlbnRfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZiZmFkLT5hY3RpdmVfYWVuX3EpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2Flbl9zcGlubG9jaywgZmxhZ3MpOworCQliZmFfcV9kZXEoJmJmYWQtPmFjdGl2ZV9hZW5fcSwgJmFlbl9lbnRyeSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfYWVuX3NwaW5sb2NrLCBmbGFncyk7CisJCWV2ZW50X2RhdGEgPSAoY2hhciAqKWFlbl9lbnRyeSArIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKTsKKwkJZmNfaG9zdF9wb3N0X3ZlbmRvcl9ldmVudChzaG9zdCwgZmNfZ2V0X2V2ZW50X251bWJlcigpLAorCQkJCXNpemVvZihzdHJ1Y3QgYmZhX2Flbl9lbnRyeV9zKSAtCisJCQkJc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpLAorCQkJCShjaGFyICopZXZlbnRfZGF0YSwgQkZBRF9OTF9WRU5ET1JfSUQpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9hZW5fc3BpbmxvY2ssIGZsYWdzKTsKKwkJbGlzdF9hZGRfdGFpbCgmYWVuX2VudHJ5LT5xZSwgJmJmYWQtPmZyZWVfYWVuX3EpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2Flbl9zcGlubG9jaywgZmxhZ3MpOworCX0KK30KKwogYmZhX3N0YXR1c190CiBiZmFkX2ltX3Byb2JlKHN0cnVjdCBiZmFkX3MgKmJmYWQpCiB7CkBAIC02NzYsNiArNzAxLDcgQEAKIAkJcmMgPSBCRkFfU1RBVFVTX0ZBSUxFRDsKIAl9CiAKKwlJTklUX1dPUksoJmltLT5hZW5faW1fbm90aWZ5X3dvcmssIGJmYWRfYWVuX2ltX25vdGlmeV9oYW5kbGVyKTsKIGV4dDoKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW0uaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbS5oCmluZGV4IDRmZTM0ZDUuLjAwNGI2Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbS5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbS5oCkBAIC0xMTUsOCArMTE1LDMwIEBACiAJc3RydWN0IGJmYWRfcyAgICAgICAgICpiZmFkOwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpkcnZfd29ya3E7CiAJY2hhciAgICAgICAgICAgIGRydl93b3JrcV9uYW1lW0tPQkpfTkFNRV9MRU5dOworCXN0cnVjdCB3b3JrX3N0cnVjdAlhZW5faW1fbm90aWZ5X3dvcms7CiB9OwogCisjZGVmaW5lIGJmYWRfZ2V0X2Flbl9lbnRyeShfZHJ2LCBfZW50cnkpIGRvIHsJCQkJXAorCXVuc2lnbmVkIGxvbmcJX2ZsYWdzOwkJCQkJCVwKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKF9kcnYpLT5iZmFkX2Flbl9zcGlubG9jaywgX2ZsYWdzKTsJCVwKKwliZmFfcV9kZXEoJihfZHJ2KS0+ZnJlZV9hZW5fcSwgJihfZW50cnkpKTsJCQlcCisJaWYgKF9lbnRyeSkJCQkJCQkJXAorCQlsaXN0X2FkZF90YWlsKCYoX2VudHJ5KS0+cWUsICYoX2RydiktPmFjdGl2ZV9hZW5fcSk7CVwKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoX2RydiktPmJmYWRfYWVuX3NwaW5sb2NrLCBfZmxhZ3MpOwlcCit9IHdoaWxlICgwKQorCisvKiBwb3N0IGZjX2hvc3QgdmVuZG9yIGV2ZW50ICovCisjZGVmaW5lIGJmYWRfaW1fcG9zdF92ZW5kb3JfZXZlbnQoX2VudHJ5LCBfZHJ2LCBfY250LCBfY2F0LCBfZXZ0KSBkbyB7CSAgICAgIFwKKwlkb19nZXR0aW1lb2ZkYXkoJihfZW50cnkpLT5hZW5fdHYpOwkJCQkgICAgICBcCisJKF9lbnRyeSktPmJmYWRfbnVtID0gKF9kcnYpLT5pbnN0X25vOwkJCQkgICAgICBcCisJKF9lbnRyeSktPnNlcV9udW0gPSAoX2NudCk7CQkJCQkgICAgICBcCisJKF9lbnRyeSktPmFlbl9jYXRlZ29yeSA9IChfY2F0KTsJCQkJICAgICAgXAorCShfZW50cnkpLT5hZW5fdHlwZSA9IChfZXZ0KTsJCQkJCSAgICAgIFwKKwlpZiAoKF9kcnYpLT5iZmFkX2ZsYWdzICYgQkZBRF9GQzRfUFJPQkVfRE9ORSkJCQkgICAgICBcCisJCXF1ZXVlX3dvcmsoKF9kcnYpLT5pbS0+ZHJ2X3dvcmtxLAkJCSAgICAgIFwKKwkJCSAgICYoX2RydiktPmltLT5hZW5faW1fbm90aWZ5X3dvcmspOwkJICAgICAgXAorfSB3aGlsZSAoMCkKKwogc3RydWN0IFNjc2lfSG9zdCAqYmZhZF9zY3NpX2hvc3RfYWxsb2Moc3RydWN0IGJmYWRfaW1fcG9ydF9zICppbV9wb3J0LAogCQkJCXN0cnVjdCBiZmFkX3MgKik7CiBiZmFfc3RhdHVzX3QgYmZhZF90aHJlYWRfd29ya3Eoc3RydWN0IGJmYWRfcyAqYmZhZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmaS5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmkuaAppbmRleCAxZTI1OGQ1Li5iMmJhMGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmaS5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZpLmgKQEAgLTc4NCw2ICs3ODQsMTcgQEAKIH07CiAKIC8qCisgKglTRlAgc3RhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbgorICovCitzdHJ1Y3QgYmZpX3NmcF9zY25fcyB7CisJc3RydWN0IGJmaV9taGRyX3MgbWhyOwkvKiBob3N0IG1zZyBoZWFkZXIgICAgICAgICovCisJdTgJZXZlbnQ7CisJdTgJc2ZwaWQ7CisJdTgJcG9tbHZsOwkvKiBwb20gbGV2ZWw6IG5vcm1hbC93YXJuaW5nL2FsYXJtICovCisJdTgJaXNfZWxiOwkvKiBlLWxvb3BiYWNrICovCit9OworCisvKgogICoJU0ZQIHN0YXRlCiAgKi8KIGVudW0gYmZhX3NmcF9zdGF0X2UgewpAQCAtOTI2LDYgKzkzNywxNSBAQAogfTsKIAogLyoKKyAqIEZsYXNoIGV2ZW50IG5vdGlmaWNhdGlvbgorICovCitzdHJ1Y3QgYmZpX2ZsYXNoX2V2ZW50X3MgeworCXN0cnVjdCBiZmlfbWhkcl9zCW1oOwkvKiBDb21tb24gbXNnIGhlYWRlciAqLworCWJmYV9zdGF0dXNfdAkJc3RhdHVzOworCXUzMgkJCXBhcmFtOworfTsKKworLyoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICoJCQkJRElBRwogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmYy5oIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmMuaAppbmRleCBkOTI0MjM2Li40MjIyOGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjLmgKQEAgLTIsNyArMiw3IEBACiAjZGVmaW5lIF9CTlgyRkNfSF8KIC8qIGJueDJmYy5oOiBCcm9hZGNvbSBOZXRYdHJlbWUgSUkgTGludXggRkNvRSBvZmZsb2FkIGRyaXZlci4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggLSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggLSAyMDExIEJyb2FkY29tIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC02Miw3ICs2Miw3IEBACiAjaW5jbHVkZSAiYm54MmZjX2NvbnN0YW50cy5oIgogCiAjZGVmaW5lIEJOWDJGQ19OQU1FCQkiYm54MmZjIgotI2RlZmluZSBCTlgyRkNfVkVSU0lPTgkJIjEuMC4zIgorI2RlZmluZSBCTlgyRkNfVkVSU0lPTgkJIjEuMC40IgogCiAjZGVmaW5lIFBGWAkJCSJibngyZmM6ICIKIApAQCAtMTQxLDYgKzE0MSwxMCBAQAogCiAjZGVmaW5lIEJOWDJGQ19STklEX0hCQQkJCTB4NwogCisjZGVmaW5lIFNSUl9SRVRSWV9DT1VOVAkJCTUKKyNkZWZpbmUgUkVDX1JFVFJZX0NPVU5UCQkJMQorI2RlZmluZSBCTlgyRkNfTlVNX0VSUl9CSVRTCQk2MworCiAvKiBibngyZmMgZHJpdmVyIHVzZXMgb25seSBvbmUgaW5zdGFuY2Ugb2YgZmNvZV9wZXJjcHVfcyAqLwogZXh0ZXJuIHN0cnVjdCBmY29lX3BlcmNwdV9zIGJueDJmY19nbG9iYWw7CiAKQEAgLTE1MywxOCArMTU3LDEzIEBACiB9OwogCiBzdHJ1Y3QgYm54MmZjX2hiYSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaW5rOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgY25pY19kZXYgKmNuaWM7CiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpwaHlzX2RldjsKIAl1bnNpZ25lZCBsb25nIHJlZ193aXRoX2NuaWM7CiAJCSNkZWZpbmUgQk5YMkZDX0NOSUNfUkVHSVNURVJFRCAgICAgICAgICAgMQotCXN0cnVjdCBwYWNrZXRfdHlwZSBmY29lX3BhY2tldF90eXBlOwotCXN0cnVjdCBwYWNrZXRfdHlwZSBmaXBfcGFja2V0X3R5cGU7CiAJc3RydWN0IGJueDJmY19jbWRfbWdyICpjbWRfbWdyOwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp0aW1lcl93b3JrX3F1ZXVlOwotCXN0cnVjdCBrcmVmIGtyZWY7CiAJc3BpbmxvY2tfdCBoYmFfbG9jazsKIAlzdHJ1Y3QgbXV0ZXggaGJhX211dGV4OwogCXVuc2lnbmVkIGxvbmcgYWRhcHRlcl9zdGF0ZTsKQEAgLTE3MiwxNSArMTcxLDkgQEAKIAkJI2RlZmluZSBBREFQVEVSX1NUQVRFX0dPSU5HX0RPV04JMQogCQkjZGVmaW5lIEFEQVBURVJfU1RBVEVfTElOS19ET1dOCQkyCiAJCSNkZWZpbmUgQURBUFRFUl9TVEFURV9SRUFEWQkJMwotCXUzMiBmbGFnczsKLQl1bnNpZ25lZCBsb25nIGluaXRfZG9uZTsKLQkJI2RlZmluZSBCTlgyRkNfRldfSU5JVF9ET05FCQkwCi0JCSNkZWZpbmUgQk5YMkZDX0NUTFJfSU5JVF9ET05FCQkxCi0JCSNkZWZpbmUgQk5YMkZDX0NSRUFURV9ET05FCQkyCi0Jc3RydWN0IGZjb2VfY3RsciBjdGxyOwotCXN0cnVjdCBsaXN0X2hlYWQgdnBvcnRzOwotCXU4IHZsYW5fZW5hYmxlZDsKLQlpbnQgdmxhbl9pZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkjZGVmaW5lIEJOWDJGQ19GTEFHX0ZXX0lOSVRfRE9ORQkwCisJCSNkZWZpbmUgQk5YMkZDX0ZMQUdfREVTVFJPWV9DTVBMCTEKIAl1MzIgbmV4dF9jb25uX2lkOwogCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICoqdGFza19jdHg7CiAJZG1hX2FkZHJfdCAqdGFza19jdHhfZG1hOwpAQCAtMTk5LDM4ICsxOTIsNDEgQEAKIAljaGFyICpkdW1teV9idWZmZXI7CiAJZG1hX2FkZHJfdCBkdW1teV9idWZfZG1hOwogCisJLyogQWN0aXZlIGxpc3Qgb2Ygb2ZmbG9hZGVkIHNlc3Npb25zICovCisJc3RydWN0IGJueDJmY19ycG9ydCAqKnRndF9vZmxkX2xpc3Q7CisKKwkvKiBzdGF0aXN0aWNzICovCiAJc3RydWN0IGZjb2Vfc3RhdGlzdGljc19wYXJhbXMgKnN0YXRzX2J1ZmZlcjsKIAlkbWFfYWRkcl90IHN0YXRzX2J1Zl9kbWE7Ci0KLQkvKgotCSAqIFBDSSByZWxhdGVkIGluZm8uCi0JICovCi0JdTE2IHBjaV9kaWQ7Ci0JdTE2IHBjaV92aWQ7Ci0JdTE2IHBjaV9zZGlkOwotCXUxNiBwY2lfc3ZpZDsKLQl1MTYgcGNpX2Z1bmM7Ci0JdTE2IHBjaV9kZXZubzsKLQotCXN0cnVjdCB0YXNrX3N0cnVjdCAqbDJfdGhyZWFkOwotCi0JLyogbGlua2Rvd24gaGFuZGxpbmcgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBzaHV0ZG93bl93YWl0OwotCWludCB3YWl0X2Zvcl9saW5rX2Rvd247CisJc3RydWN0IGNvbXBsZXRpb24gc3RhdF9yZXFfZG9uZTsKIAogCS8qZGVzdHJveSBoYW5kbGluZyAqLwogCXN0cnVjdCB0aW1lcl9saXN0IGRlc3Ryb3lfdGltZXI7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgZGVzdHJveV93YWl0OwogCi0JLyogQWN0aXZlIGxpc3Qgb2Ygb2ZmbG9hZGVkIHNlc3Npb25zICovCi0Jc3RydWN0IGJueDJmY19ycG9ydCAqdGd0X29mbGRfbGlzdFtCTlgyRkNfTlVNX01BWF9TRVNTXTsKKwkvKiBsaW5rZG93biBoYW5kbGluZyAqLworCXdhaXRfcXVldWVfaGVhZF90IHNodXRkb3duX3dhaXQ7CisJaW50IHdhaXRfZm9yX2xpbmtfZG93bjsKIAlpbnQgbnVtX29mbGRfc2VzczsKLQotCS8qIHN0YXRpc3RpY3MgKi8KLQlzdHJ1Y3QgY29tcGxldGlvbiBzdGF0X3JlcV9kb25lOworCXN0cnVjdCBsaXN0X2hlYWQgdnBvcnRzOwogfTsKIAotI2RlZmluZSBibngyZmNfZnJvbV9jdGxyKGZpcCkgY29udGFpbmVyX29mKGZpcCwgc3RydWN0IGJueDJmY19oYmEsIGN0bHIpCitzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVuc2lnbmVkIGxvbmcgaWZfZmxhZ3M7CisJCSNkZWZpbmUgQk5YMkZDX0NUTFJfSU5JVF9ET05FCQkwCisJc3RydWN0IGJueDJmY19oYmEgKmhiYTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBwYWNrZXRfdHlwZSBmY29lX3BhY2tldF90eXBlOworCXN0cnVjdCBwYWNrZXRfdHlwZSBmaXBfcGFja2V0X3R5cGU7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnRpbWVyX3dvcmtfcXVldWU7CisJc3RydWN0IGtyZWYga3JlZjsKKwlzdHJ1Y3QgZmNvZV9jdGxyIGN0bHI7CisJdTggdmxhbl9lbmFibGVkOworCWludCB2bGFuX2lkOworfTsKKworI2RlZmluZSBibngyZmNfZnJvbV9jdGxyKGZpcCkgY29udGFpbmVyX29mKGZpcCwgc3RydWN0IGJueDJmY19pbnRlcmZhY2UsIGN0bHIpCiAKIHN0cnVjdCBibngyZmNfbHBvcnQgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKQEAgLTI1Miw5ICsyNDgsMTEgQEAKIAlzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqcmRhdGE7CiAJdm9pZCBfX2lvbWVtICpjdHhfYmFzZTsKICNkZWZpbmUgRFBNX1RSSUdFUl9UWVBFCQkweDQwCisJdTMyIGlvX3RpbWVvdXQ7CiAJdTMyIGZjb2VfY29ubl9pZDsKIAl1MzIgY29udGV4dF9pZDsKIAl1MzIgc2lkOworCWludCBkZXZfdHlwZTsKIAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAjZGVmaW5lIEJOWDJGQ19GTEFHX1NFU1NJT05fUkVBRFkJMHgxCkBAIC0yNjIsMTAgKzI2MCw5IEBACiAjZGVmaW5lIEJOWDJGQ19GTEFHX0RJU0FCTEVECQkweDMKICNkZWZpbmUgQk5YMkZDX0ZMQUdfREVTVFJPWUVECQkweDQKICNkZWZpbmUgQk5YMkZDX0ZMQUdfT0ZMRF9SRVFfQ01QTAkweDUKLSNkZWZpbmUgQk5YMkZDX0ZMQUdfREVTVFJPWV9DTVBMCTB4NgotI2RlZmluZSBCTlgyRkNfRkxBR19DVFhfQUxMT0NfRkFJTFVSRQkweDcKLSNkZWZpbmUgQk5YMkZDX0ZMQUdfVVBMRF9SRVFfQ09NUEwJMHg4Ci0jZGVmaW5lIEJOWDJGQ19GTEFHX0VYUExfTE9HTwkJMHg5CisjZGVmaW5lIEJOWDJGQ19GTEFHX0NUWF9BTExPQ19GQUlMVVJFCTB4NgorI2RlZmluZSBCTlgyRkNfRkxBR19VUExEX1JFUV9DT01QTAkweDcKKyNkZWZpbmUgQk5YMkZDX0ZMQUdfRVhQTF9MT0dPCQkweDgKIAogCXU4IHNyY19hZGRyW0VUSF9BTEVOXTsKIAl1MzIgbWF4X3NxZXM7CkBAIC0zMjcsMTIgKzMyNCw5IEBACiAJc3BpbmxvY2tfdCBjcV9sb2NrOwogCWF0b21pY190IG51bV9hY3RpdmVfaW9zOwogCXUzMiBmbHVzaF9pbl9wcm9nOwotCXVuc2lnbmVkIGxvbmcgd29ya190aW1lX3NsaWNlOwogCXVuc2lnbmVkIGxvbmcgdGltZXN0YW1wOwogCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV90YXNrX2xpc3Q7CiAJc3RydWN0IGJueDJmY19jbWQgKnBlbmRpbmdfcXVldWVbQk5YMkZDX1NRX1dRRVNfTUFYKzFdOwotCWF0b21pY190IHBpOwotCWF0b21pY190IGNpOwogCXN0cnVjdCBsaXN0X2hlYWQgYWN0aXZlX2NtZF9xdWV1ZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGVsc19xdWV1ZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGlvX3JldGlyZV9xdWV1ZTsKQEAgLTM2Nyw2ICszNjEsOCBAQAogCXN0cnVjdCBibngyZmNfY21kICphYm9ydGVkX2lvX3JlcTsKIAlzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxOwogCXUxNiBsMl9veGlkOworCXUzMiBvZmZzZXQ7CisJZW51bSBmY19yY3RsIHJfY3RsOwogfTsKIAogLyogYm54MmZjIGNvbW1hbmQgc3RydWN0dXJlICovCkBAIC0zODAsNiArMzc2LDcgQEAKICNkZWZpbmUgQk5YMkZDX0FCVFMJCQkzCiAjZGVmaW5lIEJOWDJGQ19FTFMJCQk0CiAjZGVmaW5lIEJOWDJGQ19DTEVBTlVQCQkJNQorI2RlZmluZSBCTlgyRkNfU0VRX0NMRUFOVVAJCTYKIAl1OCBpb19yZXFfZmxhZ3M7CiAJc3RydWN0IGtyZWYgcmVmY291bnQ7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydDsKQEAgLTM5Myw2ICszOTAsNyBAQAogCXN0cnVjdCBjb21wbGV0aW9uIHRtX2RvbmU7CiAJaW50IHdhaXRfZm9yX2NvbXA7CiAJdTE2IHhpZDsKKwlzdHJ1Y3QgZmNvZV9lcnJfcmVwb3J0X2VudHJ5IGVycl9lbnRyeTsKIAlzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqdGFzazsKIAlzdHJ1Y3QgaW9fYmR0ICpiZF90Ymw7CiAJc3RydWN0IGZjcF9yc3AgKnJzcDsKQEAgLTQwOSw2ICs0MDcsMTIgQEAKICNkZWZpbmUgQk5YMkZDX0ZMQUdfSU9fQ09NUEwJCTB4OQogI2RlZmluZSBCTlgyRkNfRkxBR19FTFNfRE9ORQkJMHhhCiAjZGVmaW5lIEJOWDJGQ19GTEFHX0VMU19USU1FT1VUCQkweGIKKyNkZWZpbmUgQk5YMkZDX0ZMQUdfQ01EX0xPU1QJCTB4YworI2RlZmluZSBCTlgyRkNfRkxBR19TUlJfU0VOVAkJMHhkCisJdTggcmVjX3JldHJ5OworCXU4IHNycl9yZXRyeTsKKwl1MzIgc3JyX29mZnNldDsKKwl1OCBzcnJfcmN0bDsKIAl1MzIgZmNwX3Jlc2lkOwogCXUzMiBmY3BfcnNwX2xlbjsKIAl1MzIgZmNwX3Nuc19sZW47CkBAIC00MzksNiArNDQzLDcgQEAKIAogCiAKK3N0cnVjdCBibngyZmNfY21kICpibngyZmNfY21kX2FsbG9jKHN0cnVjdCBibngyZmNfcnBvcnQgKnRndCk7CiBzdHJ1Y3QgYm54MmZjX2NtZCAqYm54MmZjX2Vsc3RtX2FsbG9jKHN0cnVjdCBibngyZmNfcnBvcnQgKnRndCwgaW50IHR5cGUpOwogdm9pZCBibngyZmNfY21kX3JlbGVhc2Uoc3RydWN0IGtyZWYgKnJlZik7CiBpbnQgYm54MmZjX3F1ZXVlY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY19jbWQpOwpAQCAtNDc2LDYgKzQ4MSwxMCBAQAogdm9pZCBibngyZmNfaW5pdF9jbGVhbnVwX3Rhc2soc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSwKIAkJCSAgICAgIHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICp0YXNrLAogCQkJICAgICAgdTE2IG9yaWdfeGlkKTsKK3ZvaWQgYm54MmZjX2luaXRfc2VxX2NsZWFudXBfdGFzayhzdHJ1Y3QgYm54MmZjX2NtZCAqc2VxX2NsbnVwX3JlcSwKKwkJCQkgIHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICp0YXNrLAorCQkJCSAgc3RydWN0IGJueDJmY19jbWQgKm9yaWdfaW9fcmVxLAorCQkJCSAgdTMyIG9mZnNldCk7CiB2b2lkIGJueDJmY19pbml0X21wX3Rhc2soc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSwKIAkJCSBzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqdGFzayk7CiB2b2lkIGJueDJmY19pbml0X3Rhc2soc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSwKQEAgLTUyNSw1ICs1MzQsMTMgQEAKIAkJCQkgICB1bnNpZ25lZCBjaGFyICpidWYsCiAJCQkJICAgdTMyIGZyYW1lX2xlbiwgdTE2IGwyX294aWQpOwogaW50IGJueDJmY19zZW5kX3N0YXRfcmVxKHN0cnVjdCBibngyZmNfaGJhICpoYmEpOworaW50IGJueDJmY19wb3N0X2lvX3JlcShzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QsIHN0cnVjdCBibngyZmNfY21kICppb19yZXEpOworaW50IGJueDJmY19zZW5kX3JlYyhzdHJ1Y3QgYm54MmZjX2NtZCAqb3JpZ19pb19yZXEpOworaW50IGJueDJmY19zZW5kX3NycihzdHJ1Y3QgYm54MmZjX2NtZCAqb3JpZ19pb19yZXEsIHUzMiBvZmZzZXQsIHU4IHJfY3RsKTsKK3ZvaWQgYm54MmZjX3Byb2Nlc3Nfc2VxX2NsZWFudXBfY29tcGwoc3RydWN0IGJueDJmY19jbWQgKnNlcV9jbG51cF9yZXEsCisJCQkJICAgICAgc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKnRhc2ssCisJCQkJICAgICAgdTggcnhfc3RhdGUpOworaW50IGJueDJmY19pbml0aWF0ZV9zZXFfY2xlYW51cChzdHJ1Y3QgYm54MmZjX2NtZCAqb3JpZ19pb19yZXEsIHUzMiBvZmZzZXQsCisJCQkJZW51bSBmY19yY3RsIHJfY3RsKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19kZWJ1Zy5oIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZGVidWcuaAppbmRleCA3ZjZhZmY2Li4zNDE2ZDlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2RlYnVnLmgKQEAgLTIxLDIxICsyMSwyMSBAQAogCiAjZGVmaW5lIEJOWDJGQ19FTFNfREJHKGZtdCwgYXJnLi4uKQkJCQkJXAogCUJOWDJGQ19DSEtfTE9HR0lORyhMT0dfRUxTLAkJCQkJXAotCQkJICAgcHJpbnRrKEtFUk5fQUxFUlQgUEZYIGZtdCwgIyNhcmcpKQorCQkJICAgcHJpbnRrKEtFUk5fSU5GTyBQRlggZm10LCAjI2FyZykpCiAKICNkZWZpbmUgQk5YMkZDX01JU0NfREJHKGZtdCwgYXJnLi4uKQkJCQkJXAogCUJOWDJGQ19DSEtfTE9HR0lORyhMT0dfTUlTQywJCQkJCVwKLQkJCSAgIHByaW50ayhLRVJOX0FMRVJUIFBGWCBmbXQsICMjYXJnKSkKKwkJCSAgIHByaW50ayhLRVJOX0lORk8gUEZYIGZtdCwgIyNhcmcpKQogCiAjZGVmaW5lIEJOWDJGQ19JT19EQkcoaW9fcmVxLCBmbXQsIGFyZy4uLikJCQkJXAogCWRvIHsJCQkJCQkJCVwKIAkJaWYgKCFpb19yZXEgfHwgIWlvX3JlcS0+cG9ydCB8fCAhaW9fcmVxLT5wb3J0LT5scG9ydCB8fAlcCiAJCSAgICAhaW9fcmVxLT5wb3J0LT5scG9ydC0+aG9zdCkJCQkJXAogCQkJQk5YMkZDX0NIS19MT0dHSU5HKExPR19JTywJCQlcCi0JCQkgICBwcmludGsoS0VSTl9BTEVSVCBQRlggIk5VTEwgIiBmbXQsICMjYXJnKSk7CVwKKwkJCSAgIHByaW50ayhLRVJOX0lORk8gUEZYICJOVUxMICIgZm10LCAjI2FyZykpOwlcCiAJCWVsc2UJCQkJCQkJXAogCQkJQk5YMkZDX0NIS19MT0dHSU5HKExPR19JTywJCQlcCi0JCQkgICBzaG9zdF9wcmludGsoS0VSTl9BTEVSVCwJCQlcCisJCQkgICBzaG9zdF9wcmludGsoS0VSTl9JTkZPLAkJCVwKIAkJCQkgICAoaW9fcmVxKS0+cG9ydC0+bHBvcnQtPmhvc3QsCQlcCiAJCQkJICAgUEZYICJ4aWQ6MHgleCAiIGZtdCwJCQlcCiAJCQkJICAgKGlvX3JlcSktPnhpZCwgIyNhcmcpKTsJCVwKQEAgLTQ2LDEwICs0NiwxMCBAQAogCQlpZiAoIXRndCB8fCAhdGd0LT5wb3J0IHx8ICF0Z3QtPnBvcnQtPmxwb3J0IHx8CQlcCiAJCSAgICAhdGd0LT5wb3J0LT5scG9ydC0+aG9zdCB8fCAhdGd0LT5ycG9ydCkJCVwKIAkJCUJOWDJGQ19DSEtfTE9HR0lORyhMT0dfVEdULAkJCVwKLQkJCSAgIHByaW50ayhLRVJOX0FMRVJUIFBGWCAiTlVMTCAiIGZtdCwgIyNhcmcpKTsJXAorCQkJICAgcHJpbnRrKEtFUk5fSU5GTyBQRlggIk5VTEwgIiBmbXQsICMjYXJnKSk7CVwKIAkJZWxzZQkJCQkJCQlcCiAJCQlCTlgyRkNfQ0hLX0xPR0dJTkcoTE9HX1RHVCwJCQlcCi0JCQkgICBzaG9zdF9wcmludGsoS0VSTl9BTEVSVCwJCQlcCisJCQkgICBzaG9zdF9wcmludGsoS0VSTl9JTkZPLAkJCVwKIAkJCQkgICAodGd0KS0+cG9ydC0+bHBvcnQtPmhvc3QsCQlcCiAJCQkJICAgUEZYICJwb3J0OiV4ICIgZm10LAkJCVwKIAkJCQkgICAodGd0KS0+cnBvcnQtPnBvcnRfaWQsICMjYXJnKSk7CVwKQEAgLTYwLDEwICs2MCwxMCBAQAogCWRvIHsJCQkJCQkJCVwKIAkJaWYgKCFscG9ydCB8fCAhbHBvcnQtPmhvc3QpCQkJCVwKIAkJCUJOWDJGQ19DSEtfTE9HR0lORyhMT0dfSEJBLAkJCVwKLQkJCSAgIHByaW50ayhLRVJOX0FMRVJUIFBGWCAiTlVMTCAiIGZtdCwgIyNhcmcpKTsJXAorCQkJICAgcHJpbnRrKEtFUk5fSU5GTyBQRlggIk5VTEwgIiBmbXQsICMjYXJnKSk7CVwKIAkJZWxzZQkJCQkJCQlcCiAJCQlCTlgyRkNfQ0hLX0xPR0dJTkcoTE9HX0hCQSwJCQlcCi0JCQkgICBzaG9zdF9wcmludGsoS0VSTl9BTEVSVCwgbHBvcnQtPmhvc3QsCVwKKwkJCSAgIHNob3N0X3ByaW50ayhLRVJOX0lORk8sIGxwb3J0LT5ob3N0LAlcCiAJCQkJICAgUEZYIGZtdCwgIyNhcmcpKTsJCQlcCiAJfSB3aGlsZSAoMCkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZWxzLmMgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19lbHMuYwppbmRleCA3ZTg5MTQzLi5kNjZkY2JkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19lbHMuYworKysgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19lbHMuYwpAQCAtMyw3ICszLDcgQEAKICAqIFRoaXMgZmlsZSBjb250YWlucyBoZWxwZXIgcm91dGluZXMgdGhhdCBoYW5kbGUgRUxTIHJlcXVlc3RzCiAgKiBhbmQgcmVzcG9uc2VzLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCAtIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwOCAtIDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTI1MywxMyArMjUzLDQxNyBAQAogCXJldHVybiByYzsKIH0KIAordm9pZCBibngyZmNfc3JyX2NvbXBsKHN0cnVjdCBibngyZmNfZWxzX2NiX2FyZyAqY2JfYXJnKQoreworCXN0cnVjdCBibngyZmNfbXBfcmVxICptcF9yZXE7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmNfaGRyLCAqZmg7CisJc3RydWN0IGJueDJmY19jbWQgKnNycl9yZXE7CisJc3RydWN0IGJueDJmY19jbWQgKm9yaWdfaW9fcmVxOworCXN0cnVjdCBmY19mcmFtZSAqZnA7CisJdW5zaWduZWQgY2hhciAqYnVmOworCXZvaWQgKnJlc3BfYnVmOworCXUzMiByZXNwX2xlbiwgaGRyX2xlbjsKKwl1OCBvcGNvZGU7CisJaW50IHJjID0gMDsKKworCW9yaWdfaW9fcmVxID0gY2JfYXJnLT5hYm9ydGVkX2lvX3JlcTsKKwlzcnJfcmVxID0gY2JfYXJnLT5pb19yZXE7CisJaWYgKHRlc3RfYml0KEJOWDJGQ19GTEFHX0lPX0NPTVBMLCAmb3JpZ19pb19yZXEtPnJlcV9mbGFncykpIHsKKwkJQk5YMkZDX0lPX0RCRyhzcnJfcmVxLCAic3JyX2NvbXBsOiB4aWQgLSAweCV4IGNvbXBsZXRlZCIsCisJCQlvcmlnX2lvX3JlcS0+eGlkKTsKKwkJZ290byBzcnJfY29tcGxfZG9uZTsKKwl9CisJaWYgKHRlc3RfYml0KEJOWDJGQ19GTEFHX0lTU1VFX0FCVFMsICZvcmlnX2lvX3JlcS0+cmVxX2ZsYWdzKSkgeworCQlCTlgyRkNfSU9fREJHKHNycl9yZXEsICJyZWMgYWJ0cyBpbiBwcm9nICIKKwkJICAgICAgICJvcmlnX2lvIC0gMHgleFxuIiwKKwkJCW9yaWdfaW9fcmVxLT54aWQpOworCQlnb3RvIHNycl9jb21wbF9kb25lOworCX0KKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJOWDJGQ19GTEFHX0VMU19USU1FT1VULCAmc3JyX3JlcS0+cmVxX2ZsYWdzKSkgeworCQkvKiBTUlIgdGltZWRvdXQgKi8KKwkJQk5YMkZDX0lPX0RCRyhzcnJfcmVxLCAic3JyIHRpbWVkIG91dCwgYWJvcnQgIgorCQkgICAgICAgIm9yaWdfaW8gLSAweCV4XG4iLAorCQkJb3JpZ19pb19yZXEtPnhpZCk7CisJCXJjID0gYm54MmZjX2luaXRpYXRlX2FidHMoc3JyX3JlcSk7CisJCWlmIChyYyAhPSBTVUNDRVNTKSB7CisJCQlCTlgyRkNfSU9fREJHKHNycl9yZXEsICJzcnJfY29tcGw6IGluaXRpYXRlX2FidHMgIgorCQkJCSJmYWlsZWQuIGlzc3VlIGNsZWFudXBcbiIpOworCQkJYm54MmZjX2luaXRpYXRlX2NsZWFudXAoc3JyX3JlcSk7CisJCX0KKwkJb3JpZ19pb19yZXEtPnNycl9yZXRyeSsrOworCQlpZiAob3JpZ19pb19yZXEtPnNycl9yZXRyeSA8PSBTUlJfUkVUUllfQ09VTlQpIHsKKwkJCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndCA9IG9yaWdfaW9fcmVxLT50Z3Q7CisJCQlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CisJCQlyYyA9IGJueDJmY19zZW5kX3NycihvcmlnX2lvX3JlcSwKKwkJCQkJICAgICBvcmlnX2lvX3JlcS0+c3JyX29mZnNldCwKKwkJCQkJICAgICBvcmlnX2lvX3JlcS0+c3JyX3JjdGwpOworCQkJc3Bpbl9sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKKwkJCWlmICghcmMpCisJCQkJZ290byBzcnJfY29tcGxfZG9uZTsKKwkJfQorCisJCXJjID0gYm54MmZjX2luaXRpYXRlX2FidHMob3JpZ19pb19yZXEpOworCQlpZiAocmMgIT0gU1VDQ0VTUykgeworCQkJQk5YMkZDX0lPX0RCRyhzcnJfcmVxLCAic3JyX2NvbXBsOiBpbml0aWF0ZV9hYnRzICIKKwkJCQkiZmFpbGVkIHhpZCA9IDB4JXguIGlzc3VlIGNsZWFudXBcbiIsCisJCQkJb3JpZ19pb19yZXEtPnhpZCk7CisJCQlibngyZmNfaW5pdGlhdGVfY2xlYW51cChvcmlnX2lvX3JlcSk7CisJCX0KKwkJZ290byBzcnJfY29tcGxfZG9uZTsKKwl9CisJbXBfcmVxID0gJihzcnJfcmVxLT5tcF9yZXEpOworCWZjX2hkciA9ICYobXBfcmVxLT5yZXNwX2ZjX2hkcik7CisJcmVzcF9sZW4gPSBtcF9yZXEtPnJlc3BfbGVuOworCXJlc3BfYnVmID0gbXBfcmVxLT5yZXNwX2J1ZjsKKworCWhkcl9sZW4gPSBzaXplb2YoKmZjX2hkcik7CisJYnVmID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9BVE9NSUMpOworCWlmICghYnVmKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInNyciBidWY6IG1lbSBhbGxvYyBmYWlsdXJlXG4iKTsKKwkJZ290byBzcnJfY29tcGxfZG9uZTsKKwl9CisJbWVtY3B5KGJ1ZiwgZmNfaGRyLCBoZHJfbGVuKTsKKwltZW1jcHkoYnVmICsgaGRyX2xlbiwgcmVzcF9idWYsIHJlc3BfbGVuKTsKKworCWZwID0gZmNfZnJhbWVfYWxsb2MoTlVMTCwgcmVzcF9sZW4pOworCWlmICghZnApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmNfZnJhbWVfYWxsb2MgZmFpbHVyZVxuIik7CisJCWdvdG8gZnJlZV9idWY7CisJfQorCisJZmggPSAoc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqKSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwkvKiBDb3B5IEZDIEZyYW1lIGhlYWRlciBhbmQgcGF5bG9hZCBpbnRvIHRoZSBmcmFtZSAqLworCW1lbWNweShmaCwgYnVmLCBoZHJfbGVuICsgcmVzcF9sZW4pOworCisJb3Bjb2RlID0gZmNfZnJhbWVfcGF5bG9hZF9vcChmcCk7CisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIEVMU19MU19BQ0M6CisJCUJOWDJGQ19JT19EQkcoc3JyX3JlcSwgIlNSUiBzdWNjZXNzXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBFTFNfTFNfUkpUOgorCQlCTlgyRkNfSU9fREJHKHNycl9yZXEsICJTUlIgcmVqZWN0ZWRcbiIpOworCQlyYyA9IGJueDJmY19pbml0aWF0ZV9hYnRzKG9yaWdfaW9fcmVxKTsKKwkJaWYgKHJjICE9IFNVQ0NFU1MpIHsKKwkJCUJOWDJGQ19JT19EQkcoc3JyX3JlcSwgInNycl9jb21wbDogaW5pdGlhdGVfYWJ0cyAiCisJCQkJImZhaWxlZCB4aWQgPSAweCV4LiBpc3N1ZSBjbGVhbnVwXG4iLAorCQkJCW9yaWdfaW9fcmVxLT54aWQpOworCQkJYm54MmZjX2luaXRpYXRlX2NsZWFudXAob3JpZ19pb19yZXEpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJOWDJGQ19JT19EQkcoc3JyX3JlcSwgInNyciBjb21wbCAtIGludmFsaWQgb3Bjb2RlID0gJWRcbiIsCisJCQlvcGNvZGUpOworCQlicmVhazsKKwl9CisJZmNfZnJhbWVfZnJlZShmcCk7CitmcmVlX2J1ZjoKKwlrZnJlZShidWYpOworc3JyX2NvbXBsX2RvbmU6CisJa3JlZl9wdXQoJm9yaWdfaW9fcmVxLT5yZWZjb3VudCwgYm54MmZjX2NtZF9yZWxlYXNlKTsKK30KKwordm9pZCBibngyZmNfcmVjX2NvbXBsKHN0cnVjdCBibngyZmNfZWxzX2NiX2FyZyAqY2JfYXJnKQoreworCXN0cnVjdCBibngyZmNfY21kICpvcmlnX2lvX3JlcSwgKm5ld19pb19yZXE7CisJc3RydWN0IGJueDJmY19jbWQgKnJlY19yZXE7CisJc3RydWN0IGJueDJmY19tcF9yZXEgKm1wX3JlcTsKKwlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmY19oZHIsICpmaDsKKwlzdHJ1Y3QgZmNfZWxzX2xzX3JqdCAqcmp0OworCXN0cnVjdCBmY19lbHNfcmVjX2FjYyAqYWNjOworCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndDsKKwlzdHJ1Y3QgZmNvZV9lcnJfcmVwb3J0X2VudHJ5ICplcnJfZW50cnk7CisJc3RydWN0IHNjc2lfY21uZCAqc2NfY21kOworCWVudW0gZmNfcmN0bCByX2N0bDsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdm9pZCAqcmVzcF9idWY7CisJc3RydWN0IGZjX2ZyYW1lICpmcDsKKwl1OCBvcGNvZGU7CisJdTMyIG9mZnNldDsKKwl1MzIgZV9zdGF0OworCXUzMiByZXNwX2xlbiwgaGRyX2xlbjsKKwlpbnQgcmMgPSAwOworCWJvb2wgc2VuZF9zZXFfY2xucCA9IGZhbHNlOworCWJvb2wgYWJvcnRfaW8gPSBmYWxzZTsKKworCUJOWDJGQ19NSVNDX0RCRygiRW50ZXJlZCByZWNfY29tcGwgY2FsbGJhY2tcbiIpOworCXJlY19yZXEgPSBjYl9hcmctPmlvX3JlcTsKKwlvcmlnX2lvX3JlcSA9IGNiX2FyZy0+YWJvcnRlZF9pb19yZXE7CisJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAicmVjX2NvbXBsOiBvcmlnIHhpZCA9IDB4JXgiLCBvcmlnX2lvX3JlcS0+eGlkKTsKKwl0Z3QgPSBvcmlnX2lvX3JlcS0+dGd0OworCisJaWYgKHRlc3RfYml0KEJOWDJGQ19GTEFHX0lPX0NPTVBMLCAmb3JpZ19pb19yZXEtPnJlcV9mbGFncykpIHsKKwkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAiY29tcGxldGVkIgorCQkgICAgICAgIm9yaWdfaW8gLSAweCV4XG4iLAorCQkJb3JpZ19pb19yZXEtPnhpZCk7CisJCWdvdG8gcmVjX2NvbXBsX2RvbmU7CisJfQorCWlmICh0ZXN0X2JpdChCTlgyRkNfRkxBR19JU1NVRV9BQlRTLCAmb3JpZ19pb19yZXEtPnJlcV9mbGFncykpIHsKKwkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAiYWJ0cyBpbiBwcm9nICIKKwkJICAgICAgICJvcmlnX2lvIC0gMHgleFxuIiwKKwkJCW9yaWdfaW9fcmVxLT54aWQpOworCQlnb3RvIHJlY19jb21wbF9kb25lOworCX0KKwkvKiBIYW5kbGUgUkVDIHRpbWVvdXQgY2FzZSAqLworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQk5YMkZDX0ZMQUdfRUxTX1RJTUVPVVQsICZyZWNfcmVxLT5yZXFfZmxhZ3MpKSB7CisJCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgInRpbWVkIG91dCwgYWJvcnQgIgorCQkgICAgICAgIm9yaWdfaW8gLSAweCV4XG4iLAorCQkJb3JpZ19pb19yZXEtPnhpZCk7CisJCS8qIGVscyByZXEgaXMgdGltZWQgb3V0LiBzZW5kIGFidHMgZm9yIGVscyAqLworCQlyYyA9IGJueDJmY19pbml0aWF0ZV9hYnRzKHJlY19yZXEpOworCQlpZiAocmMgIT0gU1VDQ0VTUykgeworCQkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAicmVjX2NvbXBsOiBpbml0aWF0ZV9hYnRzICIKKwkJCQkiZmFpbGVkLiBpc3N1ZSBjbGVhbnVwXG4iKTsKKwkJCWJueDJmY19pbml0aWF0ZV9jbGVhbnVwKHJlY19yZXEpOworCQl9CisJCW9yaWdfaW9fcmVxLT5yZWNfcmV0cnkrKzsKKwkJLyogUkVDIHRpbWVkb3V0LiBzZW5kIEFCVFMgdG8gdGhlIG9yaWcgSU8gcmVxICovCisJCWlmIChvcmlnX2lvX3JlcS0+cmVjX3JldHJ5IDw9IFJFQ19SRVRSWV9DT1VOVCkgeworCQkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOworCQkJcmMgPSBibngyZmNfc2VuZF9yZWMob3JpZ19pb19yZXEpOworCQkJc3Bpbl9sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKKwkJCWlmICghcmMpCisJCQkJZ290byByZWNfY29tcGxfZG9uZTsKKwkJfQorCQlyYyA9IGJueDJmY19pbml0aWF0ZV9hYnRzKG9yaWdfaW9fcmVxKTsKKwkJaWYgKHJjICE9IFNVQ0NFU1MpIHsKKwkJCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgInJlY19jb21wbDogaW5pdGlhdGVfYWJ0cyAiCisJCQkJImZhaWxlZCB4aWQgPSAweCV4LiBpc3N1ZSBjbGVhbnVwXG4iLAorCQkJCW9yaWdfaW9fcmVxLT54aWQpOworCQkJYm54MmZjX2luaXRpYXRlX2NsZWFudXAob3JpZ19pb19yZXEpOworCQl9CisJCWdvdG8gcmVjX2NvbXBsX2RvbmU7CisJfQorCW1wX3JlcSA9ICYocmVjX3JlcS0+bXBfcmVxKTsKKwlmY19oZHIgPSAmKG1wX3JlcS0+cmVzcF9mY19oZHIpOworCXJlc3BfbGVuID0gbXBfcmVxLT5yZXNwX2xlbjsKKwlhY2MgPSByZXNwX2J1ZiA9IG1wX3JlcS0+cmVzcF9idWY7CisKKwloZHJfbGVuID0gc2l6ZW9mKCpmY19oZHIpOworCisJYnVmID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9BVE9NSUMpOworCWlmICghYnVmKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInJlYyBidWY6IG1lbSBhbGxvYyBmYWlsdXJlXG4iKTsKKwkJZ290byByZWNfY29tcGxfZG9uZTsKKwl9CisJbWVtY3B5KGJ1ZiwgZmNfaGRyLCBoZHJfbGVuKTsKKwltZW1jcHkoYnVmICsgaGRyX2xlbiwgcmVzcF9idWYsIHJlc3BfbGVuKTsKKworCWZwID0gZmNfZnJhbWVfYWxsb2MoTlVMTCwgcmVzcF9sZW4pOworCWlmICghZnApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmNfZnJhbWVfYWxsb2MgZmFpbHVyZVxuIik7CisJCWdvdG8gZnJlZV9idWY7CisJfQorCisJZmggPSAoc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqKSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKKwkvKiBDb3B5IEZDIEZyYW1lIGhlYWRlciBhbmQgcGF5bG9hZCBpbnRvIHRoZSBmcmFtZSAqLworCW1lbWNweShmaCwgYnVmLCBoZHJfbGVuICsgcmVzcF9sZW4pOworCisJb3Bjb2RlID0gZmNfZnJhbWVfcGF5bG9hZF9vcChmcCk7CisJaWYgKG9wY29kZSA9PSBFTFNfTFNfUkpUKSB7CisJCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgIm9wY29kZSBpcyBSSlRcbiIpOworCQlyanQgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgc2l6ZW9mKCpyanQpKTsKKwkJaWYgKChyanQtPmVyX3JlYXNvbiA9PSBFTFNfUkpUX0xPR0lDIHx8CisJCSAgICByanQtPmVyX3JlYXNvbiA9PSBFTFNfUkpUX1VOQUIpICYmCisJCSAgICByanQtPmVyX2V4cGxhbiA9PSBFTFNfRVhQTF9PWElEX1JYSUQpIHsKKwkJCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgImhhbmRsZSBDTUQgTE9TVCBjYXNlXG4iKTsKKwkJCW5ld19pb19yZXEgPSBibngyZmNfY21kX2FsbG9jKHRndCk7CisJCQlpZiAoIW5ld19pb19yZXEpCisJCQkJZ290byBhYm9ydF9pbzsKKwkJCW5ld19pb19yZXEtPnNjX2NtZCA9IG9yaWdfaW9fcmVxLT5zY19jbWQ7CisJCQkvKiBjbGVhbnVwIG9yaWdfaW9fcmVxIHRoYXQgaXMgd2l0aCB0aGUgRlcgKi8KKwkJCXNldF9iaXQoQk5YMkZDX0ZMQUdfQ01EX0xPU1QsCisJCQkJJm9yaWdfaW9fcmVxLT5yZXFfZmxhZ3MpOworCQkJYm54MmZjX2luaXRpYXRlX2NsZWFudXAob3JpZ19pb19yZXEpOworCQkJLyogUG9zdCBhIG5ldyBJTyByZXEgd2l0aCB0aGUgc2FtZSBzY19jbWQgKi8KKwkJCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgIlBvc3QgSU8gcmVxdWVzdCBhZ2FpblxuIik7CisJCQlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CisJCQlyYyA9IGJueDJmY19wb3N0X2lvX3JlcSh0Z3QsIG5ld19pb19yZXEpOworCQkJc3Bpbl9sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKKwkJCWlmICghcmMpCisJCQkJZ290byBmcmVlX2ZyYW1lOworCQkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAiUkVDOiBpbyBwb3N0IGVyclxuIik7CisJCX0KK2Fib3J0X2lvOgorCQlyYyA9IGJueDJmY19pbml0aWF0ZV9hYnRzKG9yaWdfaW9fcmVxKTsKKwkJaWYgKHJjICE9IFNVQ0NFU1MpIHsKKwkJCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgInJlY19jb21wbDogaW5pdGlhdGVfYWJ0cyAiCisJCQkJImZhaWxlZC4gaXNzdWUgY2xlYW51cFxuIik7CisJCQlibngyZmNfaW5pdGlhdGVfY2xlYW51cChvcmlnX2lvX3JlcSk7CisJCX0KKwl9IGVsc2UgaWYgKG9wY29kZSA9PSBFTFNfTFNfQUNDKSB7CisJCS8qIFJFVklTSVQ6IENoZWNrIGlmIHRoZSBleGNoYW5nZSBpcyBhbHJlYWR5IGFib3J0ZWQgKi8KKwkJb2Zmc2V0ID0gbnRvaGwoYWNjLT5yZWNhX2ZjNHZhbHVlKTsKKwkJZV9zdGF0ID0gbnRvaGwoYWNjLT5yZWNhX2Vfc3RhdCk7CisJCWlmIChlX3N0YXQgJiBFU0JfU1RfU0VRX0lOSVQpICB7CisJCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJ0YXJnZXQgaGFzIHRoZSBzZXEgaW5pdFxuIik7CisJCQlnb3RvIGZyZWVfZnJhbWU7CisJCX0KKwkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAiZV9zdGF0ID0gMHgleCwgb2Zmc2V0ID0gMHgleFxuIiwKKwkJCWVfc3RhdCwgb2Zmc2V0KTsKKwkJLyogU2VxIGluaXRpYXRpdmUgaXMgd2l0aCB1cyAqLworCQllcnJfZW50cnkgPSAoc3RydWN0IGZjb2VfZXJyX3JlcG9ydF9lbnRyeSAqKQorCQkJICAgICAmb3JpZ19pb19yZXEtPmVycl9lbnRyeTsKKwkJc2NfY21kID0gb3JpZ19pb19yZXEtPnNjX2NtZDsKKwkJaWYgKHNjX2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgeworCQkJLyogU0NTSSBXUklURSBjb21tYW5kICovCisJCQlpZiAob2Zmc2V0ID09IG9yaWdfaW9fcmVxLT5kYXRhX3hmZXJfbGVuKSB7CisJCQkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAiV1JJVEUgLSByZXNwIGxvc3RcbiIpOworCQkJCS8qIEZDUF9SU1AgbG9zdCAqLworCQkJCXJfY3RsID0gRkNfUkNUTF9ERF9DTURfU1RBVFVTOworCQkJCW9mZnNldCA9IDA7CisJCQl9IGVsc2UgIHsKKwkJCQkvKiBzdGFydCB0cmFuc21pdHRpbmcgZnJvbSBvZmZzZXQgKi8KKwkJCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJYRkVSX1JEWS9EQVRBIGxvc3RcbiIpOworCQkJCXNlbmRfc2VxX2NsbnAgPSB0cnVlOworCQkJCXJfY3RsID0gRkNfUkNUTF9ERF9EQVRBX0RFU0M7CisJCQkJaWYgKGJueDJmY19pbml0aWF0ZV9zZXFfY2xlYW51cChvcmlnX2lvX3JlcSwKKwkJCQkJCQkJb2Zmc2V0LCByX2N0bCkpCisJCQkJCWFib3J0X2lvID0gdHJ1ZTsKKwkJCQkvKiBYRkVSX1JEWSAqLworCQkJfQorCQl9IGVsc2UgeworCQkJLyogU0NTSSBSRUFEIGNvbW1hbmQgKi8KKwkJCWlmIChlcnJfZW50cnktPmRhdGEucnhfYnVmX29mZiA9PQorCQkJCQlvcmlnX2lvX3JlcS0+ZGF0YV94ZmVyX2xlbikgeworCQkJCS8qIEZDUF9SU1AgbG9zdCAqLworCQkJCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgIlJFQUQgLSByZXNwIGxvc3RcbiIpOworCQkJCXJfY3RsID0gRkNfUkNUTF9ERF9DTURfU1RBVFVTOworCQkJCW9mZnNldCA9IDA7CisJCQl9IGVsc2UgIHsKKwkJCQkvKiByZXF1ZXN0IHJldHJhbnNtaXNzaW9uIGZyb20gdGhpcyBvZmZzZXQgKi8KKwkJCQlzZW5kX3NlcV9jbG5wID0gdHJ1ZTsKKwkJCQlvZmZzZXQgPSBlcnJfZW50cnktPmRhdGEucnhfYnVmX29mZjsKKwkJCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJSRCBEQVRBIGxvc3RcbiIpOworCQkJCS8qIEZDUF9EQVRBIGxvc3QgKi8KKwkJCQlyX2N0bCA9IEZDX1JDVExfRERfU09MX0RBVEE7CisJCQkJaWYgKGJueDJmY19pbml0aWF0ZV9zZXFfY2xlYW51cChvcmlnX2lvX3JlcSwKKwkJCQkJCQkJb2Zmc2V0LCByX2N0bCkpCisJCQkJCWFib3J0X2lvID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQlpZiAoYWJvcnRfaW8pIHsKKwkJCXJjID0gYm54MmZjX2luaXRpYXRlX2FidHMob3JpZ19pb19yZXEpOworCQkJaWYgKHJjICE9IFNVQ0NFU1MpIHsKKwkJCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJyZWNfY29tcGw6aW5pdGlhdGVfYWJ0cyIKKwkJCQkJICAgICAgIiBmYWlsZWQuIGlzc3VlIGNsZWFudXBcbiIpOworCQkJCWJueDJmY19pbml0aWF0ZV9jbGVhbnVwKG9yaWdfaW9fcmVxKTsKKwkJCX0KKwkJfSBlbHNlIGlmICghc2VuZF9zZXFfY2xucCkgeworCQkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAiU2VuZCBTUlIgLSBGQ1BfUlNQXG4iKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKKwkJCXJjID0gYm54MmZjX3NlbmRfc3JyKG9yaWdfaW9fcmVxLCBvZmZzZXQsIHJfY3RsKTsKKwkJCXNwaW5fbG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CisKKwkJCWlmIChyYykgeworCQkJCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgIlVuYWJsZSB0byBzZW5kIFNSUiIKKwkJCQkJIiBJTyB3aWxsIGFib3J0XG4iKTsKKwkJCX0KKwkJfQorCX0KK2ZyZWVfZnJhbWU6CisJZmNfZnJhbWVfZnJlZShmcCk7CitmcmVlX2J1ZjoKKwlrZnJlZShidWYpOworcmVjX2NvbXBsX2RvbmU6CisJa3JlZl9wdXQoJm9yaWdfaW9fcmVxLT5yZWZjb3VudCwgYm54MmZjX2NtZF9yZWxlYXNlKTsKKwlrZnJlZShjYl9hcmcpOworfQorCitpbnQgYm54MmZjX3NlbmRfcmVjKHN0cnVjdCBibngyZmNfY21kICpvcmlnX2lvX3JlcSkKK3sKKwlzdHJ1Y3QgZmNfZWxzX3JlYyByZWM7CisJc3RydWN0IGJueDJmY19ycG9ydCAqdGd0ID0gb3JpZ19pb19yZXEtPnRndDsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gdGd0LT5yZGF0YS0+bG9jYWxfcG9ydDsKKwlzdHJ1Y3QgYm54MmZjX2Vsc19jYl9hcmcgKmNiX2FyZyA9IE5VTEw7CisJdTMyIHNpZCA9IHRndC0+c2lkOworCXUzMiByX2FfdG92ID0gbHBvcnQtPnJfYV90b3Y7CisJaW50IHJjOworCisJQk5YMkZDX0lPX0RCRyhvcmlnX2lvX3JlcSwgIlNlbmRpbmcgUkVDXG4iKTsKKwltZW1zZXQoJnJlYywgMCwgc2l6ZW9mKHJlYykpOworCisJY2JfYXJnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJueDJmY19lbHNfY2JfYXJnKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFjYl9hcmcpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIGFsbG9jYXRlIGNiX2FyZyBmb3IgUkVDXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIHJlY19lcnI7CisJfQorCWtyZWZfZ2V0KCZvcmlnX2lvX3JlcS0+cmVmY291bnQpOworCisJY2JfYXJnLT5hYm9ydGVkX2lvX3JlcSA9IG9yaWdfaW9fcmVxOworCisJcmVjLnJlY19jbWQgPSBFTFNfUkVDOworCWh0b24yNChyZWMucmVjX3NfaWQsIHNpZCk7CisJcmVjLnJlY19veF9pZCA9IGh0b25zKG9yaWdfaW9fcmVxLT54aWQpOworCXJlYy5yZWNfcnhfaWQgPSBodG9ucyhvcmlnX2lvX3JlcS0+dGFzay0+cnh3cl90eHJkLnZhcl9jdHgucnhfaWQpOworCisJcmMgPSBibngyZmNfaW5pdGlhdGVfZWxzKHRndCwgRUxTX1JFQywgJnJlYywgc2l6ZW9mKHJlYyksCisJCQkJIGJueDJmY19yZWNfY29tcGwsIGNiX2FyZywKKwkJCQkgcl9hX3Rvdik7CityZWNfZXJyOgorCWlmIChyYykgeworCQlCTlgyRkNfSU9fREJHKG9yaWdfaW9fcmVxLCAiUkVDIGZhaWxlZCAtIHJlbGVhc2VcbiIpOworCQlzcGluX2xvY2tfYmgoJnRndC0+dGd0X2xvY2spOworCQlrcmVmX3B1dCgmb3JpZ19pb19yZXEtPnJlZmNvdW50LCBibngyZmNfY21kX3JlbGVhc2UpOworCQlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CisJCWtmcmVlKGNiX2FyZyk7CisJfQorCXJldHVybiByYzsKK30KKworaW50IGJueDJmY19zZW5kX3NycihzdHJ1Y3QgYm54MmZjX2NtZCAqb3JpZ19pb19yZXEsIHUzMiBvZmZzZXQsIHU4IHJfY3RsKQoreworCXN0cnVjdCBmY3Bfc3JyIHNycjsKKwlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QgPSBvcmlnX2lvX3JlcS0+dGd0OworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSB0Z3QtPnJkYXRhLT5sb2NhbF9wb3J0OworCXN0cnVjdCBibngyZmNfZWxzX2NiX2FyZyAqY2JfYXJnID0gTlVMTDsKKwl1MzIgcl9hX3RvdiA9IGxwb3J0LT5yX2FfdG92OworCWludCByYzsKKworCUJOWDJGQ19JT19EQkcob3JpZ19pb19yZXEsICJTZW5kaW5nIFNSUlxuIik7CisJbWVtc2V0KCZzcnIsIDAsIHNpemVvZihzcnIpKTsKKworCWNiX2FyZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBibngyZmNfZWxzX2NiX2FyZyksIEdGUF9BVE9NSUMpOworCWlmICghY2JfYXJnKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBhbGxvY2F0ZSBjYl9hcmcgZm9yIFNSUlxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBzcnJfZXJyOworCX0KKwlrcmVmX2dldCgmb3JpZ19pb19yZXEtPnJlZmNvdW50KTsKKworCWNiX2FyZy0+YWJvcnRlZF9pb19yZXEgPSBvcmlnX2lvX3JlcTsKKworCXNyci5zcnJfb3AgPSBFTFNfU1JSOworCXNyci5zcnJfb3hfaWQgPSBodG9ucyhvcmlnX2lvX3JlcS0+eGlkKTsKKwlzcnIuc3JyX3J4X2lkID0gaHRvbnMob3JpZ19pb19yZXEtPnRhc2stPnJ4d3JfdHhyZC52YXJfY3R4LnJ4X2lkKTsKKwlzcnIuc3JyX3JlbF9vZmYgPSBodG9ubChvZmZzZXQpOworCXNyci5zcnJfcl9jdGwgPSByX2N0bDsKKwlvcmlnX2lvX3JlcS0+c3JyX29mZnNldCA9IG9mZnNldDsKKwlvcmlnX2lvX3JlcS0+c3JyX3JjdGwgPSByX2N0bDsKKworCXJjID0gYm54MmZjX2luaXRpYXRlX2Vscyh0Z3QsIEVMU19TUlIsICZzcnIsIHNpemVvZihzcnIpLAorCQkJCSBibngyZmNfc3JyX2NvbXBsLCBjYl9hcmcsCisJCQkJIHJfYV90b3YpOworc3JyX2VycjoKKwlpZiAocmMpIHsKKwkJQk5YMkZDX0lPX0RCRyhvcmlnX2lvX3JlcSwgIlNSUiBmYWlsZWQgLSByZWxlYXNlXG4iKTsKKwkJc3Bpbl9sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKKwkJa3JlZl9wdXQoJm9yaWdfaW9fcmVxLT5yZWZjb3VudCwgYm54MmZjX2NtZF9yZWxlYXNlKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOworCQlrZnJlZShjYl9hcmcpOworCX0gZWxzZQorCQlzZXRfYml0KEJOWDJGQ19GTEFHX1NSUl9TRU5ULCAmb3JpZ19pb19yZXEtPnJlcV9mbGFncyk7CisKKwlyZXR1cm4gcmM7Cit9CisKIHN0YXRpYyBpbnQgYm54MmZjX2luaXRpYXRlX2VscyhzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QsIHVuc2lnbmVkIGludCBvcCwKIAkJCXZvaWQgKmRhdGEsIHUzMiBkYXRhX2xlbiwKIAkJCXZvaWQgKCpjYl9mdW5jKShzdHJ1Y3QgYm54MmZjX2Vsc19jYl9hcmcgKmNiX2FyZyksCiAJCQlzdHJ1Y3QgYm54MmZjX2Vsc19jYl9hcmcgKmNiX2FyZywgdTMyIHRpbWVyX21zZWMpCiB7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IHRndC0+cG9ydDsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gdGd0LT5ycG9ydDsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gcG9ydC0+bHBvcnQ7CiAJc3RydWN0IGJueDJmY19jbWQgKmVsc19yZXE7CkBAIC0yNzQsMTIgKzY3OCwxMiBAQAogCiAJcmMgPSBmY19yZW1vdGVfcG9ydF9jaGtyZWFkeShycG9ydCk7CiAJaWYgKHJjKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiZWxzIDB4JXg6IHJwb3J0IG5vdCByZWFkeVxuIiwgb3ApOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJlbHMgMHgleDogcnBvcnQgbm90IHJlYWR5XG4iLCBvcCk7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBlbHNfZXJyOwogCX0KIAlpZiAobHBvcnQtPnN0YXRlICE9IExQT1JUX1NUX1JFQURZIHx8ICEobHBvcnQtPmxpbmtfdXApKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiZWxzIDB4JXg6IGxpbmsgaXMgbm90IHJlYWR5XG4iLCBvcCk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImVscyAweCV4OiBsaW5rIGlzIG5vdCByZWFkeVxuIiwgb3ApOwogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gZWxzX2VycjsKIAl9CkBAIC0zMDUsNyArNzA5LDcgQEAKIAltcF9yZXEgPSAoc3RydWN0IGJueDJmY19tcF9yZXEgKikmKGVsc19yZXEtPm1wX3JlcSk7CiAJcmMgPSBibngyZmNfaW5pdF9tcF9yZXEoZWxzX3JlcSk7CiAJaWYgKHJjID09IEZBSUxFRCkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggIkVMUyBNUCByZXF1ZXN0IGluaXQgZmFpbGVkXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRUxTIE1QIHJlcXVlc3QgaW5pdCBmYWlsZWRcbiIpOwogCQlzcGluX2xvY2tfYmgoJnRndC0+dGd0X2xvY2spOwogCQlrcmVmX3B1dCgmZWxzX3JlcS0+cmVmY291bnQsIGJueDJmY19jbWRfcmVsZWFzZSk7CiAJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKQEAgLTMyNCw3ICs3MjgsNyBAQAogCWlmICgob3AgPj0gRUxTX0xTX1JKVCkgJiYgKG9wIDw9IEVMU19BVVRIX0VMUykpIHsKIAkJbWVtY3B5KG1wX3JlcS0+cmVxX2J1ZiwgZGF0YSwgZGF0YV9sZW4pOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiSW52YWxpZCBFTFMgb3AgMHgleFxuIiwgb3ApOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJJbnZhbGlkIEVMUyBvcCAweCV4XG4iLCBvcCk7CiAJCWVsc19yZXEtPmNiX2Z1bmMgPSBOVUxMOwogCQllbHNfcmVxLT5jYl9hcmcgPSBOVUxMOwogCQlzcGluX2xvY2tfYmgoJnRndC0+dGd0X2xvY2spOwpAQCAtMzQyLDkgKzc0NiwxNCBAQAogCWRpZCA9IHRndC0+cnBvcnQtPnBvcnRfaWQ7CiAJc2lkID0gdGd0LT5zaWQ7CiAKLQlfX2ZjX2ZpbGxfZmNfaGRyKGZjX2hkciwgRkNfUkNUTF9FTFNfUkVRLCBkaWQsIHNpZCwKLQkJCSAgIEZDX1RZUEVfRUxTLCBGQ19GQ19GSVJTVF9TRVEgfCBGQ19GQ19FTkRfU0VRIHwKLQkJCSAgIEZDX0ZDX1NFUV9JTklULCAwKTsKKwlpZiAob3AgPT0gRUxTX1NSUikKKwkJX19mY19maWxsX2ZjX2hkcihmY19oZHIsIEZDX1JDVExfRUxTNF9SRVEsIGRpZCwgc2lkLAorCQkJCSAgIEZDX1RZUEVfRkNQLCBGQ19GQ19GSVJTVF9TRVEgfAorCQkJCSAgIEZDX0ZDX0VORF9TRVEgfCBGQ19GQ19TRVFfSU5JVCwgMCk7CisJZWxzZQorCQlfX2ZjX2ZpbGxfZmNfaGRyKGZjX2hkciwgRkNfUkNUTF9FTFNfUkVRLCBkaWQsIHNpZCwKKwkJCQkgICBGQ19UWVBFX0VMUywgRkNfRkNfRklSU1RfU0VRIHwKKwkJCQkgICBGQ19GQ19FTkRfU0VRIHwgRkNfRkNfU0VRX0lOSVQsIDApOwogCiAJLyogT2J0YWluIGV4Y2hhbmdlIGlkICovCiAJeGlkID0gZWxzX3JlcS0+eGlkOwpAQCAtMzUyLDcgKzc2MSw4IEBACiAJaW5kZXggPSB4aWQgJSBCTlgyRkNfVEFTS1NfUEVSX1BBR0U7CiAKIAkvKiBJbml0aWFsaXplIHRhc2sgY29udGV4dCBmb3IgdGhpcyBJTyByZXF1ZXN0ICovCi0JdGFza19wYWdlID0gKHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICopIGhiYS0+dGFza19jdHhbdGFza19pZHhdOworCXRhc2tfcGFnZSA9IChzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqKQorCQkJaW50ZXJmYWNlLT5oYmEtPnRhc2tfY3R4W3Rhc2tfaWR4XTsKIAl0YXNrID0gJih0YXNrX3BhZ2VbaW5kZXhdKTsKIAlibngyZmNfaW5pdF9tcF90YXNrKGVsc19yZXEsIHRhc2spOwogCkBAIC00OTYsOCArOTA2LDggQEAKIAkJCQkgICAgICB2b2lkICphcmcsIHUzMiB0aW1lb3V0KQogewogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSBscG9ydF9wcml2KGxwb3J0KTsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKLQlzdHJ1Y3QgZmNvZV9jdGxyICpmaXAgPSAmaGJhLT5jdGxyOworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCXN0cnVjdCBmY29lX2N0bHIgKmZpcCA9ICZpbnRlcmZhY2UtPmN0bHI7CiAJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKIAogCXN3aXRjaCAob3ApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2Zjb2UuYyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2Zjb2UuYwppbmRleCBhOTdhZmYzLi43Y2IyY2Q0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19mY29lLmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZmNvZS5jCkBAIC0zLDcgKzMsNyBAQAogICogY25pYyBtb2R1bGVzIHRvIGNyZWF0ZSBGQ29FIGluc3RhbmNlcywgc2VuZC9yZWNlaXZlIG5vbi1vZmZsb2FkZWQKICAqIEZJUC9GQ29FIHBhY2tldHMsIGxpc3RlbiB0byBsaW5rIGV2ZW50cyBldGMuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA4IC0gMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA4IC0gMjAxMSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTUsMTMgKzE1LDE0IEBACiAjaW5jbHVkZSAiYm54MmZjLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGFkYXB0ZXJfbGlzdDsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGlmX2xpc3Q7CiBzdGF0aWMgdTMyIGFkYXB0ZXJfY291bnQ7CiBzdGF0aWMgREVGSU5FX01VVEVYKGJueDJmY19kZXZfbG9jayk7CiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgYm54MmZjX3BlcmNwdV9zLCBibngyZmNfcGVyY3B1KTsKIAogI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJibngyZmMiCiAjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTglCTlgyRkNfVkVSU0lPTgotI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkp1biAxMCwgMjAxMSIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJKdW4gMjMsIDIwMTEiCiAKIAogc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQpAQCAtNjEsNyArNjIsNyBAQAogCiBzdGF0aWMgdm9pZCBibngyZmNfcmVjdl9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAotc3RhdGljIHZvaWQgYm54MmZjX3N0YXJ0X2Rpc2Moc3RydWN0IGJueDJmY19oYmEgKmhiYSk7CitzdGF0aWMgdm9pZCBibngyZmNfc3RhcnRfZGlzYyhzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlKTsKIHN0YXRpYyBpbnQgYm54MmZjX3Nob3N0X2NvbmZpZyhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgZGV2aWNlICpkZXYpOwogc3RhdGljIGludCBibngyZmNfbmV0X2NvbmZpZyhzdHJ1Y3QgZmNfbHBvcnQgKmxwKTsKIHN0YXRpYyBpbnQgYm54MmZjX2xwb3J0X2NvbmZpZyhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KTsKQEAgLTcwLDE4ICs3MSwyMCBAQAogc3RhdGljIHZvaWQgYm54MmZjX3VuYmluZF9hZGFwdGVyX2RldmljZXMoc3RydWN0IGJueDJmY19oYmEgKmhiYSk7CiBzdGF0aWMgaW50IGJueDJmY19iaW5kX3BjaWRldihzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKTsKIHN0YXRpYyB2b2lkIGJueDJmY191bmJpbmRfcGNpZGV2KHN0cnVjdCBibngyZmNfaGJhICpoYmEpOwotc3RhdGljIHN0cnVjdCBmY19scG9ydCAqYm54MmZjX2lmX2NyZWF0ZShzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhLAorc3RhdGljIHN0cnVjdCBmY19scG9ydCAqYm54MmZjX2lmX2NyZWF0ZShzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlLAogCQkJCSAgc3RydWN0IGRldmljZSAqcGFyZW50LCBpbnQgbnBpdik7CiBzdGF0aWMgdm9pZCBibngyZmNfZGVzdHJveV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIHN0YXRpYyBzdHJ1Y3QgYm54MmZjX2hiYSAqYm54MmZjX2hiYV9sb29rdXAoc3RydWN0IG5ldF9kZXZpY2UgKnBoeXNfZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqYm54MmZjX2ludGVyZmFjZV9sb29rdXAoc3RydWN0IG5ldF9kZXZpY2UKKwkJCQkJCQkqcGh5c19kZXYpOwogc3RhdGljIHN0cnVjdCBibngyZmNfaGJhICpibngyZmNfZmluZF9oYmFfZm9yX2NuaWMoc3RydWN0IGNuaWNfZGV2ICpjbmljKTsKIAogc3RhdGljIGludCBibngyZmNfZndfaW5pdChzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKTsKIHN0YXRpYyB2b2lkIGJueDJmY19md19kZXN0cm95KHN0cnVjdCBibngyZmNfaGJhICpoYmEpOwogCiBzdGF0aWMgdm9pZCBibngyZmNfcG9ydF9zaHV0ZG93bihzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KTsKLXN0YXRpYyB2b2lkIGJueDJmY19zdG9wKHN0cnVjdCBibngyZmNfaGJhICpoYmEpOworc3RhdGljIHZvaWQgYm54MmZjX3N0b3Aoc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSk7CiBzdGF0aWMgaW50IF9faW5pdCBibngyZmNfbW9kX2luaXQodm9pZCk7CiBzdGF0aWMgdm9pZCBfX2V4aXQgYm54MmZjX21vZF9leGl0KHZvaWQpOwogCkBAIC0xNDIsNyArMTQ1LDggQEAKIHN0YXRpYyB2b2lkIGJueDJmY19jbGVhbnVwKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCiB7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3Q7CiAJaW50IGk7CiAKQEAgLTIxOSw3ICsyMjMsOCBAQAogCXN0cnVjdCBmY29lX2NyY19lb2YJKmNwOwogCXN0cnVjdCBza19idWZmCQkqc2tiOwogCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIJKmZoOwotCXN0cnVjdCBibngyZmNfaGJhCSpoYmE7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UJKmludGVyZmFjZTsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhOwogCXN0cnVjdCBmY29lX3BvcnQJKnBvcnQ7CiAJc3RydWN0IGZjb2VfaGRyCQkqaHA7CiAJc3RydWN0IGJueDJmY19ycG9ydAkqdGd0OwpAQCAtMjMwLDcgKzIzNSw4IEBACiAJaW50CQkJd2xlbiwgcmMgPSAwOwogCiAJcG9ydCA9IChzdHJ1Y3QgZmNvZV9wb3J0ICopbHBvcnRfcHJpdihscG9ydCk7Ci0JaGJhID0gcG9ydC0+cHJpdjsKKwlpbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCWhiYSA9IGludGVyZmFjZS0+aGJhOwogCiAJZmggPSBmY19mcmFtZV9oZWFkZXJfZ2V0KGZwKTsKIApAQCAtMjQyLDEyICsyNDgsMTIgQEAKIAl9CiAKIAlpZiAodW5saWtlbHkoZmgtPmZoX3JfY3RsID09IEZDX1JDVExfRUxTX1JFUSkpIHsKLQkJaWYgKCFoYmEtPmN0bHIuc2VsX2ZjZikgeworCQlpZiAoIWludGVyZmFjZS0+Y3Rsci5zZWxfZmNmKSB7CiAJCQlCTlgyRkNfSEJBX0RCRyhscG9ydCwgIkZDRiBub3Qgc2VsZWN0ZWQgeWV0IVxuIik7CiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCWlmIChmY29lX2N0bHJfZWxzX3NlbmQoJmhiYS0+Y3RsciwgbHBvcnQsIHNrYikpCisJCWlmIChmY29lX2N0bHJfZWxzX3NlbmQoJmludGVyZmFjZS0+Y3RsciwgbHBvcnQsIHNrYikpCiAJCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTMxNiwxOSArMzIyLDE5IEBACiAJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJc2tiLT5tYWNfbGVuID0gZWxlbjsKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfRkNPRSk7Ci0Jc2tiLT5kZXYgPSBoYmEtPm5ldGRldjsKKwlza2ItPmRldiA9IGludGVyZmFjZS0+bmV0ZGV2OwogCiAJLyogZmlsbCB1cCBtYWMgYW5kIGZjb2UgaGVhZGVycyAqLwogCWVoID0gZXRoX2hkcihza2IpOwogCWVoLT5oX3Byb3RvID0gaHRvbnMoRVRIX1BfRkNPRSk7Ci0JaWYgKGhiYS0+Y3Rsci5tYXBfZGVzdCkKKwlpZiAoaW50ZXJmYWNlLT5jdGxyLm1hcF9kZXN0KQogCQlmY19mY29lX3NldF9tYWMoZWgtPmhfZGVzdCwgZmgtPmZoX2RfaWQpOwogCWVsc2UKIAkJLyogaW5zZXJ0IEdXIGFkZHJlc3MgKi8KLQkJbWVtY3B5KGVoLT5oX2Rlc3QsIGhiYS0+Y3Rsci5kZXN0X2FkZHIsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGVoLT5oX2Rlc3QsIGludGVyZmFjZS0+Y3Rsci5kZXN0X2FkZHIsIEVUSF9BTEVOKTsKIAotCWlmICh1bmxpa2VseShoYmEtPmN0bHIuZmxvZ2lfb3hpZCAhPSBGQ19YSURfVU5LTk9XTikpCi0JCW1lbWNweShlaC0+aF9zb3VyY2UsIGhiYS0+Y3Rsci5jdGxfc3JjX2FkZHIsIEVUSF9BTEVOKTsKKwlpZiAodW5saWtlbHkoaW50ZXJmYWNlLT5jdGxyLmZsb2dpX294aWQgIT0gRkNfWElEX1VOS05PV04pKQorCQltZW1jcHkoZWgtPmhfc291cmNlLCBpbnRlcmZhY2UtPmN0bHIuY3RsX3NyY19hZGRyLCBFVEhfQUxFTik7CiAJZWxzZQogCQltZW1jcHkoZWgtPmhfc291cmNlLCBwb3J0LT5kYXRhX3NyY19hZGRyLCBFVEhfQUxFTik7CiAKQEAgLTM3NywyMiArMzgzLDIzIEBACiAJCXN0cnVjdCBwYWNrZXRfdHlwZSAqcHR5cGUsIHN0cnVjdCBuZXRfZGV2aWNlICpvbGRkZXYpCiB7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhOworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2U7CiAJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CiAJc3RydWN0IGZjb2VfcmN2X2luZm8gKmZyOwogCXN0cnVjdCBmY29lX3BlcmNwdV9zICpiZzsKIAl1bnNpZ25lZCBzaG9ydCBveGlkOwogCi0JaGJhID0gY29udGFpbmVyX29mKHB0eXBlLCBzdHJ1Y3QgYm54MmZjX2hiYSwgZmNvZV9wYWNrZXRfdHlwZSk7Ci0JbHBvcnQgPSBoYmEtPmN0bHIubHA7CisJaW50ZXJmYWNlID0gY29udGFpbmVyX29mKHB0eXBlLCBzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSwKKwkJCQkgZmNvZV9wYWNrZXRfdHlwZSk7CisJbHBvcnQgPSBpbnRlcmZhY2UtPmN0bHIubHA7CiAKIAlpZiAodW5saWtlbHkobHBvcnQgPT0gTlVMTCkpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJibngyZmNfcmN2OiBscG9ydCBpcyBOVUxMXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiYm54MmZjX3JjdjogbHBvcnQgaXMgTlVMTFxuIik7CiAJCWdvdG8gZXJyOwogCX0KIAogCWlmICh1bmxpa2VseShldGhfaGRyKHNrYiktPmhfcHJvdG8gIT0gaHRvbnMoRVRIX1BfRkNPRSkpKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiYm54MmZjX3JjdjogV3JvbmcgRkMgdHlwZSBmcmFtZVxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImJueDJmY19yY3Y6IFdyb25nIEZDIHR5cGUgZnJhbWVcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKQEAgLTQxMSw3ICs0MTgsNiBAQAogCiAJZnIgPSBmY29lX2Rldl9mcm9tX3NrYihza2IpOwogCWZyLT5mcl9kZXYgPSBscG9ydDsKLQlmci0+cHR5cGUgPSBwdHlwZTsKIAogCWJnID0gJmJueDJmY19nbG9iYWw7CiAJc3Bpbl9sb2NrX2JoKCZiZy0+ZmNvZV9yeF9saXN0LmxvY2spOwpAQCAtNDY5LDcgKzQ3NSw3IEBACiAJZnIgPSBmY29lX2Rldl9mcm9tX3NrYihza2IpOwogCWxwb3J0ID0gZnItPmZyX2RldjsKIAlpZiAodW5saWtlbHkobHBvcnQgPT0gTlVMTCkpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJJbnZhbGlkIGxwb3J0IHN0cnVjdFxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkludmFsaWQgbHBvcnQgc3RydWN0XG4iKTsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybjsKIAl9CkBAIC01OTQsNyArNjAwLDggQEAKIAlzdHJ1Y3QgZmNfaG9zdF9zdGF0aXN0aWNzICpibngyZmNfc3RhdHM7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IHNob3N0X3ByaXYoc2hvc3QpOwogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSBscG9ydF9wcml2KGxwb3J0KTsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAJc3RydWN0IGZjb2Vfc3RhdGlzdGljc19wYXJhbXMgKmZ3X3N0YXRzOwogCWludCByYyA9IDA7CiAKQEAgLTYzMSw3ICs2MzgsNyBAQAogc3RhdGljIGludCBibngyZmNfc2hvc3RfY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gbHBvcnRfcHJpdihscG9ydCk7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBscG9ydC0+aG9zdDsKIAlpbnQgcmMgPSAwOwogCkBAIC02NTQsNyArNjYxLDcgQEAKIAkJZmNfaG9zdF9tYXhfbnBpdl92cG9ydHMobHBvcnQtPmhvc3QpID0gVVNIUlRfTUFYOwogCXNwcmludGYoZmNfaG9zdF9zeW1ib2xpY19uYW1lKGxwb3J0LT5ob3N0KSwgIiVzIHYlcyBvdmVyICVzIiwKIAkJQk5YMkZDX05BTUUsIEJOWDJGQ19WRVJTSU9OLAotCQloYmEtPm5ldGRldi0+bmFtZSk7CisJCWludGVyZmFjZS0+bmV0ZGV2LT5uYW1lKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjYyLDggKzY2OSw4IEBACiBzdGF0aWMgdm9pZCBibngyZmNfbGlua19zcGVlZF91cGRhdGUoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKIHsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gbHBvcnRfcHJpdihscG9ydCk7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGhiYS0+bmV0ZGV2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBpbnRlcmZhY2UtPm5ldGRldjsKIAlzdHJ1Y3QgZXRodG9vbF9jbWQgZWNtZDsKIAogCWlmICghZGV2X2V0aHRvb2xfZ2V0X3NldHRpbmdzKG5ldGRldiwgJmVjbWQpKSB7CkBAIC02OTEsNyArNjk4LDggQEAKIHN0YXRpYyBpbnQgYm54MmZjX2xpbmtfb2soc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKIHsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gbHBvcnRfcHJpdihscG9ydCk7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGludGVyZmFjZS0+aGJhOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBoYmEtPnBoeXNfZGV2OwogCWludCByYyA9IDA7CiAKQEAgLTcxMyw3ICs3MjEsNyBAQAogICovCiB2b2lkIGJueDJmY19nZXRfbGlua19zdGF0ZShzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKQogewotCWlmICh0ZXN0X2JpdChfX0xJTktfU1RBVEVfTk9DQVJSSUVSLCAmaGJhLT5uZXRkZXYtPnN0YXRlKSkKKwlpZiAodGVzdF9iaXQoX19MSU5LX1NUQVRFX05PQ0FSUklFUiwgJmhiYS0+cGh5c19kZXYtPnN0YXRlKSkKIAkJc2V0X2JpdChBREFQVEVSX1NUQVRFX0xJTktfRE9XTiwgJmhiYS0+YWRhcHRlcl9zdGF0ZSk7CiAJZWxzZQogCQljbGVhcl9iaXQoQURBUFRFUl9TVEFURV9MSU5LX0RPV04sICZoYmEtPmFkYXB0ZXJfc3RhdGUpOwpAQCAtNzIyLDExICs3MzAsMTMgQEAKIHN0YXRpYyBpbnQgYm54MmZjX25ldF9jb25maWcoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKIHsKIAlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhOworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2U7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydDsKIAl1NjQgd3dubiwgd3dwbjsKIAogCXBvcnQgPSBscG9ydF9wcml2KGxwb3J0KTsKLQloYmEgPSBwb3J0LT5wcml2OworCWludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAKIAkvKiByZXF1aXJlIHN1cHBvcnQgZm9yIGdldF9wYXVzZXBhcmFtIGV0aHRvb2wgb3AuICovCiAJaWYgKCFoYmEtPnBoeXNfZGV2LT5ldGh0b29sX29wcyB8fApAQCAtNzQzLDExICs3NTMsMTEgQEAKIAlibngyZmNfbGlua19zcGVlZF91cGRhdGUobHBvcnQpOwogCiAJaWYgKCFscG9ydC0+dnBvcnQpIHsKLQkJd3dubiA9IGZjb2Vfd3duX2Zyb21fbWFjKGhiYS0+Y3Rsci5jdGxfc3JjX2FkZHIsIDEsIDApOworCQl3d25uID0gZmNvZV93d25fZnJvbV9tYWMoaW50ZXJmYWNlLT5jdGxyLmN0bF9zcmNfYWRkciwgMSwgMCk7CiAJCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAiV1dOTiA9IDB4JWxseFxuIiwgd3dubik7CiAJCWZjX3NldF93d25uKGxwb3J0LCB3d25uKTsKIAotCQl3d3BuID0gZmNvZV93d25fZnJvbV9tYWMoaGJhLT5jdGxyLmN0bF9zcmNfYWRkciwgMiwgMCk7CisJCXd3cG4gPSBmY29lX3d3bl9mcm9tX21hYyhpbnRlcmZhY2UtPmN0bHIuY3RsX3NyY19hZGRyLCAyLCAwKTsKIAkJQk5YMkZDX0hCQV9EQkcobHBvcnQsICJXV1BOID0gMHglbGx4XG4iLCB3d3BuKTsKIAkJZmNfc2V0X3d3cG4obHBvcnQsIHd3cG4pOwogCX0KQEAgLTc1OSw5ICs3NjksOSBAQAogewogCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSAoc3RydWN0IGJueDJmY19oYmEgKilkYXRhOwogCi0JQk5YMkZDX0hCQV9EQkcoaGJhLT5jdGxyLmxwLCAiRVJST1I6Ym54MmZjX2Rlc3Ryb3lfdGltZXIgLSAiCisJQk5YMkZDX01JU0NfREJHKCJFUlJPUjpibngyZmNfZGVzdHJveV90aW1lciAtICIKIAkJICAgIkRlc3Ryb3kgY29tcGwgbm90IHJlY2VpdmVkISFcbiIpOwotCWhiYS0+ZmxhZ3MgfD0gQk5YMkZDX0ZMQUdfREVTVFJPWV9DTVBMOworCXNldF9iaXQoQk5YMkZDX0ZMQUdfREVTVFJPWV9DTVBMLCAmaGJhLT5mbGFncyk7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZoYmEtPmRlc3Ryb3lfd2FpdCk7CiB9CiAKQEAgLTc3OSw1NCArNzg5LDM1IEBACiAJCQkJICAgICB1MTYgdmxhbl9pZCkKIHsKIAlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gKHN0cnVjdCBibngyZmNfaGJhICopY29udGV4dDsKLQlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gaGJhLT5jdGxyLmxwOworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CiAJc3RydWN0IGZjX2xwb3J0ICp2cG9ydDsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCWludCB3YWl0X2Zvcl91cGxvYWQgPSAwOwogCXUzMiBsaW5rX3Bvc3NpYmxlID0gMTsKIAogCS8qIElnbm9yZSB2bGFucyBmb3Igbm93ICovCiAJaWYgKHZsYW5faWQgIT0gMCkKIAkJcmV0dXJuOwogCi0JaWYgKCF0ZXN0X2JpdChCTlgyRkNfQ1JFQVRFX0RPTkUsICZoYmEtPmluaXRfZG9uZSkpIHsKLQkJQk5YMkZDX01JU0NfREJHKCJkcml2ZXIgbm90IHJlYWR5LiBldmVudD0lcyAlbGRcbiIsCi0JCQkgICBoYmEtPm5ldGRldi0+bmFtZSwgZXZlbnQpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBBU1NVTVBUSU9OOgotCSAqIGluZGljYXRlX25ldGV2ZW50IGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBjbmljIHVubGVzcyBibngyZmMKLQkgKiBkb2VzIHJlZ2lzdGVyX2RldmljZQotCSAqLwotCUJVR19PTighbHBvcnQpOwotCi0JQk5YMkZDX0hCQV9EQkcobHBvcnQsICJlbnRlciBuZXRldmVudCBoYW5kbGVyIC0gZXZlbnQ9JXMgJWxkXG4iLAotCQkJCWhiYS0+bmV0ZGV2LT5uYW1lLCBldmVudCk7Ci0KIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBORVRERVZfVVA6Ci0JCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAiUG9ydCB1cCwgYWRhcHRlcl9zdGF0ZSA9ICVsZFxuIiwKLQkJCWhiYS0+YWRhcHRlcl9zdGF0ZSk7CiAJCWlmICghdGVzdF9iaXQoQURBUFRFUl9TVEFURV9VUCwgJmhiYS0+YWRhcHRlcl9zdGF0ZSkpCiAJCQlwcmludGsoS0VSTl9FUlIgImluZGljYXRlX25ldGV2ZW50OiAiXAotCQkJCQkiYWRhcHRlciBpcyBub3QgVVAhIVxuIik7CisJCQkJCSJoYmEgaXMgbm90IFVQISFcbiIpOwogCQlicmVhazsKIAogCWNhc2UgTkVUREVWX0RPV046Ci0JCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAiUG9ydCBkb3duXG4iKTsKIAkJY2xlYXJfYml0KEFEQVBURVJfU1RBVEVfR09JTkdfRE9XTiwgJmhiYS0+YWRhcHRlcl9zdGF0ZSk7CiAJCWNsZWFyX2JpdChBREFQVEVSX1NUQVRFX1VQLCAmaGJhLT5hZGFwdGVyX3N0YXRlKTsKIAkJbGlua19wb3NzaWJsZSA9IDA7CiAJCWJyZWFrOwogCiAJY2FzZSBORVRERVZfR09JTkdfRE9XTjoKLQkJQk5YMkZDX0hCQV9EQkcobHBvcnQsICJQb3J0IGdvaW5nIGRvd25cbiIpOwogCQlzZXRfYml0KEFEQVBURVJfU1RBVEVfR09JTkdfRE9XTiwgJmhiYS0+YWRhcHRlcl9zdGF0ZSk7CiAJCWxpbmtfcG9zc2libGUgPSAwOwogCQlicmVhazsKIAogCWNhc2UgTkVUREVWX0NIQU5HRToKLQkJQk5YMkZDX0hCQV9EQkcobHBvcnQsICJORVRERVZfQ0hBTkdFXG4iKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtODM0LDE1ICs4MjUsMjIgQEAKIAkJcmV0dXJuOwogCX0KIAotCWJueDJmY19saW5rX3NwZWVkX3VwZGF0ZShscG9ydCk7CisJbXV0ZXhfbG9jaygmYm54MmZjX2Rldl9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGludGVyZmFjZSwgJmlmX2xpc3QsIGxpc3QpIHsKIAotCWlmIChsaW5rX3Bvc3NpYmxlICYmICFibngyZmNfbGlua19vayhscG9ydCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpbmRpY2F0ZV9uZXRldmVudDogY2FsbCBjdGxyX2xpbmtfdXBcbiIpOwotCQlmY29lX2N0bHJfbGlua191cCgmaGJhLT5jdGxyKTsKLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgImluZGljYXRlX25ldGV2ZW50OiBjYWxsIGN0bHJfbGlua19kb3duXG4iKTsKLQkJaWYgKGZjb2VfY3Rscl9saW5rX2Rvd24oJmhiYS0+Y3RscikpIHsKLQkJCWNsZWFyX2JpdChBREFQVEVSX1NUQVRFX1JFQURZLCAmaGJhLT5hZGFwdGVyX3N0YXRlKTsKKwkJaWYgKGludGVyZmFjZS0+aGJhICE9IGhiYSkKKwkJCWNvbnRpbnVlOworCisJCWxwb3J0ID0gaW50ZXJmYWNlLT5jdGxyLmxwOworCQlCTlgyRkNfSEJBX0RCRyhscG9ydCwgIm5ldGV2ZW50IGhhbmRsZXIgLSBldmVudD0lcyAlbGRcbiIsCisJCQkJaW50ZXJmYWNlLT5uZXRkZXYtPm5hbWUsIGV2ZW50KTsKKworCQlibngyZmNfbGlua19zcGVlZF91cGRhdGUobHBvcnQpOworCisJCWlmIChsaW5rX3Bvc3NpYmxlICYmICFibngyZmNfbGlua19vayhscG9ydCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaW5kaWNhdGVfbmV0ZXZlbnQ6IGN0bHJfbGlua191cFxuIik7CisJCQlmY29lX2N0bHJfbGlua191cCgmaW50ZXJmYWNlLT5jdGxyKTsKKwkJfSBlbHNlIGlmIChmY29lX2N0bHJfbGlua19kb3duKCZpbnRlcmZhY2UtPmN0bHIpKSB7CiAJCQltdXRleF9sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOwogCQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2cG9ydCwgJmxwb3J0LT52cG9ydHMsIGxpc3QpCiAJCQkJZmNfaG9zdF9wb3J0X3R5cGUodnBvcnQtPmhvc3QpID0KQEAgLTg1MywyNSArODUxLDI3IEBACiAJCQkJICAgIGdldF9jcHUoKSktPkxpbmtGYWlsdXJlQ291bnQrKzsKIAkJCXB1dF9jcHUoKTsKIAkJCWZjb2VfY2xlYW5fcGVuZGluZ19xdWV1ZShscG9ydCk7Ci0KLQkJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmhiYS0+c2h1dGRvd25fd2FpdCk7Ci0JCQlCTlgyRkNfSEJBX0RCRyhscG9ydCwgImluZGljYXRlX25ldGV2ZW50ICIKLQkJCQkJICAgICAibnVtX29mbGRfc2VzcyA9ICVkXG4iLAotCQkJCSAgIGhiYS0+bnVtX29mbGRfc2Vzcyk7Ci0JCQloYmEtPndhaXRfZm9yX2xpbmtfZG93biA9IDE7Ci0JCQlCTlgyRkNfSEJBX0RCRyhscG9ydCwgIndhaXRpbmcgZm9yIHVwbG9hZHMgdG8gIgotCQkJCQkgICAgICJjb21wbCBwcm9jID0gJXNcbiIsCi0JCQkJICAgY3VycmVudC0+Y29tbSk7Ci0JCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaGJhLT5zaHV0ZG93bl93YWl0LAotCQkJCQkJIChoYmEtPm51bV9vZmxkX3Nlc3MgPT0gMCkpOwotCQkJQk5YMkZDX0hCQV9EQkcobHBvcnQsICJ3YWtldXAgLSBudW1fb2ZsZF9zZXNzID0gJWRcbiIsCi0JCQkJaGJhLT5udW1fb2ZsZF9zZXNzKTsKLQkJCWhiYS0+d2FpdF9mb3JfbGlua19kb3duID0gMDsKLQotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CisJCQl3YWl0X2Zvcl91cGxvYWQgPSAxOwogCQl9CiAJfQorCW11dGV4X3VubG9jaygmYm54MmZjX2Rldl9sb2NrKTsKKworCWlmICh3YWl0X2Zvcl91cGxvYWQpIHsKKwkJY2xlYXJfYml0KEFEQVBURVJfU1RBVEVfUkVBRFksICZoYmEtPmFkYXB0ZXJfc3RhdGUpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZoYmEtPnNodXRkb3duX3dhaXQpOworCQlCTlgyRkNfTUlTQ19EQkcoImluZGljYXRlX25ldGV2ZW50ICIKKwkJCQkibnVtX29mbGRfc2VzcyA9ICVkXG4iLAorCQkJCWhiYS0+bnVtX29mbGRfc2Vzcyk7CisJCWhiYS0+d2FpdF9mb3JfbGlua19kb3duID0gMTsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGhiYS0+c2h1dGRvd25fd2FpdCwKKwkJCQkJIChoYmEtPm51bV9vZmxkX3Nlc3MgPT0gMCkpOworCQlCTlgyRkNfTUlTQ19EQkcoIndha2V1cCAtIG51bV9vZmxkX3Nlc3MgPSAlZFxuIiwKKwkJCQloYmEtPm51bV9vZmxkX3Nlc3MpOworCQloYmEtPndhaXRfZm9yX2xpbmtfZG93biA9IDA7CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgYm54MmZjX2xpYmZjX2NvbmZpZyhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQpAQCAtODg5LDIzICs4ODksMTIgQEAKIAogc3RhdGljIGludCBibngyZmNfZW1fY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCiB7Ci0Jc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OwotCiAJaWYgKCFmY19leGNoX21ncl9hbGxvYyhscG9ydCwgRkNfQ0xBU1NfMywgRkNPRV9NSU5fWElELAogCQkJCUZDT0VfTUFYX1hJRCwgTlVMTCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZW1fY29uZmlnOmZjX2V4Y2hfbWdyX2FsbG9jIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWhiYS0+Y21kX21nciA9IGJueDJmY19jbWRfbWdyX2FsbG9jKGhiYSwgQk5YMkZDX01JTl9YSUQsCi0JCQkJCSAgICBCTlgyRkNfTUFYX1hJRCk7Ci0KLQlpZiAoIWhiYS0+Y21kX21ncikgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJlbV9jb25maWc6Ym54MmZjX2NtZF9tZ3JfYWxsb2MgZmFpbGVkXG4iKTsKLQkJZmNfZXhjaF9tZ3JfZnJlZShscG9ydCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtOTE4LDExICs5MDcsOCBAQAogCWxwb3J0LT5lX2RfdG92ID0gMiAqIDEwMDA7CiAJbHBvcnQtPnJfYV90b3YgPSAxMCAqIDEwMDA7CiAKLQkvKiBSRVZJU0lUOiBlbmFibGUgd2hlbiBzdXBwb3J0aW5nIHRhcGUgZGV2aWNlcwogCWxwb3J0LT5zZXJ2aWNlX3BhcmFtcyA9IChGQ1BfU1BQRl9JTklUX0ZDTiB8IEZDUF9TUFBGX1JEX1hSRFlfRElTIHwKIAkJCQlGQ1BfU1BQRl9SRVRSWSB8IEZDUF9TUFBGX0NPTkZfQ09NUEwpOwotCSovCi0JbHBvcnQtPnNlcnZpY2VfcGFyYW1zID0gKEZDUF9TUFBGX0lOSVRfRkNOIHwgRkNQX1NQUEZfUkRfWFJEWV9ESVMpOwogCWxwb3J0LT5kb2VzX25waXYgPSAxOwogCiAJbWVtc2V0KCZscG9ydC0+cm5pZF9nZW4sIDAsIHNpemVvZihzdHJ1Y3QgZmNfZWxzX3JuaWRfZ2VuKSk7CkBAIC05NTIsOSArOTM4LDEwIEBACiAJCQkgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlLAogCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKm9yaWdfZGV2KQogewotCXN0cnVjdCBibngyZmNfaGJhICpoYmE7Ci0JaGJhID0gY29udGFpbmVyX29mKHB0eXBlLCBzdHJ1Y3QgYm54MmZjX2hiYSwgZmlwX3BhY2tldF90eXBlKTsKLQlmY29lX2N0bHJfcmVjdigmaGJhLT5jdGxyLCBza2IpOworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJaW50ZXJmYWNlID0gY29udGFpbmVyX29mKHB0eXBlLCBzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSwKKwkJCQkgZmlwX3BhY2tldF90eXBlKTsKKwlmY29lX2N0bHJfcmVjdigmaW50ZXJmYWNlLT5jdGxyLCBza2IpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDA1LDE3ICs5OTIsMTcgQEAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHZwb3J0X3RvX3Nob3N0KHZwb3J0KTsKIAlzdHJ1Y3QgZmNfbHBvcnQgKm5fcG9ydCA9IHNob3N0X3ByaXYoc2hvc3QpOwogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSBscG9ydF9wcml2KG5fcG9ydCk7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGhiYS0+bmV0ZGV2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBpbnRlcmZhY2UtPm5ldGRldjsKIAlzdHJ1Y3QgZmNfbHBvcnQgKnZuX3BvcnQ7CiAKLQlpZiAoIXRlc3RfYml0KEJOWDJGQ19GV19JTklUX0RPTkUsICZoYmEtPmluaXRfZG9uZSkpIHsKKwlpZiAoIXRlc3RfYml0KEJOWDJGQ19GTEFHX0ZXX0lOSVRfRE9ORSwgJmludGVyZmFjZS0+aGJhLT5mbGFncykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidm4gcG9ydHMgY2Fubm90IGJlIGNyZWF0ZWQgb24iCi0JCQkidGhpcyBoYmFcbiIpOworCQkJInRoaXMgaW50ZXJmYWNlXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCW11dGV4X2xvY2soJmJueDJmY19kZXZfbG9jayk7Ci0Jdm5fcG9ydCA9IGJueDJmY19pZl9jcmVhdGUoaGJhLCAmdnBvcnQtPmRldiwgMSk7CisJdm5fcG9ydCA9IGJueDJmY19pZl9jcmVhdGUoaW50ZXJmYWNlLCAmdnBvcnQtPmRldiwgMSk7CiAJbXV0ZXhfdW5sb2NrKCZibngyZmNfZGV2X2xvY2spOwogCiAJaWYgKElTX0VSUih2bl9wb3J0KSkgewpAQCAtMTA2NSwxMCArMTA1MiwxMCBAQAogfQogCiAKLXN0YXRpYyBpbnQgYm54MmZjX25ldGRldl9zZXR1cChzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKQorc3RhdGljIGludCBibngyZmNfbmV0ZGV2X3NldHVwKHN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGhiYS0+bmV0ZGV2OwotCXN0cnVjdCBuZXRfZGV2aWNlICpwaHlzZGV2ID0gaGJhLT5waHlzX2RldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gaW50ZXJmYWNlLT5uZXRkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKnBoeXNkZXYgPSBpbnRlcmZhY2UtPmhiYS0+cGh5c19kZXY7CiAJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKIAlpbnQgc2VsX3Nhbl9tYWMgPSAwOwogCkBAIC0xMDgzLDcgKzEwNzAsOCBAQAogCiAJCWlmICgoaGEtPnR5cGUgPT0gTkVUREVWX0hXX0FERFJfVF9TQU4pICYmCiAJCSAgICAoaXNfdmFsaWRfZXRoZXJfYWRkcihoYS0+YWRkcikpKSB7Ci0JCQltZW1jcHkoaGJhLT5jdGxyLmN0bF9zcmNfYWRkciwgaGEtPmFkZHIsIEVUSF9BTEVOKTsKKwkJCW1lbWNweShpbnRlcmZhY2UtPmN0bHIuY3RsX3NyY19hZGRyLCBoYS0+YWRkciwKKwkJCSAgICAgICBFVEhfQUxFTik7CiAJCQlzZWxfc2FuX21hYyA9IDE7CiAJCQlCTlgyRkNfTUlTQ19EQkcoIkZvdW5kIFNBTiBNQUNcbiIpOwogCQl9CkBAIC0xMDkzLDE1ICsxMDgxLDE1IEBACiAJaWYgKCFzZWxfc2FuX21hYykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQloYmEtPmZpcF9wYWNrZXRfdHlwZS5mdW5jID0gYm54MmZjX2ZpcF9yZWN2OwotCWhiYS0+ZmlwX3BhY2tldF90eXBlLnR5cGUgPSBodG9ucyhFVEhfUF9GSVApOwotCWhiYS0+ZmlwX3BhY2tldF90eXBlLmRldiA9IG5ldGRldjsKLQlkZXZfYWRkX3BhY2soJmhiYS0+ZmlwX3BhY2tldF90eXBlKTsKKwlpbnRlcmZhY2UtPmZpcF9wYWNrZXRfdHlwZS5mdW5jID0gYm54MmZjX2ZpcF9yZWN2OworCWludGVyZmFjZS0+ZmlwX3BhY2tldF90eXBlLnR5cGUgPSBodG9ucyhFVEhfUF9GSVApOworCWludGVyZmFjZS0+ZmlwX3BhY2tldF90eXBlLmRldiA9IG5ldGRldjsKKwlkZXZfYWRkX3BhY2soJmludGVyZmFjZS0+ZmlwX3BhY2tldF90eXBlKTsKIAotCWhiYS0+ZmNvZV9wYWNrZXRfdHlwZS5mdW5jID0gYm54MmZjX3JjdjsKLQloYmEtPmZjb2VfcGFja2V0X3R5cGUudHlwZSA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfRkNPRSk7Ci0JaGJhLT5mY29lX3BhY2tldF90eXBlLmRldiA9IG5ldGRldjsKLQlkZXZfYWRkX3BhY2soJmhiYS0+ZmNvZV9wYWNrZXRfdHlwZSk7CisJaW50ZXJmYWNlLT5mY29lX3BhY2tldF90eXBlLmZ1bmMgPSBibngyZmNfcmN2OworCWludGVyZmFjZS0+ZmNvZV9wYWNrZXRfdHlwZS50eXBlID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9GQ09FKTsKKwlpbnRlcmZhY2UtPmZjb2VfcGFja2V0X3R5cGUuZGV2ID0gbmV0ZGV2OworCWRldl9hZGRfcGFjaygmaW50ZXJmYWNlLT5mY29lX3BhY2tldF90eXBlKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTEzNyw1MyArMTEyNSw1NCBAQAogCiBzdGF0aWMgdm9pZCBibngyZmNfaW50ZXJmYWNlX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCiB7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYTsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnBoeXNfZGV2OwogCi0JaGJhID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBibngyZmNfaGJhLCBrcmVmKTsKKwlpbnRlcmZhY2UgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGJueDJmY19pbnRlcmZhY2UsIGtyZWYpOwogCUJOWDJGQ19NSVNDX0RCRygiSW50ZXJmYWNlIGlzIGJlaW5nIHJlbGVhc2VkXG4iKTsKIAotCW5ldGRldiA9IGhiYS0+bmV0ZGV2OwotCXBoeXNfZGV2ID0gaGJhLT5waHlzX2RldjsKKwluZXRkZXYgPSBpbnRlcmZhY2UtPm5ldGRldjsKIAogCS8qIHRlYXItZG93biBGSVAgY29udHJvbGxlciAqLwotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQk5YMkZDX0NUTFJfSU5JVF9ET05FLCAmaGJhLT5pbml0X2RvbmUpKQotCQlmY29lX2N0bHJfZGVzdHJveSgmaGJhLT5jdGxyKTsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJOWDJGQ19DVExSX0lOSVRfRE9ORSwgJmludGVyZmFjZS0+aWZfZmxhZ3MpKQorCQlmY29lX2N0bHJfZGVzdHJveSgmaW50ZXJmYWNlLT5jdGxyKTsKIAorCWtmcmVlKGludGVyZmFjZSk7CisKKwlkZXZfcHV0KG5ldGRldik7CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyZmNfaW50ZXJmYWNlX2dldChzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCWtyZWZfZ2V0KCZpbnRlcmZhY2UtPmtyZWYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MmZjX2ludGVyZmFjZV9wdXQoc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwlrcmVmX3B1dCgmaW50ZXJmYWNlLT5rcmVmLCBibngyZmNfaW50ZXJmYWNlX3JlbGVhc2UpOworfQorc3RhdGljIHZvaWQgYm54MmZjX2hiYV9kZXN0cm95KHN0cnVjdCBibngyZmNfaGJhICpoYmEpCit7CiAJLyogRnJlZSB0aGUgY29tbWFuZCBtYW5hZ2VyICovCiAJaWYgKGhiYS0+Y21kX21ncikgewogCQlibngyZmNfY21kX21ncl9mcmVlKGhiYS0+Y21kX21ncik7CiAJCWhiYS0+Y21kX21nciA9IE5VTEw7CiAJfQotCWRldl9wdXQobmV0ZGV2KTsKLQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJueDJmY19pbnRlcmZhY2VfZ2V0KHN0cnVjdCBibngyZmNfaGJhICpoYmEpCi17Ci0Ja3JlZl9nZXQoJmhiYS0+a3JlZik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBibngyZmNfaW50ZXJmYWNlX3B1dChzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKQotewotCWtyZWZfcHV0KCZoYmEtPmtyZWYsIGJueDJmY19pbnRlcmZhY2VfcmVsZWFzZSk7Ci19Ci1zdGF0aWMgdm9pZCBibngyZmNfaW50ZXJmYWNlX2Rlc3Ryb3koc3RydWN0IGJueDJmY19oYmEgKmhiYSkKLXsKKwlrZnJlZShoYmEtPnRndF9vZmxkX2xpc3QpOwogCWJueDJmY191bmJpbmRfcGNpZGV2KGhiYSk7CiAJa2ZyZWUoaGJhKTsKIH0KIAogLyoqCi0gKiBibngyZmNfaW50ZXJmYWNlX2NyZWF0ZSAtIGNyZWF0ZSBhIG5ldyBmY29lIGluc3RhbmNlCisgKiBibngyZmNfaGJhX2NyZWF0ZSAtIGNyZWF0ZSBhIG5ldyBibngyZmMgaGJhCiAgKgogICogQGNuaWM6CXBvaW50ZXIgdG8gY25pYyBkZXZpY2UKICAqCi0gKiBDcmVhdGVzIGEgbmV3IEZDb0UgaW5zdGFuY2Ugb24gdGhlIGdpdmVuIGRldmljZSB3aGljaCBpbmNsdWRlIGFsbG9jYXRpbmcKLSAqCWhiYSBzdHJ1Y3R1cmUsIHNjc2lfaG9zdCBhbmQgbHBvcnQgc3RydWN0dXJlcy4KKyAqIENyZWF0ZXMgYSBuZXcgRkNvRSBoYmEgb24gdGhlIGdpdmVuIGRldmljZS4KKyAqCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYm54MmZjX2hiYSAqYm54MmZjX2ludGVyZmFjZV9jcmVhdGUoc3RydWN0IGNuaWNfZGV2ICpjbmljKQorc3RhdGljIHN0cnVjdCBibngyZmNfaGJhICpibngyZmNfaGJhX2NyZWF0ZShzdHJ1Y3QgY25pY19kZXYgKmNuaWMpCiB7CiAJc3RydWN0IGJueDJmY19oYmEgKmhiYTsKIAlpbnQgcmM7CkBAIC0xMTk4LDY1ICsxMTg3LDgzIEBACiAKIAloYmEtPmNuaWMgPSBjbmljOwogCXJjID0gYm54MmZjX2JpbmRfcGNpZGV2KGhiYSk7Ci0JaWYgKHJjKQorCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjcmVhdGVfYWRhcHRlcjogIGJpbmQgZXJyb3JcbiIpOwogCQlnb3RvIGJpbmRfZXJyOworCX0KIAloYmEtPnBoeXNfZGV2ID0gY25pYy0+bmV0ZGV2OwotCS8qIHdpbGwgZ2V0IG92ZXJ3cml0dGVuIGFmdGVyIHdlIGRvIHZsYW4gZGlzY292ZXJ5ICovCi0JaGJhLT5uZXRkZXYgPSBoYmEtPnBoeXNfZGV2OworCWhiYS0+bmV4dF9jb25uX2lkID0gMDsKKworCWhiYS0+dGd0X29mbGRfbGlzdCA9CisJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBibngyZmNfcnBvcnQgKikgKiBCTlgyRkNfTlVNX01BWF9TRVNTLAorCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFoYmEtPnRndF9vZmxkX2xpc3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIGFsbG9jYXRlIHRndCBvZmZsb2FkIGxpc3RcbiIpOworCQlnb3RvIHRndG9mbGRfZXJyOworCX0KKworCWhiYS0+bnVtX29mbGRfc2VzcyA9IDA7CisKKwloYmEtPmNtZF9tZ3IgPSBibngyZmNfY21kX21ncl9hbGxvYyhoYmEsIEJOWDJGQ19NSU5fWElELAorCQkJCQkJQk5YMkZDX01BWF9YSUQpOworCWlmICghaGJhLT5jbWRfbWdyKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImVtX2NvbmZpZzpibngyZmNfY21kX21ncl9hbGxvYyBmYWlsZWRcbiIpOworCQlnb3RvIGNtZ3JfZXJyOworCX0KIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmhiYS0+c2h1dGRvd25fd2FpdCk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmaGJhLT5kZXN0cm95X3dhaXQpOworCUlOSVRfTElTVF9IRUFEKCZoYmEtPnZwb3J0cyk7CiAKIAlyZXR1cm4gaGJhOworCitjbWdyX2VycjoKKwlrZnJlZShoYmEtPnRndF9vZmxkX2xpc3QpOwordGd0b2ZsZF9lcnI6CisJYm54MmZjX3VuYmluZF9wY2lkZXYoaGJhKTsKIGJpbmRfZXJyOgotCXByaW50ayhLRVJOX0VSUiBQRlggImNyZWF0ZV9pbnRlcmZhY2U6IGJpbmQgZXJyb3JcbiIpOwogCWtmcmVlKGhiYSk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgYm54MmZjX2ludGVyZmFjZV9zZXR1cChzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhLAotCQkJCSAgZW51bSBmaXBfc3RhdGUgZmlwX21vZGUpCitzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqYm54MmZjX2ludGVyZmFjZV9jcmVhdGUoc3RydWN0IGJueDJmY19oYmEgKmhiYSwKKwkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCSAgICAgIGVudW0gZmlwX3N0YXRlIGZpcF9tb2RlKQogeworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2U7CiAJaW50IHJjID0gMDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gaGJhLT5uZXRkZXY7Ci0Jc3RydWN0IGZjb2VfY3RsciAqZmlwID0gJmhiYS0+Y3RscjsKIAorCWludGVyZmFjZSA9IGt6YWxsb2Moc2l6ZW9mKCppbnRlcmZhY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWludGVyZmFjZSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gYWxsb2NhdGUgaW50ZXJmYWNlIHN0cnVjdHVyZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KIAlkZXZfaG9sZChuZXRkZXYpOwotCWtyZWZfaW5pdCgmaGJhLT5rcmVmKTsKLQotCWhiYS0+ZmxhZ3MgPSAwOworCWtyZWZfaW5pdCgmaW50ZXJmYWNlLT5rcmVmKTsKKwlpbnRlcmZhY2UtPmhiYSA9IGhiYTsKKwlpbnRlcmZhY2UtPm5ldGRldiA9IG5ldGRldjsKIAogCS8qIEluaXRpYWxpemUgRklQICovCi0JbWVtc2V0KGZpcCwgMCwgc2l6ZW9mKCpmaXApKTsKLQlmY29lX2N0bHJfaW5pdChmaXAsIGZpcF9tb2RlKTsKLQloYmEtPmN0bHIuc2VuZCA9IGJueDJmY19maXBfc2VuZDsKLQloYmEtPmN0bHIudXBkYXRlX21hYyA9IGJueDJmY191cGRhdGVfc3JjX21hYzsKLQloYmEtPmN0bHIuZ2V0X3NyY19hZGRyID0gYm54MmZjX2dldF9zcmNfbWFjOwotCXNldF9iaXQoQk5YMkZDX0NUTFJfSU5JVF9ET05FLCAmaGJhLT5pbml0X2RvbmUpOworCWZjb2VfY3Rscl9pbml0KCZpbnRlcmZhY2UtPmN0bHIsIGZpcF9tb2RlKTsKKwlpbnRlcmZhY2UtPmN0bHIuc2VuZCA9IGJueDJmY19maXBfc2VuZDsKKwlpbnRlcmZhY2UtPmN0bHIudXBkYXRlX21hYyA9IGJueDJmY191cGRhdGVfc3JjX21hYzsKKwlpbnRlcmZhY2UtPmN0bHIuZ2V0X3NyY19hZGRyID0gYm54MmZjX2dldF9zcmNfbWFjOworCXNldF9iaXQoQk5YMkZDX0NUTFJfSU5JVF9ET05FLCAmaW50ZXJmYWNlLT5pZl9mbGFncyk7CiAKLQlJTklUX0xJU1RfSEVBRCgmaGJhLT52cG9ydHMpOwotCXJjID0gYm54MmZjX25ldGRldl9zZXR1cChoYmEpOwotCWlmIChyYykKLQkJZ290byBzZXR1cF9lcnI7CisJcmMgPSBibngyZmNfbmV0ZGV2X3NldHVwKGludGVyZmFjZSk7CisJaWYgKCFyYykKKwkJcmV0dXJuIGludGVyZmFjZTsKIAotCWhiYS0+bmV4dF9jb25uX2lkID0gMDsKLQotCW1lbXNldChoYmEtPnRndF9vZmxkX2xpc3QsIDAsIHNpemVvZihoYmEtPnRndF9vZmxkX2xpc3QpKTsKLQloYmEtPm51bV9vZmxkX3Nlc3MgPSAwOwotCi0JcmV0dXJuIDA7Ci0KLXNldHVwX2VycjoKLQlmY29lX2N0bHJfZGVzdHJveSgmaGJhLT5jdGxyKTsKKwlmY29lX2N0bHJfZGVzdHJveSgmaW50ZXJmYWNlLT5jdGxyKTsKIAlkZXZfcHV0KG5ldGRldik7Ci0JYm54MmZjX2ludGVyZmFjZV9wdXQoaGJhKTsKLQlyZXR1cm4gcmM7CisJa2ZyZWUoaW50ZXJmYWNlKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAogLyoqCiAgKiBibngyZmNfaWZfY3JlYXRlIC0gQ3JlYXRlIEZDb0UgaW5zdGFuY2Ugb24gYSBnaXZlbiBpbnRlcmZhY2UKICAqCi0gKiBAaGJhOglGQ29FIGludGVyZmFjZSB0byBjcmVhdGUgYSBsb2NhbCBwb3J0IG9uCisgKiBAaW50ZXJmYWNlOglGQ29FIGludGVyZmFjZSB0byBjcmVhdGUgYSBsb2NhbCBwb3J0IG9uCiAgKiBAcGFyZW50OglEZXZpY2UgcG9pbnRlciB0byBiZSB0aGUgcGFyZW50IGluIHN5c2ZzIGZvciB0aGUgU0NTSSBob3N0CiAgKiBAbnBpdjoJSW5kaWNhdGVzIGlmIHRoZSBwb3J0IGlzIHZwb3J0IG9yIG5vdAogICoKQEAgLTEyNjQsNyArMTI3MSw3IEBACiAgKgogICogUmV0dXJuczoJQWxsb2NhdGVkIGZjX2xwb3J0IG9yIGFuIGVycm9yIHBvaW50ZXIKICAqLwotc3RhdGljIHN0cnVjdCBmY19scG9ydCAqYm54MmZjX2lmX2NyZWF0ZShzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhLAorc3RhdGljIHN0cnVjdCBmY19scG9ydCAqYm54MmZjX2lmX2NyZWF0ZShzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlLAogCQkJCSAgc3RydWN0IGRldmljZSAqcGFyZW50LCBpbnQgbnBpdikKIHsKIAlzdHJ1Y3QgZmNfbHBvcnQJCSpscG9ydCwgKm5fcG9ydDsKQEAgLTEyNzIsMTEgKzEyNzksMTIgQEAKIAlzdHJ1Y3QgU2NzaV9Ib3N0CSpzaG9zdDsKIAlzdHJ1Y3QgZmNfdnBvcnQJCSp2cG9ydCA9IGRldl90b192cG9ydChwYXJlbnQpOwogCXN0cnVjdCBibngyZmNfbHBvcnQJKmJscG9ydDsKKwlzdHJ1Y3QgYm54MmZjX2hiYQkqaGJhOwogCWludAkJCXJjID0gMDsKIAogCWJscG9ydCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBibngyZmNfbHBvcnQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJscG9ydCkgewotCQlCTlgyRkNfSEJBX0RCRyhoYmEtPmN0bHIubHAsICJVbmFibGUgdG8gYWxsb2MgYm54MmZjX2xwb3J0XG4iKTsKKwkJQk5YMkZDX0hCQV9EQkcoaW50ZXJmYWNlLT5jdGxyLmxwLCAiVW5hYmxlIHRvIGFsbG9jIGJscG9ydFxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMTI5Myw3ICsxMzAxLDcgQEAKIAlzaG9zdCA9IGxwb3J0LT5ob3N0OwogCXBvcnQgPSBscG9ydF9wcml2KGxwb3J0KTsKIAlwb3J0LT5scG9ydCA9IGxwb3J0OwotCXBvcnQtPnByaXYgPSBoYmE7CisJcG9ydC0+cHJpdiA9IGludGVyZmFjZTsKIAlJTklUX1dPUksoJnBvcnQtPmRlc3Ryb3lfd29yaywgYm54MmZjX2Rlc3Ryb3lfd29yayk7CiAKIAkvKiBDb25maWd1cmUgZmNvZV9wb3J0ICovCkBAIC0xMzE3LDcgKzEzMjUsNyBAQAogCXJjID0gYm54MmZjX3Nob3N0X2NvbmZpZyhscG9ydCwgcGFyZW50KTsKIAlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ291bGRudCBjb25maWd1cmUgc2hvc3QgZm9yICVzXG4iLAotCQkJaGJhLT5uZXRkZXYtPm5hbWUpOworCQkJaW50ZXJmYWNlLT5uZXRkZXYtPm5hbWUpOwogCQlnb3RvIGxwX2NvbmZpZ19lcnI7CiAJfQogCkBAIC0xMzQzLDggKzEzNTEsOSBAQAogCQlnb3RvIHNob3N0X2VycjsKIAl9CiAKLQlibngyZmNfaW50ZXJmYWNlX2dldChoYmEpOworCWJueDJmY19pbnRlcmZhY2VfZ2V0KGludGVyZmFjZSk7CiAKKwloYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAlzcGluX2xvY2tfYmgoJmhiYS0+aGJhX2xvY2spOwogCWJscG9ydC0+bHBvcnQgPSBscG9ydDsKIAlsaXN0X2FkZF90YWlsKCZibHBvcnQtPmxpc3QsICZoYmEtPnZwb3J0cyk7CkBAIC0xMzYxLDIxICsxMzcwLDE5IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIGJueDJmY19uZXRkZXZfY2xlYW51cChzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKQorc3RhdGljIHZvaWQgYm54MmZjX25ldGRldl9jbGVhbnVwKHN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UpCiB7CiAJLyogRG9udCBsaXN0ZW4gZm9yIEV0aGVybmV0IHBhY2tldHMgYW55bW9yZSAqLwotCV9fZGV2X3JlbW92ZV9wYWNrKCZoYmEtPmZjb2VfcGFja2V0X3R5cGUpOwotCV9fZGV2X3JlbW92ZV9wYWNrKCZoYmEtPmZpcF9wYWNrZXRfdHlwZSk7CisJX19kZXZfcmVtb3ZlX3BhY2soJmludGVyZmFjZS0+ZmNvZV9wYWNrZXRfdHlwZSk7CisJX19kZXZfcmVtb3ZlX3BhY2soJmludGVyZmFjZS0+ZmlwX3BhY2tldF90eXBlKTsKIAlzeW5jaHJvbml6ZV9uZXQoKTsKIH0KIAotc3RhdGljIHZvaWQgYm54MmZjX2lmX2Rlc3Ryb3koc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKK3N0YXRpYyB2b2lkIGJueDJmY19pZl9kZXN0cm95KHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHN0cnVjdCBibngyZmNfaGJhICpoYmEpCiB7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OwogCXN0cnVjdCBibngyZmNfbHBvcnQgKmJscG9ydCwgKnRtcDsKIAotCUJOWDJGQ19IQkFfREJHKGhiYS0+Y3Rsci5scCwgIkVOVEVSRUQgYm54MmZjX2lmX2Rlc3Ryb3lcbiIpOwogCS8qIFN0b3AgdGhlIHRyYW5zbWl0IHJldHJ5IHRpbWVyICovCiAJZGVsX3RpbWVyX3N5bmMoJnBvcnQtPnRpbWVyKTsKIApAQCAtMTQwOSw4ICsxNDE2LDYgQEAKIAogCS8qIFJlbGVhc2UgU2NzaV9Ib3N0ICovCiAJc2NzaV9ob3N0X3B1dChscG9ydC0+aG9zdCk7Ci0KLQlibngyZmNfaW50ZXJmYWNlX3B1dChoYmEpOwogfQogCiAvKioKQEAgLTE0MjUsNDYgKzE0MzAsMzEgQEAKICAqLwogc3RhdGljIGludCBibngyZmNfZGVzdHJveShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBOVUxMOwotCXN0cnVjdCBuZXRfZGV2aWNlICpwaHlzX2RldjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gTlVMTDsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhOworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CiAJaW50IHJjID0gMDsKIAogCXJ0bmxfbG9jaygpOwotCiAJbXV0ZXhfbG9jaygmYm54MmZjX2Rldl9sb2NrKTsKLQkvKiBvYnRhaW4gcGh5c2ljYWwgbmV0ZGV2ICovCi0JaWYgKG5ldGRldi0+cHJpdl9mbGFncyAmIElGRl84MDJfMVFfVkxBTikKLQkJcGh5c19kZXYgPSB2bGFuX2Rldl9yZWFsX2RldihuZXRkZXYpOwotCWVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJOb3QgYSB2bGFuIGRldmljZVxuIik7CisKKwlpbnRlcmZhY2UgPSBibngyZmNfaW50ZXJmYWNlX2xvb2t1cChuZXRkZXYpOworCWlmICghaW50ZXJmYWNlIHx8ICFpbnRlcmZhY2UtPmN0bHIubHApIHsKIAkJcmMgPSAtRU5PREVWOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJibngyZmNfZGVzdHJveTogaW50ZXJmYWNlIG9yIGxwb3J0IG5vdCBmb3VuZFxuIik7CiAJCWdvdG8gbmV0ZGV2X2VycjsKIAl9CiAKLQloYmEgPSBibngyZmNfaGJhX2xvb2t1cChwaHlzX2Rldik7Ci0JaWYgKCFoYmEgfHwgIWhiYS0+Y3Rsci5scCkgewotCQlyYyA9IC1FTk9ERVY7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggImJueDJmY19kZXN0cm95OiBoYmEgb3IgbHBvcnQgbm90IGZvdW5kXG4iKTsKLQkJZ290byBuZXRkZXZfZXJyOwotCX0KKwloYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAotCWlmICghdGVzdF9iaXQoQk5YMkZDX0NSRUFURV9ET05FLCAmaGJhLT5pbml0X2RvbmUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggImJueDJmY19kZXN0cm95OiBDcmVhdGUgbm90IGNhbGxlZFxuIik7Ci0JCWdvdG8gbmV0ZGV2X2VycjsKLQl9CisJYm54MmZjX25ldGRldl9jbGVhbnVwKGludGVyZmFjZSk7CisJbHBvcnQgPSBpbnRlcmZhY2UtPmN0bHIubHA7CisJYm54MmZjX3N0b3AoaW50ZXJmYWNlKTsKKwlsaXN0X2RlbCgmaW50ZXJmYWNlLT5saXN0KTsKKwlkZXN0cm95X3dvcmtxdWV1ZShpbnRlcmZhY2UtPnRpbWVyX3dvcmtfcXVldWUpOworCWJueDJmY19pbnRlcmZhY2VfcHV0KGludGVyZmFjZSk7CisJYm54MmZjX2lmX2Rlc3Ryb3kobHBvcnQsIGhiYSk7CiAKLQlibngyZmNfbmV0ZGV2X2NsZWFudXAoaGJhKTsKLQotCWJueDJmY19zdG9wKGhiYSk7Ci0KLQlibngyZmNfaWZfZGVzdHJveShoYmEtPmN0bHIubHApOwotCi0JZGVzdHJveV93b3JrcXVldWUoaGJhLT50aW1lcl93b3JrX3F1ZXVlKTsKLQotCWlmICh0ZXN0X2JpdChCTlgyRkNfRldfSU5JVF9ET05FLCAmaGJhLT5pbml0X2RvbmUpKQotCQlibngyZmNfZndfZGVzdHJveShoYmEpOwotCi0JY2xlYXJfYml0KEJOWDJGQ19DUkVBVEVfRE9ORSwgJmhiYS0+aW5pdF9kb25lKTsKIG5ldGRldl9lcnI6CiAJbXV0ZXhfdW5sb2NrKCZibngyZmNfZGV2X2xvY2spOwogCXJ0bmxfdW5sb2NrKCk7CkBAIC0xNDc1LDE2ICsxNDY1LDIwIEBACiB7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydDsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYTsKIAogCXBvcnQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGZjb2VfcG9ydCwgZGVzdHJveV93b3JrKTsKIAlscG9ydCA9IHBvcnQtPmxwb3J0OworCWludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAKIAlCTlgyRkNfSEJBX0RCRyhscG9ydCwgIkVudGVyZWQgYm54MmZjX2Rlc3Ryb3lfd29ya1xuIik7CiAKIAlibngyZmNfcG9ydF9zaHV0ZG93bihscG9ydCk7CiAJcnRubF9sb2NrKCk7CiAJbXV0ZXhfbG9jaygmYm54MmZjX2Rldl9sb2NrKTsKLQlibngyZmNfaWZfZGVzdHJveShscG9ydCk7CisJYm54MmZjX2lmX2Rlc3Ryb3kobHBvcnQsIGhiYSk7CiAJbXV0ZXhfdW5sb2NrKCZibngyZmNfZGV2X2xvY2spOwogCXJ0bmxfdW5sb2NrKCk7CiB9CkBAIC0xNTU2LDI4ICsxNTUwLDI3IEBACiBzdGF0aWMgdm9pZCBibngyZmNfdWxwX3N0YXJ0KHZvaWQgKmhhbmRsZSkKIHsKIAlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaGFuZGxlOwotCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBoYmEtPmN0bHIubHA7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZTsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OwogCi0JQk5YMkZDX01JU0NfREJHKCJFbnRlcmVkICVzXG4iLCBfX2Z1bmNfXyk7CiAJbXV0ZXhfbG9jaygmYm54MmZjX2Rldl9sb2NrKTsKIAotCWlmICh0ZXN0X2JpdChCTlgyRkNfRldfSU5JVF9ET05FLCAmaGJhLT5pbml0X2RvbmUpKQotCQlnb3RvIHN0YXJ0X2Rpc2M7Ci0KLQlpZiAodGVzdF9iaXQoQk5YMkZDX0NSRUFURV9ET05FLCAmaGJhLT5pbml0X2RvbmUpKQorCWlmICghdGVzdF9iaXQoQk5YMkZDX0ZMQUdfRldfSU5JVF9ET05FLCAmaGJhLT5mbGFncykpCiAJCWJueDJmY19md19pbml0KGhiYSk7CiAKLXN0YXJ0X2Rpc2M6Ci0JbXV0ZXhfdW5sb2NrKCZibngyZmNfZGV2X2xvY2spOwotCiAJQk5YMkZDX01JU0NfREJHKCJibngyZmMgc3RhcnRlZC5cbiIpOwogCi0JLyogS2ljayBvZmYgRmFicmljIGRpc2NvdmVyeSovCi0JaWYgKHRlc3RfYml0KEJOWDJGQ19DUkVBVEVfRE9ORSwgJmhiYS0+aW5pdF9kb25lKSkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bHBfaW5pdDogc3RhcnQgZGlzY292ZXJ5XG4iKTsKLQkJbHBvcnQtPnR0LmZyYW1lX3NlbmQgPSBibngyZmNfeG1pdDsKLQkJYm54MmZjX3N0YXJ0X2Rpc2MoaGJhKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGludGVyZmFjZSwgJmlmX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGludGVyZmFjZS0+aGJhID09IGhiYSkgeworCQkJbHBvcnQgPSBpbnRlcmZhY2UtPmN0bHIubHA7CisJCQkvKiBLaWNrIG9mZiBGYWJyaWMgZGlzY292ZXJ5Ki8KKwkJCXByaW50ayhLRVJOX0VSUiBQRlggInVscF9pbml0OiBzdGFydCBkaXNjb3ZlcnlcbiIpOworCQkJbHBvcnQtPnR0LmZyYW1lX3NlbmQgPSBibngyZmNfeG1pdDsKKwkJCWJueDJmY19zdGFydF9kaXNjKGludGVyZmFjZSk7CisJCX0KIAl9CisKKwltdXRleF91bmxvY2soJmJueDJmY19kZXZfbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIGJueDJmY19wb3J0X3NodXRkb3duKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCkBAIC0xNTg3LDM3ICsxNTgwLDI1IEBACiAJZmNfbHBvcnRfZGVzdHJveShscG9ydCk7CiB9CiAKLXN0YXRpYyB2b2lkIGJueDJmY19zdG9wKHN0cnVjdCBibngyZmNfaGJhICpoYmEpCitzdGF0aWMgdm9pZCBibngyZmNfc3RvcChzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlKQogewogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CiAJc3RydWN0IGZjX2xwb3J0ICp2cG9ydDsKIAotCUJOWDJGQ19NSVNDX0RCRygiRU5URVJFRCAlcyAtIGluaXRfZG9uZSA9ICVsZFxuIiwgX19mdW5jX18sCi0JCSAgIGhiYS0+aW5pdF9kb25lKTsKLQlpZiAodGVzdF9iaXQoQk5YMkZDX0ZXX0lOSVRfRE9ORSwgJmhiYS0+aW5pdF9kb25lKSAmJgotCSAgICB0ZXN0X2JpdChCTlgyRkNfQ1JFQVRFX0RPTkUsICZoYmEtPmluaXRfZG9uZSkpIHsKLQkJbHBvcnQgPSBoYmEtPmN0bHIubHA7Ci0JCWJueDJmY19wb3J0X3NodXRkb3duKGxwb3J0KTsKLQkJQk5YMkZDX0hCQV9EQkcobHBvcnQsICJibngyZmNfc3RvcDogd2FpdGluZyBmb3IgJWQgIgotCQkJCSJvZmZsb2FkZWQgc2Vzc2lvbnNcbiIsCi0JCQkJaGJhLT5udW1fb2ZsZF9zZXNzKTsKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGhiYS0+c2h1dGRvd25fd2FpdCwKLQkJCQkJIChoYmEtPm51bV9vZmxkX3Nlc3MgPT0gMCkpOwotCQltdXRleF9sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZwb3J0LCAmbHBvcnQtPnZwb3J0cywgbGlzdCkKLQkJCWZjX2hvc3RfcG9ydF90eXBlKHZwb3J0LT5ob3N0KSA9IEZDX1BPUlRUWVBFX1VOS05PV047Ci0JCW11dGV4X3VubG9jaygmbHBvcnQtPmxwX211dGV4KTsKLQkJZmNfaG9zdF9wb3J0X3R5cGUobHBvcnQtPmhvc3QpID0gRkNfUE9SVFRZUEVfVU5LTk9XTjsKLQkJZmNvZV9jdGxyX2xpbmtfZG93bigmaGJhLT5jdGxyKTsKLQkJZmNvZV9jbGVhbl9wZW5kaW5nX3F1ZXVlKGxwb3J0KTsKKwlpZiAoIXRlc3RfYml0KEJOWDJGQ19GTEFHX0ZXX0lOSVRfRE9ORSwgJmludGVyZmFjZS0+aGJhLT5mbGFncykpCisJCXJldHVybjsKIAotCQltdXRleF9sb2NrKCZoYmEtPmhiYV9tdXRleCk7Ci0JCWNsZWFyX2JpdChBREFQVEVSX1NUQVRFX1VQLCAmaGJhLT5hZGFwdGVyX3N0YXRlKTsKLQkJY2xlYXJfYml0KEFEQVBURVJfU1RBVEVfR09JTkdfRE9XTiwgJmhiYS0+YWRhcHRlcl9zdGF0ZSk7CisJbHBvcnQgPSBpbnRlcmZhY2UtPmN0bHIubHA7CisJYm54MmZjX3BvcnRfc2h1dGRvd24obHBvcnQpOwogCi0JCWNsZWFyX2JpdChBREFQVEVSX1NUQVRFX1JFQURZLCAmaGJhLT5hZGFwdGVyX3N0YXRlKTsKLQkJbXV0ZXhfdW5sb2NrKCZoYmEtPmhiYV9tdXRleCk7Ci0JfQorCW11dGV4X2xvY2soJmxwb3J0LT5scF9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2cG9ydCwgJmxwb3J0LT52cG9ydHMsIGxpc3QpCisJCWZjX2hvc3RfcG9ydF90eXBlKHZwb3J0LT5ob3N0KSA9CisJCQkJCUZDX1BPUlRUWVBFX1VOS05PV047CisJbXV0ZXhfdW5sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOworCWZjX2hvc3RfcG9ydF90eXBlKGxwb3J0LT5ob3N0KSA9IEZDX1BPUlRUWVBFX1VOS05PV047CisJZmNvZV9jdGxyX2xpbmtfZG93bigmaW50ZXJmYWNlLT5jdGxyKTsKKwlmY29lX2NsZWFuX3BlbmRpbmdfcXVldWUobHBvcnQpOwogfQogCiBzdGF0aWMgaW50IGJueDJmY19md19pbml0KHN0cnVjdCBibngyZmNfaGJhICpoYmEpCkBAIC0xNjU2LDggKzE2MzcsNyBAQAogCX0KIAogCi0JLyogTWFyayBIQkEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgRlcgSU5JVCBpcyBkb25lICovCi0Jc2V0X2JpdChCTlgyRkNfRldfSU5JVF9ET05FLCAmaGJhLT5pbml0X2RvbmUpOworCXNldF9iaXQoQk5YMkZDX0ZMQUdfRldfSU5JVF9ET05FLCAmaGJhLT5mbGFncyk7CiAJcmV0dXJuIDA7CiAKIGVycl91bmJpbmQ6CkBAIC0xNjY4LDcgKzE2NDgsNyBAQAogCiBzdGF0aWMgdm9pZCBibngyZmNfZndfZGVzdHJveShzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKQogewotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQk5YMkZDX0ZXX0lOSVRfRE9ORSwgJmhiYS0+aW5pdF9kb25lKSkgeworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQk5YMkZDX0ZMQUdfRldfSU5JVF9ET05FLCAmaGJhLT5mbGFncykpIHsKIAkJaWYgKGJueDJmY19zZW5kX2Z3X2Zjb2VfZGVzdHJveV9tc2coaGJhKSA9PSAwKSB7CiAJCQlpbml0X3RpbWVyKCZoYmEtPmRlc3Ryb3lfdGltZXIpOwogCQkJaGJhLT5kZXN0cm95X3RpbWVyLmV4cGlyZXMgPSBCTlgyRkNfRldfVElNRU9VVCArCkBAIC0xNjc3LDggKzE2NTcsOCBAQAogCQkJaGJhLT5kZXN0cm95X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyloYmE7CiAJCQlhZGRfdGltZXIoJmhiYS0+ZGVzdHJveV90aW1lcik7CiAJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaGJhLT5kZXN0cm95X3dhaXQsCi0JCQkJCQkgKGhiYS0+ZmxhZ3MgJgotCQkJCQkJICBCTlgyRkNfRkxBR19ERVNUUk9ZX0NNUEwpKTsKKwkJCQkJdGVzdF9iaXQoQk5YMkZDX0ZMQUdfREVTVFJPWV9DTVBMLAorCQkJCQkJICZoYmEtPmZsYWdzKSk7CiAJCQkvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KIAkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwpAQCAtMTY5OSw0MCArMTY3OSw1NyBAQAogICovCiBzdGF0aWMgdm9pZCBibngyZmNfdWxwX3N0b3Aodm9pZCAqaGFuZGxlKQogewotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSAoc3RydWN0IGJueDJmY19oYmEgKiloYW5kbGU7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGhhbmRsZTsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlOwogCiAJcHJpbnRrKEtFUk5fRVJSICJVTFBfU1RPUFxuIik7CiAKIAltdXRleF9sb2NrKCZibngyZmNfZGV2X2xvY2spOwotCWJueDJmY19zdG9wKGhiYSk7CisJaWYgKCF0ZXN0X2JpdChCTlgyRkNfRkxBR19GV19JTklUX0RPTkUsICZoYmEtPmZsYWdzKSkKKwkJZ290byBleGl0OworCWxpc3RfZm9yX2VhY2hfZW50cnkoaW50ZXJmYWNlLCAmaWZfbGlzdCwgbGlzdCkgeworCQlpZiAoaW50ZXJmYWNlLT5oYmEgPT0gaGJhKQorCQkJYm54MmZjX3N0b3AoaW50ZXJmYWNlKTsKKwl9CisJQlVHX09OKGhiYS0+bnVtX29mbGRfc2VzcyAhPSAwKTsKKworCW11dGV4X2xvY2soJmhiYS0+aGJhX211dGV4KTsKKwljbGVhcl9iaXQoQURBUFRFUl9TVEFURV9VUCwgJmhiYS0+YWRhcHRlcl9zdGF0ZSk7CisJY2xlYXJfYml0KEFEQVBURVJfU1RBVEVfR09JTkdfRE9XTiwKKwkJICAmaGJhLT5hZGFwdGVyX3N0YXRlKTsKKworCWNsZWFyX2JpdChBREFQVEVSX1NUQVRFX1JFQURZLCAmaGJhLT5hZGFwdGVyX3N0YXRlKTsKKwltdXRleF91bmxvY2soJmhiYS0+aGJhX211dGV4KTsKKwogCWJueDJmY19md19kZXN0cm95KGhiYSk7CitleGl0OgogCW11dGV4X3VubG9jaygmYm54MmZjX2Rldl9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgYm54MmZjX3N0YXJ0X2Rpc2Moc3RydWN0IGJueDJmY19oYmEgKmhiYSkKK3N0YXRpYyB2b2lkIGJueDJmY19zdGFydF9kaXNjKHN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UpCiB7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKIAlpbnQgd2FpdF9jbnQgPSAwOwogCiAJQk5YMkZDX01JU0NfREJHKCJFbnRlcmVkICVzXG4iLCBfX2Z1bmNfXyk7CiAJLyogS2ljayBvZmYgRklQL0ZMT0dJICovCi0JaWYgKCF0ZXN0X2JpdChCTlgyRkNfRldfSU5JVF9ET05FLCAmaGJhLT5pbml0X2RvbmUpKSB7CisJaWYgKCF0ZXN0X2JpdChCTlgyRkNfRkxBR19GV19JTklUX0RPTkUsICZpbnRlcmZhY2UtPmhiYS0+ZmxhZ3MpKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIkluaXQgbm90IGRvbmUgeWV0XG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCWxwb3J0ID0gaGJhLT5jdGxyLmxwOworCWxwb3J0ID0gaW50ZXJmYWNlLT5jdGxyLmxwOwogCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAiY2FsbGluZyBmY19mYWJyaWNfbG9naW5cbiIpOwogCiAJaWYgKCFibngyZmNfbGlua19vayhscG9ydCkpIHsKIAkJQk5YMkZDX0hCQV9EQkcobHBvcnQsICJjdGxyX2xpbmtfdXBcbiIpOwotCQlmY29lX2N0bHJfbGlua191cCgmaGJhLT5jdGxyKTsKKwkJZmNvZV9jdGxyX2xpbmtfdXAoJmludGVyZmFjZS0+Y3Rscik7CiAJCWZjX2hvc3RfcG9ydF90eXBlKGxwb3J0LT5ob3N0KSA9IEZDX1BPUlRUWVBFX05QT1JUOwotCQlzZXRfYml0KEFEQVBURVJfU1RBVEVfUkVBRFksICZoYmEtPmFkYXB0ZXJfc3RhdGUpOworCQlzZXRfYml0KEFEQVBURVJfU1RBVEVfUkVBRFksICZpbnRlcmZhY2UtPmhiYS0+YWRhcHRlcl9zdGF0ZSk7CiAJfQogCiAJLyogd2FpdCBmb3IgdGhlIEZDRiB0byBiZSBzZWxlY3RlZCBiZWZvcmUgaXNzdWluZyBGTE9HSSAqLwotCXdoaWxlICghaGJhLT5jdGxyLnNlbF9mY2YpIHsKKwl3aGlsZSAoIWludGVyZmFjZS0+Y3Rsci5zZWxfZmNmKSB7CiAJCW1zbGVlcCgyNTApOwogCQkvKiBnaXZlIHVwIGFmdGVyIDMgc2VjcyAqLwogCQlpZiAoKyt3YWl0X2NudCA+IDEyKQpAQCAtMTc1OCwxNSArMTc1NSwxNSBAQAogCiAJQk5YMkZDX01JU0NfREJHKCJFbnRlcmVkICVzXG4iLCBfX2Z1bmNfXyk7CiAJLyogYm54MmZjIHdvcmtzIG9ubHkgd2hlbiBibngyeCBpcyBsb2FkZWQgKi8KLQlpZiAoIXRlc3RfYml0KENOSUNfRl9CTlgyWF9DTEFTUywgJmRldi0+ZmxhZ3MpKSB7CisJaWYgKCF0ZXN0X2JpdChDTklDX0ZfQk5YMlhfQ0xBU1MsICZkZXYtPmZsYWdzKSB8fAorCSAgICAoZGV2LT5tYXhfZmNvZV9jb25uID09IDApKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggImJueDJmYyBGQ29FIG5vdCBzdXBwb3J0ZWQgb24gJXMsIgotCQkJCSAgICAiIGZsYWdzOiAlbHhcbiIsCi0JCQlkZXYtPm5ldGRldi0+bmFtZSwgZGV2LT5mbGFncyk7CisJCQkJICAgICIgZmxhZ3M6ICVseCBmY29lX2Nvbm46ICVkXG4iLAorCQkJZGV2LT5uZXRkZXYtPm5hbWUsIGRldi0+ZmxhZ3MsIGRldi0+bWF4X2Zjb2VfY29ubik7CiAJCXJldHVybjsKIAl9CiAKLQkvKiBDb25maWd1cmUgRkNvRSBpbnRlcmZhY2UgKi8KLQloYmEgPSBibngyZmNfaW50ZXJmYWNlX2NyZWF0ZShkZXYpOworCWhiYSA9IGJueDJmY19oYmFfY3JlYXRlKGRldik7CiAJaWYgKCFoYmEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaGJhIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAJCXJldHVybjsKQEAgLTE3NzQsNyArMTc3MSw3IEBACiAKIAkvKiBBZGQgSEJBIHRvIHRoZSBhZGFwdGVyIGxpc3QgKi8KIAltdXRleF9sb2NrKCZibngyZmNfZGV2X2xvY2spOwotCWxpc3RfYWRkX3RhaWwoJmhiYS0+bGluaywgJmFkYXB0ZXJfbGlzdCk7CisJbGlzdF9hZGRfdGFpbCgmaGJhLT5saXN0LCAmYWRhcHRlcl9saXN0KTsKIAlhZGFwdGVyX2NvdW50Kys7CiAJbXV0ZXhfdW5sb2NrKCZibngyZmNfZGV2X2xvY2spOwogCkBAIC0xNzgyLDcgKzE3NzksNyBAQAogCXJjID0gZGV2LT5yZWdpc3Rlcl9kZXZpY2UoZGV2LCBDTklDX1VMUF9GQ09FLAogCQkJCQkJKHZvaWQgKikgaGJhKTsKIAlpZiAocmMpCi0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAicmVnaXN0ZXJfZGV2aWNlIGZhaWxlZCwgcmMgPSAlZFxuIiwgcmMpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJyZWdpc3Rlcl9kZXZpY2UgZmFpbGVkLCByYyA9ICVkXG4iLCByYyk7CiAJZWxzZQogCQlzZXRfYml0KEJOWDJGQ19DTklDX1JFR0lTVEVSRUQsICZoYmEtPnJlZ193aXRoX2NuaWMpOwogfQpAQCAtMTc5MCw1MiArMTc4NywyMSBAQAogCiBzdGF0aWMgaW50IGJueDJmY19kaXNhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcGh5c19kZXY7Ci0Jc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyBkcnZpbmZvOworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2U7CiAJaW50IHJjID0gMDsKIAogCXJ0bmxfbG9jaygpOwotCiAJbXV0ZXhfbG9jaygmYm54MmZjX2Rldl9sb2NrKTsKIAotCS8qIG9idGFpbiBwaHlzaWNhbCBuZXRkZXYgKi8KLQlpZiAobmV0ZGV2LT5wcml2X2ZsYWdzICYgSUZGXzgwMl8xUV9WTEFOKQotCQlwaHlzX2RldiA9IHZsYW5fZGV2X3JlYWxfZGV2KG5ldGRldik7Ci0JZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIk5vdCBhIHZsYW4gZGV2aWNlXG4iKTsKKwlpbnRlcmZhY2UgPSBibngyZmNfaW50ZXJmYWNlX2xvb2t1cChuZXRkZXYpOworCWlmICghaW50ZXJmYWNlIHx8ICFpbnRlcmZhY2UtPmN0bHIubHApIHsKIAkJcmMgPSAtRU5PREVWOwotCQlnb3RvIG5vZGV2OwotCX0KLQotCS8qIHZlcmlmeSBpZiB0aGUgcGh5c2ljYWwgZGV2aWNlIGlzIGEgbmV0eHRyZW1lMiBkZXZpY2UgKi8KLQlpZiAocGh5c19kZXYtPmV0aHRvb2xfb3BzICYmIHBoeXNfZGV2LT5ldGh0b29sX29wcy0+Z2V0X2RydmluZm8pIHsKLQkJbWVtc2V0KCZkcnZpbmZvLCAwLCBzaXplb2YoZHJ2aW5mbykpOwotCQlwaHlzX2Rldi0+ZXRodG9vbF9vcHMtPmdldF9kcnZpbmZvKHBoeXNfZGV2LCAmZHJ2aW5mbyk7Ci0JCWlmIChzdHJjbXAoZHJ2aW5mby5kcml2ZXIsICJibngyeCIpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgUEZYICJOb3QgYSBuZXR4dHJlbWUyIGRldmljZVxuIik7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3RvIG5vZGV2OwotCQl9CisJCXByaW50ayhLRVJOX0VSUiBQRlggImJueDJmY19kaXNhYmxlOiBpbnRlcmZhY2Ugb3IgbHBvcnQgbm90IGZvdW5kXG4iKTsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gb2J0YWluIGRydl9pbmZvXG4iKTsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIG5vZGV2OworCQlmY29lX2N0bHJfbGlua19kb3duKCZpbnRlcmZhY2UtPmN0bHIpOworCQlmY29lX2NsZWFuX3BlbmRpbmdfcXVldWUoaW50ZXJmYWNlLT5jdGxyLmxwKTsKIAl9CiAKLQlwcmludGsoS0VSTl9FUlIgUEZYICJwaHlzX2RldiBpcyBuZXR4dHJlbWUyIGRldmljZVxuIik7Ci0KLQkvKiBvYnRhaW4gaGJhIGFuZCBpbml0aWFsaXplIHJlc3Qgb2YgdGhlIHN0cnVjdHVyZSAqLwotCWhiYSA9IGJueDJmY19oYmFfbG9va3VwKHBoeXNfZGV2KTsKLQlpZiAoIWhiYSB8fCAhaGJhLT5jdGxyLmxwKSB7Ci0JCXJjID0gLUVOT0RFVjsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiYm54MmZjX2Rpc2FibGU6IGhiYSBvciBscG9ydCBub3QgZm91bmRcbiIpOwotCX0gZWxzZSB7Ci0JCWZjb2VfY3Rscl9saW5rX2Rvd24oJmhiYS0+Y3Rscik7Ci0JCWZjb2VfY2xlYW5fcGVuZGluZ19xdWV1ZShoYmEtPmN0bHIubHApOwotCX0KLQotbm9kZXY6CiAJbXV0ZXhfdW5sb2NrKCZibngyZmNfZGV2X2xvY2spOwogCXJ0bmxfdW5sb2NrKCk7CiAJcmV0dXJuIHJjOwpAQCAtMTg0NCw0OCArMTgxMCwxOSBAQAogCiBzdGF0aWMgaW50IGJueDJmY19lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhOwotCXN0cnVjdCBuZXRfZGV2aWNlICpwaHlzX2RldjsKLQlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvIGRydmluZm87CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZTsKIAlpbnQgcmMgPSAwOwogCiAJcnRubF9sb2NrKCk7Ci0KLQlCTlgyRkNfTUlTQ19EQkcoIkVudGVyZWQgJXNcbiIsIF9fZnVuY19fKTsKIAltdXRleF9sb2NrKCZibngyZmNfZGV2X2xvY2spOwogCi0JLyogb2J0YWluIHBoeXNpY2FsIG5ldGRldiAqLwotCWlmIChuZXRkZXYtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4pCi0JCXBoeXNfZGV2ID0gdmxhbl9kZXZfcmVhbF9kZXYobmV0ZGV2KTsKLQllbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm90IGEgdmxhbiBkZXZpY2VcbiIpOworCWludGVyZmFjZSA9IGJueDJmY19pbnRlcmZhY2VfbG9va3VwKG5ldGRldik7CisJaWYgKCFpbnRlcmZhY2UgfHwgIWludGVyZmFjZS0+Y3Rsci5scCkgewogCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gbm9kZXY7Ci0JfQotCS8qIHZlcmlmeSBpZiB0aGUgcGh5c2ljYWwgZGV2aWNlIGlzIGEgbmV0eHRyZW1lMiBkZXZpY2UgKi8KLQlpZiAocGh5c19kZXYtPmV0aHRvb2xfb3BzICYmIHBoeXNfZGV2LT5ldGh0b29sX29wcy0+Z2V0X2RydmluZm8pIHsKLQkJbWVtc2V0KCZkcnZpbmZvLCAwLCBzaXplb2YoZHJ2aW5mbykpOwotCQlwaHlzX2Rldi0+ZXRodG9vbF9vcHMtPmdldF9kcnZpbmZvKHBoeXNfZGV2LCAmZHJ2aW5mbyk7Ci0JCWlmIChzdHJjbXAoZHJ2aW5mby5kcml2ZXIsICJibngyeCIpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgUEZYICJOb3QgYSBuZXR4dHJlbWUyIGRldmljZVxuIik7Ci0JCQlyYyA9IC1FTk9ERVY7Ci0JCQlnb3RvIG5vZGV2OwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIG9idGFpbiBkcnZfaW5mb1xuIik7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBub2RldjsKLQl9CisJCXByaW50ayhLRVJOX0VSUiBQRlggImJueDJmY19lbmFibGU6IGludGVyZmFjZSBvciBscG9ydCBub3QgZm91bmRcbiIpOworCX0gZWxzZSBpZiAoIWJueDJmY19saW5rX29rKGludGVyZmFjZS0+Y3Rsci5scCkpCisJCWZjb2VfY3Rscl9saW5rX3VwKCZpbnRlcmZhY2UtPmN0bHIpOwogCi0JLyogb2J0YWluIGhiYSBhbmQgaW5pdGlhbGl6ZSByZXN0IG9mIHRoZSBzdHJ1Y3R1cmUgKi8KLQloYmEgPSBibngyZmNfaGJhX2xvb2t1cChwaHlzX2Rldik7Ci0JaWYgKCFoYmEgfHwgIWhiYS0+Y3Rsci5scCkgewotCQlyYyA9IC1FTk9ERVY7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggImJueDJmY19lbmFibGU6IGhiYSBvciBscG9ydCBub3QgZm91bmRcbiIpOwotCX0gZWxzZSBpZiAoIWJueDJmY19saW5rX29rKGhiYS0+Y3Rsci5scCkpCi0JCWZjb2VfY3Rscl9saW5rX3VwKCZoYmEtPmN0bHIpOwotCi1ub2RldjoKIAltdXRleF91bmxvY2soJmJueDJmY19kZXZfbG9jayk7CiAJcnRubF91bmxvY2soKTsKIAlyZXR1cm4gcmM7CkBAIC0xOTAzLDYgKzE4NDAsNyBAQAogICovCiBzdGF0aWMgaW50IGJueDJmY19jcmVhdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgZW51bSBmaXBfc3RhdGUgZmlwX21vZGUpCiB7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZTsKIAlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhOwogCXN0cnVjdCBuZXRfZGV2aWNlICpwaHlzX2RldjsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OwpAQCAtMTkzOCw3ICsxODc2LDcgQEAKIAlpZiAocGh5c19kZXYtPmV0aHRvb2xfb3BzICYmIHBoeXNfZGV2LT5ldGh0b29sX29wcy0+Z2V0X2RydmluZm8pIHsKIAkJbWVtc2V0KCZkcnZpbmZvLCAwLCBzaXplb2YoZHJ2aW5mbykpOwogCQlwaHlzX2Rldi0+ZXRodG9vbF9vcHMtPmdldF9kcnZpbmZvKHBoeXNfZGV2LCAmZHJ2aW5mbyk7Ci0JCWlmIChzdHJjbXAoZHJ2aW5mby5kcml2ZXIsICJibngyeCIpKSB7CisJCWlmIChzdHJuY21wKGRydmluZm8uZHJpdmVyLCAiYm54MngiLCBzdHJsZW4oImJueDJ4IikpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgUEZYICJOb3QgYSBuZXR4dHJlbWUyIGRldmljZVxuIik7CiAJCQlyYyA9IC1FSU5WQUw7CiAJCQlnb3RvIG5ldGRldl9lcnI7CkBAIC0xOTQ5LDcgKzE4ODcsNyBAQAogCQlnb3RvIG5ldGRldl9lcnI7CiAJfQogCi0JLyogb2J0YWluIGhiYSBhbmQgaW5pdGlhbGl6ZSByZXN0IG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwkvKiBvYnRhaW4gaW50ZXJmYWNlIGFuZCBpbml0aWFsaXplIHJlc3Qgb2YgdGhlIHN0cnVjdHVyZSAqLwogCWhiYSA9IGJueDJmY19oYmFfbG9va3VwKHBoeXNfZGV2KTsKIAlpZiAoIWhiYSkgewogCQlyYyA9IC1FTk9ERVY7CkBAIC0xOTU3LDY3ICsxODk1LDYxIEBACiAJCWdvdG8gbmV0ZGV2X2VycjsKIAl9CiAKLQlpZiAoIXRlc3RfYml0KEJOWDJGQ19GV19JTklUX0RPTkUsICZoYmEtPmluaXRfZG9uZSkpIHsKLQkJcmMgPSBibngyZmNfZndfaW5pdChoYmEpOwotCQlpZiAocmMpCi0JCQlnb3RvIG5ldGRldl9lcnI7Ci0JfQotCi0JaWYgKHRlc3RfYml0KEJOWDJGQ19DUkVBVEVfRE9ORSwgJmhiYS0+aW5pdF9kb25lKSkgeworCWlmIChibngyZmNfaW50ZXJmYWNlX2xvb2t1cChuZXRkZXYpKSB7CiAJCXJjID0gLUVFWElTVDsKIAkJZ290byBuZXRkZXZfZXJyOwogCX0KIAotCS8qIHVwZGF0ZSBuZXRkZXYgd2l0aCB2bGFuIG5ldGRldiAqLwotCWhiYS0+bmV0ZGV2ID0gbmV0ZGV2OwotCWhiYS0+dmxhbl9pZCA9IHZsYW5faWQ7Ci0JaGJhLT52bGFuX2VuYWJsZWQgPSAxOwotCi0JcmMgPSBibngyZmNfaW50ZXJmYWNlX3NldHVwKGhiYSwgZmlwX21vZGUpOwotCWlmIChyYykgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJibngyZmNfaW50ZXJmYWNlX3NldHVwIGZhaWxlZFxuIik7CisJaW50ZXJmYWNlID0gYm54MmZjX2ludGVyZmFjZV9jcmVhdGUoaGJhLCBuZXRkZXYsIGZpcF9tb2RlKTsKKwlpZiAoIWludGVyZmFjZSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJibngyZmNfaW50ZXJmYWNlX2NyZWF0ZSBmYWlsZWRcbiIpOwogCQlnb3RvIGlmcHV0X2VycjsKIAl9CiAKLQloYmEtPnRpbWVyX3dvcmtfcXVldWUgPQorCWludGVyZmFjZS0+dmxhbl9pZCA9IHZsYW5faWQ7CisJaW50ZXJmYWNlLT52bGFuX2VuYWJsZWQgPSAxOworCisJaW50ZXJmYWNlLT50aW1lcl93b3JrX3F1ZXVlID0KIAkJCWNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJibngyZmNfdGltZXJfd3EiKTsKLQlpZiAoIWhiYS0+dGltZXJfd29ya19xdWV1ZSkgeworCWlmICghaW50ZXJmYWNlLT50aW1lcl93b3JrX3F1ZXVlKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggInVscF9pbml0IGNvdWxkIG5vdCBjcmVhdGUgdGltZXJfd3FcbiIpOwogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gaWZwdXRfZXJyOwogCX0KIAotCWxwb3J0ID0gYm54MmZjX2lmX2NyZWF0ZShoYmEsICZoYmEtPnBjaWRldi0+ZGV2LCAwKTsKKwlscG9ydCA9IGJueDJmY19pZl9jcmVhdGUoaW50ZXJmYWNlLCAmaW50ZXJmYWNlLT5oYmEtPnBjaWRldi0+ZGV2LCAwKTsKIAlpZiAoIWxwb3J0KSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIkZhaWxlZCB0byBjcmVhdGUgaW50ZXJmYWNlICglcylcbiIsCiAJCQluZXRkZXYtPm5hbWUpOwotCQlibngyZmNfbmV0ZGV2X2NsZWFudXAoaGJhKTsKKwkJYm54MmZjX25ldGRldl9jbGVhbnVwKGludGVyZmFjZSk7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBpZl9jcmVhdGVfZXJyOwogCX0KIAorCS8qIEFkZCBpbnRlcmZhY2UgdG8gaWZfbGlzdCAqLworCWxpc3RfYWRkX3RhaWwoJmludGVyZmFjZS0+bGlzdCwgJmlmX2xpc3QpOworCiAJbHBvcnQtPmJvb3RfdGltZSA9IGppZmZpZXM7CiAKIAkvKiBNYWtlIHRoaXMgbWFzdGVyIE5fcG9ydCAqLwotCWhiYS0+Y3Rsci5scCA9IGxwb3J0OworCWludGVyZmFjZS0+Y3Rsci5scCA9IGxwb3J0OwogCi0Jc2V0X2JpdChCTlgyRkNfQ1JFQVRFX0RPTkUsICZoYmEtPmluaXRfZG9uZSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiY3JlYXRlOiBTVEFSVCBESVNDXG4iKTsKLQlibngyZmNfc3RhcnRfZGlzYyhoYmEpOworCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAiY3JlYXRlOiBTVEFSVCBESVNDXG4iKTsKKwlibngyZmNfc3RhcnRfZGlzYyhpbnRlcmZhY2UpOwogCS8qCiAJICogUmVsZWFzZSBmcm9tIGtyZWZfaW5pdCBpbiBibngyZmNfaW50ZXJmYWNlX3NldHVwLCBvbiBzdWNjZXNzCiAJICogbHBvcnQgc2hvdWxkIGJlIGhvbGRpbmcgYSByZWZlcmVuY2UgdGFrZW4gaW4gYm54MmZjX2lmX2NyZWF0ZQogCSAqLwotCWJueDJmY19pbnRlcmZhY2VfcHV0KGhiYSk7CisJYm54MmZjX2ludGVyZmFjZV9wdXQoaW50ZXJmYWNlKTsKIAkvKiBwdXQgbmV0ZGV2IHRoYXQgd2FzIGhlbGQgd2hpbGUgY2FsbGluZyBkZXZfZ2V0X2J5X25hbWUgKi8KIAltdXRleF91bmxvY2soJmJueDJmY19kZXZfbG9jayk7CiAJcnRubF91bmxvY2soKTsKIAlyZXR1cm4gMDsKIAogaWZfY3JlYXRlX2VycjoKLQlkZXN0cm95X3dvcmtxdWV1ZShoYmEtPnRpbWVyX3dvcmtfcXVldWUpOworCWRlc3Ryb3lfd29ya3F1ZXVlKGludGVyZmFjZS0+dGltZXJfd29ya19xdWV1ZSk7CiBpZnB1dF9lcnI6Ci0JYm54MmZjX2ludGVyZmFjZV9wdXQoaGJhKTsKKwlibngyZmNfaW50ZXJmYWNlX3B1dChpbnRlcmZhY2UpOwogbmV0ZGV2X2VycjoKIAltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIG1vZF9lcnI6CkBAIC0yMDI3LDcgKzE5NTksNyBAQAogfQogCiAvKioKLSAqIGJueDJmY19maW5kX2hiYV9mb3JfY25pYyAtIG1hcHMgY25pYyBpbnN0YW5jZSB0byBibngyZmMgYWRhcHRlciBpbnN0YW5jZQorICogYm54MmZjX2ZpbmRfaGJhX2Zvcl9jbmljIC0gbWFwcyBjbmljIGluc3RhbmNlIHRvIGJueDJmYyBoYmEgaW5zdGFuY2UKICAqCiAgKiBAY25pYzoJUG9pbnRlciB0byBjbmljIGRldmljZSBpbnN0YW5jZQogICoKQEAgLTIwNDcsMTkgKzE5NzksMzAgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCBibngyZmNfaGJhICpibngyZmNfaGJhX2xvb2t1cChzdHJ1Y3QgbmV0X2RldmljZSAqcGh5c19kZXYpCitzdGF0aWMgc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmJueDJmY19pbnRlcmZhY2VfbG9va3VwKHN0cnVjdCBuZXRfZGV2aWNlCisJCQkJCQkJKm5ldGRldikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgKnRlbXA7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZTsKKworCS8qIENhbGxlZCB3aXRoIGJueDJmY19kZXZfbG9jayBoZWxkICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbnRlcmZhY2UsICZpZl9saXN0LCBsaXN0KSB7CisJCWlmIChpbnRlcmZhY2UtPm5ldGRldiA9PSBuZXRkZXYpCisJCQlyZXR1cm4gaW50ZXJmYWNlOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBibngyZmNfaGJhICpibngyZmNfaGJhX2xvb2t1cChzdHJ1Y3QgbmV0X2RldmljZQorCQkJCQkJICAgICAgKnBoeXNfZGV2KQorewogCXN0cnVjdCBibngyZmNfaGJhICpoYmE7CiAKIAkvKiBDYWxsZWQgd2l0aCBibngyZmNfZGV2X2xvY2sgaGVsZCAqLwotCWxpc3RfZm9yX2VhY2hfc2FmZShsaXN0LCB0ZW1wLCAmYWRhcHRlcl9saXN0KSB7Ci0JCWhiYSA9IChzdHJ1Y3QgYm54MmZjX2hiYSAqKWxpc3Q7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShoYmEsICZhZGFwdGVyX2xpc3QsIGxpc3QpIHsKIAkJaWYgKGhiYS0+cGh5c19kZXYgPT0gcGh5c19kZXYpCiAJCQlyZXR1cm4gaGJhOwogCX0KLQlwcmludGsoS0VSTl9FUlIgUEZYICJoYmFfbG9va3VwOiBoYmEgTlVMTFxuIik7CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiYWRhcHRlcl9sb29rdXA6IGhiYSBOVUxMXG4iKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMjA3MSw2ICsyMDE0LDggQEAKIHN0YXRpYyB2b2lkIGJueDJmY191bHBfZXhpdChzdHJ1Y3QgY25pY19kZXYgKmRldikKIHsKIAlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhOworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UsICp0bXA7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKIAogCUJOWDJGQ19NSVNDX0RCRygiRW50ZXJlZCBibngyZmNfdWxwX2V4aXRcbiIpOwogCkBAIC0yMDg5LDEzICsyMDM0LDIwIEBACiAJCXJldHVybjsKIAl9CiAKLQlsaXN0X2RlbF9pbml0KCZoYmEtPmxpbmspOworCWxpc3RfZGVsX2luaXQoJmhiYS0+bGlzdCk7CiAJYWRhcHRlcl9jb3VudC0tOwogCi0JaWYgKHRlc3RfYml0KEJOWDJGQ19DUkVBVEVfRE9ORSwgJmhiYS0+aW5pdF9kb25lKSkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpbnRlcmZhY2UsIHRtcCwgJmlmX2xpc3QsIGxpc3QpIHsKIAkJLyogZGVzdHJveSBub3QgY2FsbGVkIHlldCwgbW92ZSB0byBxdWllc2NlZCBsaXN0ICovCi0JCWJueDJmY19uZXRkZXZfY2xlYW51cChoYmEpOwotCQlibngyZmNfaWZfZGVzdHJveShoYmEtPmN0bHIubHApOworCQlpZiAoaW50ZXJmYWNlLT5oYmEgPT0gaGJhKSB7CisJCQlibngyZmNfbmV0ZGV2X2NsZWFudXAoaW50ZXJmYWNlKTsKKwkJCWJueDJmY19zdG9wKGludGVyZmFjZSk7CisKKwkJCWxpc3RfZGVsKCZpbnRlcmZhY2UtPmxpc3QpOworCQkJbHBvcnQgPSBpbnRlcmZhY2UtPmN0bHIubHA7CisJCQlibngyZmNfaW50ZXJmYWNlX3B1dChpbnRlcmZhY2UpOworCQkJYm54MmZjX2lmX2Rlc3Ryb3kobHBvcnQsIGhiYSk7CisJCX0KIAl9CiAJbXV0ZXhfdW5sb2NrKCZibngyZmNfZGV2X2xvY2spOwogCkBAIC0yMTAzLDcgKzIwNTUsNyBAQAogCS8qIHVucmVnaXN0ZXIgY25pYyBkZXZpY2UgKi8KIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJOWDJGQ19DTklDX1JFR0lTVEVSRUQsICZoYmEtPnJlZ193aXRoX2NuaWMpKQogCQloYmEtPmNuaWMtPnVucmVnaXN0ZXJfZGV2aWNlKGhiYS0+Y25pYywgQ05JQ19VTFBfRkNPRSk7Ci0JYm54MmZjX2ludGVyZmFjZV9kZXN0cm95KGhiYSk7CisJYm54MmZjX2hiYV9kZXN0cm95KGhiYSk7CiB9CiAKIC8qKgpAQCAtMjI1OSw2ICsyMjExLDcgQEAKIAl9CiAKIAlJTklUX0xJU1RfSEVBRCgmYWRhcHRlcl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaWZfbGlzdCk7CiAJbXV0ZXhfaW5pdCgmYm54MmZjX2Rldl9sb2NrKTsKIAlhZGFwdGVyX2NvdW50ID0gMDsKIApAQCAtMjMzNiwxNiArMjI4OSwxNyBAQAogCW11dGV4X3VubG9jaygmYm54MmZjX2Rldl9sb2NrKTsKIAogCS8qIFVucmVnaXN0ZXIgd2l0aCBjbmljICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhiYSwgbmV4dCwgJnRvX2JlX2RlbGV0ZWQsIGxpbmspIHsKLQkJbGlzdF9kZWxfaW5pdCgmaGJhLT5saW5rKTsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTU9EX0VYSVQ6ZGVzdHJveSBoYmEgPSAweCVwLCBrcmVmID0gJWRcbiIsCi0JCQloYmEsIGF0b21pY19yZWFkKCZoYmEtPmtyZWYucmVmY291bnQpKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaGJhLCBuZXh0LCAmdG9fYmVfZGVsZXRlZCwgbGlzdCkgeworCQlsaXN0X2RlbF9pbml0KCZoYmEtPmxpc3QpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJNT0RfRVhJVDpkZXN0cm95IGhiYSA9IDB4JXBcbiIsCisJCSAgICAgICBoYmEpOwogCQlibngyZmNfdWxwX3N0b3AoaGJhKTsKIAkJLyogdW5yZWdpc3RlciBjbmljIGRldmljZSAqLwogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJOWDJGQ19DTklDX1JFR0lTVEVSRUQsCiAJCQkJICAgICAgICZoYmEtPnJlZ193aXRoX2NuaWMpKQotCQkJaGJhLT5jbmljLT51bnJlZ2lzdGVyX2RldmljZShoYmEtPmNuaWMsIENOSUNfVUxQX0ZDT0UpOwotCQlibngyZmNfaW50ZXJmYWNlX2Rlc3Ryb3koaGJhKTsKKwkJCWhiYS0+Y25pYy0+dW5yZWdpc3Rlcl9kZXZpY2UoaGJhLT5jbmljLAorCQkJCQkJCSBDTklDX1VMUF9GQ09FKTsKKwkJYm54MmZjX2hiYV9kZXN0cm95KGhiYSk7CiAJfQogCWNuaWNfdW5yZWdpc3Rlcl9kcml2ZXIoQ05JQ19VTFBfRkNPRSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2h3aS5jIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaHdpLmMKaW5kZXggMDliZGQ5Yi4uNzJjZmIxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaHdpLmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaHdpLmMKQEAgLTIsNyArMiw3IEBACiAgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZGUgdGhhdCBsb3cgbGV2ZWwgZnVuY3Rpb25zIHRoYXQgaW50ZXJhY3QKICAqIHdpdGggNTc3MTIgRkNvRSBmaXJtd2FyZS4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggLSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggLSAyMDExIEJyb2FkY29tIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0yMyw3ICsyMyw3IEBACiAJCQkJCQlzdHJ1Y3QgZmNvZV9rY3FlICpvZmxkX2tjcWUpOwogc3RhdGljIHZvaWQgYm54MmZjX2luaXRfZmFpbHVyZShzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhLCB1MzIgZXJyX2NvZGUpOwogc3RhdGljIHZvaWQgYm54MmZjX3Byb2Nlc3NfY29ubl9kZXN0cm95X2NtcGwoc3RydWN0IGJueDJmY19oYmEgKmhiYSwKLQkJCQkJc3RydWN0IGZjb2Vfa2NxZSAqY29ubl9kZXN0cm95KTsKKwkJCQkJc3RydWN0IGZjb2Vfa2NxZSAqZGVzdHJveV9rY3FlKTsKIAogaW50IGJueDJmY19zZW5kX3N0YXRfcmVxKHN0cnVjdCBibngyZmNfaGJhICpoYmEpCiB7CkBAIC02Nyw3ICs2Nyw3IEBACiAJaW50IHJjID0gMDsKIAogCWlmICghaGJhLT5jbmljKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiaGJhLT5jbmljIE5VTEwgZHVyaW5nIGZjb2UgZncgaW5pdFxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImhiYS0+Y25pYyBOVUxMIGR1cmluZyBmY29lIGZ3IGluaXRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTEwMyw2ICsxMDMsNyBAQAogCWZjb2VfaW5pdDIuaHNpX21ham9yX3ZlcnNpb24gPSBGQ09FX0hTSV9NQUpPUl9WRVJTSU9OOwogCWZjb2VfaW5pdDIuaHNpX21pbm9yX3ZlcnNpb24gPSBGQ09FX0hTSV9NSU5PUl9WRVJTSU9OOwogCisKIAlmY29lX2luaXQyLmhhc2hfdGJsX3BibF9hZGRyX2xvID0gKHUzMikgaGJhLT5oYXNoX3RibF9wYmxfZG1hOwogCWZjb2VfaW5pdDIuaGFzaF90YmxfcGJsX2FkZHJfaGkgPSAodTMyKQogCQkJCQkgICAoKHU2NCkgaGJhLT5oYXNoX3RibF9wYmxfZG1hID4+IDMyKTsKQEAgLTE2NSw3ICsxNjYsOCBAQAogCQkJCQlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QpCiB7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IHBvcnQtPmxwb3J0OwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAlzdHJ1Y3Qga3dxZSAqa3dxZV9hcnJbNF07CiAJc3RydWN0IGZjb2Vfa3dxZV9jb25uX29mZmxvYWQxIG9mbGRfcmVxMTsKIAlzdHJ1Y3QgZmNvZV9rd3FlX2Nvbm5fb2ZmbG9hZDIgb2ZsZF9yZXEyOwpAQCAtMjI3LDcgKzIyOSw3IEBACiAJb2ZsZF9yZXEzLmhkci5mbGFncyA9CiAJCShGQ09FX0tXUUVfTEFZRVJfQ09ERSA8PCBGQ09FX0tXUUVfSEVBREVSX0xBWUVSX0NPREVfU0hJRlQpOwogCi0Jb2ZsZF9yZXEzLnZsYW5fdGFnID0gaGJhLT52bGFuX2lkIDw8CisJb2ZsZF9yZXEzLnZsYW5fdGFnID0gaW50ZXJmYWNlLT52bGFuX2lkIDw8CiAJCQkJRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfVkxBTl9JRF9TSElGVDsKIAlvZmxkX3JlcTMudmxhbl90YWcgfD0gMyA8PCBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19QUklPUklUWV9TSElGVDsKIApAQCAtMjc3LDggKzI3OSwyMCBAQAogCW9mbGRfcmVxMy5mbGFncyB8PSAoKChyZGF0YS0+c3BfZmVhdHVyZXMgJiBGQ19TUF9GVF9TRVFDKSA/IDEgOiAwKSA8PAogCQkJICAgICBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX0NPTlRfSU5DUl9TRVFfQ05UX1NISUZUKTsKIAorCS8qCisJICogSW5mbyBmcm9tIFBSTEkgcmVzcG9uc2UsIHRoaXMgaW5mbyBpcyB1c2VkIGZvciBzZXF1ZW5jZSBsZXZlbCBlcnJvcgorCSAqIHJlY292ZXJ5IHN1cHBvcnQKKwkgKi8KKwlpZiAodGd0LT5kZXZfdHlwZSA9PSBUWVBFX1RBUEUpIHsKKwkJb2ZsZF9yZXEzLmZsYWdzIHw9IDEgPDwKKwkJCQkgICAgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQl9DT05GX1JFUV9TSElGVDsKKwkJb2ZsZF9yZXEzLmZsYWdzIHw9ICgoKHJkYXRhLT5mbGFncyAmIEZDX1JQX0ZMQUdTX1JFQ19TVVBQT1JURUQpCisJCQkJICAgID8gMSA6IDApIDw8CisJCQkJICAgIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfUkVDX1ZBTElEX1NISUZUKTsKKwl9CisKIAkvKiB2bGFuIGZsYWcgKi8KLQlvZmxkX3JlcTMuZmxhZ3MgfD0gKGhiYS0+dmxhbl9lbmFibGVkIDw8CisJb2ZsZF9yZXEzLmZsYWdzIHw9IChpbnRlcmZhY2UtPnZsYW5fZW5hYmxlZCA8PAogCQkJICAgIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfVkxBTl9GTEFHX1NISUZUKTsKIAogCS8qIEMyX1ZBTElEIGFuZCBBQ0sgZmxhZ3MgYXJlIG5vdCBzZXQgYXMgdGhleSBhcmUgbm90IHN1cHBwb3J0ZWQgKi8KQEAgLTMwMCwxMiArMzE0LDEzIEBACiAJb2ZsZF9yZXE0LnNyY19tYWNfYWRkcl9taWRbMV0gPSAgcG9ydC0+ZGF0YV9zcmNfYWRkclsyXTsKIAlvZmxkX3JlcTQuc3JjX21hY19hZGRyX2hpWzBdID0gIHBvcnQtPmRhdGFfc3JjX2FkZHJbMV07CiAJb2ZsZF9yZXE0LnNyY19tYWNfYWRkcl9oaVsxXSA9ICBwb3J0LT5kYXRhX3NyY19hZGRyWzBdOwotCW9mbGRfcmVxNC5kc3RfbWFjX2FkZHJfbG9bMF0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkcls1XTsvKiBmY2YgbWFjICovCi0Jb2ZsZF9yZXE0LmRzdF9tYWNfYWRkcl9sb1sxXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzRdOwotCW9mbGRfcmVxNC5kc3RfbWFjX2FkZHJfbWlkWzBdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbM107Ci0Jb2ZsZF9yZXE0LmRzdF9tYWNfYWRkcl9taWRbMV0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkclsyXTsKLQlvZmxkX3JlcTQuZHN0X21hY19hZGRyX2hpWzBdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbMV07Ci0Jb2ZsZF9yZXE0LmRzdF9tYWNfYWRkcl9oaVsxXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzBdOworCW9mbGRfcmVxNC5kc3RfbWFjX2FkZHJfbG9bMF0gPSAgaW50ZXJmYWNlLT5jdGxyLmRlc3RfYWRkcls1XTsKKwkJCQkJCQkvKiBmY2YgbWFjICovCisJb2ZsZF9yZXE0LmRzdF9tYWNfYWRkcl9sb1sxXSA9ICBpbnRlcmZhY2UtPmN0bHIuZGVzdF9hZGRyWzRdOworCW9mbGRfcmVxNC5kc3RfbWFjX2FkZHJfbWlkWzBdID0gIGludGVyZmFjZS0+Y3Rsci5kZXN0X2FkZHJbM107CisJb2ZsZF9yZXE0LmRzdF9tYWNfYWRkcl9taWRbMV0gPSAgaW50ZXJmYWNlLT5jdGxyLmRlc3RfYWRkclsyXTsKKwlvZmxkX3JlcTQuZHN0X21hY19hZGRyX2hpWzBdID0gIGludGVyZmFjZS0+Y3Rsci5kZXN0X2FkZHJbMV07CisJb2ZsZF9yZXE0LmRzdF9tYWNfYWRkcl9oaVsxXSA9ICBpbnRlcmZhY2UtPmN0bHIuZGVzdF9hZGRyWzBdOwogCiAJb2ZsZF9yZXE0LmxjcV9hZGRyX2xvID0gKHUzMikgdGd0LT5sY3FfZG1hOwogCW9mbGRfcmVxNC5sY3FfYWRkcl9oaSA9ICh1MzIpKCh1NjQpIHRndC0+bGNxX2RtYSA+PiAzMik7CkBAIC0zMzUsNyArMzUwLDggQEAKIAkJCQkJc3RydWN0IGJueDJmY19ycG9ydCAqdGd0KQogewogCXN0cnVjdCBrd3FlICprd3FlX2FyclsyXTsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAJc3RydWN0IGZjb2Vfa3dxZV9jb25uX2VuYWJsZV9kaXNhYmxlIGVuYmxfcmVxOwogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBwb3J0LT5scG9ydDsKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gdGd0LT5ycG9ydDsKQEAgLTM1OCwxMiArMzc0LDEyIEBACiAJZW5ibF9yZXEuc3JjX21hY19hZGRyX2hpWzFdID0gIHBvcnQtPmRhdGFfc3JjX2FkZHJbMF07CiAJbWVtY3B5KHRndC0+c3JjX2FkZHIsIHBvcnQtPmRhdGFfc3JjX2FkZHIsIEVUSF9BTEVOKTsKIAotCWVuYmxfcmVxLmRzdF9tYWNfYWRkcl9sb1swXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzVdOy8qIGZjZiBtYWMgKi8KLQllbmJsX3JlcS5kc3RfbWFjX2FkZHJfbG9bMV0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkcls0XTsKLQllbmJsX3JlcS5kc3RfbWFjX2FkZHJfbWlkWzBdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbM107Ci0JZW5ibF9yZXEuZHN0X21hY19hZGRyX21pZFsxXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzJdOwotCWVuYmxfcmVxLmRzdF9tYWNfYWRkcl9oaVswXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzFdOwotCWVuYmxfcmVxLmRzdF9tYWNfYWRkcl9oaVsxXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzBdOworCWVuYmxfcmVxLmRzdF9tYWNfYWRkcl9sb1swXSA9ICBpbnRlcmZhY2UtPmN0bHIuZGVzdF9hZGRyWzVdOworCWVuYmxfcmVxLmRzdF9tYWNfYWRkcl9sb1sxXSA9ICBpbnRlcmZhY2UtPmN0bHIuZGVzdF9hZGRyWzRdOworCWVuYmxfcmVxLmRzdF9tYWNfYWRkcl9taWRbMF0gPSAgaW50ZXJmYWNlLT5jdGxyLmRlc3RfYWRkclszXTsKKwllbmJsX3JlcS5kc3RfbWFjX2FkZHJfbWlkWzFdID0gIGludGVyZmFjZS0+Y3Rsci5kZXN0X2FkZHJbMl07CisJZW5ibF9yZXEuZHN0X21hY19hZGRyX2hpWzBdID0gIGludGVyZmFjZS0+Y3Rsci5kZXN0X2FkZHJbMV07CisJZW5ibF9yZXEuZHN0X21hY19hZGRyX2hpWzFdID0gIGludGVyZmFjZS0+Y3Rsci5kZXN0X2FkZHJbMF07CiAKIAlwb3J0X2lkID0gZmNfaG9zdF9wb3J0X2lkKGxwb3J0LT5ob3N0KTsKIAlpZiAocG9ydF9pZCAhPSB0Z3QtPnNpZCkgewpAQCAtMzc5LDEwICszOTUsMTAgQEAKIAllbmJsX3JlcS5kX2lkWzBdID0gKHBvcnRfaWQgJiAweDAwMDAwMEZGKTsKIAllbmJsX3JlcS5kX2lkWzFdID0gKHBvcnRfaWQgJiAweDAwMDBGRjAwKSA+PiA4OwogCWVuYmxfcmVxLmRfaWRbMl0gPSAocG9ydF9pZCAmIDB4MDBGRjAwMDApID4+IDE2OwotCWVuYmxfcmVxLnZsYW5fdGFnID0gaGJhLT52bGFuX2lkIDw8CisJZW5ibF9yZXEudmxhbl90YWcgPSBpbnRlcmZhY2UtPnZsYW5faWQgPDwKIAkJCQlGQ09FX0tXUUVfQ09OTl9FTkFCTEVfRElTQUJMRV9WTEFOX0lEX1NISUZUOwogCWVuYmxfcmVxLnZsYW5fdGFnIHw9IDMgPDwgRkNPRV9LV1FFX0NPTk5fRU5BQkxFX0RJU0FCTEVfUFJJT1JJVFlfU0hJRlQ7Ci0JZW5ibF9yZXEudmxhbl9mbGFnID0gaGJhLT52bGFuX2VuYWJsZWQ7CisJZW5ibF9yZXEudmxhbl9mbGFnID0gaW50ZXJmYWNlLT52bGFuX2VuYWJsZWQ7CiAJZW5ibF9yZXEuY29udGV4dF9pZCA9IHRndC0+Y29udGV4dF9pZDsKIAllbmJsX3JlcS5jb25uX2lkID0gdGd0LT5mY29lX2Nvbm5faWQ7CiAKQEAgLTQwMiw3ICs0MTgsOCBAQAogaW50IGJueDJmY19zZW5kX3Nlc3Npb25fZGlzYWJsZV9yZXEoc3RydWN0IGZjb2VfcG9ydCAqcG9ydCwKIAkJCQkgICAgc3RydWN0IGJueDJmY19ycG9ydCAqdGd0KQogewotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAlzdHJ1Y3QgZmNvZV9rd3FlX2Nvbm5fZW5hYmxlX2Rpc2FibGUgZGlzYWJsZV9yZXE7CiAJc3RydWN0IGt3cWUgKmt3cWVfYXJyWzJdOwogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSB0Z3QtPnJwb3J0OwpAQCAtNDIzLDEyICs0NDAsMTIgQEAKIAlkaXNhYmxlX3JlcS5zcmNfbWFjX2FkZHJfaGlbMF0gPSAgdGd0LT5zcmNfYWRkclsxXTsKIAlkaXNhYmxlX3JlcS5zcmNfbWFjX2FkZHJfaGlbMV0gPSAgdGd0LT5zcmNfYWRkclswXTsKIAotCWRpc2FibGVfcmVxLmRzdF9tYWNfYWRkcl9sb1swXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzVdOy8qIGZjZiBtYWMgKi8KLQlkaXNhYmxlX3JlcS5kc3RfbWFjX2FkZHJfbG9bMV0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkcls0XTsKLQlkaXNhYmxlX3JlcS5kc3RfbWFjX2FkZHJfbWlkWzBdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbM107Ci0JZGlzYWJsZV9yZXEuZHN0X21hY19hZGRyX21pZFsxXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzJdOwotCWRpc2FibGVfcmVxLmRzdF9tYWNfYWRkcl9oaVswXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzFdOwotCWRpc2FibGVfcmVxLmRzdF9tYWNfYWRkcl9oaVsxXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzBdOworCWRpc2FibGVfcmVxLmRzdF9tYWNfYWRkcl9sb1swXSA9ICBpbnRlcmZhY2UtPmN0bHIuZGVzdF9hZGRyWzVdOworCWRpc2FibGVfcmVxLmRzdF9tYWNfYWRkcl9sb1sxXSA9ICBpbnRlcmZhY2UtPmN0bHIuZGVzdF9hZGRyWzRdOworCWRpc2FibGVfcmVxLmRzdF9tYWNfYWRkcl9taWRbMF0gPSAgaW50ZXJmYWNlLT5jdGxyLmRlc3RfYWRkclszXTsKKwlkaXNhYmxlX3JlcS5kc3RfbWFjX2FkZHJfbWlkWzFdID0gIGludGVyZmFjZS0+Y3Rsci5kZXN0X2FkZHJbMl07CisJZGlzYWJsZV9yZXEuZHN0X21hY19hZGRyX2hpWzBdID0gIGludGVyZmFjZS0+Y3Rsci5kZXN0X2FkZHJbMV07CisJZGlzYWJsZV9yZXEuZHN0X21hY19hZGRyX2hpWzFdID0gIGludGVyZmFjZS0+Y3Rsci5kZXN0X2FkZHJbMF07CiAKIAlwb3J0X2lkID0gdGd0LT5zaWQ7CiAJZGlzYWJsZV9yZXEuc19pZFswXSA9IChwb3J0X2lkICYgMHgwMDAwMDBGRik7CkBAIC00NDIsMTEgKzQ1OSwxMSBAQAogCWRpc2FibGVfcmVxLmRfaWRbMl0gPSAocG9ydF9pZCAmIDB4MDBGRjAwMDApID4+IDE2OwogCWRpc2FibGVfcmVxLmNvbnRleHRfaWQgPSB0Z3QtPmNvbnRleHRfaWQ7CiAJZGlzYWJsZV9yZXEuY29ubl9pZCA9IHRndC0+ZmNvZV9jb25uX2lkOwotCWRpc2FibGVfcmVxLnZsYW5fdGFnID0gaGJhLT52bGFuX2lkIDw8CisJZGlzYWJsZV9yZXEudmxhbl90YWcgPSBpbnRlcmZhY2UtPnZsYW5faWQgPDwKIAkJCQlGQ09FX0tXUUVfQ09OTl9FTkFCTEVfRElTQUJMRV9WTEFOX0lEX1NISUZUOwogCWRpc2FibGVfcmVxLnZsYW5fdGFnIHw9CiAJCQkzIDw8IEZDT0VfS1dRRV9DT05OX0VOQUJMRV9ESVNBQkxFX1BSSU9SSVRZX1NISUZUOwotCWRpc2FibGVfcmVxLnZsYW5fZmxhZyA9IGhiYS0+dmxhbl9lbmFibGVkOworCWRpc2FibGVfcmVxLnZsYW5fZmxhZyA9IGludGVyZmFjZS0+dmxhbl9lbmFibGVkOwogCiAJa3dxZV9hcnJbMF0gPSAoc3RydWN0IGt3cWUgKikgJmRpc2FibGVfcmVxOwogCkBAIC01MjUsNyArNTQyLDcgQEAKIHsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gdGd0LT5wb3J0OwogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBwb3J0LT5scG9ydDsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKIAlzdHJ1Y3QgYm54MmZjX3Vuc29sX2VscyAqdW5zb2xfZWxzOwogCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOwogCXN0cnVjdCBmY19mcmFtZSAqZnA7CkBAIC01ODYsNyArNjAzLDcgQEAKIAkJZnJfZW9mKGZwKSA9IEZDX0VPRl9UOwogCQlmcl9jcmMoZnApID0gY3B1X3RvX2xlMzIofmNyYyk7CiAJCXVuc29sX2Vscy0+bHBvcnQgPSBscG9ydDsKLQkJdW5zb2xfZWxzLT5oYmEgPSBoYmE7CisJCXVuc29sX2Vscy0+aGJhID0gaW50ZXJmYWNlLT5oYmE7CiAJCXVuc29sX2Vscy0+ZnAgPSBmcDsKIAkJSU5JVF9XT1JLKCZ1bnNvbF9lbHMtPnVuc29sX2Vsc193b3JrLCBibngyZmNfdW5zb2xfZWxzX3dvcmspOwogCQlxdWV1ZV93b3JrKGJueDJmY193cSwgJnVuc29sX2Vscy0+dW5zb2xfZWxzX3dvcmspOwpAQCAtNjA4LDkgKzYyNSwxMiBAQAogCXUzMiBmcmFtZV9sZW4sIGxlbjsKIAlzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxID0gTlVMTDsKIAlzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqdGFzaywgKnRhc2tfcGFnZTsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gdGd0LT5wb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSB0Z3QtPnBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGludGVyZmFjZS0+aGJhOwogCWludCB0YXNrX2lkeCwgaW5kZXg7CiAJaW50IHJjID0gMDsKKwl1NjQgZXJyX3dhcm5fYml0X21hcDsKKwl1OCBlcnJfd2FybiA9IDB4ZmY7CiAKIAogCUJOWDJGQ19UR1RfREJHKHRndCwgIkVudGVyZWQgVU5TT0wgQ09NUExFVElPTiB3cWUgPSAweCV4XG4iLCB3cWUpOwpAQCAtNjczLDM5ICs2OTMsNDMgQEAKIAkJQk5YMkZDX1RHVF9EQkcodGd0LCAiYnVmX29mZnNldHMgLSB0eCA9IDB4JXgsIHJ4ID0gMHgleFxuIiwKIAkJCWVycl9lbnRyeS0+ZGF0YS50eF9idWZfb2ZmLCBlcnJfZW50cnktPmRhdGEucnhfYnVmX29mZik7CiAKLQkJYm54MmZjX3JldHVybl9ycWUodGd0LCAxKTsKIAogCQlpZiAoeGlkID4gQk5YMkZDX01BWF9YSUQpIHsKIAkJCUJOWDJGQ19UR1RfREJHKHRndCwgInhpZCgweCV4KSBvdXQgb2YgRlcgcmFuZ2VcbiIsCiAJCQkJICAgeGlkKTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKLQkJCWJyZWFrOworCQkJZ290byByZXRfZXJyX3JxZTsKIAkJfQogCiAJCXRhc2tfaWR4ID0geGlkIC8gQk5YMkZDX1RBU0tTX1BFUl9QQUdFOwogCQlpbmRleCA9IHhpZCAlIEJOWDJGQ19UQVNLU19QRVJfUEFHRTsKIAkJdGFza19wYWdlID0gKHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICopCi0JCQkJCQloYmEtPnRhc2tfY3R4W3Rhc2tfaWR4XTsKKwkJCQkJaGJhLT50YXNrX2N0eFt0YXNrX2lkeF07CiAJCXRhc2sgPSAmKHRhc2tfcGFnZVtpbmRleF0pOwogCiAJCWlvX3JlcSA9IChzdHJ1Y3QgYm54MmZjX2NtZCAqKWhiYS0+Y21kX21nci0+Y21kc1t4aWRdOwotCQlpZiAoIWlvX3JlcSkgewotCQkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOwotCQkJYnJlYWs7Ci0JCX0KKwkJaWYgKCFpb19yZXEpCisJCQlnb3RvIHJldF9lcnJfcnFlOwogCiAJCWlmIChpb19yZXEtPmNtZF90eXBlICE9IEJOWDJGQ19TQ1NJX0NNRCkgewogCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZXJyX3dhcm46IE5vdCBhIFNDU0kgY21kXG4iKTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKLQkJCWJyZWFrOworCQkJZ290byByZXRfZXJyX3JxZTsKIAkJfQogCiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQk5YMkZDX0ZMQUdfSU9fQ0xFQU5VUCwKIAkJCQkgICAgICAgJmlvX3JlcS0+cmVxX2ZsYWdzKSkgewogCQkJQk5YMkZDX0lPX0RCRyhpb19yZXEsICJ1bnNvbF9lcnI6IGNsZWFudXAgaW4gIgogCQkJCQkgICAgInByb2dyZXNzLi4gaWdub3JlIHVuc29sIGVyclxuIik7Ci0JCQlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7Ci0JCQlicmVhazsKKwkJCWdvdG8gcmV0X2Vycl9ycWU7CisJCX0KKworCQllcnJfd2Fybl9iaXRfbWFwID0gKHU2NCkKKwkJCSgodTY0KWVycl9lbnRyeS0+ZGF0YS5lcnJfd2Fybl9iaXRtYXBfaGkgPDwgMzIpIHwKKwkJCSh1NjQpZXJyX2VudHJ5LT5kYXRhLmVycl93YXJuX2JpdG1hcF9sbzsKKwkJZm9yIChpID0gMDsgaSA8IEJOWDJGQ19OVU1fRVJSX0JJVFM7IGkrKykgeworCQkJaWYgKGVycl93YXJuX2JpdF9tYXAgJiAodTY0KSgodTY0KTEgPDwgaSkpIHsKKwkJCQllcnJfd2FybiA9IGk7CisJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAogCQkvKgpAQCAtNzE1LDI2ICs3MzksNjEgQEAKIAkJICogbG9nZ2luZyBvdXQgdGhlIHRhcmdldCwgd2hlbiB0aGUgQUJUUyBldmVudHVhbGx5CiAJCSAqIHRpbWVzIG91dC4KIAkJICovCi0JCWlmICghdGVzdF9hbmRfc2V0X2JpdChCTlgyRkNfRkxBR19JU1NVRV9BQlRTLAotCQkJCSAgICAgICZpb19yZXEtPnJlcV9mbGFncykpIHsKLQkJCS8qCi0JCQkgKiBDYW5jZWwgdGhlIHRpbWVvdXRfd29yaywgYXMgd2UgcmVjZWl2ZWQgSU8KLQkJCSAqIGNvbXBsZXRpb24gd2l0aCBGVyBlcnJvci4KLQkJCSAqLwotCQkJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmsoJmlvX3JlcS0+dGltZW91dF93b3JrKSkKLQkJCQlrcmVmX3B1dCgmaW9fcmVxLT5yZWZjb3VudCwKLQkJCQkJIGJueDJmY19jbWRfcmVsZWFzZSk7IC8qIHRpbWVyIGhvbGQgKi8KLQotCQkJcmMgPSBibngyZmNfaW5pdGlhdGVfYWJ0cyhpb19yZXEpOwotCQkJaWYgKHJjICE9IFNVQ0NFU1MpIHsKLQkJCQlCTlgyRkNfSU9fREJHKGlvX3JlcSwgImVycl93YXJuOiBpbml0aWF0ZV9hYnRzICIKLQkJCQkJImZhaWxlZC4gaXNzdWUgY2xlYW51cFxuIik7Ci0JCQkJcmMgPSBibngyZmNfaW5pdGlhdGVfY2xlYW51cChpb19yZXEpOwotCQkJCUJVR19PTihyYyk7Ci0JCQl9Ci0JCX0gZWxzZQorCQlpZiAodGVzdF9iaXQoQk5YMkZDX0ZMQUdfSVNTVUVfQUJUUywgJmlvX3JlcS0+cmVxX2ZsYWdzKSkgewogCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZXJyX3dhcm46IGlvX3JlcSAoMHgleCkgYWxyZWFkeSAiCiAJCQkJCSAgICAiaW4gQUJUUyBwcm9jZXNzaW5nXG4iLCB4aWQpOworCQkJZ290byByZXRfZXJyX3JxZTsKKwkJfQorCQlCTlgyRkNfVEdUX0RCRyh0Z3QsICJlcnIgPSAweCV4XG4iLCBlcnJfd2Fybik7CisJCWlmICh0Z3QtPmRldl90eXBlICE9IFRZUEVfVEFQRSkKKwkJCWdvdG8gc2tpcF9yZWM7CisJCXN3aXRjaCAoZXJyX3dhcm4pIHsKKwkJY2FzZSBGQ09FX0VSUk9SX0NPREVfUkVDX1RPVl9USU1FUl9FWFBJUkFUSU9OOgorCQljYXNlIEZDT0VfRVJST1JfQ09ERV9EQVRBX09PT19STzoKKwkJY2FzZSBGQ09FX0VSUk9SX0NPREVfQ09NTU9OX0lOQ09SUkVDVF9TRVFfQ05UOgorCQljYXNlIEZDT0VfRVJST1JfQ09ERV9EQVRBX1NPRkkzX1NFUV9BQ1RJVkVfU0VUOgorCQljYXNlIEZDT0VfRVJST1JfQ09ERV9GQ1BfUlNQX09QRU5FRF9TRVE6CisJCWNhc2UgRkNPRV9FUlJPUl9DT0RFX0RBVEFfU09GTl9TRVFfQUNUSVZFX1JFU0VUOgorCQkJQk5YMkZDX1RHVF9EQkcodGd0LCAiUkVDIFRPViBwb3BwZWQgZm9yIHhpZCAtIDB4JXhcbiIsCisJCQkJICAgeGlkKTsKKwkJCW1lbXNldCgmaW9fcmVxLT5lcnJfZW50cnksIDAsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBmY29lX2Vycl9yZXBvcnRfZW50cnkpKTsKKwkJCW1lbWNweSgmaW9fcmVxLT5lcnJfZW50cnksIGVycl9lbnRyeSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGZjb2VfZXJyX3JlcG9ydF9lbnRyeSkpOworCQkJaWYgKCF0ZXN0X2JpdChCTlgyRkNfRkxBR19TUlJfU0VOVCwKKwkJCQkgICAgICAmaW9fcmVxLT5yZXFfZmxhZ3MpKSB7CisJCQkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOworCQkJCXJjID0gYm54MmZjX3NlbmRfcmVjKGlvX3JlcSk7CisJCQkJc3Bpbl9sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKKworCQkJCWlmIChyYykKKwkJCQkJZ290byBza2lwX3JlYzsKKwkJCX0gZWxzZQorCQkJCXByaW50ayhLRVJOX0VSUiBQRlggIlNSUiBpbiBwcm9ncmVzc1xuIik7CisJCQlnb3RvIHJldF9lcnJfcnFlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCitza2lwX3JlYzoKKwkJc2V0X2JpdChCTlgyRkNfRkxBR19JU1NVRV9BQlRTLCAmaW9fcmVxLT5yZXFfZmxhZ3MpOworCQkvKgorCQkgKiBDYW5jZWwgdGhlIHRpbWVvdXRfd29yaywgYXMgd2UgcmVjZWl2ZWQgSU8KKwkJICogY29tcGxldGlvbiB3aXRoIEZXIGVycm9yLgorCQkgKi8KKwkJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmsoJmlvX3JlcS0+dGltZW91dF93b3JrKSkKKwkJCWtyZWZfcHV0KCZpb19yZXEtPnJlZmNvdW50LCBibngyZmNfY21kX3JlbGVhc2UpOworCisJCXJjID0gYm54MmZjX2luaXRpYXRlX2FidHMoaW9fcmVxKTsKKwkJaWYgKHJjICE9IFNVQ0NFU1MpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggImVycl93YXJuOiBpbml0aWF0ZV9hYnRzICIKKwkJCQkiZmFpbGVkIHhpZCA9IDB4JXguIGlzc3VlIGNsZWFudXBcbiIsCisJCQkJaW9fcmVxLT54aWQpOworCQkJYm54MmZjX2luaXRpYXRlX2NsZWFudXAoaW9fcmVxKTsKKwkJfQorcmV0X2Vycl9ycWU6CisJCWJueDJmY19yZXR1cm5fcnFlKHRndCwgMSk7CiAJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKIAkJYnJlYWs7CiAKQEAgLTc1NSw2ICs4MTQsNDcgQEAKIAkJQk5YMkZDX1RHVF9EQkcodGd0LCAiYnVmX29mZnNldHMgLSB0eCA9IDB4JXgsIHJ4ID0gMHgleCIsCiAJCQllcnJfZW50cnktPmRhdGEudHhfYnVmX29mZiwgZXJyX2VudHJ5LT5kYXRhLnJ4X2J1Zl9vZmYpOwogCisJCWlmICh4aWQgPiBCTlgyRkNfTUFYX1hJRCkgeworCQkJQk5YMkZDX1RHVF9EQkcodGd0LCAieGlkKDB4JXgpIG91dCBvZiBGVyByYW5nZVxuIiwgeGlkKTsKKwkJCWdvdG8gcmV0X3dhcm5fcnFlOworCQl9CisKKwkJZXJyX3dhcm5fYml0X21hcCA9ICh1NjQpCisJCQkoKHU2NCllcnJfZW50cnktPmRhdGEuZXJyX3dhcm5fYml0bWFwX2hpIDw8IDMyKSB8CisJCQkodTY0KWVycl9lbnRyeS0+ZGF0YS5lcnJfd2Fybl9iaXRtYXBfbG87CisJCWZvciAoaSA9IDA7IGkgPCBCTlgyRkNfTlVNX0VSUl9CSVRTOyBpKyspIHsKKwkJCWlmIChlcnJfd2Fybl9iaXRfbWFwICYgKHU2NCkgKDEgPDwgaSkpIHsKKwkJCQllcnJfd2FybiA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJQk5YMkZDX1RHVF9EQkcodGd0LCAid2FybiA9IDB4JXhcbiIsIGVycl93YXJuKTsKKworCQl0YXNrX2lkeCA9IHhpZCAvIEJOWDJGQ19UQVNLU19QRVJfUEFHRTsKKwkJaW5kZXggPSB4aWQgJSBCTlgyRkNfVEFTS1NfUEVSX1BBR0U7CisJCXRhc2tfcGFnZSA9IChzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqKQorCQkJICAgICBpbnRlcmZhY2UtPmhiYS0+dGFza19jdHhbdGFza19pZHhdOworCQl0YXNrID0gJih0YXNrX3BhZ2VbaW5kZXhdKTsKKwkJaW9fcmVxID0gKHN0cnVjdCBibngyZmNfY21kICopaGJhLT5jbWRfbWdyLT5jbWRzW3hpZF07CisJCWlmICghaW9fcmVxKQorCQkJZ290byByZXRfd2Fybl9ycWU7CisKKwkJaWYgKGlvX3JlcS0+Y21kX3R5cGUgIT0gQk5YMkZDX1NDU0lfQ01EKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJlcnJfd2FybjogTm90IGEgU0NTSSBjbWRcbiIpOworCQkJZ290byByZXRfd2Fybl9ycWU7CisJCX0KKworCQltZW1zZXQoJmlvX3JlcS0+ZXJyX2VudHJ5LCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBmY29lX2Vycl9yZXBvcnRfZW50cnkpKTsKKwkJbWVtY3B5KCZpb19yZXEtPmVycl9lbnRyeSwgZXJyX2VudHJ5LAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBmY29lX2Vycl9yZXBvcnRfZW50cnkpKTsKKworCQlpZiAoZXJyX3dhcm4gPT0gRkNPRV9FUlJPUl9DT0RFX1JFQ19UT1ZfVElNRVJfRVhQSVJBVElPTikKKwkJCS8qIFJFQ19UT1YgaXMgbm90IGEgd2FybmluZyBjb2RlICovCisJCQlCVUdfT04oMSk7CisJCWVsc2UKKwkJCUJOWDJGQ19UR1RfREJHKHRndCwgIlVuc29saWNpdGVkIHdhcm5pbmdcbiIpOworcmV0X3dhcm5fcnFlOgogCQlibngyZmNfcmV0dXJuX3JxZSh0Z3QsIDEpOwogCQlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CiAJCWJyZWFrOwpAQCAtNzcwLDcgKzg3MCw4IEBACiAJc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKnRhc2s7CiAJc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKnRhc2tfcGFnZTsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gdGd0LT5wb3J0OwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAlzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxOwogCWludCB0YXNrX2lkeCwgaW5kZXg7CiAJdTE2IHhpZDsKQEAgLTc4MSw3ICs4ODIsNyBAQAogCXNwaW5fbG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CiAJeGlkID0gd3FlICYgRkNPRV9QRU5EX1dRX0NRRV9UQVNLX0lEOwogCWlmICh4aWQgPj0gQk5YMkZDX01BWF9UQVNLUykgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggIkVSUk9SOnhpZCBvdXQgb2YgcmFuZ2VcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJFUlJPUjp4aWQgb3V0IG9mIHJhbmdlXG4iKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOwogCQlyZXR1cm47CiAJfQpAQCAtODYxLDYgKzk2MiwxMyBAQAogCQlrcmVmX3B1dCgmaW9fcmVxLT5yZWZjb3VudCwgYm54MmZjX2NtZF9yZWxlYXNlKTsKIAkJYnJlYWs7CiAKKwljYXNlIEJOWDJGQ19TRVFfQ0xFQU5VUDoKKwkJQk5YMkZDX0lPX0RCRyhpb19yZXEsICJjcV9jb21wbCgweCV4KSAtIHNlcSBjbGVhbnVwIHJlc3BcbiIsCisJCQkgICAgICBpb19yZXEtPnhpZCk7CisJCWJueDJmY19wcm9jZXNzX3NlcV9jbGVhbnVwX2NvbXBsKGlvX3JlcSwgdGFzaywgcnhfc3RhdGUpOworCQlrcmVmX3B1dCgmaW9fcmVxLT5yZWZjb3VudCwgYm54MmZjX2NtZF9yZWxlYXNlKTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9FUlIgUEZYICJJbnZhbGlkIGNtZF90eXBlICVkXG4iLCBjbWRfdHlwZSk7CiAJCWJyZWFrOwpAQCAtOTYyLDggKzEwNzAsMTAgQEAKIAkJCQkxIC0gdGd0LT5jcV9jdXJyX3RvZ2dsZV9iaXQ7CiAJCX0KIAl9Ci0JYm54MmZjX2FybV9jcSh0Z3QpOwotCWF0b21pY19hZGQobnVtX2ZyZWVfc3FlcywgJnRndC0+ZnJlZV9zcWVzKTsKKwlpZiAobnVtX2ZyZWVfc3FlcykgeworCQlibngyZmNfYXJtX2NxKHRndCk7CisJCWF0b21pY19hZGQobnVtX2ZyZWVfc3FlcywgJnRndC0+ZnJlZV9zcWVzKTsKKwl9CiAJc3Bpbl91bmxvY2tfYmgoJnRndC0+Y3FfbG9jayk7CiAJcmV0dXJuIDA7CiB9CkBAIC05ODMsNyArMTA5Myw3IEBACiAJc3RydWN0IGJueDJmY19ycG9ydCAqdGd0ID0gaGJhLT50Z3Rfb2ZsZF9saXN0W2Nvbm5faWRdOwogCiAJaWYgKCF0Z3QpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJjb25uX2lkIDB4JXggbm90IHZhbGlkXG4iLCBjb25uX2lkKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY29ubl9pZCAweCV4IG5vdCB2YWxpZFxuIiwgY29ubl9pZCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEwMDQsNiArMTExNCw3IEBACiB7CiAJc3RydWN0IGJueDJmY19ycG9ydAkJKnRndDsKIAlzdHJ1Y3QgZmNvZV9wb3J0CQkqcG9ydDsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZQkJKmludGVyZmFjZTsKIAl1MzIJCQkJY29ubl9pZDsKIAl1MzIJCQkJY29udGV4dF9pZDsKIAlpbnQJCQkJcmM7CkBAIC0xMDE4LDggKzExMjksOSBAQAogCUJOWDJGQ19UR1RfREJHKHRndCwgIkVudGVyZWQgb2ZsZCBjb21wbCAtIGNvbnRleHRfaWQgPSAweCV4XG4iLAogCQlvZmxkX2tjcWUtPmZjb2VfY29ubl9jb250ZXh0X2lkKTsKIAlwb3J0ID0gdGd0LT5wb3J0OwotCWlmIChoYmEgIT0gdGd0LT5wb3J0LT5wcml2KSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiRVJST1I6b2ZsZF9jbXBsOiBIQkEgbWlzLW1hdGNoXG4iKTsKKwlpbnRlcmZhY2UgPSB0Z3QtPnBvcnQtPnByaXY7CisJaWYgKGhiYSAhPSBpbnRlcmZhY2UtPmhiYSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJFUlJPUjpvZmxkX2NtcGw6IEhCQSBtaXMtbWF0Y2hcbiIpOwogCQlnb3RvIG9mbGRfY21wbF9lcnI7CiAJfQogCS8qCkBAIC0xMDQwLDcgKzExNTIsNyBAQAogCQkvKiBub3cgZW5hYmxlIHRoZSBzZXNzaW9uICovCiAJCXJjID0gYm54MmZjX3NlbmRfc2Vzc2lvbl9lbmFibGVfcmVxKHBvcnQsIHRndCk7CiAJCWlmIChyYykgewotCQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJlbmFibGUgc2Vzc2lvbiBmYWlsZWRcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZW5hYmxlIHNlc3Npb24gZmFpbGVkXG4iKTsKIAkJCWdvdG8gb2ZsZF9jbXBsX2VycjsKIAkJfQogCX0KQEAgLTEwNjMsNiArMTE3NSw3IEBACiAJCQkJCQlzdHJ1Y3QgZmNvZV9rY3FlICpvZmxkX2tjcWUpCiB7CiAJc3RydWN0IGJueDJmY19ycG9ydAkJKnRndDsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZQkJKmludGVyZmFjZTsKIAl1MzIJCQkJY29ubl9pZDsKIAl1MzIJCQkJY29udGV4dF9pZDsKIApAQCAtMTA3MCw3ICsxMTgzLDcgQEAKIAljb25uX2lkID0gb2ZsZF9rY3FlLT5mY29lX2Nvbm5faWQ7CiAJdGd0ID0gaGJhLT50Z3Rfb2ZsZF9saXN0W2Nvbm5faWRdOwogCWlmICghdGd0KSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiRVJST1I6ZW5ibF9jbXBsOiBObyBwZW5kaW5nIG9mbGQgcmVxXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRVJST1I6ZW5ibF9jbXBsOiBObyBwZW5kaW5nIG9mbGQgcmVxXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTA4MiwxNiArMTE5NSwxNyBAQAogCSAqIGFuZCBlbmFibGUKIAkgKi8KIAlpZiAodGd0LT5jb250ZXh0X2lkICE9IGNvbnRleHRfaWQpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJjb250ZXh0IGlkIG1pcy1tYXRjaFxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNvbnRleHQgaWQgbWlzLW1hdGNoXG4iKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAoaGJhICE9IHRndC0+cG9ydC0+cHJpdikgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggImJueDJmYy1lbmJsX2NtcGw6IEhCQSBtaXMtbWF0Y2hcbiIpOworCWludGVyZmFjZSA9IHRndC0+cG9ydC0+cHJpdjsKKwlpZiAoaGJhICE9IGludGVyZmFjZS0+aGJhKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImJueDJmYy1lbmJsX2NtcGw6IEhCQSBtaXMtbWF0Y2hcbiIpOwogCQlnb3RvIGVuYmxfY21wbF9lcnI7CiAJfQotCWlmIChvZmxkX2tjcWUtPmNvbXBsZXRpb25fc3RhdHVzKSB7CisJaWYgKG9mbGRfa2NxZS0+Y29tcGxldGlvbl9zdGF0dXMpCiAJCWdvdG8gZW5ibF9jbXBsX2VycjsKLQl9IGVsc2UgeworCWVsc2UgewogCQkvKiBlbmFibGUgc3VjY2Vzc2Z1bCAtIHJwb3J0IHJlYWR5IGZvciBpc3N1aW5nIElPcyAqLwogCQlzZXRfYml0KEJOWDJGQ19GTEFHX09GRkxPQURFRCwgJnRndC0+ZmxhZ3MpOwogCQlzZXRfYml0KEJOWDJGQ19GTEFHX09GTERfUkVRX0NNUEwsICZ0Z3QtPmZsYWdzKTsKQEAgLTExMTQsMTQgKzEyMjgsMTQgQEAKIAljb25uX2lkID0gZGlzYWJsZV9rY3FlLT5mY29lX2Nvbm5faWQ7CiAJdGd0ID0gaGJhLT50Z3Rfb2ZsZF9saXN0W2Nvbm5faWRdOwogCWlmICghdGd0KSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiRVJST1I6IGRpc2FibGVfY21wbDogTm8gZGlzYWJsZSByZXFcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJFUlJPUjogZGlzYWJsZV9jbXBsOiBObyBkaXNhYmxlIHJlcVxuIik7CiAJCXJldHVybjsKIAl9CiAKIAlCTlgyRkNfVEdUX0RCRyh0Z3QsIFBGWCAiZGlzYWJsZV9jbXBsOiBjb25uX2lkICVkXG4iLCBjb25uX2lkKTsKIAogCWlmIChkaXNhYmxlX2tjcWUtPmNvbXBsZXRpb25fc3RhdHVzKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiRVJST1I6IERpc2FibGUgZmFpbGVkIHdpdGggY21wbCBzdGF0dXMgJWRcbiIsCisJCXByaW50ayhLRVJOX0VSUiBQRlggIkRpc2FibGUgZmFpbGVkIHdpdGggY21wbCBzdGF0dXMgJWRcbiIsCiAJCQlkaXNhYmxlX2tjcWUtPmNvbXBsZXRpb25fc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0gZWxzZSB7CkBAIC0xMTQzLDE0ICsxMjU3LDE0IEBACiAJY29ubl9pZCA9IGRlc3Ryb3lfa2NxZS0+ZmNvZV9jb25uX2lkOwogCXRndCA9IGhiYS0+dGd0X29mbGRfbGlzdFtjb25uX2lkXTsKIAlpZiAoIXRndCkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggImRlc3Ryb3lfY21wbDogTm8gZGVzdHJveSByZXFcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJkZXN0cm95X2NtcGw6IE5vIGRlc3Ryb3kgcmVxXG4iKTsKIAkJcmV0dXJuOwogCX0KIAogCUJOWDJGQ19UR1RfREJHKHRndCwgImRlc3Ryb3lfY21wbDogY29ubl9pZCAlZFxuIiwgY29ubl9pZCk7CiAKIAlpZiAoZGVzdHJveV9rY3FlLT5jb21wbGV0aW9uX3N0YXR1cykgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggIkRlc3Ryb3kgY29ubiBmYWlsZWQsIGNtcGwgc3RhdHVzICVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgUEZYICJEZXN0cm95IGNvbm4gZmFpbGVkLCBjbXBsIHN0YXR1cyAlZFxuIiwKIAkJCWRlc3Ryb3lfa2NxZS0+Y29tcGxldGlvbl9zdGF0dXMpOwogCQlyZXR1cm47CiAJfSBlbHNlIHsKQEAgLTExODIsNiArMTI5Niw3IEBACiAJCWJyZWFrOwogCWNhc2UgRkNPRV9LQ1FFX0NPTVBMRVRJT05fU1RBVFVTX1dST05HX0hTSV9WRVJTSU9OOgogCQlwcmludGsoS0VSTl9FUlIgUEZYICJpbml0IGZhaWx1cmUgZHVlIHRvIEhTSSBtaXNtYXRjaFxuIik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIlVua25vd24gRXJyb3IgY29kZSAlZFxuIiwgZXJyX2NvZGUpOwogCX0KQEAgLTEyNDAsNyArMTM1NSw3IEBACiAJCQl9IGVsc2UgewogCQkJCXByaW50ayhLRVJOX0VSUiBQRlggIkRFU1RST1kgc3VjY2Vzc1xuIik7CiAJCQl9Ci0JCQloYmEtPmZsYWdzIHw9IEJOWDJGQ19GTEFHX0RFU1RST1lfQ01QTDsKKwkJCXNldF9iaXQoQk5YMkZDX0ZMQUdfREVTVFJPWV9DTVBMLCAmaGJhLT5mbGFncyk7CiAJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmhiYS0+ZGVzdHJveV93YWl0KTsKIAkJCWJyZWFrOwogCkBAIC0xMjYyLDcgKzEzNzcsNyBAQAogCQljYXNlIEZDT0VfS0NRRV9PUENPREVfRkNPRV9FUlJPUjoKIAkJCS8qIGZhbGwgdGhydSAqLwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJ1bmtub3duIG9wY29kZSAweCV4XG4iLAorCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5rbm93biBvcGNvZGUgMHgleFxuIiwKIAkJCQkJCQkJa2NxZS0+b3BfY29kZSk7CiAJCX0KIAl9CkBAIC0xMzA1LDcgKzE0MjAsOCBAQAogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSB0Z3QtPnBvcnQ7CiAJdTMyIHJlZ19vZmY7CiAJcmVzb3VyY2Vfc2l6ZV90IHJlZ19iYXNlOwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAogCXJlZ19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGhiYS0+cGNpZGV2LAogCQkJCQlCTlgyWF9ET09SQkVMTF9QQ0lfQkFSKTsKQEAgLTEzNDQsNiArMTQ2MCw5NiBAQAogCXRndC0+Y29ubl9kYi0+cnFfcHJvZCA9IHRndC0+cnFfcHJvZF9pZHg7CiB9CiAKK3ZvaWQgYm54MmZjX2luaXRfc2VxX2NsZWFudXBfdGFzayhzdHJ1Y3QgYm54MmZjX2NtZCAqc2VxX2NsbnBfcmVxLAorCQkJCSAgc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKnRhc2ssCisJCQkJICBzdHJ1Y3QgYm54MmZjX2NtZCAqb3JpZ19pb19yZXEsCisJCQkJICB1MzIgb2Zmc2V0KQoreworCXN0cnVjdCBzY3NpX2NtbmQgKnNjX2NtZCA9IG9yaWdfaW9fcmVxLT5zY19jbWQ7CisJc3RydWN0IGJueDJmY19ycG9ydCAqdGd0ID0gc2VxX2NsbnBfcmVxLT50Z3Q7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHRndC0+cG9ydC0+cHJpdjsKKwlzdHJ1Y3QgZmNvZV9iZF9jdHggKmJkID0gb3JpZ19pb19yZXEtPmJkX3RibC0+YmRfdGJsOworCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICpvcmlnX3Rhc2s7CisJc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKnRhc2tfcGFnZTsKKwlzdHJ1Y3QgZmNvZV9leHRfbXVsX3NnZXNfY3R4ICpzZ2w7CisJdTggdGFza190eXBlID0gRkNPRV9UQVNLX1RZUEVfU0VRVUVOQ0VfQ0xFQU5VUDsKKwl1OCBvcmlnX3Rhc2tfdHlwZTsKKwl1MTYgb3JpZ194aWQgPSBvcmlnX2lvX3JlcS0+eGlkOworCXUzMiBjb250ZXh0X2lkID0gdGd0LT5jb250ZXh0X2lkOworCXU2NCBwaHlzX2FkZHIgPSAodTY0KW9yaWdfaW9fcmVxLT5iZF90YmwtPmJkX3RibF9kbWE7CisJdTMyIG9yaWdfb2Zmc2V0ID0gb2Zmc2V0OworCWludCBiZF9jb3VudDsKKwlpbnQgb3JpZ190YXNrX2lkeCwgaW5kZXg7CisJaW50IGk7CisKKwltZW1zZXQodGFzaywgMCwgc2l6ZW9mKHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5KSk7CisKKwlpZiAoc2NfY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKQorCQlvcmlnX3Rhc2tfdHlwZSA9IEZDT0VfVEFTS19UWVBFX1dSSVRFOworCWVsc2UKKwkJb3JpZ190YXNrX3R5cGUgPSBGQ09FX1RBU0tfVFlQRV9SRUFEOworCisJLyogVHggZmxhZ3MgKi8KKwl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LnR4X2ZsYWdzID0KKwkJCQlGQ09FX1RBU0tfVFhfU1RBVEVfU0VRVUVOQ0VfQ0xFQU5VUCA8PAorCQkJCUZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX1RYX1NUQVRFX1NISUZUOworCS8qIGluaXQgZmxhZ3MgKi8KKwl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgPSB0YXNrX3R5cGUgPDwKKwkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9UQVNLX1RZUEVfU0hJRlQ7CisJdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzIHw9IEZDT0VfVEFTS19DTEFTU19UWVBFXzMgPDwKKwkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9DTEFTU19UWVBFX1NISUZUOworCXRhc2stPnJ4d3JfdHhyZC5jb25zdF9jdHguaW5pdF9mbGFncyA9IGNvbnRleHRfaWQgPDwKKwkJCQlGQ09FX1RDRV9SWF9XUl9UWF9SRF9DT05TVF9DSURfU0hJRlQ7CisJdGFzay0+cnh3cl90eHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzID0gY29udGV4dF9pZCA8PAorCQkJCUZDT0VfVENFX1JYX1dSX1RYX1JEX0NPTlNUX0NJRF9TSElGVDsKKworCXRhc2stPnR4d3JfcnhyZC51bmlvbl9jdHguY2xlYW51cC5jdHguY2xlYW5lZF90YXNrX2lkID0gb3JpZ194aWQ7CisKKwl0YXNrLT50eHdyX3J4cmQudW5pb25fY3R4LmNsZWFudXAuY3R4LnJvbGxlZF90eF9zZXFfY250ID0gMDsKKwl0YXNrLT50eHdyX3J4cmQudW5pb25fY3R4LmNsZWFudXAuY3R4LnJvbGxlZF90eF9kYXRhX29mZnNldCA9IG9mZnNldDsKKworCWJkX2NvdW50ID0gb3JpZ19pb19yZXEtPmJkX3RibC0+YmRfdmFsaWQ7CisKKwkvKiBvYnRhaW4gdGhlIGFwcHJvcHJpYXRlIGJkIGVudHJ5IGZyb20gcmVsYXRpdmUgb2Zmc2V0ICovCisJZm9yIChpID0gMDsgaSA8IGJkX2NvdW50OyBpKyspIHsKKwkJaWYgKG9mZnNldCA8IGJkW2ldLmJ1Zl9sZW4pCisJCQlicmVhazsKKwkJb2Zmc2V0IC09IGJkW2ldLmJ1Zl9sZW47CisJfQorCXBoeXNfYWRkciArPSAoaSAqIHNpemVvZihzdHJ1Y3QgZmNvZV9iZF9jdHgpKTsKKworCWlmIChvcmlnX3Rhc2tfdHlwZSA9PSBGQ09FX1RBU0tfVFlQRV9XUklURSkgeworCQl0YXNrLT50eHdyX29ubHkuc2dsX2N0eC5zZ2wubXVsX3NnbC5jdXJfc2dlX2FkZHIubG8gPQorCQkJCSh1MzIpcGh5c19hZGRyOworCQl0YXNrLT50eHdyX29ubHkuc2dsX2N0eC5zZ2wubXVsX3NnbC5jdXJfc2dlX2FkZHIuaGkgPQorCQkJCSh1MzIpKCh1NjQpcGh5c19hZGRyID4+IDMyKTsKKwkJdGFzay0+dHh3cl9vbmx5LnNnbF9jdHguc2dsLm11bF9zZ2wuc2dsX3NpemUgPQorCQkJCWJkX2NvdW50OworCQl0YXNrLT50eHdyX29ubHkuc2dsX2N0eC5zZ2wubXVsX3NnbC5jdXJfc2dlX29mZiA9CisJCQkJb2Zmc2V0OyAvKiBhZGp1c3RlZCBvZmZzZXQgKi8KKwkJdGFzay0+dHh3cl9vbmx5LnNnbF9jdHguc2dsLm11bF9zZ2wuY3VyX3NnZV9pZHggPSBpOworCX0gZWxzZSB7CisJCW9yaWdfdGFza19pZHggPSBvcmlnX3hpZCAvIEJOWDJGQ19UQVNLU19QRVJfUEFHRTsKKwkJaW5kZXggPSBvcmlnX3hpZCAlIEJOWDJGQ19UQVNLU19QRVJfUEFHRTsKKworCQl0YXNrX3BhZ2UgPSAoc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKikKKwkJCSAgICAgaW50ZXJmYWNlLT5oYmEtPnRhc2tfY3R4W29yaWdfdGFza19pZHhdOworCQlvcmlnX3Rhc2sgPSAmKHRhc2tfcGFnZVtpbmRleF0pOworCisJCS8qIE11bHRpcGxlIFNHRXMgd2VyZSB1c2VkIGZvciB0aGlzIElPICovCisJCXNnbCA9ICZ0YXNrLT5yeHdyX29ubHkudW5pb25fY3R4LnJlYWRfaW5mby5zZ2xfY3R4LnNnbDsKKwkJc2dsLT5tdWxfc2dsLmN1cl9zZ2VfYWRkci5sbyA9ICh1MzIpcGh5c19hZGRyOworCQlzZ2wtPm11bF9zZ2wuY3VyX3NnZV9hZGRyLmhpID0gKHUzMikoKHU2NClwaHlzX2FkZHIgPj4gMzIpOworCQlzZ2wtPm11bF9zZ2wuc2dsX3NpemUgPSBiZF9jb3VudDsKKwkJc2dsLT5tdWxfc2dsLmN1cl9zZ2Vfb2ZmID0gb2Zmc2V0OyAvKmFkanVzdGVkIG9mZnNldCAqLworCQlzZ2wtPm11bF9zZ2wuY3VyX3NnZV9pZHggPSBpOworCisJCW1lbXNldCgmdGFzay0+cnh3cl9vbmx5LnJ4X3NlcV9jdHgsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGZjb2Vfcnhfc2VxX2N0eCkpOworCQl0YXNrLT5yeHdyX29ubHkucnhfc2VxX2N0eC5sb3dfZXhwX3JvID0gb3JpZ19vZmZzZXQ7CisJCXRhc2stPnJ4d3Jfb25seS5yeF9zZXFfY3R4LmhpZ2hfZXhwX3JvID0gb3JpZ19vZmZzZXQ7CisJfQorfQogdm9pZCBibngyZmNfaW5pdF9jbGVhbnVwX3Rhc2soc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSwKIAkJCSAgICAgIHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICp0YXNrLAogCQkJICAgICAgdTE2IG9yaWdfeGlkKQpAQCAtMTM2MCw3ICsxNTY2LDEyIEBACiAJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfVEFTS19UWVBFX1NISUZUOwogCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PSBGQ09FX1RBU0tfQ0xBU1NfVFlQRV8zIDw8CiAJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfQ0xBU1NfVFlQRV9TSElGVDsKLQl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgfD0KKwlpZiAodGd0LT5kZXZfdHlwZSA9PSBUWVBFX1RBUEUpCisJCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PQorCQkJCUZDT0VfVEFTS19ERVZfVFlQRV9UQVBFIDw8CisJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfREVWX1RZUEVfU0hJRlQ7CisJZWxzZQorCQl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgfD0KIAkJCQlGQ09FX1RBU0tfREVWX1RZUEVfRElTSyA8PAogCQkJCUZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX0RFVl9UWVBFX1NISUZUOwogCXRhc2stPnR4d3JfcnhyZC51bmlvbl9jdHguY2xlYW51cC5jdHguY2xlYW5lZF90YXNrX2lkID0gb3JpZ194aWQ7CkBAIC0xNDIwLDcgKzE2MzEsMTIgQEAKIAkvKiBpbml0IGZsYWdzICovCiAJdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzID0gdGFza190eXBlIDw8CiAJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfVEFTS19UWVBFX1NISUZUOwotCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PQorCWlmICh0Z3QtPmRldl90eXBlID09IFRZUEVfVEFQRSkKKwkJdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzIHw9CisJCQkJRkNPRV9UQVNLX0RFVl9UWVBFX1RBUEUgPDwKKwkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9ERVZfVFlQRV9TSElGVDsKKwllbHNlCisJCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PQogCQkJCUZDT0VfVEFTS19ERVZfVFlQRV9ESVNLIDw8CiAJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfREVWX1RZUEVfU0hJRlQ7CiAJdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzIHw9IEZDT0VfVEFTS19DTEFTU19UWVBFXzMgPDwKQEAgLTE0NzcsNiArMTY5Myw3IEBACiAJc3RydWN0IGJueDJmY19ycG9ydCAqdGd0ID0gaW9fcmVxLT50Z3Q7CiAJc3RydWN0IGZjb2VfY2FjaGVkX3NnZV9jdHggKmNhY2hlZF9zZ2U7CiAJc3RydWN0IGZjb2VfZXh0X211bF9zZ2VzX2N0eCAqc2dsOworCWludCBkZXZfdHlwZSA9IHRndC0+ZGV2X3R5cGU7CiAJdTY0ICpmY3BfY21uZDsKIAl1NjQgdG1wX2ZjcF9jbW5kWzRdOwogCXUzMiBjb250ZXh0X2lkOwpAQCAtMTQ5NCwyMCArMTcxMSw0MCBAQAogCQl0YXNrX3R5cGUgPSBGQ09FX1RBU0tfVFlQRV9SRUFEOwogCiAJLyogVHggb25seSAqLworCWJkX2NvdW50ID0gYmRfdGJsLT5iZF92YWxpZDsKIAlpZiAodGFza190eXBlID09IEZDT0VfVEFTS19UWVBFX1dSSVRFKSB7Ci0JCXRhc2stPnR4d3Jfb25seS5zZ2xfY3R4LnNnbC5tdWxfc2dsLmN1cl9zZ2VfYWRkci5sbyA9Ci0JCQkJKHUzMiliZF90YmwtPmJkX3RibF9kbWE7Ci0JCXRhc2stPnR4d3Jfb25seS5zZ2xfY3R4LnNnbC5tdWxfc2dsLmN1cl9zZ2VfYWRkci5oaSA9Ci0JCQkJKHUzMikoKHU2NCliZF90YmwtPmJkX3RibF9kbWEgPj4gMzIpOwotCQl0YXNrLT50eHdyX29ubHkuc2dsX2N0eC5zZ2wubXVsX3NnbC5zZ2xfc2l6ZSA9Ci0JCQkJYmRfdGJsLT5iZF92YWxpZDsKKwkJaWYgKChkZXZfdHlwZSA9PSBUWVBFX0RJU0spICYmIChiZF9jb3VudCA9PSAxKSkgeworCQkJc3RydWN0IGZjb2VfYmRfY3R4ICpmY29lX2JkX3RibCA9IGJkX3RibC0+YmRfdGJsOworCisJCQl0YXNrLT50eHdyX29ubHkuc2dsX2N0eC5jYWNoZWRfc2dlLmN1cl9idWZfYWRkci5sbyA9CisJCQkJCWZjb2VfYmRfdGJsLT5idWZfYWRkcl9sbzsKKwkJCXRhc2stPnR4d3Jfb25seS5zZ2xfY3R4LmNhY2hlZF9zZ2UuY3VyX2J1Zl9hZGRyLmhpID0KKwkJCQkJZmNvZV9iZF90YmwtPmJ1Zl9hZGRyX2hpOworCQkJdGFzay0+dHh3cl9vbmx5LnNnbF9jdHguY2FjaGVkX3NnZS5jdXJfYnVmX3JlbSA9CisJCQkJCWZjb2VfYmRfdGJsLT5idWZfbGVuOworCisJCQl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgfD0gMSA8PAorCQkJCUZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX0NBQ0hFRF9TR0VfU0hJRlQ7CisJCX0gZWxzZSB7CisJCQl0YXNrLT50eHdyX29ubHkuc2dsX2N0eC5zZ2wubXVsX3NnbC5jdXJfc2dlX2FkZHIubG8gPQorCQkJCQkodTMyKWJkX3RibC0+YmRfdGJsX2RtYTsKKwkJCXRhc2stPnR4d3Jfb25seS5zZ2xfY3R4LnNnbC5tdWxfc2dsLmN1cl9zZ2VfYWRkci5oaSA9CisJCQkJCSh1MzIpKCh1NjQpYmRfdGJsLT5iZF90YmxfZG1hID4+IDMyKTsKKwkJCXRhc2stPnR4d3Jfb25seS5zZ2xfY3R4LnNnbC5tdWxfc2dsLnNnbF9zaXplID0KKwkJCQkJYmRfdGJsLT5iZF92YWxpZDsKKwkJfQogCX0KIAogCS8qVHggV3JpdGUgUnggUmVhZCAqLwogCS8qIEluaXQgc3RhdGUgdG8gTk9STUFMICovCi0JdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzID0gdGFza190eXBlIDw8CisJdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzIHw9IHRhc2tfdHlwZSA8PAogCQkJCUZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX1RBU0tfVFlQRV9TSElGVDsKLQl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgfD0KKwlpZiAoZGV2X3R5cGUgPT0gVFlQRV9UQVBFKQorCQl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgfD0KKwkJCQlGQ09FX1RBU0tfREVWX1RZUEVfVEFQRSA8PAorCQkJCUZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX0RFVl9UWVBFX1NISUZUOworCWVsc2UKKwkJdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzIHw9CiAJCQkJRkNPRV9UQVNLX0RFVl9UWVBFX0RJU0sgPDwKIAkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9ERVZfVFlQRV9TSElGVDsKIAl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgfD0gRkNPRV9UQVNLX0NMQVNTX1RZUEVfMyA8PApAQCAtMTU1MCw3ICsxNzg3LDggQEAKIAljYWNoZWRfc2dlID0gJnRhc2stPnJ4d3Jfb25seS51bmlvbl9jdHgucmVhZF9pbmZvLnNnbF9jdHguY2FjaGVkX3NnZTsKIAlzZ2wgPSAmdGFzay0+cnh3cl9vbmx5LnVuaW9uX2N0eC5yZWFkX2luZm8uc2dsX2N0eC5zZ2w7CiAJYmRfY291bnQgPSBiZF90YmwtPmJkX3ZhbGlkOwotCWlmICh0YXNrX3R5cGUgPT0gRkNPRV9UQVNLX1RZUEVfUkVBRCkgeworCWlmICh0YXNrX3R5cGUgPT0gRkNPRV9UQVNLX1RZUEVfUkVBRCAmJgorCSAgICBkZXZfdHlwZSA9PSBUWVBFX0RJU0spIHsKIAkJaWYgKGJkX2NvdW50ID09IDEpIHsKIAogCQkJc3RydWN0IGZjb2VfYmRfY3R4ICpmY29lX2JkX3RibCA9IGJkX3RibC0+YmRfdGJsOwpAQCAtMTU4Miw2ICsxODIwLDExIEBACiAJCQkJCSh1MzIpKCh1NjQpYmRfdGJsLT5iZF90YmxfZG1hID4+IDMyKTsKIAkJCXNnbC0+bXVsX3NnbC5zZ2xfc2l6ZSA9IGJkX2NvdW50OwogCQl9CisJfSBlbHNlIHsKKwkJc2dsLT5tdWxfc2dsLmN1cl9zZ2VfYWRkci5sbyA9ICh1MzIpYmRfdGJsLT5iZF90YmxfZG1hOworCQlzZ2wtPm11bF9zZ2wuY3VyX3NnZV9hZGRyLmhpID0KKwkJCQkodTMyKSgodTY0KWJkX3RibC0+YmRfdGJsX2RtYSA+PiAzMik7CisJCXNnbC0+bXVsX3NnbC5zZ2xfc2l6ZSA9IGJkX2NvdW50OwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaW8uYyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2lvLmMKaW5kZXggNDVlYmE2ZC4uNmNjMzc4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaW8uYworKysgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19pby5jCkBAIC0xLDcgKzEsNyBAQAogLyogYm54MmZjX2lvLmM6IEJyb2FkY29tIE5ldFh0cmVtZSBJSSBMaW51eCBGQ29FIG9mZmxvYWQgZHJpdmVyLgogICogSU8gbWFuYWdlciBhbmQgU0NTSSBJTyBwcm9jZXNzaW5nLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCAtIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwOCAtIDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTE4LDggKzE4LDYgQEAKIAkJCSAgIGludCBiZF9pbmRleCk7CiBzdGF0aWMgaW50IGJueDJmY19tYXBfc2coc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSk7CiBzdGF0aWMgdm9pZCBibngyZmNfYnVpbGRfYmRfbGlzdF9mcm9tX3NnKHN0cnVjdCBibngyZmNfY21kICppb19yZXEpOwotc3RhdGljIGludCBibngyZmNfcG9zdF9pb19yZXEoc3RydWN0IGJueDJmY19ycG9ydCAqdGd0LAotCQkJICAgICAgIHN0cnVjdCBibngyZmNfY21kICppb19yZXEpOwogc3RhdGljIHZvaWQgYm54MmZjX3VubWFwX3NnX2xpc3Qoc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSk7CiBzdGF0aWMgdm9pZCBibngyZmNfZnJlZV9tcF9yZXNjKHN0cnVjdCBibngyZmNfY21kICppb19yZXEpOwogc3RhdGljIHZvaWQgYm54MmZjX3BhcnNlX2ZjcF9yc3Aoc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSwKQEAgLTI5LDEwICsyNywxMSBAQAogdm9pZCBibngyZmNfY21kX3RpbWVyX3NldChzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxLAogCQkJICB1bnNpZ25lZCBpbnQgdGltZXJfbXNlYykKIHsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW9fcmVxLT5wb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBpb19yZXEtPnBvcnQtPnByaXY7CiAKLQlpZiAocXVldWVfZGVsYXllZF93b3JrKGhiYS0+dGltZXJfd29ya19xdWV1ZSwgJmlvX3JlcS0+dGltZW91dF93b3JrLAotCQkJCSAgbXNlY3NfdG9famlmZmllcyh0aW1lcl9tc2VjKSkpCisJaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayhpbnRlcmZhY2UtPnRpbWVyX3dvcmtfcXVldWUsCisJCQkgICAgICAgJmlvX3JlcS0+dGltZW91dF93b3JrLAorCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXModGltZXJfbXNlYykpKQogCQlrcmVmX2dldCgmaW9fcmVxLT5yZWZjb3VudCk7CiB9CiAKQEAgLTIxNyw2ICsyMTYsMTEgQEAKIAkJcmV0dXJuOwogCiAJQk5YMkZDX0lPX0RCRyhpb19yZXEsICJzY3NpX2RvbmUuIGVycl9jb2RlID0gMHgleFxuIiwgZXJyX2NvZGUpOworCWlmICh0ZXN0X2JpdChCTlgyRkNfRkxBR19DTURfTE9TVCwgJmlvX3JlcS0+cmVxX2ZsYWdzKSkgeworCQkvKiBEbyBub3QgY2FsbCBzY3NpIGRvbmUgZm9yIHRoaXMgSU8gKi8KKwkJcmV0dXJuOworCX0KKwogCWJueDJmY191bm1hcF9zZ19saXN0KGlvX3JlcSk7CiAJaW9fcmVxLT5zY19jbWQgPSBOVUxMOwogCWlmICghc2NfY21kKSB7CkBAIC00MTksOCArNDIzLDggQEAKIHN0cnVjdCBibngyZmNfY21kICpibngyZmNfZWxzdG1fYWxsb2Moc3RydWN0IGJueDJmY19ycG9ydCAqdGd0LCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gdGd0LT5wb3J0OwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OwotCXN0cnVjdCBibngyZmNfY21kX21nciAqY21kX21nciA9IGhiYS0+Y21kX21ncjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2NtZF9tZ3IgKmNtZF9tZ3IgPSBpbnRlcmZhY2UtPmhiYS0+Y21kX21ncjsKIAlzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxOwogCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3RwOwogCXN0cnVjdCBpb19iZHQgKmJkX3RibDsKQEAgLTQ4NSwxMSArNDg5LDEyIEBACiAJa3JlZl9pbml0KCZpb19yZXEtPnJlZmNvdW50KTsKIAlyZXR1cm4gaW9fcmVxOwogfQotc3RhdGljIHN0cnVjdCBibngyZmNfY21kICpibngyZmNfY21kX2FsbG9jKHN0cnVjdCBibngyZmNfcnBvcnQgKnRndCkKKworc3RydWN0IGJueDJmY19jbWQgKmJueDJmY19jbWRfYWxsb2Moc3RydWN0IGJueDJmY19ycG9ydCAqdGd0KQogewogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSB0Z3QtPnBvcnQ7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7Ci0Jc3RydWN0IGJueDJmY19jbWRfbWdyICpjbWRfbWdyID0gaGJhLT5jbWRfbWdyOworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfY21kX21nciAqY21kX21nciA9IGludGVyZmFjZS0+aGJhLT5jbWRfbWdyOwogCXN0cnVjdCBibngyZmNfY21kICppb19yZXE7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdHA7CiAJc3RydWN0IGlvX2JkdCAqYmRfdGJsOwpAQCAtNTcwLDcgKzU3NSw4IEBACiBzdGF0aWMgdm9pZCBibngyZmNfZnJlZV9tcF9yZXNjKHN0cnVjdCBibngyZmNfY21kICppb19yZXEpCiB7CiAJc3RydWN0IGJueDJmY19tcF9yZXEgKm1wX3JlcSA9ICYoaW9fcmVxLT5tcF9yZXEpOwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpb19yZXEtPnBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IGlvX3JlcS0+cG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAJc2l6ZV90IHN6ID0gc2l6ZW9mKHN0cnVjdCBmY29lX2JkX2N0eCk7CiAKIAkvKiBjbGVhciB0bSBmbGFncyAqLwpAQCAtNjA2LDcgKzYxMiw4IEBACiAJc3RydWN0IGJueDJmY19tcF9yZXEgKm1wX3JlcTsKIAlzdHJ1Y3QgZmNvZV9iZF9jdHggKm1wX3JlcV9iZDsKIAlzdHJ1Y3QgZmNvZV9iZF9jdHggKm1wX3Jlc3BfYmQ7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGlvX3JlcS0+cG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gaW9fcmVxLT5wb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAlkbWFfYWRkcl90IGFkZHI7CiAJc2l6ZV90IHN6OwogCkBAIC02ODIsNyArNjg5LDcgQEAKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gc3RhcmdldF90b19ycG9ydChzY3NpX3RhcmdldChzY19jbWQtPmRldmljZSkpOwogCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpycCA9IHJwb3J0LT5kZF9kYXRhOwogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQ7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYTsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlOwogCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndDsKIAlzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxOwogCXN0cnVjdCBibngyZmNfbXBfcmVxICp0bV9yZXE7CkBAIC02OTksMTAgKzcwNiwxMCBAQAogCiAJbHBvcnQgPSBzaG9zdF9wcml2KGhvc3QpOwogCXBvcnQgPSBscG9ydF9wcml2KGxwb3J0KTsKLQloYmEgPSBwb3J0LT5wcml2OworCWludGVyZmFjZSA9IHBvcnQtPnByaXY7CiAKIAlpZiAocnBvcnQgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggImRldmljZV9yZXNldDogcnBvcnQgaXMgTlVMTFxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImRldmljZV9yZXNldDogcnBvcnQgaXMgTlVMTFxuIik7CiAJCXJjID0gRkFJTEVEOwogCQlnb3RvIHRtZl9lcnI7CiAJfQpAQCAtNzQ1LDcgKzc1Miw5IEBACiAJcmMgPSBibngyZmNfaW5pdF9tcF9yZXEoaW9fcmVxKTsKIAlpZiAocmMgPT0gRkFJTEVEKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIlRhc2sgbWdtdCBNUCByZXF1ZXN0IGluaXQgZmFpbGVkXG4iKTsKKwkJc3Bpbl9sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKIAkJa3JlZl9wdXQoJmlvX3JlcS0+cmVmY291bnQsIGJueDJmY19jbWRfcmVsZWFzZSk7CisJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKIAkJZ290byB0bWZfZXJyOwogCX0KIApAQCAtNzc0LDcgKzc4Myw4IEBACiAJaW5kZXggPSB4aWQgJSBCTlgyRkNfVEFTS1NfUEVSX1BBR0U7CiAKIAkvKiBJbml0aWFsaXplIHRhc2sgY29udGV4dCBmb3IgdGhpcyBJTyByZXF1ZXN0ICovCi0JdGFza19wYWdlID0gKHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICopIGhiYS0+dGFza19jdHhbdGFza19pZHhdOworCXRhc2tfcGFnZSA9IChzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqKQorCQkJaW50ZXJmYWNlLT5oYmEtPnRhc2tfY3R4W3Rhc2tfaWR4XTsKIAl0YXNrID0gJih0YXNrX3BhZ2VbaW5kZXhdKTsKIAlibngyZmNfaW5pdF9tcF90YXNrKGlvX3JlcSwgdGFzayk7CiAKQEAgLTgwNiwxMCArODE2LDEwIEBACiAJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOwogCiAJaWYgKCFyYykgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJ0YXNrIG1nbXQgY29tbWFuZCBmYWlsZWQuLi5cbiIpOworCQlCTlgyRkNfVEdUX0RCRyh0Z3QsICJ0YXNrIG1nbXQgY29tbWFuZCBmYWlsZWQuLi5cbiIpOwogCQlyYyA9IEZBSUxFRDsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJ0YXNrIG1nbXQgY29tbWFuZCBzdWNjZXNzLi4uXG4iKTsKKwkJQk5YMkZDX1RHVF9EQkcodGd0LCAidGFzayBtZ210IGNvbW1hbmQgc3VjY2Vzcy4uLlxuIik7CiAJCXJjID0gU1VDQ0VTUzsKIAl9CiB0bWZfZXJyOgpAQCAtODIyLDcgKzgzMiw3IEBACiAJc3RydWN0IGJueDJmY19ycG9ydCAqdGd0ID0gaW9fcmVxLT50Z3Q7CiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHRndC0+cnBvcnQ7CiAJc3RydWN0IGZjX3Jwb3J0X3ByaXYgKnJkYXRhID0gdGd0LT5yZGF0YTsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhOworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2U7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydDsKIAlzdHJ1Y3QgYm54MmZjX2NtZCAqYWJ0c19pb19yZXE7CiAJc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKnRhc2s7CkBAIC04MzksNyArODQ5LDcgQEAKIAlCTlgyRkNfSU9fREJHKGlvX3JlcSwgIkVudGVyZWQgYm54MmZjX2luaXRpYXRlX2FidHNcbiIpOwogCiAJcG9ydCA9IGlvX3JlcS0+cG9ydDsKLQloYmEgPSBwb3J0LT5wcml2OworCWludGVyZmFjZSA9IHBvcnQtPnByaXY7CiAJbHBvcnQgPSBwb3J0LT5scG9ydDsKIAogCWlmICghdGVzdF9iaXQoQk5YMkZDX0ZMQUdfU0VTU0lPTl9SRUFEWSwgJnRndC0+ZmxhZ3MpKSB7CkBAIC04NDksNyArODU5LDcgQEAKIAl9CiAKIAlpZiAocnBvcnQgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggImluaXRpYXRlX2FidHM6IHJwb3J0IGlzIE5VTExcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJpbml0aWF0ZV9hYnRzOiBycG9ydCBpcyBOVUxMXG4iKTsKIAkJcmMgPSBGQUlMRUQ7CiAJCWdvdG8gYWJ0c19lcnI7CiAJfQpAQCAtODk2LDcgKzkwNiw4IEBACiAJaW5kZXggPSB4aWQgJSBCTlgyRkNfVEFTS1NfUEVSX1BBR0U7CiAKIAkvKiBJbml0aWFsaXplIHRhc2sgY29udGV4dCBmb3IgdGhpcyBJTyByZXF1ZXN0ICovCi0JdGFza19wYWdlID0gKHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICopIGhiYS0+dGFza19jdHhbdGFza19pZHhdOworCXRhc2tfcGFnZSA9IChzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqKQorCQkJaW50ZXJmYWNlLT5oYmEtPnRhc2tfY3R4W3Rhc2tfaWR4XTsKIAl0YXNrID0gJih0YXNrX3BhZ2VbaW5kZXhdKTsKIAlibngyZmNfaW5pdF9tcF90YXNrKGFidHNfaW9fcmVxLCB0YXNrKTsKIApAQCAtOTI0LDExICs5MzUsODEgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK2ludCBibngyZmNfaW5pdGlhdGVfc2VxX2NsZWFudXAoc3RydWN0IGJueDJmY19jbWQgKm9yaWdfaW9fcmVxLCB1MzIgb2Zmc2V0LAorCQkJCWVudW0gZmNfcmN0bCByX2N0bCkKK3sKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OworCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndCA9IG9yaWdfaW9fcmVxLT50Z3Q7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZTsKKwlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0OworCXN0cnVjdCBibngyZmNfY21kICpzZXFfY2xucF9yZXE7CisJc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKnRhc2s7CisJc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKnRhc2tfcGFnZTsKKwlzdHJ1Y3QgYm54MmZjX2Vsc19jYl9hcmcgKmNiX2FyZyA9IE5VTEw7CisJaW50IHRhc2tfaWR4LCBpbmRleDsKKwl1MTYgeGlkOworCWludCByYyA9IDA7CisKKwlCTlgyRkNfSU9fREJHKG9yaWdfaW9fcmVxLCAiYm54MmZjX2luaXRpYXRlX3NlcV9jbGVhbnVwIHhpZCA9IDB4JXhcbiIsCisJCSAgIG9yaWdfaW9fcmVxLT54aWQpOworCWtyZWZfZ2V0KCZvcmlnX2lvX3JlcS0+cmVmY291bnQpOworCisJcG9ydCA9IG9yaWdfaW9fcmVxLT5wb3J0OworCWludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJbHBvcnQgPSBwb3J0LT5scG9ydDsKKworCWNiX2FyZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBibngyZmNfZWxzX2NiX2FyZyksIEdGUF9BVE9NSUMpOworCWlmICghY2JfYXJnKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBhbGxvYyBjYl9hcmcgZm9yIHNlcSBjbG51cFxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBjbGVhbnVwX2VycjsKKwl9CisKKwlzZXFfY2xucF9yZXEgPSBibngyZmNfZWxzdG1fYWxsb2ModGd0LCBCTlgyRkNfU0VRX0NMRUFOVVApOworCWlmICghc2VxX2NsbnBfcmVxKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNsZWFudXA6IGNvdWxkbnQgYWxsb2NhdGUgY21kXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlrZnJlZShjYl9hcmcpOworCQlnb3RvIGNsZWFudXBfZXJyOworCX0KKwkvKiBJbml0aWFsaXplIHJlc3Qgb2YgaW9fcmVxIGZpZWxkcyAqLworCXNlcV9jbG5wX3JlcS0+c2NfY21kID0gTlVMTDsKKwlzZXFfY2xucF9yZXEtPnBvcnQgPSBwb3J0OworCXNlcV9jbG5wX3JlcS0+dGd0ID0gdGd0OworCXNlcV9jbG5wX3JlcS0+ZGF0YV94ZmVyX2xlbiA9IDA7IC8qIE5vIGRhdGEgdHJhbnNmZXIgZm9yIGNsZWFudXAgKi8KKworCXhpZCA9IHNlcV9jbG5wX3JlcS0+eGlkOworCisJdGFza19pZHggPSB4aWQvQk5YMkZDX1RBU0tTX1BFUl9QQUdFOworCWluZGV4ID0geGlkICUgQk5YMkZDX1RBU0tTX1BFUl9QQUdFOworCisJLyogSW5pdGlhbGl6ZSB0YXNrIGNvbnRleHQgZm9yIHRoaXMgSU8gcmVxdWVzdCAqLworCXRhc2tfcGFnZSA9IChzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqKQorCQkgICAgIGludGVyZmFjZS0+aGJhLT50YXNrX2N0eFt0YXNrX2lkeF07CisJdGFzayA9ICYodGFza19wYWdlW2luZGV4XSk7CisJY2JfYXJnLT5hYm9ydGVkX2lvX3JlcSA9IG9yaWdfaW9fcmVxOworCWNiX2FyZy0+aW9fcmVxID0gc2VxX2NsbnBfcmVxOworCWNiX2FyZy0+cl9jdGwgPSByX2N0bDsKKwljYl9hcmctPm9mZnNldCA9IG9mZnNldDsKKwlzZXFfY2xucF9yZXEtPmNiX2FyZyA9IGNiX2FyZzsKKworCXByaW50ayhLRVJOX0VSUiBQRlggImNhbGwgaW5pdF9zZXFfY2xlYW51cF90YXNrXG4iKTsKKwlibngyZmNfaW5pdF9zZXFfY2xlYW51cF90YXNrKHNlcV9jbG5wX3JlcSwgdGFzaywgb3JpZ19pb19yZXEsIG9mZnNldCk7CisKKwkvKiBPYnRhaW4gZnJlZSBTUSBlbnRyeSAqLworCWJueDJmY19hZGRfMl9zcSh0Z3QsIHhpZCk7CisKKwkvKiBSaW5nIGRvb3JiZWxsICovCisJYm54MmZjX3JpbmdfZG9vcmJlbGwodGd0KTsKK2NsZWFudXBfZXJyOgorCXJldHVybiByYzsKK30KKwogaW50IGJueDJmY19pbml0aWF0ZV9jbGVhbnVwKHN0cnVjdCBibngyZmNfY21kICppb19yZXEpCiB7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKIAlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QgPSBpb19yZXEtPnRndDsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhOworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2U7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydDsKIAlzdHJ1Y3QgYm54MmZjX2NtZCAqY2xlYW51cF9pb19yZXE7CiAJc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKnRhc2s7CkBAIC05NDEsNyArMTAyMiw3IEBACiAJQk5YMkZDX0lPX0RCRyhpb19yZXEsICJFbnRlcmVkIGJueDJmY19pbml0aWF0ZV9jbGVhbnVwXG4iKTsKIAogCXBvcnQgPSBpb19yZXEtPnBvcnQ7Ci0JaGJhID0gcG9ydC0+cHJpdjsKKwlpbnRlcmZhY2UgPSBwb3J0LT5wcml2OwogCWxwb3J0ID0gcG9ydC0+bHBvcnQ7CiAKIAljbGVhbnVwX2lvX3JlcSA9IGJueDJmY19lbHN0bV9hbGxvYyh0Z3QsIEJOWDJGQ19DTEVBTlVQKTsKQEAgLTk2Myw3ICsxMDQ0LDggQEAKIAlpbmRleCA9IHhpZCAlIEJOWDJGQ19UQVNLU19QRVJfUEFHRTsKIAogCS8qIEluaXRpYWxpemUgdGFzayBjb250ZXh0IGZvciB0aGlzIElPIHJlcXVlc3QgKi8KLQl0YXNrX3BhZ2UgPSAoc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKikgaGJhLT50YXNrX2N0eFt0YXNrX2lkeF07CisJdGFza19wYWdlID0gKHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICopCisJCQlpbnRlcmZhY2UtPmhiYS0+dGFza19jdHhbdGFza19pZHhdOwogCXRhc2sgPSAmKHRhc2tfcGFnZVtpbmRleF0pOwogCW9yaWdfeGlkID0gaW9fcmVxLT54aWQ7CiAKQEAgLTEwMzEsNyArMTExMyw3IEBACiAKIAlscG9ydCA9IHNob3N0X3ByaXYoc2NfY21kLT5kZXZpY2UtPmhvc3QpOwogCWlmICgobHBvcnQtPnN0YXRlICE9IExQT1JUX1NUX1JFQURZKSB8fCAhKGxwb3J0LT5saW5rX3VwKSkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggImVoX2Fib3J0OiBsaW5rIG5vdCByZWFkeVxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImVoX2Fib3J0OiBsaW5rIG5vdCByZWFkeVxuIik7CiAJCXJldHVybiByYzsKIAl9CiAKQEAgLTEwNjIsNyArMTE0NCw3IEBACiAJICogaW9fcmVxIGlzIG5vIGxvbmdlciBpbiB0aGUgYWN0aXZlX3EuCiAJICovCiAJaWYgKHRndC0+Zmx1c2hfaW5fcHJvZykgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggImVoX2Fib3J0OiBpb19yZXEgKHhpZCA9IDB4JXgpICIKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZWhfYWJvcnQ6IGlvX3JlcSAoeGlkID0gMHgleCkgIgogCQkJImZsdXNoIGluIHByb2dyZXNzXG4iLCBpb19yZXEtPnhpZCk7CiAJCWtyZWZfcHV0KCZpb19yZXEtPnJlZmNvdW50LCBibngyZmNfY21kX3JlbGVhc2UpOwogCQlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CkBAIC0xMDcwLDcgKzExNTIsNyBAQAogCX0KIAogCWlmIChpb19yZXEtPm9uX2FjdGl2ZV9xdWV1ZSA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiZWhfYWJvcnQ6IGlvX3JlcSAoeGlkID0gMHgleCkgIgorCQlwcmludGsoS0VSTl9FUlIgUEZYICJlaF9hYm9ydDogaW9fcmVxICh4aWQgPSAweCV4KSAiCiAJCQkJIm5vdCBvbiBhY3RpdmVfcVxuIiwgaW9fcmVxLT54aWQpOwogCQkvKgogCQkgKiBUaGlzIGNvbmRpdGlvbiBjYW4gaGFwcGVuIG9ubHkgZHVlIHRvIHRoZSBGVyBidWcsCkBAIC0xMTA4LDcgKzExOTAsNyBAQAogCQlzZXRfYml0KEJOWDJGQ19GTEFHX0VIX0FCT1JULCAmaW9fcmVxLT5yZXFfZmxhZ3MpOwogCQlyYyA9IGJueDJmY19pbml0aWF0ZV9hYnRzKGlvX3JlcSk7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJlaF9hYm9ydDogaW9fcmVxICh4aWQgPSAweCV4KSAiCisJCXByaW50ayhLRVJOX0VSUiBQRlggImVoX2Fib3J0OiBpb19yZXEgKHhpZCA9IDB4JXgpICIKIAkJCQkiYWxyZWFkeSBpbiBhYnRzIHByb2Nlc3NpbmdcbiIsIGlvX3JlcS0+eGlkKTsKIAkJa3JlZl9wdXQoJmlvX3JlcS0+cmVmY291bnQsIGJueDJmY19jbWRfcmVsZWFzZSk7CiAJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKQEAgLTExNDksNiArMTIzMSw0MiBAQAogCXJldHVybiByYzsKIH0KIAordm9pZCBibngyZmNfcHJvY2Vzc19zZXFfY2xlYW51cF9jb21wbChzdHJ1Y3QgYm54MmZjX2NtZCAqc2VxX2NsbnBfcmVxLAorCQkJCSAgICAgIHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICp0YXNrLAorCQkJCSAgICAgIHU4IHJ4X3N0YXRlKQoreworCXN0cnVjdCBibngyZmNfZWxzX2NiX2FyZyAqY2JfYXJnID0gc2VxX2NsbnBfcmVxLT5jYl9hcmc7CisJc3RydWN0IGJueDJmY19jbWQgKm9yaWdfaW9fcmVxID0gY2JfYXJnLT5hYm9ydGVkX2lvX3JlcTsKKwl1MzIgb2Zmc2V0ID0gY2JfYXJnLT5vZmZzZXQ7CisJZW51bSBmY19yY3RsIHJfY3RsID0gY2JfYXJnLT5yX2N0bDsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndCA9IG9yaWdfaW9fcmVxLT50Z3Q7CisKKwlCTlgyRkNfSU9fREJHKG9yaWdfaW9fcmVxLCAiRW50ZXJlZCBwcm9jZXNzX2NsZWFudXBfY29tcGwgeGlkID0gMHgleCIKKwkJCSAgICAgICJjbWRfdHlwZSA9ICVkXG4iLAorCQkgICBzZXFfY2xucF9yZXEtPnhpZCwgc2VxX2NsbnBfcmVxLT5jbWRfdHlwZSk7CisKKwlpZiAocnhfc3RhdGUgPT0gRkNPRV9UQVNLX1JYX1NUQVRFX0lHTk9SRURfU0VRVUVOQ0VfQ0xFQU5VUCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJzZXEgY2xlYW51cCBpZ25vcmVkIC0geGlkID0gMHgleFxuIiwKKwkJCXNlcV9jbG5wX3JlcS0+eGlkKTsKKwkJZ290byBmcmVlX2NiX2FyZzsKKwl9CisJa3JlZl9nZXQoJm9yaWdfaW9fcmVxLT5yZWZjb3VudCk7CisKKwlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CisJcmMgPSBibngyZmNfc2VuZF9zcnIob3JpZ19pb19yZXEsIG9mZnNldCwgcl9jdGwpOworCXNwaW5fbG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CisKKwlpZiAocmMpCisJCXByaW50ayhLRVJOX0VSUiBQRlggImNsbnVwX2NvbXBsOiBVbmFibGUgdG8gc2VuZCBTUlIiCisJCQkiIElPIHdpbGwgYWJvcnRcbiIpOworCXNlcV9jbG5wX3JlcS0+Y2JfYXJnID0gTlVMTDsKKwlrcmVmX3B1dCgmb3JpZ19pb19yZXEtPnJlZmNvdW50LCBibngyZmNfY21kX3JlbGVhc2UpOworZnJlZV9jYl9hcmc6CisJa2ZyZWUoY2JfYXJnKTsKKwlyZXR1cm47Cit9CisKIHZvaWQgYm54MmZjX3Byb2Nlc3NfY2xlYW51cF9jb21wbChzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxLAogCQkJCSAgc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKnRhc2ssCiAJCQkJICB1OCBudW1fcnEpCkBAIC0xMzc4LDcgKzE0OTYsNyBAQAogCQkJZmNfaGRyLT5maF9yX2N0bCk7CiAJfQogCWlmICghc2NfY21kLT5TQ3AucHRyKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAidG1fY29tcGw6IFNDcC5wdHIgaXMgTlVMTFxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInRtX2NvbXBsOiBTQ3AucHRyIGlzIE5VTExcbiIpOwogCQlyZXR1cm47CiAJfQogCXN3aXRjaCAoaW9fcmVxLT5mY3Bfc3RhdHVzKSB7CkBAIC0xNDEwLDcgKzE1MjgsNyBAQAogCQlpb19yZXEtPm9uX3RtZl9xdWV1ZSA9IDA7CiAJfSBlbHNlIHsKIAotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggIkNvbW1hbmQgbm90IG9uIGFjdGl2ZV9jbWRfcXVldWUhXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ29tbWFuZCBub3Qgb24gYWN0aXZlX2NtZF9xdWV1ZSFcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNTk3LDcgKzE3MTUsNyBAQAogCiAJCWlmIChycV9idWZmX2xlbiA+IG51bV9ycSAqIEJOWDJGQ19SUV9CVUZfU1opIHsKIAkJCS8qIEludmFsaWQgc2Vuc2Ugc2Vuc2UgbGVuZ3RoLiAqLwotCQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJpbnZhbGlkIHNucyBsZW5ndGggJWRcbiIsCisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJpbnZhbGlkIHNucyBsZW5ndGggJWRcbiIsCiAJCQkJcnFfYnVmZl9sZW4pOwogCQkJLyogcmVzZXQgcnFfYnVmZl9sZW4gKi8KIAkJCXJxX2J1ZmZfbGVuID0gIG51bV9ycSAqIEJOWDJGQ19SUV9CVUZfU1o7CkBAIC0xNzgwLDcgKzE4OTgsNyBAQAogCQkJc2NzaV9zZXRfcmVzaWQoc2NfY21kLCBpb19yZXEtPmZjcF9yZXNpZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAic2NzaV9jbWRfY29tcGw6IGZjcF9zdGF0dXMgPSAlZFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAic2NzaV9jbWRfY29tcGw6IGZjcF9zdGF0dXMgPSAlZFxuIiwKIAkJCWlvX3JlcS0+ZmNwX3N0YXR1cyk7CiAJCWJyZWFrOwogCX0KQEAgLTE3ODksMTQgKzE5MDcsMTUgQEAKIAlrcmVmX3B1dCgmaW9fcmVxLT5yZWZjb3VudCwgYm54MmZjX2NtZF9yZWxlYXNlKTsKIH0KIAotc3RhdGljIGludCBibngyZmNfcG9zdF9pb19yZXEoc3RydWN0IGJueDJmY19ycG9ydCAqdGd0LAoraW50IGJueDJmY19wb3N0X2lvX3JlcShzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QsCiAJCQkgICAgICAgc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSkKIHsKIAlzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqdGFzazsKIAlzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqdGFza19wYWdlOwogCXN0cnVjdCBzY3NpX2NtbmQgKnNjX2NtZCA9IGlvX3JlcS0+c2NfY21kOwogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSB0Z3QtPnBvcnQ7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGludGVyZmFjZS0+aGJhOwogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBwb3J0LT5scG9ydDsKIAlzdHJ1Y3QgZmNvZV9kZXZfc3RhdHMgKnN0YXRzOwogCWludCB0YXNrX2lkeCwgaW5kZXg7CkBAIC0xODU0LDcgKzE5NzMsOCBAQAogCX0KIAogCS8qIFRpbWUgSU8gcmVxICovCi0JYm54MmZjX2NtZF90aW1lcl9zZXQoaW9fcmVxLCBCTlgyRkNfSU9fVElNRU9VVCk7CisJaWYgKHRndC0+aW9fdGltZW91dCkKKwkJYm54MmZjX2NtZF90aW1lcl9zZXQoaW9fcmVxLCBCTlgyRkNfSU9fVElNRU9VVCk7CiAJLyogT2J0YWluIGZyZWUgU1EgZW50cnkgKi8KIAlibngyZmNfYWRkXzJfc3EodGd0LCB4aWQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY190Z3QuYyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX3RndC5jCmluZGV4IDNlODkyYmQuLmQ1MzExYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX3RndC5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX3RndC5jCkBAIC0yLDcgKzIsNyBAQAogICogSGFuZGxlcyBvcGVyYXRpb25zIHN1Y2ggYXMgc2Vzc2lvbiBvZmZsb2FkL3VwbG9hZCBldGMsIGFuZCBtYW5hZ2VzCiAgKiBzZXNzaW9uIHJlc291cmNlcyBzdWNoIGFzIGNvbm5lY3Rpb24gaWQgYW5kIHFwIHJlc291cmNlcy4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggLSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggLSAyMDExIEJyb2FkY29tIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC02NSw3ICs2NSw4IEBACiB7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IHJkYXRhLT5sb2NhbF9wb3J0OwogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSByZGF0YS0+cnBvcnQ7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGludGVyZmFjZS0+aGJhOwogCWludCBydmFsOwogCWludCBpID0gMDsKIApAQCAtMjM3LDcgKzIzOCw4IEBACiBzdGF0aWMgdm9pZCBibngyZmNfdXBsb2FkX3Nlc3Npb24oc3RydWN0IGZjb2VfcG9ydCAqcG9ydCwKIAkJCQkJc3RydWN0IGJueDJmY19ycG9ydCAqdGd0KQogewotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAogCUJOWDJGQ19UR1RfREJHKHRndCwgInVwbG9hZF9zZXNzaW9uOiBhY3RpdmVfaW9zID0gJWRcbiIsCiAJCXRndC0+bnVtX2FjdGl2ZV9pb3MuY291bnRlcik7CkBAIC0zMTYsNyArMzE4LDggQEAKIHsKIAogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSByZGF0YS0+cnBvcnQ7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGludGVyZmFjZS0+aGJhOwogCXN0cnVjdCBiNTc3eHhfZG9vcmJlbGxfc2V0X3Byb2QgKnNxX2RiID0gJnRndC0+c3FfZGI7CiAJc3RydWN0IGI1Nzd4eF9mY29lX3J4X2Rvb3JiZWxsICpyeF9kYiA9ICZ0Z3QtPnJ4X2RiOwogCkBAIC0zNTAsNiArMzUzLDE0IEBACiAJdGd0LT5ycV9jb25zX2lkeCA9IDA7CiAJYXRvbWljX3NldCgmdGd0LT5udW1fYWN0aXZlX2lvcywgMCk7CiAKKwlpZiAocmRhdGEtPmZsYWdzICYgRkNfUlBfRkxBR1NfUkVUUlkpIHsKKwkJdGd0LT5kZXZfdHlwZSA9IFRZUEVfVEFQRTsKKwkJdGd0LT5pb190aW1lb3V0ID0gMDsgLyogdXNlIGRlZmF1bHQgVUxQIHRpbWVvdXQgKi8KKwl9IGVsc2UgeworCQl0Z3QtPmRldl90eXBlID0gVFlQRV9ESVNLOworCQl0Z3QtPmlvX3RpbWVvdXQgPSBCTlgyRkNfSU9fVElNRU9VVDsKKwl9CisKIAkvKiBpbml0aWFsaXplIHNxIGRvb3JiZWxsICovCiAJc3FfZGItPmhlYWRlci5oZWFkZXIgPSBCNTc3WFhfRE9PUkJFTExfSERSX0RCX1RZUEU7CiAJc3FfZGItPmhlYWRlci5oZWFkZXIgfD0gQjU3N1hYX0ZDT0VfQ09OTkVDVElPTl9UWVBFIDw8CkBAIC0zOTIsNyArNDAzLDggQEAKIAkJCQllbnVtIGZjX3Jwb3J0X2V2ZW50IGV2ZW50KQogewogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSBscG9ydF9wcml2KGxwb3J0KTsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHJkYXRhLT5ycG9ydDsKIAlzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiAqcnA7CiAJc3RydWN0IGJueDJmY19ycG9ydCAqdGd0OwpAQCAtNDAzLDcgKzQxNSw3IEBACiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgUlBPUlRfRVZfUkVBRFk6CiAJCWlmICghcnBvcnQpIHsKLQkJCXByaW50ayhLRVJOX0FMRVJUIFBGWCAicnBvcnQgaXMgTlVMTDogRVJST1IhXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggInJwb3J0IGlzIE5VTEw6IEVSUk9SIVxuIik7CiAJCQlicmVhazsKIAkJfQogCkBAIC00MTUsNyArNDI3LDcgQEAKIAkJCSAqIFdlIHNob3VsZCBub3QgY29tZSBoZXJlLCBhcyBscG9ydCB3aWxsCiAJCQkgKiB0YWtlIGNhcmUgb2YgZmFicmljIGxvZ2luCiAJCQkgKi8KLQkJCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiJXggLSBycG9ydF9ldmVudF9oYW5kbGVyIEVSUk9SXG4iLAorCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXggLSBycG9ydF9ldmVudF9oYW5kbGVyIEVSUk9SXG4iLAogCQkJCXJkYXRhLT5pZHMucG9ydF9pZCk7CiAJCQlicmVhazsKIAkJfQpAQCAtNDgzLDcgKzQ5NSw3IEBACiAJCQlicmVhazsKIAogCQlpZiAoIXJwb3J0KSB7Ci0JCQlwcmludGsoS0VSTl9BTEVSVCBQRlggIiV4IC0gcnBvcnQgbm90IGNyZWF0ZWQgWWV0ISFcbiIsCisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXggLSBycG9ydCBub3QgY3JlYXRlZCBZZXQhIVxuIiwKIAkJCQlwb3J0X2lkKTsKIAkJCWJyZWFrOwogCQl9CkBAIC01MzcsNyArNTQ5LDggQEAKIHN0cnVjdCBibngyZmNfcnBvcnQgKmJueDJmY190Z3RfbG9va3VwKHN0cnVjdCBmY29lX3BvcnQgKnBvcnQsCiAJCQkJCSAgICAgdTMyIHBvcnRfaWQpCiB7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGludGVyZmFjZS0+aGJhOwogCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndDsKIAlzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqcmRhdGE7CiAJaW50IGk7CkBAIC01NTIsNyArNTY1LDcgQEAKIAkJCQkJCSJvYnRhaW5lZFxuIik7CiAJCQkJCXJldHVybiB0Z3Q7CiAJCQkJfSBlbHNlIHsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicnBvcnQgMHgleCAiCisJCQkJCUJOWDJGQ19UR1RfREJHKHRndCwgInJwb3J0IDB4JXggIgogCQkJCQkJImlzIGluIERFTEVURUQgc3RhdGVcbiIsCiAJCQkJCQlyZGF0YS0+aWRzLnBvcnRfaWQpOwogCQkJCQlyZXR1cm4gTlVMTDsKQEAgLTYzMyw3ICs2NDYsNyBAQAogCXRndC0+c3EgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIHRndC0+c3FfbWVtX3NpemUsCiAJCQkJICAgICAmdGd0LT5zcV9kbWEsIEdGUF9LRVJORUwpOwogCWlmICghdGd0LT5zcSkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggInVuYWJsZSB0byBhbGxvY2F0ZSBTUSBtZW1vcnkgJWRcbiIsCisJCXByaW50ayhLRVJOX0VSUiBQRlggInVuYWJsZSB0byBhbGxvY2F0ZSBTUSBtZW1vcnkgJWRcbiIsCiAJCQl0Z3QtPnNxX21lbV9zaXplKTsKIAkJZ290byBtZW1fYWxsb2NfZmFpbHVyZTsKIAl9CkBAIC02NDYsNyArNjU5LDcgQEAKIAl0Z3QtPmNxID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCB0Z3QtPmNxX21lbV9zaXplLAogCQkJCSAgICAgJnRndC0+Y3FfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRndC0+Y3EpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgQ1EgbWVtb3J5ICVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgQ1EgbWVtb3J5ICVkXG4iLAogCQkJdGd0LT5jcV9tZW1fc2l6ZSk7CiAJCWdvdG8gbWVtX2FsbG9jX2ZhaWx1cmU7CiAJfQpAQCAtNjU5LDcgKzY3Miw3IEBACiAJdGd0LT5ycSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgdGd0LT5ycV9tZW1fc2l6ZSwKIAkJCQkJJnRndC0+cnFfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRndC0+cnEpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgUlEgbWVtb3J5ICVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgUlEgbWVtb3J5ICVkXG4iLAogCQkJdGd0LT5ycV9tZW1fc2l6ZSk7CiAJCWdvdG8gbWVtX2FsbG9jX2ZhaWx1cmU7CiAJfQpAQCAtNjcxLDcgKzY4NCw3IEBACiAJdGd0LT5ycV9wYmwgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIHRndC0+cnFfcGJsX3NpemUsCiAJCQkJCSAmdGd0LT5ycV9wYmxfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRndC0+cnFfcGJsKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAidW5hYmxlIHRvIGFsbG9jYXRlIFJRIFBCTCAlZFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGFsbG9jYXRlIFJRIFBCTCAlZFxuIiwKIAkJCXRndC0+cnFfcGJsX3NpemUpOwogCQlnb3RvIG1lbV9hbGxvY19mYWlsdXJlOwogCX0KQEAgLTY5Nyw3ICs3MTAsNyBAQAogCXRndC0+eGZlcnEgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIHRndC0+eGZlcnFfbWVtX3NpemUsCiAJCQkJCSZ0Z3QtPnhmZXJxX2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0Z3QtPnhmZXJxKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAidW5hYmxlIHRvIGFsbG9jYXRlIFhGRVJRICVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgWEZFUlEgJWRcbiIsCiAJCQl0Z3QtPnhmZXJxX21lbV9zaXplKTsKIAkJZ290byBtZW1fYWxsb2NfZmFpbHVyZTsKIAl9CkBAIC03MTEsNyArNzI0LDcgQEAKIAl0Z3QtPmNvbmZxID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCB0Z3QtPmNvbmZxX21lbV9zaXplLAogCQkJCQkmdGd0LT5jb25mcV9kbWEsIEdGUF9LRVJORUwpOwogCWlmICghdGd0LT5jb25mcSkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggInVuYWJsZSB0byBhbGxvY2F0ZSBDT05GUSAlZFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGFsbG9jYXRlIENPTkZRICVkXG4iLAogCQkJdGd0LT5jb25mcV9tZW1fc2l6ZSk7CiAJCWdvdG8gbWVtX2FsbG9jX2ZhaWx1cmU7CiAJfQpAQCAtNzI2LDcgKzczOSw3IEBACiAJCQkJCSAgICB0Z3QtPmNvbmZxX3BibF9zaXplLAogCQkJCQkgICAgJnRndC0+Y29uZnFfcGJsX2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0Z3QtPmNvbmZxX3BibCkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggInVuYWJsZSB0byBhbGxvY2F0ZSBDT05GUSBQQkwgJWRcbiIsCisJCXByaW50ayhLRVJOX0VSUiBQRlggInVuYWJsZSB0byBhbGxvY2F0ZSBDT05GUSBQQkwgJWRcbiIsCiAJCQl0Z3QtPmNvbmZxX3BibF9zaXplKTsKIAkJZ290byBtZW1fYWxsb2NfZmFpbHVyZTsKIAl9CkBAIC03NTEsNyArNzY0LDcgQEAKIAkJCQkJICB0Z3QtPmNvbm5fZGJfbWVtX3NpemUsCiAJCQkJCSAgJnRndC0+Y29ubl9kYl9kbWEsIEdGUF9LRVJORUwpOwogCWlmICghdGd0LT5jb25uX2RiKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAidW5hYmxlIHRvIGFsbG9jYXRlIGNvbm5fZGIgJWRcbiIsCisJCXByaW50ayhLRVJOX0VSUiBQRlggInVuYWJsZSB0byBhbGxvY2F0ZSBjb25uX2RiICVkXG4iLAogCQkJCQkJdGd0LT5jb25uX2RiX21lbV9zaXplKTsKIAkJZ290byBtZW1fYWxsb2NfZmFpbHVyZTsKIAl9CkBAIC03NjcsNyArNzgwLDcgQEAKIAkJCQkgICAgICAmdGd0LT5sY3FfZG1hLCBHRlBfS0VSTkVMKTsKIAogCWlmICghdGd0LT5sY3EpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgbGNxICVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgbGNxICVkXG4iLAogCQkgICAgICAgdGd0LT5sY3FfbWVtX3NpemUpOwogCQlnb3RvIG1lbV9hbGxvY19mYWlsdXJlOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX3JkYWMuYyBiL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX3JkYWMuYwppbmRleCAyZTdjMTM2Li4yN2M5ZDY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9yZGFjLmMKKysrIGIvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfcmRhYy5jCkBAIC0xMjgsMjUgKzEyOCw3IEBACiAJdTgJcmVzZXJ2ZWRbMl07CiB9OwogCi1zdHJ1Y3QgcmRhY19jb250cm9sbGVyIHsKLQl1OAkJCXN1YnN5c19pZFtTVUJTWVNfSURfTEVOXTsKLQl1OAkJCXNsb3RfaWRbU0xPVF9JRF9MRU5dOwotCWludAkJCXVzZV9tczEwOwotCXN0cnVjdCBrcmVmCQlrcmVmOwotCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsgLyogbGlzdCBvZiBhbGwgY29udHJvbGxlcnMgKi8KLQl1bmlvbgkJCXsKLQkJc3RydWN0IHJkYWNfcGdfbGVnYWN5IGxlZ2FjeTsKLQkJc3RydWN0IHJkYWNfcGdfZXhwYW5kZWQgZXhwYW5kZWQ7Ci0JfSBtb2RlX3NlbGVjdDsKLQl1OAlpbmRleDsKLQl1OAlhcnJheV9uYW1lW0FSUkFZX0xBQkVMX0xFTl07Ci0Jc3BpbmxvY2tfdAkJbXNfbG9jazsKLQlpbnQJCQltc19xdWV1ZWQ7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CW1zX3dvcms7Ci0Jc3RydWN0IHNjc2lfZGV2aWNlCSptc19zZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQJbXNfaGVhZDsKLX07Ci0KKyNkZWZpbmUgVU5JUVVFX0lEX0xFTiAxNgogc3RydWN0IGM4X2lucXVpcnkgewogCXU4CXBlcmlwaGVyYWxfaW5mbzsKIAl1OAlwYWdlX2NvZGU7IC8qIDB4QzggKi8KQEAgLTE1OSwxMiArMTQxLDMxIEBACiAJdTgJdm9sX3VzZXJfbGFiZWxfbGVuOwogCXU4CXZvbF91c2VyX2xhYmVsWzYwXTsKIAl1OAlhcnJheV91bmlxX2lkX2xlbjsKLQl1OAlhcnJheV91bmlxdWVfaWRbMTZdOworCXU4CWFycmF5X3VuaXF1ZV9pZFtVTklRVUVfSURfTEVOXTsKIAl1OAlhcnJheV91c2VyX2xhYmVsX2xlbjsKIAl1OAlhcnJheV91c2VyX2xhYmVsWzYwXTsKIAl1OAlsdW5bOF07CiB9OwogCitzdHJ1Y3QgcmRhY19jb250cm9sbGVyIHsKKwl1OAkJCWFycmF5X2lkW1VOSVFVRV9JRF9MRU5dOworCWludAkJCXVzZV9tczEwOworCXN0cnVjdCBrcmVmCQlrcmVmOworCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsgLyogbGlzdCBvZiBhbGwgY29udHJvbGxlcnMgKi8KKwl1bmlvbgkJCXsKKwkJc3RydWN0IHJkYWNfcGdfbGVnYWN5IGxlZ2FjeTsKKwkJc3RydWN0IHJkYWNfcGdfZXhwYW5kZWQgZXhwYW5kZWQ7CisJfSBtb2RlX3NlbGVjdDsKKwl1OAlpbmRleDsKKwl1OAlhcnJheV9uYW1lW0FSUkFZX0xBQkVMX0xFTl07CisJc3RydWN0IFNjc2lfSG9zdAkqaG9zdDsKKwlzcGlubG9ja190CQltc19sb2NrOworCWludAkJCW1zX3F1ZXVlZDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJbXNfd29yazsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UJKm1zX3NkZXY7CisJc3RydWN0IGxpc3RfaGVhZAltc19oZWFkOworfTsKKwogc3RydWN0IGMyX2lucXVpcnkgewogCXU4CXBlcmlwaGVyYWxfaW5mbzsKIAl1OAlwYWdlX2NvZGU7CS8qIDB4QzIgKi8KQEAgLTM2OSwxNiArMzcwLDE3IEBACiAJa2ZyZWUoY3Rscik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcmRhY19jb250cm9sbGVyICpnZXRfY29udHJvbGxlcih1OCAqc3Vic3lzX2lkLCB1OCAqc2xvdF9pZCwKLQkJCQkJCWNoYXIgKmFycmF5X25hbWUpCitzdGF0aWMgc3RydWN0IHJkYWNfY29udHJvbGxlciAqZ2V0X2NvbnRyb2xsZXIoaW50IGluZGV4LCBjaGFyICphcnJheV9uYW1lLAorCQkJdTggKmFycmF5X2lkLCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCiB7CiAJc3RydWN0IHJkYWNfY29udHJvbGxlciAqY3RsciwgKnRtcDsKIAogCXNwaW5fbG9jaygmbGlzdF9sb2NrKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmY3Rscl9saXN0LCBub2RlKSB7Ci0JCWlmICgobWVtY21wKHRtcC0+c3Vic3lzX2lkLCBzdWJzeXNfaWQsIFNVQlNZU19JRF9MRU4pID09IDApICYmCi0JCQkgIChtZW1jbXAodG1wLT5zbG90X2lkLCBzbG90X2lkLCBTTE9UX0lEX0xFTikgPT0gMCkpIHsKKwkJaWYgKChtZW1jbXAodG1wLT5hcnJheV9pZCwgYXJyYXlfaWQsIFVOSVFVRV9JRF9MRU4pID09IDApICYmCisJCQkgICh0bXAtPmluZGV4ID09IGluZGV4KSAmJgorCQkJICAodG1wLT5ob3N0ID09IHNkZXYtPmhvc3QpKSB7CiAJCQlrcmVmX2dldCgmdG1wLT5rcmVmKTsKIAkJCXNwaW5fdW5sb2NrKCZsaXN0X2xvY2spOwogCQkJcmV0dXJuIHRtcDsKQEAgLTM4OSwxNiArMzkxLDExIEBACiAJCWdvdG8gZG9uZTsKIAogCS8qIGluaXRpYWxpemUgZmllbGRzIG9mIGNvbnRyb2xsZXIgKi8KLQltZW1jcHkoY3Rsci0+c3Vic3lzX2lkLCBzdWJzeXNfaWQsIFNVQlNZU19JRF9MRU4pOwotCW1lbWNweShjdGxyLT5zbG90X2lkLCBzbG90X2lkLCBTTE9UX0lEX0xFTik7CisJbWVtY3B5KGN0bHItPmFycmF5X2lkLCBhcnJheV9pZCwgVU5JUVVFX0lEX0xFTik7CisJY3Rsci0+aW5kZXggPSBpbmRleDsKKwljdGxyLT5ob3N0ID0gc2Rldi0+aG9zdDsKIAltZW1jcHkoY3Rsci0+YXJyYXlfbmFtZSwgYXJyYXlfbmFtZSwgQVJSQVlfTEFCRUxfTEVOKTsKIAotCS8qIHVwZGF0ZSB0aGUgY29udHJvbGxlciBpbmRleCAqLwotCWlmIChzbG90X2lkWzFdID09IDB4MzEpCi0JCWN0bHItPmluZGV4ID0gMDsKLQllbHNlCi0JCWN0bHItPmluZGV4ID0gMTsKLQogCWtyZWZfaW5pdCgmY3Rsci0+a3JlZik7CiAJY3Rsci0+dXNlX21zMTAgPSAtMTsKIAljdGxyLT5tc19xdWV1ZWQgPSAwOwpAQCAtNDQ0LDcgKzQ0MSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZ2V0X2x1bl9pbmZvKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IHJkYWNfZGhfZGF0YSAqaCwKLQkJCWNoYXIgKmFycmF5X25hbWUpCisJCQljaGFyICphcnJheV9uYW1lLCB1OCAqYXJyYXlfaWQpCiB7CiAJaW50IGVyciwgaTsKIAlzdHJ1Y3QgYzhfaW5xdWlyeSAqaW5xcDsKQEAgLTQ2Myw2ICs0NjAsOCBAQAogCQkJKihhcnJheV9uYW1lK2kpID0gaW5xcC0+YXJyYXlfdXNlcl9sYWJlbFsoMippKSsxXTsKIAogCQkqKGFycmF5X25hbWUrQVJSQVlfTEFCRUxfTEVOLTEpID0gJ1wwJzsKKwkJbWVtc2V0KGFycmF5X2lkLCAwLCBVTklRVUVfSURfTEVOKTsKKwkJbWVtY3B5KGFycmF5X2lkLCBpbnFwLT5hcnJheV91bmlxdWVfaWQsIGlucXAtPmFycmF5X3VuaXFfaWRfbGVuKTsKIAl9CiAJcmV0dXJuIGVycjsKIH0KQEAgLTUwNCwxNiArNTAzLDIwIEBACiB9CiAKIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZV9jb250cm9sbGVyKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwKLQkJCQkgc3RydWN0IHJkYWNfZGhfZGF0YSAqaCwgY2hhciAqYXJyYXlfbmFtZSkKKwkJc3RydWN0IHJkYWNfZGhfZGF0YSAqaCwgY2hhciAqYXJyYXlfbmFtZSwgdTggKmFycmF5X2lkKQogewotCWludCBlcnI7CisJaW50IGVyciwgaW5kZXg7CiAJc3RydWN0IGM0X2lucXVpcnkgKmlucXA7CiAKIAllcnIgPSBzdWJtaXRfaW5xdWlyeShzZGV2LCAweEM0LCBzaXplb2Yoc3RydWN0IGM0X2lucXVpcnkpLCBoKTsKIAlpZiAoZXJyID09IFNDU0lfREhfT0spIHsKIAkJaW5xcCA9ICZoLT5pbnEuYzQ7Ci0JCWgtPmN0bHIgPSBnZXRfY29udHJvbGxlcihpbnFwLT5zdWJzeXNfaWQsIGlucXAtPnNsb3RfaWQsCi0JCQkJCWFycmF5X25hbWUpOworCQkvKiBnZXQgdGhlIGNvbnRyb2xsZXIgaW5kZXggKi8KKwkJaWYgKGlucXAtPnNsb3RfaWRbMV0gPT0gMHgzMSkKKwkJCWluZGV4ID0gMDsKKwkJZWxzZQorCQkJaW5kZXggPSAxOworCQloLT5jdGxyID0gZ2V0X2NvbnRyb2xsZXIoaW5kZXgsIGFycmF5X25hbWUsIGFycmF5X2lkLCBzZGV2KTsKIAkJaWYgKCFoLT5jdGxyKQogCQkJZXJyID0gU0NTSV9ESF9SRVNfVEVNUF9VTkFWQUlMOwogCX0KQEAgLTgzNSw2ICs4MzgsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGVycjsKIAljaGFyIGFycmF5X25hbWVbQVJSQVlfTEFCRUxfTEVOXTsKKwljaGFyIGFycmF5X2lkW1VOSVFVRV9JRF9MRU5dOwogCiAJc2NzaV9kaF9kYXRhID0ga3phbGxvYyhzaXplb2YoKnNjc2lfZGhfZGF0YSkKIAkJCSAgICAgICArIHNpemVvZigqaCkgLCBHRlBfS0VSTkVMKTsKQEAgLTg0OSwxMSArODUzLDExIEBACiAJaC0+bHVuID0gVU5JTklUSUFMSVpFRF9MVU47CiAJaC0+c3RhdGUgPSBSREFDX1NUQVRFX0FDVElWRTsKIAotCWVyciA9IGdldF9sdW5faW5mbyhzZGV2LCBoLCBhcnJheV9uYW1lKTsKKwllcnIgPSBnZXRfbHVuX2luZm8oc2RldiwgaCwgYXJyYXlfbmFtZSwgYXJyYXlfaWQpOwogCWlmIChlcnIgIT0gU0NTSV9ESF9PSykKIAkJZ290byBmYWlsZWQ7CiAKLQllcnIgPSBpbml0aWFsaXplX2NvbnRyb2xsZXIoc2RldiwgaCwgYXJyYXlfbmFtZSk7CisJZXJyID0gaW5pdGlhbGl6ZV9jb250cm9sbGVyKHNkZXYsIGgsIGFycmF5X25hbWUsIGFycmF5X2lkKTsKIAlpZiAoZXJyICE9IFNDU0lfREhfT0spCiAJCWdvdG8gZmFpbGVkOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZmNvZS9mY29lLmMgYi9kcml2ZXJzL3Njc2kvZmNvZS9mY29lLmMKaW5kZXggMjA0ZmE4ZC4uYmE3MTBlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2UuYwpAQCAtNDg3LDYgKzQ4NywxOSBAQAogfQogCiAvKioKKyAqIGZjb2VfcG9ydF9zZW5kKCkgLSBTZW5kIGFuIEV0aGVybmV0LWVuY2Fwc3VsYXRlZCBGSVAvRkNvRSBmcmFtZQorICogQHBvcnQ6IFRoZSBGQ29FIHBvcnQKKyAqIEBza2I6IFRoZSBGSVAvRkNvRSBwYWNrZXQgdG8gYmUgc2VudAorICovCitzdGF0aWMgdm9pZCBmY29lX3BvcnRfc2VuZChzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmIChwb3J0LT5mY29lX3BlbmRpbmdfcXVldWUucWxlbikKKwkJZmNvZV9jaGVja193YWl0X3F1ZXVlKHBvcnQtPmxwb3J0LCBza2IpOworCWVsc2UgaWYgKGZjb2Vfc3RhcnRfaW8oc2tiKSkKKwkJZmNvZV9jaGVja193YWl0X3F1ZXVlKHBvcnQtPmxwb3J0LCBza2IpOworfQorCisvKioKICAqIGZjb2VfZmlwX3NlbmQoKSAtIFNlbmQgYW4gRXRoZXJuZXQtZW5jYXBzdWxhdGVkIEZJUCBmcmFtZQogICogQGZpcDogVGhlIEZDb0UgY29udHJvbGxlcgogICogQHNrYjogVGhlIEZJUCBwYWNrZXQgdG8gYmUgc2VudApAQCAtNDk0LDcgKzUwNyw3IEBACiBzdGF0aWMgdm9pZCBmY29lX2ZpcF9zZW5kKHN0cnVjdCBmY29lX2N0bHIgKmZpcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlza2ItPmRldiA9IGZjb2VfZnJvbV9jdGxyKGZpcCktPm5ldGRldjsKLQlkZXZfcXVldWVfeG1pdChza2IpOworCWZjb2VfcG9ydF9zZW5kKGxwb3J0X3ByaXYoZmlwLT5scCksIHNrYik7CiB9CiAKIC8qKgpAQCAtMTI1NywzMCArMTI3MCwyMCBAQAogLyoqCiAgKiBmY29lX3NlbGVjdF9jcHUoKSAtIFNlbGVjdHMgQ1BVIHRvIGhhbmRsZSBwb3N0LXByb2Nlc3Npbmcgb2YgaW5jb21pbmcKICAqCQkJY29tbWFuZC4KLSAqIEBjdXJyX2NwdTogICBDUFUgd2hpY2ggcmVjZWl2ZWQgcmVxdWVzdAogICoKLSAqIFRoaXMgcm91dGluZSBzZWxlY3RzIG5leHQgQ1BVIGJhc2VkIG9uIGNwdW1hc2suCisgKiBUaGlzIHJvdXRpbmUgc2VsZWN0cyBuZXh0IENQVSBiYXNlZCBvbiBjcHVtYXNrIHRvIGRpc3RyaWJ1dGUKKyAqIGluY29taW5nIHJlcXVlc3RzIGluIHJvdW5kIHJvYmluLgogICoKLSAqIFJldHVybnM6IGludCAoQ1BVIG51bWJlcikuIENhbGxlciB0byB2ZXJpZnkgaWYgcmV0dXJuZWQgQ1BVIGlzIG9ubGluZSBvciBub3QuCisgKiBSZXR1cm5zOiBpbnQgQ1BVIG51bWJlcgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGZjb2Vfc2VsZWN0X2NwdSh1bnNpZ25lZCBpbnQgY3Vycl9jcHUpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBmY29lX3NlbGVjdF9jcHUodm9pZCkKIHsKIAlzdGF0aWMgdW5zaWduZWQgaW50IHNlbGVjdGVkX2NwdTsKIAotCWlmIChudW1fb25saW5lX2NwdXMoKSA9PSAxKQotCQlyZXR1cm4gY3Vycl9jcHU7Ci0JLyoKLQkgKiBEb2luZyBmb2xsb3dpbmcgY2hlY2ssIHRvIHNraXAgImN1cnJfY3B1IChzbXBfcHJvY2Vzc29yX2lkKSIKLQkgKiBmcm9tIHNlbGVjdGlvbiBvZiBDUFUgaXMgaW50ZW50aW9uYWwuIFRoaXMgaXMgdG8gYXZvaWQgc2FtZSBDUFUKLQkgKiBkb2luZyBwb3N0LXByb2Nlc3Npbmcgb2YgY29tbWFuZC4gImN1cnJfY3B1IiB0byBqdXN0IHJlY2VpdmUKLQkgKiBpbmNvbWluZyByZXF1ZXN0IGluIGNhc2Ugd2hlcmUgcnhfaWQgaXMgVU5LTk9XTiBhbmQgYWxsIG90aGVyCi0JICogQ1BVIHRvIGFjdHVhbGx5IHByb2Nlc3MgdGhlIGNvbW1hbmQocykKLQkgKi8KLQlkbyB7Ci0JCXNlbGVjdGVkX2NwdSA9IGNwdW1hc2tfbmV4dChzZWxlY3RlZF9jcHUsIGNwdV9vbmxpbmVfbWFzayk7Ci0JCWlmIChzZWxlY3RlZF9jcHUgPj0gbnJfY3B1X2lkcykKLQkJCXNlbGVjdGVkX2NwdSA9IGNwdW1hc2tfZmlyc3QoY3B1X29ubGluZV9tYXNrKTsKLQl9IHdoaWxlIChzZWxlY3RlZF9jcHUgPT0gY3Vycl9jcHUpOworCXNlbGVjdGVkX2NwdSA9IGNwdW1hc2tfbmV4dChzZWxlY3RlZF9jcHUsIGNwdV9vbmxpbmVfbWFzayk7CisJaWYgKHNlbGVjdGVkX2NwdSA+PSBucl9jcHVfaWRzKQorCQlzZWxlY3RlZF9jcHUgPSBjcHVtYXNrX2ZpcnN0KGNwdV9vbmxpbmVfbWFzayk7CisKIAlyZXR1cm4gc2VsZWN0ZWRfY3B1OwogfQogCkBAIC0xMzUwLDMwICsxMzUzLDI2IEBACiAKIAlmciA9IGZjb2VfZGV2X2Zyb21fc2tiKHNrYik7CiAJZnItPmZyX2RldiA9IGxwb3J0OwotCWZyLT5wdHlwZSA9IHB0eXBlOwogCiAJLyoKIAkgKiBJbiBjYXNlIHRoZSBpbmNvbWluZyBmcmFtZSdzIGV4Y2hhbmdlIGlzIG9yaWdpbmF0ZWQgZnJvbQogCSAqIHRoZSBpbml0aWF0b3IsIHRoZW4gcmVjZWl2ZWQgZnJhbWUncyBleGNoYW5nZSBpZCBpcyBBTkRlZAogCSAqIHdpdGggZmNfY3B1X21hc2sgYml0cyB0byBnZXQgdGhlIHNhbWUgY3B1IG9uIHdoaWNoIGV4Y2hhbmdlCi0JICogd2FzIG9yaWdpbmF0ZWQsIG90aGVyd2lzZSBqdXN0IHVzZSB0aGUgY3VycmVudCBjcHUuCisJICogd2FzIG9yaWdpbmF0ZWQsIG90aGVyd2lzZSBzZWxlY3QgY3B1IHVzaW5nIHJ4IGV4Y2hhbmdlIGlkCisJICogb3IgZmNvZV9zZWxlY3RfY3B1KCkuCiAJICovCiAJaWYgKG50b2gyNChmaC0+ZmhfZl9jdGwpICYgRkNfRkNfRVhfQ1RYKQogCQljcHUgPSBudG9ocyhmaC0+Zmhfb3hfaWQpICYgZmNfY3B1X21hc2s7CiAJZWxzZSB7Ci0JCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotCQlpZiAoKGZoLT5maF90eXBlID09IEZDX1RZUEVfRkNQKSAmJgotCQkgICAgKG50b2hzKGZoLT5maF9yeF9pZCkgPT0gRkNfWElEX1VOS05PV04pKSB7Ci0JCQlkbyB7Ci0JCQkJY3B1ID0gZmNvZV9zZWxlY3RfY3B1KGNwdSk7Ci0JCQl9IHdoaWxlICghY3B1X29ubGluZShjcHUpKTsKLQkJfSBlbHNlICBpZiAoKGZoLT5maF90eXBlID09IEZDX1RZUEVfRkNQKSAmJgotCQkJICAgIChudG9ocyhmaC0+ZmhfcnhfaWQpICE9IEZDX1hJRF9VTktOT1dOKSkgeworCQlpZiAobnRvaHMoZmgtPmZoX3J4X2lkKSA9PSBGQ19YSURfVU5LTk9XTikKKwkJCWNwdSA9IGZjb2Vfc2VsZWN0X2NwdSgpOworCQllbHNlCiAJCQljcHUgPSBudG9ocyhmaC0+ZmhfcnhfaWQpICYgZmNfY3B1X21hc2s7Ci0JCX0gZWxzZQotCQkJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCX0KKworCWlmIChjcHUgPj0gbnJfY3B1X2lkcykKKwkJZ290byBlcnI7CisKIAlmcHMgPSAmcGVyX2NwdShmY29lX3BlcmNwdSwgY3B1KTsKIAlzcGluX2xvY2tfYmgoJmZwcy0+ZmNvZV9yeF9saXN0LmxvY2spOwogCWlmICh1bmxpa2VseSghZnBzLT50aHJlYWQpKSB7CkBAIC0xNTcyLDExICsxNTcxLDcgQEAKIAogCS8qIHNlbmQgZG93biB0byBsbGQgKi8KIAlmcl9kZXYoZnApID0gbHBvcnQ7Ci0JaWYgKHBvcnQtPmZjb2VfcGVuZGluZ19xdWV1ZS5xbGVuKQotCQlmY29lX2NoZWNrX3dhaXRfcXVldWUobHBvcnQsIHNrYik7Ci0JZWxzZSBpZiAoZmNvZV9zdGFydF9pbyhza2IpKQotCQlmY29lX2NoZWNrX3dhaXRfcXVldWUobHBvcnQsIHNrYik7Ci0KKwlmY29lX3BvcnRfc2VuZChwb3J0LCBza2IpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaHBzYS5jIGIvZHJpdmVycy9zY3NpL2hwc2EuYwppbmRleCBjNmY5OWIxLi5lYzYxYmRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaHBzYS5jCisrKyBiL2RyaXZlcnMvc2NzaS9ocHNhLmMKQEAgLTEyMTksOCArMTIxOSw4IEBACiAJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJjcCAlcCByZXBvcnRzIGFib3J0IGZhaWxlZFxuIiwgY3ApOwogCQlicmVhazsKIAljYXNlIENNRF9VTlNPTElDSVRFRF9BQk9SVDoKLQkJY21kLT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7Ci0JCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJjcCAlcCBhYm9ydGVkIGRvIHRvIGFuIHVuc29saWNpdGVkICIKKwkJY21kLT5yZXN1bHQgPSBESURfU09GVF9FUlJPUiA8PCAxNjsgLyogcmV0cnkgdGhlIGNvbW1hbmQgKi8KKwkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgImNwICVwIGFib3J0ZWQgZHVlIHRvIGFuIHVuc29saWNpdGVkICIKIAkJCSJhYm9ydFxuIiwgY3ApOwogCQlicmVhazsKIAljYXNlIENNRF9USU1FT1VUOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hwc2EuaCBiL2RyaXZlcnMvc2NzaS9ocHNhLmgKaW5kZXggNmQ4ZGNkNC4uN2Y1M2NlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hwc2EuaAorKysgYi9kcml2ZXJzL3Njc2kvaHBzYS5oCkBAIC0yMTQsNyArMjE0LDcgQEAKIAlkZXZfZGJnKCZoLT5wZGV2LT5kZXYsICJTZW5kaW5nICV4LCB0YWcgPSAleFxuIiwgYy0+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+CisgKgkgIFNhdHlhbSBTaGFybWEgPHNhdHlhbUBpbmZyYWRlYWQub3JnPgorICoJICBSYW5keSBEdW5sYXAgPHJhbmR5LmR1bmxhcEBvcmFjbGUuY29tPgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJTmVpdGhlciBBbGFuIENveCwgQ3ltcnVOZXQgTHRkLiwgV2ltIFZhbiBTZWJyb2VjayBub3IgSWd1YW5hIHZ6dy4KKyAqCWFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuCisgKglUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqLworCisvKgorICoJRnVuY3Rpb25zL3Byb2NlZHVyZXMgdG8gYmUgY2FsbGVkIGJ5IHRoZSBjb3JlCisgKi8KK2ludCB3YXRjaGRvZ19kZXZfcmVnaXN0ZXIoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqKTsKK2ludCB3YXRjaGRvZ19kZXZfdW5yZWdpc3RlcihzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYyBiL2RyaXZlcnMveGVuL2dyYW50LXRhYmxlLmMKaW5kZXggZmQ3MjVjZC4uNGY0NGIzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYworKysgYi9kcml2ZXJzL3hlbi9ncmFudC10YWJsZS5jCkBAIC04Miw3ICs4Miw3IEBACiBzdGF0aWMgaW50IGdldF9mcmVlX2VudHJpZXModW5zaWduZWQgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmVmLCByYzsKKwlpbnQgcmVmLCByYyA9IDA7CiAJZ3JhbnRfcmVmX3QgaGVhZDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZnbnR0YWJfbGlzdF9sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay94ZW5idXMuYyBiL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL3hlbmJ1cy5jCmluZGV4IDIwNmM0Y2UwLi45NzhkMmM2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuLXBjaWJhY2sveGVuYnVzLmMKKysrIGIvZHJpdmVycy94ZW4veGVuLXBjaWJhY2sveGVuYnVzLmMKQEAgLTExLDcgKzExLDYgQEAKICNpbmNsdWRlIDx4ZW4veGVuYnVzLmg+CiAjaW5jbHVkZSA8eGVuL2V2ZW50cy5oPgogI2luY2x1ZGUgPGFzbS94ZW4vcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSAicGNpYmFjay5oIgogCiAjZGVmaW5lCURSVl9OQU1FCSJ4ZW4tcGNpYmFjayIKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbi1zZWxmYmFsbG9vbi5jIGIvZHJpdmVycy94ZW4veGVuLXNlbGZiYWxsb29uLmMKaW5kZXggMDEwOTM3Yi4uMWI0YWZkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuLXNlbGZiYWxsb29uLmMKKysrIGIvZHJpdmVycy94ZW4veGVuLXNlbGZiYWxsb29uLmMKQEAgLTcwLDEwICs3MCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgotCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8eGVuL2JhbGxvb24uaD4KLQogI2luY2x1ZGUgPHhlbi90bWVtLmg+CisjaW5jbHVkZSA8eGVuL3hlbi5oPgogCiAvKiBFbmFibGUvZGlzYWJsZSB3aXRoIHN5c2ZzLiAqLwogc3RhdGljIGludCB4ZW5fc2VsZmJhbGxvb25pbmdfZW5hYmxlZCBfX3JlYWRfbW9zdGx5OwpkaWZmIC0tZ2l0IGEvZnMvOXAvYWNsLmMgYi9mcy85cC9hY2wuYwppbmRleCBlOWNiNTdmLi45YTFkNDI2IDEwMDY0NAotLS0gYS9mcy85cC9hY2wuYworKysgYi9mcy85cC9hY2wuYwpAQCAtMTgyLDExICsxODIsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHY5ZnNfYWNsX21vZGUoc3RydWN0IGlub2RlICpkaXIsIG1vZGVfdCAqbW9kZXAsCitpbnQgdjlmc19hY2xfbW9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgdW1vZGVfdCAqbW9kZXAsCiAJCSAgc3RydWN0IHBvc2l4X2FjbCAqKmRwYWNsLCBzdHJ1Y3QgcG9zaXhfYWNsICoqcGFjbCkKIHsKIAlpbnQgcmV0dmFsID0gMDsKLQltb2RlX3QgbW9kZSA9ICptb2RlcDsKKwl1bW9kZV90IG1vZGUgPSAqbW9kZXA7CiAJc3RydWN0IHBvc2l4X2FjbCAqYWNsID0gTlVMTDsKIAogCWlmICghU19JU0xOSyhtb2RlKSkgewpAQCAtMzE5LDcgKzMxOSw3IEBACiAJY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6CiAJCW5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTOwogCQlpZiAoYWNsKSB7Ci0JCQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CisJCQl1bW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwogCQkJcmV0dmFsID0gcG9zaXhfYWNsX2VxdWl2X21vZGUoYWNsLCAmbW9kZSk7CiAJCQlpZiAocmV0dmFsIDwgMCkKIAkJCQlnb3RvIGVycl9vdXQ7CmRpZmYgLS1naXQgYS9mcy85cC9hY2wuaCBiL2ZzLzlwL2FjbC5oCmluZGV4IGRkYjdhZTEuLjU1OTU1NjQgMTAwNjQ0Ci0tLSBhL2ZzLzlwL2FjbC5oCisrKyBiL2ZzLzlwL2FjbC5oCkBAIC0yMCw3ICsyMCw3IEBACiBleHRlcm4gaW50IHY5ZnNfYWNsX2NobW9kKHN0cnVjdCBkZW50cnkgKik7CiBleHRlcm4gaW50IHY5ZnNfc2V0X2NyZWF0ZV9hY2woc3RydWN0IGRlbnRyeSAqLAogCQkJICAgICAgIHN0cnVjdCBwb3NpeF9hY2wgKiosIHN0cnVjdCBwb3NpeF9hY2wgKiopOwotZXh0ZXJuIGludCB2OWZzX2FjbF9tb2RlKHN0cnVjdCBpbm9kZSAqZGlyLCBtb2RlX3QgKm1vZGVwLAorZXh0ZXJuIGludCB2OWZzX2FjbF9tb2RlKHN0cnVjdCBpbm9kZSAqZGlyLCB1bW9kZV90ICptb2RlcCwKIAkJCSBzdHJ1Y3QgcG9zaXhfYWNsICoqZHBhY2wsIHN0cnVjdCBwb3NpeF9hY2wgKipwYWNsKTsKICNlbHNlCiAjZGVmaW5lIHY5ZnNfaW9wX2dldF9hY2wgTlVMTApAQCAtMzgsNyArMzgsNyBAQAogewogCXJldHVybiAwOwogfQotc3RhdGljIGlubGluZSBpbnQgdjlmc19hY2xfbW9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgbW9kZV90ICptb2RlcCwKK3N0YXRpYyBpbmxpbmUgaW50IHY5ZnNfYWNsX21vZGUoc3RydWN0IGlub2RlICpkaXIsIHVtb2RlX3QgKm1vZGVwLAogCQkJCXN0cnVjdCBwb3NpeF9hY2wgKipkcGFjbCwKIAkJCQlzdHJ1Y3QgcG9zaXhfYWNsICoqcGFjbCkKIHsKZGlmZiAtLWdpdCBhL2ZzLzlwL3Zmc19pbm9kZV9kb3RsLmMgYi9mcy85cC92ZnNfaW5vZGVfZG90bC5jCmluZGV4IDlhMjZkY2UuLmI2YzhlZDIgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3Zmc19pbm9kZV9kb3RsLmMKKysrIGIvZnMvOXAvdmZzX2lub2RlX2RvdGwuYwpAQCAtMjA2LDcgKzIwNiw3IEBACiAJaW50IGVyciA9IDA7CiAJZ2lkX3QgZ2lkOwogCWludCBmbGFnczsKLQltb2RlX3QgbW9kZTsKKwl1bW9kZV90IG1vZGU7CiAJY2hhciAqbmFtZSA9IE5VTEw7CiAJc3RydWN0IGZpbGUgKmZpbHA7CiAJc3RydWN0IHA5X3FpZCBxaWQ7CkBAIC0zNDgsNyArMzQ4LDcgQEAKIAlzdHJ1Y3QgcDlfZmlkICpmaWQgPSBOVUxMLCAqZGZpZCA9IE5VTEw7CiAJZ2lkX3QgZ2lkOwogCWNoYXIgKm5hbWU7Ci0JbW9kZV90IG1vZGU7CisJdW1vZGVfdCBtb2RlOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IHA5X3FpZCBxaWQ7CiAJc3RydWN0IGRlbnRyeSAqZGlyX2RlbnRyeTsKQEAgLTc1MSw3ICs3NTEsNyBAQAogCWludCBlcnI7CiAJZ2lkX3QgZ2lkOwogCWNoYXIgKm5hbWU7Ci0JbW9kZV90IG1vZGU7CisJdW1vZGVfdCBtb2RlOwogCXN0cnVjdCB2OWZzX3Nlc3Npb25faW5mbyAqdjlzZXM7CiAJc3RydWN0IHA5X2ZpZCAqZmlkID0gTlVMTCwgKmRmaWQgPSBOVUxMOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CmRpZmYgLS1naXQgYS9mcy9LY29uZmlnIGIvZnMvS2NvbmZpZwppbmRleCAxOTg5MWFhLi45ZmUwYjM0IDEwMDY0NAotLS0gYS9mcy9LY29uZmlnCisrKyBiL2ZzL0tjb25maWcKQEAgLTEyNywxNCArMTI3LDIxIEBACiAJc2VsZWN0IFRNUEZTX1hBVFRSCiAJc2VsZWN0IEdFTkVSSUNfQUNMCiAJaGVscAotCSAgUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdHMgKEFDTHMpIHN1cHBvcnQgcGVybWlzc2lvbnMgZm9yIHVzZXJzIGFuZAotCSAgZ3JvdXBzIGJleW9uZCB0aGUgb3duZXIvZ3JvdXAvd29ybGQgc2NoZW1lLgorCSAgUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdHMgKEFDTHMpIHN1cHBvcnQgYWRkaXRpb25hbCBhY2Nlc3MgcmlnaHRzCisJICBmb3IgdXNlcnMgYW5kIGdyb3VwcyBiZXlvbmQgdGhlIHN0YW5kYXJkIG93bmVyL2dyb3VwL3dvcmxkIHNjaGVtZSwKKwkgIGFuZCB0aGlzIG9wdGlvbiBzZWxlY3RzIHN1cHBvcnQgZm9yIEFDTHMgc3BlY2lmaWNhbGx5IGZvciB0bXBmcworCSAgZmlsZXN5c3RlbXMuCisKKwkgIElmIHlvdSd2ZSBzZWxlY3RlZCBUTVBGUywgaXQncyBwb3NzaWJsZSB0aGF0IHlvdSdsbCBhbHNvIG5lZWQKKwkgIHRoaXMgb3B0aW9uIGFzIHRoZXJlIGFyZSBhIG51bWJlciBvZiBMaW51eCBkaXN0cm9zIHRoYXQgcmVxdWlyZQorCSAgUE9TSVggQUNMIHN1cHBvcnQgdW5kZXIgL2RldiBmb3IgY2VydGFpbiBmZWF0dXJlcyB0byB3b3JrIHByb3Blcmx5LgorCSAgRm9yIGV4YW1wbGUsIHNvbWUgZGlzdHJvcyBuZWVkIHRoaXMgZmVhdHVyZSBmb3IgQUxTQS1yZWxhdGVkIC9kZXYKKwkgIGZpbGVzIGZvciBzb3VuZCB0byB3b3JrIHByb3Blcmx5LiAgSW4gc2hvcnQsIGlmIHlvdSdyZSBub3Qgc3VyZSwKKwkgIHNheSBZLgogCiAJICBUbyBsZWFybiBtb3JlIGFib3V0IEFjY2VzcyBDb250cm9sIExpc3RzLCB2aXNpdCB0aGUgUE9TSVggQUNMcyBmb3IKIAkgIExpbnV4IHdlYnNpdGUgPGh0dHA6Ly9hY2wuYmVzdGJpdHMuYXQvPi4KIAotCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCBBY2Nlc3MgQ29udHJvbCBMaXN0cyBhcmUsIHNheSBOLgotCiBjb25maWcgVE1QRlNfWEFUVFIKIAlib29sICJUbXBmcyBleHRlbmRlZCBhdHRyaWJ1dGVzIgogCWRlcGVuZHMgb24gVE1QRlMKZGlmZiAtLWdpdCBhL2ZzL2Jsb2NrX2Rldi5jIGIvZnMvYmxvY2tfZGV2LmMKaW5kZXggZjU1YWFkNC4uZmY3NzI2MiAxMDA2NDQKLS0tIGEvZnMvYmxvY2tfZGV2LmMKKysrIGIvZnMvYmxvY2tfZGV2LmMKQEAgLTM4Nyw2ICszODcsMTAgQEAKIAlzdHJ1Y3QgaW5vZGUgKmJkX2lub2RlID0gZmlscC0+Zl9tYXBwaW5nLT5ob3N0OwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBJX0JERVYoYmRfaW5vZGUpOwogCWludCBlcnJvcjsKKwkKKwllcnJvciA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UoZmlscC0+Zl9tYXBwaW5nLCBzdGFydCwgZW5kKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKIAogCS8qCiAJICogVGhlcmUgaXMgbm8gbmVlZCB0byBzZXJpYWxpc2UgY2FsbHMgdG8gYmxrZGV2X2lzc3VlX2ZsdXNoIHdpdGgKQEAgLTU1Miw2ICs1NTYsNyBAQAogCiAJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKIAkJYmRldi0+YmRfY29udGFpbnMgPSBOVUxMOworCQliZGV2LT5iZF9zdXBlciA9IE5VTEw7CiAJCWJkZXYtPmJkX2lub2RlID0gaW5vZGU7CiAJCWJkZXYtPmJkX2Jsb2NrX3NpemUgPSAoMSA8PCBpbm9kZS0+aV9ibGtiaXRzKTsKIAkJYmRldi0+YmRfcGFydF9jb3VudCA9IDA7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9NYWtlZmlsZSBiL2ZzL2J0cmZzL01ha2VmaWxlCmluZGV4IDliNzJkY2YuLjQwZTZhYzAgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL01ha2VmaWxlCisrKyBiL2ZzL2J0cmZzL01ha2VmaWxlCkBAIC02LDUgKzYsNyBAQAogCSAgIHRyYW5zYWN0aW9uLm8gaW5vZGUubyBmaWxlLm8gdHJlZS1kZWZyYWcubyBcCiAJICAgZXh0ZW50X21hcC5vIHN5c2ZzLm8gc3RydWN0LWZ1bmNzLm8geGF0dHIubyBvcmRlcmVkLWRhdGEubyBcCiAJICAgZXh0ZW50X2lvLm8gdm9sdW1lcy5vIGFzeW5jLXRocmVhZC5vIGlvY3RsLm8gbG9ja2luZy5vIG9ycGhhbi5vIFwKLQkgICBleHBvcnQubyB0cmVlLWxvZy5vIGFjbC5vIGZyZWUtc3BhY2UtY2FjaGUubyB6bGliLm8gbHpvLm8gXAorCSAgIGV4cG9ydC5vIHRyZWUtbG9nLm8gZnJlZS1zcGFjZS1jYWNoZS5vIHpsaWIubyBsem8ubyBcCiAJICAgY29tcHJlc3Npb24ubyBkZWxheWVkLXJlZi5vIHJlbG9jYXRpb24ubyBkZWxheWVkLWlub2RlLm8gc2NydWIubworCitidHJmcy0kKENPTkZJR19CVFJGU19GU19QT1NJWF9BQ0wpICs9IGFjbC5vCmRpZmYgLS1naXQgYS9mcy9idHJmcy9hY2wuYyBiL2ZzL2J0cmZzL2FjbC5jCmluZGV4IDY1YTczNWQuLmViMTU5YWEgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2FjbC5jCisrKyBiL2ZzL2J0cmZzL2FjbC5jCkBAIC0yOCw4ICsyOCw2IEBACiAjaW5jbHVkZSAiYnRyZnNfaW5vZGUuaCIKICNpbmNsdWRlICJ4YXR0ci5oIgogCi0jaWZkZWYgQ09ORklHX0JUUkZTX0ZTX1BPU0lYX0FDTAotCiBzdHJ1Y3QgcG9zaXhfYWNsICpidHJmc19nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQogewogCWludCBzaXplOwpAQCAtMTExLDcgKzEwOSw2IEBACiAJaW50IHJldCwgc2l6ZSA9IDA7CiAJY29uc3QgY2hhciAqbmFtZTsKIAljaGFyICp2YWx1ZSA9IE5VTEw7Ci0JbW9kZV90IG1vZGU7CiAKIAlpZiAoYWNsKSB7CiAJCXJldCA9IHBvc2l4X2FjbF92YWxpZChhY2wpOwpAQCAtMTIyLDEzICsxMTksMTEgQEAKIAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgotCQltb2RlID0gaW5vZGUtPmlfbW9kZTsKIAkJbmFtZSA9IFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1M7CiAJCWlmIChhY2wpIHsKLQkJCXJldCA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJm1vZGUpOworCQkJcmV0ID0gcG9zaXhfYWNsX2VxdWl2X21vZGUoYWNsLCAmaW5vZGUtPmlfbW9kZSk7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlyZXR1cm4gcmV0OwotCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCX0KIAkJcmV0ID0gMDsKIAkJYnJlYWs7CkBAIC0yMjIsMTkgKzIxNywxNiBAQAogCX0KIAogCWlmIChJU19QT1NJWEFDTChkaXIpICYmIGFjbCkgewotCQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7Ci0KIAkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKIAkJCXJldCA9IGJ0cmZzX3NldF9hY2wodHJhbnMsIGlub2RlLCBhY2wsCiAJCQkJCSAgICBBQ0xfVFlQRV9ERUZBVUxUKTsKIAkJCWlmIChyZXQpCiAJCQkJZ290byBmYWlsZWQ7CiAJCX0KLQkJcmV0ID0gcG9zaXhfYWNsX2NyZWF0ZSgmYWNsLCBHRlBfTk9GUywgJm1vZGUpOworCQlyZXQgPSBwb3NpeF9hY2xfY3JlYXRlKCZhY2wsIEdGUF9OT0ZTLCAmaW5vZGUtPmlfbW9kZSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAotCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJaWYgKHJldCA+IDApIHsKIAkJCS8qIHdlIG5lZWQgYW4gYWNsICovCiAJCQlyZXQgPSBidHJmc19zZXRfYWNsKHRyYW5zLCBpbm9kZSwgYWNsLCBBQ0xfVFlQRV9BQ0NFU1MpOwpAQCAtMjgyLDE4ICsyNzQsMyBAQAogCS5nZXQJPSBidHJmc194YXR0cl9hY2xfZ2V0LAogCS5zZXQJPSBidHJmc194YXR0cl9hY2xfc2V0LAogfTsKLQotI2Vsc2UgLyogQ09ORklHX0JUUkZTX0ZTX1BPU0lYX0FDTCAqLwotCi1pbnQgYnRyZnNfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBidHJmc19pbml0X2FjbChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKLQkJICAgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfQlRSRlNfRlNfUE9TSVhfQUNMICovCmRpZmYgLS1naXQgYS9mcy9idHJmcy9jb21wcmVzc2lvbi5jIGIvZnMvYnRyZnMvY29tcHJlc3Npb24uYwppbmRleCBiZmU0MmIwLi44ZWM1ZDg2IDEwMDY0NAotLS0gYS9mcy9idHJmcy9jb21wcmVzc2lvbi5jCisrKyBiL2ZzL2J0cmZzL2NvbXByZXNzaW9uLmMKQEAgLTMzOCw2ICszMzgsNyBAQAogCXU2NCBmaXJzdF9ieXRlID0gZGlza19zdGFydDsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwogCWludCByZXQ7CisJaW50IHNraXBfc3VtID0gQlRSRlNfSShpbm9kZSktPmZsYWdzICYgQlRSRlNfSU5PREVfTk9EQVRBU1VNOwogCiAJV0FSTl9PTihzdGFydCAmICgodTY0KVBBR0VfQ0FDSEVfU0laRSAtIDEpKTsKIAljYiA9IGttYWxsb2MoY29tcHJlc3NlZF9iaW9fc2l6ZShyb290LCBjb21wcmVzc2VkX2xlbiksIEdGUF9OT0ZTKTsKQEAgLTM5Miw4ICszOTMsMTEgQEAKIAkJCXJldCA9IGJ0cmZzX2Jpb193cV9lbmRfaW8ocm9vdC0+ZnNfaW5mbywgYmlvLCAwKTsKIAkJCUJVR19PTihyZXQpOwogCi0JCQlyZXQgPSBidHJmc19jc3VtX29uZV9iaW8ocm9vdCwgaW5vZGUsIGJpbywgc3RhcnQsIDEpOwotCQkJQlVHX09OKHJldCk7CisJCQlpZiAoIXNraXBfc3VtKSB7CisJCQkJcmV0ID0gYnRyZnNfY3N1bV9vbmVfYmlvKHJvb3QsIGlub2RlLCBiaW8sCisJCQkJCQkJIHN0YXJ0LCAxKTsKKwkJCQlCVUdfT04ocmV0KTsKKwkJCX0KIAogCQkJcmV0ID0gYnRyZnNfbWFwX2Jpbyhyb290LCBXUklURSwgYmlvLCAwLCAxKTsKIAkJCUJVR19PTihyZXQpOwpAQCAtNDE4LDggKzQyMiwxMCBAQAogCXJldCA9IGJ0cmZzX2Jpb193cV9lbmRfaW8ocm9vdC0+ZnNfaW5mbywgYmlvLCAwKTsKIAlCVUdfT04ocmV0KTsKIAotCXJldCA9IGJ0cmZzX2NzdW1fb25lX2Jpbyhyb290LCBpbm9kZSwgYmlvLCBzdGFydCwgMSk7Ci0JQlVHX09OKHJldCk7CisJaWYgKCFza2lwX3N1bSkgeworCQlyZXQgPSBidHJmc19jc3VtX29uZV9iaW8ocm9vdCwgaW5vZGUsIGJpbywgc3RhcnQsIDEpOworCQlCVUdfT04ocmV0KTsKKwl9CiAKIAlyZXQgPSBidHJmc19tYXBfYmlvKHJvb3QsIFdSSVRFLCBiaW8sIDAsIDEpOwogCUJVR19PTihyZXQpOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvY3RyZWUuaCBiL2ZzL2J0cmZzL2N0cmVlLmgKaW5kZXggMzY1YzRlMS4uMDQ2OTI2MyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvY3RyZWUuaAorKysgYi9mcy9idHJmcy9jdHJlZS5oCkBAIC0yNDA2LDggKzI0MDYsOCBAQAogCQkJIGJ0cmZzX3Jvb3RfaXRlbSAqaXRlbSwgc3RydWN0IGJ0cmZzX2tleSAqa2V5KTsKIGludCBidHJmc19maW5kX2RlYWRfcm9vdHMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBvYmplY3RpZCk7CiBpbnQgYnRyZnNfZmluZF9vcnBoYW5fcm9vdHMoc3RydWN0IGJ0cmZzX3Jvb3QgKnRyZWVfcm9vdCk7Ci1pbnQgYnRyZnNfc2V0X3Jvb3Rfbm9kZShzdHJ1Y3QgYnRyZnNfcm9vdF9pdGVtICppdGVtLAotCQkJc3RydWN0IGV4dGVudF9idWZmZXIgKm5vZGUpOwordm9pZCBidHJmc19zZXRfcm9vdF9ub2RlKHN0cnVjdCBidHJmc19yb290X2l0ZW0gKml0ZW0sCisJCQkgc3RydWN0IGV4dGVudF9idWZmZXIgKm5vZGUpOwogdm9pZCBidHJmc19jaGVja19hbmRfaW5pdF9yb290X2l0ZW0oc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSAqaXRlbSk7CiAKIC8qIGRpci1pdGVtLmMgKi8KQEAgLTI1MjMsNiArMjUyMywxNCBAQAogI2RlZmluZSBQYWdlQ2hlY2tlZCBQYWdlRnNNaXNjCiAjZW5kaWYKIAorLyogVGhpcyBmb3JjZXMgcmVhZGFoZWFkIG9uIGEgZ2l2ZW4gcmFuZ2Ugb2YgYnl0ZXMgaW4gYW4gaW5vZGUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBidHJmc19mb3JjZV9yYShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQkgIHN0cnVjdCBmaWxlX3JhX3N0YXRlICpyYSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICBwZ29mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyByZXFfc2l6ZSkKK3sKKwlwYWdlX2NhY2hlX3N5bmNfcmVhZGFoZWFkKG1hcHBpbmcsIHJhLCBmaWxlLCBvZmZzZXQsIHJlcV9zaXplKTsKK30KKwogc3RydWN0IGlub2RlICpidHJmc19sb29rdXBfZGVudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOwogaW50IGJ0cmZzX3NldF9pbm9kZV9pbmRleChzdHJ1Y3QgaW5vZGUgKmRpciwgdTY0ICppbmRleCk7CiBpbnQgYnRyZnNfdW5saW5rX2lub2RlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLApAQCAtMjU1MSw5ICsyNTU5LDYgQEAKIGludCBidHJmc19tZXJnZV9iaW9faG9vayhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCiAJCQkgc2l6ZV90IHNpemUsIHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgbG9uZyBiaW9fZmxhZ3MpOwogCi11bnNpZ25lZCBsb25nIGJ0cmZzX2ZvcmNlX3JhKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAotCQkJICAgICAgc3RydWN0IGZpbGVfcmFfc3RhdGUgKnJhLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgIHBnb2ZmX3Qgb2Zmc2V0LCBwZ29mZl90IGxhc3RfaW5kZXgpOwogaW50IGJ0cmZzX3BhZ2VfbWt3cml0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpOwogaW50IGJ0cmZzX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSk7CiB2b2lkIGJ0cmZzX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwpAQCAtMjY0OCwxMiArMjY1MywyMSBAQAogLyogYWNsLmMgKi8KICNpZmRlZiBDT05GSUdfQlRSRlNfRlNfUE9TSVhfQUNMCiBzdHJ1Y3QgcG9zaXhfYWNsICpidHJmc19nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKTsKLSNlbHNlCi0jZGVmaW5lIGJ0cmZzX2dldF9hY2wgTlVMTAotI2VuZGlmCiBpbnQgYnRyZnNfaW5pdF9hY2woc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCiAJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyKTsKIGludCBidHJmc19hY2xfY2htb2Qoc3RydWN0IGlub2RlICppbm9kZSk7CisjZWxzZQorI2RlZmluZSBidHJmc19nZXRfYWNsIE5VTEwKK3N0YXRpYyBpbmxpbmUgaW50IGJ0cmZzX2luaXRfYWNsKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKmRpcikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGJ0cmZzX2FjbF9jaG1vZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiAwOworfQorI2VuZGlmCiAKIC8qIHJlbG9jYXRpb24uYyAqLwogaW50IGJ0cmZzX3JlbG9jYXRlX2Jsb2NrX2dyb3VwKHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgZ3JvdXBfc3RhcnQpOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZGlyLWl0ZW0uYyBiL2ZzL2J0cmZzL2Rpci1pdGVtLmMKaW5kZXggYzM2MGE4NC4uMzFkODRlNyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZGlyLWl0ZW0uYworKysgYi9mcy9idHJmcy9kaXItaXRlbS5jCkBAIC0xOTgsOCArMTk4LDYgQEAKIAlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKIAlpbnQgaW5zX2xlbiA9IG1vZCA8IDAgPyAtMSA6IDA7CiAJaW50IGNvdyA9IG1vZCAhPSAwOwotCXN0cnVjdCBidHJmc19rZXkgZm91bmRfa2V5OwotCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOwogCiAJa2V5Lm9iamVjdGlkID0gZGlyOwogCWJ0cmZzX3NldF9rZXlfdHlwZSgma2V5LCBCVFJGU19ESVJfSVRFTV9LRVkpOwpAQCAtMjA5LDE4ICsyMDcsNyBAQAogCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCByb290LCAma2V5LCBwYXRoLCBpbnNfbGVuLCBjb3cpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwotCWlmIChyZXQgPiAwKSB7Ci0JCWlmIChwYXRoLT5zbG90c1swXSA9PSAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXBhdGgtPnNsb3RzWzBdLS07Ci0JfQotCi0JbGVhZiA9IHBhdGgtPm5vZGVzWzBdOwotCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAmZm91bmRfa2V5LCBwYXRoLT5zbG90c1swXSk7Ci0KLQlpZiAoZm91bmRfa2V5Lm9iamVjdGlkICE9IGRpciB8fAotCSAgICBidHJmc19rZXlfdHlwZSgmZm91bmRfa2V5KSAhPSBCVFJGU19ESVJfSVRFTV9LRVkgfHwKLQkgICAgZm91bmRfa2V5Lm9mZnNldCAhPSBrZXkub2Zmc2V0KQorCWlmIChyZXQgPiAwKQogCQlyZXR1cm4gTlVMTDsKIAogCXJldHVybiBidHJmc19tYXRjaF9kaXJfaXRlbV9uYW1lKHJvb3QsIHBhdGgsIG5hbWUsIG5hbWVfbGVuKTsKQEAgLTMxNSw4ICszMDIsNiBAQAogCXN0cnVjdCBidHJmc19rZXkga2V5OwogCWludCBpbnNfbGVuID0gbW9kIDwgMCA/IC0xIDogMDsKIAlpbnQgY293ID0gbW9kICE9IDA7Ci0Jc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7Ci0Jc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CiAKIAlrZXkub2JqZWN0aWQgPSBkaXI7CiAJYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIEJUUkZTX1hBVFRSX0lURU1fS0VZKTsKQEAgLTMyNCwxOCArMzA5LDcgQEAKIAlyZXQgPSBidHJmc19zZWFyY2hfc2xvdCh0cmFucywgcm9vdCwgJmtleSwgcGF0aCwgaW5zX2xlbiwgY293KTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKLQlpZiAocmV0ID4gMCkgewotCQlpZiAocGF0aC0+c2xvdHNbMF0gPT0gMCkKLQkJCXJldHVybiBOVUxMOwotCQlwYXRoLT5zbG90c1swXS0tOwotCX0KLQotCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKLQlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmZvdW5kX2tleSwgcGF0aC0+c2xvdHNbMF0pOwotCi0JaWYgKGZvdW5kX2tleS5vYmplY3RpZCAhPSBkaXIgfHwKLQkgICAgYnRyZnNfa2V5X3R5cGUoJmZvdW5kX2tleSkgIT0gQlRSRlNfWEFUVFJfSVRFTV9LRVkgfHwKLQkgICAgZm91bmRfa2V5Lm9mZnNldCAhPSBrZXkub2Zmc2V0KQorCWlmIChyZXQgPiAwKQogCQlyZXR1cm4gTlVMTDsKIAogCXJldHVybiBidHJmc19tYXRjaF9kaXJfaXRlbV9uYW1lKHJvb3QsIHBhdGgsIG5hbWUsIG5hbWVfbGVuKTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMgYi9mcy9idHJmcy9leHRlbnQtdHJlZS5jCmluZGV4IDRkMDhlZDcuLjY2YmFjMjIgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMKKysrIGIvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYwpAQCAtNjYzLDcgKzY2Myw5IEBACiAJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwotCUJVR19PTighcGF0aCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCWtleS5vYmplY3RpZCA9IHN0YXJ0OwogCWtleS5vZmZzZXQgPSBsZW47CiAJYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIEJUUkZTX0VYVEVOVF9JVEVNX0tFWSk7CkBAIC0zMjcyLDYgKzMyNzQsOSBAQAogCX0KIAogCXJldCA9IGJ0cmZzX2FsbG9jX2NodW5rKHRyYW5zLCBleHRlbnRfcm9vdCwgZmxhZ3MpOworCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRU5PU1BDKQorCQlnb3RvIG91dDsKKwogCXNwaW5fbG9jaygmc3BhY2VfaW5mby0+bG9jayk7CiAJaWYgKHJldCkKIAkJc3BhY2VfaW5mby0+ZnVsbCA9IDE7CkBAIC0zMjgxLDYgKzMyODYsNyBAQAogCXNwYWNlX2luZm8tPmZvcmNlX2FsbG9jID0gQ0hVTktfQUxMT0NfTk9fRk9SQ0U7CiAJc3BhY2VfaW5mby0+Y2h1bmtfYWxsb2MgPSAwOwogCXNwaW5fdW5sb2NrKCZzcGFjZV9pbmZvLT5sb2NrKTsKK291dDoKIAltdXRleF91bmxvY2soJmV4dGVudF9yb290LT5mc19pbmZvLT5jaHVua19tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTQ0NTYsNyArNDQ2Miw5IEBACiAJCQkJcHJpbnRrKEtFUk5fRVJSICJ1bW0sIGdvdCAlZCBiYWNrIGZyb20gc2VhcmNoIgogCQkJCSAgICAgICAiLCB3YXMgbG9va2luZyBmb3IgJWxsdVxuIiwgcmV0LAogCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ5dGVucik7Ci0JCQkJYnRyZnNfcHJpbnRfbGVhZihleHRlbnRfcm9vdCwgcGF0aC0+bm9kZXNbMF0pOworCQkJCWlmIChyZXQgPiAwKQorCQkJCQlidHJmc19wcmludF9sZWFmKGV4dGVudF9yb290LAorCQkJCQkJCSBwYXRoLT5ub2Rlc1swXSk7CiAJCQl9CiAJCQlCVUdfT04ocmV0KTsKIAkJCWV4dGVudF9zbG90ID0gcGF0aC0+c2xvdHNbMF07CkBAIC01MDczLDcgKzUwODEsOSBAQAogCQkJICogZ3JvdXAgaXMgZG9lcyBwb2ludCB0byBhbmQgdHJ5IGFnYWluCiAJCQkgKi8KIAkJCWlmICghbGFzdF9wdHJfbG9vcCAmJiBsYXN0X3B0ci0+YmxvY2tfZ3JvdXAgJiYKLQkJCSAgICBsYXN0X3B0ci0+YmxvY2tfZ3JvdXAgIT0gYmxvY2tfZ3JvdXApIHsKKwkJCSAgICBsYXN0X3B0ci0+YmxvY2tfZ3JvdXAgIT0gYmxvY2tfZ3JvdXAgJiYKKwkJCSAgICBpbmRleCA8PQorCQkJCSBnZXRfYmxvY2tfZ3JvdXBfaW5kZXgobGFzdF9wdHItPmJsb2NrX2dyb3VwKSkgewogCiAJCQkJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwKGJsb2NrX2dyb3VwKTsKIAkJCQlibG9ja19ncm91cCA9IGxhc3RfcHRyLT5ibG9ja19ncm91cDsKQEAgLTU1MDEsNyArNTUxMSw4IEBACiAJdTMyIHNpemUgPSBzaXplb2YoKmV4dGVudF9pdGVtKSArIHNpemVvZigqYmxvY2tfaW5mbykgKyBzaXplb2YoKmlyZWYpOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKLQlCVUdfT04oIXBhdGgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlwYXRoLT5sZWF2ZV9zcGlubmluZyA9IDE7CiAJcmV0ID0gYnRyZnNfaW5zZXJ0X2VtcHR5X2l0ZW0odHJhbnMsIGZzX2luZm8tPmV4dGVudF9yb290LCBwYXRoLApAQCAtNjI3MiwxMCArNjI4MywxNCBAQAogCWludCBsZXZlbDsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JQlVHX09OKCFwYXRoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOwogCiAJd2MgPSBremFsbG9jKHNpemVvZigqd2MpLCBHRlBfTk9GUyk7Ci0JQlVHX09OKCF3Yyk7CisJaWYgKCF3YykgeworCQlidHJmc19mcmVlX3BhdGgocGF0aCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAogCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24odHJlZV9yb290LCAwKTsKIAlCVUdfT04oSVNfRVJSKHRyYW5zKSk7CkBAIC02NTM4LDggKzY1NTMsNiBAQAogCXU2NCBtaW5fYWxsb2NhYmxlX2J5dGVzOwogCWludCByZXQgPSAtRU5PU1BDOwogCi0JaWYgKGNhY2hlLT5ybykKLQkJcmV0dXJuIDA7CiAKIAkvKgogCSAqIFdlIG5lZWQgc29tZSBtZXRhZGF0YSBzcGFjZSBhbmQgc3lzdGVtIG1ldGFkYXRhIHNwYWNlIGZvcgpAQCAtNjU1NSw2ICs2NTY4LDEyIEBACiAKIAlzcGluX2xvY2soJnNpbmZvLT5sb2NrKTsKIAlzcGluX2xvY2soJmNhY2hlLT5sb2NrKTsKKworCWlmIChjYWNoZS0+cm8pIHsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CisJfQorCiAJbnVtX2J5dGVzID0gY2FjaGUtPmtleS5vZmZzZXQgLSBjYWNoZS0+cmVzZXJ2ZWQgLSBjYWNoZS0+cGlubmVkIC0KIAkJICAgIGNhY2hlLT5ieXRlc19zdXBlciAtIGJ0cmZzX2Jsb2NrX2dyb3VwX3VzZWQoJmNhY2hlLT5pdGVtKTsKIApAQCAtNjU2OCw3ICs2NTg3LDcgQEAKIAkJY2FjaGUtPnJvID0gMTsKIAkJcmV0ID0gMDsKIAl9Ci0KK291dDoKIAlzcGluX3VubG9jaygmY2FjaGUtPmxvY2spOwogCXNwaW5fdW5sb2NrKCZzaW5mby0+bG9jayk7CiAJcmV0dXJuIHJldDsKQEAgLTcxODMsMTEgKzcyMDIsMTUgQEAKIAlzcGluX3VubG9jaygmY2x1c3Rlci0+cmVmaWxsX2xvY2spOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKLQlCVUdfT04oIXBhdGgpOworCWlmICghcGF0aCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CiAKIAlpbm9kZSA9IGxvb2t1cF9mcmVlX3NwYWNlX2lub2RlKHJvb3QsIGJsb2NrX2dyb3VwLCBwYXRoKTsKIAlpZiAoIUlTX0VSUihpbm9kZSkpIHsKLQkJYnRyZnNfb3JwaGFuX2FkZCh0cmFucywgaW5vZGUpOworCQlyZXQgPSBidHJmc19vcnBoYW5fYWRkKHRyYW5zLCBpbm9kZSk7CisJCUJVR19PTihyZXQpOwogCQljbGVhcl9ubGluayhpbm9kZSk7CiAJCS8qIE9uZSBmb3IgdGhlIGJsb2NrIGdyb3VwcyByZWYgKi8KIAkJc3Bpbl9sb2NrKCZibG9ja19ncm91cC0+bG9jayk7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9leHRlbnRfaW8uYyBiL2ZzL2J0cmZzL2V4dGVudF9pby5jCmluZGV4IDA2N2IxNzQuLmQ0MTgxNjQgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2V4dGVudF9pby5jCisrKyBiL2ZzL2J0cmZzL2V4dGVudF9pby5jCkBAIC0yNTQsMTQgKzI1NCwxNCBAQAogICoKICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSB0cmVlIGxvY2sgaGVsZC4KICAqLwotc3RhdGljIGludCBtZXJnZV9zdGF0ZShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCi0JCSAgICAgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSkKK3N0YXRpYyB2b2lkIG1lcmdlX3N0YXRlKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJICAgICAgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSkKIHsKIAlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpvdGhlcjsKIAlzdHJ1Y3QgcmJfbm9kZSAqb3RoZXJfbm9kZTsKIAogCWlmIChzdGF0ZS0+c3RhdGUgJiAoRVhURU5UX0lPQklUUyB8IEVYVEVOVF9CT1VOREFSWSkpCi0JCXJldHVybiAwOworCQlyZXR1cm47CiAKIAlvdGhlcl9ub2RlID0gcmJfcHJldigmc3RhdGUtPnJiX25vZGUpOwogCWlmIChvdGhlcl9ub2RlKSB7CkBAIC0yODcsMTkgKzI4NywxMyBAQAogCQkJZnJlZV9leHRlbnRfc3RhdGUob3RoZXIpOwogCQl9CiAJfQotCi0JcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2V0X3N0YXRlX2NiKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKK3N0YXRpYyB2b2lkIHNldF9zdGF0ZV9jYihzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCiAJCQkgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsIGludCAqYml0cykKIHsKLQlpZiAodHJlZS0+b3BzICYmIHRyZWUtPm9wcy0+c2V0X2JpdF9ob29rKSB7Ci0JCXJldHVybiB0cmVlLT5vcHMtPnNldF9iaXRfaG9vayh0cmVlLT5tYXBwaW5nLT5ob3N0LAotCQkJCQkgICAgICAgc3RhdGUsIGJpdHMpOwotCX0KLQotCXJldHVybiAwOworCWlmICh0cmVlLT5vcHMgJiYgdHJlZS0+b3BzLT5zZXRfYml0X2hvb2spCisJCXRyZWUtPm9wcy0+c2V0X2JpdF9ob29rKHRyZWUtPm1hcHBpbmctPmhvc3QsIHN0YXRlLCBiaXRzKTsKIH0KIAogc3RhdGljIHZvaWQgY2xlYXJfc3RhdGVfY2Ioc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLApAQCAtMzA5LDYgKzMwMyw5IEBACiAJCXRyZWUtPm9wcy0+Y2xlYXJfYml0X2hvb2sodHJlZS0+bWFwcGluZy0+aG9zdCwgc3RhdGUsIGJpdHMpOwogfQogCitzdGF0aWMgdm9pZCBzZXRfc3RhdGVfYml0cyhzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCisJCQkgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSwgaW50ICpiaXRzKTsKKwogLyoKICAqIGluc2VydCBhbiBleHRlbnRfc3RhdGUgc3RydWN0IGludG8gdGhlIHRyZWUuICAnYml0cycgYXJlIHNldCBvbiB0aGUKICAqIHN0cnVjdCBiZWZvcmUgaXQgaXMgaW5zZXJ0ZWQuCkBAIC0zMjQsOCArMzIxLDYgQEAKIAkJCWludCAqYml0cykKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKLQlpbnQgYml0c190b19zZXQgPSAqYml0cyAmIH5FWFRFTlRfQ1RMQklUUzsKLQlpbnQgcmV0OwogCiAJaWYgKGVuZCA8IHN0YXJ0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiYnRyZnMgZW5kIDwgc3RhcnQgJWxsdSAlbGx1XG4iLApAQCAtMzM1LDEzICszMzAsOSBAQAogCX0KIAlzdGF0ZS0+c3RhcnQgPSBzdGFydDsKIAlzdGF0ZS0+ZW5kID0gZW5kOwotCXJldCA9IHNldF9zdGF0ZV9jYih0cmVlLCBzdGF0ZSwgYml0cyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKIAotCWlmIChiaXRzX3RvX3NldCAmIEVYVEVOVF9ESVJUWSkKLQkJdHJlZS0+ZGlydHlfYnl0ZXMgKz0gZW5kIC0gc3RhcnQgKyAxOwotCXN0YXRlLT5zdGF0ZSB8PSBiaXRzX3RvX3NldDsKKwlzZXRfc3RhdGVfYml0cyh0cmVlLCBzdGF0ZSwgYml0cyk7CisKIAlub2RlID0gdHJlZV9pbnNlcnQoJnRyZWUtPnN0YXRlLCBlbmQsICZzdGF0ZS0+cmJfbm9kZSk7CiAJaWYgKG5vZGUpIHsKIAkJc3RydWN0IGV4dGVudF9zdGF0ZSAqZm91bmQ7CkBAIC0zNTcsMTMgKzM0OCwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNwbGl0X2NiKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgc3RydWN0IGV4dGVudF9zdGF0ZSAqb3JpZywKK3N0YXRpYyB2b2lkIHNwbGl0X2NiKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgc3RydWN0IGV4dGVudF9zdGF0ZSAqb3JpZywKIAkJICAgICB1NjQgc3BsaXQpCiB7CiAJaWYgKHRyZWUtPm9wcyAmJiB0cmVlLT5vcHMtPnNwbGl0X2V4dGVudF9ob29rKQotCQlyZXR1cm4gdHJlZS0+b3BzLT5zcGxpdF9leHRlbnRfaG9vayh0cmVlLT5tYXBwaW5nLT5ob3N0LAotCQkJCQkJICAgIG9yaWcsIHNwbGl0KTsKLQlyZXR1cm4gMDsKKwkJdHJlZS0+b3BzLT5zcGxpdF9leHRlbnRfaG9vayh0cmVlLT5tYXBwaW5nLT5ob3N0LCBvcmlnLCBzcGxpdCk7CiB9CiAKIC8qCkBAIC02NTksMzQgKzY0OCwyNSBAQAogCQlpZiAoc3RhcnQgPiBlbmQpCiAJCQlicmVhazsKIAotCQlpZiAobmVlZF9yZXNjaGVkKCkpIHsKLQkJCXNwaW5fdW5sb2NrKCZ0cmVlLT5sb2NrKTsKLQkJCWNvbmRfcmVzY2hlZCgpOwotCQkJc3Bpbl9sb2NrKCZ0cmVlLT5sb2NrKTsKLQkJfQorCQljb25kX3Jlc2NoZWRfbG9jaygmdHJlZS0+bG9jayk7CiAJfQogb3V0OgogCXNwaW5fdW5sb2NrKCZ0cmVlLT5sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzZXRfc3RhdGVfYml0cyhzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCitzdGF0aWMgdm9pZCBzZXRfc3RhdGVfYml0cyhzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCiAJCQkgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSwKIAkJCSAgIGludCAqYml0cykKIHsKLQlpbnQgcmV0OwogCWludCBiaXRzX3RvX3NldCA9ICpiaXRzICYgfkVYVEVOVF9DVExCSVRTOwogCi0JcmV0ID0gc2V0X3N0YXRlX2NiKHRyZWUsIHN0YXRlLCBiaXRzKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCXNldF9zdGF0ZV9jYih0cmVlLCBzdGF0ZSwgYml0cyk7CiAJaWYgKChiaXRzX3RvX3NldCAmIEVYVEVOVF9ESVJUWSkgJiYgIShzdGF0ZS0+c3RhdGUgJiBFWFRFTlRfRElSVFkpKSB7CiAJCXU2NCByYW5nZSA9IHN0YXRlLT5lbmQgLSBzdGF0ZS0+c3RhcnQgKyAxOwogCQl0cmVlLT5kaXJ0eV9ieXRlcyArPSByYW5nZTsKIAl9CiAJc3RhdGUtPnN0YXRlIHw9IGJpdHNfdG9fc2V0OwotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGNhY2hlX3N0YXRlKHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlLApAQCAtNzc5LDkgKzc1OSw3IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCWVyciA9IHNldF9zdGF0ZV9iaXRzKHRyZWUsIHN0YXRlLCAmYml0cyk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dDsKKwkJc2V0X3N0YXRlX2JpdHModHJlZSwgc3RhdGUsICZiaXRzKTsKIAogCQljYWNoZV9zdGF0ZShzdGF0ZSwgY2FjaGVkX3N0YXRlKTsKIAkJbWVyZ2Vfc3RhdGUodHJlZSwgc3RhdGUpOwpAQCAtODMwLDkgKzgwOCw3IEBACiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAkJaWYgKHN0YXRlLT5lbmQgPD0gZW5kKSB7Ci0JCQllcnIgPSBzZXRfc3RhdGVfYml0cyh0cmVlLCBzdGF0ZSwgJmJpdHMpOwotCQkJaWYgKGVycikKLQkJCQlnb3RvIG91dDsKKwkJCXNldF9zdGF0ZV9iaXRzKHRyZWUsIHN0YXRlLCAmYml0cyk7CiAJCQljYWNoZV9zdGF0ZShzdGF0ZSwgY2FjaGVkX3N0YXRlKTsKIAkJCW1lcmdlX3N0YXRlKHRyZWUsIHN0YXRlKTsKIAkJCWlmIChsYXN0X2VuZCA9PSAodTY0KS0xKQpAQCAtODkzLDExICs4NjksNyBAQAogCQllcnIgPSBzcGxpdF9zdGF0ZSh0cmVlLCBzdGF0ZSwgcHJlYWxsb2MsIGVuZCArIDEpOwogCQlCVUdfT04oZXJyID09IC1FRVhJU1QpOwogCi0JCWVyciA9IHNldF9zdGF0ZV9iaXRzKHRyZWUsIHByZWFsbG9jLCAmYml0cyk7Ci0JCWlmIChlcnIpIHsKLQkJCXByZWFsbG9jID0gTlVMTDsKLQkJCWdvdG8gb3V0OwotCQl9CisJCXNldF9zdGF0ZV9iaXRzKHRyZWUsIHByZWFsbG9jLCAmYml0cyk7CiAJCWNhY2hlX3N0YXRlKHByZWFsbG9jLCBjYWNoZWRfc3RhdGUpOwogCQltZXJnZV9zdGF0ZSh0cmVlLCBwcmVhbGxvYyk7CiAJCXByZWFsbG9jID0gTlVMTDsKQEAgLTEwNTksNDYgKzEwMzEsNiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogZmluZCB0aGUgZmlyc3Qgb2Zmc2V0IGluIHRoZSBpbyB0cmVlIHdpdGggJ2JpdHMnIHNldC4gemVybyBpcwotICogcmV0dXJuZWQgaWYgd2UgZmluZCBzb21ldGhpbmcsIGFuZCAqc3RhcnRfcmV0IGFuZCAqZW5kX3JldCBhcmUKLSAqIHNldCB0byByZWZsZWN0IHRoZSBzdGF0ZSBzdHJ1Y3QgdGhhdCB3YXMgZm91bmQuCi0gKgotICogSWYgbm90aGluZyB3YXMgZm91bmQsIDEgaXMgcmV0dXJuZWQsIDwgMCBvbiBlcnJvcgotICovCi1pbnQgZmluZF9maXJzdF9leHRlbnRfYml0KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LAotCQkJICB1NjQgKnN0YXJ0X3JldCwgdTY0ICplbmRfcmV0LCBpbnQgYml0cykKLXsKLQlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKLQlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZTsKLQlpbnQgcmV0ID0gMTsKLQotCXNwaW5fbG9jaygmdHJlZS0+bG9jayk7Ci0JLyoKLQkgKiB0aGlzIHNlYXJjaCB3aWxsIGZpbmQgYWxsIHRoZSBleHRlbnRzIHRoYXQgZW5kIGFmdGVyCi0JICogb3VyIHJhbmdlIHN0YXJ0cy4KLQkgKi8KLQlub2RlID0gdHJlZV9zZWFyY2godHJlZSwgc3RhcnQpOwotCWlmICghbm9kZSkKLQkJZ290byBvdXQ7Ci0KLQl3aGlsZSAoMSkgewotCQlzdGF0ZSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBleHRlbnRfc3RhdGUsIHJiX25vZGUpOwotCQlpZiAoc3RhdGUtPmVuZCA+PSBzdGFydCAmJiAoc3RhdGUtPnN0YXRlICYgYml0cykpIHsKLQkJCSpzdGFydF9yZXQgPSBzdGF0ZS0+c3RhcnQ7Ci0JCQkqZW5kX3JldCA9IHN0YXRlLT5lbmQ7Ci0JCQlyZXQgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQkJbm9kZSA9IHJiX25leHQobm9kZSk7Ci0JCWlmICghbm9kZSkKLQkJCWJyZWFrOwotCX0KLW91dDoKLQlzcGluX3VubG9jaygmdHJlZS0+bG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQogLyogZmluZCB0aGUgZmlyc3Qgc3RhdGUgc3RydWN0IHdpdGggJ2JpdHMnIHNldCBhZnRlciAnc3RhcnQnLCBhbmQKICAqIHJldHVybiBpdC4gIHRyZWUtPmxvY2sgbXVzdCBiZSBoZWxkLiAgTlVMTCB3aWxsIHJldHVybmVkIGlmCiAgKiBub3RoaW5nIHdhcyBmb3VuZCBhZnRlciAnc3RhcnQnCkBAIC0xMTMxLDYgKzEwNjMsMzAgQEAKIH0KIAogLyoKKyAqIGZpbmQgdGhlIGZpcnN0IG9mZnNldCBpbiB0aGUgaW8gdHJlZSB3aXRoICdiaXRzJyBzZXQuIHplcm8gaXMKKyAqIHJldHVybmVkIGlmIHdlIGZpbmQgc29tZXRoaW5nLCBhbmQgKnN0YXJ0X3JldCBhbmQgKmVuZF9yZXQgYXJlCisgKiBzZXQgdG8gcmVmbGVjdCB0aGUgc3RhdGUgc3RydWN0IHRoYXQgd2FzIGZvdW5kLgorICoKKyAqIElmIG5vdGhpbmcgd2FzIGZvdW5kLCAxIGlzIHJldHVybmVkLCA8IDAgb24gZXJyb3IKKyAqLworaW50IGZpbmRfZmlyc3RfZXh0ZW50X2JpdChzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwKKwkJCSAgdTY0ICpzdGFydF9yZXQsIHU2NCAqZW5kX3JldCwgaW50IGJpdHMpCit7CisJc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGU7CisJaW50IHJldCA9IDE7CisKKwlzcGluX2xvY2soJnRyZWUtPmxvY2spOworCXN0YXRlID0gZmluZF9maXJzdF9leHRlbnRfYml0X3N0YXRlKHRyZWUsIHN0YXJ0LCBiaXRzKTsKKwlpZiAoc3RhdGUpIHsKKwkJKnN0YXJ0X3JldCA9IHN0YXRlLT5zdGFydDsKKwkJKmVuZF9yZXQgPSBzdGF0ZS0+ZW5kOworCQlyZXQgPSAwOworCX0KKwlzcGluX3VubG9jaygmdHJlZS0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoKICAqIGZpbmQgYSBjb250aWd1b3VzIHJhbmdlIG9mIGJ5dGVzIGluIHRoZSBmaWxlIG1hcmtlZCBhcyBkZWxhbGxvYywgbm90CiAgKiBtb3JlIHRoYW4gJ21heF9ieXRlcycuICBzdGFydCBhbmQgZW5kIGFyZSB1c2VkIHRvIHJldHVybiB0aGUgcmFuZ2UsCiAgKgpAQCAtMjU0Niw3ICsyNTAyLDYgQEAKIAkJCSAgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHBhZ2UtPm1hcHBpbmc7CiAJc3RydWN0IGV4dGVudF9wYWdlX2RhdGEgZXBkID0gewogCQkuYmlvID0gTlVMTCwKIAkJLnRyZWUgPSB0cmVlLApAQCAtMjU1NCwxNyArMjUwOSw5IEBACiAJCS5leHRlbnRfbG9ja2VkID0gMCwKIAkJLnN5bmNfaW8gPSB3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTCwKIAl9OwotCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCB3YmNfd3JpdGVwYWdlcyA9IHsKLQkJLnN5bmNfbW9kZQk9IHdiYy0+c3luY19tb2RlLAotCQkubnJfdG9fd3JpdGUJPSA2NCwKLQkJLnJhbmdlX3N0YXJ0CT0gcGFnZV9vZmZzZXQocGFnZSkgKyBQQUdFX0NBQ0hFX1NJWkUsCi0JCS5yYW5nZV9lbmQJPSAobG9mZl90KS0xLAotCX07CiAKIAlyZXQgPSBfX2V4dGVudF93cml0ZXBhZ2UocGFnZSwgd2JjLCAmZXBkKTsKIAotCWV4dGVudF93cml0ZV9jYWNoZV9wYWdlcyh0cmVlLCBtYXBwaW5nLCAmd2JjX3dyaXRlcGFnZXMsCi0JCQkJIF9fZXh0ZW50X3dyaXRlcGFnZSwgJmVwZCwgZmx1c2hfd3JpdGVfYmlvKTsKIAlmbHVzaF9lcGRfd3JpdGVfYmlvKCZlcGQpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9leHRlbnRfaW8uaCBiL2ZzL2J0cmZzL2V4dGVudF9pby5oCmluZGV4IDIxYTdjYTkuLjdiMmYwYzMgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2V4dGVudF9pby5oCisrKyBiL2ZzL2J0cmZzL2V4dGVudF9pby5oCkBAIC03NiwxNSArNzYsMTUgQEAKIAkJCQkgICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUpOwogCWludCAoKndyaXRlcGFnZV9lbmRfaW9faG9vaykoc3RydWN0IHBhZ2UgKnBhZ2UsIHU2NCBzdGFydCwgdTY0IGVuZCwKIAkJCQkgICAgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSwgaW50IHVwdG9kYXRlKTsKLQlpbnQgKCpzZXRfYml0X2hvb2spKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlLAotCQkJICAgIGludCAqYml0cyk7Ci0JaW50ICgqY2xlYXJfYml0X2hvb2spKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlLAotCQkJICAgICAgaW50ICpiaXRzKTsKLQlpbnQgKCptZXJnZV9leHRlbnRfaG9vaykoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgc3RydWN0IGV4dGVudF9zdGF0ZSAqbmV3LAotCQkJCSBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpvdGhlcik7Ci0JaW50ICgqc3BsaXRfZXh0ZW50X2hvb2spKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJIHN0cnVjdCBleHRlbnRfc3RhdGUgKm9yaWcsIHU2NCBzcGxpdCk7CisJdm9pZCAoKnNldF9iaXRfaG9vaykoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsCisJCQkgICAgIGludCAqYml0cyk7CisJdm9pZCAoKmNsZWFyX2JpdF9ob29rKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSwKKwkJCSAgICAgICBpbnQgKmJpdHMpOworCXZvaWQgKCptZXJnZV9leHRlbnRfaG9vaykoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgIHN0cnVjdCBleHRlbnRfc3RhdGUgKm5ldywKKwkJCQkgIHN0cnVjdCBleHRlbnRfc3RhdGUgKm90aGVyKTsKKwl2b2lkICgqc3BsaXRfZXh0ZW50X2hvb2spKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpvcmlnLCB1NjQgc3BsaXQpOwogCWludCAoKndyaXRlX2NhY2hlX3BhZ2VzX2xvY2tfaG9vaykoc3RydWN0IHBhZ2UgKnBhZ2UpOwogfTsKIApAQCAtMTA4LDggKzEwOCw2IEBACiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd3E7CiAJYXRvbWljX3QgcmVmczsKIAl1bnNpZ25lZCBsb25nIHN0YXRlOwotCXU2NCBzcGxpdF9zdGFydDsKLQl1NjQgc3BsaXRfZW5kOwogCiAJLyogZm9yIHVzZSBieSB0aGUgRlMgKi8KIAl1NjQgcHJpdmF0ZTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudF9tYXAuYyBiL2ZzL2J0cmZzL2V4dGVudF9tYXAuYwppbmRleCAyZDA0MTAzLi43Yzk3YjMzIDEwMDY0NAotLS0gYS9mcy9idHJmcy9leHRlbnRfbWFwLmMKKysrIGIvZnMvYnRyZnMvZXh0ZW50X21hcC5jCkBAIC0xODMsMjIgKzE4MywxMCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgdW5waW5fZXh0ZW50X2NhY2hlKHN0cnVjdCBleHRlbnRfbWFwX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGxlbikKK3N0YXRpYyB2b2lkIHRyeV9tZXJnZV9tYXAoc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqdHJlZSwgc3RydWN0IGV4dGVudF9tYXAgKmVtKQogewotCWludCByZXQgPSAwOwogCXN0cnVjdCBleHRlbnRfbWFwICptZXJnZSA9IE5VTEw7CiAJc3RydWN0IHJiX25vZGUgKnJiOwotCXN0cnVjdCBleHRlbnRfbWFwICplbTsKLQotCXdyaXRlX2xvY2soJnRyZWUtPmxvY2spOwotCWVtID0gbG9va3VwX2V4dGVudF9tYXBwaW5nKHRyZWUsIHN0YXJ0LCBsZW4pOwotCi0JV0FSTl9PTighZW0gfHwgZW0tPnN0YXJ0ICE9IHN0YXJ0KTsKLQotCWlmICghZW0pCi0JCWdvdG8gb3V0OwotCi0JY2xlYXJfYml0KEVYVEVOVF9GTEFHX1BJTk5FRCwgJmVtLT5mbGFncyk7CiAKIAlpZiAoZW0tPnN0YXJ0ICE9IDApIHsKIAkJcmIgPSByYl9wcmV2KCZlbS0+cmJfbm9kZSk7CkBAIC0yMjUsNiArMjEzLDI0IEBACiAJCW1lcmdlLT5pbl90cmVlID0gMDsKIAkJZnJlZV9leHRlbnRfbWFwKG1lcmdlKTsKIAl9Cit9CisKK2ludCB1bnBpbl9leHRlbnRfY2FjaGUoc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgbGVuKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBleHRlbnRfbWFwICplbTsKKworCXdyaXRlX2xvY2soJnRyZWUtPmxvY2spOworCWVtID0gbG9va3VwX2V4dGVudF9tYXBwaW5nKHRyZWUsIHN0YXJ0LCBsZW4pOworCisJV0FSTl9PTighZW0gfHwgZW0tPnN0YXJ0ICE9IHN0YXJ0KTsKKworCWlmICghZW0pCisJCWdvdG8gb3V0OworCisJY2xlYXJfYml0KEVYVEVOVF9GTEFHX1BJTk5FRCwgJmVtLT5mbGFncyk7CisKKwl0cnlfbWVyZ2VfbWFwKHRyZWUsIGVtKTsKIAogCWZyZWVfZXh0ZW50X21hcChlbSk7CiBvdXQ6CkBAIC0yNDcsNyArMjUzLDYgQEAKIAkJICAgICAgIHN0cnVjdCBleHRlbnRfbWFwICplbSkKIHsKIAlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgZXh0ZW50X21hcCAqbWVyZ2UgPSBOVUxMOwogCXN0cnVjdCByYl9ub2RlICpyYjsKIAlzdHJ1Y3QgZXh0ZW50X21hcCAqZXhpc3Q7CiAKQEAgLTI2MywzMCArMjY4LDggQEAKIAkJZ290byBvdXQ7CiAJfQogCWF0b21pY19pbmMoJmVtLT5yZWZzKTsKLQlpZiAoZW0tPnN0YXJ0ICE9IDApIHsKLQkJcmIgPSByYl9wcmV2KCZlbS0+cmJfbm9kZSk7Ci0JCWlmIChyYikKLQkJCW1lcmdlID0gcmJfZW50cnkocmIsIHN0cnVjdCBleHRlbnRfbWFwLCByYl9ub2RlKTsKLQkJaWYgKHJiICYmIG1lcmdhYmxlX21hcHMobWVyZ2UsIGVtKSkgewotCQkJZW0tPnN0YXJ0ID0gbWVyZ2UtPnN0YXJ0OwotCQkJZW0tPmxlbiArPSBtZXJnZS0+bGVuOwotCQkJZW0tPmJsb2NrX2xlbiArPSBtZXJnZS0+YmxvY2tfbGVuOwotCQkJZW0tPmJsb2NrX3N0YXJ0ID0gbWVyZ2UtPmJsb2NrX3N0YXJ0OwotCQkJbWVyZ2UtPmluX3RyZWUgPSAwOwotCQkJcmJfZXJhc2UoJm1lcmdlLT5yYl9ub2RlLCAmdHJlZS0+bWFwKTsKLQkJCWZyZWVfZXh0ZW50X21hcChtZXJnZSk7Ci0JCX0KLQkgfQotCXJiID0gcmJfbmV4dCgmZW0tPnJiX25vZGUpOwotCWlmIChyYikKLQkJbWVyZ2UgPSByYl9lbnRyeShyYiwgc3RydWN0IGV4dGVudF9tYXAsIHJiX25vZGUpOwotCWlmIChyYiAmJiBtZXJnYWJsZV9tYXBzKGVtLCBtZXJnZSkpIHsKLQkJZW0tPmxlbiArPSBtZXJnZS0+bGVuOwotCQllbS0+YmxvY2tfbGVuICs9IG1lcmdlLT5sZW47Ci0JCXJiX2VyYXNlKCZtZXJnZS0+cmJfbm9kZSwgJnRyZWUtPm1hcCk7Ci0JCW1lcmdlLT5pbl90cmVlID0gMDsKLQkJZnJlZV9leHRlbnRfbWFwKG1lcmdlKTsKLQl9CisKKwl0cnlfbWVyZ2VfbWFwKHRyZWUsIGVtKTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjk5LDYgKzI4MiwzNCBAQAogCXJldHVybiBzdGFydCArIGxlbjsKIH0KIAorc3RydWN0IGV4dGVudF9tYXAgKl9fbG9va3VwX2V4dGVudF9tYXBwaW5nKHN0cnVjdCBleHRlbnRfbWFwX3RyZWUgKnRyZWUsCisJCQkJCSAgIHU2NCBzdGFydCwgdTY0IGxlbiwgaW50IHN0cmljdCkKK3sKKwlzdHJ1Y3QgZXh0ZW50X21hcCAqZW07CisJc3RydWN0IHJiX25vZGUgKnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnByZXYgPSBOVUxMOworCXN0cnVjdCByYl9ub2RlICpuZXh0ID0gTlVMTDsKKwl1NjQgZW5kID0gcmFuZ2VfZW5kKHN0YXJ0LCBsZW4pOworCisJcmJfbm9kZSA9IF9fdHJlZV9zZWFyY2goJnRyZWUtPm1hcCwgc3RhcnQsICZwcmV2LCAmbmV4dCk7CisJaWYgKCFyYl9ub2RlKSB7CisJCWlmIChwcmV2KQorCQkJcmJfbm9kZSA9IHByZXY7CisJCWVsc2UgaWYgKG5leHQpCisJCQlyYl9ub2RlID0gbmV4dDsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJZW0gPSByYl9lbnRyeShyYl9ub2RlLCBzdHJ1Y3QgZXh0ZW50X21hcCwgcmJfbm9kZSk7CisKKwlpZiAoc3RyaWN0ICYmICEoZW5kID4gZW0tPnN0YXJ0ICYmIHN0YXJ0IDwgZXh0ZW50X21hcF9lbmQoZW0pKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlhdG9taWNfaW5jKCZlbS0+cmVmcyk7CisJcmV0dXJuIGVtOworfQorCiAvKioKICAqIGxvb2t1cF9leHRlbnRfbWFwcGluZyAtIGxvb2t1cCBleHRlbnRfbWFwCiAgKiBAdHJlZToJdHJlZSB0byBsb29rdXAgaW4KQEAgLTMxMyw0MiArMzI0LDcgQEAKIHN0cnVjdCBleHRlbnRfbWFwICpsb29rdXBfZXh0ZW50X21hcHBpbmcoc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqdHJlZSwKIAkJCQkJIHU2NCBzdGFydCwgdTY0IGxlbikKIHsKLQlzdHJ1Y3QgZXh0ZW50X21hcCAqZW07Ci0Jc3RydWN0IHJiX25vZGUgKnJiX25vZGU7Ci0Jc3RydWN0IHJiX25vZGUgKnByZXYgPSBOVUxMOwotCXN0cnVjdCByYl9ub2RlICpuZXh0ID0gTlVMTDsKLQl1NjQgZW5kID0gcmFuZ2VfZW5kKHN0YXJ0LCBsZW4pOwotCi0JcmJfbm9kZSA9IF9fdHJlZV9zZWFyY2goJnRyZWUtPm1hcCwgc3RhcnQsICZwcmV2LCAmbmV4dCk7Ci0JaWYgKCFyYl9ub2RlICYmIHByZXYpIHsKLQkJZW0gPSByYl9lbnRyeShwcmV2LCBzdHJ1Y3QgZXh0ZW50X21hcCwgcmJfbm9kZSk7Ci0JCWlmIChlbmQgPiBlbS0+c3RhcnQgJiYgc3RhcnQgPCBleHRlbnRfbWFwX2VuZChlbSkpCi0JCQlnb3RvIGZvdW5kOwotCX0KLQlpZiAoIXJiX25vZGUgJiYgbmV4dCkgewotCQllbSA9IHJiX2VudHJ5KG5leHQsIHN0cnVjdCBleHRlbnRfbWFwLCByYl9ub2RlKTsKLQkJaWYgKGVuZCA+IGVtLT5zdGFydCAmJiBzdGFydCA8IGV4dGVudF9tYXBfZW5kKGVtKSkKLQkJCWdvdG8gZm91bmQ7Ci0JfQotCWlmICghcmJfbm9kZSkgewotCQllbSA9IE5VTEw7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoSVNfRVJSKHJiX25vZGUpKSB7Ci0JCWVtID0gRVJSX0NBU1QocmJfbm9kZSk7Ci0JCWdvdG8gb3V0OwotCX0KLQllbSA9IHJiX2VudHJ5KHJiX25vZGUsIHN0cnVjdCBleHRlbnRfbWFwLCByYl9ub2RlKTsKLQlpZiAoZW5kID4gZW0tPnN0YXJ0ICYmIHN0YXJ0IDwgZXh0ZW50X21hcF9lbmQoZW0pKQotCQlnb3RvIGZvdW5kOwotCi0JZW0gPSBOVUxMOwotCWdvdG8gb3V0OwotCi1mb3VuZDoKLQlhdG9taWNfaW5jKCZlbS0+cmVmcyk7Ci1vdXQ6Ci0JcmV0dXJuIGVtOworCXJldHVybiBfX2xvb2t1cF9leHRlbnRfbWFwcGluZyh0cmVlLCBzdGFydCwgbGVuLCAxKTsKIH0KIAogLyoqCkBAIC0zNjUsMzggKzM0MSw3IEBACiBzdHJ1Y3QgZXh0ZW50X21hcCAqc2VhcmNoX2V4dGVudF9tYXBwaW5nKHN0cnVjdCBleHRlbnRfbWFwX3RyZWUgKnRyZWUsCiAJCQkJCSB1NjQgc3RhcnQsIHU2NCBsZW4pCiB7Ci0Jc3RydWN0IGV4dGVudF9tYXAgKmVtOwotCXN0cnVjdCByYl9ub2RlICpyYl9ub2RlOwotCXN0cnVjdCByYl9ub2RlICpwcmV2ID0gTlVMTDsKLQlzdHJ1Y3QgcmJfbm9kZSAqbmV4dCA9IE5VTEw7Ci0KLQlyYl9ub2RlID0gX190cmVlX3NlYXJjaCgmdHJlZS0+bWFwLCBzdGFydCwgJnByZXYsICZuZXh0KTsKLQlpZiAoIXJiX25vZGUgJiYgcHJldikgewotCQllbSA9IHJiX2VudHJ5KHByZXYsIHN0cnVjdCBleHRlbnRfbWFwLCByYl9ub2RlKTsKLQkJZ290byBmb3VuZDsKLQl9Ci0JaWYgKCFyYl9ub2RlICYmIG5leHQpIHsKLQkJZW0gPSByYl9lbnRyeShuZXh0LCBzdHJ1Y3QgZXh0ZW50X21hcCwgcmJfbm9kZSk7Ci0JCWdvdG8gZm91bmQ7Ci0JfQotCWlmICghcmJfbm9kZSkgewotCQllbSA9IE5VTEw7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoSVNfRVJSKHJiX25vZGUpKSB7Ci0JCWVtID0gRVJSX0NBU1QocmJfbm9kZSk7Ci0JCWdvdG8gb3V0OwotCX0KLQllbSA9IHJiX2VudHJ5KHJiX25vZGUsIHN0cnVjdCBleHRlbnRfbWFwLCByYl9ub2RlKTsKLQlnb3RvIGZvdW5kOwotCi0JZW0gPSBOVUxMOwotCWdvdG8gb3V0OwotCi1mb3VuZDoKLQlhdG9taWNfaW5jKCZlbS0+cmVmcyk7Ci1vdXQ6Ci0JcmV0dXJuIGVtOworCXJldHVybiBfX2xvb2t1cF9leHRlbnRfbWFwcGluZyh0cmVlLCBzdGFydCwgbGVuLCAwKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9mcy9idHJmcy9maWxlLWl0ZW0uYyBiL2ZzL2J0cmZzL2ZpbGUtaXRlbS5jCmluZGV4IDA4YmNmYTkuLmI5MTA2OTQgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2ZpbGUtaXRlbS5jCisrKyBiL2ZzL2J0cmZzL2ZpbGUtaXRlbS5jCkBAIC0yOTEsNyArMjkxLDggQEAKIAl1MTYgY3N1bV9zaXplID0gYnRyZnNfc3VwZXJfY3N1bV9zaXplKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JQlVHX09OKCFwYXRoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOwogCiAJaWYgKHNlYXJjaF9jb21taXQpIHsKIAkJcGF0aC0+c2tpcF9sb2NraW5nID0gMTsKQEAgLTY3Nyw3ICs2NzgsOSBAQAogCQlidHJmc19zdXBlcl9jc3VtX3NpemUoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKLQlCVUdfT04oIXBhdGgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlzZWN0b3Jfc3VtID0gc3Vtcy0+c3VtczsKIGFnYWluOgogCW5leHRfb2Zmc2V0ID0gKHU2NCktMTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2ZpbGUuYyBiL2ZzL2J0cmZzL2ZpbGUuYwppbmRleCBhMzVlNTFjLi42NThkNjY5IDEwMDY0NAotLS0gYS9mcy9idHJmcy9maWxlLmMKKysrIGIvZnMvYnRyZnMvZmlsZS5jCkBAIC03NCw3ICs3NCw3IEBACiAgKiBJZiBhbiBleGlzdGluZyByZWNvcmQgaXMgZm91bmQgdGhlIGRlZnJhZyBpdGVtIHlvdQogICogcGFzcyBpbiBpcyBmcmVlZAogICovCi1zdGF0aWMgaW50IF9fYnRyZnNfYWRkX2lub2RlX2RlZnJhZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorc3RhdGljIHZvaWQgX19idHJmc19hZGRfaW5vZGVfZGVmcmFnKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICAgIHN0cnVjdCBpbm9kZV9kZWZyYWcgKmRlZnJhZykKIHsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OwpAQCAtMTA2LDExICsxMDYsMTEgQEAKIAlCVFJGU19JKGlub2RlKS0+aW5fZGVmcmFnID0gMTsKIAlyYl9saW5rX25vZGUoJmRlZnJhZy0+cmJfbm9kZSwgcGFyZW50LCBwKTsKIAlyYl9pbnNlcnRfY29sb3IoJmRlZnJhZy0+cmJfbm9kZSwgJnJvb3QtPmZzX2luZm8tPmRlZnJhZ19pbm9kZXMpOwotCXJldHVybiAwOworCXJldHVybjsKIAogZXhpc3RzOgogCWtmcmVlKGRlZnJhZyk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuOwogCiB9CiAKQEAgLTEyMyw3ICsxMjMsNiBAQAogewogCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CiAJc3RydWN0IGlub2RlX2RlZnJhZyAqZGVmcmFnOwotCWludCByZXQgPSAwOwogCXU2NCB0cmFuc2lkOwogCiAJaWYgKCFidHJmc190ZXN0X29wdChyb290LCBBVVRPX0RFRlJBRykpCkBAIC0xNTAsOSArMTQ5LDkgQEAKIAogCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+ZGVmcmFnX2lub2Rlc19sb2NrKTsKIAlpZiAoIUJUUkZTX0koaW5vZGUpLT5pbl9kZWZyYWcpCi0JCXJldCA9IF9fYnRyZnNfYWRkX2lub2RlX2RlZnJhZyhpbm9kZSwgZGVmcmFnKTsKKwkJX19idHJmc19hZGRfaW5vZGVfZGVmcmFnKGlub2RlLCBkZWZyYWcpOwogCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT5kZWZyYWdfaW5vZGVzX2xvY2spOwotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC04NTUsNyArODU0LDggQEAKIAlidHJmc19kcm9wX2V4dGVudF9jYWNoZShpbm9kZSwgc3RhcnQsIGVuZCAtIDEsIDApOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKLQlCVUdfT04oIXBhdGgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CiBhZ2FpbjoKIAlyZWNvdyA9IDA7CiAJc3BsaXQgPSBzdGFydDsKQEAgLTEwNTksNyArMTA1OSw3IEBACiBzdGF0aWMgbm9pbmxpbmUgaW50IHByZXBhcmVfcGFnZXMoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJIHN0cnVjdCBwYWdlICoqcGFnZXMsIHNpemVfdCBudW1fcGFnZXMsCiAJCQkgbG9mZl90IHBvcywgdW5zaWduZWQgbG9uZyBmaXJzdF9pbmRleCwKLQkJCSB1bnNpZ25lZCBsb25nIGxhc3RfaW5kZXgsIHNpemVfdCB3cml0ZV9ieXRlcykKKwkJCSBzaXplX3Qgd3JpdGVfYnl0ZXMpCiB7CiAJc3RydWN0IGV4dGVudF9zdGF0ZSAqY2FjaGVkX3N0YXRlID0gTlVMTDsKIAlpbnQgaTsKQEAgLTExNTksNyArMTE1OSw2IEBACiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKIAlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGZpcnN0X2luZGV4OwotCXVuc2lnbmVkIGxvbmcgbGFzdF9pbmRleDsKIAlzaXplX3QgbnVtX3dyaXR0ZW4gPSAwOwogCWludCBucnB0cnM7CiAJaW50IHJldCA9IDA7CkBAIC0xMTcyLDcgKzExNzEsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWZpcnN0X2luZGV4ID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JbGFzdF9pbmRleCA9IChwb3MgKyBpb3ZfaXRlcl9jb3VudChpKSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAogCXdoaWxlIChpb3ZfaXRlcl9jb3VudChpKSA+IDApIHsKIAkJc2l6ZV90IG9mZnNldCA9IHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKQEAgLTEyMDYsOCArMTIwNCw3IEBACiAJCSAqIGNvbnRlbnRzIG9mIHBhZ2VzIGZyb20gbG9vcCB0byBsb29wCiAJCSAqLwogCQlyZXQgPSBwcmVwYXJlX3BhZ2VzKHJvb3QsIGZpbGUsIHBhZ2VzLCBudW1fcGFnZXMsCi0JCQkJICAgIHBvcywgZmlyc3RfaW5kZXgsIGxhc3RfaW5kZXgsCi0JCQkJICAgIHdyaXRlX2J5dGVzKTsKKwkJCQkgICAgcG9zLCBmaXJzdF9pbmRleCwgd3JpdGVfYnl0ZXMpOwogCQlpZiAocmV0KSB7CiAJCQlidHJmc19kZWxhbGxvY19yZWxlYXNlX3NwYWNlKGlub2RlLAogCQkJCQludW1fcGFnZXMgPDwgUEFHRV9DQUNIRV9TSElGVCk7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9pbm9kZS5jIGIvZnMvYnRyZnMvaW5vZGUuYwppbmRleCAxM2U2MjU1Li4xNWZjZWVmIDEwMDY0NAotLS0gYS9mcy9idHJmcy9pbm9kZS5jCisrKyBiL2ZzL2J0cmZzL2lub2RlLmMKQEAgLTEwNjEsNyArMTA2MSw4IEBACiAJdTY0IGlubyA9IGJ0cmZzX2lubyhpbm9kZSk7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwotCUJVR19PTighcGF0aCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCW5vbG9jayA9IGJ0cmZzX2lzX2ZyZWVfc3BhY2VfaW5vZGUocm9vdCwgaW5vZGUpOwogCkBAIC0xMjgyLDE3ICsxMjgzLDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBidHJmc19zcGxpdF9leHRlbnRfaG9vayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgIHN0cnVjdCBleHRlbnRfc3RhdGUgKm9yaWcsIHU2NCBzcGxpdCkKK3N0YXRpYyB2b2lkIGJ0cmZzX3NwbGl0X2V4dGVudF9ob29rKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgIHN0cnVjdCBleHRlbnRfc3RhdGUgKm9yaWcsIHU2NCBzcGxpdCkKIHsKIAkvKiBub3QgZGVsYWxsb2MsIGlnbm9yZSBpdCAqLwogCWlmICghKG9yaWctPnN0YXRlICYgRVhURU5UX0RFTEFMTE9DKSkKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAogCXNwaW5fbG9jaygmQlRSRlNfSShpbm9kZSktPmxvY2spOwogCUJUUkZTX0koaW5vZGUpLT5vdXRzdGFuZGluZ19leHRlbnRzKys7CiAJc3Bpbl91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5sb2NrKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTEzMDEsMTggKzEzMDEsMTcgQEAKICAqIGV4dGVudHMsIHN1Y2ggYXMgd2hlbiB3ZSBhcmUgZG9pbmcgc2VxdWVudGlhbCB3cml0ZXMsIHNvIHdlIGNhbiBwcm9wZXJseQogICogYWNjb3VudCBmb3IgdGhlIG1ldGFkYXRhIHNwYWNlIHdlJ2xsIG5lZWQuCiAgKi8KLXN0YXRpYyBpbnQgYnRyZnNfbWVyZ2VfZXh0ZW50X2hvb2soc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpuZXcsCi0JCQkJICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqb3RoZXIpCitzdGF0aWMgdm9pZCBidHJmc19tZXJnZV9leHRlbnRfaG9vayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpuZXcsCisJCQkJICAgIHN0cnVjdCBleHRlbnRfc3RhdGUgKm90aGVyKQogewogCS8qIG5vdCBkZWxhbGxvYywgaWdub3JlIGl0ICovCiAJaWYgKCEob3RoZXItPnN0YXRlICYgRVhURU5UX0RFTEFMTE9DKSkKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAogCXNwaW5fbG9jaygmQlRSRlNfSShpbm9kZSktPmxvY2spOwogCUJUUkZTX0koaW5vZGUpLT5vdXRzdGFuZGluZ19leHRlbnRzLS07CiAJc3Bpbl91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5sb2NrKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTEzMjAsOCArMTMxOSw4IEBACiAgKiBieXRlcyBpbiB0aGlzIGZpbGUsIGFuZCB0byBtYWludGFpbiB0aGUgbGlzdCBvZiBpbm9kZXMgdGhhdAogICogaGF2ZSBwZW5kaW5nIGRlbGFsbG9jIHdvcmsgdG8gYmUgZG9uZS4KICAqLwotc3RhdGljIGludCBidHJmc19zZXRfYml0X2hvb2soc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICAgIHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlLCBpbnQgKmJpdHMpCitzdGF0aWMgdm9pZCBidHJmc19zZXRfYml0X2hvb2soc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSwgaW50ICpiaXRzKQogewogCiAJLyoKQEAgLTEzNTEsMTQgKzEzNTAsMTMgQEAKIAkJfQogCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+ZGVsYWxsb2NfbG9jayk7CiAJfQotCXJldHVybiAwOwogfQogCiAvKgogICogZXh0ZW50X2lvLmMgY2xlYXJfYml0X2hvb2ssIHNlZSBzZXRfYml0X2hvb2sgZm9yIHdoeQogICovCi1zdGF0aWMgaW50IGJ0cmZzX2NsZWFyX2JpdF9ob29rKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsIGludCAqYml0cykKK3N0YXRpYyB2b2lkIGJ0cmZzX2NsZWFyX2JpdF9ob29rKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJIHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlLCBpbnQgKmJpdHMpCiB7CiAJLyoKIAkgKiBzZXRfYml0IGFuZCBjbGVhciBiaXQgaG9va3Mgbm9ybWFsbHkgcmVxdWlyZSBfaXJxc2F2ZS9yZXN0b3JlCkBAIC0xMzk1LDcgKzEzOTMsNiBAQAogCQl9CiAJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT5kZWxhbGxvY19sb2NrKTsKIAl9Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xNjQ1LDcgKzE2NDIsOCBAQAogCWludCByZXQ7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwotCUJVR19PTighcGF0aCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCXBhdGgtPmxlYXZlX3NwaW5uaW5nID0gMTsKIApAQCAtMjIxNSw3ICsyMjEzLDggQEAKIAogCWlmICghcm9vdC0+b3JwaGFuX2Jsb2NrX3JzdikgewogCQlibG9ja19yc3YgPSBidHJmc19hbGxvY19ibG9ja19yc3Yocm9vdCk7Ci0JCUJVR19PTighYmxvY2tfcnN2KTsKKwkJaWYgKCFibG9ja19yc3YpCisJCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlzcGluX2xvY2soJnJvb3QtPm9ycGhhbl9sb2NrKTsKQEAgLTI1MTcsNyArMjUxNiw5IEBACiAJCWZpbGxlZCA9IHRydWU7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwotCUJVR19PTighcGF0aCk7CisJaWYgKCFwYXRoKQorCQlnb3RvIG1ha2VfYmFkOworCiAJcGF0aC0+bGVhdmVfc3Bpbm5pbmcgPSAxOwogCW1lbWNweSgmbG9jYXRpb24sICZCVFJGU19JKGlub2RlKS0+bG9jYXRpb24sIHNpemVvZihsb2NhdGlvbikpOwogCkBAIC0yOTk4LDEzICsyOTk5LDE2IEBACiAKIAlyZXQgPSBidHJmc191bmxpbmtfaW5vZGUodHJhbnMsIHJvb3QsIGRpciwgZGVudHJ5LT5kX2lub2RlLAogCQkJCSBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4pOwotCUJVR19PTihyZXQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OwogCiAJaWYgKGlub2RlLT5pX25saW5rID09IDApIHsKIAkJcmV0ID0gYnRyZnNfb3JwaGFuX2FkZCh0cmFucywgaW5vZGUpOwotCQlCVUdfT04ocmV0KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OwogCX0KIAorb3V0OgogCW5yID0gdHJhbnMtPmJsb2Nrc191c2VkOwogCV9fdW5saW5rX2VuZF90cmFucyh0cmFucywgcm9vdCk7CiAJYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyb290LCBucik7CkBAIC0zMTQ3LDYgKzMxNTEsMTEgQEAKIAogCUJVR19PTihuZXdfc2l6ZSA+IDAgJiYgbWluX3R5cGUgIT0gQlRSRlNfRVhURU5UX0RBVEFfS0VZKTsKIAorCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwYXRoLT5yZWFkYSA9IC0xOworCiAJaWYgKHJvb3QtPnJlZl9jb3dzIHx8IHJvb3QgPT0gcm9vdC0+ZnNfaW5mby0+dHJlZV9yb290KQogCQlidHJmc19kcm9wX2V4dGVudF9jYWNoZShpbm9kZSwgbmV3X3NpemUgJiAofm1hc2spLCAodTY0KS0xLCAwKTsKIApAQCAtMzE1OSwxMCArMzE2OCw2IEBACiAJaWYgKG1pbl90eXBlID09IDAgJiYgcm9vdCA9PSBCVFJGU19JKGlub2RlKS0+cm9vdCkKIAkJYnRyZnNfa2lsbF9kZWxheWVkX2lub2RlX2l0ZW1zKGlub2RlKTsKIAotCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JQlVHX09OKCFwYXRoKTsKLQlwYXRoLT5yZWFkYSA9IC0xOwotCiAJa2V5Lm9iamVjdGlkID0gaW5vOwogCWtleS5vZmZzZXQgPSAodTY0KS0xOwogCWtleS50eXBlID0gKHU4KS0xOwpAQCAtMzY5MCw3ICszNjk1LDggQEAKIAlpbnQgcmV0ID0gMDsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JQlVHX09OKCFwYXRoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOwogCiAJZGkgPSBidHJmc19sb29rdXBfZGlyX2l0ZW0oTlVMTCwgcm9vdCwgcGF0aCwgYnRyZnNfaW5vKGRpciksIG5hbWUsCiAJCQkJICAgIG5hbWVsZW4sIDApOwpAQCAtMzk0Niw2ICszOTUyLDcgQEAKIAkJCSBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgaW50ICpuZXcpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgYmFkX2lub2RlID0gMDsKIAogCWlub2RlID0gYnRyZnNfaWdldF9sb2NrZWQocywgbG9jYXRpb24tPm9iamVjdGlkLCByb290KTsKIAlpZiAoIWlub2RlKQpAQCAtMzk1NSwxMCArMzk2MiwxOSBAQAogCQlCVFJGU19JKGlub2RlKS0+cm9vdCA9IHJvb3Q7CiAJCW1lbWNweSgmQlRSRlNfSShpbm9kZSktPmxvY2F0aW9uLCBsb2NhdGlvbiwgc2l6ZW9mKCpsb2NhdGlvbikpOwogCQlidHJmc19yZWFkX2xvY2tlZF9pbm9kZShpbm9kZSk7Ci0JCWlub2RlX3RyZWVfYWRkKGlub2RlKTsKLQkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7Ci0JCWlmIChuZXcpCi0JCQkqbmV3ID0gMTsKKwkJaWYgKCFpc19iYWRfaW5vZGUoaW5vZGUpKSB7CisJCQlpbm9kZV90cmVlX2FkZChpbm9kZSk7CisJCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwkJCWlmIChuZXcpCisJCQkJKm5ldyA9IDE7CisJCX0gZWxzZSB7CisJCQliYWRfaW5vZGUgPSAxOworCQl9CisJfQorCisJaWYgKGJhZF9pbm9kZSkgeworCQlpcHV0KGlub2RlKTsKKwkJaW5vZGUgPSBFUlJfUFRSKC1FU1RBTEUpOwogCX0KIAogCXJldHVybiBpbm9kZTsKQEAgLTM5OTMsMTIgKzQwMDksMTkgQEAKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqc3ViX3Jvb3QgPSByb290OwogCXN0cnVjdCBidHJmc19rZXkgbG9jYXRpb247CiAJaW50IGluZGV4OwotCWludCByZXQ7CisJaW50IHJldCA9IDA7CiAKIAlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gQlRSRlNfTkFNRV9MRU4pCiAJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOwogCi0JcmV0ID0gYnRyZnNfaW5vZGVfYnlfbmFtZShkaXIsIGRlbnRyeSwgJmxvY2F0aW9uKTsKKwlpZiAodW5saWtlbHkoZF9uZWVkX2xvb2t1cChkZW50cnkpKSkgeworCQltZW1jcHkoJmxvY2F0aW9uLCBkZW50cnktPmRfZnNkYXRhLCBzaXplb2Yoc3RydWN0IGJ0cmZzX2tleSkpOworCQlrZnJlZShkZW50cnktPmRfZnNkYXRhKTsKKwkJZGVudHJ5LT5kX2ZzZGF0YSA9IE5VTEw7CisJCWRfY2xlYXJfbmVlZF9sb29rdXAoZGVudHJ5KTsKKwl9IGVsc2UgeworCQlyZXQgPSBidHJmc19pbm9kZV9ieV9uYW1lKGRpciwgZGVudHJ5LCAmbG9jYXRpb24pOworCX0KIAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwpAQCAtNDA1Myw2ICs0MDc2LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGJ0cmZzX2RlbnRyeV9yZWxlYXNlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpZiAoZGVudHJ5LT5kX2ZzZGF0YSkKKwkJa2ZyZWUoZGVudHJ5LT5kX2ZzZGF0YSk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpidHJmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCQkgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKQEAgLTQwNzUsNiArNDEwNCw3IEBACiAJc3RydWN0IGJ0cmZzX3BhdGggKnBhdGg7CiAJc3RydWN0IGxpc3RfaGVhZCBpbnNfbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRlbF9saXN0OworCXN0cnVjdCBxc3RyIHE7CiAJaW50IHJldDsKIAlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKIAlpbnQgc2xvdDsKQEAgLTQxNjQsNiArNDE5NCw3IEBACiAKIAkJd2hpbGUgKGRpX2N1ciA8IGRpX3RvdGFsKSB7CiAJCQlzdHJ1Y3QgYnRyZnNfa2V5IGxvY2F0aW9uOworCQkJc3RydWN0IGRlbnRyeSAqdG1wOwogCiAJCQlpZiAodmVyaWZ5X2Rpcl9pdGVtKHJvb3QsIGxlYWYsIGRpKSkKIAkJCQlicmVhazsKQEAgLTQxODQsNiArNDIxNSwzMyBAQAogCQkJZF90eXBlID0gYnRyZnNfZmlsZXR5cGVfdGFibGVbYnRyZnNfZGlyX3R5cGUobGVhZiwgZGkpXTsKIAkJCWJ0cmZzX2Rpcl9pdGVtX2tleV90b19jcHUobGVhZiwgZGksICZsb2NhdGlvbik7CiAKKwkJCXEubmFtZSA9IG5hbWVfcHRyOworCQkJcS5sZW4gPSBuYW1lX2xlbjsKKwkJCXEuaGFzaCA9IGZ1bGxfbmFtZV9oYXNoKHEubmFtZSwgcS5sZW4pOworCQkJdG1wID0gZF9sb29rdXAoZmlscC0+Zl9kZW50cnksICZxKTsKKwkJCWlmICghdG1wKSB7CisJCQkJc3RydWN0IGJ0cmZzX2tleSAqbmV3a2V5OworCisJCQkJbmV3a2V5ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJ0cmZzX2tleSksCisJCQkJCQkgR0ZQX05PRlMpOworCQkJCWlmICghbmV3a2V5KQorCQkJCQlnb3RvIG5vX2RlbnRyeTsKKwkJCQl0bXAgPSBkX2FsbG9jKGZpbHAtPmZfZGVudHJ5LCAmcSk7CisJCQkJaWYgKCF0bXApIHsKKwkJCQkJa2ZyZWUobmV3a2V5KTsKKwkJCQkJZHB1dCh0bXApOworCQkJCQlnb3RvIG5vX2RlbnRyeTsKKwkJCQl9CisJCQkJbWVtY3B5KG5ld2tleSwgJmxvY2F0aW9uLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJ0cmZzX2tleSkpOworCQkJCXRtcC0+ZF9mc2RhdGEgPSBuZXdrZXk7CisJCQkJdG1wLT5kX2ZsYWdzIHw9IERDQUNIRV9ORUVEX0xPT0tVUDsKKwkJCQlkX3JlaGFzaCh0bXApOworCQkJCWRwdXQodG1wKTsKKwkJCX0gZWxzZSB7CisJCQkJZHB1dCh0bXApOworCQkJfQorbm9fZGVudHJ5OgogCQkJLyogaXMgdGhpcyBhIHJlZmVyZW5jZSB0byBvdXIgb3duIHNuYXBzaG90PyBJZiBzbwogCQkJICogc2tpcCBpdAogCQkJICovCkBAIC00NDA5LDcgKzQ0NjcsOCBAQAogCWludCBvd25lcjsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JQlVHX09OKCFwYXRoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJaW5vZGUgPSBuZXdfaW5vZGUocm9vdC0+ZnNfaW5mby0+c2IpOwogCWlmICghaW5vZGUpIHsKQEAgLTY2NjksMTkgKzY3MjgsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBoZWxwZXIgZnVuY3Rpb24gZm9yIGZpbGUgZGVmcmFnIGFuZCBzcGFjZSBiYWxhbmNpbmcuICBUaGlzCi0gKiBmb3JjZXMgcmVhZGFoZWFkIG9uIGEgZ2l2ZW4gcmFuZ2Ugb2YgYnl0ZXMgaW4gYW4gaW5vZGUKLSAqLwotdW5zaWduZWQgbG9uZyBidHJmc19mb3JjZV9yYShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKLQkJCSAgICAgIHN0cnVjdCBmaWxlX3JhX3N0YXRlICpyYSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgICBwZ29mZl90IG9mZnNldCwgcGdvZmZfdCBsYXN0X2luZGV4KQotewotCXBnb2ZmX3QgcmVxX3NpemUgPSBsYXN0X2luZGV4IC0gb2Zmc2V0ICsgMTsKLQotCXBhZ2VfY2FjaGVfc3luY19yZWFkYWhlYWQobWFwcGluZywgcmEsIGZpbGUsIG9mZnNldCwgcmVxX3NpemUpOwotCXJldHVybiBvZmZzZXQgKyByZXFfc2l6ZTsKLX0KLQogc3RydWN0IGlub2RlICpidHJmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBidHJmc19pbm9kZSAqZWk7CkBAIC03MTY0LDcgKzcyMTAsMTEgQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKLQlCVUdfT04oIXBhdGgpOworCWlmICghcGF0aCkgeworCQllcnIgPSAtRU5PTUVNOworCQlkcm9wX2lub2RlID0gMTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KIAlrZXkub2JqZWN0aWQgPSBidHJmc19pbm8oaW5vZGUpOwogCWtleS5vZmZzZXQgPSAwOwogCWJ0cmZzX3NldF9rZXlfdHlwZSgma2V5LCBCVFJGU19FWFRFTlRfREFUQV9LRVkpOwpAQCAtNzQzMCw0ICs3NDgwLDUgQEAKIAogY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGJ0cmZzX2RlbnRyeV9vcGVyYXRpb25zID0gewogCS5kX2RlbGV0ZQk9IGJ0cmZzX2RlbnRyeV9kZWxldGUsCisJLmRfcmVsZWFzZQk9IGJ0cmZzX2RlbnRyeV9yZWxlYXNlLAogfTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2lvY3RsLmMgYi9mcy9idHJmcy9pb2N0bC5jCmluZGV4IDBiOTgwYWYuLjdjZjAxMzMgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2lvY3RsLmMKKysrIGIvZnMvYnRyZnMvaW9jdGwuYwpAQCAtMTc0OSwxMSArMTc0OSwxMCBAQAogCQlrZXkub2JqZWN0aWQgPSBrZXkub2Zmc2V0OwogCQlrZXkub2Zmc2V0ID0gKHU2NCktMTsKIAkJZGlyaWQgPSBrZXkub2JqZWN0aWQ7Ci0KIAl9CiAJaWYgKHB0ciA8IG5hbWUpCiAJCWdvdG8gb3V0OwotCW1lbWNweShuYW1lLCBwdHIsIHRvdGFsX2xlbik7CisJbWVtbW92ZShuYW1lLCBwdHIsIHRvdGFsX2xlbik7CiAJbmFtZVt0b3RhbF9sZW5dPSdcMCc7CiAJcmV0ID0gMDsKIG91dDoKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3JlZi1jYWNoZS5jIGIvZnMvYnRyZnMvcmVmLWNhY2hlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZDU2OWMuLjAwMDAwMDAKLS0tIGEvZnMvYnRyZnMvcmVmLWNhY2hlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NvcnQuaD4KLSNpbmNsdWRlICJjdHJlZS5oIgotI2luY2x1ZGUgInJlZi1jYWNoZS5oIgotI2luY2x1ZGUgInRyYW5zYWN0aW9uLmgiCi0KLXN0YXRpYyBzdHJ1Y3QgcmJfbm9kZSAqdHJlZV9pbnNlcnQoc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHU2NCBieXRlbnIsCi0JCQkJICAgc3RydWN0IHJiX25vZGUgKm5vZGUpCi17Ci0Jc3RydWN0IHJiX25vZGUgKipwID0gJnJvb3QtPnJiX25vZGU7Ci0Jc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7Ci0Jc3RydWN0IGJ0cmZzX2xlYWZfcmVmICplbnRyeTsKLQotCXdoaWxlICgqcCkgewotCQlwYXJlbnQgPSAqcDsKLQkJZW50cnkgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBidHJmc19sZWFmX3JlZiwgcmJfbm9kZSk7Ci0KLQkJaWYgKGJ5dGVuciA8IGVudHJ5LT5ieXRlbnIpCi0JCQlwID0gJigqcCktPnJiX2xlZnQ7Ci0JCWVsc2UgaWYgKGJ5dGVuciA+IGVudHJ5LT5ieXRlbnIpCi0JCQlwID0gJigqcCktPnJiX3JpZ2h0OwotCQllbHNlCi0JCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCWVudHJ5ID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGJ0cmZzX2xlYWZfcmVmLCByYl9ub2RlKTsKLQlyYl9saW5rX25vZGUobm9kZSwgcGFyZW50LCBwKTsKLQlyYl9pbnNlcnRfY29sb3Iobm9kZSwgcm9vdCk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcmJfbm9kZSAqdHJlZV9zZWFyY2goc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHU2NCBieXRlbnIpCi17Ci0Jc3RydWN0IHJiX25vZGUgKm4gPSByb290LT5yYl9ub2RlOwotCXN0cnVjdCBidHJmc19sZWFmX3JlZiAqZW50cnk7Ci0KLQl3aGlsZSAobikgewotCQllbnRyeSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBidHJmc19sZWFmX3JlZiwgcmJfbm9kZSk7Ci0JCVdBUk5fT04oIWVudHJ5LT5pbl90cmVlKTsKLQotCQlpZiAoYnl0ZW5yIDwgZW50cnktPmJ5dGVucikKLQkJCW4gPSBuLT5yYl9sZWZ0OwotCQllbHNlIGlmIChieXRlbnIgPiBlbnRyeS0+Ynl0ZW5yKQotCQkJbiA9IG4tPnJiX3JpZ2h0OwotCQllbHNlCi0JCQlyZXR1cm4gbjsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9mcy9idHJmcy9yZWYtY2FjaGUuaCBiL2ZzL2J0cmZzL3JlZi1jYWNoZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGY3MDAxLi4wMDAwMDAwCi0tLSBhL2ZzL2J0cmZzL3JlZi1jYWNoZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgotICovCi0jaWZuZGVmIF9fUkVGQ0FDSEVfXwotI2RlZmluZSBfX1JFRkNBQ0hFX18KLQotc3RydWN0IGJ0cmZzX2V4dGVudF9pbmZvIHsKLQkvKiBieXRlbnIgYW5kIG51bV9ieXRlcyBmaW5kIHRoZSBleHRlbnQgaW4gdGhlIGV4dGVudCBhbGxvY2F0aW9uIHRyZWUgKi8KLQl1NjQgYnl0ZW5yOwotCXU2NCBudW1fYnl0ZXM7Ci0KLQkvKiBvYmplY3RpZCBhbmQgb2Zmc2V0IGZpbmQgdGhlIGJhY2sgcmVmZXJlbmNlIGZvciB0aGUgZmlsZSAqLwotCXU2NCBvYmplY3RpZDsKLQl1NjQgb2Zmc2V0OwotfTsKLQotc3RydWN0IGJ0cmZzX2xlYWZfcmVmIHsKLQlzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlOwotCXN0cnVjdCBidHJmc19sZWFmX3JlZl90cmVlICp0cmVlOwotCWludCBpbl90cmVlOwotCWF0b21pY190IHVzYWdlOwotCi0JdTY0IHJvb3RfZ2VuOwotCXU2NCBieXRlbnI7Ci0JdTY0IG93bmVyOwotCXU2NCBnZW5lcmF0aW9uOwotCWludCBucml0ZW1zOwotCi0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCBidHJmc19leHRlbnRfaW5mbyBleHRlbnRzW107Ci19OwotCi1zdGF0aWMgaW5saW5lIHNpemVfdCBidHJmc19sZWFmX3JlZl9zaXplKGludCBucl9leHRlbnRzKQotewotCXJldHVybiBzaXplb2Yoc3RydWN0IGJ0cmZzX2xlYWZfcmVmKSArCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgYnRyZnNfZXh0ZW50X2luZm8pICogbnJfZXh0ZW50czsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvcm9vdC10cmVlLmMgYi9mcy9idHJmcy9yb290LXRyZWUuYwppbmRleCBlYmU0NTQ0Li5mNDA5OTkwIDEwMDY0NAotLS0gYS9mcy9idHJmcy9yb290LXRyZWUuYworKysgYi9mcy9idHJmcy9yb290LXRyZWUuYwpAQCAtNzEsMTMgKzcxLDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGJ0cmZzX3NldF9yb290X25vZGUoc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSAqaXRlbSwKLQkJCXN0cnVjdCBleHRlbnRfYnVmZmVyICpub2RlKQordm9pZCBidHJmc19zZXRfcm9vdF9ub2RlKHN0cnVjdCBidHJmc19yb290X2l0ZW0gKml0ZW0sCisJCQkgc3RydWN0IGV4dGVudF9idWZmZXIgKm5vZGUpCiB7CiAJYnRyZnNfc2V0X3Jvb3RfYnl0ZW5yKGl0ZW0sIG5vZGUtPnN0YXJ0KTsKIAlidHJmc19zZXRfcm9vdF9sZXZlbChpdGVtLCBidHJmc19oZWFkZXJfbGV2ZWwobm9kZSkpOwogCWJ0cmZzX3NldF9yb290X2dlbmVyYXRpb24oaXRlbSwgYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24obm9kZSkpOwotCXJldHVybiAwOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdHJhbnNhY3Rpb24uYyBiL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmMKaW5kZXggZWI1NTg2My4uN2RjMzZmYSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdHJhbnNhY3Rpb24uYworKysgYi9mcy9idHJmcy90cmFuc2FjdGlvbi5jCkBAIC0yMTYsMTcgKzIxNiwxMSBAQAogCXNwaW5fbG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CiAJY3VyX3RyYW5zID0gcm9vdC0+ZnNfaW5mby0+cnVubmluZ190cmFuc2FjdGlvbjsKIAlpZiAoY3VyX3RyYW5zICYmIGN1cl90cmFucy0+YmxvY2tlZCkgewotCQlERUZJTkVfV0FJVCh3YWl0KTsKIAkJYXRvbWljX2luYygmY3VyX3RyYW5zLT51c2VfY291bnQpOwogCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7Ci0JCXdoaWxlICgxKSB7Ci0JCQlwcmVwYXJlX3RvX3dhaXQoJnJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX3dhaXQsICZ3YWl0LAotCQkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCQlpZiAoIWN1cl90cmFucy0+YmxvY2tlZCkKLQkJCQlicmVhazsKLQkJCXNjaGVkdWxlKCk7Ci0JCX0KLQkJZmluaXNoX3dhaXQoJnJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX3dhaXQsICZ3YWl0KTsKKworCQl3YWl0X2V2ZW50KHJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX3dhaXQsCisJCQkgICAhY3VyX3RyYW5zLT5ibG9ja2VkKTsKIAkJcHV0X3RyYW5zYWN0aW9uKGN1cl90cmFucyk7CiAJfSBlbHNlIHsKIAkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwpAQCAtMzU3LDE5ICszNTEsMTAgQEAKIH0KIAogLyogd2FpdCBmb3IgYSB0cmFuc2FjdGlvbiBjb21taXQgdG8gYmUgZnVsbHkgY29tcGxldGUgKi8KLXN0YXRpYyBub2lubGluZSBpbnQgd2FpdF9mb3JfY29tbWl0KHN0cnVjdCBidHJmc19yb290ICpyb290LAorc3RhdGljIG5vaW5saW5lIHZvaWQgd2FpdF9mb3JfY29tbWl0KHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJCSAgICBzdHJ1Y3QgYnRyZnNfdHJhbnNhY3Rpb24gKmNvbW1pdCkKIHsKLQlERUZJTkVfV0FJVCh3YWl0KTsKLQl3aGlsZSAoIWNvbW1pdC0+Y29tbWl0X2RvbmUpIHsKLQkJcHJlcGFyZV90b193YWl0KCZjb21taXQtPmNvbW1pdF93YWl0LCAmd2FpdCwKLQkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCWlmIChjb21taXQtPmNvbW1pdF9kb25lKQotCQkJYnJlYWs7Ci0JCXNjaGVkdWxlKCk7Ci0JfQotCWZpbmlzaF93YWl0KCZjb21taXQtPmNvbW1pdF93YWl0LCAmd2FpdCk7Ci0JcmV0dXJuIDA7CisJd2FpdF9ldmVudChjb21taXQtPmNvbW1pdF93YWl0LCBjb21taXQtPmNvbW1pdF9kb25lKTsKIH0KIAogaW50IGJ0cmZzX3dhaXRfZm9yX2NvbW1pdChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IHRyYW5zaWQpCkBAIC0xMDg1LDIyICsxMDcwLDcgQEAKIHN0YXRpYyB2b2lkIHdhaXRfY3VycmVudF90cmFuc19jb21taXRfc3RhcnQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCQkJCSAgICBzdHJ1Y3QgYnRyZnNfdHJhbnNhY3Rpb24gKnRyYW5zKQogewotCURFRklORV9XQUlUKHdhaXQpOwotCi0JaWYgKHRyYW5zLT5pbl9jb21taXQpCi0JCXJldHVybjsKLQotCXdoaWxlICgxKSB7Ci0JCXByZXBhcmVfdG9fd2FpdCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fYmxvY2tlZF93YWl0LCAmd2FpdCwKLQkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCWlmICh0cmFucy0+aW5fY29tbWl0KSB7Ci0JCQlmaW5pc2hfd2FpdCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fYmxvY2tlZF93YWl0LAotCQkJCSAgICAmd2FpdCk7Ci0JCQlicmVhazsKLQkJfQotCQlzY2hlZHVsZSgpOwotCQlmaW5pc2hfd2FpdCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fYmxvY2tlZF93YWl0LCAmd2FpdCk7Ci0JfQorCXdhaXRfZXZlbnQocm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fYmxvY2tlZF93YWl0LCB0cmFucy0+aW5fY29tbWl0KTsKIH0KIAogLyoKQEAgLTExMTAsMjQgKzEwODAsOCBAQAogc3RhdGljIHZvaWQgd2FpdF9jdXJyZW50X3RyYW5zX2NvbW1pdF9zdGFydF9hbmRfdW5ibG9jayhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCQkJIHN0cnVjdCBidHJmc190cmFuc2FjdGlvbiAqdHJhbnMpCiB7Ci0JREVGSU5FX1dBSVQod2FpdCk7Ci0KLQlpZiAodHJhbnMtPmNvbW1pdF9kb25lIHx8ICh0cmFucy0+aW5fY29tbWl0ICYmICF0cmFucy0+YmxvY2tlZCkpCi0JCXJldHVybjsKLQotCXdoaWxlICgxKSB7Ci0JCXByZXBhcmVfdG9fd2FpdCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fd2FpdCwgJndhaXQsCi0JCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlpZiAodHJhbnMtPmNvbW1pdF9kb25lIHx8Ci0JCSAgICAodHJhbnMtPmluX2NvbW1pdCAmJiAhdHJhbnMtPmJsb2NrZWQpKSB7Ci0JCQlmaW5pc2hfd2FpdCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fd2FpdCwKLQkJCQkgICAgJndhaXQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJc2NoZWR1bGUoKTsKLQkJZmluaXNoX3dhaXQoJnJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX3dhaXQsCi0JCQkgICAgJndhaXQpOwotCX0KKwl3YWl0X2V2ZW50KHJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX3dhaXQsCisJCSAgIHRyYW5zLT5jb21taXRfZG9uZSB8fCAodHJhbnMtPmluX2NvbW1pdCAmJiAhdHJhbnMtPmJsb2NrZWQpKTsKIH0KIAogLyoKQEAgLTEyMzQsOCArMTE4OCw3IEBACiAJCWF0b21pY19pbmMoJmN1cl90cmFucy0+dXNlX2NvdW50KTsKIAkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKIAotCQlyZXQgPSB3YWl0X2Zvcl9jb21taXQocm9vdCwgY3VyX3RyYW5zKTsKLQkJQlVHX09OKHJldCk7CisJCXdhaXRfZm9yX2NvbW1pdChyb290LCBjdXJfdHJhbnMpOwogCiAJCXB1dF90cmFuc2FjdGlvbihjdXJfdHJhbnMpOwogCmRpZmYgLS1naXQgYS9mcy9idHJmcy90cmVlLWxvZy5jIGIvZnMvYnRyZnMvdHJlZS1sb2cuYwppbmRleCBhYzI3OGRkLi5iYWJlZTY1IDEwMDY0NAotLS0gYS9mcy9idHJmcy90cmVlLWxvZy5jCisrKyBiL2ZzL2J0cmZzL3RyZWUtbG9nLmMKQEAgLTE2MTcsNyArMTYxNyw4IEBACiAJCXJldHVybiAwOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKLQlCVUdfT04oIXBhdGgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlucml0ZW1zID0gYnRyZnNfaGVhZGVyX25yaXRlbXMoZWIpOwogCWZvciAoaSA9IDA7IGkgPCBucml0ZW1zOyBpKyspIHsKQEAgLTE3MjMsNyArMTcyNCw5IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAogCQlpZiAoKmxldmVsID09IDEpIHsKLQkJCXdjLT5wcm9jZXNzX2Z1bmMocm9vdCwgbmV4dCwgd2MsIHB0cl9nZW4pOworCQkJcmV0ID0gd2MtPnByb2Nlc3NfZnVuYyhyb290LCBuZXh0LCB3YywgcHRyX2dlbik7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CiAKIAkJCXBhdGgtPnNsb3RzWypsZXZlbF0rKzsKIAkJCWlmICh3Yy0+ZnJlZSkgewpAQCAtMTc4OCw4ICsxNzkxLDExIEBACiAJCQkJcGFyZW50ID0gcGF0aC0+bm9kZXNbKmxldmVsICsgMV07CiAKIAkJCXJvb3Rfb3duZXIgPSBidHJmc19oZWFkZXJfb3duZXIocGFyZW50KTsKLQkJCXdjLT5wcm9jZXNzX2Z1bmMocm9vdCwgcGF0aC0+bm9kZXNbKmxldmVsXSwgd2MsCisJCQlyZXQgPSB3Yy0+cHJvY2Vzc19mdW5jKHJvb3QsIHBhdGgtPm5vZGVzWypsZXZlbF0sIHdjLAogCQkJCSBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihwYXRoLT5ub2Rlc1sqbGV2ZWxdKSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisKIAkJCWlmICh3Yy0+ZnJlZSkgewogCQkJCXN0cnVjdCBleHRlbnRfYnVmZmVyICpuZXh0OwogCmRpZmYgLS1naXQgYS9mcy9idHJmcy92b2x1bWVzLmMgYi9mcy9idHJmcy92b2x1bWVzLmMKaW5kZXggYjg5ZTM3Mi4uNTM4NzVhZSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdm9sdW1lcy5jCisrKyBiL2ZzL2J0cmZzL3ZvbHVtZXMuYwpAQCAtMTAzNyw3ICsxMDM3LDggQEAKIAlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JQlVHX09OKCFwYXRoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOwogCiAJa2V5Lm9iamVjdGlkID0gb2JqZWN0aWQ7CiAJa2V5Lm9mZnNldCA9ICh1NjQpLTE7CkBAIC0yMDYxLDggKzIwNjIsMTAgQEAKIAogCS8qIHN0ZXAgdHdvLCByZWxvY2F0ZSBhbGwgdGhlIGNodW5rcyAqLwogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JQlVHX09OKCFwYXRoKTsKLQorCWlmICghcGF0aCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KIAlrZXkub2JqZWN0aWQgPSBCVFJGU19GSVJTVF9DSFVOS19UUkVFX09CSkVDVElEOwogCWtleS5vZmZzZXQgPSAodTY0KS0xOwogCWtleS50eXBlID0gQlRSRlNfQ0hVTktfSVRFTV9LRVk7CkBAIC0yNjYxLDcgKzI2NjQsOCBAQAogCiAJcmV0ID0gZmluZF9uZXh0X2NodW5rKGZzX2luZm8tPmNodW5rX3Jvb3QsCiAJCQkgICAgICBCVFJGU19GSVJTVF9DSFVOS19UUkVFX09CSkVDVElELCAmY2h1bmtfb2Zmc2V0KTsKLQlCVUdfT04ocmV0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJYWxsb2NfcHJvZmlsZSA9IEJUUkZTX0JMT0NLX0dST1VQX01FVEFEQVRBIHwKIAkJCShmc19pbmZvLT5tZXRhZGF0YV9hbGxvY19wcm9maWxlICYKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYyBiL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYwppbmRleCAyNTk5OTFiLi5lNzZiZmViIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNlbmNyeXB0LmMKKysrIGIvZnMvY2lmcy9jaWZzZW5jcnlwdC5jCkBAIC04Nyw5ICs4NywxNSBAQAogCWlmICgoY2lmc19wZHUgPT0gTlVMTCkgfHwgKHNlcnZlciA9PSBOVUxMKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoKGNpZnNfcGR1LT5GbGFnczIgJiBTTUJGTEcyX1NFQ1VSSVRZX1NJR05BVFVSRSkgPT0gMCkKKwlpZiAoIShjaWZzX3BkdS0+RmxhZ3MyICYgU01CRkxHMl9TRUNVUklUWV9TSUdOQVRVUkUpIHx8CisJICAgIHNlcnZlci0+dGNwU3RhdHVzID09IENpZnNOZWVkTmVnb3RpYXRlKQogCQlyZXR1cm4gcmM7CiAKKwlpZiAoIXNlcnZlci0+c2Vzc2lvbl9lc3RhYikgeworCQlzdHJuY3B5KGNpZnNfcGR1LT5TaWduYXR1cmUuU2VjdXJpdHlTaWduYXR1cmUsICJCU1JTUFlMIiwgOCk7CisJCXJldHVybiByYzsKKwl9CisKIAljaWZzX3BkdS0+U2lnbmF0dXJlLlNlcXVlbmNlLlNlcXVlbmNlTnVtYmVyID0KIAkJCWNwdV90b19sZTMyKHNlcnZlci0+c2VxdWVuY2VfbnVtYmVyKTsKIAljaWZzX3BkdS0+U2lnbmF0dXJlLlNlcXVlbmNlLlJlc2VydmVkID0gMDsKQEAgLTE3OCw5ICsxODQsMTUgQEAKIAlpZiAoKGNpZnNfcGR1ID09IE5VTEwpIHx8IChzZXJ2ZXIgPT0gTlVMTCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKChjaWZzX3BkdS0+RmxhZ3MyICYgU01CRkxHMl9TRUNVUklUWV9TSUdOQVRVUkUpID09IDApCisJaWYgKCEoY2lmc19wZHUtPkZsYWdzMiAmIFNNQkZMRzJfU0VDVVJJVFlfU0lHTkFUVVJFKSB8fAorCSAgICBzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzTmVlZE5lZ290aWF0ZSkKIAkJcmV0dXJuIHJjOwogCisJaWYgKCFzZXJ2ZXItPnNlc3Npb25fZXN0YWIpIHsKKwkJc3RybmNweShjaWZzX3BkdS0+U2lnbmF0dXJlLlNlY3VyaXR5U2lnbmF0dXJlLCAiQlNSU1BZTCIsIDgpOworCQlyZXR1cm4gcmM7CisJfQorCiAJY2lmc19wZHUtPlNpZ25hdHVyZS5TZXF1ZW5jZS5TZXF1ZW5jZU51bWJlciA9CiAJCQkJY3B1X3RvX2xlMzIoc2VydmVyLT5zZXF1ZW5jZV9udW1iZXIpOwogCWNpZnNfcGR1LT5TaWduYXR1cmUuU2VxdWVuY2UuUmVzZXJ2ZWQgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuYyBiL2ZzL2NpZnMvY2lmc2ZzLmMKaW5kZXggODY1NTE3NC4uMjEyZTU2MiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuYworKysgYi9mcy9jaWZzL2NpZnNmcy5jCkBAIC04NiwyNCArODYsNiBAQAogZXh0ZXJuIG1lbXBvb2xfdCAqY2lmc19yZXFfcG9vbHA7CiBleHRlcm4gbWVtcG9vbF90ICpjaWZzX21pZF9wb29scDsKIAotdm9pZAotY2lmc19zYl9hY3RpdmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKLXsKLQlzdHJ1Y3QgY2lmc19zYl9pbmZvICpzZXJ2ZXIgPSBDSUZTX1NCKHNiKTsKLQotCWlmIChhdG9taWNfaW5jX3JldHVybigmc2VydmVyLT5hY3RpdmUpID09IDEpCi0JCWF0b21pY19pbmMoJnNiLT5zX2FjdGl2ZSk7Ci19Ci0KLXZvaWQKLWNpZnNfc2JfZGVhY3RpdmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKLXsKLQlzdHJ1Y3QgY2lmc19zYl9pbmZvICpzZXJ2ZXIgPSBDSUZTX1NCKHNiKTsKLQotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZzZXJ2ZXItPmFjdGl2ZSkpCi0JCWRlYWN0aXZhdGVfc3VwZXIoc2IpOwotfQotCiBzdGF0aWMgaW50CiBjaWZzX3JlYWRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2ZzLmggYi9mcy9jaWZzL2NpZnNmcy5oCmluZGV4IGZiZDA1MGMuLmNiNzFkYzEgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2ZzLmgKKysrIGIvZnMvY2lmcy9jaWZzZnMuaApAQCAtNDEsMTAgKzQxLDYgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGNpZnNfYWRkcl9vcHM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBjaWZzX2FkZHJfb3BzX3NtYWxsYnVmOwogCi0vKiBGdW5jdGlvbnMgcmVsYXRlZCB0byBzdXBlciBibG9jayBvcGVyYXRpb25zICovCi1leHRlcm4gdm9pZCBjaWZzX3NiX2FjdGl2ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKLWV4dGVybiB2b2lkIGNpZnNfc2JfZGVhY3RpdmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7Ci0KIC8qIEZ1bmN0aW9ucyByZWxhdGVkIHRvIGlub2RlcyAqLwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGNpZnNfZGlyX2lub2RlX29wczsKIGV4dGVybiBzdHJ1Y3QgaW5vZGUgKmNpZnNfcm9vdF9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2dsb2IuaCBiL2ZzL2NpZnMvY2lmc2dsb2IuaAppbmRleCAxZmNmNGU1Li4zOGNlNmQ0IDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNnbG9iLmgKKysrIGIvZnMvY2lmcy9jaWZzZ2xvYi5oCkBAIC05NDIsOCArOTQyLDYgQEAKIEdMT0JBTF9FWFRFUk4gc3BpbmxvY2tfdCBzaWRnaWRsb2NrOwogCiB2b2lkIGNpZnNfb3Bsb2NrX2JyZWFrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci12b2lkIGNpZnNfb3Bsb2NrX2JyZWFrX2dldChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpjZmlsZSk7Ci12b2lkIGNpZnNfb3Bsb2NrX2JyZWFrX3B1dChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpjZmlsZSk7CiAKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgc2xvd193b3JrX29wcyBjaWZzX29wbG9ja19icmVha19vcHM7CiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc3NtYi5jIGIvZnMvY2lmcy9jaWZzc21iLmMKaW5kZXggMWE5ZmU3Zi4uYWFjMzdkOSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzc21iLmMKKysrIGIvZnMvY2lmcy9jaWZzc21iLmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogc3RhdGljIGludAogY2lmc19yZWNvbm5lY3RfdGNvbihzdHJ1Y3QgY2lmc190Y29uICp0Y29uLCBpbnQgc21iX2NvbW1hbmQpCiB7Ci0JaW50IHJjID0gMDsKKwlpbnQgcmM7CiAJc3RydWN0IGNpZnNfc2VzICpzZXM7CiAJc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyOwogCXN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZTsKQEAgLTU3MjAsNiArNTcyMCw3IEBACiAJY2hhciAqdGVtcF9wdHI7CiAJY2hhciAqZW5kX29mX3NtYjsKIAlfX3UxNiBwYXJhbXMsIGJ5dGVfY291bnQsIGRhdGFfb2Zmc2V0OworCXVuc2lnbmVkIGludCBlYV9uYW1lX2xlbiA9IGVhX25hbWUgPyBzdHJsZW4oZWFfbmFtZSkgOiAwOwogCiAJY0ZZSSgxLCAiSW4gUXVlcnkgQWxsIEVBcyBwYXRoICVzIiwgc2VhcmNoTmFtZSk7CiBRQWxsRUFzUmV0cnk6CkBAIC01ODM3LDcgKzU4MzgsOCBAQAogCQl9CiAKIAkJaWYgKGVhX25hbWUpIHsKLQkJCWlmIChzdHJuY21wKGVhX25hbWUsIHRlbXBfcHRyLCBuYW1lX2xlbikgPT0gMCkgeworCQkJaWYgKGVhX25hbWVfbGVuID09IG5hbWVfbGVuICYmCisJCQkgICAgc3RybmNtcChlYV9uYW1lLCB0ZW1wX3B0ciwgbmFtZV9sZW4pID09IDApIHsKIAkJCQl0ZW1wX3B0ciArPSBuYW1lX2xlbiArIDE7CiAJCQkJcmMgPSB2YWx1ZV9sZW47CiAJCQkJaWYgKGJ1Zl9zaXplID09IDApCmRpZmYgLS1naXQgYS9mcy9jaWZzL2Nvbm5lY3QuYyBiL2ZzL2NpZnMvY29ubmVjdC5jCmluZGV4IGU2NjI5N2IuLjgwYzJlM2EgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY29ubmVjdC5jCisrKyBiL2ZzL2NpZnMvY29ubmVjdC5jCkBAIC0zMTksMzQ0ICszMTksMjIxIEBACiAJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9ucnRfd3EsICZzZXJ2ZXItPmVjaG8sIFNNQl9FQ0hPX0lOVEVSVkFMKTsKIH0KIAotc3RhdGljIGludAotY2lmc19kZW11bHRpcGxleF90aHJlYWQodm9pZCAqcCkKK3N0YXRpYyBib29sCithbGxvY2F0ZV9idWZmZXJzKGNoYXIgKipiaWdidWYsIGNoYXIgKipzbWFsbGJ1ZiwgdW5zaWduZWQgaW50IHNpemUsCisJCSBib29sIGlzX2xhcmdlX2J1ZikKIHsKLQlpbnQgbGVuZ3RoOwotCXN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciA9IHA7Ci0JdW5zaWduZWQgaW50IHBkdV9sZW5ndGgsIHRvdGFsX3JlYWQ7Ci0Jc3RydWN0IHNtYl9oZHIgKnNtYl9idWZmZXIgPSBOVUxMOwotCXN0cnVjdCBzbWJfaGRyICpiaWdidWYgPSBOVUxMOwotCXN0cnVjdCBzbWJfaGRyICpzbWFsbGJ1ZiA9IE5VTEw7Ci0Jc3RydWN0IG1zZ2hkciBzbWJfbXNnOwotCXN0cnVjdCBrdmVjIGlvdjsKLQlzdHJ1Y3Qgc29ja2V0ICpjc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKnRtcDI7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrX3RvX3dha2UgPSBOVUxMOwotCXN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkX2VudHJ5OwotCWNoYXIgdGVtcDsKLQlib29sIGlzTGFyZ2VCdWYgPSBmYWxzZTsKLQlib29sIGlzTXVsdGlSc3A7Ci0JaW50IHJlY29ubmVjdDsKKwljaGFyICpiYnVmID0gKmJpZ2J1ZiwgKnNidWYgPSAqc21hbGxidWY7CiAKLQljdXJyZW50LT5mbGFncyB8PSBQRl9NRU1BTExPQzsKLQljRllJKDEsICJEZW11bHRpcGxleCBQSUQ6ICVkIiwgdGFza19waWRfbnIoY3VycmVudCkpOwotCi0JbGVuZ3RoID0gYXRvbWljX2luY19yZXR1cm4oJnRjcFNlc0FsbG9jQ291bnQpOwotCWlmIChsZW5ndGggPiAxKQotCQltZW1wb29sX3Jlc2l6ZShjaWZzX3JlcV9wb29scCwgbGVuZ3RoICsgY2lmc19taW5fcmN2LAotCQkJCUdGUF9LRVJORUwpOwotCi0Jc2V0X2ZyZWV6YWJsZSgpOwotCXdoaWxlIChzZXJ2ZXItPnRjcFN0YXR1cyAhPSBDaWZzRXhpdGluZykgewotCQlpZiAodHJ5X3RvX2ZyZWV6ZSgpKQotCQkJY29udGludWU7Ci0JCWlmIChiaWdidWYgPT0gTlVMTCkgewotCQkJYmlnYnVmID0gY2lmc19idWZfZ2V0KCk7Ci0JCQlpZiAoIWJpZ2J1ZikgewotCQkJCWNFUlJPUigxLCAiTm8gbWVtb3J5IGZvciBsYXJnZSBTTUIgcmVzcG9uc2UiKTsKLQkJCQltc2xlZXAoMzAwMCk7Ci0JCQkJLyogcmV0cnkgd2lsbCBjaGVjayBpZiBleGl0aW5nICovCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaXNMYXJnZUJ1ZikgewotCQkJLyogd2UgYXJlIHJldXNpbmcgYSBkaXJ0eSBsYXJnZSBidWYsIGNsZWFyIGl0cyBzdGFydCAqLwotCQkJbWVtc2V0KGJpZ2J1ZiwgMCwgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSk7CisJaWYgKGJidWYgPT0gTlVMTCkgeworCQliYnVmID0gKGNoYXIgKiljaWZzX2J1Zl9nZXQoKTsKKwkJaWYgKCFiYnVmKSB7CisJCQljRVJST1IoMSwgIk5vIG1lbW9yeSBmb3IgbGFyZ2UgU01CIHJlc3BvbnNlIik7CisJCQltc2xlZXAoMzAwMCk7CisJCQkvKiByZXRyeSB3aWxsIGNoZWNrIGlmIGV4aXRpbmcgKi8KKwkJCXJldHVybiBmYWxzZTsKIAkJfQorCX0gZWxzZSBpZiAoaXNfbGFyZ2VfYnVmKSB7CisJCS8qIHdlIGFyZSByZXVzaW5nIGEgZGlydHkgbGFyZ2UgYnVmLCBjbGVhciBpdHMgc3RhcnQgKi8KKwkJbWVtc2V0KGJidWYsIDAsIHNpemUpOworCX0KIAotCQlpZiAoc21hbGxidWYgPT0gTlVMTCkgewotCQkJc21hbGxidWYgPSBjaWZzX3NtYWxsX2J1Zl9nZXQoKTsKLQkJCWlmICghc21hbGxidWYpIHsKLQkJCQljRVJST1IoMSwgIk5vIG1lbW9yeSBmb3IgU01CIHJlc3BvbnNlIik7Ci0JCQkJbXNsZWVwKDEwMDApOwotCQkJCS8qIHJldHJ5IHdpbGwgY2hlY2sgaWYgZXhpdGluZyAqLwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLyogYmVnaW5uaW5nIG9mIHNtYiBidWZmZXIgaXMgY2xlYXJlZCBpbiBvdXIgYnVmX2dldCAqLwotCQl9IGVsc2UgLyogaWYgZXhpc3Rpbmcgc21hbGwgYnVmIGNsZWFyIGJlZ2lubmluZyAqLwotCQkJbWVtc2V0KHNtYWxsYnVmLCAwLCBzaXplb2Yoc3RydWN0IHNtYl9oZHIpKTsKLQotCQlpc0xhcmdlQnVmID0gZmFsc2U7Ci0JCWlzTXVsdGlSc3AgPSBmYWxzZTsKLQkJc21iX2J1ZmZlciA9IHNtYWxsYnVmOwotCQlpb3YuaW92X2Jhc2UgPSBzbWJfYnVmZmVyOwotCQlpb3YuaW92X2xlbiA9IDQ7Ci0JCXNtYl9tc2cubXNnX2NvbnRyb2wgPSBOVUxMOwotCQlzbWJfbXNnLm1zZ19jb250cm9sbGVuID0gMDsKLQkJcGR1X2xlbmd0aCA9IDQ7IC8qIGVub3VnaCB0byBnZXQgUkZDMTAwMSBoZWFkZXIgKi8KLQotaW5jb21wbGV0ZV9yY3Y6Ci0JCWlmIChlY2hvX3JldHJpZXMgPiAwICYmIHNlcnZlci0+dGNwU3RhdHVzID09IENpZnNHb29kICYmCi0JCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIHNlcnZlci0+bHN0cnAgKwotCQkJCQkoZWNob19yZXRyaWVzICogU01CX0VDSE9fSU5URVJWQUwpKSkgewotCQkJY0VSUk9SKDEsICJTZXJ2ZXIgJXMgaGFzIG5vdCByZXNwb25kZWQgaW4gJWQgc2Vjb25kcy4gIgotCQkJCSAgIlJlY29ubmVjdGluZy4uLiIsIHNlcnZlci0+aG9zdG5hbWUsCi0JCQkJICAoZWNob19yZXRyaWVzICogU01CX0VDSE9fSU5URVJWQUwgLyBIWikpOwotCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKLQkJCWNzb2NrZXQgPSBzZXJ2ZXItPnNzb2NrZXQ7Ci0JCQl3YWtlX3VwKCZzZXJ2ZXItPnJlc3BvbnNlX3EpOwotCQkJY29udGludWU7CisJaWYgKHNidWYgPT0gTlVMTCkgeworCQlzYnVmID0gKGNoYXIgKiljaWZzX3NtYWxsX2J1Zl9nZXQoKTsKKwkJaWYgKCFzYnVmKSB7CisJCQljRVJST1IoMSwgIk5vIG1lbW9yeSBmb3IgU01CIHJlc3BvbnNlIik7CisJCQltc2xlZXAoMTAwMCk7CisJCQkvKiByZXRyeSB3aWxsIGNoZWNrIGlmIGV4aXRpbmcgKi8KKwkJCXJldHVybiBmYWxzZTsKIAkJfQorCQkvKiBiZWdpbm5pbmcgb2Ygc21iIGJ1ZmZlciBpcyBjbGVhcmVkIGluIG91ciBidWZfZ2V0ICovCisJfSBlbHNlIHsKKwkJLyogaWYgZXhpc3Rpbmcgc21hbGwgYnVmIGNsZWFyIGJlZ2lubmluZyAqLworCQltZW1zZXQoc2J1ZiwgMCwgc2l6ZSk7CisJfQogCi0JCWxlbmd0aCA9Ci0JCSAgICBrZXJuZWxfcmVjdm1zZyhjc29ja2V0LCAmc21iX21zZywKLQkJCQkmaW92LCAxLCBwZHVfbGVuZ3RoLCAwIC8qIEJCIG90aGVyIGZsYWdzPyAqLyk7CisJKmJpZ2J1ZiA9IGJidWY7CisJKnNtYWxsYnVmID0gc2J1ZjsKIAorCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50CityZWFkX2Zyb21fc29ja2V0KHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IG1zZ2hkciAqc21iX21zZywKKwkJIHN0cnVjdCBrdmVjICppb3YsIHVuc2lnbmVkIGludCB0b19yZWFkLAorCQkgdW5zaWduZWQgaW50ICpwdG90YWxfcmVhZCwgYm9vbCBpc19oZWFkZXJfcmVhZCkKK3sKKwlpbnQgbGVuZ3RoLCByYyA9IDA7CisJdW5zaWduZWQgaW50IHRvdGFsX3JlYWQ7CisJY2hhciAqYnVmID0gaW92LT5pb3ZfYmFzZTsKKworCWZvciAodG90YWxfcmVhZCA9IDA7IHRvdGFsX3JlYWQgPCB0b19yZWFkOyB0b3RhbF9yZWFkICs9IGxlbmd0aCkgeworCQlsZW5ndGggPSBrZXJuZWxfcmVjdm1zZyhzZXJ2ZXItPnNzb2NrZXQsIHNtYl9tc2csIGlvdiwgMSwKKwkJCQkJdG9fcmVhZCAtIHRvdGFsX3JlYWQsIDApOwogCQlpZiAoc2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc0V4aXRpbmcpIHsKKwkJCS8qIHRoZW4gd2lsbCBleGl0ICovCisJCQlyYyA9IDI7CiAJCQlicmVhazsKIAkJfSBlbHNlIGlmIChzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzTmVlZFJlY29ubmVjdCkgewotCQkJY0ZZSSgxLCAiUmVjb25uZWN0IGFmdGVyIHNlcnZlciBzdG9wcGVkIHJlc3BvbmRpbmciKTsKIAkJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7Ci0JCQljRllJKDEsICJjYWxsIHRvIHJlY29ubmVjdCBkb25lIik7Ci0JCQljc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OwotCQkJY29udGludWU7CisJCQkvKiBSZWNvbm5lY3Qgd2FrZXMgdXAgcnNwbnMgcSAqLworCQkJLyogTm93IHdlIHdpbGwgcmVyZWFkIHNvY2sgKi8KKwkJCXJjID0gMTsKKwkJCWJyZWFrOwogCQl9IGVsc2UgaWYgKGxlbmd0aCA9PSAtRVJFU1RBUlRTWVMgfHwKIAkJCSAgIGxlbmd0aCA9PSAtRUFHQUlOIHx8CiAJCQkgICBsZW5ndGggPT0gLUVJTlRSKSB7Ci0JCQltc2xlZXAoMSk7IC8qIG1pbmltdW0gc2xlZXAgdG8gcHJldmVudCBsb29waW5nCi0JCQkJYWxsb3dpbmcgc29ja2V0IHRvIGNsZWFyIGFuZCBhcHAgdGhyZWFkcyB0byBzZXQKLQkJCQl0Y3BTdGF0dXMgQ2lmc05lZWRSZWNvbm5lY3QgaWYgc2VydmVyIGh1bmcgKi8KLQkJCWlmIChwZHVfbGVuZ3RoIDwgNCkgewotCQkJCWlvdi5pb3ZfYmFzZSA9ICg0IC0gcGR1X2xlbmd0aCkgKwotCQkJCQkJCShjaGFyICopc21iX2J1ZmZlcjsKLQkJCQlpb3YuaW92X2xlbiA9IHBkdV9sZW5ndGg7Ci0JCQkJc21iX21zZy5tc2dfY29udHJvbCA9IE5VTEw7Ci0JCQkJc21iX21zZy5tc2dfY29udHJvbGxlbiA9IDA7Ci0JCQkJZ290byBpbmNvbXBsZXRlX3JjdjsKLQkJCX0gZWxzZQotCQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKGxlbmd0aCA8PSAwKSB7Ci0JCQljRllJKDEsICJSZWNvbm5lY3QgYWZ0ZXIgdW5leHBlY3RlZCBwZWVrIGVycm9yICVkIiwKLQkJCQlsZW5ndGgpOwotCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKLQkJCWNzb2NrZXQgPSBzZXJ2ZXItPnNzb2NrZXQ7Ci0JCQl3YWtlX3VwKCZzZXJ2ZXItPnJlc3BvbnNlX3EpOwotCQkJY29udGludWU7Ci0JCX0gZWxzZSBpZiAobGVuZ3RoIDwgcGR1X2xlbmd0aCkgewotCQkJY0ZZSSgxLCAicmVxdWVzdGVkICVkIGJ5dGVzIGJ1dCBvbmx5IGdvdCAlZCBieXRlcyIsCi0JCQkJICBwZHVfbGVuZ3RoLCBsZW5ndGgpOwotCQkJcGR1X2xlbmd0aCAtPSBsZW5ndGg7Ci0JCQltc2xlZXAoMSk7Ci0JCQlnb3RvIGluY29tcGxldGVfcmN2OwotCQl9Ci0KLQkJLyogVGhlIHJpZ2h0IGFtb3VudCB3YXMgcmVhZCBmcm9tIHNvY2tldCAtIDQgYnl0ZXMgKi8KLQkJLyogc28gd2UgY2FuIG5vdyBpbnRlcnByZXQgdGhlIGxlbmd0aCBmaWVsZCAqLwotCi0JCS8qIHRoZSBmaXJzdCBieXRlIGJpZyBlbmRpYW4gb2YgdGhlIGxlbmd0aCBmaWVsZCwKLQkJaXMgYWN0dWFsbHkgbm90IHBhcnQgb2YgdGhlIGxlbmd0aCBidXQgdGhlIHR5cGUKLQkJd2l0aCB0aGUgbW9zdCBjb21tb24sIHplcm8sIGFzIHJlZ3VsYXIgZGF0YSAqLwotCQl0ZW1wID0gKigoY2hhciAqKSBzbWJfYnVmZmVyKTsKLQotCQkvKiBOb3RlIHRoYXQgRkMgMTAwMSBsZW5ndGggaXMgYmlnIGVuZGlhbiBvbiB0aGUgd2lyZSwKLQkJYnV0IHdlIGNvbnZlcnQgaXQgaGVyZSBzbyBpdCBpcyBhbHdheXMgbWFuaXB1bGF0ZWQKLQkJYXMgaG9zdCBieXRlIG9yZGVyICovCi0JCXBkdV9sZW5ndGggPSBiZTMyX3RvX2NwdShzbWJfYnVmZmVyLT5zbWJfYnVmX2xlbmd0aCk7Ci0KLQkJY0ZZSSgxLCAicmZjMTAwMiBsZW5ndGggMHgleCIsIHBkdV9sZW5ndGgrNCk7Ci0KLQkJaWYgKHRlbXAgPT0gKGNoYXIpIFJGQzEwMDJfU0VTU0lPTl9LRUVQX0FMSVZFKSB7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIGlmICh0ZW1wID09IChjaGFyKVJGQzEwMDJfUE9TSVRJVkVfU0VTU0lPTl9SRVNQT05TRSkgewotCQkJY0ZZSSgxLCAiR29vZCBSRkMgMTAwMiBzZXNzaW9uIHJzcCIpOwotCQkJY29udGludWU7Ci0JCX0gZWxzZSBpZiAodGVtcCA9PSAoY2hhcilSRkMxMDAyX05FR0FUSVZFX1NFU1NJT05fUkVTUE9OU0UpIHsKLQkJCS8qIHdlIGdldCB0aGlzIGZyb20gV2luZG93cyA5OCBpbnN0ZWFkIG9mCi0JCQkgICBhbiBlcnJvciBvbiBTTUIgbmVncHJvdCByZXNwb25zZSAqLwotCQkJY0ZZSSgxLCAiTmVnYXRpdmUgUkZDMTAwMiBTZXNzaW9uIFJlc3BvbnNlIEVycm9yIDB4JXgpIiwKLQkJCQlwZHVfbGVuZ3RoKTsKLQkJCS8qIGdpdmUgc2VydmVyIGEgc2Vjb25kIHRvIGNsZWFuIHVwICAqLwotCQkJbXNsZWVwKDEwMDApOwotCQkJLyogYWx3YXlzIHRyeSA0NDUgZmlyc3Qgb24gcmVjb25uZWN0IHNpbmNlIHdlIGdldCBOQUNLCi0JCQkgKiBvbiBzb21lIGlmIHdlIGV2ZXIgY29ubmVjdGVkIHRvIHBvcnQgMTM5ICh0aGUgTkFDSwotCQkJICogaXMgc2luY2Ugd2UgZG8gbm90IGJlZ2luIHdpdGggUkZDMTAwMSBzZXNzaW9uCi0JCQkgKiBpbml0aWFsaXplIGZyYW1lKQorCQkJLyoKKwkJCSAqIE1pbmltdW0gc2xlZXAgdG8gcHJldmVudCBsb29waW5nLCBhbGxvd2luZyBzb2NrZXQKKwkJCSAqIHRvIGNsZWFyIGFuZCBhcHAgdGhyZWFkcyB0byBzZXQgdGNwU3RhdHVzCisJCQkgKiBDaWZzTmVlZFJlY29ubmVjdCBpZiBzZXJ2ZXIgaHVuZy4KIAkJCSAqLwotCQkJY2lmc19zZXRfcG9ydCgoc3RydWN0IHNvY2thZGRyICopCi0JCQkJCSZzZXJ2ZXItPmRzdGFkZHIsIENJRlNfUE9SVCk7Ci0JCQljaWZzX3JlY29ubmVjdChzZXJ2ZXIpOwotCQkJY3NvY2tldCA9IHNlcnZlci0+c3NvY2tldDsKLQkJCXdha2VfdXAoJnNlcnZlci0+cmVzcG9uc2VfcSk7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIGlmICh0ZW1wICE9IChjaGFyKSAwKSB7Ci0JCQljRVJST1IoMSwgIlVua25vd24gUkZDIDEwMDIgZnJhbWUiKTsKLQkJCWNpZnNfZHVtcF9tZW0oIiBSZWNlaXZlZCBEYXRhOiAiLCAoY2hhciAqKXNtYl9idWZmZXIsCi0JCQkJICAgICAgbGVuZ3RoKTsKLQkJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7Ci0JCQljc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBlbHNlIHdlIGhhdmUgYW4gU01CIHJlc3BvbnNlICovCi0JCWlmICgocGR1X2xlbmd0aCA+IENJRlNNYXhCdWZTaXplICsgTUFYX0NJRlNfSERSX1NJWkUgLSA0KSB8fAotCQkJICAgIChwZHVfbGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSAtIDEgLSA0KSkgewotCQkJY0VSUk9SKDEsICJJbnZhbGlkIHNpemUgU01CIGxlbmd0aCAlZCBwZHVfbGVuZ3RoICVkIiwKLQkJCQkJbGVuZ3RoLCBwZHVfbGVuZ3RoKzQpOwotCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKLQkJCWNzb2NrZXQgPSBzZXJ2ZXItPnNzb2NrZXQ7Ci0JCQl3YWtlX3VwKCZzZXJ2ZXItPnJlc3BvbnNlX3EpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBlbHNlIGxlbmd0aCBvayAqLwotCQlyZWNvbm5lY3QgPSAwOwotCi0JCWlmIChwZHVfbGVuZ3RoID4gTUFYX0NJRlNfU01BTExfQlVGRkVSX1NJWkUgLSA0KSB7Ci0JCQlpc0xhcmdlQnVmID0gdHJ1ZTsKLQkJCW1lbWNweShiaWdidWYsIHNtYWxsYnVmLCA0KTsKLQkJCXNtYl9idWZmZXIgPSBiaWdidWY7Ci0JCX0KLQkJbGVuZ3RoID0gMDsKLQkJaW92Lmlvdl9iYXNlID0gNCArIChjaGFyICopc21iX2J1ZmZlcjsKLQkJaW92Lmlvdl9sZW4gPSBwZHVfbGVuZ3RoOwotCQlmb3IgKHRvdGFsX3JlYWQgPSAwOyB0b3RhbF9yZWFkIDwgcGR1X2xlbmd0aDsKLQkJICAgICB0b3RhbF9yZWFkICs9IGxlbmd0aCkgewotCQkJbGVuZ3RoID0ga2VybmVsX3JlY3Ztc2coY3NvY2tldCwgJnNtYl9tc2csICZpb3YsIDEsCi0JCQkJCQlwZHVfbGVuZ3RoIC0gdG90YWxfcmVhZCwgMCk7Ci0JCQlpZiAoc2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc0V4aXRpbmcpIHsKLQkJCQkvKiB0aGVuIHdpbGwgZXhpdCAqLwotCQkJCXJlY29ubmVjdCA9IDI7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKHNlcnZlci0+dGNwU3RhdHVzID09IENpZnNOZWVkUmVjb25uZWN0KSB7Ci0JCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKLQkJCQljc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OwotCQkJCS8qIFJlY29ubmVjdCB3YWtlcyB1cCByc3BucyBxICovCi0JCQkJLyogTm93IHdlIHdpbGwgcmVyZWFkIHNvY2sgKi8KLQkJCQlyZWNvbm5lY3QgPSAxOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChsZW5ndGggPT0gLUVSRVNUQVJUU1lTIHx8Ci0JCQkJICAgbGVuZ3RoID09IC1FQUdBSU4gfHwKLQkJCQkgICBsZW5ndGggPT0gLUVJTlRSKSB7Ci0JCQkJbXNsZWVwKDEpOyAvKiBtaW5pbXVtIHNsZWVwIHRvIHByZXZlbnQgbG9vcGluZywKLQkJCQkJICAgICAgYWxsb3dpbmcgc29ja2V0IHRvIGNsZWFyIGFuZCBhcHAKLQkJCQkJICAgICAgdGhyZWFkcyB0byBzZXQgdGNwU3RhdHVzCi0JCQkJCSAgICAgIENpZnNOZWVkUmVjb25uZWN0IGlmIHNlcnZlciBodW5nKi8KLQkJCQlsZW5ndGggPSAwOworCQkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOworCQkJbGVuZ3RoID0gMDsKKwkJCWlmICghaXNfaGVhZGVyX3JlYWQpCiAJCQkJY29udGludWU7Ci0JCQl9IGVsc2UgaWYgKGxlbmd0aCA8PSAwKSB7Ci0JCQkJY0VSUk9SKDEsICJSZWNlaXZlZCBubyBkYXRhLCBleHBlY3RpbmcgJWQiLAotCQkJCQkgICAgICBwZHVfbGVuZ3RoIC0gdG90YWxfcmVhZCk7Ci0JCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKLQkJCQljc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OwotCQkJCXJlY29ubmVjdCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlY29ubmVjdCA9PSAyKQorCQkJLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgaGVhZGVyIHJlYWQgKi8KKwkJCWlmICh0b3RhbF9yZWFkKSB7CisJCQkJaW92LT5pb3ZfYmFzZSA9ICh0b19yZWFkIC0gdG90YWxfcmVhZCkgKworCQkJCQkJYnVmOworCQkJCWlvdi0+aW92X2xlbiA9IHRvX3JlYWQgLSB0b3RhbF9yZWFkOworCQkJCXNtYl9tc2ctPm1zZ19jb250cm9sID0gTlVMTDsKKwkJCQlzbWJfbXNnLT5tc2dfY29udHJvbGxlbiA9IDA7CisJCQkJcmMgPSAzOworCQkJfSBlbHNlCisJCQkJcmMgPSAxOwogCQkJYnJlYWs7Ci0JCWVsc2UgaWYgKHJlY29ubmVjdCA9PSAxKQotCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAobGVuZ3RoIDw9IDApIHsKKwkJCWNFUlJPUigxLCAiUmVjZWl2ZWQgbm8gZGF0YSwgZXhwZWN0aW5nICVkIiwKKwkJCSAgICAgICB0b19yZWFkIC0gdG90YWxfcmVhZCk7CisJCQljaWZzX3JlY29ubmVjdChzZXJ2ZXIpOworCQkJcmMgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CiAKLQkJdG90YWxfcmVhZCArPSA0OyAvKiBhY2NvdW50IGZvciByZmMxMDAyIGhkciAqLworCSpwdG90YWxfcmVhZCA9IHRvdGFsX3JlYWQ7CisJcmV0dXJuIHJjOworfQogCi0JCWR1bXBfc21iKHNtYl9idWZmZXIsIHRvdGFsX3JlYWQpOworc3RhdGljIGJvb2wKK2NoZWNrX3JmYzEwMDJfaGVhZGVyKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgY2hhciAqYnVmKQoreworCWNoYXIgdGVtcCA9ICpidWY7CisJdW5zaWduZWQgaW50IHBkdV9sZW5ndGggPSBiZTMyX3RvX2NwdSgKKwkJCQkoKHN0cnVjdCBzbWJfaGRyICopYnVmKS0+c21iX2J1Zl9sZW5ndGgpOwogCisJLyoKKwkgKiBUaGUgZmlyc3QgYnl0ZSBiaWcgZW5kaWFuIG9mIHRoZSBsZW5ndGggZmllbGQsCisJICogaXMgYWN0dWFsbHkgbm90IHBhcnQgb2YgdGhlIGxlbmd0aCBidXQgdGhlIHR5cGUKKwkgKiB3aXRoIHRoZSBtb3N0IGNvbW1vbiwgemVybywgYXMgcmVndWxhciBkYXRhLgorCSAqLworCWlmICh0ZW1wID09IChjaGFyKSBSRkMxMDAyX1NFU1NJT05fS0VFUF9BTElWRSkgeworCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIGlmICh0ZW1wID09IChjaGFyKVJGQzEwMDJfUE9TSVRJVkVfU0VTU0lPTl9SRVNQT05TRSkgeworCQljRllJKDEsICJHb29kIFJGQyAxMDAyIHNlc3Npb24gcnNwIik7CisJCXJldHVybiBmYWxzZTsKKwl9IGVsc2UgaWYgKHRlbXAgPT0gKGNoYXIpUkZDMTAwMl9ORUdBVElWRV9TRVNTSU9OX1JFU1BPTlNFKSB7CiAJCS8qCi0JCSAqIFdlIGtub3cgdGhhdCB3ZSByZWNlaXZlZCBlbm91Z2ggdG8gZ2V0IHRvIHRoZSBNSUQgYXMgd2UKLQkJICogY2hlY2tlZCB0aGUgcGR1X2xlbmd0aCBlYXJsaWVyLiBOb3cgY2hlY2sgdG8gc2VlCi0JCSAqIGlmIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIgaXMgT0suIFdlIGJvcnJvdyB0aGUgbGVuZ3RoCi0JCSAqIHZhciBmb3IgdGhlIHJlc3Qgb2YgdGhlIGxvb3AgdG8gYXZvaWQgYSBuZXcgc3RhY2sgdmFyLgotCQkgKgotCQkgKiA0OCBieXRlcyBpcyBlbm91Z2ggdG8gZGlzcGxheSB0aGUgaGVhZGVyIGFuZCBhIGxpdHRsZSBiaXQKLQkJICogaW50byB0aGUgcGF5bG9hZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorCQkgKiBXZSBnZXQgdGhpcyBmcm9tIFdpbmRvd3MgOTggaW5zdGVhZCBvZiBhbiBlcnJvciBvbgorCQkgKiBTTUIgbmVncHJvdCByZXNwb25zZS4KIAkJICovCi0JCWxlbmd0aCA9IGNoZWNrU01CKHNtYl9idWZmZXIsIHNtYl9idWZmZXItPk1pZCwgdG90YWxfcmVhZCk7Ci0JCWlmIChsZW5ndGggIT0gMCkKLQkJCWNpZnNfZHVtcF9tZW0oIkJhZCBTTUI6ICIsIHNtYl9idWZmZXIsCi0JCQkJCW1pbl90KHVuc2lnbmVkIGludCwgdG90YWxfcmVhZCwgNDgpKTsKKwkJY0ZZSSgxLCAiTmVnYXRpdmUgUkZDMTAwMiBTZXNzaW9uIFJlc3BvbnNlIEVycm9yIDB4JXgpIiwKKwkJCXBkdV9sZW5ndGgpOworCQkvKiBnaXZlIHNlcnZlciBhIHNlY29uZCB0byBjbGVhbiB1cCAqLworCQltc2xlZXAoMTAwMCk7CisJCS8qCisJCSAqIEFsd2F5cyB0cnkgNDQ1IGZpcnN0IG9uIHJlY29ubmVjdCBzaW5jZSB3ZSBnZXQgTkFDSworCQkgKiBvbiBzb21lIGlmIHdlIGV2ZXIgY29ubmVjdGVkIHRvIHBvcnQgMTM5ICh0aGUgTkFDSworCQkgKiBpcyBzaW5jZSB3ZSBkbyBub3QgYmVnaW4gd2l0aCBSRkMxMDAxIHNlc3Npb24KKwkJICogaW5pdGlhbGl6ZSBmcmFtZSkuCisJCSAqLworCQljaWZzX3NldF9wb3J0KChzdHJ1Y3Qgc29ja2FkZHIgKikKKwkJCQkmc2VydmVyLT5kc3RhZGRyLCBDSUZTX1BPUlQpOworCQljaWZzX3JlY29ubmVjdChzZXJ2ZXIpOworCQl3YWtlX3VwKCZzZXJ2ZXItPnJlc3BvbnNlX3EpOworCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIGlmICh0ZW1wICE9IChjaGFyKSAwKSB7CisJCWNFUlJPUigxLCAiVW5rbm93biBSRkMgMTAwMiBmcmFtZSIpOworCQljaWZzX2R1bXBfbWVtKCIgUmVjZWl2ZWQgRGF0YTogIiwgYnVmLCA0KTsKKwkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KIAotCQltaWRfZW50cnkgPSBOVUxMOwotCQlzZXJ2ZXItPmxzdHJwID0gamlmZmllczsKKwkvKiBlbHNlIHdlIGhhdmUgYW4gU01CIHJlc3BvbnNlICovCisJaWYgKChwZHVfbGVuZ3RoID4gQ0lGU01heEJ1ZlNpemUgKyBNQVhfQ0lGU19IRFJfU0laRSAtIDQpIHx8CisJICAgIChwZHVfbGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSAtIDEgLSA0KSkgeworCQljRVJST1IoMSwgIkludmFsaWQgc2l6ZSBTTUIgbGVuZ3RoICVkIHBkdV9sZW5ndGggJWQiLAorCQkgICAgICAgNCwgcGR1X2xlbmd0aCs0KTsKKwkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKKwkJd2FrZV91cCgmc2VydmVyLT5yZXNwb25zZV9xKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KIAotCQlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKLQkJbGlzdF9mb3JfZWFjaF9zYWZlKHRtcCwgdG1wMiwgJnNlcnZlci0+cGVuZGluZ19taWRfcSkgewotCQkJbWlkX2VudHJ5ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBtaWRfcV9lbnRyeSwgcWhlYWQpOworCXJldHVybiB0cnVlOworfQogCi0JCQlpZiAobWlkX2VudHJ5LT5taWQgIT0gc21iX2J1ZmZlci0+TWlkIHx8Ci0JCQkgICAgbWlkX2VudHJ5LT5taWRTdGF0ZSAhPSBNSURfUkVRVUVTVF9TVUJNSVRURUQgfHwKLQkJCSAgICBtaWRfZW50cnktPmNvbW1hbmQgIT0gc21iX2J1ZmZlci0+Q29tbWFuZCkgewotCQkJCW1pZF9lbnRyeSA9IE5VTEw7Ci0JCQkJY29udGludWU7Ci0JCQl9CitzdGF0aWMgc3RydWN0IG1pZF9xX2VudHJ5ICoKK2ZpbmRfY2lmc19taWQoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCBzdHJ1Y3Qgc21iX2hkciAqYnVmLAorCSAgICAgIGludCAqbGVuZ3RoLCBib29sIGlzX2xhcmdlX2J1ZiwgYm9vbCAqaXNfbXVsdGlfcnNwLCBjaGFyICoqYmlnYnVmKQoreworCXN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkID0gTlVMTCwgKnRtcF9taWQsICpyZXQgPSBOVUxMOwogCi0JCQlpZiAobGVuZ3RoID09IDAgJiYKLQkJCSAgICBjaGVjazJuZFQyKHNtYl9idWZmZXIsIHNlcnZlci0+bWF4QnVmKSA+IDApIHsKLQkJCQkvKiBXZSBoYXZlIGEgbXVsdGlwYXJ0IHRyYW5zYWN0MiByZXNwICovCi0JCQkJaXNNdWx0aVJzcCA9IHRydWU7Ci0JCQkJaWYgKG1pZF9lbnRyeS0+cmVzcF9idWYpIHsKLQkJCQkJLyogbWVyZ2UgcmVzcG9uc2UgLSBmaXggdXAgMXN0Ki8KLQkJCQkJbGVuZ3RoID0gY29hbGVzY2VfdDIoc21iX2J1ZmZlciwKLQkJCQkJCQltaWRfZW50cnktPnJlc3BfYnVmKTsKLQkJCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJCWxlbmd0aCA9IDA7Ci0JCQkJCQltaWRfZW50cnktPm11bHRpUnNwID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLyogYWxsIHBhcnRzIHJlY2VpdmVkIG9yCi0JCQkJCQkgKiBwYWNrZXQgaXMgbWFsZm9ybWVkCi0JCQkJCQkgKi8KLQkJCQkJCW1pZF9lbnRyeS0+bXVsdGlFbmQgPSB0cnVlOwotCQkJCQkJZ290byBtdWx0aV90Ml9mbmQ7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoIWlzTGFyZ2VCdWYpIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiBGSVhNRTogc3dpdGNoIHRvIGFscmVhZHkKLQkJCQkJCSAqICAgICAgICBhbGxvY2F0ZWQgbGFyZ2VidWY/Ci0JCQkJCQkgKi8KLQkJCQkJCWNFUlJPUigxLCAiMXN0IHRyYW5zMiByZXNwICIKLQkJCQkJCQkgICJuZWVkcyBiaWdidWYiKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8qIEhhdmUgZmlyc3QgYnVmZmVyICovCi0JCQkJCQltaWRfZW50cnktPnJlc3BfYnVmID0KLQkJCQkJCQkgc21iX2J1ZmZlcjsKLQkJCQkJCW1pZF9lbnRyeS0+bGFyZ2VCdWYgPSB0cnVlOwotCQkJCQkJYmlnYnVmID0gTlVMTDsKLQkJCQkJfQorCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtaWQsIHRtcF9taWQsICZzZXJ2ZXItPnBlbmRpbmdfbWlkX3EsIHFoZWFkKSB7CisJCWlmIChtaWQtPm1pZCAhPSBidWYtPk1pZCB8fAorCQkgICAgbWlkLT5taWRTdGF0ZSAhPSBNSURfUkVRVUVTVF9TVUJNSVRURUQgfHwKKwkJICAgIG1pZC0+Y29tbWFuZCAhPSBidWYtPkNvbW1hbmQpCisJCQljb250aW51ZTsKKworCQlpZiAoKmxlbmd0aCA9PSAwICYmIGNoZWNrMm5kVDIoYnVmLCBzZXJ2ZXItPm1heEJ1ZikgPiAwKSB7CisJCQkvKiBXZSBoYXZlIGEgbXVsdGlwYXJ0IHRyYW5zYWN0MiByZXNwICovCisJCQkqaXNfbXVsdGlfcnNwID0gdHJ1ZTsKKwkJCWlmIChtaWQtPnJlc3BfYnVmKSB7CisJCQkJLyogbWVyZ2UgcmVzcG9uc2UgLSBmaXggdXAgMXN0Ki8KKwkJCQkqbGVuZ3RoID0gY29hbGVzY2VfdDIoYnVmLCBtaWQtPnJlc3BfYnVmKTsKKwkJCQlpZiAoKmxlbmd0aCA+IDApIHsKKwkJCQkJKmxlbmd0aCA9IDA7CisJCQkJCW1pZC0+bXVsdGlSc3AgPSB0cnVlOworCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJYnJlYWs7CisJCQkJLyogQWxsIHBhcnRzIHJlY2VpdmVkIG9yIHBhY2tldCBpcyBtYWxmb3JtZWQuICovCisJCQkJbWlkLT5tdWx0aUVuZCA9IHRydWU7CisJCQkJZ290byBtdWx0aV90Ml9mbmQ7CiAJCQl9Ci0JCQltaWRfZW50cnktPnJlc3BfYnVmID0gc21iX2J1ZmZlcjsKLQkJCW1pZF9lbnRyeS0+bGFyZ2VCdWYgPSBpc0xhcmdlQnVmOwotbXVsdGlfdDJfZm5kOgotCQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJCW1pZF9lbnRyeS0+bWlkU3RhdGUgPSBNSURfUkVTUE9OU0VfUkVDRUlWRUQ7Ci0JCQllbHNlCi0JCQkJbWlkX2VudHJ5LT5taWRTdGF0ZSA9IE1JRF9SRVNQT05TRV9NQUxGT1JNRUQ7Ci0jaWZkZWYgQ09ORklHX0NJRlNfU1RBVFMyCi0JCQltaWRfZW50cnktPndoZW5fcmVjZWl2ZWQgPSBqaWZmaWVzOwotI2VuZGlmCi0JCQlsaXN0X2RlbF9pbml0KCZtaWRfZW50cnktPnFoZWFkKTsKKwkJCWlmICghaXNfbGFyZ2VfYnVmKSB7CisJCQkJLypGSVhNRTogc3dpdGNoIHRvIGFscmVhZHkgYWxsb2NhdGVkIGxhcmdlYnVmPyovCisJCQkJY0VSUk9SKDEsICIxc3QgdHJhbnMyIHJlc3AgbmVlZHMgYmlnYnVmIik7CisJCQl9IGVsc2UgeworCQkJCS8qIEhhdmUgZmlyc3QgYnVmZmVyICovCisJCQkJbWlkLT5yZXNwX2J1ZiA9IGJ1ZjsKKwkJCQltaWQtPmxhcmdlQnVmID0gdHJ1ZTsKKwkJCQkqYmlnYnVmID0gTlVMTDsKKwkJCX0KIAkJCWJyZWFrOwogCQl9Ci0JCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJCW1pZC0+cmVzcF9idWYgPSBidWY7CisJCW1pZC0+bGFyZ2VCdWYgPSBpc19sYXJnZV9idWY7CittdWx0aV90Ml9mbmQ6CisJCWlmICgqbGVuZ3RoID09IDApCisJCQltaWQtPm1pZFN0YXRlID0gTUlEX1JFU1BPTlNFX1JFQ0VJVkVEOworCQllbHNlCisJCQltaWQtPm1pZFN0YXRlID0gTUlEX1JFU1BPTlNFX01BTEZPUk1FRDsKKyNpZmRlZiBDT05GSUdfQ0lGU19TVEFUUzIKKwkJbWlkLT53aGVuX3JlY2VpdmVkID0gamlmZmllczsKKyNlbmRpZgorCQlsaXN0X2RlbF9pbml0KCZtaWQtPnFoZWFkKTsKKwkJcmV0ID0gbWlkOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKIAotCQlpZiAobWlkX2VudHJ5ICE9IE5VTEwpIHsKLQkJCW1pZF9lbnRyeS0+Y2FsbGJhY2sobWlkX2VudHJ5KTsKLQkJCS8qIFdhcyBwcmV2aW91cyBidWYgcHV0IGluIG1weCBzdHJ1Y3QgZm9yIG11bHRpLXJzcD8gKi8KLQkJCWlmICghaXNNdWx0aVJzcCkgewotCQkJCS8qIHNtYiBidWZmZXIgd2lsbCBiZSBmcmVlZCBieSB1c2VyIHRocmVhZCAqLwotCQkJCWlmIChpc0xhcmdlQnVmKQotCQkJCQliaWdidWYgPSBOVUxMOwotCQkJCWVsc2UKLQkJCQkJc21hbGxidWYgPSBOVUxMOwotCQkJfQotCQl9IGVsc2UgaWYgKGxlbmd0aCAhPSAwKSB7Ci0JCQkvKiByZXNwb25zZSBzYW5pdHkgY2hlY2tzIGZhaWxlZCAqLwotCQkJY29udGludWU7Ci0JCX0gZWxzZSBpZiAoIWlzX3ZhbGlkX29wbG9ja19icmVhayhzbWJfYnVmZmVyLCBzZXJ2ZXIpICYmCi0JCQkgICAhaXNNdWx0aVJzcCkgewotCQkJY0VSUk9SKDEsICJObyB0YXNrIHRvIHdha2UsIHVua25vd24gZnJhbWUgcmVjZWl2ZWQhICIKLQkJCQkgICAiTnVtTWlkcyAlZCIsIGF0b21pY19yZWFkKCZtaWRDb3VudCkpOwotCQkJY2lmc19kdW1wX21lbSgiUmVjZWl2ZWQgRGF0YSBpczogIiwgKGNoYXIgKilzbWJfYnVmZmVyLAotCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc21iX2hkcikpOwotI2lmZGVmIENPTkZJR19DSUZTX0RFQlVHMgotCQkJY2lmc19kdW1wX2RldGFpbChzbWJfYnVmZmVyKTsKLQkJCWNpZnNfZHVtcF9taWRzKHNlcnZlcik7Ci0jZW5kaWYgLyogQ0lGU19ERUJVRzIgKi8KKwlyZXR1cm4gcmV0OworfQogCi0JCX0KLQl9IC8qIGVuZCB3aGlsZSAhRVhJVElORyAqLworc3RhdGljIHZvaWQgY2xlYW5fZGVtdWx0aXBsZXhfaW5mbyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpCit7CisJaW50IGxlbmd0aDsKIAogCS8qIHRha2UgaXQgb2ZmIHRoZSBsaXN0LCBpZiBpdCdzIG5vdCBhbHJlYWR5ICovCiAJc3Bpbl9sb2NrKCZjaWZzX3RjcF9zZXNfbG9jayk7CkBAIC02NjgsMzUgKzU0NSwzOSBAQAogCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CiAJd2FrZV91cF9hbGwoJnNlcnZlci0+cmVzcG9uc2VfcSk7CiAKLQkvKiBjaGVjayBpZiB3ZSBoYXZlIGJsb2NrZWQgcmVxdWVzdHMgdGhhdCBuZWVkIHRvIGZyZWUgKi8KLQkvKiBOb3RlIHRoYXQgY2lmc19tYXhfcGVuZGluZyBpcyBub3JtYWxseSA1MCwgYnV0Ci0JY2FuIGJlIHNldCBhdCBtb2R1bGUgaW5zdGFsbCB0aW1lIHRvIGFzIGxpdHRsZSBhcyB0d28gKi8KKwkvKgorCSAqIENoZWNrIGlmIHdlIGhhdmUgYmxvY2tlZCByZXF1ZXN0cyB0aGF0IG5lZWQgdG8gZnJlZS4gTm90ZSB0aGF0CisJICogY2lmc19tYXhfcGVuZGluZyBpcyBub3JtYWxseSA1MCwgYnV0IGNhbiBiZSBzZXQgYXQgbW9kdWxlIGluc3RhbGwKKwkgKiB0aW1lIHRvIGFzIGxpdHRsZSBhcyB0d28uCisJICovCiAJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7CiAJaWYgKGF0b21pY19yZWFkKCZzZXJ2ZXItPmluRmxpZ2h0KSA+PSBjaWZzX21heF9wZW5kaW5nKQogCQlhdG9taWNfc2V0KCZzZXJ2ZXItPmluRmxpZ2h0LCBjaWZzX21heF9wZW5kaW5nIC0gMSk7Ci0JLyogV2UgZG8gbm90IHdhbnQgdG8gc2V0IHRoZSBtYXhfcGVuZGluZyB0b28gbG93IG9yIHdlCi0JY291bGQgZW5kIHVwIHdpdGggdGhlIGNvdW50ZXIgZ29pbmcgbmVnYXRpdmUgKi8KKwkvKgorCSAqIFdlIGRvIG5vdCB3YW50IHRvIHNldCB0aGUgbWF4X3BlbmRpbmcgdG9vIGxvdyBvciB3ZSBjb3VsZCBlbmQgdXAKKwkgKiB3aXRoIHRoZSBjb3VudGVyIGdvaW5nIG5lZ2F0aXZlLgorCSAqLwogCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7Ci0JLyogQWx0aG91Z2ggdGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgcmVxdWVzdHMgYmxvY2tlZCBvbgotCXRoaXMgcXVldWUgaXQgY2FuIG5vdCBodXJ0IHRvIGJlIHBhcmFub2lkIGFuZCB0cnkgdG8gd2FrZSB1cCByZXF1ZXN0cwotCXRoYXQgbWF5IGhhdmVuIGJlZW4gYmxvY2tlZCB3aGVuIG1vcmUgdGhhbiA1MCBhdCB0aW1lIHdlcmUgb24gdGhlIHdpcmUKLQl0byB0aGUgc2FtZSBzZXJ2ZXIgLSB0aGV5IG5vdyB3aWxsIHNlZSB0aGUgc2Vzc2lvbiBpcyBpbiBleGl0IHN0YXRlCi0JYW5kIGdldCBvdXQgb2YgU2VuZFJlY2VpdmUuICAqLworCS8qCisJICogQWx0aG91Z2ggdGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgcmVxdWVzdHMgYmxvY2tlZCBvbiB0aGlzIHF1ZXVlIGl0CisJICogY2FuIG5vdCBodXJ0IHRvIGJlIHBhcmFub2lkIGFuZCB0cnkgdG8gd2FrZSB1cCByZXF1ZXN0cyB0aGF0IG1heQorCSAqIGhhdmVuIGJlZW4gYmxvY2tlZCB3aGVuIG1vcmUgdGhhbiA1MCBhdCB0aW1lIHdlcmUgb24gdGhlIHdpcmUgdG8gdGhlCisJICogc2FtZSBzZXJ2ZXIgLSB0aGV5IG5vdyB3aWxsIHNlZSB0aGUgc2Vzc2lvbiBpcyBpbiBleGl0IHN0YXRlIGFuZCBnZXQKKwkgKiBvdXQgb2YgU2VuZFJlY2VpdmUuCisJICovCiAJd2FrZV91cF9hbGwoJnNlcnZlci0+cmVxdWVzdF9xKTsKIAkvKiBnaXZlIHRob3NlIHJlcXVlc3RzIHRpbWUgdG8gZXhpdCAqLwogCW1zbGVlcCgxMjUpOwogCiAJaWYgKHNlcnZlci0+c3NvY2tldCkgewotCQlzb2NrX3JlbGVhc2UoY3NvY2tldCk7CisJCXNvY2tfcmVsZWFzZShzZXJ2ZXItPnNzb2NrZXQpOwogCQlzZXJ2ZXItPnNzb2NrZXQgPSBOVUxMOwogCX0KLQkvKiBidWZmZXIgdXN1YWxseSBmcmVlZCBpbiBmcmVlX21pZCAtIG5lZWQgdG8gZnJlZSBpdCBoZXJlIG9uIGV4aXQgKi8KLQljaWZzX2J1Zl9yZWxlYXNlKGJpZ2J1Zik7Ci0JaWYgKHNtYWxsYnVmKSAvKiBubyBzZW5zZSBsb2dnaW5nIGEgZGVidWcgbWVzc2FnZSBpZiBOVUxMICovCi0JCWNpZnNfc21hbGxfYnVmX3JlbGVhc2Uoc21hbGxidWYpOwogCiAJaWYgKCFsaXN0X2VtcHR5KCZzZXJ2ZXItPnBlbmRpbmdfbWlkX3EpKSB7CiAJCXN0cnVjdCBsaXN0X2hlYWQgZGlzcG9zZV9saXN0OworCQlzdHJ1Y3QgbWlkX3FfZW50cnkgKm1pZF9lbnRyeTsKKwkJc3RydWN0IGxpc3RfaGVhZCAqdG1wLCAqdG1wMjsKIAogCQlJTklUX0xJU1RfSEVBRCgmZGlzcG9zZV9saXN0KTsKIAkJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7CkBAIC03MjAsMjYgKzYwMSwxODQgQEAKIAl9CiAKIAlpZiAoIWxpc3RfZW1wdHkoJnNlcnZlci0+cGVuZGluZ19taWRfcSkpIHsKLQkJLyogbXB4IHRocmVhZHMgaGF2ZSBub3QgZXhpdGVkIHlldCBnaXZlIHRoZW0KLQkJYXQgbGVhc3QgdGhlIHNtYiBzZW5kIHRpbWVvdXQgdGltZSBmb3IgbG9uZyBvcHMgKi8KLQkJLyogZHVlIHRvIGRlbGF5cyBvbiBvcGxvY2sgYnJlYWsgcmVxdWVzdHMsIHdlIG5lZWQKLQkJdG8gd2FpdCBhdCBsZWFzdCA0NSBzZWNvbmRzIGJlZm9yZSBnaXZpbmcgdXAKLQkJb24gYSByZXF1ZXN0IGdldHRpbmcgYSByZXNwb25zZSBhbmQgZ29pbmcgYWhlYWQKLQkJYW5kIGtpbGxpbmcgY2lmc2QgKi8KKwkJLyoKKwkJICogbXB4IHRocmVhZHMgaGF2ZSBub3QgZXhpdGVkIHlldCBnaXZlIHRoZW0gYXQgbGVhc3QgdGhlIHNtYgorCQkgKiBzZW5kIHRpbWVvdXQgdGltZSBmb3IgbG9uZyBvcHMuCisJCSAqCisJCSAqIER1ZSB0byBkZWxheXMgb24gb3Bsb2NrIGJyZWFrIHJlcXVlc3RzLCB3ZSBuZWVkIHRvIHdhaXQgYXQKKwkJICogbGVhc3QgNDUgc2Vjb25kcyBiZWZvcmUgZ2l2aW5nIHVwIG9uIGEgcmVxdWVzdCBnZXR0aW5nIGEKKwkJICogcmVzcG9uc2UgYW5kIGdvaW5nIGFoZWFkIGFuZCBraWxsaW5nIGNpZnNkLgorCQkgKi8KIAkJY0ZZSSgxLCAiV2FpdCBmb3IgZXhpdCBmcm9tIGRlbXVsdGlwbGV4IHRocmVhZCIpOwogCQltc2xlZXAoNDYwMDApOwotCQkvKiBpZiB0aHJlYWRzIHN0aWxsIGhhdmUgbm90IGV4aXRlZCB0aGV5IGFyZSBwcm9iYWJseSBuZXZlcgotCQljb21pbmcgaG9tZSBub3QgbXVjaCBlbHNlIHdlIGNhbiBkbyBidXQgZnJlZSB0aGUgbWVtb3J5ICovCisJCS8qCisJCSAqIElmIHRocmVhZHMgc3RpbGwgaGF2ZSBub3QgZXhpdGVkIHRoZXkgYXJlIHByb2JhYmx5IG5ldmVyCisJCSAqIGNvbWluZyBob21lIG5vdCBtdWNoIGVsc2Ugd2UgY2FuIGRvIGJ1dCBmcmVlIHRoZSBtZW1vcnkuCisJCSAqLwogCX0KIAogCWtmcmVlKHNlcnZlci0+aG9zdG5hbWUpOwotCXRhc2tfdG9fd2FrZSA9IHhjaGcoJnNlcnZlci0+dHNrLCBOVUxMKTsKIAlrZnJlZShzZXJ2ZXIpOwogCiAJbGVuZ3RoID0gYXRvbWljX2RlY19yZXR1cm4oJnRjcFNlc0FsbG9jQ291bnQpOwotCWlmIChsZW5ndGggID4gMCkKKwlpZiAobGVuZ3RoID4gMCkKIAkJbWVtcG9vbF9yZXNpemUoY2lmc19yZXFfcG9vbHAsIGxlbmd0aCArIGNpZnNfbWluX3JjdiwKIAkJCQlHRlBfS0VSTkVMKTsKK30KKworc3RhdGljIGludAorY2lmc19kZW11bHRpcGxleF90aHJlYWQodm9pZCAqcCkKK3sKKwlpbnQgbGVuZ3RoOworCXN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciA9IHA7CisJdW5zaWduZWQgaW50IHBkdV9sZW5ndGgsIHRvdGFsX3JlYWQ7CisJY2hhciAqYnVmID0gTlVMTCwgKmJpZ2J1ZiA9IE5VTEwsICpzbWFsbGJ1ZiA9IE5VTEw7CisJc3RydWN0IHNtYl9oZHIgKnNtYl9idWZmZXIgPSBOVUxMOworCXN0cnVjdCBtc2doZHIgc21iX21zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3Y7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrX3RvX3dha2UgPSBOVUxMOworCXN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkX2VudHJ5OworCWJvb2wgaXNMYXJnZUJ1ZiA9IGZhbHNlOworCWJvb2wgaXNNdWx0aVJzcCA9IGZhbHNlOworCWludCByYzsKKworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX01FTUFMTE9DOworCWNGWUkoMSwgIkRlbXVsdGlwbGV4IFBJRDogJWQiLCB0YXNrX3BpZF9ucihjdXJyZW50KSk7CisKKwlsZW5ndGggPSBhdG9taWNfaW5jX3JldHVybigmdGNwU2VzQWxsb2NDb3VudCk7CisJaWYgKGxlbmd0aCA+IDEpCisJCW1lbXBvb2xfcmVzaXplKGNpZnNfcmVxX3Bvb2xwLCBsZW5ndGggKyBjaWZzX21pbl9yY3YsCisJCQkJR0ZQX0tFUk5FTCk7CisKKwlzZXRfZnJlZXphYmxlKCk7CisJd2hpbGUgKHNlcnZlci0+dGNwU3RhdHVzICE9IENpZnNFeGl0aW5nKSB7CisJCWlmICh0cnlfdG9fZnJlZXplKCkpCisJCQljb250aW51ZTsKKworCQlpZiAoIWFsbG9jYXRlX2J1ZmZlcnMoJmJpZ2J1ZiwgJnNtYWxsYnVmLAorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc21iX2hkciksIGlzTGFyZ2VCdWYpKQorCQkJY29udGludWU7CisKKwkJaXNMYXJnZUJ1ZiA9IGZhbHNlOworCQlpc011bHRpUnNwID0gZmFsc2U7CisJCXNtYl9idWZmZXIgPSAoc3RydWN0IHNtYl9oZHIgKilzbWFsbGJ1ZjsKKwkJYnVmID0gc21hbGxidWY7CisJCWlvdi5pb3ZfYmFzZSA9IGJ1ZjsKKwkJaW92Lmlvdl9sZW4gPSA0OworCQlzbWJfbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwkJc21iX21zZy5tc2dfY29udHJvbGxlbiA9IDA7CisJCXBkdV9sZW5ndGggPSA0OyAvKiBlbm91Z2ggdG8gZ2V0IFJGQzEwMDEgaGVhZGVyICovCisKK2luY29tcGxldGVfcmN2OgorCQlpZiAoZWNob19yZXRyaWVzID4gMCAmJiBzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzR29vZCAmJgorCQkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBzZXJ2ZXItPmxzdHJwICsKKwkJCQkJKGVjaG9fcmV0cmllcyAqIFNNQl9FQ0hPX0lOVEVSVkFMKSkpIHsKKwkJCWNFUlJPUigxLCAiU2VydmVyICVzIGhhcyBub3QgcmVzcG9uZGVkIGluICVkIHNlY29uZHMuICIKKwkJCQkgICJSZWNvbm5lY3RpbmcuLi4iLCBzZXJ2ZXItPmhvc3RuYW1lLAorCQkJCSAgKGVjaG9fcmV0cmllcyAqIFNNQl9FQ0hPX0lOVEVSVkFMIC8gSFopKTsKKwkJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7CisJCQl3YWtlX3VwKCZzZXJ2ZXItPnJlc3BvbnNlX3EpOworCQkJY29udGludWU7CisJCX0KKworCQlyYyA9IHJlYWRfZnJvbV9zb2NrZXQoc2VydmVyLCAmc21iX21zZywgJmlvdiwgcGR1X2xlbmd0aCwKKwkJCQkgICAgICAmdG90YWxfcmVhZCwgdHJ1ZSAvKiBoZWFkZXIgcmVhZCAqLyk7CisJCWlmIChyYyA9PSAzKQorCQkJZ290byBpbmNvbXBsZXRlX3JjdjsKKwkJZWxzZSBpZiAocmMgPT0gMikKKwkJCWJyZWFrOworCQllbHNlIGlmIChyYyA9PSAxKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogVGhlIHJpZ2h0IGFtb3VudCB3YXMgcmVhZCBmcm9tIHNvY2tldCAtIDQgYnl0ZXMsCisJCSAqIHNvIHdlIGNhbiBub3cgaW50ZXJwcmV0IHRoZSBsZW5ndGggZmllbGQuCisJCSAqLworCisJCS8qCisJCSAqIE5vdGUgdGhhdCBSRkMgMTAwMSBsZW5ndGggaXMgYmlnIGVuZGlhbiBvbiB0aGUgd2lyZSwKKwkJICogYnV0IHdlIGNvbnZlcnQgaXQgaGVyZSBzbyBpdCBpcyBhbHdheXMgbWFuaXB1bGF0ZWQKKwkJICogYXMgaG9zdCBieXRlIG9yZGVyLgorCQkgKi8KKwkJcGR1X2xlbmd0aCA9IGJlMzJfdG9fY3B1KHNtYl9idWZmZXItPnNtYl9idWZfbGVuZ3RoKTsKKworCQljRllJKDEsICJyZmMxMDAyIGxlbmd0aCAweCV4IiwgcGR1X2xlbmd0aCs0KTsKKwkJaWYgKCFjaGVja19yZmMxMDAyX2hlYWRlcihzZXJ2ZXIsIGJ1ZikpCisJCQljb250aW51ZTsKKworCQkvKiBlbHNlIGxlbmd0aCBvayAqLworCQlpZiAocGR1X2xlbmd0aCA+IE1BWF9DSUZTX1NNQUxMX0JVRkZFUl9TSVpFIC0gNCkgeworCQkJaXNMYXJnZUJ1ZiA9IHRydWU7CisJCQltZW1jcHkoYmlnYnVmLCBzbWFsbGJ1ZiwgNCk7CisJCQlzbWJfYnVmZmVyID0gKHN0cnVjdCBzbWJfaGRyICopYmlnYnVmOworCQkJYnVmID0gYmlnYnVmOworCQl9CisKKwkJaW92Lmlvdl9iYXNlID0gNCArIGJ1ZjsKKwkJaW92Lmlvdl9sZW4gPSBwZHVfbGVuZ3RoOworCQlyYyA9IHJlYWRfZnJvbV9zb2NrZXQoc2VydmVyLCAmc21iX21zZywgJmlvdiwgcGR1X2xlbmd0aCwKKwkJCQkgICAgICAmdG90YWxfcmVhZCwgZmFsc2UpOworCQlpZiAocmMgPT0gMikKKwkJCWJyZWFrOworCQllbHNlIGlmIChyYyA9PSAxKQorCQkJY29udGludWU7CisKKwkJdG90YWxfcmVhZCArPSA0OyAvKiBhY2NvdW50IGZvciByZmMxMDAyIGhkciAqLworCisJCWR1bXBfc21iKHNtYl9idWZmZXIsIHRvdGFsX3JlYWQpOworCisJCS8qCisJCSAqIFdlIGtub3cgdGhhdCB3ZSByZWNlaXZlZCBlbm91Z2ggdG8gZ2V0IHRvIHRoZSBNSUQgYXMgd2UKKwkJICogY2hlY2tlZCB0aGUgcGR1X2xlbmd0aCBlYXJsaWVyLiBOb3cgY2hlY2sgdG8gc2VlCisJCSAqIGlmIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIgaXMgT0suIFdlIGJvcnJvdyB0aGUgbGVuZ3RoCisJCSAqIHZhciBmb3IgdGhlIHJlc3Qgb2YgdGhlIGxvb3AgdG8gYXZvaWQgYSBuZXcgc3RhY2sgdmFyLgorCQkgKgorCQkgKiA0OCBieXRlcyBpcyBlbm91Z2ggdG8gZGlzcGxheSB0aGUgaGVhZGVyIGFuZCBhIGxpdHRsZSBiaXQKKwkJICogaW50byB0aGUgcGF5bG9hZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorCQkgKi8KKwkJbGVuZ3RoID0gY2hlY2tTTUIoc21iX2J1ZmZlciwgc21iX2J1ZmZlci0+TWlkLCB0b3RhbF9yZWFkKTsKKwkJaWYgKGxlbmd0aCAhPSAwKQorCQkJY2lmc19kdW1wX21lbSgiQmFkIFNNQjogIiwgYnVmLAorCQkJCSAgICAgIG1pbl90KHVuc2lnbmVkIGludCwgdG90YWxfcmVhZCwgNDgpKTsKKworCQlzZXJ2ZXItPmxzdHJwID0gamlmZmllczsKKworCQltaWRfZW50cnkgPSBmaW5kX2NpZnNfbWlkKHNlcnZlciwgc21iX2J1ZmZlciwgJmxlbmd0aCwKKwkJCQkJICBpc0xhcmdlQnVmLCAmaXNNdWx0aVJzcCwgJmJpZ2J1Zik7CisJCWlmIChtaWRfZW50cnkgIT0gTlVMTCkgeworCQkJbWlkX2VudHJ5LT5jYWxsYmFjayhtaWRfZW50cnkpOworCQkJLyogV2FzIHByZXZpb3VzIGJ1ZiBwdXQgaW4gbXB4IHN0cnVjdCBmb3IgbXVsdGktcnNwPyAqLworCQkJaWYgKCFpc011bHRpUnNwKSB7CisJCQkJLyogc21iIGJ1ZmZlciB3aWxsIGJlIGZyZWVkIGJ5IHVzZXIgdGhyZWFkICovCisJCQkJaWYgKGlzTGFyZ2VCdWYpCisJCQkJCWJpZ2J1ZiA9IE5VTEw7CisJCQkJZWxzZQorCQkJCQlzbWFsbGJ1ZiA9IE5VTEw7CisJCQl9CisJCX0gZWxzZSBpZiAobGVuZ3RoICE9IDApIHsKKwkJCS8qIHJlc3BvbnNlIHNhbml0eSBjaGVja3MgZmFpbGVkICovCisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmICghaXNfdmFsaWRfb3Bsb2NrX2JyZWFrKHNtYl9idWZmZXIsIHNlcnZlcikgJiYKKwkJCSAgICFpc011bHRpUnNwKSB7CisJCQljRVJST1IoMSwgIk5vIHRhc2sgdG8gd2FrZSwgdW5rbm93biBmcmFtZSByZWNlaXZlZCEgIgorCQkJCSAgICJOdW1NaWRzICVkIiwgYXRvbWljX3JlYWQoJm1pZENvdW50KSk7CisJCQljaWZzX2R1bXBfbWVtKCJSZWNlaXZlZCBEYXRhIGlzOiAiLCBidWYsCisJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSk7CisjaWZkZWYgQ09ORklHX0NJRlNfREVCVUcyCisJCQljaWZzX2R1bXBfZGV0YWlsKHNtYl9idWZmZXIpOworCQkJY2lmc19kdW1wX21pZHMoc2VydmVyKTsKKyNlbmRpZiAvKiBDSUZTX0RFQlVHMiAqLworCisJCX0KKwl9IC8qIGVuZCB3aGlsZSAhRVhJVElORyAqLworCisJLyogYnVmZmVyIHVzdWFsbHkgZnJlZWQgaW4gZnJlZV9taWQgLSBuZWVkIHRvIGZyZWUgaXQgaGVyZSBvbiBleGl0ICovCisJY2lmc19idWZfcmVsZWFzZShiaWdidWYpOworCWlmIChzbWFsbGJ1ZikgLyogbm8gc2Vuc2UgbG9nZ2luZyBhIGRlYnVnIG1lc3NhZ2UgaWYgTlVMTCAqLworCQljaWZzX3NtYWxsX2J1Zl9yZWxlYXNlKHNtYWxsYnVmKTsKKworCXRhc2tfdG9fd2FrZSA9IHhjaGcoJnNlcnZlci0+dHNrLCBOVUxMKTsKKwljbGVhbl9kZW11bHRpcGxleF9pbmZvKHNlcnZlcik7CiAKIAkvKiBpZiBzZXJ2ZXItPnRzayB3YXMgTlVMTCB0aGVuIHdhaXQgZm9yIGEgc2lnbmFsIGJlZm9yZSBleGl0aW5nICovCiAJaWYgKCF0YXNrX3RvX3dha2UpIHsKQEAgLTMxOTMsMTUgKzMyMzIsOSBAQAogCQllbHNlCiAJCQljaWZzX3B1dF90Y3Bfc2Vzc2lvbihzcnZUY3ApOwogCQliZGlfZGVzdHJveSgmY2lmc19zYi0+YmRpKTsKLQkJZ290byBvdXQ7CiAJfQogCi0JLyogdm9sdW1lX2luZm8tPnBhc3N3b3JkIGlzIGZyZWVkIGFib3ZlIHdoZW4gZXhpc3Rpbmcgc2Vzc2lvbiBmb3VuZAotCShpbiB3aGljaCBjYXNlIGl0IGlzIG5vdCBuZWVkZWQgYW55bW9yZSkgYnV0IHdoZW4gbmV3IHNlc2lvbiBpcyBjcmVhdGVkCi0JdGhlIHBhc3N3b3JkIHB0ciBpcyBwdXQgaW4gdGhlIG5ldyBzZXNzaW9uIHN0cnVjdHVyZSAoaW4gd2hpY2ggY2FzZSB0aGUKLQlwYXNzd29yZCB3aWxsIGJlIGZyZWVkIGF0IHVubW91bnQgdGltZSkgKi8KIG91dDoKLQkvKiB6ZXJvIG91dCBwYXNzd29yZCBiZWZvcmUgZnJlZWluZyAqLwogCUZyZWVYaWQoeGlkKTsKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9mcy9jaWZzL2ZpbGUuYyBiL2ZzL2NpZnMvZmlsZS5jCmluZGV4IDM3OGFjZGEuLjlmNDFhMTAgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZmlsZS5jCisrKyBiL2ZzL2NpZnMvZmlsZS5jCkBAIC0zMTQsNiArMzE0LDggQEAKIAl9CiAJc3Bpbl91bmxvY2soJmNpZnNfZmlsZV9saXN0X2xvY2spOwogCisJY2FuY2VsX3dvcmtfc3luYygmY2lmc19maWxlLT5vcGxvY2tfYnJlYWspOworCiAJaWYgKCF0Y29uLT5uZWVkX3JlY29ubmVjdCAmJiAhY2lmc19maWxlLT5pbnZhbGlkSGFuZGxlKSB7CiAJCWludCB4aWQsIHJjOwogCkBAIC0yNDE4LDMxICsyNDIwLDYgQEAKIAkJCQkgY2lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQgPyAxIDogMCk7CiAJCWNGWUkoMSwgIk9wbG9jayByZWxlYXNlIHJjID0gJWQiLCByYyk7CiAJfQotCi0JLyoKLQkgKiBXZSBtaWdodCBoYXZlIGtpY2tlZCBpbiBiZWZvcmUgaXNfdmFsaWRfb3Bsb2NrX2JyZWFrKCkKLQkgKiBmaW5pc2hlZCBncmFiYmluZyByZWZlcmVuY2UgZm9yIHVzLiAgTWFrZSBzdXJlIGl0J3MgZG9uZSBieQotCSAqIHdhaXRpbmcgZm9yIGNpZnNfZmlsZV9saXN0X2xvY2suCi0JICovCi0Jc3Bpbl9sb2NrKCZjaWZzX2ZpbGVfbGlzdF9sb2NrKTsKLQlzcGluX3VubG9jaygmY2lmc19maWxlX2xpc3RfbG9jayk7Ci0KLQljaWZzX29wbG9ja19icmVha19wdXQoY2ZpbGUpOwotfQotCi0vKiBtdXN0IGJlIGNhbGxlZCB3aGlsZSBob2xkaW5nIGNpZnNfZmlsZV9saXN0X2xvY2sgKi8KLXZvaWQgY2lmc19vcGxvY2tfYnJlYWtfZ2V0KHN0cnVjdCBjaWZzRmlsZUluZm8gKmNmaWxlKQotewotCWNpZnNfc2JfYWN0aXZlKGNmaWxlLT5kZW50cnktPmRfc2IpOwotCWNpZnNGaWxlSW5mb19nZXQoY2ZpbGUpOwotfQotCi12b2lkIGNpZnNfb3Bsb2NrX2JyZWFrX3B1dChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpjZmlsZSkKLXsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gY2ZpbGUtPmRlbnRyeS0+ZF9zYjsKLQotCWNpZnNGaWxlSW5mb19wdXQoY2ZpbGUpOwotCWNpZnNfc2JfZGVhY3RpdmUoc2IpOwogfQogCiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGNpZnNfYWRkcl9vcHMgPSB7CmRpZmYgLS1naXQgYS9mcy9jaWZzL21pc2MuYyBiL2ZzL2NpZnMvbWlzYy5jCmluZGV4IDAzYTFmNDkuLjdjMTY5MzMgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvbWlzYy5jCisrKyBiL2ZzL2NpZnMvbWlzYy5jCkBAIC01ODUsMTUgKzU4NSw4IEBACiAKIAkJCQljaWZzX3NldF9vcGxvY2tfbGV2ZWwocENpZnNJbm9kZSwKIAkJCQkJcFNNQi0+T3Bsb2NrTGV2ZWwgPyBPUExPQ0tfUkVBRCA6IDApOwotCQkJCS8qCi0JCQkJICogY2lmc19vcGxvY2tfYnJlYWtfcHV0KCkgY2FuJ3QgYmUgY2FsbGVkCi0JCQkJICogZnJvbSBoZXJlLiAgR2V0IHJlZmVyZW5jZSBhZnRlciBxdWV1ZWluZwotCQkJCSAqIHN1Y2NlZWRlZC4gIGNpZnNfb3Bsb2NrX2JyZWFrKCkgd2lsbAotCQkJCSAqIHN5bmNocm9uaXplIHVzaW5nIGNpZnNfZmlsZV9saXN0X2xvY2suCi0JCQkJICovCi0JCQkJaWYgKHF1ZXVlX3dvcmsoc3lzdGVtX25ydF93cSwKLQkJCQkJICAgICAgICZuZXRmaWxlLT5vcGxvY2tfYnJlYWspKQotCQkJCQljaWZzX29wbG9ja19icmVha19nZXQobmV0ZmlsZSk7CisJCQkJcXVldWVfd29yayhzeXN0ZW1fbnJ0X3dxLAorCQkJCQkgICAmbmV0ZmlsZS0+b3Bsb2NrX2JyZWFrKTsKIAkJCQluZXRmaWxlLT5vcGxvY2tfYnJlYWtfY2FuY2VsbGVkID0gZmFsc2U7CiAKIAkJCQlzcGluX3VubG9jaygmY2lmc19maWxlX2xpc3RfbG9jayk7CmRpZmYgLS1naXQgYS9mcy9jaWZzL3Nlc3MuYyBiL2ZzL2NpZnMvc2Vzcy5jCmluZGV4IGQzZTYxOTYuLjI0M2Q1ODcgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvc2Vzcy5jCisrKyBiL2ZzL2NpZnMvc2Vzcy5jCkBAIC0xMjQsNyArMTI0LDggQEAKIAkvKgl0aGF0IHdlIHVzZSBpbiBuZXh0IGZldyBsaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCS8qIE5vdGUgdGhhdCBoZWFkZXIgaXMgaW5pdGlhbGl6ZWQgdG8gemVybyBpbiBoZWFkZXJfYXNzZW1ibGUgKi8KIAlwU01CLT5yZXEuQW5kWENvbW1hbmQgPSAweEZGOwotCXBTTUItPnJlcS5NYXhCdWZmZXJTaXplID0gY3B1X3RvX2xlMTYoc2VzLT5zZXJ2ZXItPm1heEJ1Zik7CisJcFNNQi0+cmVxLk1heEJ1ZmZlclNpemUgPSBjcHVfdG9fbGUxNihtaW5fdCh1MzIsIENJRlNNYXhCdWZTaXplIC0gNCwKKwkJCQkJCVVTSFJUX01BWCkpOwogCXBTTUItPnJlcS5NYXhNcHhDb3VudCA9IGNwdV90b19sZTE2KHNlcy0+c2VydmVyLT5tYXhSZXEpOwogCXBTTUItPnJlcS5WY051bWJlciA9IGdldF9uZXh0X3ZjbnVtKHNlcyk7CiAKZGlmZiAtLWdpdCBhL2ZzL2RjYWNoZS5jIGIvZnMvZGNhY2hlLmMKaW5kZXggYjA1YWFjMy4uYzgzY2FlMSAxMDA2NDQKLS0tIGEvZnMvZGNhY2hlLmMKKysrIGIvZnMvZGNhY2hlLmMKQEAgLTMwMSw2ICszMDEsMjcgQEAKIAlyZXR1cm4gcGFyZW50OwogfQogCisvKgorICogVW5oYXNoIGEgZGVudHJ5IHdpdGhvdXQgaW5zZXJ0aW5nIGFuIFJDVSB3YWxrIGJhcnJpZXIgb3IgY2hlY2tpbmcgdGhhdAorICogZGVudHJ5LT5kX2xvY2sgaXMgbG9ja2VkLiAgVGhlIGNhbGxlciBtdXN0IHRha2UgY2FyZSBvZiB0aGF0LCBpZgorICogYXBwcm9wcmlhdGUuCisgKi8KK3N0YXRpYyB2b2lkIF9fZF9zaHJpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWlmICghZF91bmhhc2hlZChkZW50cnkpKSB7CisJCXN0cnVjdCBobGlzdF9ibF9oZWFkICpiOworCQlpZiAodW5saWtlbHkoZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCkpCisJCQliID0gJmRlbnRyeS0+ZF9zYi0+c19hbm9uOworCQllbHNlCisJCQliID0gZF9oYXNoKGRlbnRyeS0+ZF9wYXJlbnQsIGRlbnRyeS0+ZF9uYW1lLmhhc2gpOworCisJCWhsaXN0X2JsX2xvY2soYik7CisJCV9faGxpc3RfYmxfZGVsKCZkZW50cnktPmRfaGFzaCk7CisJCWRlbnRyeS0+ZF9oYXNoLnBwcmV2ID0gTlVMTDsKKwkJaGxpc3RfYmxfdW5sb2NrKGIpOworCX0KK30KKwogLyoqCiAgKiBkX2Ryb3AgLSBkcm9wIGEgZGVudHJ5CiAgKiBAZGVudHJ5OiBkZW50cnkgdG8gZHJvcApAQCAtMzE5LDE3ICszNDAsNyBAQAogdm9pZCBfX2RfZHJvcChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJaWYgKCFkX3VuaGFzaGVkKGRlbnRyeSkpIHsKLQkJc3RydWN0IGhsaXN0X2JsX2hlYWQgKmI7Ci0JCWlmICh1bmxpa2VseShkZW50cnktPmRfZmxhZ3MgJiBEQ0FDSEVfRElTQ09OTkVDVEVEKSkKLQkJCWIgPSAmZGVudHJ5LT5kX3NiLT5zX2Fub247Ci0JCWVsc2UKLQkJCWIgPSBkX2hhc2goZGVudHJ5LT5kX3BhcmVudCwgZGVudHJ5LT5kX25hbWUuaGFzaCk7Ci0KLQkJaGxpc3RfYmxfbG9jayhiKTsKLQkJX19obGlzdF9ibF9kZWwoJmRlbnRyeS0+ZF9oYXNoKTsKLQkJZGVudHJ5LT5kX2hhc2gucHByZXYgPSBOVUxMOwotCQlobGlzdF9ibF91bmxvY2soYik7Ci0KKwkJX19kX3NocmluayhkZW50cnkpOwogCQlkZW50cnlfcmN1d2Fsa19iYXJyaWVyKGRlbnRyeSk7CiAJfQogfQpAQCAtNzg0LDYgKzc5NSw3IEBACiAKIC8qKgogICogcHJ1bmVfZGNhY2hlX3NiIC0gc2hyaW5rIHRoZSBkY2FjaGUKKyAqIEBzYjogc3VwZXJibG9jawogICogQG5yX3RvX3NjYW46IG51bWJlciBvZiBlbnRyaWVzIHRvIHRyeSB0byBmcmVlCiAgKgogICogQXR0ZW1wdCB0byBzaHJpbmsgdGhlIHN1cGVyYmxvY2sgZGNhY2hlIExSVSBieSBAbnJfdG9fc2NhbiBlbnRyaWVzLiBUaGlzIGlzCkBAIC04MjgsNDQgKzg0MCwyNCBAQAogc3RhdGljIHZvaWQgc2hyaW5rX2RjYWNoZV9mb3JfdW1vdW50X3N1YnRyZWUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKLQl1bnNpZ25lZCBkZXRhY2hlZCA9IDA7CiAKIAlCVUdfT04oIUlTX1JPT1QoZGVudHJ5KSk7CiAKLQkvKiBkZXRhY2ggdGhpcyByb290IGZyb20gdGhlIHN5c3RlbSAqLwotCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOwotCWRlbnRyeV9scnVfZGVsKGRlbnRyeSk7Ci0JX19kX2Ryb3AoZGVudHJ5KTsKLQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOwotCiAJZm9yICg7OykgewogCQkvKiBkZXNjZW5kIHRvIHRoZSBmaXJzdCBsZWFmIGluIHRoZSBjdXJyZW50IHN1YnRyZWUgKi8KLQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZkZW50cnktPmRfc3ViZGlycykpIHsKLQkJCXN0cnVjdCBkZW50cnkgKmxvb3A7Ci0KLQkJCS8qIHRoaXMgaXMgYSBicmFuY2ggd2l0aCBjaGlsZHJlbiAtIGRldGFjaCBhbGwgb2YgdGhlbQotCQkJICogZnJvbSB0aGUgc3lzdGVtIGluIG9uZSBnbyAqLwotCQkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvb3AsICZkZW50cnktPmRfc3ViZGlycywKLQkJCQkJICAgIGRfdS5kX2NoaWxkKSB7Ci0JCQkJc3Bpbl9sb2NrX25lc3RlZCgmbG9vcC0+ZF9sb2NrLAotCQkJCQkJREVOVFJZX0RfTE9DS19ORVNURUQpOwotCQkJCWRlbnRyeV9scnVfZGVsKGxvb3ApOwotCQkJCV9fZF9kcm9wKGxvb3ApOwotCQkJCXNwaW5fdW5sb2NrKCZsb29wLT5kX2xvY2spOwotCQkJfQotCQkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKLQotCQkJLyogbW92ZSB0byB0aGUgZmlyc3QgY2hpbGQgKi8KKwkJd2hpbGUgKCFsaXN0X2VtcHR5KCZkZW50cnktPmRfc3ViZGlycykpCiAJCQlkZW50cnkgPSBsaXN0X2VudHJ5KGRlbnRyeS0+ZF9zdWJkaXJzLm5leHQsCiAJCQkJCSAgICBzdHJ1Y3QgZGVudHJ5LCBkX3UuZF9jaGlsZCk7Ci0JCX0KIAogCQkvKiBjb25zdW1lIHRoZSBkZW50cmllcyBmcm9tIHRoaXMgbGVhZiB1cCB0aHJvdWdoIGl0cyBwYXJlbnRzCiAJCSAqIHVudGlsIHdlIGZpbmQgb25lIHdpdGggY2hpbGRyZW4gb3IgcnVuIG91dCBhbHRvZ2V0aGVyICovCiAJCWRvIHsKIAkJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAKKwkJCS8qIGRldGFjaCBmcm9tIHRoZSBzeXN0ZW0gKi8KKwkJCWRlbnRyeV9scnVfZGVsKGRlbnRyeSk7CisJCQlfX2Rfc2hyaW5rKGRlbnRyeSk7CisKIAkJCWlmIChkZW50cnktPmRfY291bnQgIT0gMCkgewogCQkJCXByaW50ayhLRVJOX0VSUgogCQkJCSAgICAgICAiQlVHOiBEZW50cnkgJXB7aT0lbHgsbj0lc30iCkBAIC04ODYsMTQgKzg3OCwxMCBAQAogCQkJCWxpc3RfZGVsKCZkZW50cnktPmRfdS5kX2NoaWxkKTsKIAkJCX0gZWxzZSB7CiAJCQkJcGFyZW50ID0gZGVudHJ5LT5kX3BhcmVudDsKLQkJCQlzcGluX2xvY2soJnBhcmVudC0+ZF9sb2NrKTsKIAkJCQlwYXJlbnQtPmRfY291bnQtLTsKIAkJCQlsaXN0X2RlbCgmZGVudHJ5LT5kX3UuZF9jaGlsZCk7Ci0JCQkJc3Bpbl91bmxvY2soJnBhcmVudC0+ZF9sb2NrKTsKIAkJCX0KIAotCQkJZGV0YWNoZWQrKzsKLQogCQkJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJCQlpZiAoaW5vZGUpIHsKIAkJCQlkZW50cnktPmRfaW5vZGUgPSBOVUxMOwpAQCAtOTM4LDkgKzkyNiw3IEBACiAKIAlkZW50cnkgPSBzYi0+c19yb290OwogCXNiLT5zX3Jvb3QgPSBOVUxMOwotCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOwogCWRlbnRyeS0+ZF9jb3VudC0tOwotCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CiAJc2hyaW5rX2RjYWNoZV9mb3JfdW1vdW50X3N1YnRyZWUoZGVudHJ5KTsKIAogCXdoaWxlICghaGxpc3RfYmxfZW1wdHkoJnNiLT5zX2Fub24pKSB7CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9pbm9kZS5jIGIvZnMvZWNyeXB0ZnMvaW5vZGUuYwppbmRleCAzNDBjNjU3Li4xMWY4NTgyIDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9pbm9kZS5jCisrKyBiL2ZzL2VjcnlwdGZzL2lub2RlLmMKQEAgLTY5LDYgKzY5LDcgQEAKIAlpbm9kZS0+aV9pbm8gPSBsb3dlcl9pbm9kZS0+aV9pbm87CiAJaW5vZGUtPmlfdmVyc2lvbisrOwogCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmVjcnlwdGZzX2FvcHM7CisJaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9IGlub2RlLT5pX3NiLT5zX2JkaTsKIAogCWlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQogCQlpbm9kZS0+aV9vcCA9ICZlY3J5cHRmc19zeW1saW5rX2lvcHM7CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9rZXlzdG9yZS5jIGIvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYwppbmRleCBjNDcyNTMzLi4wOGEyYjUyIDEwMDY0NAotLS0gYS9mcy9lY3J5cHRmcy9rZXlzdG9yZS5jCisrKyBiL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMKQEAgLTE4NzEsMTEgKzE4NzEsNiBAQAogCSAqIGp1c3Qgb25lIHdpbGwgYmUgc3VmZmljaWVudCB0byBkZWNyeXB0IHRvIGdldCB0aGUgRkVLLiAqLwogZmluZF9uZXh0X21hdGNoaW5nX2F1dGhfdG9rOgogCWZvdW5kX2F1dGhfdG9rID0gMDsKLQlpZiAoYXV0aF90b2tfa2V5KSB7Ci0JCXVwX3dyaXRlKCYoYXV0aF90b2tfa2V5LT5zZW0pKTsKLQkJa2V5X3B1dChhdXRoX3Rva19rZXkpOwotCQlhdXRoX3Rva19rZXkgPSBOVUxMOwotCX0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGF1dGhfdG9rX2xpc3RfaXRlbSwgJmF1dGhfdG9rX2xpc3QsIGxpc3QpIHsKIAkJY2FuZGlkYXRlX2F1dGhfdG9rID0gJmF1dGhfdG9rX2xpc3RfaXRlbS0+YXV0aF90b2s7CiAJCWlmICh1bmxpa2VseShlY3J5cHRmc192ZXJib3NpdHkgPiAwKSkgewpAQCAtMTkxMiwxNCArMTkwNywyMiBAQAogCQltZW1jcHkoJihjYW5kaWRhdGVfYXV0aF90b2stPnRva2VuLnByaXZhdGVfa2V5KSwKIAkJICAgICAgICYobWF0Y2hpbmdfYXV0aF90b2stPnRva2VuLnByaXZhdGVfa2V5KSwKIAkJICAgICAgIHNpemVvZihzdHJ1Y3QgZWNyeXB0ZnNfcHJpdmF0ZV9rZXkpKTsKKwkJdXBfd3JpdGUoJihhdXRoX3Rva19rZXktPnNlbSkpOworCQlrZXlfcHV0KGF1dGhfdG9rX2tleSk7CiAJCXJjID0gZGVjcnlwdF9wa2lfZW5jcnlwdGVkX3Nlc3Npb25fa2V5KGNhbmRpZGF0ZV9hdXRoX3RvaywKIAkJCQkJCSAgICAgICBjcnlwdF9zdGF0KTsKIAl9IGVsc2UgaWYgKGNhbmRpZGF0ZV9hdXRoX3Rvay0+dG9rZW5fdHlwZSA9PSBFQ1JZUFRGU19QQVNTV09SRCkgewogCQltZW1jcHkoJihjYW5kaWRhdGVfYXV0aF90b2stPnRva2VuLnBhc3N3b3JkKSwKIAkJICAgICAgICYobWF0Y2hpbmdfYXV0aF90b2stPnRva2VuLnBhc3N3b3JkKSwKIAkJICAgICAgIHNpemVvZihzdHJ1Y3QgZWNyeXB0ZnNfcGFzc3dvcmQpKTsKKwkJdXBfd3JpdGUoJihhdXRoX3Rva19rZXktPnNlbSkpOworCQlrZXlfcHV0KGF1dGhfdG9rX2tleSk7CiAJCXJjID0gZGVjcnlwdF9wYXNzcGhyYXNlX2VuY3J5cHRlZF9zZXNzaW9uX2tleSgKIAkJCWNhbmRpZGF0ZV9hdXRoX3RvaywgY3J5cHRfc3RhdCk7CisJfSBlbHNlIHsKKwkJdXBfd3JpdGUoJihhdXRoX3Rva19rZXktPnNlbSkpOworCQlrZXlfcHV0KGF1dGhfdG9rX2tleSk7CisJCXJjID0gLUVJTlZBTDsKIAl9CiAJaWYgKHJjKSB7CiAJCXN0cnVjdCBlY3J5cHRmc19hdXRoX3Rva19saXN0X2l0ZW0gKmF1dGhfdG9rX2xpc3RfaXRlbV90bXA7CkBAIC0xOTU5LDE1ICsxOTYyLDEyIEBACiBvdXRfd2lwZV9saXN0OgogCXdpcGVfYXV0aF90b2tfbGlzdCgmYXV0aF90b2tfbGlzdCk7CiBvdXQ6Ci0JaWYgKGF1dGhfdG9rX2tleSkgewotCQl1cF93cml0ZSgmKGF1dGhfdG9rX2tleS0+c2VtKSk7Ci0JCWtleV9wdXQoYXV0aF90b2tfa2V5KTsKLQl9CiAJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50Ci1wa2lfZW5jcnlwdF9zZXNzaW9uX2tleShzdHJ1Y3QgZWNyeXB0ZnNfYXV0aF90b2sgKmF1dGhfdG9rLAorcGtpX2VuY3J5cHRfc2Vzc2lvbl9rZXkoc3RydWN0IGtleSAqYXV0aF90b2tfa2V5LAorCQkJc3RydWN0IGVjcnlwdGZzX2F1dGhfdG9rICphdXRoX3RvaywKIAkJCXN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LAogCQkJc3RydWN0IGVjcnlwdGZzX2tleV9yZWNvcmQgKmtleV9yZWMpCiB7CkBAIC0xOTgyLDYgKzE5ODIsOCBAQAogCQkJCQkgY3J5cHRfc3RhdC0+Y2lwaGVyLAogCQkJCQkgY3J5cHRfc3RhdC0+a2V5X3NpemUpLAogCQkJCSBjcnlwdF9zdGF0LCAmcGF5bG9hZCwgJnBheWxvYWRfbGVuKTsKKwl1cF93cml0ZSgmKGF1dGhfdG9rX2tleS0+c2VtKSk7CisJa2V5X3B1dChhdXRoX3Rva19rZXkpOwogCWlmIChyYykgewogCQllY3J5cHRmc19wcmludGsoS0VSTl9FUlIsICJFcnJvciBnZW5lcmF0aW5nIHRhZyA2NiBwYWNrZXRcbiIpOwogCQlnb3RvIG91dDsKQEAgLTIwMTEsNiArMjAxMyw4IEBACiAgKiB3cml0ZV90YWdfMV9wYWNrZXQgLSBXcml0ZSBhbiBSRkMyNDQwLWNvbXBhdGlibGUgdGFnIDEgKHB1YmxpYyBrZXkpIHBhY2tldAogICogQGRlc3Q6IEJ1ZmZlciBpbnRvIHdoaWNoIHRvIHdyaXRlIHRoZSBwYWNrZXQKICAqIEByZW1haW5pbmdfYnl0ZXM6IE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHdyaXR0bgorICogQGF1dGhfdG9rX2tleTogVGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuIGtleSB0byB1bmxvY2sgYW5kIHB1dCB3aGVuIGRvbmUgd2l0aAorICogICAgICAgICAgICAgICAgQGF1dGhfdG9rCiAgKiBAYXV0aF90b2s6IFRoZSBhdXRoZW50aWNhdGlvbiB0b2tlbiB1c2VkIGZvciBnZW5lcmF0aW5nIHRoZSB0YWcgMSBwYWNrZXQKICAqIEBjcnlwdF9zdGF0OiBUaGUgY3J5cHRvZ3JhcGhpYyBjb250ZXh0CiAgKiBAa2V5X3JlYzogVGhlIGtleSByZWNvcmQgc3RydWN0IGZvciB0aGUgdGFnIDEgcGFja2V0CkBAIC0yMDIxLDcgKzIwMjUsNyBAQAogICovCiBzdGF0aWMgaW50CiB3cml0ZV90YWdfMV9wYWNrZXQoY2hhciAqZGVzdCwgc2l6ZV90ICpyZW1haW5pbmdfYnl0ZXMsCi0JCSAgIHN0cnVjdCBlY3J5cHRmc19hdXRoX3RvayAqYXV0aF90b2ssCisJCSAgIHN0cnVjdCBrZXkgKmF1dGhfdG9rX2tleSwgc3RydWN0IGVjcnlwdGZzX2F1dGhfdG9rICphdXRoX3RvaywKIAkJICAgc3RydWN0IGVjcnlwdGZzX2NyeXB0X3N0YXQgKmNyeXB0X3N0YXQsCiAJCSAgIHN0cnVjdCBlY3J5cHRmc19rZXlfcmVjb3JkICprZXlfcmVjLCBzaXplX3QgKnBhY2tldF9zaXplKQogewpAQCAtMjA0MiwxMiArMjA0NiwxNSBAQAogCQltZW1jcHkoa2V5X3JlYy0+ZW5jX2tleSwKIAkJICAgICAgIGF1dGhfdG9rLT5zZXNzaW9uX2tleS5lbmNyeXB0ZWRfa2V5LAogCQkgICAgICAgYXV0aF90b2stPnNlc3Npb25fa2V5LmVuY3J5cHRlZF9rZXlfc2l6ZSk7CisJCXVwX3dyaXRlKCYoYXV0aF90b2tfa2V5LT5zZW0pKTsKKwkJa2V5X3B1dChhdXRoX3Rva19rZXkpOwogCQlnb3RvIGVuY3J5cHRlZF9zZXNzaW9uX2tleV9zZXQ7CiAJfQogCWlmIChhdXRoX3Rvay0+c2Vzc2lvbl9rZXkuZW5jcnlwdGVkX2tleV9zaXplID09IDApCiAJCWF1dGhfdG9rLT5zZXNzaW9uX2tleS5lbmNyeXB0ZWRfa2V5X3NpemUgPQogCQkJYXV0aF90b2stPnRva2VuLnByaXZhdGVfa2V5LmtleV9zaXplOwotCXJjID0gcGtpX2VuY3J5cHRfc2Vzc2lvbl9rZXkoYXV0aF90b2ssIGNyeXB0X3N0YXQsIGtleV9yZWMpOworCXJjID0gcGtpX2VuY3J5cHRfc2Vzc2lvbl9rZXkoYXV0aF90b2tfa2V5LCBhdXRoX3RvaywgY3J5cHRfc3RhdCwKKwkJCQkgICAgIGtleV9yZWMpOwogCWlmIChyYykgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBlbmNyeXB0IHNlc3Npb24ga2V5IHZpYSBhIGtleSAiCiAJCSAgICAgICAibW9kdWxlOyByYyA9IFslZF1cbiIsIHJjKTsKQEAgLTI0MjQsNiArMjQzMSw4IEBACiAJCQkJCQkmbWF4LCBhdXRoX3RvaywKIAkJCQkJCWNyeXB0X3N0YXQsIGtleV9yZWMsCiAJCQkJCQkmd3JpdHRlbik7CisJCQl1cF93cml0ZSgmKGF1dGhfdG9rX2tleS0+c2VtKSk7CisJCQlrZXlfcHV0KGF1dGhfdG9rX2tleSk7CiAJCQlpZiAocmMpIHsKIAkJCQllY3J5cHRmc19wcmludGsoS0VSTl9XQVJOSU5HLCAiRXJyb3IgIgogCQkJCQkJIndyaXRpbmcgdGFnIDMgcGFja2V0XG4iKTsKQEAgLTI0NDEsOCArMjQ1MCw4IEBACiAJCQl9CiAJCQkoKmxlbikgKz0gd3JpdHRlbjsKIAkJfSBlbHNlIGlmIChhdXRoX3Rvay0+dG9rZW5fdHlwZSA9PSBFQ1JZUFRGU19QUklWQVRFX0tFWSkgewotCQkJcmMgPSB3cml0ZV90YWdfMV9wYWNrZXQoZGVzdF9iYXNlICsgKCpsZW4pLAotCQkJCQkJJm1heCwgYXV0aF90b2ssCisJCQlyYyA9IHdyaXRlX3RhZ18xX3BhY2tldChkZXN0X2Jhc2UgKyAoKmxlbiksICZtYXgsCisJCQkJCQlhdXRoX3Rva19rZXksIGF1dGhfdG9rLAogCQkJCQkJY3J5cHRfc3RhdCwga2V5X3JlYywgJndyaXR0ZW4pOwogCQkJaWYgKHJjKSB7CiAJCQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fV0FSTklORywgIkVycm9yICIKQEAgLTI0NTEsMTQgKzI0NjAsMTMgQEAKIAkJCX0KIAkJCSgqbGVuKSArPSB3cml0dGVuOwogCQl9IGVsc2UgeworCQkJdXBfd3JpdGUoJihhdXRoX3Rva19rZXktPnNlbSkpOworCQkJa2V5X3B1dChhdXRoX3Rva19rZXkpOwogCQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fV0FSTklORywgIlVuc3VwcG9ydGVkICIKIAkJCQkJImF1dGhlbnRpY2F0aW9uIHRva2VuIHR5cGVcbiIpOwogCQkJcmMgPSAtRUlOVkFMOwogCQkJZ290byBvdXRfZnJlZTsKIAkJfQotCQl1cF93cml0ZSgmKGF1dGhfdG9rX2tleS0+c2VtKSk7Ci0JCWtleV9wdXQoYXV0aF90b2tfa2V5KTsKLQkJYXV0aF90b2tfa2V5ID0gTlVMTDsKIAl9CiAJaWYgKGxpa2VseShtYXggPiAwKSkgewogCQlkZXN0X2Jhc2VbKCpsZW4pXSA9IDB4MDA7CkBAIC0yNDcxLDExICsyNDc5LDYgQEAKIG91dDoKIAlpZiAocmMpCiAJCSgqbGVuKSA9IDA7Ci0JaWYgKGF1dGhfdG9rX2tleSkgewotCQl1cF93cml0ZSgmKGF1dGhfdG9rX2tleS0+c2VtKSk7Ci0JCWtleV9wdXQoYXV0aF90b2tfa2V5KTsKLQl9Ci0KIAltdXRleF91bmxvY2soJmNyeXB0X3N0YXQtPmtleXNpZ19saXN0X211dGV4KTsKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9mcy9leHQyL2FjbC5jIGIvZnMvZXh0Mi9hY2wuYwppbmRleCA1MmMwNTM3Li4zNWQ2YTNjIDEwMDY0NAotLS0gYS9mcy9leHQyL2FjbC5jCisrKyBiL2ZzL2V4dDIvYWNsLmMKQEAgLTE5NCwxMiArMTk0LDEwIEBACiAJCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgogCQkJbmFtZV9pbmRleCA9IEVYVDJfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0FDQ0VTUzsKIAkJCWlmIChhY2wpIHsKLQkJCQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7Ci0JCQkJZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZtb2RlKTsKKwkJCQllcnJvciA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJmlub2RlLT5pX21vZGUpOwogCQkJCWlmIChlcnJvciA8IDApCiAJCQkJCXJldHVybiBlcnJvcjsKIAkJCQllbHNlIHsKLQkJCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCQkJCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKIAkJCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJCQkJCWlmIChlcnJvciA9PSAwKQpAQCAtMjUzLDE2ICsyNTEsMTQgQEAKIAkJCWlub2RlLT5pX21vZGUgJj0gfmN1cnJlbnRfdW1hc2soKTsKIAl9CiAJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBQT1NJWF9BQ0wpICYmIGFjbCkgewotCQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CiAJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CiAJCQllcnJvciA9IGV4dDJfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgYWNsKTsKIAkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGNsZWFudXA7CiAJCX0KLQkJZXJyb3IgPSBwb3NpeF9hY2xfY3JlYXRlKCZhY2wsIEdGUF9LRVJORUwsICZtb2RlKTsKKwkJZXJyb3IgPSBwb3NpeF9hY2xfY3JlYXRlKCZhY2wsIEdGUF9LRVJORUwsICZpbm9kZS0+aV9tb2RlKTsKIAkJaWYgKGVycm9yIDwgMCkKIAkJCXJldHVybiBlcnJvcjsKLQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCWlmIChlcnJvciA+IDApIHsKIAkJCS8qIFRoaXMgaXMgYW4gZXh0ZW5kZWQgQUNMICovCiAJCQllcnJvciA9IGV4dDJfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBhY2wpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9hY2wuaCBiL2ZzL2V4dDIvYWNsLmgKaW5kZXggNWMwYTZhNC4uNTAzYmZiMCAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9hY2wuaAorKysgYi9mcy9leHQyL2FjbC5oCkBAIC02MSw3ICs2MSw2IEBACiAjZWxzZQogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjZGVmaW5lIGV4dDJfZ2V0X2FjbAlOVUxMCi0jZGVmaW5lIGV4dDJfZ2V0X2FjbAlOVUxMCiAjZGVmaW5lIGV4dDJfc2V0X2FjbAlOVUxMCiAKIHN0YXRpYyBpbmxpbmUgaW50CmRpZmYgLS1naXQgYS9mcy9leHQzL2FjbC5jIGIvZnMvZXh0My9hY2wuYwppbmRleCA2YzI5YmYwLi4zMDkxZjYyIDEwMDY0NAotLS0gYS9mcy9leHQzL2FjbC5jCisrKyBiL2ZzL2V4dDMvYWNsLmMKQEAgLTE5OSwxMiArMTk5LDEwIEBACiAJCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgogCQkJbmFtZV9pbmRleCA9IEVYVDNfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0FDQ0VTUzsKIAkJCWlmIChhY2wpIHsKLQkJCQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7Ci0JCQkJZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZtb2RlKTsKKwkJCQllcnJvciA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJmlub2RlLT5pX21vZGUpOwogCQkJCWlmIChlcnJvciA8IDApCiAJCQkJCXJldHVybiBlcnJvcjsKIAkJCQllbHNlIHsKLQkJCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCQkJCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKIAkJCQkJZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwogCQkJCQlpZiAoZXJyb3IgPT0gMCkKQEAgLTI2MSwxOSArMjU5LDE2IEBACiAJCQlpbm9kZS0+aV9tb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7CiAJfQogCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgUE9TSVhfQUNMKSAmJiBhY2wpIHsKLQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwotCiAJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CiAJCQllcnJvciA9IGV4dDNfc2V0X2FjbChoYW5kbGUsIGlub2RlLAogCQkJCQkgICAgIEFDTF9UWVBFX0RFRkFVTFQsIGFjbCk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBjbGVhbnVwOwogCQl9Ci0JCWVycm9yID0gcG9zaXhfYWNsX2NyZWF0ZSgmYWNsLCBHRlBfTk9GUywgJm1vZGUpOworCQllcnJvciA9IHBvc2l4X2FjbF9jcmVhdGUoJmFjbCwgR0ZQX05PRlMsICZpbm9kZS0+aV9tb2RlKTsKIAkJaWYgKGVycm9yIDwgMCkKIAkJCXJldHVybiBlcnJvcjsKIAotCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJaWYgKGVycm9yID4gMCkgewogCQkJLyogVGhpcyBpcyBhbiBleHRlbmRlZCBBQ0wgKi8KIAkJCWVycm9yID0gZXh0M19zZXRfYWNsKGhhbmRsZSwgaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvTWFrZWZpbGUgYi9mcy9leHQ0L01ha2VmaWxlCmluZGV4IDA0MTA5NDYuLjU2ZmQ4Zjg2IDEwMDY0NAotLS0gYS9mcy9leHQ0L01ha2VmaWxlCisrKyBiL2ZzL2V4dDQvTWFrZWZpbGUKQEAgLTcsNyArNyw3IEBACiBleHQ0LXkJOj0gYmFsbG9jLm8gYml0bWFwLm8gZGlyLm8gZmlsZS5vIGZzeW5jLm8gaWFsbG9jLm8gaW5vZGUubyBwYWdlLWlvLm8gXAogCQlpb2N0bC5vIG5hbWVpLm8gc3VwZXIubyBzeW1saW5rLm8gaGFzaC5vIHJlc2l6ZS5vIGV4dGVudHMubyBcCiAJCWV4dDRfamJkMi5vIG1pZ3JhdGUubyBtYmFsbG9jLm8gYmxvY2tfdmFsaWRpdHkubyBtb3ZlX2V4dGVudC5vIFwKLQkJbW1wLm8KKwkJbW1wLm8gaW5kaXJlY3QubwogCiBleHQ0LSQoQ09ORklHX0VYVDRfRlNfWEFUVFIpCQkrPSB4YXR0ci5vIHhhdHRyX3VzZXIubyB4YXR0cl90cnVzdGVkLm8KIGV4dDQtJChDT05GSUdfRVhUNF9GU19QT1NJWF9BQ0wpCSs9IGFjbC5vCmRpZmYgLS1naXQgYS9mcy9leHQ0L2FjbC5jIGIvZnMvZXh0NC9hY2wuYwppbmRleCBkY2EyZDFkLi5hNWMyOWJiIDEwMDY0NAotLS0gYS9mcy9leHQ0L2FjbC5jCisrKyBiL2ZzL2V4dDQvYWNsLmMKQEAgLTE5OCwxMiArMTk4LDEwIEBACiAJY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6CiAJCW5hbWVfaW5kZXggPSBFWFQ0X1hBVFRSX0lOREVYX1BPU0lYX0FDTF9BQ0NFU1M7CiAJCWlmIChhY2wpIHsKLQkJCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKLQkJCWVycm9yID0gcG9zaXhfYWNsX2VxdWl2X21vZGUoYWNsLCAmbW9kZSk7CisJCQllcnJvciA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJmlub2RlLT5pX21vZGUpOwogCQkJaWYgKGVycm9yIDwgMCkKIAkJCQlyZXR1cm4gZXJyb3I7CiAJCQllbHNlIHsKLQkJCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJCQlpbm9kZS0+aV9jdGltZSA9IGV4dDRfY3VycmVudF90aW1lKGlub2RlKTsKIAkJCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CiAJCQkJaWYgKGVycm9yID09IDApCkBAIC0yNTksMTkgKzI1NywxNiBAQAogCQkJaW5vZGUtPmlfbW9kZSAmPSB+Y3VycmVudF91bWFzaygpOwogCX0KIAlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIFBPU0lYX0FDTCkgJiYgYWNsKSB7Ci0JCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKLQogCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewogCQkJZXJyb3IgPSBleHQ0X3NldF9hY2woaGFuZGxlLCBpbm9kZSwKIAkJCQkJICAgICBBQ0xfVFlQRV9ERUZBVUxULCBhY2wpOwogCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gY2xlYW51cDsKIAkJfQotCQllcnJvciA9IHBvc2l4X2FjbF9jcmVhdGUoJmFjbCwgR0ZQX05PRlMsICZtb2RlKTsKKwkJZXJyb3IgPSBwb3NpeF9hY2xfY3JlYXRlKCZhY2wsIEdGUF9OT0ZTLCAmaW5vZGUtPmlfbW9kZSk7CiAJCWlmIChlcnJvciA8IDApCiAJCQlyZXR1cm4gZXJyb3I7CiAKLQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCWlmIChlcnJvciA+IDApIHsKIAkJCS8qIFRoaXMgaXMgYW4gZXh0ZW5kZWQgQUNMICovCiAJCQllcnJvciA9IGV4dDRfc2V0X2FjbChoYW5kbGUsIGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGFjbCk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2JhbGxvYy5jIGIvZnMvZXh0NC9iYWxsb2MuYwppbmRleCAyNjRmNjk0Li5mODIyNGFkIDEwMDY0NAotLS0gYS9mcy9leHQ0L2JhbGxvYy5jCisrKyBiL2ZzL2V4dDQvYmFsbG9jLmMKQEAgLTYyMCwzICs2MjAsNTEgQEAKIAogfQogCisvKioKKyAqCWV4dDRfaW5vZGVfdG9fZ29hbF9ibG9jayAtIHJldHVybiBhIGhpbnQgZm9yIGJsb2NrIGFsbG9jYXRpb24KKyAqCUBpbm9kZTogaW5vZGUgZm9yIGJsb2NrIGFsbG9jYXRpb24KKyAqCisgKglSZXR1cm4gdGhlIGlkZWFsIGxvY2F0aW9uIHRvIHN0YXJ0IGFsbG9jYXRpbmcgYmxvY2tzIGZvciBhCisgKgluZXdseSBjcmVhdGVkIGlub2RlLgorICovCitleHQ0X2ZzYmxrX3QgZXh0NF9pbm9kZV90b19nb2FsX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOworCWV4dDRfZ3JvdXBfdCBibG9ja19ncm91cDsKKwlleHQ0X2dycGJsa190IGNvbG91cjsKKwlpbnQgZmxleF9zaXplID0gZXh0NF9mbGV4X2JnX3NpemUoRVhUNF9TQihpbm9kZS0+aV9zYikpOworCWV4dDRfZnNibGtfdCBiZ19zdGFydDsKKwlleHQ0X2ZzYmxrX3QgbGFzdF9ibG9jazsKKworCWJsb2NrX2dyb3VwID0gZWktPmlfYmxvY2tfZ3JvdXA7CisJaWYgKGZsZXhfc2l6ZSA+PSBFWFQ0X0ZMRVhfU0laRV9ESVJfQUxMT0NfU0NIRU1FKSB7CisJCS8qCisJCSAqIElmIHRoZXJlIGFyZSBhdCBsZWFzdCBFWFQ0X0ZMRVhfU0laRV9ESVJfQUxMT0NfU0NIRU1FCisJCSAqIGJsb2NrIGdyb3VwcyBwZXIgZmxleGdyb3VwLCByZXNlcnZlIHRoZSBmaXJzdCBibG9jaworCQkgKiBncm91cCBmb3IgZGlyZWN0b3JpZXMgYW5kIHNwZWNpYWwgZmlsZXMuICBSZWd1bGFyCisJCSAqIGZpbGVzIHdpbGwgc3RhcnQgYXQgdGhlIHNlY29uZCBibG9jayBncm91cC4gIFRoaXMKKwkJICogdGVuZHMgdG8gc3BlZWQgdXAgZGlyZWN0b3J5IGFjY2VzcyBhbmQgaW1wcm92ZXMKKwkJICogZnNjayB0aW1lcy4KKwkJICovCisJCWJsb2NrX2dyb3VwICY9IH4oZmxleF9zaXplLTEpOworCQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKKwkJCWJsb2NrX2dyb3VwKys7CisJfQorCWJnX3N0YXJ0ID0gZXh0NF9ncm91cF9maXJzdF9ibG9ja19ubyhpbm9kZS0+aV9zYiwgYmxvY2tfZ3JvdXApOworCWxhc3RfYmxvY2sgPSBleHQ0X2Jsb2Nrc19jb3VudChFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19lcykgLSAxOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgZG9pbmcgZGVsYXllZCBhbGxvY2F0aW9uLCB3ZSBkb24ndCBuZWVkIHRha2UKKwkgKiBjb2xvdXIgaW50byBhY2NvdW50LgorCSAqLworCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgREVMQUxMT0MpKQorCQlyZXR1cm4gYmdfc3RhcnQ7CisKKwlpZiAoYmdfc3RhcnQgKyBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpIDw9IGxhc3RfYmxvY2spCisJCWNvbG91ciA9IChjdXJyZW50LT5waWQgJSAxNikgKgorCQkJKEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChpbm9kZS0+aV9zYikgLyAxNik7CisJZWxzZQorCQljb2xvdXIgPSAoY3VycmVudC0+cGlkICUgMTYpICogKChsYXN0X2Jsb2NrIC0gYmdfc3RhcnQpIC8gMTYpOworCXJldHVybiBiZ19zdGFydCArIGNvbG91cjsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9ibG9ja192YWxpZGl0eS5jIGIvZnMvZXh0NC9ibG9ja192YWxpZGl0eS5jCmluZGV4IGZhYzkwZjMuLjhlZmIyZjAgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvYmxvY2tfdmFsaWRpdHkuYworKysgYi9mcy9leHQ0L2Jsb2NrX3ZhbGlkaXR5LmMKQEAgLTI0NiwzICsyNDYsMjQgQEAKIAlyZXR1cm4gMTsKIH0KIAoraW50IGV4dDRfY2hlY2tfYmxvY2tyZWYoY29uc3QgY2hhciAqZnVuY3Rpb24sIHVuc2lnbmVkIGludCBsaW5lLAorCQkJc3RydWN0IGlub2RlICppbm9kZSwgX19sZTMyICpwLCB1bnNpZ25lZCBpbnQgbWF4KQoreworCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplcyA9IEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2VzOworCV9fbGUzMiAqYnJlZiA9IHA7CisJdW5zaWduZWQgaW50IGJsazsKKworCXdoaWxlIChicmVmIDwgcCttYXgpIHsKKwkJYmxrID0gbGUzMl90b19jcHUoKmJyZWYrKyk7CisJCWlmIChibGsgJiYKKwkJICAgIHVubGlrZWx5KCFleHQ0X2RhdGFfYmxvY2tfdmFsaWQoRVhUNF9TQihpbm9kZS0+aV9zYiksCisJCQkJCQkgICAgYmxrLCAxKSkpIHsKKwkJCWVzLT5zX2xhc3RfZXJyb3JfYmxvY2sgPSBjcHVfdG9fbGU2NChibGspOworCQkJZXh0NF9lcnJvcl9pbm9kZShpbm9kZSwgZnVuY3Rpb24sIGxpbmUsIGJsaywKKwkJCQkJICJpbnZhbGlkIGJsb2NrIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0LmggYi9mcy9leHQ0L2V4dDQuaAppbmRleCBmYTQ0ZGY4Li5lNzE3ZGZkIDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDQuaAorKysgYi9mcy9leHQ0L2V4dDQuaApAQCAtNTI2LDYgKzUyNiw3IEBACiAjZGVmaW5lIEVYVDRfRlJFRV9CTE9DS1NfTUVUQURBVEEJMHgwMDAxCiAjZGVmaW5lIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUCQkweDAwMDIKICNkZWZpbmUgRVhUNF9GUkVFX0JMT0NLU19WQUxJREFURUQJMHgwMDA0CisjZGVmaW5lIEVYVDRfRlJFRV9CTE9DS1NfTk9fUVVPVF9VUERBVEUJMHgwMDA4CiAKIC8qCiAgKiBpb2N0bCBjb21tYW5kcwpAQCAtOTM5LDYgKzk0MCw4IEBACiAjZGVmaW5lIGV4dDRfZmluZF9uZXh0X3plcm9fYml0CQlmaW5kX25leHRfemVyb19iaXRfbGUKICNkZWZpbmUgZXh0NF9maW5kX25leHRfYml0CQlmaW5kX25leHRfYml0X2xlCiAKK2V4dGVybiB2b2lkIGV4dDRfc2V0X2JpdHModm9pZCAqYm0sIGludCBjdXIsIGludCBsZW4pOworCiAvKgogICogTWF4aW1hbCBtb3VudCBjb3VudHMgYmV0d2VlbiB0d28gZmlsZXN5c3RlbSBjaGVja3MKICAqLwpAQCAtMTEyNiw3ICsxMTI5LDggQEAKIAlzdHJ1Y3Qgam91cm5hbF9zICpzX2pvdXJuYWw7CiAJc3RydWN0IGxpc3RfaGVhZCBzX29ycGhhbjsKIAlzdHJ1Y3QgbXV0ZXggc19vcnBoYW5fbG9jazsKLQlzdHJ1Y3QgbXV0ZXggc19yZXNpemVfbG9jazsKKwl1bnNpZ25lZCBsb25nIHNfcmVzaXplX2ZsYWdzOwkJLyogRmxhZ3MgaW5kaWNhdGluZyBpZiB0aGVyZQorCQkJCQkJICAgaXMgYSByZXNpemVyICovCiAJdW5zaWduZWQgbG9uZyBzX2NvbW1pdF9pbnRlcnZhbDsKIAl1MzIgc19tYXhfYmF0Y2hfdGltZTsKIAl1MzIgc19taW5fYmF0Y2hfdGltZTsKQEAgLTEyMTQsNiArMTIxOCw5IEBACiAKIAkvKiBLZXJuZWwgdGhyZWFkIGZvciBtdWx0aXBsZSBtb3VudCBwcm90ZWN0aW9uICovCiAJc3RydWN0IHRhc2tfc3RydWN0ICpzX21tcF90c2s7CisKKwkvKiByZWNvcmQgdGhlIGxhc3QgbWlubGVuIHdoZW4gRklUUklNIGlzIGNhbGxlZC4gKi8KKwlhdG9taWNfdCBzX2xhc3RfdHJpbV9taW5ibGtzOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZXh0NF9zYl9pbmZvICpFWFQ0X1NCKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCkBAIC0xNzQzLDYgKzE3NTAsNyBAQAogCQkJCSAgICAgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpkZXNjKTsKICNkZWZpbmUgZXh0NF9mcmVlX2Jsb2Nrc19hZnRlcl9pbml0KHNiLCBncm91cCwgZGVzYykJCQlcCiAJCWV4dDRfaW5pdF9ibG9ja19iaXRtYXAoc2IsIE5VTEwsIGdyb3VwLCBkZXNjKQorZXh0NF9mc2Jsa190IGV4dDRfaW5vZGVfdG9fZ29hbF9ibG9jayhzdHJ1Y3QgaW5vZGUgKik7CiAKIC8qIGRpci5jICovCiBleHRlcm4gaW50IF9fZXh0NF9jaGVja19kaXJfZW50cnkoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBpbm9kZSAqLApAQCAtMTc5Myw3ICsxODAxLDcgQEAKIAkJCSAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgaW50IGZsYWdzKTsKIGV4dGVybiBpbnQgZXh0NF9tYl9hZGRfZ3JvdXBpbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCWV4dDRfZ3JvdXBfdCBpLCBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpkZXNjKTsKLWV4dGVybiB2b2lkIGV4dDRfYWRkX2dyb3VwYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCitleHRlcm4gaW50IGV4dDRfZ3JvdXBfYWRkX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJCWV4dDRfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCk7CiBleHRlcm4gaW50IGV4dDRfdHJpbV9mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGZzdHJpbV9yYW5nZSAqKTsKIApAQCAtMTgzNCw2ICsxODQyLDE3IEBACiBleHRlcm4gcXNpemVfdCAqZXh0NF9nZXRfcmVzZXJ2ZWRfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSk7CiBleHRlcm4gdm9pZCBleHQ0X2RhX3VwZGF0ZV9yZXNlcnZlX3NwYWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCWludCB1c2VkLCBpbnQgcXVvdGFfY2xhaW0pOworCisvKiBpbmRpcmVjdC5jICovCitleHRlcm4gaW50IGV4dDRfaW5kX21hcF9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzICptYXAsIGludCBmbGFncyk7CitleHRlcm4gc3NpemVfdCBleHQ0X2luZF9kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsCisJCQkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsCisJCQkJdW5zaWduZWQgbG9uZyBucl9zZWdzKTsKK2V4dGVybiBpbnQgZXh0NF9pbmRfY2FsY19tZXRhZGF0YV9hbW91bnQoc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgbGJsb2NrKTsKK2V4dGVybiBpbnQgZXh0NF9pbmRfdHJhbnNfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBucmJsb2NrcywgaW50IGNodW5rKTsKK2V4dGVybiB2b2lkIGV4dDRfaW5kX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCiAvKiBpb2N0bC5jICovCiBleHRlcm4gbG9uZyBleHQ0X2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gbG9uZyBleHQ0X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwpAQCAtMTg1NSw2ICsxODc0LDkgQEAKIAkJCQlleHQ0X2ZzYmxrX3Qgbl9ibG9ja3NfY291bnQpOwogCiAvKiBzdXBlci5jICovCitleHRlcm4gdm9pZCAqZXh0NF9rdm1hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpOworZXh0ZXJuIHZvaWQgKmV4dDRfa3Z6YWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKTsKK2V4dGVybiB2b2lkIGV4dDRfa3ZmcmVlKHZvaWQgKnB0cik7CiBleHRlcm4gdm9pZCBfX2V4dDRfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LAogCQkJIGNvbnN0IGNoYXIgKiwgLi4uKQogCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgNCwgNSkpKTsKQEAgLTIwNjcsMTEgKzIwODksMTkgQEAKIAkJCQkJICogNSBmcmVlIDgtYmxvY2sgcmVnaW9ucy4gKi8KIH07CiAKLSNkZWZpbmUgRVhUNF9HUk9VUF9JTkZPX05FRURfSU5JVF9CSVQJMAorI2RlZmluZSBFWFQ0X0dST1VQX0lORk9fTkVFRF9JTklUX0JJVAkJMAorI2RlZmluZSBFWFQ0X0dST1VQX0lORk9fV0FTX1RSSU1NRURfQklUCQkxCiAKICNkZWZpbmUgRVhUNF9NQl9HUlBfTkVFRF9JTklUKGdycCkJXAogCSh0ZXN0X2JpdChFWFQ0X0dST1VQX0lORk9fTkVFRF9JTklUX0JJVCwgJigoZ3JwKS0+YmJfc3RhdGUpKSkKIAorI2RlZmluZSBFWFQ0X01CX0dSUF9XQVNfVFJJTU1FRChncnApCVwKKwkodGVzdF9iaXQoRVhUNF9HUk9VUF9JTkZPX1dBU19UUklNTUVEX0JJVCwgJigoZ3JwKS0+YmJfc3RhdGUpKSkKKyNkZWZpbmUgRVhUNF9NQl9HUlBfU0VUX1RSSU1NRUQoZ3JwKQlcCisJKHNldF9iaXQoRVhUNF9HUk9VUF9JTkZPX1dBU19UUklNTUVEX0JJVCwgJigoZ3JwKS0+YmJfc3RhdGUpKSkKKyNkZWZpbmUgRVhUNF9NQl9HUlBfQ0xFQVJfVFJJTU1FRChncnApCVwKKwkoY2xlYXJfYml0KEVYVDRfR1JPVVBfSU5GT19XQVNfVFJJTU1FRF9CSVQsICYoKGdycCktPmJiX3N0YXRlKSkpCisKICNkZWZpbmUgRVhUNF9NQVhfQ09OVEVOVElPTgkJOAogI2RlZmluZSBFWFQ0X0NPTlRFTlRJT05fVEhSRVNIT0xECTIKIApAQCAtMjEyMyw2ICsyMTUzLDE5IEBACiB9CiAKIC8qCisgKiBCbG9jayB2YWxpZGl0eSBjaGVja2luZworICovCisjZGVmaW5lIGV4dDRfY2hlY2tfaW5kaXJlY3RfYmxvY2tyZWYoaW5vZGUsIGJoKQkJCQlcCisJZXh0NF9jaGVja19ibG9ja3JlZihfX2Z1bmNfXywgX19MSU5FX18sIGlub2RlLAkJCVwKKwkJCSAgICAoX19sZTMyICopKGJoKS0+Yl9kYXRhLAkJCVwKKwkJCSAgICBFWFQ0X0FERFJfUEVSX0JMT0NLKChpbm9kZSktPmlfc2IpKQorCisjZGVmaW5lIGV4dDRfaW5kX2NoZWNrX2lub2RlKGlub2RlKQkJCQkJXAorCWV4dDRfY2hlY2tfYmxvY2tyZWYoX19mdW5jX18sIF9fTElORV9fLCBpbm9kZSwJCQlcCisJCQkgICAgRVhUNF9JKGlub2RlKS0+aV9kYXRhLAkJCVwKKwkJCSAgICBFWFQ0X05ESVJfQkxPQ0tTKQorCisvKgogICogSW5vZGVzIGFuZCBmaWxlcyBvcGVyYXRpb25zCiAgKi8KIApAQCAtMjE1MSw2ICsyMTk0LDggQEAKIGV4dGVybiBpbnQgZXh0NF9kYXRhX2Jsb2NrX3ZhbGlkKHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSwKIAkJCQkgZXh0NF9mc2Jsa190IHN0YXJ0X2JsaywKIAkJCQkgdW5zaWduZWQgaW50IGNvdW50KTsKK2V4dGVybiBpbnQgZXh0NF9jaGVja19ibG9ja3JlZihjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwKKwkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKiwgX19sZTMyICosIHVuc2lnbmVkIGludCk7CiAKIC8qIGV4dGVudHMuYyAqLwogZXh0ZXJuIGludCBleHQ0X2V4dF90cmVlX2luaXQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICopOwpAQCAtMjIzMCw2ICsyMjc1LDEwIEBACiBleHRlcm4gd2FpdF9xdWV1ZV9oZWFkX3QgZXh0NF9faW9lbmRfd3FbRVhUNF9XUV9IQVNIX1NaXTsKIGV4dGVybiBzdHJ1Y3QgbXV0ZXggZXh0NF9fYWlvX211dGV4W0VYVDRfV1FfSEFTSF9TWl07CiAKKyNkZWZpbmUgRVhUNF9SRVNJWklORwkwCitleHRlcm4gaW50IGV4dDRfcmVzaXplX2JlZ2luKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworZXh0ZXJuIHZvaWQgZXh0NF9yZXNpemVfZW5kKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYJLyogX0VYVDRfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHRlbnRzLmMgYi9mcy9leHQ0L2V4dGVudHMuYwppbmRleCBmODE1Y2M4Li41N2NmNTY4IDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dGVudHMuYworKysgYi9mcy9leHQ0L2V4dGVudHMuYwpAQCAtMTE0LDEyICsxMTQsNiBAQAogCQkJICAgICAgc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgsCiAJCQkgICAgICBleHQ0X2xibGtfdCBibG9jaykKIHsKLQlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7Ci0JZXh0NF9mc2Jsa190IGJnX3N0YXJ0OwotCWV4dDRfZnNibGtfdCBsYXN0X2Jsb2NrOwotCWV4dDRfZ3JwYmxrX3QgY29sb3VyOwotCWV4dDRfZ3JvdXBfdCBibG9ja19ncm91cDsKLQlpbnQgZmxleF9zaXplID0gZXh0NF9mbGV4X2JnX3NpemUoRVhUNF9TQihpbm9kZS0+aV9zYikpOwogCWludCBkZXB0aDsKIAogCWlmIChwYXRoKSB7CkBAIC0xNjEsMzYgKzE1NSw3IEBACiAJfQogCiAJLyogT0suIHVzZSBpbm9kZSdzIGdyb3VwICovCi0JYmxvY2tfZ3JvdXAgPSBlaS0+aV9ibG9ja19ncm91cDsKLQlpZiAoZmxleF9zaXplID49IEVYVDRfRkxFWF9TSVpFX0RJUl9BTExPQ19TQ0hFTUUpIHsKLQkJLyoKLQkJICogSWYgdGhlcmUgYXJlIGF0IGxlYXN0IEVYVDRfRkxFWF9TSVpFX0RJUl9BTExPQ19TQ0hFTUUKLQkJICogYmxvY2sgZ3JvdXBzIHBlciBmbGV4Z3JvdXAsIHJlc2VydmUgdGhlIGZpcnN0IGJsb2NrCi0JCSAqIGdyb3VwIGZvciBkaXJlY3RvcmllcyBhbmQgc3BlY2lhbCBmaWxlcy4gIFJlZ3VsYXIKLQkJICogZmlsZXMgd2lsbCBzdGFydCBhdCB0aGUgc2Vjb25kIGJsb2NrIGdyb3VwLiAgVGhpcwotCQkgKiB0ZW5kcyB0byBzcGVlZCB1cCBkaXJlY3RvcnkgYWNjZXNzIGFuZCBpbXByb3ZlcwotCQkgKiBmc2NrIHRpbWVzLgotCQkgKi8KLQkJYmxvY2tfZ3JvdXAgJj0gfihmbGV4X3NpemUtMSk7Ci0JCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQotCQkJYmxvY2tfZ3JvdXArKzsKLQl9Ci0JYmdfc3RhcnQgPSBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKGlub2RlLT5pX3NiLCBibG9ja19ncm91cCk7Ci0JbGFzdF9ibG9jayA9IGV4dDRfYmxvY2tzX2NvdW50KEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2VzKSAtIDE7Ci0KLQkvKgotCSAqIElmIHdlIGFyZSBkb2luZyBkZWxheWVkIGFsbG9jYXRpb24sIHdlIGRvbid0IG5lZWQgdGFrZQotCSAqIGNvbG91ciBpbnRvIGFjY291bnQuCi0JICovCi0JaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBERUxBTExPQykpCi0JCXJldHVybiBiZ19zdGFydDsKLQotCWlmIChiZ19zdGFydCArIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChpbm9kZS0+aV9zYikgPD0gbGFzdF9ibG9jaykKLQkJY29sb3VyID0gKGN1cnJlbnQtPnBpZCAlIDE2KSAqCi0JCQkoRVhUNF9CTE9DS1NfUEVSX0dST1VQKGlub2RlLT5pX3NiKSAvIDE2KTsKLQllbHNlCi0JCWNvbG91ciA9IChjdXJyZW50LT5waWQgJSAxNikgKiAoKGxhc3RfYmxvY2sgLSBiZ19zdGFydCkgLyAxNik7Ci0JcmV0dXJuIGJnX3N0YXJ0ICsgY29sb3VyICsgYmxvY2s7CisJcmV0dXJuIGV4dDRfaW5vZGVfdG9fZ29hbF9ibG9jayhpbm9kZSk7CiB9CiAKIC8qCkBAIC03NzYsNiArNzQxLDE2IEBACiAJCQkJIGxvZ2ljYWwsIGxlMzJfdG9fY3B1KGN1cnAtPnBfaWR4LT5laV9ibG9jaykpOwogCQlyZXR1cm4gLUVJTzsKIAl9CisKKwlpZiAodW5saWtlbHkobGUxNl90b19jcHUoY3VycC0+cF9oZHItPmVoX2VudHJpZXMpCisJCQkgICAgID49IGxlMTZfdG9fY3B1KGN1cnAtPnBfaGRyLT5laF9tYXgpKSkgeworCQlFWFQ0X0VSUk9SX0lOT0RFKGlub2RlLAorCQkJCSAiZWhfZW50cmllcyAlZCA+PSBlaF9tYXggJWQhIiwKKwkJCQkgbGUxNl90b19jcHUoY3VycC0+cF9oZHItPmVoX2VudHJpZXMpLAorCQkJCSBsZTE2X3RvX2NwdShjdXJwLT5wX2hkci0+ZWhfbWF4KSk7CisJCXJldHVybiAtRUlPOworCX0KKwogCWxlbiA9IEVYVF9NQVhfSU5ERVgoY3VycC0+cF9oZHIpIC0gY3VycC0+cF9pZHg7CiAJaWYgKGxvZ2ljYWwgPiBsZTMyX3RvX2NwdShjdXJwLT5wX2lkeC0+ZWlfYmxvY2spKSB7CiAJCS8qIGluc2VydCBhZnRlciAqLwpAQCAtODA1LDEzICs3ODAsNiBAQAogCWV4dDRfaWR4X3N0b3JlX3BibG9jayhpeCwgcHRyKTsKIAlsZTE2X2FkZF9jcHUoJmN1cnAtPnBfaGRyLT5laF9lbnRyaWVzLCAxKTsKIAotCWlmICh1bmxpa2VseShsZTE2X3RvX2NwdShjdXJwLT5wX2hkci0+ZWhfZW50cmllcykKLQkJCSAgICAgPiBsZTE2X3RvX2NwdShjdXJwLT5wX2hkci0+ZWhfbWF4KSkpIHsKLQkJRVhUNF9FUlJPUl9JTk9ERShpbm9kZSwKLQkJCQkgImxvZ2ljYWwgJWQgPT0gZWlfYmxvY2sgJWQhIiwKLQkJCQkgbG9naWNhbCwgbGUzMl90b19jcHUoY3VycC0+cF9pZHgtPmVpX2Jsb2NrKSk7Ci0JCXJldHVybiAtRUlPOwotCX0KIAlpZiAodW5saWtlbHkoaXggPiBFWFRfTEFTVF9JTkRFWChjdXJwLT5wX2hkcikpKSB7CiAJCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsICJpeCA+IEVYVF9MQVNUX0lOREVYISIpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTE0NDYsOCArMTQxNCw3IEBACiAgKiBleHQ0X2V4dF9uZXh0X2xlYWZfYmxvY2s6CiAgKiByZXR1cm5zIGZpcnN0IGFsbG9jYXRlZCBibG9jayBmcm9tIG5leHQgbGVhZiBvciBFWFRfTUFYX0JMT0NLUwogICovCi1zdGF0aWMgZXh0NF9sYmxrX3QgZXh0NF9leHRfbmV4dF9sZWFmX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJCXN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQorc3RhdGljIGV4dDRfbGJsa190IGV4dDRfZXh0X25leHRfbGVhZl9ibG9jayhzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCkKIHsKIAlpbnQgZGVwdGg7CiAKQEAgLTE3NTcsNyArMTcyNCw2IEBACiAJCWdvdG8gbWVyZ2U7CiAJfQogCi1yZXBlYXQ6CiAJZGVwdGggPSBleHRfZGVwdGgoaW5vZGUpOwogCWVoID0gcGF0aFtkZXB0aF0ucF9oZHI7CiAJaWYgKGxlMTZfdG9fY3B1KGVoLT5laF9lbnRyaWVzKSA8IGxlMTZfdG9fY3B1KGVoLT5laF9tYXgpKQpAQCAtMTc2NSw5ICsxNzMxLDEwIEBACiAKIAkvKiBwcm9iYWJseSBuZXh0IGxlYWYgaGFzIHNwYWNlIGZvciB1cz8gKi8KIAlmZXggPSBFWFRfTEFTVF9FWFRFTlQoZWgpOwotCW5leHQgPSBleHQ0X2V4dF9uZXh0X2xlYWZfYmxvY2soaW5vZGUsIHBhdGgpOwotCWlmIChsZTMyX3RvX2NwdShuZXdleHQtPmVlX2Jsb2NrKSA+IGxlMzJfdG9fY3B1KGZleC0+ZWVfYmxvY2spCi0JICAgICYmIG5leHQgIT0gRVhUX01BWF9CTE9DS1MpIHsKKwluZXh0ID0gRVhUX01BWF9CTE9DS1M7CisJaWYgKGxlMzJfdG9fY3B1KG5ld2V4dC0+ZWVfYmxvY2spID4gbGUzMl90b19jcHUoZmV4LT5lZV9ibG9jaykpCisJCW5leHQgPSBleHQ0X2V4dF9uZXh0X2xlYWZfYmxvY2socGF0aCk7CisJaWYgKG5leHQgIT0gRVhUX01BWF9CTE9DS1MpIHsKIAkJZXh0X2RlYnVnKCJuZXh0IGxlYWYgYmxvY2sgLSAlZFxuIiwgbmV4dCk7CiAJCUJVR19PTihucGF0aCAhPSBOVUxMKTsKIAkJbnBhdGggPSBleHQ0X2V4dF9maW5kX2V4dGVudChpbm9kZSwgbmV4dCwgTlVMTCk7CkBAIC0xNzc5LDcgKzE3NDYsNyBAQAogCQkJZXh0X2RlYnVnKCJuZXh0IGxlYWYgaXNuJ3QgZnVsbCglZClcbiIsCiAJCQkJICBsZTE2X3RvX2NwdShlaC0+ZWhfZW50cmllcykpOwogCQkJcGF0aCA9IG5wYXRoOwotCQkJZ290byByZXBlYXQ7CisJCQlnb3RvIGhhc19zcGFjZTsKIAkJfQogCQlleHRfZGVidWcoIm5leHQgbGVhZiBoYXMgbm8gZnJlZSBzcGFjZSglZCwlZClcbiIsCiAJCQkgIGxlMTZfdG9fY3B1KGVoLT5laF9lbnRyaWVzKSwgbGUxNl90b19jcHUoZWgtPmVoX21heCkpOwpAQCAtMTgzOSw3ICsxODA2LDcgQEAKIAkJCQlleHQ0X2V4dF9wYmxvY2sobmV3ZXh0KSwKIAkJCQlleHQ0X2V4dF9pc191bmluaXRpYWxpemVkKG5ld2V4dCksCiAJCQkJZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4obmV3ZXh0KSwKLQkJCQluZWFyZXgsIGxlbiwgbmVhcmV4ICsgMSwgbmVhcmV4ICsgMik7CisJCQkJbmVhcmV4LCBsZW4sIG5lYXJleCwgbmVhcmV4ICsgMSk7CiAJCW1lbW1vdmUobmVhcmV4ICsgMSwgbmVhcmV4LCBsZW4pOwogCQlwYXRoW2RlcHRoXS5wX2V4dCA9IG5lYXJleDsKIAl9CkBAIC0yMDUyLDcgKzIwMTksNyBAQAogfQogCiAvKgotICogZXh0NF9leHRfaW5fY2FjaGUoKQorICogZXh0NF9leHRfY2hlY2tfY2FjaGUoKQogICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZ2l2ZW4gYmxvY2sgaXMgaW4gdGhlIGNhY2hlLgogICogSWYgaXQgaXMsIHRoZSBjYWNoZWQgZXh0ZW50IGlzIHN0b3JlZCBpbiB0aGUgZ2l2ZW4KICAqIGNhY2hlIGV4dGVudCBwb2ludGVyLiAgSWYgdGhlIGNhY2hlZCBleHRlbnQgaXMgYSBob2xlLApAQCAtMjEzNCw4ICsyMTAxLDYgQEAKIC8qCiAgKiBleHQ0X2V4dF9ybV9pZHg6CiAgKiByZW1vdmVzIGluZGV4IGZyb20gdGhlIGluZGV4IGJsb2NrLgotICogSXQncyB1c2VkIGluIHRydW5jYXRlIGNhc2Ugb25seSwgdGh1cyBhbGwgcmVxdWVzdHMgYXJlIGZvcgotICogbGFzdCBpbmRleCBpbiB0aGUgYmxvY2sgb25seS4KICAqLwogc3RhdGljIGludCBleHQ0X2V4dF9ybV9pZHgoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCXN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQpAQCAtMjE1Myw2ICsyMTE4LDEzIEBACiAJZXJyID0gZXh0NF9leHRfZ2V0X2FjY2VzcyhoYW5kbGUsIGlub2RlLCBwYXRoKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOworCisJaWYgKHBhdGgtPnBfaWR4ICE9IEVYVF9MQVNUX0lOREVYKHBhdGgtPnBfaGRyKSkgeworCQlpbnQgbGVuID0gRVhUX0xBU1RfSU5ERVgocGF0aC0+cF9oZHIpIC0gcGF0aC0+cF9pZHg7CisJCWxlbiAqPSBzaXplb2Yoc3RydWN0IGV4dDRfZXh0ZW50X2lkeCk7CisJCW1lbW1vdmUocGF0aC0+cF9pZHgsIHBhdGgtPnBfaWR4ICsgMSwgbGVuKTsKKwl9CisKIAlsZTE2X2FkZF9jcHUoJnBhdGgtPnBfaGRyLT5laF9lbnRyaWVzLCAtMSk7CiAJZXJyID0gZXh0NF9leHRfZGlydHkoaGFuZGxlLCBpbm9kZSwgcGF0aCk7CiAJaWYgKGVycikKQEAgLTI1MzQsOCArMjUwNiw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgZXh0NF9leHRfcmVtb3ZlX3NwYWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IHN0YXJ0LAotCQkJCWV4dDRfbGJsa190IGVuZCkKK3N0YXRpYyBpbnQgZXh0NF9leHRfcmVtb3ZlX3NwYWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IHN0YXJ0KQogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAlpbnQgZGVwdGggPSBleHRfZGVwdGgoaW5vZGUpOwpAQCAtMjU3NSw3ICsyNTQ2LDcgQEAKIAkJaWYgKGkgPT0gZGVwdGgpIHsKIAkJCS8qIHRoaXMgaXMgbGVhZiBibG9jayAqLwogCQkJZXJyID0gZXh0NF9leHRfcm1fbGVhZihoYW5kbGUsIGlub2RlLCBwYXRoLAotCQkJCQlzdGFydCwgZW5kKTsKKwkJCQkJc3RhcnQsIEVYVF9NQVhfQkxPQ0tTIC0gMSk7CiAJCQkvKiByb290IGxldmVsIGhhcyBwX2JoID09IE5VTEwsIGJyZWxzZSgpIGVhdHMgdGhpcyAqLwogCQkJYnJlbHNlKHBhdGhbaV0ucF9iaCk7CiAJCQlwYXRoW2ldLnBfYmggPSBOVUxMOwpAQCAtMzEwNywxMiArMzA3OCwxMCBAQAogCQkJCQkgICAgICBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCkKIHsKIAlzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4OwotCXN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmVoOwogCWludCBkZXB0aDsKIAlpbnQgZXJyID0gMDsKIAogCWRlcHRoID0gZXh0X2RlcHRoKGlub2RlKTsKLQllaCA9IHBhdGhbZGVwdGhdLnBfaGRyOwogCWV4ID0gcGF0aFtkZXB0aF0ucF9leHQ7CiAKIAlleHRfZGVidWcoImV4dDRfY29udmVydF91bndyaXR0ZW5fZXh0ZW50c19lbmRpbzogaW5vZGUgJWx1LCBsb2dpY2FsIgpAQCAtMzM1Nyw4ICszMzI2LDggQEAKIAl0cmFjZV9leHQ0X2V4dF9tYXBfYmxvY2tzX2VudGVyKGlub2RlLCBtYXAtPm1fbGJsaywgbWFwLT5tX2xlbiwgZmxhZ3MpOwogCiAJLyogY2hlY2sgaW4gY2FjaGUgKi8KLQlpZiAoZXh0NF9leHRfaW5fY2FjaGUoaW5vZGUsIG1hcC0+bV9sYmxrLCAmbmV3ZXgpICYmCi0JCSgoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfUFVOQ0hfT1VUX0VYVCkgPT0gMCkpIHsKKwlpZiAoIShmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19QVU5DSF9PVVRfRVhUKSAmJgorCQlleHQ0X2V4dF9pbl9jYWNoZShpbm9kZSwgbWFwLT5tX2xibGssICZuZXdleCkpIHsKIAkJaWYgKCFuZXdleC5lZV9zdGFydF9sbyAmJiAhbmV3ZXguZWVfc3RhcnRfaGkpIHsKIAkJCWlmICgoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFKSA9PSAwKSB7CiAJCQkJLyoKQEAgLTM0OTcsOCArMzQ2NiwyNyBAQAogCiAJCQlleHQ0X2V4dF9tYXJrX3VuaW5pdGlhbGl6ZWQoZXgpOwogCi0JCQllcnIgPSBleHQ0X2V4dF9yZW1vdmVfc3BhY2UoaW5vZGUsIG1hcC0+bV9sYmxrLAotCQkJCW1hcC0+bV9sYmxrICsgcHVuY2hlZF9vdXQpOworCQkJZXh0NF9leHRfaW52YWxpZGF0ZV9jYWNoZShpbm9kZSk7CisKKwkJCWVyciA9IGV4dDRfZXh0X3JtX2xlYWYoaGFuZGxlLCBpbm9kZSwgcGF0aCwKKwkJCQltYXAtPm1fbGJsaywgbWFwLT5tX2xibGsgKyBwdW5jaGVkX291dCk7CisKKwkJCWlmICghZXJyICYmIHBhdGgtPnBfaGRyLT5laF9lbnRyaWVzID09IDApIHsKKwkJCQkvKgorCQkJCSAqIFB1bmNoIGhvbGUgZnJlZWQgYWxsIG9mIHRoaXMgc3ViIHRyZWUsCisJCQkJICogc28gd2UgbmVlZCB0byBjb3JyZWN0IGVoX2RlcHRoCisJCQkJICovCisJCQkJZXJyID0gZXh0NF9leHRfZ2V0X2FjY2VzcyhoYW5kbGUsIGlub2RlLCBwYXRoKTsKKwkJCQlpZiAoZXJyID09IDApIHsKKwkJCQkJZXh0X2lub2RlX2hkcihpbm9kZSktPmVoX2RlcHRoID0gMDsKKwkJCQkJZXh0X2lub2RlX2hkcihpbm9kZSktPmVoX21heCA9CisJCQkJCWNwdV90b19sZTE2KGV4dDRfZXh0X3NwYWNlX3Jvb3QoCisJCQkJCQlpbm9kZSwgMCkpOworCisJCQkJCWVyciA9IGV4dDRfZXh0X2RpcnR5KAorCQkJCQkJaGFuZGxlLCBpbm9kZSwgcGF0aCk7CisJCQkJfQorCQkJfQogCiAJCQlnb3RvIG91dDI7CiAJCX0KQEAgLTM1OTYsMTcgKzM1ODQsMTggQEAKIAl9CiAKIAllcnIgPSBjaGVja19lb2ZibG9ja3NfZmwoaGFuZGxlLCBpbm9kZSwgbWFwLT5tX2xibGssIHBhdGgsIGFyLmxlbik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQyOwotCi0JZXJyID0gZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLCAmbmV3ZXgsIGZsYWdzKTsKKwlpZiAoIWVycikKKwkJZXJyID0gZXh0NF9leHRfaW5zZXJ0X2V4dGVudChoYW5kbGUsIGlub2RlLCBwYXRoLAorCQkJCQkgICAgICZuZXdleCwgZmxhZ3MpOwogCWlmIChlcnIpIHsKKwkJaW50IGZiX2ZsYWdzID0gZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfREVMQUxMT0NfUkVTRVJWRSA/CisJCQlFWFQ0X0ZSRUVfQkxPQ0tTX05PX1FVT1RfVVBEQVRFIDogMDsKIAkJLyogZnJlZSBkYXRhIGJsb2NrcyB3ZSBqdXN0IGFsbG9jYXRlZCAqLwogCQkvKiBub3QgYSBnb29kIGlkZWEgdG8gY2FsbCBkaXNjYXJkIGhlcmUgZGlyZWN0bHksCiAJCSAqIGJ1dCBvdGhlcndpc2Ugd2UnZCBuZWVkIHRvIGNhbGwgaXQgZXZlcnkgZnJlZSgpICovCiAJCWV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7CiAJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgTlVMTCwgZXh0NF9leHRfcGJsb2NrKCZuZXdleCksCi0JCQkJIGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKCZuZXdleCksIDApOworCQkJCSBleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbigmbmV3ZXgpLCBmYl9mbGFncyk7CiAJCWdvdG8gb3V0MjsKIAl9CiAKQEAgLTM2OTksNyArMzY4OCw3IEBACiAKIAlsYXN0X2Jsb2NrID0gKGlub2RlLT5pX3NpemUgKyBzYi0+c19ibG9ja3NpemUgLSAxKQogCQkJPj4gRVhUNF9CTE9DS19TSVpFX0JJVFMoc2IpOwotCWVyciA9IGV4dDRfZXh0X3JlbW92ZV9zcGFjZShpbm9kZSwgbGFzdF9ibG9jaywgRVhUX01BWF9CTE9DS1MgLSAxKTsKKwllcnIgPSBleHQ0X2V4dF9yZW1vdmVfc3BhY2UoaW5vZGUsIGxhc3RfYmxvY2spOwogCiAJLyogSW4gYSBtdWx0aS10cmFuc2FjdGlvbiB0cnVuY2F0ZSwgd2Ugb25seSBtYWtlIHRoZSBmaW5hbAogCSAqIHRyYW5zYWN0aW9uIHN5bmNocm9ub3VzLgpAQCAtMzgzNSw3ICszODI0LDcgQEAKIAkJCQkJCWJsa2JpdHMpID4+IGJsa2JpdHMpKQogCQkJbmV3X3NpemUgPSBvZmZzZXQgKyBsZW47CiAJCWVsc2UKLQkJCW5ld19zaXplID0gKG1hcC5tX2xibGsgKyByZXQpIDw8IGJsa2JpdHM7CisJCQluZXdfc2l6ZSA9ICgobG9mZl90KSBtYXAubV9sYmxrICsgcmV0KSA8PCBibGtiaXRzOwogCiAJCWV4dDRfZmFsbG9jX3VwZGF0ZV9pbm9kZShpbm9kZSwgbW9kZSwgbmV3X3NpemUsCiAJCQkJCSAobWFwLm1fZmxhZ3MgJiBFWFQ0X01BUF9ORVcpKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZnN5bmMuYyBiL2ZzL2V4dDQvZnN5bmMuYwppbmRleCBkYTNiZWQzLi4wMzZmNzhmIDEwMDY0NAotLS0gYS9mcy9leHQ0L2ZzeW5jLmMKKysrIGIvZnMvZXh0NC9mc3luYy5jCkBAIC0xMjksMTUgKzEyOSwzMCBAQAogewogCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCB3YmM7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKm5leHQ7CiAJaW50IHJldCA9IDA7CiAKLQl3aGlsZSAoaW5vZGUgJiYgZXh0NF90ZXN0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX05FV0VOVFJZKSkgeworCWlmICghZXh0NF90ZXN0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX05FV0VOVFJZKSkKKwkJcmV0dXJuIDA7CisJaW5vZGUgPSBpZ3JhYihpbm9kZSk7CisJd2hpbGUgKGV4dDRfdGVzdF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9ORVdFTlRSWSkpIHsKIAkJZXh0NF9jbGVhcl9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9ORVdFTlRSWSk7Ci0JCWRlbnRyeSA9IGxpc3RfZW50cnkoaW5vZGUtPmlfZGVudHJ5Lm5leHQsCi0JCQkJICAgIHN0cnVjdCBkZW50cnksIGRfYWxpYXMpOwotCQlpZiAoIWRlbnRyeSB8fCAhZGVudHJ5LT5kX3BhcmVudCB8fCAhZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSkKKwkJZGVudHJ5ID0gTlVMTDsKKwkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZpbm9kZS0+aV9kZW50cnkpKSB7CisJCQlkZW50cnkgPSBsaXN0X2ZpcnN0X2VudHJ5KCZpbm9kZS0+aV9kZW50cnksCisJCQkJCQkgIHN0cnVjdCBkZW50cnksIGRfYWxpYXMpOworCQkJZGdldChkZW50cnkpOworCQl9CisJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJaWYgKCFkZW50cnkpCiAJCQlicmVhazsKLQkJaW5vZGUgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCQluZXh0ID0gaWdyYWIoZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSk7CisJCWRwdXQoZGVudHJ5KTsKKwkJaWYgKCFuZXh0KQorCQkJYnJlYWs7CisJCWlwdXQoaW5vZGUpOworCQlpbm9kZSA9IG5leHQ7CiAJCXJldCA9IHN5bmNfbWFwcGluZ19idWZmZXJzKGlub2RlLT5pX21hcHBpbmcpOwogCQlpZiAocmV0KQogCQkJYnJlYWs7CkBAIC0xNDgsNiArMTYzLDcgQEAKIAkJaWYgKHJldCkKIAkJCWJyZWFrOwogCX0KKwlpcHV0KGlub2RlKTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9mcy9leHQ0L2lhbGxvYy5jIGIvZnMvZXh0NC9pYWxsb2MuYwppbmRleCAyMWJiMmY2Li45YzYzZjI3IDEwMDY0NAotLS0gYS9mcy9leHQ0L2lhbGxvYy5jCisrKyBiL2ZzL2V4dDQvaWFsbG9jLmMKQEAgLTEyODcsNyArMTI4Nyw3IEBACiAJCQkgICBncm91cCwgdXNlZF9ibGtzLAogCQkJICAgZXh0NF9pdGFibGVfdW51c2VkX2NvdW50KHNiLCBnZHApKTsKIAkJcmV0ID0gMTsKLQkJZ290byBvdXQ7CisJCWdvdG8gZXJyX291dDsKIAl9CiAKIAlibGsgPSBleHQ0X2lub2RlX3RhYmxlKHNiLCBnZHApICsgdXNlZF9ibGtzOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbmRpcmVjdC5jIGIvZnMvZXh0NC9pbmRpcmVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NjAyY2QKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQ0L2luZGlyZWN0LmMKQEAgLTAsMCArMSwxNDgyIEBACisvKgorICogIGxpbnV4L2ZzL2V4dDQvaW5kaXJlY3QuYworICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2ZzL2V4dDQvaW5vZGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9mcy9taW5peC9pbm9kZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgR29hbC1kaXJlY3RlZCBibG9jayBhbGxvY2F0aW9uIGJ5IFN0ZXBoZW4gVHdlZWRpZQorICoJKHNjdEByZWRoYXQuY29tKSwgMTk5MywgMTk5OAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlICJleHQ0X2piZDIuaCIKKyNpbmNsdWRlICJ0cnVuY2F0ZS5oIgorCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2V4dDQuaD4KKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fbGUzMgkqcDsKKwlfX2xlMzIJa2V5OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7Cit9IEluZGlyZWN0OworCitzdGF0aWMgaW5saW5lIHZvaWQgYWRkX2NoYWluKEluZGlyZWN0ICpwLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBfX2xlMzIgKnYpCit7CisJcC0+a2V5ID0gKihwLT5wID0gdik7CisJcC0+YmggPSBiaDsKK30KKworLyoqCisgKglleHQ0X2Jsb2NrX3RvX3BhdGggLSBwYXJzZSB0aGUgYmxvY2sgbnVtYmVyIGludG8gYXJyYXkgb2Ygb2Zmc2V0cworICoJQGlub2RlOiBpbm9kZSBpbiBxdWVzdGlvbiAod2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBpdHMgc3VwZXJibG9jaykKKyAqCUBpX2Jsb2NrOiBibG9jayBudW1iZXIgdG8gYmUgcGFyc2VkCisgKglAb2Zmc2V0czogYXJyYXkgdG8gc3RvcmUgdGhlIG9mZnNldHMgaW4KKyAqCUBib3VuZGFyeTogc2V0IHRoaXMgbm9uLXplcm8gaWYgdGhlIHJlZmVycmVkLXRvIGJsb2NrIGlzIGxpa2VseSB0byBiZQorICoJICAgICAgIGZvbGxvd2VkIChvbiBkaXNrKSBieSBhbiBpbmRpcmVjdCBibG9jay4KKyAqCisgKglUbyBzdG9yZSB0aGUgbG9jYXRpb25zIG9mIGZpbGUncyBkYXRhIGV4dDQgdXNlcyBhIGRhdGEgc3RydWN0dXJlIGNvbW1vbgorICoJZm9yIFVOSVggZmlsZXN5c3RlbXMgLSB0cmVlIG9mIHBvaW50ZXJzIGFuY2hvcmVkIGluIHRoZSBpbm9kZSwgd2l0aAorICoJZGF0YSBibG9ja3MgYXQgbGVhdmVzIGFuZCBpbmRpcmVjdCBibG9ja3MgaW4gaW50ZXJtZWRpYXRlIG5vZGVzLgorICoJVGhpcyBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoZSBibG9jayBudW1iZXIgaW50byBwYXRoIGluIHRoYXQgdHJlZSAtCisgKglyZXR1cm4gdmFsdWUgaXMgdGhlIHBhdGggbGVuZ3RoIGFuZCBAb2Zmc2V0c1tuXSBpcyB0aGUgb2Zmc2V0IG9mCisgKglwb2ludGVyIHRvIChuKzEpdGggbm9kZSBpbiB0aGUgbnRoIG9uZS4gSWYgQGJsb2NrIGlzIG91dCBvZiByYW5nZQorICoJKG5lZ2F0aXZlIG9yIHRvbyBsYXJnZSkgd2FybmluZyBpcyBwcmludGVkIGFuZCB6ZXJvIHJldHVybmVkLgorICoKKyAqCU5vdGU6IGZ1bmN0aW9uIGRvZXNuJ3QgZmluZCBub2RlIGFkZHJlc3Nlcywgc28gbm8gSU8gaXMgbmVlZGVkLiBBbGwKKyAqCXdlIG5lZWQgdG8ga25vdyBpcyB0aGUgY2FwYWNpdHkgb2YgaW5kaXJlY3QgYmxvY2tzICh0YWtlbiBmcm9tIHRoZQorICoJaW5vZGUtPmlfc2IpLgorICovCisKKy8qCisgKiBQb3J0YWJpbGl0eSBub3RlOiB0aGUgbGFzdCBjb21wYXJpc29uIChjaGVjayB0aGF0IHdlIGZpdCBpbnRvIHRyaXBsZQorICogaW5kaXJlY3QgYmxvY2spIGlzIHNwZWxsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugb3RoZXJ3aXNlIG9uIGFuCisgKiBhcmNoaXRlY3R1cmUgd2l0aCAzMi1iaXQgbG9uZ3MgYW5kIDhLYiBwYWdlcyB3ZSBtaWdodCBnZXQgaW50byB0cm91YmxlCisgKiBpZiBvdXIgZmlsZXN5c3RlbSBoYWQgOEtiIGJsb2Nrcy4gV2UgbWlnaHQgdXNlIGxvbmcgbG9uZywgYnV0IHRoYXQgd291bGQKKyAqIGtpbGwgdXMgb24geDg2LiBPaCwgd2VsbCwgYXQgbGVhc3QgdGhlIHNpZ24gcHJvcGFnYXRpb24gZG9lcyBub3QgbWF0dGVyIC0KKyAqIGlfYmxvY2sgd291bGQgaGF2ZSB0byBiZSBuZWdhdGl2ZSBpbiB0aGUgdmVyeSBiZWdpbm5pbmcsIHNvIHdlIHdvdWxkIG5vdAorICogZ2V0IHRoZXJlIGF0IGFsbC4KKyAqLworCitzdGF0aWMgaW50IGV4dDRfYmxvY2tfdG9fcGF0aChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgZXh0NF9sYmxrX3QgaV9ibG9jaywKKwkJCSAgICAgIGV4dDRfbGJsa190IG9mZnNldHNbNF0sIGludCAqYm91bmRhcnkpCit7CisJaW50IHB0cnMgPSBFWFQ0X0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKTsKKwlpbnQgcHRyc19iaXRzID0gRVhUNF9BRERSX1BFUl9CTE9DS19CSVRTKGlub2RlLT5pX3NiKTsKKwljb25zdCBsb25nIGRpcmVjdF9ibG9ja3MgPSBFWFQ0X05ESVJfQkxPQ0tTLAorCQlpbmRpcmVjdF9ibG9ja3MgPSBwdHJzLAorCQlkb3VibGVfYmxvY2tzID0gKDEgPDwgKHB0cnNfYml0cyAqIDIpKTsKKwlpbnQgbiA9IDA7CisJaW50IGZpbmFsID0gMDsKKworCWlmIChpX2Jsb2NrIDwgZGlyZWN0X2Jsb2NrcykgeworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrOworCQlmaW5hbCA9IGRpcmVjdF9ibG9ja3M7CisJfSBlbHNlIGlmICgoaV9ibG9jayAtPSBkaXJlY3RfYmxvY2tzKSA8IGluZGlyZWN0X2Jsb2NrcykgeworCQlvZmZzZXRzW24rK10gPSBFWFQ0X0lORF9CTE9DSzsKKwkJb2Zmc2V0c1tuKytdID0gaV9ibG9jazsKKwkJZmluYWwgPSBwdHJzOworCX0gZWxzZSBpZiAoKGlfYmxvY2sgLT0gaW5kaXJlY3RfYmxvY2tzKSA8IGRvdWJsZV9ibG9ja3MpIHsKKwkJb2Zmc2V0c1tuKytdID0gRVhUNF9ESU5EX0JMT0NLOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrID4+IHB0cnNfYml0czsKKwkJb2Zmc2V0c1tuKytdID0gaV9ibG9jayAmIChwdHJzIC0gMSk7CisJCWZpbmFsID0gcHRyczsKKwl9IGVsc2UgaWYgKCgoaV9ibG9jayAtPSBkb3VibGVfYmxvY2tzKSA+PiAocHRyc19iaXRzICogMikpIDwgcHRycykgeworCQlvZmZzZXRzW24rK10gPSBFWFQ0X1RJTkRfQkxPQ0s7CisJCW9mZnNldHNbbisrXSA9IGlfYmxvY2sgPj4gKHB0cnNfYml0cyAqIDIpOworCQlvZmZzZXRzW24rK10gPSAoaV9ibG9jayA+PiBwdHJzX2JpdHMpICYgKHB0cnMgLSAxKTsKKwkJb2Zmc2V0c1tuKytdID0gaV9ibG9jayAmIChwdHJzIC0gMSk7CisJCWZpbmFsID0gcHRyczsKKwl9IGVsc2UgeworCQlleHQ0X3dhcm5pbmcoaW5vZGUtPmlfc2IsICJibG9jayAlbHUgPiBtYXggaW4gaW5vZGUgJWx1IiwKKwkJCSAgICAgaV9ibG9jayArIGRpcmVjdF9ibG9ja3MgKworCQkJICAgICBpbmRpcmVjdF9ibG9ja3MgKyBkb3VibGVfYmxvY2tzLCBpbm9kZS0+aV9pbm8pOworCX0KKwlpZiAoYm91bmRhcnkpCisJCSpib3VuZGFyeSA9IGZpbmFsIC0gMSAtIChpX2Jsb2NrICYgKHB0cnMgLSAxKSk7CisJcmV0dXJuIG47Cit9CisKKy8qKgorICoJZXh0NF9nZXRfYnJhbmNoIC0gcmVhZCB0aGUgY2hhaW4gb2YgaW5kaXJlY3QgYmxvY2tzIGxlYWRpbmcgdG8gZGF0YQorICoJQGlub2RlOiBpbm9kZSBpbiBxdWVzdGlvbgorICoJQGRlcHRoOiBkZXB0aCBvZiB0aGUgY2hhaW4gKDEgLSBkaXJlY3QgcG9pbnRlciwgZXRjLikKKyAqCUBvZmZzZXRzOiBvZmZzZXRzIG9mIHBvaW50ZXJzIGluIGlub2RlL2luZGlyZWN0IGJsb2NrcworICoJQGNoYWluOiBwbGFjZSB0byBzdG9yZSB0aGUgcmVzdWx0CisgKglAZXJyOiBoZXJlIHdlIHN0b3JlIHRoZSBlcnJvciB2YWx1ZQorICoKKyAqCUZ1bmN0aW9uIGZpbGxzIHRoZSBhcnJheSBvZiB0cmlwbGVzIDxrZXksIHAsIGJoPiBhbmQgcmV0dXJucyAlTlVMTAorICoJaWYgZXZlcnl0aGluZyB3ZW50IE9LIG9yIHRoZSBwb2ludGVyIHRvIHRoZSBsYXN0IGZpbGxlZCB0cmlwbGUKKyAqCShpbmNvbXBsZXRlIG9uZSkgb3RoZXJ3aXNlLiBVcG9uIHRoZSByZXR1cm4gY2hhaW5baV0ua2V5IGNvbnRhaW5zCisgKgl0aGUgbnVtYmVyIG9mIChpKzEpLXRoIGJsb2NrIGluIHRoZSBjaGFpbiAoYXMgaXQgaXMgc3RvcmVkIGluIG1lbW9yeSwKKyAqCWkuZS4gbGl0dGxlLWVuZGlhbiAzMi1iaXQpLCBjaGFpbltpXS5wIGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoYXQKKyAqCW51bWJlciAoaXQgcG9pbnRzIGludG8gc3RydWN0IGlub2RlIGZvciBpPT0wIGFuZCBpbnRvIHRoZSBiaC0+Yl9kYXRhCisgKglmb3IgaT4wKSBhbmQgY2hhaW5baV0uYmggcG9pbnRzIHRvIHRoZSBidWZmZXJfaGVhZCBvZiBpLXRoIGluZGlyZWN0CisgKglibG9jayBmb3IgaT4wIGFuZCBOVUxMIGZvciBpPT0wLiBJbiBvdGhlciB3b3JkcywgaXQgaG9sZHMgdGhlIGJsb2NrCisgKgludW1iZXJzIG9mIHRoZSBjaGFpbiwgYWRkcmVzc2VzIHRoZXkgd2VyZSB0YWtlbiBmcm9tIChhbmQgd2hlcmUgd2UgY2FuCisgKgl2ZXJpZnkgdGhhdCBjaGFpbiBkaWQgbm90IGNoYW5nZSkgYW5kIGJ1ZmZlcl9oZWFkcyBob3N0aW5nIHRoZXNlCisgKgludW1iZXJzLgorICoKKyAqCUZ1bmN0aW9uIHN0b3BzIHdoZW4gaXQgc3R1bWJsZXMgdXBvbiB6ZXJvIHBvaW50ZXIgKGFic2VudCBibG9jaykKKyAqCQkocG9pbnRlciB0byBsYXN0IHRyaXBsZSByZXR1cm5lZCwgKkBlcnIgPT0gMCkKKyAqCW9yIHdoZW4gaXQgZ2V0cyBhbiBJTyBlcnJvciByZWFkaW5nIGFuIGluZGlyZWN0IGJsb2NrCisgKgkJKGRpdHRvLCAqQGVyciA9PSAtRUlPKQorICoJb3Igd2hlbiBpdCByZWFkcyBhbGwgQGRlcHRoLTEgaW5kaXJlY3QgYmxvY2tzIHN1Y2Nlc3NmdWxseSBhbmQgZmluZHMKKyAqCXRoZSB3aG9sZSBjaGFpbiwgYWxsIHdheSB0byB0aGUgZGF0YSAocmV0dXJucyAlTlVMTCwgKmVyciA9PSAwKS4KKyAqCisgKiAgICAgIE5lZWQgdG8gYmUgY2FsbGVkIHdpdGgKKyAqICAgICAgZG93bl9yZWFkKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKQorICovCitzdGF0aWMgSW5kaXJlY3QgKmV4dDRfZ2V0X2JyYW5jaChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZGVwdGgsCisJCQkJIGV4dDRfbGJsa190ICAqb2Zmc2V0cywKKwkJCQkgSW5kaXJlY3QgY2hhaW5bNF0sIGludCAqZXJyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlJbmRpcmVjdCAqcCA9IGNoYWluOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkqZXJyID0gMDsKKwkvKiBpX2RhdGEgaXMgbm90IGdvaW5nIGF3YXksIG5vIGxvY2sgbmVlZGVkICovCisJYWRkX2NoYWluKGNoYWluLCBOVUxMLCBFWFQ0X0koaW5vZGUpLT5pX2RhdGEgKyAqb2Zmc2V0cyk7CisJaWYgKCFwLT5rZXkpCisJCWdvdG8gbm9fYmxvY2s7CisJd2hpbGUgKC0tZGVwdGgpIHsKKwkJYmggPSBzYl9nZXRibGsoc2IsIGxlMzJfdG9fY3B1KHAtPmtleSkpOworCQlpZiAodW5saWtlbHkoIWJoKSkKKwkJCWdvdG8gZmFpbHVyZTsKKworCQlpZiAoIWJoX3VwdG9kYXRlX29yX2xvY2soYmgpKSB7CisJCQlpZiAoYmhfc3VibWl0X3JlYWQoYmgpIDwgMCkgeworCQkJCXB1dF9iaChiaCk7CisJCQkJZ290byBmYWlsdXJlOworCQkJfQorCQkJLyogdmFsaWRhdGUgYmxvY2sgcmVmZXJlbmNlcyAqLworCQkJaWYgKGV4dDRfY2hlY2tfaW5kaXJlY3RfYmxvY2tyZWYoaW5vZGUsIGJoKSkgeworCQkJCXB1dF9iaChiaCk7CisJCQkJZ290byBmYWlsdXJlOworCQkJfQorCQl9CisKKwkJYWRkX2NoYWluKCsrcCwgYmgsIChfX2xlMzIgKiliaC0+Yl9kYXRhICsgKisrb2Zmc2V0cyk7CisJCS8qIFJlYWRlcjogZW5kICovCisJCWlmICghcC0+a2V5KQorCQkJZ290byBub19ibG9jazsKKwl9CisJcmV0dXJuIE5VTEw7CisKK2ZhaWx1cmU6CisJKmVyciA9IC1FSU87Citub19ibG9jazoKKwlyZXR1cm4gcDsKK30KKworLyoqCisgKglleHQ0X2ZpbmRfbmVhciAtIGZpbmQgYSBwbGFjZSBmb3IgYWxsb2NhdGlvbiB3aXRoIHN1ZmZpY2llbnQgbG9jYWxpdHkKKyAqCUBpbm9kZTogb3duZXIKKyAqCUBpbmQ6IGRlc2NyaXB0b3Igb2YgaW5kaXJlY3QgYmxvY2suCisgKgorICoJVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBwcmVmZXJyZWQgcGxhY2UgZm9yIGJsb2NrIGFsbG9jYXRpb24uCisgKglJdCBpcyB1c2VkIHdoZW4gaGV1cmlzdGljIGZvciBzZXF1ZW50aWFsIGFsbG9jYXRpb24gZmFpbHMuCisgKglSdWxlcyBhcmU6CisgKgkgICsgaWYgdGhlcmUgaXMgYSBibG9jayB0byB0aGUgbGVmdCBvZiBvdXIgcG9zaXRpb24gLSBhbGxvY2F0ZSBuZWFyIGl0LgorICoJICArIGlmIHBvaW50ZXIgd2lsbCBsaXZlIGluIGluZGlyZWN0IGJsb2NrIC0gYWxsb2NhdGUgbmVhciB0aGF0IGJsb2NrLgorICoJICArIGlmIHBvaW50ZXIgd2lsbCBsaXZlIGluIGlub2RlIC0gYWxsb2NhdGUgaW4gdGhlIHNhbWUKKyAqCSAgICBjeWxpbmRlciBncm91cC4KKyAqCisgKiBJbiB0aGUgbGF0dGVyIGNhc2Ugd2UgY29sb3VyIHRoZSBzdGFydGluZyBibG9jayBieSB0aGUgY2FsbGVycyBQSUQgdG8KKyAqIHByZXZlbnQgaXQgZnJvbSBjbGFzaGluZyB3aXRoIGNvbmN1cnJlbnQgYWxsb2NhdGlvbnMgZm9yIGEgZGlmZmVyZW50IGlub2RlCisgKiBpbiB0aGUgc2FtZSBibG9jayBncm91cC4gICBUaGUgUElEIGlzIHVzZWQgaGVyZSBzbyB0aGF0IGZ1bmN0aW9uYWxseSByZWxhdGVkCisgKiBmaWxlcyB3aWxsIGJlIGNsb3NlLWJ5IG9uLWRpc2suCisgKgorICoJQ2FsbGVyIG11c3QgbWFrZSBzdXJlIHRoYXQgQGluZCBpcyB2YWxpZCBhbmQgd2lsbCBzdGF5IHRoYXQgd2F5LgorICovCitzdGF0aWMgZXh0NF9mc2Jsa190IGV4dDRfZmluZF9uZWFyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIEluZGlyZWN0ICppbmQpCit7CisJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOworCV9fbGUzMiAqc3RhcnQgPSBpbmQtPmJoID8gKF9fbGUzMiAqKSBpbmQtPmJoLT5iX2RhdGEgOiBlaS0+aV9kYXRhOworCV9fbGUzMiAqcDsKKworCS8qIFRyeSB0byBmaW5kIHByZXZpb3VzIGJsb2NrICovCisJZm9yIChwID0gaW5kLT5wIC0gMTsgcCA+PSBzdGFydDsgcC0tKSB7CisJCWlmICgqcCkKKwkJCXJldHVybiBsZTMyX3RvX2NwdSgqcCk7CisJfQorCisJLyogTm8gc3VjaCB0aGluZywgc28gbGV0J3MgdHJ5IGxvY2F0aW9uIG9mIGluZGlyZWN0IGJsb2NrICovCisJaWYgKGluZC0+YmgpCisJCXJldHVybiBpbmQtPmJoLT5iX2Jsb2NrbnI7CisKKwkvKgorCSAqIEl0IGlzIGdvaW5nIHRvIGJlIHJlZmVycmVkIHRvIGZyb20gdGhlIGlub2RlIGl0c2VsZj8gT0ssIGp1c3QgcHV0IGl0CisJICogaW50byB0aGUgc2FtZSBjeWxpbmRlciBncm91cCB0aGVuLgorCSAqLworCXJldHVybiBleHQ0X2lub2RlX3RvX2dvYWxfYmxvY2soaW5vZGUpOworfQorCisvKioKKyAqCWV4dDRfZmluZF9nb2FsIC0gZmluZCBhIHByZWZlcnJlZCBwbGFjZSBmb3IgYWxsb2NhdGlvbi4KKyAqCUBpbm9kZTogb3duZXIKKyAqCUBibG9jazogIGJsb2NrIHdlIHdhbnQKKyAqCUBwYXJ0aWFsOiBwb2ludGVyIHRvIHRoZSBsYXN0IHRyaXBsZSB3aXRoaW4gYSBjaGFpbgorICoKKyAqCU5vcm1hbGx5IHRoaXMgZnVuY3Rpb24gZmluZCB0aGUgcHJlZmVycmVkIHBsYWNlIGZvciBibG9jayBhbGxvY2F0aW9uLAorICoJcmV0dXJucyBpdC4KKyAqCUJlY2F1c2UgdGhpcyBpcyBvbmx5IHVzZWQgZm9yIG5vbi1leHRlbnQgZmlsZXMsIHdlIGxpbWl0IHRoZSBibG9jayBucgorICoJdG8gMzIgYml0cy4KKyAqLworc3RhdGljIGV4dDRfZnNibGtfdCBleHQ0X2ZpbmRfZ29hbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBibG9jaywKKwkJCQkgICBJbmRpcmVjdCAqcGFydGlhbCkKK3sKKwlleHQ0X2ZzYmxrX3QgZ29hbDsKKworCS8qCisJICogWFhYIG5lZWQgdG8gZ2V0IGdvYWwgYmxvY2sgZnJvbSBtYmFsbG9jJ3MgZGF0YSBzdHJ1Y3R1cmVzCisJICovCisKKwlnb2FsID0gZXh0NF9maW5kX25lYXIoaW5vZGUsIHBhcnRpYWwpOworCWdvYWwgPSBnb2FsICYgRVhUNF9NQVhfQkxPQ0tfRklMRV9QSFlTOworCXJldHVybiBnb2FsOworfQorCisvKioKKyAqCWV4dDRfYmxrc190b19hbGxvY2F0ZSAtIExvb2sgdXAgdGhlIGJsb2NrIG1hcCBhbmQgY291bnQgdGhlIG51bWJlcgorICoJb2YgZGlyZWN0IGJsb2NrcyBuZWVkIHRvIGJlIGFsbG9jYXRlZCBmb3IgdGhlIGdpdmVuIGJyYW5jaC4KKyAqCisgKglAYnJhbmNoOiBjaGFpbiBvZiBpbmRpcmVjdCBibG9ja3MKKyAqCUBrOiBudW1iZXIgb2YgYmxvY2tzIG5lZWQgZm9yIGluZGlyZWN0IGJsb2NrcworICoJQGJsa3M6IG51bWJlciBvZiBkYXRhIGJsb2NrcyB0byBiZSBtYXBwZWQuCisgKglAYmxvY2tzX3RvX2JvdW5kYXJ5OiAgdGhlIG9mZnNldCBpbiB0aGUgaW5kaXJlY3QgYmxvY2sKKyAqCisgKglyZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBibG9ja3MgdG8gYmUgYWxsb2NhdGUsIGluY2x1ZGluZyB0aGUKKyAqCWRpcmVjdCBhbmQgaW5kaXJlY3QgYmxvY2tzLgorICovCitzdGF0aWMgaW50IGV4dDRfYmxrc190b19hbGxvY2F0ZShJbmRpcmVjdCAqYnJhbmNoLCBpbnQgaywgdW5zaWduZWQgaW50IGJsa3MsCisJCQkJIGludCBibG9ja3NfdG9fYm91bmRhcnkpCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKworCS8qCisJICogU2ltcGxlIGNhc2UsIFt0LGRdSW5kaXJlY3QgYmxvY2socykgaGFzIG5vdCBhbGxvY2F0ZWQgeWV0CisJICogdGhlbiBpdCdzIGNsZWFyIGJsb2NrcyBvbiB0aGF0IHBhdGggaGF2ZSBub3QgYWxsb2NhdGVkCisJICovCisJaWYgKGsgPiAwKSB7CisJCS8qIHJpZ2h0IG5vdyB3ZSBkb24ndCBoYW5kbGUgY3Jvc3MgYm91bmRhcnkgYWxsb2NhdGlvbiAqLworCQlpZiAoYmxrcyA8IGJsb2Nrc190b19ib3VuZGFyeSArIDEpCisJCQljb3VudCArPSBibGtzOworCQllbHNlCisJCQljb3VudCArPSBibG9ja3NfdG9fYm91bmRhcnkgKyAxOworCQlyZXR1cm4gY291bnQ7CisJfQorCisJY291bnQrKzsKKwl3aGlsZSAoY291bnQgPCBibGtzICYmIGNvdW50IDw9IGJsb2Nrc190b19ib3VuZGFyeSAmJgorCQlsZTMyX3RvX2NwdSgqKGJyYW5jaFswXS5wICsgY291bnQpKSA9PSAwKSB7CisJCWNvdW50Kys7CisJfQorCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKglleHQ0X2FsbG9jX2Jsb2NrczogbXVsdGlwbGUgYWxsb2NhdGUgYmxvY2tzIG5lZWRlZCBmb3IgYSBicmFuY2gKKyAqCUBoYW5kbGU6IGhhbmRsZSBmb3IgdGhpcyB0cmFuc2FjdGlvbgorICoJQGlub2RlOiBpbm9kZSB3aGljaCBuZWVkcyBhbGxvY2F0ZWQgYmxvY2tzCisgKglAaWJsb2NrOiB0aGUgbG9naWNhbCBibG9jayB0byBzdGFydCBhbGxvY2F0ZWQgYXQKKyAqCUBnb2FsOiBwcmVmZXJyZWQgcGh5c2ljYWwgYmxvY2sgb2YgYWxsb2NhdGlvbgorICoJQGluZGlyZWN0X2Jsa3M6IHRoZSBudW1iZXIgb2YgYmxvY2tzIG5lZWQgdG8gYWxsb2NhdGUgZm9yIGluZGlyZWN0CisgKgkJCWJsb2NrcworICoJQGJsa3M6IG51bWJlciBvZiBkZXNpcmVkIGJsb2NrcworICoJQG5ld19ibG9ja3M6IG9uIHJldHVybiBpdCB3aWxsIHN0b3JlIHRoZSBuZXcgYmxvY2sgbnVtYmVycyBmb3IKKyAqCXRoZSBpbmRpcmVjdCBibG9ja3MoaWYgbmVlZGVkKSBhbmQgdGhlIGZpcnN0IGRpcmVjdCBibG9jaywKKyAqCUBlcnI6IG9uIHJldHVybiBpdCB3aWxsIHN0b3JlIHRoZSBlcnJvciBjb2RlCisgKgorICoJVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIGJsb2NrcyBhbGxvY2F0ZWQgYXMKKyAqCXJlcXVlc3RlZCBieSB0aGUgcGFzc2VkLWluIHBhcmFtZXRlcnMuCisgKi8KK3N0YXRpYyBpbnQgZXh0NF9hbGxvY19ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgZXh0NF9sYmxrX3QgaWJsb2NrLCBleHQ0X2ZzYmxrX3QgZ29hbCwKKwkJCSAgICAgaW50IGluZGlyZWN0X2Jsa3MsIGludCBibGtzLAorCQkJICAgICBleHQ0X2ZzYmxrX3QgbmV3X2Jsb2Nrc1s0XSwgaW50ICplcnIpCit7CisJc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IGFyOworCWludCB0YXJnZXQsIGk7CisJdW5zaWduZWQgbG9uZyBjb3VudCA9IDAsIGJsa19hbGxvY2F0ZWQgPSAwOworCWludCBpbmRleCA9IDA7CisJZXh0NF9mc2Jsa190IGN1cnJlbnRfYmxvY2sgPSAwOworCWludCByZXQgPSAwOworCisJLyoKKwkgKiBIZXJlIHdlIHRyeSB0byBhbGxvY2F0ZSB0aGUgcmVxdWVzdGVkIG11bHRpcGxlIGJsb2NrcyBhdCBvbmNlLAorCSAqIG9uIGEgYmVzdC1lZmZvcnQgYmFzaXMuCisJICogVG8gYnVpbGQgYSBicmFuY2gsIHdlIHNob3VsZCBhbGxvY2F0ZSBibG9ja3MgZm9yCisJICogdGhlIGluZGlyZWN0IGJsb2NrcyhpZiBub3QgYWxsb2NhdGVkIHlldCksIGFuZCBhdCBsZWFzdAorCSAqIHRoZSBmaXJzdCBkaXJlY3QgYmxvY2sgb2YgdGhpcyBicmFuY2guICBUaGF0J3MgdGhlCisJICogbWluaW11bSBudW1iZXIgb2YgYmxvY2tzIG5lZWQgdG8gYWxsb2NhdGUocmVxdWlyZWQpCisJICovCisJLyogZmlyc3Qgd2UgdHJ5IHRvIGFsbG9jYXRlIHRoZSBpbmRpcmVjdCBibG9ja3MgKi8KKwl0YXJnZXQgPSBpbmRpcmVjdF9ibGtzOworCXdoaWxlICh0YXJnZXQgPiAwKSB7CisJCWNvdW50ID0gdGFyZ2V0OworCQkvKiBhbGxvY2F0aW5nIGJsb2NrcyBmb3IgaW5kaXJlY3QgYmxvY2tzIGFuZCBkaXJlY3QgYmxvY2tzICovCisJCWN1cnJlbnRfYmxvY2sgPSBleHQ0X25ld19tZXRhX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBnb2FsLAorCQkJCQkJICAgICAwLCAmY291bnQsIGVycik7CisJCWlmICgqZXJyKQorCQkJZ290byBmYWlsZWRfb3V0OworCisJCWlmICh1bmxpa2VseShjdXJyZW50X2Jsb2NrICsgY291bnQgPiBFWFQ0X01BWF9CTE9DS19GSUxFX1BIWVMpKSB7CisJCQlFWFQ0X0VSUk9SX0lOT0RFKGlub2RlLAorCQkJCQkgImN1cnJlbnRfYmxvY2sgJWxsdSArIGNvdW50ICVsdSA+ICVkISIsCisJCQkJCSBjdXJyZW50X2Jsb2NrLCBjb3VudCwKKwkJCQkJIEVYVDRfTUFYX0JMT0NLX0ZJTEVfUEhZUyk7CisJCQkqZXJyID0gLUVJTzsKKwkJCWdvdG8gZmFpbGVkX291dDsKKwkJfQorCisJCXRhcmdldCAtPSBjb3VudDsKKwkJLyogYWxsb2NhdGUgYmxvY2tzIGZvciBpbmRpcmVjdCBibG9ja3MgKi8KKwkJd2hpbGUgKGluZGV4IDwgaW5kaXJlY3RfYmxrcyAmJiBjb3VudCkgeworCQkJbmV3X2Jsb2Nrc1tpbmRleCsrXSA9IGN1cnJlbnRfYmxvY2srKzsKKwkJCWNvdW50LS07CisJCX0KKwkJaWYgKGNvdW50ID4gMCkgeworCQkJLyoKKwkJCSAqIHNhdmUgdGhlIG5ldyBibG9jayBudW1iZXIKKwkJCSAqIGZvciB0aGUgZmlyc3QgZGlyZWN0IGJsb2NrCisJCQkgKi8KKwkJCW5ld19ibG9ja3NbaW5kZXhdID0gY3VycmVudF9ibG9jazsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzIHJldHVybmVkIG1vcmUgYmxvY2tzIHRoYW4gIgorCQkJCQkJInJlcXVlc3RlZFxuIiwgX19mdW5jX18pOworCQkJV0FSTl9PTigxKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJdGFyZ2V0ID0gYmxrcyAtIGNvdW50IDsKKwlibGtfYWxsb2NhdGVkID0gY291bnQ7CisJaWYgKCF0YXJnZXQpCisJCWdvdG8gYWxsb2NhdGVkOworCS8qIE5vdyBhbGxvY2F0ZSBkYXRhIGJsb2NrcyAqLworCW1lbXNldCgmYXIsIDAsIHNpemVvZihhcikpOworCWFyLmlub2RlID0gaW5vZGU7CisJYXIuZ29hbCA9IGdvYWw7CisJYXIubGVuID0gdGFyZ2V0OworCWFyLmxvZ2ljYWwgPSBpYmxvY2s7CisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCS8qIGVuYWJsZSBpbi1jb3JlIHByZWFsbG9jYXRpb24gb25seSBmb3IgcmVndWxhciBmaWxlcyAqLworCQlhci5mbGFncyA9IEVYVDRfTUJfSElOVF9EQVRBOworCisJY3VycmVudF9ibG9jayA9IGV4dDRfbWJfbmV3X2Jsb2NrcyhoYW5kbGUsICZhciwgZXJyKTsKKwlpZiAodW5saWtlbHkoY3VycmVudF9ibG9jayArIGFyLmxlbiA+IEVYVDRfTUFYX0JMT0NLX0ZJTEVfUEhZUykpIHsKKwkJRVhUNF9FUlJPUl9JTk9ERShpbm9kZSwKKwkJCQkgImN1cnJlbnRfYmxvY2sgJWxsdSArIGFyLmxlbiAlZCA+ICVkISIsCisJCQkJIGN1cnJlbnRfYmxvY2ssIGFyLmxlbiwKKwkJCQkgRVhUNF9NQVhfQkxPQ0tfRklMRV9QSFlTKTsKKwkJKmVyciA9IC1FSU87CisJCWdvdG8gZmFpbGVkX291dDsKKwl9CisKKwlpZiAoKmVyciAmJiAodGFyZ2V0ID09IGJsa3MpKSB7CisJCS8qCisJCSAqIGlmIHRoZSBhbGxvY2F0aW9uIGZhaWxlZCBhbmQgd2UgZGlkbid0IGFsbG9jYXRlCisJCSAqIGFueSBibG9ja3MgYmVmb3JlCisJCSAqLworCQlnb3RvIGZhaWxlZF9vdXQ7CisJfQorCWlmICghKmVycikgeworCQlpZiAodGFyZ2V0ID09IGJsa3MpIHsKKwkJCS8qCisJCQkgKiBzYXZlIHRoZSBuZXcgYmxvY2sgbnVtYmVyCisJCQkgKiBmb3IgdGhlIGZpcnN0IGRpcmVjdCBibG9jaworCQkJICovCisJCQluZXdfYmxvY2tzW2luZGV4XSA9IGN1cnJlbnRfYmxvY2s7CisJCX0KKwkJYmxrX2FsbG9jYXRlZCArPSBhci5sZW47CisJfQorYWxsb2NhdGVkOgorCS8qIHRvdGFsIG51bWJlciBvZiBibG9ja3MgYWxsb2NhdGVkIGZvciBkaXJlY3QgYmxvY2tzICovCisJcmV0ID0gYmxrX2FsbG9jYXRlZDsKKwkqZXJyID0gMDsKKwlyZXR1cm4gcmV0OworZmFpbGVkX291dDoKKwlmb3IgKGkgPSAwOyBpIDwgaW5kZXg7IGkrKykKKwkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLCBuZXdfYmxvY2tzW2ldLCAxLCAwKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqCWV4dDRfYWxsb2NfYnJhbmNoIC0gYWxsb2NhdGUgYW5kIHNldCB1cCBhIGNoYWluIG9mIGJsb2Nrcy4KKyAqCUBoYW5kbGU6IGhhbmRsZSBmb3IgdGhpcyB0cmFuc2FjdGlvbgorICoJQGlub2RlOiBvd25lcgorICoJQGluZGlyZWN0X2Jsa3M6IG51bWJlciBvZiBhbGxvY2F0ZWQgaW5kaXJlY3QgYmxvY2tzCisgKglAYmxrczogbnVtYmVyIG9mIGFsbG9jYXRlZCBkaXJlY3QgYmxvY2tzCisgKglAZ29hbDogcHJlZmVycmVkIHBsYWNlIGZvciBhbGxvY2F0aW9uCisgKglAb2Zmc2V0czogb2Zmc2V0cyAoaW4gdGhlIGJsb2NrcykgdG8gc3RvcmUgdGhlIHBvaW50ZXJzIHRvIG5leHQuCisgKglAYnJhbmNoOiBwbGFjZSB0byBzdG9yZSB0aGUgY2hhaW4gaW4uCisgKgorICoJVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYmxvY2tzLCB6ZXJvZXMgb3V0IGFsbCBidXQgdGhlIGxhc3Qgb25lLAorICoJbGlua3MgdGhlbSBpbnRvIGNoYWluIGFuZCAoaWYgd2UgYXJlIHN5bmNocm9ub3VzKSB3cml0ZXMgdGhlbSB0byBkaXNrLgorICoJSW4gb3RoZXIgd29yZHMsIGl0IHByZXBhcmVzIGEgYnJhbmNoIHRoYXQgY2FuIGJlIHNwbGljZWQgb250byB0aGUKKyAqCWlub2RlLiBJdCBzdG9yZXMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoYXQgY2hhaW4gaW4gdGhlIGJyYW5jaFtdLCBpbgorICoJdGhlIHNhbWUgZm9ybWF0IGFzIGV4dDRfZ2V0X2JyYW5jaCgpIHdvdWxkIGRvLiBXZSBhcmUgY2FsbGluZyBpdCBhZnRlcgorICoJd2UgaGFkIHJlYWQgdGhlIGV4aXN0aW5nIHBhcnQgb2YgY2hhaW4gYW5kIHBhcnRpYWwgcG9pbnRzIHRvIHRoZSBsYXN0CisgKgl0cmlwbGUgb2YgdGhhdCAob25lIHdpdGggemVybyAtPmtleSkuIFVwb24gdGhlIGV4aXQgd2UgaGF2ZSB0aGUgc2FtZQorICoJcGljdHVyZSBhcyBhZnRlciB0aGUgc3VjY2Vzc2Z1bCBleHQ0X2dldF9ibG9jaygpLCBleGNlcHQgdGhhdCBpbiBvbmUKKyAqCXBsYWNlIGNoYWluIGlzIGRpc2Nvbm5lY3RlZCAtICpicmFuY2gtPnAgaXMgc3RpbGwgemVybyAod2UgZGlkIG5vdAorICoJc2V0IHRoZSBsYXN0IGxpbmspLCBidXQgYnJhbmNoLT5rZXkgY29udGFpbnMgdGhlIG51bWJlciB0aGF0IHNob3VsZAorICoJYmUgcGxhY2VkIGludG8gKmJyYW5jaC0+cCB0byBmaWxsIHRoYXQgZ2FwLgorICoKKyAqCUlmIGFsbG9jYXRpb24gZmFpbHMgd2UgZnJlZSBhbGwgYmxvY2tzIHdlJ3ZlIGFsbG9jYXRlZCAoYW5kIGZvcmdldAorICoJdGhlaXIgYnVmZmVyX2hlYWRzKSBhbmQgcmV0dXJuIHRoZSBlcnJvciB2YWx1ZSB0aGUgZnJvbSBmYWlsZWQKKyAqCWV4dDRfYWxsb2NfYmxvY2soKSAobm9ybWFsbHkgLUVOT1NQQykuIE90aGVyd2lzZSB3ZSBzZXQgdGhlIGNoYWluCisgKglhcyBkZXNjcmliZWQgYWJvdmUgYW5kIHJldHVybiAwLgorICovCitzdGF0aWMgaW50IGV4dDRfYWxsb2NfYnJhbmNoKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgIGV4dDRfbGJsa190IGlibG9jaywgaW50IGluZGlyZWN0X2Jsa3MsCisJCQkgICAgIGludCAqYmxrcywgZXh0NF9mc2Jsa190IGdvYWwsCisJCQkgICAgIGV4dDRfbGJsa190ICpvZmZzZXRzLCBJbmRpcmVjdCAqYnJhbmNoKQoreworCWludCBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJaW50IGksIG4gPSAwOworCWludCBlcnIgPSAwOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IG51bTsKKwlleHQ0X2ZzYmxrX3QgbmV3X2Jsb2Nrc1s0XTsKKwlleHQ0X2ZzYmxrX3QgY3VycmVudF9ibG9jazsKKworCW51bSA9IGV4dDRfYWxsb2NfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGlibG9jaywgZ29hbCwgaW5kaXJlY3RfYmxrcywKKwkJCQkqYmxrcywgbmV3X2Jsb2NrcywgJmVycik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWJyYW5jaFswXS5rZXkgPSBjcHVfdG9fbGUzMihuZXdfYmxvY2tzWzBdKTsKKwkvKgorCSAqIG1ldGFkYXRhIGJsb2NrcyBhbmQgZGF0YSBibG9ja3MgYXJlIGFsbG9jYXRlZC4KKwkgKi8KKwlmb3IgKG4gPSAxOyBuIDw9IGluZGlyZWN0X2Jsa3M7ICBuKyspIHsKKwkJLyoKKwkJICogR2V0IGJ1ZmZlcl9oZWFkIGZvciBwYXJlbnQgYmxvY2ssIHplcm8gaXQgb3V0CisJCSAqIGFuZCBzZXQgdGhlIHBvaW50ZXIgdG8gbmV3IG9uZSwgdGhlbiBzZW5kCisJCSAqIHBhcmVudCB0byBkaXNrLgorCQkgKi8KKwkJYmggPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsIG5ld19ibG9ja3Nbbi0xXSk7CisJCWlmICh1bmxpa2VseSghYmgpKSB7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBmYWlsZWQ7CisJCX0KKworCQlicmFuY2hbbl0uYmggPSBiaDsKKwkJbG9ja19idWZmZXIoYmgpOworCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGdldF9jcmVhdGVfYWNjZXNzIik7CisJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfY3JlYXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwkJaWYgKGVycikgeworCQkJLyogRG9uJ3QgYnJlbHNlKGJoKSBoZXJlOyBpdCdzIGRvbmUgaW4KKwkJCSAqIGV4dDRfam91cm5hbF9mb3JnZXQoKSBiZWxvdyAqLworCQkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCisJCW1lbXNldChiaC0+Yl9kYXRhLCAwLCBibG9ja3NpemUpOworCQlicmFuY2hbbl0ucCA9IChfX2xlMzIgKikgYmgtPmJfZGF0YSArIG9mZnNldHNbbl07CisJCWJyYW5jaFtuXS5rZXkgPSBjcHVfdG9fbGUzMihuZXdfYmxvY2tzW25dKTsKKwkJKmJyYW5jaFtuXS5wID0gYnJhbmNoW25dLmtleTsKKwkJaWYgKG4gPT0gaW5kaXJlY3RfYmxrcykgeworCQkJY3VycmVudF9ibG9jayA9IG5ld19ibG9ja3Nbbl07CisJCQkvKgorCQkJICogRW5kIG9mIGNoYWluLCB1cGRhdGUgdGhlIGxhc3QgbmV3IG1ldGFibG9jayBvZgorCQkJICogdGhlIGNoYWluIHRvIHBvaW50IHRvIHRoZSBuZXcgYWxsb2NhdGVkCisJCQkgKiBkYXRhIGJsb2NrcyBudW1iZXJzCisJCQkgKi8KKwkJCWZvciAoaSA9IDE7IGkgPCBudW07IGkrKykKKwkJCQkqKGJyYW5jaFtuXS5wICsgaSkgPSBjcHVfdG9fbGUzMigrK2N1cnJlbnRfYmxvY2spOworCQl9CisJCUJVRkZFUl9UUkFDRShiaCwgIm1hcmtpbmcgdXB0b2RhdGUiKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCXVubG9ja19idWZmZXIoYmgpOworCisJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgYmgpOworCQlpZiAoZXJyKQorCQkJZ290byBmYWlsZWQ7CisJfQorCSpibGtzID0gbnVtOworCXJldHVybiBlcnI7CitmYWlsZWQ6CisJLyogQWxsb2NhdGlvbiBmYWlsZWQsIGZyZWUgd2hhdCB3ZSBhbHJlYWR5IGFsbG9jYXRlZCAqLworCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgTlVMTCwgbmV3X2Jsb2Nrc1swXSwgMSwgMCk7CisJZm9yIChpID0gMTsgaSA8PSBuIDsgaSsrKSB7CisJCS8qCisJCSAqIGJyYW5jaFtpXS5iaCBpcyBuZXdseSBhbGxvY2F0ZWQsIHNvIHRoZXJlIGlzIG5vCisJCSAqIG5lZWQgdG8gcmV2b2tlIHRoZSBibG9jaywgd2hpY2ggaXMgd2h5IHdlIGRvbid0CisJCSAqIG5lZWQgdG8gc2V0IEVYVDRfRlJFRV9CTE9DS1NfTUVUQURBVEEuCisJCSAqLworCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIG5ld19ibG9ja3NbaV0sIDEsCisJCQkJIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTsKKwl9CisJZm9yIChpID0gbisxOyBpIDwgaW5kaXJlY3RfYmxrczsgaSsrKQorCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIG5ld19ibG9ja3NbaV0sIDEsIDApOworCisJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLCBuZXdfYmxvY2tzW2ldLCBudW0sIDApOworCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBleHQ0X3NwbGljZV9icmFuY2ggLSBzcGxpY2UgdGhlIGFsbG9jYXRlZCBicmFuY2ggb250byBpbm9kZS4KKyAqIEBoYW5kbGU6IGhhbmRsZSBmb3IgdGhpcyB0cmFuc2FjdGlvbgorICogQGlub2RlOiBvd25lcgorICogQGJsb2NrOiAobG9naWNhbCkgbnVtYmVyIG9mIGJsb2NrIHdlIGFyZSBhZGRpbmcKKyAqIEBjaGFpbjogY2hhaW4gb2YgaW5kaXJlY3QgYmxvY2tzICh3aXRoIGEgbWlzc2luZyBsaW5rIC0gc2VlCisgKglleHQ0X2FsbG9jX2JyYW5jaCkKKyAqIEB3aGVyZTogbG9jYXRpb24gb2YgbWlzc2luZyBsaW5rCisgKiBAbnVtOiAgIG51bWJlciBvZiBpbmRpcmVjdCBibG9ja3Mgd2UgYXJlIGFkZGluZworICogQGJsa3M6ICBudW1iZXIgb2YgZGlyZWN0IGJsb2NrcyB3ZSBhcmUgYWRkaW5nCisgKgorICogVGhpcyBmdW5jdGlvbiBmaWxscyB0aGUgbWlzc2luZyBsaW5rIGFuZCBkb2VzIGFsbCBob3VzZWtlZXBpbmcgbmVlZGVkIGluCisgKiBpbm9kZSAoLT5pX2Jsb2NrcywgZXRjLikuIEluIGNhc2Ugb2Ygc3VjY2VzcyB3ZSBlbmQgdXAgd2l0aCB0aGUgZnVsbAorICogY2hhaW4gdG8gbmV3IGJsb2NrIGFuZCByZXR1cm4gMC4KKyAqLworc3RhdGljIGludCBleHQ0X3NwbGljZV9icmFuY2goaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgIGV4dDRfbGJsa190IGJsb2NrLCBJbmRpcmVjdCAqd2hlcmUsIGludCBudW0sCisJCQkgICAgICBpbnQgYmxrcykKK3sKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKwlleHQ0X2ZzYmxrX3QgY3VycmVudF9ibG9jazsKKworCS8qCisJICogSWYgd2UncmUgc3BsaWNpbmcgaW50byBhIFt0ZF1pbmRpcmVjdCBibG9jayAoYXMgb3Bwb3NlZCB0byB0aGUKKwkgKiBpbm9kZSkgdGhlbiB3ZSBuZWVkIHRvIGdldCB3cml0ZSBhY2Nlc3MgdG8gdGhlIFt0ZF1pbmRpcmVjdCBibG9jaworCSAqIGJlZm9yZSB0aGUgc3BsaWNlLgorCSAqLworCWlmICh3aGVyZS0+YmgpIHsKKwkJQlVGRkVSX1RSQUNFKHdoZXJlLT5iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwkJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCB3aGVyZS0+YmgpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0OworCX0KKwkvKiBUaGF0J3MgaXQgKi8KKworCSp3aGVyZS0+cCA9IHdoZXJlLT5rZXk7CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgaG9zdCBidWZmZXJfaGVhZCBvciBpbm9kZSB0byBwb2ludCB0byBtb3JlIGp1c3QgYWxsb2NhdGVkCisJICogZGlyZWN0IGJsb2NrcyBibG9ja3MKKwkgKi8KKwlpZiAobnVtID09IDAgJiYgYmxrcyA+IDEpIHsKKwkJY3VycmVudF9ibG9jayA9IGxlMzJfdG9fY3B1KHdoZXJlLT5rZXkpICsgMTsKKwkJZm9yIChpID0gMTsgaSA8IGJsa3M7IGkrKykKKwkJCSood2hlcmUtPnAgKyBpKSA9IGNwdV90b19sZTMyKGN1cnJlbnRfYmxvY2srKyk7CisJfQorCisJLyogV2UgYXJlIGRvbmUgd2l0aCBhdG9taWMgc3R1ZmYsIG5vdyBkbyB0aGUgcmVzdCBvZiBob3VzZWtlZXBpbmcgKi8KKwkvKiBoYWQgd2Ugc3BsaWNlZCBpdCBvbnRvIGluZGlyZWN0IGJsb2NrPyAqLworCWlmICh3aGVyZS0+YmgpIHsKKwkJLyoKKwkJICogSWYgd2Ugc3BsaWNlZCBpdCBvbnRvIGFuIGluZGlyZWN0IGJsb2NrLCB3ZSBoYXZlbid0CisJCSAqIGFsdGVyZWQgdGhlIGlub2RlLiAgTm90ZSBob3dldmVyIHRoYXQgaWYgaXQgaXMgYmVpbmcgc3BsaWNlZAorCQkgKiBvbnRvIGFuIGluZGlyZWN0IGJsb2NrIGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgZmlsZSAodGhlCisJCSAqIGZpbGUgaXMgZ3Jvd2luZykgdGhlbiB3ZSAqd2lsbCogYWx0ZXIgdGhlIGlub2RlIHRvIHJlZmxlY3QKKwkJICogdGhlIG5ldyBpX3NpemUuICBCdXQgdGhhdCBpcyBub3QgZG9uZSBoZXJlIC0gaXQgaXMgZG9uZSBpbgorCQkgKiBnZW5lcmljX2NvbW1pdF93cml0ZS0+X19tYXJrX2lub2RlX2RpcnR5LT5leHQ0X2RpcnR5X2lub2RlLgorCQkgKi8KKwkJamJkX2RlYnVnKDUsICJzcGxpY2luZyBpbmRpcmVjdCBvbmx5XG4iKTsKKwkJQlVGRkVSX1RSQUNFKHdoZXJlLT5iaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgd2hlcmUtPmJoKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX291dDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBPSywgd2Ugc3BsaWNlZCBpdCBpbnRvIHRoZSBpbm9kZSBpdHNlbGYgb24gYSBkaXJlY3QgYmxvY2suCisJCSAqLworCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJCWpiZF9kZWJ1Zyg1LCAic3BsaWNpbmcgZGlyZWN0XG4iKTsKKwl9CisJcmV0dXJuIGVycjsKKworZXJyX291dDoKKwlmb3IgKGkgPSAxOyBpIDw9IG51bTsgaSsrKSB7CisJCS8qCisJCSAqIGJyYW5jaFtpXS5iaCBpcyBuZXdseSBhbGxvY2F0ZWQsIHNvIHRoZXJlIGlzIG5vCisJCSAqIG5lZWQgdG8gcmV2b2tlIHRoZSBibG9jaywgd2hpY2ggaXMgd2h5IHdlIGRvbid0CisJCSAqIG5lZWQgdG8gc2V0IEVYVDRfRlJFRV9CTE9DS1NfTUVUQURBVEEuCisJCSAqLworCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIHdoZXJlW2ldLmJoLCAwLCAxLAorCQkJCSBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7CisJfQorCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgTlVMTCwgbGUzMl90b19jcHUod2hlcmVbbnVtXS5rZXkpLAorCQkJIGJsa3MsIDApOworCisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFRoZSBleHQ0X2luZF9tYXBfYmxvY2tzKCkgZnVuY3Rpb24gaGFuZGxlcyBub24tZXh0ZW50cyBpbm9kZXMKKyAqIChpLmUuLCB1c2luZyB0aGUgdHJhZGl0aW9uYWwgaW5kaXJlY3QvZG91YmxlLWluZGlyZWN0IGlfYmxvY2tzCisgKiBzY2hlbWUpIGZvciBleHQ0X21hcF9ibG9ja3MoKS4KKyAqCisgKiBBbGxvY2F0aW9uIHN0cmF0ZWd5IGlzIHNpbXBsZTogaWYgd2UgaGF2ZSB0byBhbGxvY2F0ZSBzb21ldGhpbmcsIHdlIHdpbGwKKyAqIGhhdmUgdG8gZ28gdGhlIHdob2xlIHdheSB0byBsZWFmLiBTbyBsZXQncyBkbyBpdCBiZWZvcmUgYXR0YWNoaW5nIGFueXRoaW5nCisgKiB0byB0cmVlLCBzZXQgbGlua2FnZSBiZXR3ZWVuIHRoZSBuZXdib3JuIGJsb2Nrcywgd3JpdGUgdGhlbSBpZiBzeW5jIGlzCisgKiByZXF1aXJlZCwgcmVjaGVjayB0aGUgcGF0aCwgZnJlZSBhbmQgcmVwZWF0IGlmIGNoZWNrIGZhaWxzLCBvdGhlcndpc2UKKyAqIHNldCB0aGUgbGFzdCBtaXNzaW5nIGxpbmsgKHRoYXQgd2lsbCBwcm90ZWN0IHVzIGZyb20gYW55IHRydW5jYXRlLWdlbmVyYXRlZAorICogcmVtb3ZhbHMgLSBhbGwgYmxvY2tzIG9uIHRoZSBwYXRoIGFyZSBpbW11bmUgbm93KSBhbmQgcG9zc2libHkgZm9yY2UgdGhlCisgKiB3cml0ZSBvbiB0aGUgcGFyZW50IGJsb2NrLgorICogVGhhdCBoYXMgYSBuaWNlIGFkZGl0aW9uYWwgcHJvcGVydHk6IG5vIHNwZWNpYWwgcmVjb3ZlcnkgZnJvbSB0aGUgZmFpbGVkCisgKiBhbGxvY2F0aW9ucyBpcyBuZWVkZWQgLSB3ZSBzaW1wbHkgcmVsZWFzZSBibG9ja3MgYW5kIGRvIG5vdCB0b3VjaCBhbnl0aGluZworICogcmVhY2hhYmxlIGZyb20gaW5vZGUuCisgKgorICogYGhhbmRsZScgY2FuIGJlIE5VTEwgaWYgY3JlYXRlID09IDAuCisgKgorICogcmV0dXJuID4gMCwgIyBvZiBibG9ja3MgbWFwcGVkIG9yIGFsbG9jYXRlZC4KKyAqIHJldHVybiA9IDAsIGlmIHBsYWluIGxvb2t1cCBmYWlsZWQuCisgKiByZXR1cm4gPCAwLCBlcnJvciBjYXNlLgorICoKKyAqIFRoZSBleHQ0X2luZF9nZXRfYmxvY2tzKCkgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aXRoCisgKiBkb3duX3dyaXRlKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKSBpZiBhbGxvY2F0aW5nIGZpbGVzeXN0ZW0KKyAqIGJsb2NrcyAoaS5lLiwgZmxhZ3MgaGFzIEVYVDRfR0VUX0JMT0NLU19DUkVBVEUgc2V0KSBvcgorICogZG93bl9yZWFkKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKSBpZiBub3QgYWxsb2NhdGluZyBmaWxlIHN5c3RlbQorICogYmxvY2tzLgorICovCitpbnQgZXh0NF9pbmRfbWFwX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyAqbWFwLAorCQkJaW50IGZsYWdzKQoreworCWludCBlcnIgPSAtRUlPOworCWV4dDRfbGJsa190IG9mZnNldHNbNF07CisJSW5kaXJlY3QgY2hhaW5bNF07CisJSW5kaXJlY3QgKnBhcnRpYWw7CisJZXh0NF9mc2Jsa190IGdvYWw7CisJaW50IGluZGlyZWN0X2Jsa3M7CisJaW50IGJsb2Nrc190b19ib3VuZGFyeSA9IDA7CisJaW50IGRlcHRoOworCWludCBjb3VudCA9IDA7CisJZXh0NF9mc2Jsa190IGZpcnN0X2Jsb2NrID0gMDsKKworCXRyYWNlX2V4dDRfaW5kX21hcF9ibG9ja3NfZW50ZXIoaW5vZGUsIG1hcC0+bV9sYmxrLCBtYXAtPm1fbGVuLCBmbGFncyk7CisJSl9BU1NFUlQoIShleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKSkpOworCUpfQVNTRVJUKGhhbmRsZSAhPSBOVUxMIHx8IChmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19DUkVBVEUpID09IDApOworCWRlcHRoID0gZXh0NF9ibG9ja190b19wYXRoKGlub2RlLCBtYXAtPm1fbGJsaywgb2Zmc2V0cywKKwkJCQkgICAmYmxvY2tzX3RvX2JvdW5kYXJ5KTsKKworCWlmIChkZXB0aCA9PSAwKQorCQlnb3RvIG91dDsKKworCXBhcnRpYWwgPSBleHQ0X2dldF9icmFuY2goaW5vZGUsIGRlcHRoLCBvZmZzZXRzLCBjaGFpbiwgJmVycik7CisKKwkvKiBTaW1wbGVzdCBjYXNlIC0gYmxvY2sgZm91bmQsIG5vIGFsbG9jYXRpb24gbmVlZGVkICovCisJaWYgKCFwYXJ0aWFsKSB7CisJCWZpcnN0X2Jsb2NrID0gbGUzMl90b19jcHUoY2hhaW5bZGVwdGggLSAxXS5rZXkpOworCQljb3VudCsrOworCQkvKm1hcCBtb3JlIGJsb2NrcyovCisJCXdoaWxlIChjb3VudCA8IG1hcC0+bV9sZW4gJiYgY291bnQgPD0gYmxvY2tzX3RvX2JvdW5kYXJ5KSB7CisJCQlleHQ0X2ZzYmxrX3QgYmxrOworCisJCQlibGsgPSBsZTMyX3RvX2NwdSgqKGNoYWluW2RlcHRoLTFdLnAgKyBjb3VudCkpOworCisJCQlpZiAoYmxrID09IGZpcnN0X2Jsb2NrICsgY291bnQpCisJCQkJY291bnQrKzsKKwkJCWVsc2UKKwkJCQlicmVhazsKKwkJfQorCQlnb3RvIGdvdF9pdDsKKwl9CisKKwkvKiBOZXh0IHNpbXBsZSBjYXNlIC0gcGxhaW4gbG9va3VwIG9yIGZhaWxlZCByZWFkIG9mIGluZGlyZWN0IGJsb2NrICovCisJaWYgKChmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19DUkVBVEUpID09IDAgfHwgZXJyID09IC1FSU8pCisJCWdvdG8gY2xlYW51cDsKKworCS8qCisJICogT2theSwgd2UgbmVlZCB0byBkbyBibG9jayBhbGxvY2F0aW9uLgorCSovCisJZ29hbCA9IGV4dDRfZmluZF9nb2FsKGlub2RlLCBtYXAtPm1fbGJsaywgcGFydGlhbCk7CisKKwkvKiB0aGUgbnVtYmVyIG9mIGJsb2NrcyBuZWVkIHRvIGFsbG9jYXRlIGZvciBbZCx0XWluZGlyZWN0IGJsb2NrcyAqLworCWluZGlyZWN0X2Jsa3MgPSAoY2hhaW4gKyBkZXB0aCkgLSBwYXJ0aWFsIC0gMTsKKworCS8qCisJICogTmV4dCBsb29rIHVwIHRoZSBpbmRpcmVjdCBtYXAgdG8gY291bnQgdGhlIHRvdG9hbCBudW1iZXIgb2YKKwkgKiBkaXJlY3QgYmxvY2tzIHRvIGFsbG9jYXRlIGZvciB0aGlzIGJyYW5jaC4KKwkgKi8KKwljb3VudCA9IGV4dDRfYmxrc190b19hbGxvY2F0ZShwYXJ0aWFsLCBpbmRpcmVjdF9ibGtzLAorCQkJCSAgICAgIG1hcC0+bV9sZW4sIGJsb2Nrc190b19ib3VuZGFyeSk7CisJLyoKKwkgKiBCbG9jayBvdXQgZXh0NF90cnVuY2F0ZSB3aGlsZSB3ZSBhbHRlciB0aGUgdHJlZQorCSAqLworCWVyciA9IGV4dDRfYWxsb2NfYnJhbmNoKGhhbmRsZSwgaW5vZGUsIG1hcC0+bV9sYmxrLCBpbmRpcmVjdF9ibGtzLAorCQkJCSZjb3VudCwgZ29hbCwKKwkJCQlvZmZzZXRzICsgKHBhcnRpYWwgLSBjaGFpbiksIHBhcnRpYWwpOworCisJLyoKKwkgKiBUaGUgZXh0NF9zcGxpY2VfYnJhbmNoIGNhbGwgd2lsbCBmcmVlIGFuZCBmb3JnZXQgYW55IGJ1ZmZlcnMKKwkgKiBvbiB0aGUgbmV3IGNoYWluIGlmIHRoZXJlIGlzIGEgZmFpbHVyZSwgYnV0IHRoYXQgcmlza3MgdXNpbmcKKwkgKiB1cCB0cmFuc2FjdGlvbiBjcmVkaXRzLCBlc3BlY2lhbGx5IGZvciBiaXRtYXBzIHdoZXJlIHRoZQorCSAqIGNyZWRpdHMgY2Fubm90IGJlIHJldHVybmVkLiAgQ2FuIHdlIGhhbmRsZSB0aGlzIHNvbWVob3c/ICBXZQorCSAqIG1heSBuZWVkIHRvIHJldHVybiAtRUFHQUlOIHVwd2FyZHMgaW4gdGhlIHdvcnN0IGNhc2UuICAtLXNjdAorCSAqLworCWlmICghZXJyKQorCQllcnIgPSBleHQ0X3NwbGljZV9icmFuY2goaGFuZGxlLCBpbm9kZSwgbWFwLT5tX2xibGssCisJCQkJCSBwYXJ0aWFsLCBpbmRpcmVjdF9ibGtzLCBjb3VudCk7CisJaWYgKGVycikKKwkJZ290byBjbGVhbnVwOworCisJbWFwLT5tX2ZsYWdzIHw9IEVYVDRfTUFQX05FVzsKKworCWV4dDRfdXBkYXRlX2lub2RlX2ZzeW5jX3RyYW5zKGhhbmRsZSwgaW5vZGUsIDEpOworZ290X2l0OgorCW1hcC0+bV9mbGFncyB8PSBFWFQ0X01BUF9NQVBQRUQ7CisJbWFwLT5tX3BibGsgPSBsZTMyX3RvX2NwdShjaGFpbltkZXB0aC0xXS5rZXkpOworCW1hcC0+bV9sZW4gPSBjb3VudDsKKwlpZiAoY291bnQgPiBibG9ja3NfdG9fYm91bmRhcnkpCisJCW1hcC0+bV9mbGFncyB8PSBFWFQ0X01BUF9CT1VOREFSWTsKKwllcnIgPSBjb3VudDsKKwkvKiBDbGVhbiB1cCBhbmQgZXhpdCAqLworCXBhcnRpYWwgPSBjaGFpbiArIGRlcHRoIC0gMTsJLyogdGhlIHdob2xlIGNoYWluICovCitjbGVhbnVwOgorCXdoaWxlIChwYXJ0aWFsID4gY2hhaW4pIHsKKwkJQlVGRkVSX1RSQUNFKHBhcnRpYWwtPmJoLCAiY2FsbCBicmVsc2UiKTsKKwkJYnJlbHNlKHBhcnRpYWwtPmJoKTsKKwkJcGFydGlhbC0tOworCX0KK291dDoKKwl0cmFjZV9leHQ0X2luZF9tYXBfYmxvY2tzX2V4aXQoaW5vZGUsIG1hcC0+bV9sYmxrLAorCQkJCW1hcC0+bV9wYmxrLCBtYXAtPm1fbGVuLCBlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBPX0RJUkVDVCBmb3IgZXh0MyAob3IgaW5kaXJlY3QgbWFwKSBiYXNlZCBmaWxlcworICoKKyAqIElmIHRoZSBPX0RJUkVDVCB3cml0ZSB3aWxsIGV4dGVuZCB0aGUgZmlsZSB0aGVuIGFkZCB0aGlzIGlub2RlIHRvIHRoZQorICogb3JwaGFuIGxpc3QuICBTbyByZWNvdmVyeSB3aWxsIHRydW5jYXRlIGl0IGJhY2sgdG8gdGhlIG9yaWdpbmFsIHNpemUKKyAqIGlmIHRoZSBtYWNoaW5lIGNyYXNoZXMgZHVyaW5nIHRoZSB3cml0ZS4KKyAqCisgKiBJZiB0aGUgT19ESVJFQ1Qgd3JpdGUgaXMgaW50YW50aWF0aW5nIGhvbGVzIGluc2lkZSBpX3NpemUgYW5kIHRoZSBtYWNoaW5lCisgKiBjcmFzaGVzIHRoZW4gc3RhbGUgZGlzayBkYXRhIF9tYXlfIGJlIGV4cG9zZWQgaW5zaWRlIHRoZSBmaWxlLiBCdXQgY3VycmVudAorICogVkZTIGNvZGUgZmFsbHMgYmFjayBpbnRvIGJ1ZmZlcmVkIHBhdGggaW4gdGhhdCBjYXNlIHNvIHdlIGFyZSBzYWZlLgorICovCitzc2l6ZV90IGV4dDRfaW5kX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwKKwkJCSAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBsb2ZmX3Qgb2Zmc2V0LAorCQkJICAgdW5zaWduZWQgbG9uZyBucl9zZWdzKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKKwloYW5kbGVfdCAqaGFuZGxlOworCXNzaXplX3QgcmV0OworCWludCBvcnBoYW4gPSAwOworCXNpemVfdCBjb3VudCA9IGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKKwlpbnQgcmV0cmllcyA9IDA7CisKKwlpZiAocncgPT0gV1JJVEUpIHsKKwkJbG9mZl90IGZpbmFsX3NpemUgPSBvZmZzZXQgKyBjb3VudDsKKworCQlpZiAoZmluYWxfc2l6ZSA+IGlub2RlLT5pX3NpemUpIHsKKwkJCS8qIENyZWRpdHMgZm9yIHNiICsgaW5vZGUgd3JpdGUgKi8KKwkJCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgMik7CisJCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlyZXQgPSBleHQ0X29ycGhhbl9hZGQoaGFuZGxlLCBpbm9kZSk7CisJCQlpZiAocmV0KSB7CisJCQkJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCW9ycGhhbiA9IDE7CisJCQllaS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCQl9CisJfQorCityZXRyeToKKwlpZiAocncgPT0gUkVBRCAmJiBleHQ0X3Nob3VsZF9kaW9yZWFkX25vbG9jayhpbm9kZSkpCisJCXJldCA9IF9fYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwKKwkJCQkgaW5vZGUtPmlfc2ItPnNfYmRldiwgaW92LAorCQkJCSBvZmZzZXQsIG5yX3NlZ3MsCisJCQkJIGV4dDRfZ2V0X2Jsb2NrLCBOVUxMLCBOVUxMLCAwKTsKKwllbHNlIHsKKwkJcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaW92LAorCQkJCSBvZmZzZXQsIG5yX3NlZ3MsIGV4dDRfZ2V0X2Jsb2NrKTsKKworCQlpZiAodW5saWtlbHkoKHJ3ICYgV1JJVEUpICYmIHJldCA8IDApKSB7CisJCQlsb2ZmX3QgaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJCQlsb2ZmX3QgZW5kID0gb2Zmc2V0ICsgaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOworCisJCQlpZiAoZW5kID4gaXNpemUpCisJCQkJZXh0NF90cnVuY2F0ZV9mYWlsZWRfd3JpdGUoaW5vZGUpOworCQl9CisJfQorCWlmIChyZXQgPT0gLUVOT1NQQyAmJiBleHQ0X3Nob3VsZF9yZXRyeV9hbGxvYyhpbm9kZS0+aV9zYiwgJnJldHJpZXMpKQorCQlnb3RvIHJldHJ5OworCisJaWYgKG9ycGhhbikgeworCQlpbnQgZXJyOworCisJCS8qIENyZWRpdHMgZm9yIHNiICsgaW5vZGUgd3JpdGUgKi8KKwkJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCAyKTsKKwkJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCQkvKiBUaGlzIGlzIHJlYWxseSBiYWQgbHVjay4gV2UndmUgd3JpdHRlbiB0aGUgZGF0YQorCQkJICogYnV0IGNhbm5vdCBleHRlbmQgaV9zaXplLiBCYWlsIG91dCBhbmQgcHJldGVuZAorCQkJICogdGhlIHdyaXRlIGZhaWxlZC4uLiAqLworCQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQkJaWYgKGlub2RlLT5pX25saW5rKQorCQkJCWV4dDRfb3JwaGFuX2RlbChOVUxMLCBpbm9kZSk7CisKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChpbm9kZS0+aV9ubGluaykKKwkJCWV4dDRfb3JwaGFuX2RlbChoYW5kbGUsIGlub2RlKTsKKwkJaWYgKHJldCA+IDApIHsKKwkJCWxvZmZfdCBlbmQgPSBvZmZzZXQgKyByZXQ7CisJCQlpZiAoZW5kID4gaW5vZGUtPmlfc2l6ZSkgeworCQkJCWVpLT5pX2Rpc2tzaXplID0gZW5kOworCQkJCWlfc2l6ZV93cml0ZShpbm9kZSwgZW5kKTsKKwkJCQkvKgorCQkJCSAqIFdlJ3JlIGdvaW5nIHRvIHJldHVybiBhIHBvc2l0aXZlIGByZXQnCisJCQkJICogaGVyZSBkdWUgdG8gbm9uLXplcm8tbGVuZ3RoIEkvTywgc28gdGhlcmUncworCQkJCSAqIG5vIHdheSBvZiByZXBvcnRpbmcgZXJyb3IgcmV0dXJucyBmcm9tCisJCQkJICogZXh0NF9tYXJrX2lub2RlX2RpcnR5KCkgdG8gdXNlcnNwYWNlLiAgU28KKwkJCQkgKiBpZ25vcmUgaXQuCisJCQkJICovCisJCQkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCQkJfQorCQl9CisJCWVyciA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldCA9IGVycjsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG1ldGFkYXRhIGJsb2NrcyBuZWVkIHRvIHJlc2VydmUKKyAqIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrIGF0IEBsYmxvY2tzIGZvciBub24gZXh0ZW50IGZpbGUgYmFzZWQgZmlsZQorICovCitpbnQgZXh0NF9pbmRfY2FsY19tZXRhZGF0YV9hbW91bnQoc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgbGJsb2NrKQoreworCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKKwlzZWN0b3JfdCBkaW5kX21hc2sgPSB+KChzZWN0b3JfdClFWFQ0X0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKSAtIDEpOworCWludCBibGtfYml0czsKKworCWlmIChsYmxvY2sgPCBFWFQ0X05ESVJfQkxPQ0tTKQorCQlyZXR1cm4gMDsKKworCWxibG9jayAtPSBFWFQ0X05ESVJfQkxPQ0tTOworCisJaWYgKGVpLT5pX2RhX21ldGFkYXRhX2NhbGNfbGVuICYmCisJICAgIChsYmxvY2sgJiBkaW5kX21hc2spID09IGVpLT5pX2RhX21ldGFkYXRhX2NhbGNfbGFzdF9sYmxvY2spIHsKKwkJZWktPmlfZGFfbWV0YWRhdGFfY2FsY19sZW4rKzsKKwkJcmV0dXJuIDA7CisJfQorCWVpLT5pX2RhX21ldGFkYXRhX2NhbGNfbGFzdF9sYmxvY2sgPSBsYmxvY2sgJiBkaW5kX21hc2s7CisJZWktPmlfZGFfbWV0YWRhdGFfY2FsY19sZW4gPSAxOworCWJsa19iaXRzID0gb3JkZXJfYmFzZV8yKGxibG9jayk7CisJcmV0dXJuIChibGtfYml0cyAvIEVYVDRfQUREUl9QRVJfQkxPQ0tfQklUUyhpbm9kZS0+aV9zYikpICsgMTsKK30KKworaW50IGV4dDRfaW5kX3RyYW5zX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbnJibG9ja3MsIGludCBjaHVuaykKK3sKKwlpbnQgaW5kaXJlY3RzOworCisJLyogaWYgbnJibG9ja3MgYXJlIGNvbnRpZ3VvdXMgKi8KKwlpZiAoY2h1bmspIHsKKwkJLyoKKwkJICogV2l0aCBOIGNvbnRpZ3VvdXMgZGF0YSBibG9ja3MsIHdlIG5lZWQgYXQgbW9zdAorCQkgKiBOL0VYVDRfQUREUl9QRVJfQkxPQ0soaW5vZGUtPmlfc2IpICsgMSBpbmRpcmVjdCBibG9ja3MsCisJCSAqIDIgZGluZGlyZWN0IGJsb2NrcywgYW5kIDEgdGluZGlyZWN0IGJsb2NrCisJCSAqLworCQlyZXR1cm4gRElWX1JPVU5EX1VQKG5yYmxvY2tzLAorCQkJCSAgICBFWFQ0X0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKSkgKyA0OworCX0KKwkvKgorCSAqIGlmIG5yYmxvY2tzIGFyZSBub3QgY29udGlndW91cywgd29yc2UgY2FzZSwgZWFjaCBibG9jayB0b3VjaAorCSAqIGEgaW5kaXJlY3QgYmxvY2ssIGFuZCBlYWNoIGluZGlyZWN0IGJsb2NrIHRvdWNoIGEgZG91YmxlIGluZGlyZWN0CisJICogYmxvY2ssIHBsdXMgYSB0cmlwbGUgaW5kaXJlY3QgYmxvY2sKKwkgKi8KKwlpbmRpcmVjdHMgPSBucmJsb2NrcyAqIDIgKyAxOworCXJldHVybiBpbmRpcmVjdHM7Cit9CisKKy8qCisgKiBUcnVuY2F0ZSB0cmFuc2FjdGlvbnMgY2FuIGJlIGNvbXBsZXggYW5kIGFic29sdXRlbHkgaHVnZS4gIFNvIHdlIG5lZWQgdG8KKyAqIGJlIGFibGUgdG8gcmVzdGFydCB0aGUgdHJhbnNhY3Rpb24gYXQgYSBjb252ZW50aWVudCBjaGVja3BvaW50IHRvIG1ha2UKKyAqIHN1cmUgd2UgZG9uJ3Qgb3ZlcmZsb3cgdGhlIGpvdXJuYWwuCisgKgorICogc3RhcnRfdHJhbnNhY3Rpb24gZ2V0cyB1cyBhIG5ldyBoYW5kbGUgZm9yIGEgdHJ1bmNhdGUgdHJhbnNhY3Rpb24sCisgKiBhbmQgZXh0ZW5kX3RyYW5zYWN0aW9uIHRyaWVzIHRvIGV4dGVuZCB0aGUgZXhpc3Rpbmcgb25lIGEgYml0LiAgSWYKKyAqIGV4dGVuZCBmYWlscywgd2UgbmVlZCB0byBwcm9wYWdhdGUgdGhlIGZhaWx1cmUgdXAgYW5kIHJlc3RhcnQgdGhlCisgKiB0cmFuc2FjdGlvbiBpbiB0aGUgdG9wLWxldmVsIHRydW5jYXRlIGxvb3AuIC0tc2N0CisgKi8KK3N0YXRpYyBoYW5kbGVfdCAqc3RhcnRfdHJhbnNhY3Rpb24oc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwloYW5kbGVfdCAqcmVzdWx0OworCisJcmVzdWx0ID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBleHQ0X2Jsb2Nrc19mb3JfdHJ1bmNhdGUoaW5vZGUpKTsKKwlpZiAoIUlTX0VSUihyZXN1bHQpKQorCQlyZXR1cm4gcmVzdWx0OworCisJZXh0NF9zdGRfZXJyb3IoaW5vZGUtPmlfc2IsIFBUUl9FUlIocmVzdWx0KSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFRyeSB0byBleHRlbmQgdGhpcyB0cmFuc2FjdGlvbiBmb3IgdGhlIHB1cnBvc2VzIG9mIHRydW5jYXRpb24uCisgKgorICogUmV0dXJucyAwIGlmIHdlIG1hbmFnZWQgdG8gY3JlYXRlIG1vcmUgcm9vbS4gIElmIHdlIGNhbid0IGNyZWF0ZSBtb3JlCisgKiByb29tLCBhbmQgdGhlIHRyYW5zYWN0aW9uIG11c3QgYmUgcmVzdGFydGVkIHdlIHJldHVybiAxLgorICovCitzdGF0aWMgaW50IHRyeV90b19leHRlbmRfdHJhbnNhY3Rpb24oaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoIWV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpCisJCXJldHVybiAwOworCWlmIChleHQ0X2hhbmRsZV9oYXNfZW5vdWdoX2NyZWRpdHMoaGFuZGxlLCBFWFQ0X1JFU0VSVkVfVFJBTlNfQkxPQ0tTKzEpKQorCQlyZXR1cm4gMDsKKwlpZiAoIWV4dDRfam91cm5hbF9leHRlbmQoaGFuZGxlLCBleHQ0X2Jsb2Nrc19mb3JfdHJ1bmNhdGUoaW5vZGUpKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBQcm9iYWJseSBpdCBzaG91bGQgYmUgYSBsaWJyYXJ5IGZ1bmN0aW9uLi4uIHNlYXJjaCBmb3IgZmlyc3Qgbm9uLXplcm8gd29yZAorICogb3IgbWVtY21wIHdpdGggemVyb19wYWdlLCB3aGF0ZXZlciBpcyBiZXR0ZXIgZm9yIHBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlLgorICogTGludXM/CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGFsbF96ZXJvZXMoX19sZTMyICpwLCBfX2xlMzIgKnEpCit7CisJd2hpbGUgKHAgPCBxKQorCQlpZiAoKnArKykKKwkJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKioKKyAqCWV4dDRfZmluZF9zaGFyZWQgLSBmaW5kIHRoZSBpbmRpcmVjdCBibG9ja3MgZm9yIHBhcnRpYWwgdHJ1bmNhdGlvbi4KKyAqCUBpbm9kZToJICBpbm9kZSBpbiBxdWVzdGlvbgorICoJQGRlcHRoOgkgIGRlcHRoIG9mIHRoZSBhZmZlY3RlZCBicmFuY2gKKyAqCUBvZmZzZXRzOiBvZmZzZXRzIG9mIHBvaW50ZXJzIGluIHRoYXQgYnJhbmNoIChzZWUgZXh0NF9ibG9ja190b19wYXRoKQorICoJQGNoYWluOgkgIHBsYWNlIHRvIHN0b3JlIHRoZSBwb2ludGVycyB0byBwYXJ0aWFsIGluZGlyZWN0IGJsb2NrcworICoJQHRvcDoJICBwbGFjZSB0byB0aGUgKGRldGFjaGVkKSB0b3Agb2YgYnJhbmNoCisgKgorICoJVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIGJ5IGV4dDRfdHJ1bmNhdGUoKS4KKyAqCisgKglXaGVuIHdlIGRvIHRydW5jYXRlKCkgd2UgbWF5IGhhdmUgdG8gY2xlYW4gdGhlIGVuZHMgb2Ygc2V2ZXJhbAorICoJaW5kaXJlY3QgYmxvY2tzIGJ1dCBsZWF2ZSB0aGUgYmxvY2tzIHRoZW1zZWx2ZXMgYWxpdmUuIEJsb2NrIGlzCisgKglwYXJ0aWFsbHkgdHJ1bmNhdGVkIGlmIHNvbWUgZGF0YSBiZWxvdyB0aGUgbmV3IGlfc2l6ZSBpcyByZWZlcnJlZAorICoJZnJvbSBpdCAoYW5kIGl0IGlzIG9uIHRoZSBwYXRoIHRvIHRoZSBmaXJzdCBjb21wbGV0ZWx5IHRydW5jYXRlZAorICoJZGF0YSBibG9jaywgaW5kZWVkKS4gIFdlIGhhdmUgdG8gZnJlZSB0aGUgdG9wIG9mIHRoYXQgcGF0aCBhbG9uZworICoJd2l0aCBldmVyeXRoaW5nIHRvIHRoZSByaWdodCBvZiB0aGUgcGF0aC4gU2luY2Ugbm8gYWxsb2NhdGlvbgorICoJcGFzdCB0aGUgdHJ1bmNhdGlvbiBwb2ludCBpcyBwb3NzaWJsZSB1bnRpbCBleHQ0X3RydW5jYXRlKCkKKyAqCWZpbmlzaGVzLCB3ZSBtYXkgc2FmZWx5IGRvIHRoZSBsYXR0ZXIsIGJ1dCB0b3Agb2YgYnJhbmNoIG1heQorICoJcmVxdWlyZSBzcGVjaWFsIGF0dGVudGlvbiAtIHBhZ2VvdXQgYmVsb3cgdGhlIHRydW5jYXRpb24gcG9pbnQKKyAqCW1pZ2h0IHRyeSB0byBwb3B1bGF0ZSBpdC4KKyAqCisgKglXZSBhdG9taWNhbGx5IGRldGFjaCB0aGUgdG9wIG9mIGJyYW5jaCBmcm9tIHRoZSB0cmVlLCBzdG9yZSB0aGUKKyAqCWJsb2NrIG51bWJlciBvZiBpdHMgcm9vdCBpbiAqQHRvcCwgcG9pbnRlcnMgdG8gYnVmZmVyX2hlYWRzIG9mCisgKglwYXJ0aWFsbHkgdHJ1bmNhdGVkIGJsb2NrcyAtIGluIEBjaGFpbltdLmJoIGFuZCBwb2ludGVycyB0bworICoJdGhlaXIgbGFzdCBlbGVtZW50cyB0aGF0IHNob3VsZCBub3QgYmUgcmVtb3ZlZCAtIGluCisgKglAY2hhaW5bXS5wLiBSZXR1cm4gdmFsdWUgaXMgdGhlIHBvaW50ZXIgdG8gbGFzdCBmaWxsZWQgZWxlbWVudAorICoJb2YgQGNoYWluLgorICoKKyAqCVRoZSB3b3JrIGxlZnQgdG8gY2FsbGVyIHRvIGRvIHRoZSBhY3R1YWwgZnJlZWluZyBvZiBzdWJ0cmVlczoKKyAqCQlhKSBmcmVlIHRoZSBzdWJ0cmVlIHN0YXJ0aW5nIGZyb20gKkB0b3AKKyAqCQliKSBmcmVlIHRoZSBzdWJ0cmVlcyB3aG9zZSByb290cyBhcmUgc3RvcmVkIGluCisgKgkJCShAY2hhaW5baV0ucCsxIC4uIGVuZCBvZiBAY2hhaW5baV0uYmgtPmJfZGF0YSkKKyAqCQljKSBmcmVlIHRoZSBzdWJ0cmVlcyBncm93aW5nIGZyb20gdGhlIGlub2RlIHBhc3QgdGhlIEBjaGFpblswXS4KKyAqCQkJKG5vIHBhcnRpYWxseSB0cnVuY2F0ZWQgc3R1ZmYgdGhlcmUpLiAgKi8KKworc3RhdGljIEluZGlyZWN0ICpleHQ0X2ZpbmRfc2hhcmVkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBkZXB0aCwKKwkJCQkgIGV4dDRfbGJsa190IG9mZnNldHNbNF0sIEluZGlyZWN0IGNoYWluWzRdLAorCQkJCSAgX19sZTMyICp0b3ApCit7CisJSW5kaXJlY3QgKnBhcnRpYWwsICpwOworCWludCBrLCBlcnI7CisKKwkqdG9wID0gMDsKKwkvKiBNYWtlIGsgaW5kZXggdGhlIGRlZXBlc3Qgbm9uLW51bGwgb2Zmc2V0ICsgMSAqLworCWZvciAoayA9IGRlcHRoOyBrID4gMSAmJiAhb2Zmc2V0c1trLTFdOyBrLS0pCisJCTsKKwlwYXJ0aWFsID0gZXh0NF9nZXRfYnJhbmNoKGlub2RlLCBrLCBvZmZzZXRzLCBjaGFpbiwgJmVycik7CisJLyogV3JpdGVyOiBwb2ludGVycyAqLworCWlmICghcGFydGlhbCkKKwkJcGFydGlhbCA9IGNoYWluICsgay0xOworCS8qCisJICogSWYgdGhlIGJyYW5jaCBhY3F1aXJlZCBjb250aW51YXRpb24gc2luY2Ugd2UndmUgbG9va2VkIGF0IGl0IC0KKwkgKiBmaW5lLCBpdCBzaG91bGQgYWxsIHN1cnZpdmUgYW5kIChuZXcpIHRvcCBkb2Vzbid0IGJlbG9uZyB0byB1cy4KKwkgKi8KKwlpZiAoIXBhcnRpYWwtPmtleSAmJiAqcGFydGlhbC0+cCkKKwkJLyogV3JpdGVyOiBlbmQgKi8KKwkJZ290byBub190b3A7CisJZm9yIChwID0gcGFydGlhbDsgKHAgPiBjaGFpbikgJiYgYWxsX3plcm9lcygoX19sZTMyICopIHAtPmJoLT5iX2RhdGEsIHAtPnApOyBwLS0pCisJCTsKKwkvKgorCSAqIE9LLCB3ZSd2ZSBmb3VuZCB0aGUgbGFzdCBibG9jayB0aGF0IG11c3Qgc3Vydml2ZS4gVGhlIHJlc3Qgb2Ygb3VyCisJICogYnJhbmNoIHNob3VsZCBiZSBkZXRhY2hlZCBiZWZvcmUgdW5sb2NraW5nLiBIb3dldmVyLCBpZiB0aGF0IHJlc3QKKwkgKiBvZiBicmFuY2ggaXMgYWxsIG91cnMgYW5kIGRvZXMgbm90IGdyb3cgaW1tZWRpYXRlbHkgZnJvbSB0aGUgaW5vZGUKKwkgKiBpdCdzIGVhc2llciB0byBjaGVhdCBhbmQganVzdCBkZWNyZW1lbnQgcGFydGlhbC0+cC4KKwkgKi8KKwlpZiAocCA9PSBjaGFpbiArIGsgLSAxICYmIHAgPiBjaGFpbikgeworCQlwLT5wLS07CisJfSBlbHNlIHsKKwkJKnRvcCA9ICpwLT5wOworCQkvKiBOb3BlLCBkb24ndCBkbyB0aGlzIGluIGV4dDQuICBNdXN0IGxlYXZlIHRoZSB0cmVlIGludGFjdCAqLworI2lmIDAKKwkJKnAtPnAgPSAwOworI2VuZGlmCisJfQorCS8qIFdyaXRlcjogZW5kICovCisKKwl3aGlsZSAocGFydGlhbCA+IHApIHsKKwkJYnJlbHNlKHBhcnRpYWwtPmJoKTsKKwkJcGFydGlhbC0tOworCX0KK25vX3RvcDoKKwlyZXR1cm4gcGFydGlhbDsKK30KKworLyoKKyAqIFplcm8gYSBudW1iZXIgb2YgYmxvY2sgcG9pbnRlcnMgaW4gZWl0aGVyIGFuIGlub2RlIG9yIGFuIGluZGlyZWN0IGJsb2NrLgorICogSWYgd2UgcmVzdGFydCB0aGUgdHJhbnNhY3Rpb24gd2UgbXVzdCBhZ2FpbiBnZXQgd3JpdGUgYWNjZXNzIHRvIHRoZQorICogaW5kaXJlY3QgYmxvY2sgZm9yIGZ1cnRoZXIgbW9kaWZpY2F0aW9uLgorICoKKyAqIFdlIHJlbGVhc2UgYGNvdW50JyBibG9ja3Mgb24gZGlzaywgYnV0IChsYXN0IC0gZmlyc3QpIG1heSBiZSBncmVhdGVyCisgKiB0aGFuIGBjb3VudCcgYmVjYXVzZSB0aGVyZSBjYW4gYmUgaG9sZXMgaW4gdGhlcmUuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcywgMSBvbiBpbnZhbGlkIGJsb2NrIHJhbmdlCisgKiBhbmQgPCAwIG9uIGZhdGFsIGVycm9yLgorICovCitzdGF0aWMgaW50IGV4dDRfY2xlYXJfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkgICAgIGV4dDRfZnNibGtfdCBibG9ja190b19mcmVlLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCBfX2xlMzIgKmZpcnN0LAorCQkJICAgICBfX2xlMzIgKmxhc3QpCit7CisJX19sZTMyICpwOworCWludAlmbGFncyA9IEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUIHwgRVhUNF9GUkVFX0JMT0NLU19WQUxJREFURUQ7CisJaW50CWVycjsKKworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCWZsYWdzIHw9IEVYVDRfRlJFRV9CTE9DS1NfTUVUQURBVEE7CisKKwlpZiAoIWV4dDRfZGF0YV9ibG9ja192YWxpZChFWFQ0X1NCKGlub2RlLT5pX3NiKSwgYmxvY2tfdG9fZnJlZSwKKwkJCQkgICBjb3VudCkpIHsKKwkJRVhUNF9FUlJPUl9JTk9ERShpbm9kZSwgImF0dGVtcHQgdG8gY2xlYXIgaW52YWxpZCAiCisJCQkJICJibG9ja3MgJWxsdSBsZW4gJWx1IiwKKwkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgYmxvY2tfdG9fZnJlZSwgY291bnQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAodHJ5X3RvX2V4dGVuZF90cmFuc2FjdGlvbihoYW5kbGUsIGlub2RlKSkgeworCQlpZiAoYmgpIHsKKwkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKwkJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGJoKTsKKwkJCWlmICh1bmxpa2VseShlcnIpKQorCQkJCWdvdG8gb3V0X2VycjsKKwkJfQorCQllcnIgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJCWlmICh1bmxpa2VseShlcnIpKQorCQkJZ290byBvdXRfZXJyOworCQllcnIgPSBleHQ0X3RydW5jYXRlX3Jlc3RhcnRfdHJhbnMoaGFuZGxlLCBpbm9kZSwKKwkJCQkJZXh0NF9ibG9ja3NfZm9yX3RydW5jYXRlKGlub2RlKSk7CisJCWlmICh1bmxpa2VseShlcnIpKQorCQkJZ290byBvdXRfZXJyOworCQlpZiAoYmgpIHsKKwkJCUJVRkZFUl9UUkFDRShiaCwgInJldGFraW5nIHdyaXRlIGFjY2VzcyIpOworCQkJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7CisJCQlpZiAodW5saWtlbHkoZXJyKSkKKwkJCQlnb3RvIG91dF9lcnI7CisJCX0KKwl9CisKKwlmb3IgKHAgPSBmaXJzdDsgcCA8IGxhc3Q7IHArKykKKwkJKnAgPSAwOworCisJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLCBibG9ja190b19mcmVlLCBjb3VudCwgZmxhZ3MpOworCXJldHVybiAwOworb3V0X2VycjoKKwlleHQ0X3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGV4dDRfZnJlZV9kYXRhIC0gZnJlZSBhIGxpc3Qgb2YgZGF0YSBibG9ja3MKKyAqIEBoYW5kbGU6CWhhbmRsZSBmb3IgdGhpcyB0cmFuc2FjdGlvbgorICogQGlub2RlOglpbm9kZSB3ZSBhcmUgZGVhbGluZyB3aXRoCisgKiBAdGhpc19iaDoJaW5kaXJlY3QgYnVmZmVyX2hlYWQgd2hpY2ggY29udGFpbnMgKkBmaXJzdCBhbmQgKkBsYXN0CisgKiBAZmlyc3Q6CWFycmF5IG9mIGJsb2NrIG51bWJlcnMKKyAqIEBsYXN0Oglwb2ludHMgaW1tZWRpYXRlbHkgcGFzdCB0aGUgZW5kIG9mIGFycmF5CisgKgorICogV2UgYXJlIGZyZWVpbmcgYWxsIGJsb2NrcyByZWZlcnJlZCBmcm9tIHRoYXQgYXJyYXkgKG51bWJlcnMgYXJlIHN0b3JlZCBhcworICogbGl0dGxlLWVuZGlhbiAzMi1iaXQpIGFuZCB1cGRhdGluZyBAaW5vZGUtPmlfYmxvY2tzIGFwcHJvcHJpYXRlbHkuCisgKgorICogV2UgYWNjdW11bGF0ZSBjb250aWd1b3VzIHJ1bnMgb2YgYmxvY2tzIHRvIGZyZWUuICBDb252ZW5pZW50bHksIGlmIHRoZXNlCisgKiBibG9ja3MgYXJlIGNvbnRpZ3VvdXMgdGhlbiByZWxlYXNpbmcgdGhlbSBhdCBvbmUgdGltZSB3aWxsIG9ubHkgYWZmZWN0IG9uZQorICogb3IgdHdvIGJpdG1hcCBibG9ja3MgKCsgZ3JvdXAgZGVzY3JpcHRvcihzKSBhbmQgc3VwZXJibG9jaykgYW5kIHdlIHdvbid0CisgKiBhY3R1YWxseSB1c2UgYSBsb3Qgb2Ygam91cm5hbCBzcGFjZS4KKyAqCisgKiBAdGhpc19iaCB3aWxsIGJlICVOVUxMIGlmIEBmaXJzdCBhbmQgQGxhc3QgcG9pbnQgaW50byB0aGUgaW5vZGUncyBkaXJlY3QKKyAqIGJsb2NrIHBvaW50ZXJzLgorICovCitzdGF0aWMgdm9pZCBleHQ0X2ZyZWVfZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICp0aGlzX2JoLAorCQkJICAgX19sZTMyICpmaXJzdCwgX19sZTMyICpsYXN0KQoreworCWV4dDRfZnNibGtfdCBibG9ja190b19mcmVlID0gMDsgICAgLyogU3RhcnRpbmcgYmxvY2sgIyBvZiBhIHJ1biAqLworCXVuc2lnbmVkIGxvbmcgY291bnQgPSAwOwkgICAgLyogTnVtYmVyIG9mIGJsb2NrcyBpbiB0aGUgcnVuICovCisJX19sZTMyICpibG9ja190b19mcmVlX3AgPSBOVUxMOwkgICAgLyogUG9pbnRlciBpbnRvIGlub2RlL2luZAorCQkJCQkgICAgICAgY29ycmVzcG9uZGluZyB0bworCQkJCQkgICAgICAgYmxvY2tfdG9fZnJlZSAqLworCWV4dDRfZnNibGtfdCBucjsJCSAgICAvKiBDdXJyZW50IGJsb2NrICMgKi8KKwlfX2xlMzIgKnA7CQkJICAgIC8qIFBvaW50ZXIgaW50byBpbm9kZS9pbmQKKwkJCQkJICAgICAgIGZvciBjdXJyZW50IGJsb2NrICovCisJaW50IGVyciA9IDA7CisKKwlpZiAodGhpc19iaCkgewkJCQkvKiBGb3IgaW5kaXJlY3QgYmxvY2sgKi8KKwkJQlVGRkVSX1RSQUNFKHRoaXNfYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgdGhpc19iaCk7CisJCS8qIEltcG9ydGFudDogaWYgd2UgY2FuJ3QgdXBkYXRlIHRoZSBpbmRpcmVjdCBwb2ludGVycworCQkgKiB0byB0aGUgYmxvY2tzLCB3ZSBjYW4ndCBmcmVlIHRoZW0uICovCisJCWlmIChlcnIpCisJCQlyZXR1cm47CisJfQorCisJZm9yIChwID0gZmlyc3Q7IHAgPCBsYXN0OyBwKyspIHsKKwkJbnIgPSBsZTMyX3RvX2NwdSgqcCk7CisJCWlmIChucikgeworCQkJLyogYWNjdW11bGF0ZSBibG9ja3MgdG8gZnJlZSBpZiB0aGV5J3JlIGNvbnRpZ3VvdXMgKi8KKwkJCWlmIChjb3VudCA9PSAwKSB7CisJCQkJYmxvY2tfdG9fZnJlZSA9IG5yOworCQkJCWJsb2NrX3RvX2ZyZWVfcCA9IHA7CisJCQkJY291bnQgPSAxOworCQkJfSBlbHNlIGlmIChuciA9PSBibG9ja190b19mcmVlICsgY291bnQpIHsKKwkJCQljb3VudCsrOworCQkJfSBlbHNlIHsKKwkJCQllcnIgPSBleHQ0X2NsZWFyX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCB0aGlzX2JoLAorCQkJCQkJICAgICAgICBibG9ja190b19mcmVlLCBjb3VudCwKKwkJCQkJCSAgICAgICAgYmxvY2tfdG9fZnJlZV9wLCBwKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlicmVhazsKKwkJCQlibG9ja190b19mcmVlID0gbnI7CisJCQkJYmxvY2tfdG9fZnJlZV9wID0gcDsKKwkJCQljb3VudCA9IDE7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIWVyciAmJiBjb3VudCA+IDApCisJCWVyciA9IGV4dDRfY2xlYXJfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIHRoaXNfYmgsIGJsb2NrX3RvX2ZyZWUsCisJCQkJCWNvdW50LCBibG9ja190b19mcmVlX3AsIHApOworCWlmIChlcnIgPCAwKQorCQkvKiBmYXRhbCBlcnJvciAqLworCQlyZXR1cm47CisKKwlpZiAodGhpc19iaCkgeworCQlCVUZGRVJfVFJBQ0UodGhpc19iaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKKworCQkvKgorCQkgKiBUaGUgYnVmZmVyIGhlYWQgc2hvdWxkIGhhdmUgYW4gYXR0YWNoZWQgam91cm5hbCBoZWFkIGF0IHRoaXMKKwkJICogcG9pbnQuIEhvd2V2ZXIsIGlmIHRoZSBkYXRhIGlzIGNvcnJ1cHRlZCBhbmQgYW4gaW5kaXJlY3QKKwkJICogYmxvY2sgcG9pbnRlZCB0byBpdHNlbGYsIGl0IHdvdWxkIGhhdmUgYmVlbiBkZXRhY2hlZCB3aGVuCisJCSAqIHRoZSBibG9jayB3YXMgY2xlYXJlZC4gQ2hlY2sgZm9yIHRoaXMgaW5zdGVhZCBvZiBPT1BTaW5nLgorCQkgKi8KKwkJaWYgKChFWFQ0X0pPVVJOQUwoaW5vZGUpID09IE5VTEwpIHx8IGJoMmpoKHRoaXNfYmgpKQorCQkJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgdGhpc19iaCk7CisJCWVsc2UKKwkJCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsCisJCQkJCSAiY2lyY3VsYXIgaW5kaXJlY3QgYmxvY2sgZGV0ZWN0ZWQgYXQgIgorCQkJCQkgImJsb2NrICVsbHUiLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHRoaXNfYmgtPmJfYmxvY2tucik7CisJfQorfQorCisvKioKKyAqCWV4dDRfZnJlZV9icmFuY2hlcyAtIGZyZWUgYW4gYXJyYXkgb2YgYnJhbmNoZXMKKyAqCUBoYW5kbGU6IEpCRCBoYW5kbGUgZm9yIHRoaXMgdHJhbnNhY3Rpb24KKyAqCUBpbm9kZToJaW5vZGUgd2UgYXJlIGRlYWxpbmcgd2l0aAorICoJQHBhcmVudF9iaDogdGhlIGJ1ZmZlcl9oZWFkIHdoaWNoIGNvbnRhaW5zICpAZmlyc3QgYW5kICpAbGFzdAorICoJQGZpcnN0OglhcnJheSBvZiBibG9jayBudW1iZXJzCisgKglAbGFzdDoJcG9pbnRlciBpbW1lZGlhdGVseSBwYXN0IHRoZSBlbmQgb2YgYXJyYXkKKyAqCUBkZXB0aDoJZGVwdGggb2YgdGhlIGJyYW5jaGVzIHRvIGZyZWUKKyAqCisgKglXZSBhcmUgZnJlZWluZyBhbGwgYmxvY2tzIHJlZmVycmVkIGZyb20gdGhlc2UgYnJhbmNoZXMgKG51bWJlcnMgYXJlCisgKglzdG9yZWQgYXMgbGl0dGxlLWVuZGlhbiAzMi1iaXQpIGFuZCB1cGRhdGluZyBAaW5vZGUtPmlfYmxvY2tzCisgKglhcHByb3ByaWF0ZWx5LgorICovCitzdGF0aWMgdm9pZCBleHQ0X2ZyZWVfYnJhbmNoZXMoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBhcmVudF9iaCwKKwkJCSAgICAgICBfX2xlMzIgKmZpcnN0LCBfX2xlMzIgKmxhc3QsIGludCBkZXB0aCkKK3sKKwlleHQ0X2ZzYmxrX3QgbnI7CisJX19sZTMyICpwOworCisJaWYgKGV4dDRfaGFuZGxlX2lzX2Fib3J0ZWQoaGFuZGxlKSkKKwkJcmV0dXJuOworCisJaWYgKGRlcHRoLS0pIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwkJaW50IGFkZHJfcGVyX2Jsb2NrID0gRVhUNF9BRERSX1BFUl9CTE9DSyhpbm9kZS0+aV9zYik7CisJCXAgPSBsYXN0OworCQl3aGlsZSAoLS1wID49IGZpcnN0KSB7CisJCQluciA9IGxlMzJfdG9fY3B1KCpwKTsKKwkJCWlmICghbnIpCisJCQkJY29udGludWU7CQkvKiBBIGhvbGUgKi8KKworCQkJaWYgKCFleHQ0X2RhdGFfYmxvY2tfdmFsaWQoRVhUNF9TQihpbm9kZS0+aV9zYiksCisJCQkJCQkgICBuciwgMSkpIHsKKwkJCQlFWFQ0X0VSUk9SX0lOT0RFKGlub2RlLAorCQkJCQkJICJpbnZhbGlkIGluZGlyZWN0IG1hcHBlZCAiCisJCQkJCQkgImJsb2NrICVsdSAobGV2ZWwgJWQpIiwKKwkJCQkJCSAodW5zaWduZWQgbG9uZykgbnIsIGRlcHRoKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogR28gcmVhZCB0aGUgYnVmZmVyIGZvciB0aGUgbmV4dCBsZXZlbCBkb3duICovCisJCQliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBucik7CisKKwkJCS8qCisJCQkgKiBBIHJlYWQgZmFpbHVyZT8gUmVwb3J0IGVycm9yIGFuZCBjbGVhciBzbG90CisJCQkgKiAoc2hvdWxkIGJlIHJhcmUpLgorCQkJICovCisJCQlpZiAoIWJoKSB7CisJCQkJRVhUNF9FUlJPUl9JTk9ERV9CTE9DSyhpbm9kZSwgbnIsCisJCQkJCQkgICAgICAgIlJlYWQgZmFpbHVyZSIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBUaGlzIHphcHMgdGhlIGVudGlyZSBibG9jay4gIEJvdHRvbSB1cC4gKi8KKwkJCUJVRkZFUl9UUkFDRShiaCwgImZyZWUgY2hpbGQgYnJhbmNoZXMiKTsKKwkJCWV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBiaCwKKwkJCQkJKF9fbGUzMiAqKSBiaC0+Yl9kYXRhLAorCQkJCQkoX19sZTMyICopIGJoLT5iX2RhdGEgKyBhZGRyX3Blcl9ibG9jaywKKwkJCQkJZGVwdGgpOworCQkJYnJlbHNlKGJoKTsKKworCQkJLyoKKwkJCSAqIEV2ZXJ5dGhpbmcgYmVsb3cgdGhpcyB0aGlzIHBvaW50ZXIgaGFzIGJlZW4KKwkJCSAqIHJlbGVhc2VkLiAgTm93IGxldCB0aGlzIHRvcC1vZi1zdWJ0cmVlIGdvLgorCQkJICoKKwkJCSAqIFdlIHdhbnQgdGhlIGZyZWVpbmcgb2YgdGhpcyBpbmRpcmVjdCBibG9jayB0byBiZQorCQkJICogYXRvbWljIGluIHRoZSBqb3VybmFsIHdpdGggdGhlIHVwZGF0aW5nIG9mIHRoZQorCQkJICogYml0bWFwIGJsb2NrIHdoaWNoIG93bnMgaXQuICBTbyBtYWtlIHNvbWUgcm9vbSBpbgorCQkJICogdGhlIGpvdXJuYWwuCisJCQkgKgorCQkJICogV2UgemVybyB0aGUgcGFyZW50IHBvaW50ZXIgKmFmdGVyKiBmcmVlaW5nIGl0cworCQkJICogcG9pbnRlZSBpbiB0aGUgYml0bWFwcywgc28gaWYgZXh0ZW5kX3RyYW5zYWN0aW9uKCkKKwkJCSAqIGZvciBzb21lIHJlYXNvbiBmYWlscyB0byBwdXQgdGhlIGJpdG1hcCBjaGFuZ2VzIGFuZAorCQkJICogdGhlIHJlbGVhc2UgaW50byB0aGUgc2FtZSB0cmFuc2FjdGlvbiwgcmVjb3ZlcnkKKwkJCSAqIHdpbGwgbWVyZWx5IGNvbXBsYWluIGFib3V0IHJlbGVhc2luZyBhIGZyZWUgYmxvY2ssCisJCQkgKiByYXRoZXIgdGhhbiBsZWFraW5nIGJsb2Nrcy4KKwkJCSAqLworCQkJaWYgKGV4dDRfaGFuZGxlX2lzX2Fib3J0ZWQoaGFuZGxlKSkKKwkJCQlyZXR1cm47CisJCQlpZiAodHJ5X3RvX2V4dGVuZF90cmFuc2FjdGlvbihoYW5kbGUsIGlub2RlKSkgeworCQkJCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwkJCQlleHQ0X3RydW5jYXRlX3Jlc3RhcnRfdHJhbnMoaGFuZGxlLCBpbm9kZSwKKwkJCQkJICAgIGV4dDRfYmxvY2tzX2Zvcl90cnVuY2F0ZShpbm9kZSkpOworCQkJfQorCisJCQkvKgorCQkJICogVGhlIGZvcmdldCBmbGFnIGhlcmUgaXMgY3JpdGljYWwgYmVjYXVzZSBpZgorCQkJICogd2UgYXJlIGpvdXJuYWxpbmcgKGFuZCBub3QgZG9pbmcgZGF0YQorCQkJICogam91cm5hbGluZyksIHdlIGhhdmUgdG8gbWFrZSBzdXJlIGEgcmV2b2tlCisJCQkgKiByZWNvcmQgaXMgd3JpdHRlbiB0byBwcmV2ZW50IHRoZSBqb3VybmFsCisJCQkgKiByZXBsYXkgZnJvbSBvdmVyd3JpdGluZyB0aGUgKGZvcm1lcikKKwkJCSAqIGluZGlyZWN0IGJsb2NrIGlmIGl0IGdldHMgcmVhbGxvY2F0ZWQgYXMgYQorCQkJICogZGF0YSBibG9jay4gIFRoaXMgbXVzdCBoYXBwZW4gaW4gdGhlIHNhbWUKKwkJCSAqIHRyYW5zYWN0aW9uIHdoZXJlIHRoZSBkYXRhIGJsb2NrcyBhcmUKKwkJCSAqIGFjdHVhbGx5IGZyZWVkLgorCQkJICovCisJCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIG5yLCAxLAorCQkJCQkgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQXwKKwkJCQkJIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTsKKworCQkJaWYgKHBhcmVudF9iaCkgeworCQkJCS8qCisJCQkJICogVGhlIGJsb2NrIHdoaWNoIHdlIGhhdmUganVzdCBmcmVlZCBpcworCQkJCSAqIHBvaW50ZWQgdG8gYnkgYW4gaW5kaXJlY3QgYmxvY2s6IGpvdXJuYWwgaXQKKwkJCQkgKi8KKwkJCQlCVUZGRVJfVFJBQ0UocGFyZW50X2JoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOworCQkJCWlmICghZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLAorCQkJCQkJCQkgICBwYXJlbnRfYmgpKXsKKwkJCQkJKnAgPSAwOworCQkJCQlCVUZGRVJfVFJBQ0UocGFyZW50X2JoLAorCQkJCQkiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCQkJCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCisJCQkJCQkJCSAgIGlub2RlLAorCQkJCQkJCQkgICBwYXJlbnRfYmgpOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8qIFdlIGhhdmUgcmVhY2hlZCB0aGUgYm90dG9tIG9mIHRoZSB0cmVlLiAqLworCQlCVUZGRVJfVFJBQ0UocGFyZW50X2JoLCAiZnJlZSBkYXRhIGJsb2NrcyIpOworCQlleHQ0X2ZyZWVfZGF0YShoYW5kbGUsIGlub2RlLCBwYXJlbnRfYmgsIGZpcnN0LCBsYXN0KTsKKwl9Cit9CisKK3ZvaWQgZXh0NF9pbmRfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwloYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKKwlfX2xlMzIgKmlfZGF0YSA9IGVpLT5pX2RhdGE7CisJaW50IGFkZHJfcGVyX2Jsb2NrID0gRVhUNF9BRERSX1BFUl9CTE9DSyhpbm9kZS0+aV9zYik7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCWV4dDRfbGJsa190IG9mZnNldHNbNF07CisJSW5kaXJlY3QgY2hhaW5bNF07CisJSW5kaXJlY3QgKnBhcnRpYWw7CisJX19sZTMyIG5yID0gMDsKKwlpbnQgbiA9IDA7CisJZXh0NF9sYmxrX3QgbGFzdF9ibG9jaywgbWF4X2Jsb2NrOworCXVuc2lnbmVkIGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKworCWhhbmRsZSA9IHN0YXJ0X3RyYW5zYWN0aW9uKGlub2RlKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpCisJCXJldHVybjsJCS8qIEFLUE06IHJldHVybiB3aGF0PyAqLworCisJbGFzdF9ibG9jayA9IChpbm9kZS0+aV9zaXplICsgYmxvY2tzaXplLTEpCisJCQkJCT4+IEVYVDRfQkxPQ0tfU0laRV9CSVRTKGlub2RlLT5pX3NiKTsKKwltYXhfYmxvY2sgPSAoRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfYml0bWFwX21heGJ5dGVzICsgYmxvY2tzaXplLTEpCisJCQkJCT4+IEVYVDRfQkxPQ0tfU0laRV9CSVRTKGlub2RlLT5pX3NiKTsKKworCWlmIChpbm9kZS0+aV9zaXplICYgKGJsb2Nrc2l6ZSAtIDEpKQorCQlpZiAoZXh0NF9ibG9ja190cnVuY2F0ZV9wYWdlKGhhbmRsZSwgbWFwcGluZywgaW5vZGUtPmlfc2l6ZSkpCisJCQlnb3RvIG91dF9zdG9wOworCisJaWYgKGxhc3RfYmxvY2sgIT0gbWF4X2Jsb2NrKSB7CisJCW4gPSBleHQ0X2Jsb2NrX3RvX3BhdGgoaW5vZGUsIGxhc3RfYmxvY2ssIG9mZnNldHMsIE5VTEwpOworCQlpZiAobiA9PSAwKQorCQkJZ290byBvdXRfc3RvcDsJLyogZXJyb3IgKi8KKwl9CisKKwkvKgorCSAqIE9LLiAgVGhpcyB0cnVuY2F0ZSBpcyBnb2luZyB0byBoYXBwZW4uICBXZSBhZGQgdGhlIGlub2RlIHRvIHRoZQorCSAqIG9ycGhhbiBsaXN0LCBzbyB0aGF0IGlmIHRoaXMgdHJ1bmNhdGUgc3BhbnMgbXVsdGlwbGUgdHJhbnNhY3Rpb25zLAorCSAqIGFuZCB3ZSBjcmFzaCwgd2Ugd2lsbCByZXN1bWUgdGhlIHRydW5jYXRlIHdoZW4gdGhlIGZpbGVzeXN0ZW0KKwkgKiByZWNvdmVycy4gIEl0IGFsc28gbWFya3MgdGhlIGlub2RlIGRpcnR5LCB0byBjYXRjaCB0aGUgbmV3IHNpemUuCisJICoKKwkgKiBJbXBsaWNhdGlvbjogdGhlIGZpbGUgbXVzdCBhbHdheXMgYmUgaW4gYSBzYW5lLCBjb25zaXN0ZW50CisJICogdHJ1bmNhdGFibGUgc3RhdGUgd2hpbGUgZWFjaCB0cmFuc2FjdGlvbiBjb21taXRzLgorCSAqLworCWlmIChleHQ0X29ycGhhbl9hZGQoaGFuZGxlLCBpbm9kZSkpCisJCWdvdG8gb3V0X3N0b3A7CisKKwkvKgorCSAqIEZyb20gaGVyZSB3ZSBibG9jayBvdXQgYWxsIGV4dDRfZ2V0X2Jsb2NrKCkgY2FsbGVycyB3aG8gd2FudCB0bworCSAqIG1vZGlmeSB0aGUgYmxvY2sgYWxsb2NhdGlvbiB0cmVlLgorCSAqLworCWRvd25fd3JpdGUoJmVpLT5pX2RhdGFfc2VtKTsKKworCWV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7CisKKwkvKgorCSAqIFRoZSBvcnBoYW4gbGlzdCBlbnRyeSB3aWxsIG5vdyBwcm90ZWN0IHVzIGZyb20gYW55IGNyYXNoIHdoaWNoCisJICogb2NjdXJzIGJlZm9yZSB0aGUgdHJ1bmNhdGUgY29tcGxldGVzLCBzbyBpdCBpcyBub3cgc2FmZSB0byBwcm9wYWdhdGUKKwkgKiB0aGUgbmV3LCBzaG9ydGVyIGlub2RlIHNpemUgKGhlbGQgZm9yIG5vdyBpbiBpX3NpemUpIGludG8gdGhlCisJICogb24tZGlzayBpbm9kZS4gV2UgZG8gdGhpcyB2aWEgaV9kaXNrc2l6ZSwgd2hpY2ggaXMgdGhlIHZhbHVlIHdoaWNoCisJICogZXh0NCAqcmVhbGx5KiB3cml0ZXMgb250byB0aGUgZGlzayBpbm9kZS4KKwkgKi8KKwllaS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7CisKKwlpZiAobGFzdF9ibG9jayA9PSBtYXhfYmxvY2spIHsKKwkJLyoKKwkJICogSXQgaXMgdW5uZWNlc3NhcnkgdG8gZnJlZSBhbnkgZGF0YSBibG9ja3MgaWYgbGFzdF9ibG9jayBpcworCQkgKiBlcXVhbCB0byB0aGUgaW5kaXJlY3QgYmxvY2sgbGltaXQuCisJCSAqLworCQlnb3RvIG91dF91bmxvY2s7CisJfSBlbHNlIGlmIChuID09IDEpIHsJCS8qIGRpcmVjdCBibG9ja3MgKi8KKwkJZXh0NF9mcmVlX2RhdGEoaGFuZGxlLCBpbm9kZSwgTlVMTCwgaV9kYXRhK29mZnNldHNbMF0sCisJCQkgICAgICAgaV9kYXRhICsgRVhUNF9ORElSX0JMT0NLUyk7CisJCWdvdG8gZG9faW5kaXJlY3RzOworCX0KKworCXBhcnRpYWwgPSBleHQ0X2ZpbmRfc2hhcmVkKGlub2RlLCBuLCBvZmZzZXRzLCBjaGFpbiwgJm5yKTsKKwkvKiBLaWxsIHRoZSB0b3Agb2Ygc2hhcmVkIGJyYW5jaCAobm90IGRldGFjaGVkKSAqLworCWlmIChucikgeworCQlpZiAocGFydGlhbCA9PSBjaGFpbikgeworCQkJLyogU2hhcmVkIGJyYW5jaCBncm93cyBmcm9tIHRoZSBpbm9kZSAqLworCQkJZXh0NF9mcmVlX2JyYW5jaGVzKGhhbmRsZSwgaW5vZGUsIE5VTEwsCisJCQkJCSAgICZuciwgJm5yKzEsIChjaGFpbituLTEpIC0gcGFydGlhbCk7CisJCQkqcGFydGlhbC0+cCA9IDA7CisJCQkvKgorCQkJICogV2UgbWFyayB0aGUgaW5vZGUgZGlydHkgcHJpb3IgdG8gcmVzdGFydCwKKwkJCSAqIGFuZCBwcmlvciB0byBzdG9wLiAgTm8gbmVlZCBmb3IgaXQgaGVyZS4KKwkJCSAqLworCQl9IGVsc2UgeworCQkJLyogU2hhcmVkIGJyYW5jaCBncm93cyBmcm9tIGFuIGluZGlyZWN0IGJsb2NrICovCisJCQlCVUZGRVJfVFJBQ0UocGFydGlhbC0+YmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCQlleHQ0X2ZyZWVfYnJhbmNoZXMoaGFuZGxlLCBpbm9kZSwgcGFydGlhbC0+YmgsCisJCQkJCXBhcnRpYWwtPnAsCisJCQkJCXBhcnRpYWwtPnArMSwgKGNoYWluK24tMSkgLSBwYXJ0aWFsKTsKKwkJfQorCX0KKwkvKiBDbGVhciB0aGUgZW5kcyBvZiBpbmRpcmVjdCBibG9ja3Mgb24gdGhlIHNoYXJlZCBicmFuY2ggKi8KKwl3aGlsZSAocGFydGlhbCA+IGNoYWluKSB7CisJCWV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBwYXJ0aWFsLT5iaCwgcGFydGlhbC0+cCArIDEsCisJCQkJICAgKF9fbGUzMiopcGFydGlhbC0+YmgtPmJfZGF0YSthZGRyX3Blcl9ibG9jaywKKwkJCQkgICAoY2hhaW4rbi0xKSAtIHBhcnRpYWwpOworCQlCVUZGRVJfVFJBQ0UocGFydGlhbC0+YmgsICJjYWxsIGJyZWxzZSIpOworCQlicmVsc2UocGFydGlhbC0+YmgpOworCQlwYXJ0aWFsLS07CisJfQorZG9faW5kaXJlY3RzOgorCS8qIEtpbGwgdGhlIHJlbWFpbmluZyAod2hvbGUpIHN1YnRyZWVzICovCisJc3dpdGNoIChvZmZzZXRzWzBdKSB7CisJZGVmYXVsdDoKKwkJbnIgPSBpX2RhdGFbRVhUNF9JTkRfQkxPQ0tdOworCQlpZiAobnIpIHsKKwkJCWV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBOVUxMLCAmbnIsICZucisxLCAxKTsKKwkJCWlfZGF0YVtFWFQ0X0lORF9CTE9DS10gPSAwOworCQl9CisJY2FzZSBFWFQ0X0lORF9CTE9DSzoKKwkJbnIgPSBpX2RhdGFbRVhUNF9ESU5EX0JMT0NLXTsKKwkJaWYgKG5yKSB7CisJCQlleHQ0X2ZyZWVfYnJhbmNoZXMoaGFuZGxlLCBpbm9kZSwgTlVMTCwgJm5yLCAmbnIrMSwgMik7CisJCQlpX2RhdGFbRVhUNF9ESU5EX0JMT0NLXSA9IDA7CisJCX0KKwljYXNlIEVYVDRfRElORF9CTE9DSzoKKwkJbnIgPSBpX2RhdGFbRVhUNF9USU5EX0JMT0NLXTsKKwkJaWYgKG5yKSB7CisJCQlleHQ0X2ZyZWVfYnJhbmNoZXMoaGFuZGxlLCBpbm9kZSwgTlVMTCwgJm5yLCAmbnIrMSwgMyk7CisJCQlpX2RhdGFbRVhUNF9USU5EX0JMT0NLXSA9IDA7CisJCX0KKwljYXNlIEVYVDRfVElORF9CTE9DSzoKKwkJOworCX0KKworb3V0X3VubG9jazoKKwl1cF93cml0ZSgmZWktPmlfZGF0YV9zZW0pOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBleHQ0X2N1cnJlbnRfdGltZShpbm9kZSk7CisJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCisJLyoKKwkgKiBJbiBhIG11bHRpLXRyYW5zYWN0aW9uIHRydW5jYXRlLCB3ZSBvbmx5IG1ha2UgdGhlIGZpbmFsIHRyYW5zYWN0aW9uCisJICogc3luY2hyb25vdXMKKwkgKi8KKwlpZiAoSVNfU1lOQyhpbm9kZSkpCisJCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKK291dF9zdG9wOgorCS8qCisJICogSWYgdGhpcyB3YXMgYSBzaW1wbGUgZnRydW5jYXRlKCksIGFuZCB0aGUgZmlsZSB3aWxsIHJlbWFpbiBhbGl2ZQorCSAqIHRoZW4gd2UgbmVlZCB0byBjbGVhciB1cCB0aGUgb3JwaGFuIHJlY29yZCB3aGljaCB3ZSBjcmVhdGVkIGFib3ZlLgorCSAqIEhvd2V2ZXIsIGlmIHRoaXMgd2FzIGEgcmVhbCB1bmxpbmsgdGhlbiB3ZSB3ZXJlIGNhbGxlZCBieQorCSAqIGV4dDRfZGVsZXRlX2lub2RlKCksIGFuZCB3ZSBhbGxvdyB0aGF0IGZ1bmN0aW9uIHRvIGNsZWFuIHVwIHRoZQorCSAqIG9ycGhhbiBpbmZvIGZvciB1cy4KKwkgKi8KKwlpZiAoaW5vZGUtPmlfbmxpbmspCisJCWV4dDRfb3JwaGFuX2RlbChoYW5kbGUsIGlub2RlKTsKKworCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJdHJhY2VfZXh0NF90cnVuY2F0ZV9leGl0KGlub2RlKTsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbm9kZS5jIGIvZnMvZXh0NC9pbm9kZS5jCmluZGV4IDNlNTE5MWYuLmQ0NzI2NGMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW5vZGUuYworKysgYi9mcy9leHQ0L2lub2RlLmMKQEAgLTEyLDEwICsxMiw2IEBACiAgKgogICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKICAqCi0gKiAgR29hbC1kaXJlY3RlZCBibG9jayBhbGxvY2F0aW9uIGJ5IFN0ZXBoZW4gVHdlZWRpZQotICoJKHNjdEByZWRoYXQuY29tKSwgMTk5MywgMTk5OAotICogIEJpZy1lbmRpYW4gdG8gbGl0dGxlLWVuZGlhbiBieXRlLXN3YXBwaW5nL2JpdG1hcHMgYnkKLSAqICAgICAgICBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpLCAxOTk1CiAgKiAgNjQtYml0IGZpbGUgc3VwcG9ydCBvbiA2NC1iaXQgcGxhdGZvcm1zIGJ5IEpha3ViIEplbGluZWsKICAqCShqakBzdW5zaXRlLm1zLm1mZi5jdW5pLmN6KQogICoKQEAgLTQ3LDYgKzQzLDcgQEAKICNpbmNsdWRlICJ4YXR0ci5oIgogI2luY2x1ZGUgImFjbC5oIgogI2luY2x1ZGUgImV4dDRfZXh0ZW50cy5oIgorI2luY2x1ZGUgInRydW5jYXRlLmgiCiAKICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvZXh0NC5oPgogCkBAIC04OSw3MiArODYsNiBAQAogfQogCiAvKgotICogV29yayBvdXQgaG93IG1hbnkgYmxvY2tzIHdlIG5lZWQgdG8gcHJvY2VlZCB3aXRoIHRoZSBuZXh0IGNodW5rIG9mIGEKLSAqIHRydW5jYXRlIHRyYW5zYWN0aW9uLgotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBibG9ja3NfZm9yX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0JZXh0NF9sYmxrX3QgbmVlZGVkOwotCi0JbmVlZGVkID0gaW5vZGUtPmlfYmxvY2tzID4+IChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDkpOwotCi0JLyogR2l2ZSBvdXJzZWx2ZXMganVzdCBlbm91Z2ggcm9vbSB0byBjb3BlIHdpdGggaW5vZGVzIGluIHdoaWNoCi0JICogaV9ibG9ja3MgaXMgY29ycnVwdDogd2UndmUgc2VlbiBkaXNrIGNvcnJ1cHRpb25zIGluIHRoZSBwYXN0Ci0JICogd2hpY2ggcmVzdWx0ZWQgaW4gcmFuZG9tIGRhdGEgaW4gYW4gaW5vZGUgd2hpY2ggbG9va2VkIGVub3VnaAotCSAqIGxpa2UgYSByZWd1bGFyIGZpbGUgZm9yIGV4dDQgdG8gdHJ5IHRvIGRlbGV0ZSBpdC4gIFRoaW5ncwotCSAqIHdpbGwgZ28gYSBiaXQgY3JhenkgaWYgdGhhdCBoYXBwZW5zLCBidXQgYXQgbGVhc3Qgd2Ugc2hvdWxkCi0JICogdHJ5IG5vdCB0byBwYW5pYyB0aGUgd2hvbGUga2VybmVsLiAqLwotCWlmIChuZWVkZWQgPCAyKQotCQluZWVkZWQgPSAyOwotCi0JLyogQnV0IHdlIG5lZWQgdG8gYm91bmQgdGhlIHRyYW5zYWN0aW9uIHNvIHdlIGRvbid0IG92ZXJmbG93IHRoZQotCSAqIGpvdXJuYWwuICovCi0JaWYgKG5lZWRlZCA+IEVYVDRfTUFYX1RSQU5TX0RBVEEpCi0JCW5lZWRlZCA9IEVYVDRfTUFYX1RSQU5TX0RBVEE7Ci0KLQlyZXR1cm4gRVhUNF9EQVRBX1RSQU5TX0JMT0NLUyhpbm9kZS0+aV9zYikgKyBuZWVkZWQ7Ci19Ci0KLS8qCi0gKiBUcnVuY2F0ZSB0cmFuc2FjdGlvbnMgY2FuIGJlIGNvbXBsZXggYW5kIGFic29sdXRlbHkgaHVnZS4gIFNvIHdlIG5lZWQgdG8KLSAqIGJlIGFibGUgdG8gcmVzdGFydCB0aGUgdHJhbnNhY3Rpb24gYXQgYSBjb252ZW50aWVudCBjaGVja3BvaW50IHRvIG1ha2UKLSAqIHN1cmUgd2UgZG9uJ3Qgb3ZlcmZsb3cgdGhlIGpvdXJuYWwuCi0gKgotICogc3RhcnRfdHJhbnNhY3Rpb24gZ2V0cyB1cyBhIG5ldyBoYW5kbGUgZm9yIGEgdHJ1bmNhdGUgdHJhbnNhY3Rpb24sCi0gKiBhbmQgZXh0ZW5kX3RyYW5zYWN0aW9uIHRyaWVzIHRvIGV4dGVuZCB0aGUgZXhpc3Rpbmcgb25lIGEgYml0LiAgSWYKLSAqIGV4dGVuZCBmYWlscywgd2UgbmVlZCB0byBwcm9wYWdhdGUgdGhlIGZhaWx1cmUgdXAgYW5kIHJlc3RhcnQgdGhlCi0gKiB0cmFuc2FjdGlvbiBpbiB0aGUgdG9wLWxldmVsIHRydW5jYXRlIGxvb3AuIC0tc2N0Ci0gKi8KLXN0YXRpYyBoYW5kbGVfdCAqc3RhcnRfdHJhbnNhY3Rpb24oc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQloYW5kbGVfdCAqcmVzdWx0OwotCi0JcmVzdWx0ID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBibG9ja3NfZm9yX3RydW5jYXRlKGlub2RlKSk7Ci0JaWYgKCFJU19FUlIocmVzdWx0KSkKLQkJcmV0dXJuIHJlc3VsdDsKLQotCWV4dDRfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBQVFJfRVJSKHJlc3VsdCkpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qCi0gKiBUcnkgdG8gZXh0ZW5kIHRoaXMgdHJhbnNhY3Rpb24gZm9yIHRoZSBwdXJwb3NlcyBvZiB0cnVuY2F0aW9uLgotICoKLSAqIFJldHVybnMgMCBpZiB3ZSBtYW5hZ2VkIHRvIGNyZWF0ZSBtb3JlIHJvb20uICBJZiB3ZSBjYW4ndCBjcmVhdGUgbW9yZQotICogcm9vbSwgYW5kIHRoZSB0cmFuc2FjdGlvbiBtdXN0IGJlIHJlc3RhcnRlZCB3ZSByZXR1cm4gMS4KLSAqLwotc3RhdGljIGludCB0cnlfdG9fZXh0ZW5kX3RyYW5zYWN0aW9uKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0JaWYgKCFleHQ0X2hhbmRsZV92YWxpZChoYW5kbGUpKQotCQlyZXR1cm4gMDsKLQlpZiAoZXh0NF9oYW5kbGVfaGFzX2Vub3VnaF9jcmVkaXRzKGhhbmRsZSwgRVhUNF9SRVNFUlZFX1RSQU5TX0JMT0NLUysxKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFleHQ0X2pvdXJuYWxfZXh0ZW5kKGhhbmRsZSwgYmxvY2tzX2Zvcl90cnVuY2F0ZShpbm9kZSkpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLQotLyoKICAqIFJlc3RhcnQgdGhlIHRyYW5zYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCAqaGFuZGxlLiAgVGhpcyBkb2VzIGEgY29tbWl0LAogICogc28gYmVmb3JlIHdlIGNhbGwgaGVyZSBldmVyeXRoaW5nIG11c3QgYmUgY29uc2lzdGVudGx5IGRpcnRpZWQgYWdhaW5zdAogICogdGhpcyB0cmFuc2FjdGlvbi4KQEAgLTE5MCw2ICsxMjEsMzMgQEAKIAogCXRyYWNlX2V4dDRfZXZpY3RfaW5vZGUoaW5vZGUpOwogCWlmIChpbm9kZS0+aV9ubGluaykgeworCQkvKgorCQkgKiBXaGVuIGpvdXJuYWxsaW5nIGRhdGEgZGlydHkgYnVmZmVycyBhcmUgdHJhY2tlZCBvbmx5IGluIHRoZQorCQkgKiBqb3VybmFsLiBTbyBhbHRob3VnaCBtbSB0aGlua3MgZXZlcnl0aGluZyBpcyBjbGVhbiBhbmQKKwkJICogcmVhZHkgZm9yIHJlYXBpbmcgdGhlIGlub2RlIG1pZ2h0IHN0aWxsIGhhdmUgc29tZSBwYWdlcyB0bworCQkgKiB3cml0ZSBpbiB0aGUgcnVubmluZyB0cmFuc2FjdGlvbiBvciB3YWl0aW5nIHRvIGJlCisJCSAqIGNoZWNrcG9pbnRlZC4gVGh1cyBjYWxsaW5nIGpiZDJfam91cm5hbF9pbnZhbGlkYXRlcGFnZSgpCisJCSAqICh2aWEgdHJ1bmNhdGVfaW5vZGVfcGFnZXMoKSkgdG8gZGlzY2FyZCB0aGVzZSBidWZmZXJzIGNhbgorCQkgKiBjYXVzZSBkYXRhIGxvc3MuIEFsc28gZXZlbiBpZiB3ZSBkaWQgbm90IGRpc2NhcmQgdGhlc2UKKwkJICogYnVmZmVycywgd2Ugd291bGQgaGF2ZSBubyB3YXkgdG8gZmluZCB0aGVtIGFmdGVyIHRoZSBpbm9kZQorCQkgKiBpcyByZWFwZWQgYW5kIHRodXMgdXNlciBjb3VsZCBzZWUgc3RhbGUgZGF0YSBpZiBoZSB0cmllcyB0bworCQkgKiByZWFkIHRoZW0gYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBjaGVja3BvaW50ZWQuIFNvIGJlCisJCSAqIGNhcmVmdWwgYW5kIGZvcmNlIGV2ZXJ5dGhpbmcgdG8gZGlzayBoZXJlLi4uIFdlIHVzZQorCQkgKiBlaS0+aV9kYXRhc3luY190aWQgdG8gc3RvcmUgdGhlIG5ld2VzdCB0cmFuc2FjdGlvbgorCQkgKiBjb250YWluaW5nIGlub2RlJ3MgZGF0YS4KKwkJICoKKwkJICogTm90ZSB0aGF0IGRpcmVjdG9yaWVzIGRvIG5vdCBoYXZlIHRoaXMgcHJvYmxlbSBiZWNhdXNlIHRoZXkKKwkJICogZG9uJ3QgdXNlIHBhZ2UgY2FjaGUuCisJCSAqLworCQlpZiAoZXh0NF9zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSAmJgorCQkgICAgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkgfHwgU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkpIHsKKwkJCWpvdXJuYWxfdCAqam91cm5hbCA9IEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2pvdXJuYWw7CisJCQl0aWRfdCBjb21taXRfdGlkID0gRVhUNF9JKGlub2RlKS0+aV9kYXRhc3luY190aWQ7CisKKwkJCWpiZDJfbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsLCBjb21taXRfdGlkKTsKKwkJCWpiZDJfbG9nX3dhaXRfY29tbWl0KGpvdXJuYWwsIGNvbW1pdF90aWQpOworCQkJZmlsZW1hcF93cml0ZV9hbmRfd2FpdCgmaW5vZGUtPmlfZGF0YSk7CisJCX0KIAkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOwogCQlnb3RvIG5vX2RlbGV0ZTsKIAl9CkBAIC0yMDQsNyArMTYyLDcgQEAKIAlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkKIAkJZ290byBub19kZWxldGU7CiAKLQloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIGJsb2Nrc19mb3JfdHJ1bmNhdGUoaW5vZGUpKzMpOworCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgZXh0NF9ibG9ja3NfZm9yX3RydW5jYXRlKGlub2RlKSszKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJZXh0NF9zdGRfZXJyb3IoaW5vZGUtPmlfc2IsIFBUUl9FUlIoaGFuZGxlKSk7CiAJCS8qCkBAIC0yNzcsNzkzICsyMzUsNiBAQAogCWV4dDRfY2xlYXJfaW5vZGUoaW5vZGUpOwkvKiBXZSBtdXN0IGd1YXJhbnRlZSBjbGVhcmluZyBvZiBpbm9kZS4uLiAqLwogfQogCi10eXBlZGVmIHN0cnVjdCB7Ci0JX19sZTMyCSpwOwotCV9fbGUzMglrZXk7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKLX0gSW5kaXJlY3Q7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhZGRfY2hhaW4oSW5kaXJlY3QgKnAsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIF9fbGUzMiAqdikKLXsKLQlwLT5rZXkgPSAqKHAtPnAgPSB2KTsKLQlwLT5iaCA9IGJoOwotfQotCi0vKioKLSAqCWV4dDRfYmxvY2tfdG9fcGF0aCAtIHBhcnNlIHRoZSBibG9jayBudW1iZXIgaW50byBhcnJheSBvZiBvZmZzZXRzCi0gKglAaW5vZGU6IGlub2RlIGluIHF1ZXN0aW9uICh3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGl0cyBzdXBlcmJsb2NrKQotICoJQGlfYmxvY2s6IGJsb2NrIG51bWJlciB0byBiZSBwYXJzZWQKLSAqCUBvZmZzZXRzOiBhcnJheSB0byBzdG9yZSB0aGUgb2Zmc2V0cyBpbgotICoJQGJvdW5kYXJ5OiBzZXQgdGhpcyBub24temVybyBpZiB0aGUgcmVmZXJyZWQtdG8gYmxvY2sgaXMgbGlrZWx5IHRvIGJlCi0gKgkgICAgICAgZm9sbG93ZWQgKG9uIGRpc2spIGJ5IGFuIGluZGlyZWN0IGJsb2NrLgotICoKLSAqCVRvIHN0b3JlIHRoZSBsb2NhdGlvbnMgb2YgZmlsZSdzIGRhdGEgZXh0NCB1c2VzIGEgZGF0YSBzdHJ1Y3R1cmUgY29tbW9uCi0gKglmb3IgVU5JWCBmaWxlc3lzdGVtcyAtIHRyZWUgb2YgcG9pbnRlcnMgYW5jaG9yZWQgaW4gdGhlIGlub2RlLCB3aXRoCi0gKglkYXRhIGJsb2NrcyBhdCBsZWF2ZXMgYW5kIGluZGlyZWN0IGJsb2NrcyBpbiBpbnRlcm1lZGlhdGUgbm9kZXMuCi0gKglUaGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlIGJsb2NrIG51bWJlciBpbnRvIHBhdGggaW4gdGhhdCB0cmVlIC0KLSAqCXJldHVybiB2YWx1ZSBpcyB0aGUgcGF0aCBsZW5ndGggYW5kIEBvZmZzZXRzW25dIGlzIHRoZSBvZmZzZXQgb2YKLSAqCXBvaW50ZXIgdG8gKG4rMSl0aCBub2RlIGluIHRoZSBudGggb25lLiBJZiBAYmxvY2sgaXMgb3V0IG9mIHJhbmdlCi0gKgkobmVnYXRpdmUgb3IgdG9vIGxhcmdlKSB3YXJuaW5nIGlzIHByaW50ZWQgYW5kIHplcm8gcmV0dXJuZWQuCi0gKgotICoJTm90ZTogZnVuY3Rpb24gZG9lc24ndCBmaW5kIG5vZGUgYWRkcmVzc2VzLCBzbyBubyBJTyBpcyBuZWVkZWQuIEFsbAotICoJd2UgbmVlZCB0byBrbm93IGlzIHRoZSBjYXBhY2l0eSBvZiBpbmRpcmVjdCBibG9ja3MgKHRha2VuIGZyb20gdGhlCi0gKglpbm9kZS0+aV9zYikuCi0gKi8KLQotLyoKLSAqIFBvcnRhYmlsaXR5IG5vdGU6IHRoZSBsYXN0IGNvbXBhcmlzb24gKGNoZWNrIHRoYXQgd2UgZml0IGludG8gdHJpcGxlCi0gKiBpbmRpcmVjdCBibG9jaykgaXMgc3BlbGxlZCBkaWZmZXJlbnRseSwgYmVjYXVzZSBvdGhlcndpc2Ugb24gYW4KLSAqIGFyY2hpdGVjdHVyZSB3aXRoIDMyLWJpdCBsb25ncyBhbmQgOEtiIHBhZ2VzIHdlIG1pZ2h0IGdldCBpbnRvIHRyb3VibGUKLSAqIGlmIG91ciBmaWxlc3lzdGVtIGhhZCA4S2IgYmxvY2tzLiBXZSBtaWdodCB1c2UgbG9uZyBsb25nLCBidXQgdGhhdCB3b3VsZAotICoga2lsbCB1cyBvbiB4ODYuIE9oLCB3ZWxsLCBhdCBsZWFzdCB0aGUgc2lnbiBwcm9wYWdhdGlvbiBkb2VzIG5vdCBtYXR0ZXIgLQotICogaV9ibG9jayB3b3VsZCBoYXZlIHRvIGJlIG5lZ2F0aXZlIGluIHRoZSB2ZXJ5IGJlZ2lubmluZywgc28gd2Ugd291bGQgbm90Ci0gKiBnZXQgdGhlcmUgYXQgYWxsLgotICovCi0KLXN0YXRpYyBpbnQgZXh0NF9ibG9ja190b19wYXRoKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgICBleHQ0X2xibGtfdCBpX2Jsb2NrLAotCQkJICAgICAgZXh0NF9sYmxrX3Qgb2Zmc2V0c1s0XSwgaW50ICpib3VuZGFyeSkKLXsKLQlpbnQgcHRycyA9IEVYVDRfQUREUl9QRVJfQkxPQ0soaW5vZGUtPmlfc2IpOwotCWludCBwdHJzX2JpdHMgPSBFWFQ0X0FERFJfUEVSX0JMT0NLX0JJVFMoaW5vZGUtPmlfc2IpOwotCWNvbnN0IGxvbmcgZGlyZWN0X2Jsb2NrcyA9IEVYVDRfTkRJUl9CTE9DS1MsCi0JCWluZGlyZWN0X2Jsb2NrcyA9IHB0cnMsCi0JCWRvdWJsZV9ibG9ja3MgPSAoMSA8PCAocHRyc19iaXRzICogMikpOwotCWludCBuID0gMDsKLQlpbnQgZmluYWwgPSAwOwotCi0JaWYgKGlfYmxvY2sgPCBkaXJlY3RfYmxvY2tzKSB7Ci0JCW9mZnNldHNbbisrXSA9IGlfYmxvY2s7Ci0JCWZpbmFsID0gZGlyZWN0X2Jsb2NrczsKLQl9IGVsc2UgaWYgKChpX2Jsb2NrIC09IGRpcmVjdF9ibG9ja3MpIDwgaW5kaXJlY3RfYmxvY2tzKSB7Ci0JCW9mZnNldHNbbisrXSA9IEVYVDRfSU5EX0JMT0NLOwotCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrOwotCQlmaW5hbCA9IHB0cnM7Ci0JfSBlbHNlIGlmICgoaV9ibG9jayAtPSBpbmRpcmVjdF9ibG9ja3MpIDwgZG91YmxlX2Jsb2NrcykgewotCQlvZmZzZXRzW24rK10gPSBFWFQ0X0RJTkRfQkxPQ0s7Ci0JCW9mZnNldHNbbisrXSA9IGlfYmxvY2sgPj4gcHRyc19iaXRzOwotCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrICYgKHB0cnMgLSAxKTsKLQkJZmluYWwgPSBwdHJzOwotCX0gZWxzZSBpZiAoKChpX2Jsb2NrIC09IGRvdWJsZV9ibG9ja3MpID4+IChwdHJzX2JpdHMgKiAyKSkgPCBwdHJzKSB7Ci0JCW9mZnNldHNbbisrXSA9IEVYVDRfVElORF9CTE9DSzsKLQkJb2Zmc2V0c1tuKytdID0gaV9ibG9jayA+PiAocHRyc19iaXRzICogMik7Ci0JCW9mZnNldHNbbisrXSA9IChpX2Jsb2NrID4+IHB0cnNfYml0cykgJiAocHRycyAtIDEpOwotCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrICYgKHB0cnMgLSAxKTsKLQkJZmluYWwgPSBwdHJzOwotCX0gZWxzZSB7Ci0JCWV4dDRfd2FybmluZyhpbm9kZS0+aV9zYiwgImJsb2NrICVsdSA+IG1heCBpbiBpbm9kZSAlbHUiLAotCQkJICAgICBpX2Jsb2NrICsgZGlyZWN0X2Jsb2NrcyArCi0JCQkgICAgIGluZGlyZWN0X2Jsb2NrcyArIGRvdWJsZV9ibG9ja3MsIGlub2RlLT5pX2lubyk7Ci0JfQotCWlmIChib3VuZGFyeSkKLQkJKmJvdW5kYXJ5ID0gZmluYWwgLSAxIC0gKGlfYmxvY2sgJiAocHRycyAtIDEpKTsKLQlyZXR1cm4gbjsKLX0KLQotc3RhdGljIGludCBfX2V4dDRfY2hlY2tfYmxvY2tyZWYoY29uc3QgY2hhciAqZnVuY3Rpb24sIHVuc2lnbmVkIGludCBsaW5lLAotCQkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSBfX2xlMzIgKnAsIHVuc2lnbmVkIGludCBtYXgpCi17Ci0Jc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzID0gRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfZXM7Ci0JX19sZTMyICpicmVmID0gcDsKLQl1bnNpZ25lZCBpbnQgYmxrOwotCi0Jd2hpbGUgKGJyZWYgPCBwK21heCkgewotCQlibGsgPSBsZTMyX3RvX2NwdSgqYnJlZisrKTsKLQkJaWYgKGJsayAmJgotCQkgICAgdW5saWtlbHkoIWV4dDRfZGF0YV9ibG9ja192YWxpZChFWFQ0X1NCKGlub2RlLT5pX3NiKSwKLQkJCQkJCSAgICBibGssIDEpKSkgewotCQkJZXMtPnNfbGFzdF9lcnJvcl9ibG9jayA9IGNwdV90b19sZTY0KGJsayk7Ci0JCQlleHQ0X2Vycm9yX2lub2RlKGlub2RlLCBmdW5jdGlvbiwgbGluZSwgYmxrLAotCQkJCQkgImludmFsaWQgYmxvY2siKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi0KLSNkZWZpbmUgZXh0NF9jaGVja19pbmRpcmVjdF9ibG9ja3JlZihpbm9kZSwgYmgpICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlfX2V4dDRfY2hlY2tfYmxvY2tyZWYoX19mdW5jX18sIF9fTElORV9fLCBpbm9kZSwJCVwKLQkJCSAgICAgIChfX2xlMzIgKikoYmgpLT5iX2RhdGEsCQkJXAotCQkJICAgICAgRVhUNF9BRERSX1BFUl9CTE9DSygoaW5vZGUpLT5pX3NiKSkKLQotI2RlZmluZSBleHQ0X2NoZWNrX2lub2RlX2Jsb2NrcmVmKGlub2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCV9fZXh0NF9jaGVja19ibG9ja3JlZihfX2Z1bmNfXywgX19MSU5FX18sIGlub2RlLAkJXAotCQkJICAgICAgRVhUNF9JKGlub2RlKS0+aV9kYXRhLAkJCVwKLQkJCSAgICAgIEVYVDRfTkRJUl9CTE9DS1MpCi0KLS8qKgotICoJZXh0NF9nZXRfYnJhbmNoIC0gcmVhZCB0aGUgY2hhaW4gb2YgaW5kaXJlY3QgYmxvY2tzIGxlYWRpbmcgdG8gZGF0YQotICoJQGlub2RlOiBpbm9kZSBpbiBxdWVzdGlvbgotICoJQGRlcHRoOiBkZXB0aCBvZiB0aGUgY2hhaW4gKDEgLSBkaXJlY3QgcG9pbnRlciwgZXRjLikKLSAqCUBvZmZzZXRzOiBvZmZzZXRzIG9mIHBvaW50ZXJzIGluIGlub2RlL2luZGlyZWN0IGJsb2NrcwotICoJQGNoYWluOiBwbGFjZSB0byBzdG9yZSB0aGUgcmVzdWx0Ci0gKglAZXJyOiBoZXJlIHdlIHN0b3JlIHRoZSBlcnJvciB2YWx1ZQotICoKLSAqCUZ1bmN0aW9uIGZpbGxzIHRoZSBhcnJheSBvZiB0cmlwbGVzIDxrZXksIHAsIGJoPiBhbmQgcmV0dXJucyAlTlVMTAotICoJaWYgZXZlcnl0aGluZyB3ZW50IE9LIG9yIHRoZSBwb2ludGVyIHRvIHRoZSBsYXN0IGZpbGxlZCB0cmlwbGUKLSAqCShpbmNvbXBsZXRlIG9uZSkgb3RoZXJ3aXNlLiBVcG9uIHRoZSByZXR1cm4gY2hhaW5baV0ua2V5IGNvbnRhaW5zCi0gKgl0aGUgbnVtYmVyIG9mIChpKzEpLXRoIGJsb2NrIGluIHRoZSBjaGFpbiAoYXMgaXQgaXMgc3RvcmVkIGluIG1lbW9yeSwKLSAqCWkuZS4gbGl0dGxlLWVuZGlhbiAzMi1iaXQpLCBjaGFpbltpXS5wIGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoYXQKLSAqCW51bWJlciAoaXQgcG9pbnRzIGludG8gc3RydWN0IGlub2RlIGZvciBpPT0wIGFuZCBpbnRvIHRoZSBiaC0+Yl9kYXRhCi0gKglmb3IgaT4wKSBhbmQgY2hhaW5baV0uYmggcG9pbnRzIHRvIHRoZSBidWZmZXJfaGVhZCBvZiBpLXRoIGluZGlyZWN0Ci0gKglibG9jayBmb3IgaT4wIGFuZCBOVUxMIGZvciBpPT0wLiBJbiBvdGhlciB3b3JkcywgaXQgaG9sZHMgdGhlIGJsb2NrCi0gKgludW1iZXJzIG9mIHRoZSBjaGFpbiwgYWRkcmVzc2VzIHRoZXkgd2VyZSB0YWtlbiBmcm9tIChhbmQgd2hlcmUgd2UgY2FuCi0gKgl2ZXJpZnkgdGhhdCBjaGFpbiBkaWQgbm90IGNoYW5nZSkgYW5kIGJ1ZmZlcl9oZWFkcyBob3N0aW5nIHRoZXNlCi0gKgludW1iZXJzLgotICoKLSAqCUZ1bmN0aW9uIHN0b3BzIHdoZW4gaXQgc3R1bWJsZXMgdXBvbiB6ZXJvIHBvaW50ZXIgKGFic2VudCBibG9jaykKLSAqCQkocG9pbnRlciB0byBsYXN0IHRyaXBsZSByZXR1cm5lZCwgKkBlcnIgPT0gMCkKLSAqCW9yIHdoZW4gaXQgZ2V0cyBhbiBJTyBlcnJvciByZWFkaW5nIGFuIGluZGlyZWN0IGJsb2NrCi0gKgkJKGRpdHRvLCAqQGVyciA9PSAtRUlPKQotICoJb3Igd2hlbiBpdCByZWFkcyBhbGwgQGRlcHRoLTEgaW5kaXJlY3QgYmxvY2tzIHN1Y2Nlc3NmdWxseSBhbmQgZmluZHMKLSAqCXRoZSB3aG9sZSBjaGFpbiwgYWxsIHdheSB0byB0aGUgZGF0YSAocmV0dXJucyAlTlVMTCwgKmVyciA9PSAwKS4KLSAqCi0gKiAgICAgIE5lZWQgdG8gYmUgY2FsbGVkIHdpdGgKLSAqICAgICAgZG93bl9yZWFkKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKQotICovCi1zdGF0aWMgSW5kaXJlY3QgKmV4dDRfZ2V0X2JyYW5jaChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZGVwdGgsCi0JCQkJIGV4dDRfbGJsa190ICAqb2Zmc2V0cywKLQkJCQkgSW5kaXJlY3QgY2hhaW5bNF0sIGludCAqZXJyKQotewotCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKLQlJbmRpcmVjdCAqcCA9IGNoYWluOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7Ci0KLQkqZXJyID0gMDsKLQkvKiBpX2RhdGEgaXMgbm90IGdvaW5nIGF3YXksIG5vIGxvY2sgbmVlZGVkICovCi0JYWRkX2NoYWluKGNoYWluLCBOVUxMLCBFWFQ0X0koaW5vZGUpLT5pX2RhdGEgKyAqb2Zmc2V0cyk7Ci0JaWYgKCFwLT5rZXkpCi0JCWdvdG8gbm9fYmxvY2s7Ci0Jd2hpbGUgKC0tZGVwdGgpIHsKLQkJYmggPSBzYl9nZXRibGsoc2IsIGxlMzJfdG9fY3B1KHAtPmtleSkpOwotCQlpZiAodW5saWtlbHkoIWJoKSkKLQkJCWdvdG8gZmFpbHVyZTsKLQotCQlpZiAoIWJoX3VwdG9kYXRlX29yX2xvY2soYmgpKSB7Ci0JCQlpZiAoYmhfc3VibWl0X3JlYWQoYmgpIDwgMCkgewotCQkJCXB1dF9iaChiaCk7Ci0JCQkJZ290byBmYWlsdXJlOwotCQkJfQotCQkJLyogdmFsaWRhdGUgYmxvY2sgcmVmZXJlbmNlcyAqLwotCQkJaWYgKGV4dDRfY2hlY2tfaW5kaXJlY3RfYmxvY2tyZWYoaW5vZGUsIGJoKSkgewotCQkJCXB1dF9iaChiaCk7Ci0JCQkJZ290byBmYWlsdXJlOwotCQkJfQotCQl9Ci0KLQkJYWRkX2NoYWluKCsrcCwgYmgsIChfX2xlMzIgKiliaC0+Yl9kYXRhICsgKisrb2Zmc2V0cyk7Ci0JCS8qIFJlYWRlcjogZW5kICovCi0JCWlmICghcC0+a2V5KQotCQkJZ290byBub19ibG9jazsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci0KLWZhaWx1cmU6Ci0JKmVyciA9IC1FSU87Ci1ub19ibG9jazoKLQlyZXR1cm4gcDsKLX0KLQotLyoqCi0gKglleHQ0X2ZpbmRfbmVhciAtIGZpbmQgYSBwbGFjZSBmb3IgYWxsb2NhdGlvbiB3aXRoIHN1ZmZpY2llbnQgbG9jYWxpdHkKLSAqCUBpbm9kZTogb3duZXIKLSAqCUBpbmQ6IGRlc2NyaXB0b3Igb2YgaW5kaXJlY3QgYmxvY2suCi0gKgotICoJVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBwcmVmZXJyZWQgcGxhY2UgZm9yIGJsb2NrIGFsbG9jYXRpb24uCi0gKglJdCBpcyB1c2VkIHdoZW4gaGV1cmlzdGljIGZvciBzZXF1ZW50aWFsIGFsbG9jYXRpb24gZmFpbHMuCi0gKglSdWxlcyBhcmU6Ci0gKgkgICsgaWYgdGhlcmUgaXMgYSBibG9jayB0byB0aGUgbGVmdCBvZiBvdXIgcG9zaXRpb24gLSBhbGxvY2F0ZSBuZWFyIGl0LgotICoJICArIGlmIHBvaW50ZXIgd2lsbCBsaXZlIGluIGluZGlyZWN0IGJsb2NrIC0gYWxsb2NhdGUgbmVhciB0aGF0IGJsb2NrLgotICoJICArIGlmIHBvaW50ZXIgd2lsbCBsaXZlIGluIGlub2RlIC0gYWxsb2NhdGUgaW4gdGhlIHNhbWUKLSAqCSAgICBjeWxpbmRlciBncm91cC4KLSAqCi0gKiBJbiB0aGUgbGF0dGVyIGNhc2Ugd2UgY29sb3VyIHRoZSBzdGFydGluZyBibG9jayBieSB0aGUgY2FsbGVycyBQSUQgdG8KLSAqIHByZXZlbnQgaXQgZnJvbSBjbGFzaGluZyB3aXRoIGNvbmN1cnJlbnQgYWxsb2NhdGlvbnMgZm9yIGEgZGlmZmVyZW50IGlub2RlCi0gKiBpbiB0aGUgc2FtZSBibG9jayBncm91cC4gICBUaGUgUElEIGlzIHVzZWQgaGVyZSBzbyB0aGF0IGZ1bmN0aW9uYWxseSByZWxhdGVkCi0gKiBmaWxlcyB3aWxsIGJlIGNsb3NlLWJ5IG9uLWRpc2suCi0gKgotICoJQ2FsbGVyIG11c3QgbWFrZSBzdXJlIHRoYXQgQGluZCBpcyB2YWxpZCBhbmQgd2lsbCBzdGF5IHRoYXQgd2F5LgotICovCi1zdGF0aWMgZXh0NF9mc2Jsa190IGV4dDRfZmluZF9uZWFyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIEluZGlyZWN0ICppbmQpCi17Ci0Jc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwotCV9fbGUzMiAqc3RhcnQgPSBpbmQtPmJoID8gKF9fbGUzMiAqKSBpbmQtPmJoLT5iX2RhdGEgOiBlaS0+aV9kYXRhOwotCV9fbGUzMiAqcDsKLQlleHQ0X2ZzYmxrX3QgYmdfc3RhcnQ7Ci0JZXh0NF9mc2Jsa190IGxhc3RfYmxvY2s7Ci0JZXh0NF9ncnBibGtfdCBjb2xvdXI7Ci0JZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwOwotCWludCBmbGV4X3NpemUgPSBleHQ0X2ZsZXhfYmdfc2l6ZShFWFQ0X1NCKGlub2RlLT5pX3NiKSk7Ci0KLQkvKiBUcnkgdG8gZmluZCBwcmV2aW91cyBibG9jayAqLwotCWZvciAocCA9IGluZC0+cCAtIDE7IHAgPj0gc3RhcnQ7IHAtLSkgewotCQlpZiAoKnApCi0JCQlyZXR1cm4gbGUzMl90b19jcHUoKnApOwotCX0KLQotCS8qIE5vIHN1Y2ggdGhpbmcsIHNvIGxldCdzIHRyeSBsb2NhdGlvbiBvZiBpbmRpcmVjdCBibG9jayAqLwotCWlmIChpbmQtPmJoKQotCQlyZXR1cm4gaW5kLT5iaC0+Yl9ibG9ja25yOwotCi0JLyoKLQkgKiBJdCBpcyBnb2luZyB0byBiZSByZWZlcnJlZCB0byBmcm9tIHRoZSBpbm9kZSBpdHNlbGY/IE9LLCBqdXN0IHB1dCBpdAotCSAqIGludG8gdGhlIHNhbWUgY3lsaW5kZXIgZ3JvdXAgdGhlbi4KLQkgKi8KLQlibG9ja19ncm91cCA9IGVpLT5pX2Jsb2NrX2dyb3VwOwotCWlmIChmbGV4X3NpemUgPj0gRVhUNF9GTEVYX1NJWkVfRElSX0FMTE9DX1NDSEVNRSkgewotCQlibG9ja19ncm91cCAmPSB+KGZsZXhfc2l6ZS0xKTsKLQkJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCi0JCQlibG9ja19ncm91cCsrOwotCX0KLQliZ19zdGFydCA9IGV4dDRfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oaW5vZGUtPmlfc2IsIGJsb2NrX2dyb3VwKTsKLQlsYXN0X2Jsb2NrID0gZXh0NF9ibG9ja3NfY291bnQoRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfZXMpIC0gMTsKLQotCS8qCi0JICogSWYgd2UgYXJlIGRvaW5nIGRlbGF5ZWQgYWxsb2NhdGlvbiwgd2UgZG9uJ3QgbmVlZCB0YWtlCi0JICogY29sb3VyIGludG8gYWNjb3VudC4KLQkgKi8KLQlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIERFTEFMTE9DKSkKLQkJcmV0dXJuIGJnX3N0YXJ0OwotCi0JaWYgKGJnX3N0YXJ0ICsgRVhUNF9CTE9DS1NfUEVSX0dST1VQKGlub2RlLT5pX3NiKSA8PSBsYXN0X2Jsb2NrKQotCQljb2xvdXIgPSAoY3VycmVudC0+cGlkICUgMTYpICoKLQkJCShFWFQ0X0JMT0NLU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpIC8gMTYpOwotCWVsc2UKLQkJY29sb3VyID0gKGN1cnJlbnQtPnBpZCAlIDE2KSAqICgobGFzdF9ibG9jayAtIGJnX3N0YXJ0KSAvIDE2KTsKLQlyZXR1cm4gYmdfc3RhcnQgKyBjb2xvdXI7Ci19Ci0KLS8qKgotICoJZXh0NF9maW5kX2dvYWwgLSBmaW5kIGEgcHJlZmVycmVkIHBsYWNlIGZvciBhbGxvY2F0aW9uLgotICoJQGlub2RlOiBvd25lcgotICoJQGJsb2NrOiAgYmxvY2sgd2Ugd2FudAotICoJQHBhcnRpYWw6IHBvaW50ZXIgdG8gdGhlIGxhc3QgdHJpcGxlIHdpdGhpbiBhIGNoYWluCi0gKgotICoJTm9ybWFsbHkgdGhpcyBmdW5jdGlvbiBmaW5kIHRoZSBwcmVmZXJyZWQgcGxhY2UgZm9yIGJsb2NrIGFsbG9jYXRpb24sCi0gKglyZXR1cm5zIGl0LgotICoJQmVjYXVzZSB0aGlzIGlzIG9ubHkgdXNlZCBmb3Igbm9uLWV4dGVudCBmaWxlcywgd2UgbGltaXQgdGhlIGJsb2NrIG5yCi0gKgl0byAzMiBiaXRzLgotICovCi1zdGF0aWMgZXh0NF9mc2Jsa190IGV4dDRfZmluZF9nb2FsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IGJsb2NrLAotCQkJCSAgIEluZGlyZWN0ICpwYXJ0aWFsKQotewotCWV4dDRfZnNibGtfdCBnb2FsOwotCi0JLyoKLQkgKiBYWFggbmVlZCB0byBnZXQgZ29hbCBibG9jayBmcm9tIG1iYWxsb2MncyBkYXRhIHN0cnVjdHVyZXMKLQkgKi8KLQotCWdvYWwgPSBleHQ0X2ZpbmRfbmVhcihpbm9kZSwgcGFydGlhbCk7Ci0JZ29hbCA9IGdvYWwgJiBFWFQ0X01BWF9CTE9DS19GSUxFX1BIWVM7Ci0JcmV0dXJuIGdvYWw7Ci19Ci0KLS8qKgotICoJZXh0NF9ibGtzX3RvX2FsbG9jYXRlIC0gTG9vayB1cCB0aGUgYmxvY2sgbWFwIGFuZCBjb3VudCB0aGUgbnVtYmVyCi0gKglvZiBkaXJlY3QgYmxvY2tzIG5lZWQgdG8gYmUgYWxsb2NhdGVkIGZvciB0aGUgZ2l2ZW4gYnJhbmNoLgotICoKLSAqCUBicmFuY2g6IGNoYWluIG9mIGluZGlyZWN0IGJsb2NrcwotICoJQGs6IG51bWJlciBvZiBibG9ja3MgbmVlZCBmb3IgaW5kaXJlY3QgYmxvY2tzCi0gKglAYmxrczogbnVtYmVyIG9mIGRhdGEgYmxvY2tzIHRvIGJlIG1hcHBlZC4KLSAqCUBibG9ja3NfdG9fYm91bmRhcnk6ICB0aGUgb2Zmc2V0IGluIHRoZSBpbmRpcmVjdCBibG9jawotICoKLSAqCXJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGJsb2NrcyB0byBiZSBhbGxvY2F0ZSwgaW5jbHVkaW5nIHRoZQotICoJZGlyZWN0IGFuZCBpbmRpcmVjdCBibG9ja3MuCi0gKi8KLXN0YXRpYyBpbnQgZXh0NF9ibGtzX3RvX2FsbG9jYXRlKEluZGlyZWN0ICpicmFuY2gsIGludCBrLCB1bnNpZ25lZCBpbnQgYmxrcywKLQkJCQkgaW50IGJsb2Nrc190b19ib3VuZGFyeSkKLXsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotCi0JLyoKLQkgKiBTaW1wbGUgY2FzZSwgW3QsZF1JbmRpcmVjdCBibG9jayhzKSBoYXMgbm90IGFsbG9jYXRlZCB5ZXQKLQkgKiB0aGVuIGl0J3MgY2xlYXIgYmxvY2tzIG9uIHRoYXQgcGF0aCBoYXZlIG5vdCBhbGxvY2F0ZWQKLQkgKi8KLQlpZiAoayA+IDApIHsKLQkJLyogcmlnaHQgbm93IHdlIGRvbid0IGhhbmRsZSBjcm9zcyBib3VuZGFyeSBhbGxvY2F0aW9uICovCi0JCWlmIChibGtzIDwgYmxvY2tzX3RvX2JvdW5kYXJ5ICsgMSkKLQkJCWNvdW50ICs9IGJsa3M7Ci0JCWVsc2UKLQkJCWNvdW50ICs9IGJsb2Nrc190b19ib3VuZGFyeSArIDE7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQljb3VudCsrOwotCXdoaWxlIChjb3VudCA8IGJsa3MgJiYgY291bnQgPD0gYmxvY2tzX3RvX2JvdW5kYXJ5ICYmCi0JCWxlMzJfdG9fY3B1KCooYnJhbmNoWzBdLnAgKyBjb3VudCkpID09IDApIHsKLQkJY291bnQrKzsKLQl9Ci0JcmV0dXJuIGNvdW50OwotfQotCi0vKioKLSAqCWV4dDRfYWxsb2NfYmxvY2tzOiBtdWx0aXBsZSBhbGxvY2F0ZSBibG9ja3MgbmVlZGVkIGZvciBhIGJyYW5jaAotICoJQGhhbmRsZTogaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCi0gKglAaW5vZGU6IGlub2RlIHdoaWNoIG5lZWRzIGFsbG9jYXRlZCBibG9ja3MKLSAqCUBpYmxvY2s6IHRoZSBsb2dpY2FsIGJsb2NrIHRvIHN0YXJ0IGFsbG9jYXRlZCBhdAotICoJQGdvYWw6IHByZWZlcnJlZCBwaHlzaWNhbCBibG9jayBvZiBhbGxvY2F0aW9uCi0gKglAaW5kaXJlY3RfYmxrczogdGhlIG51bWJlciBvZiBibG9ja3MgbmVlZCB0byBhbGxvY2F0ZSBmb3IgaW5kaXJlY3QKLSAqCQkJYmxvY2tzCi0gKglAYmxrczogbnVtYmVyIG9mIGRlc2lyZWQgYmxvY2tzCi0gKglAbmV3X2Jsb2Nrczogb24gcmV0dXJuIGl0IHdpbGwgc3RvcmUgdGhlIG5ldyBibG9jayBudW1iZXJzIGZvcgotICoJdGhlIGluZGlyZWN0IGJsb2NrcyhpZiBuZWVkZWQpIGFuZCB0aGUgZmlyc3QgZGlyZWN0IGJsb2NrLAotICoJQGVycjogb24gcmV0dXJuIGl0IHdpbGwgc3RvcmUgdGhlIGVycm9yIGNvZGUKLSAqCi0gKglUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgYmxvY2tzIGFsbG9jYXRlZCBhcwotICoJcmVxdWVzdGVkIGJ5IHRoZSBwYXNzZWQtaW4gcGFyYW1ldGVycy4KLSAqLwotc3RhdGljIGludCBleHQ0X2FsbG9jX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgICBleHQ0X2xibGtfdCBpYmxvY2ssIGV4dDRfZnNibGtfdCBnb2FsLAotCQkJICAgICBpbnQgaW5kaXJlY3RfYmxrcywgaW50IGJsa3MsCi0JCQkgICAgIGV4dDRfZnNibGtfdCBuZXdfYmxvY2tzWzRdLCBpbnQgKmVycikKLXsKLQlzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXI7Ci0JaW50IHRhcmdldCwgaTsKLQl1bnNpZ25lZCBsb25nIGNvdW50ID0gMCwgYmxrX2FsbG9jYXRlZCA9IDA7Ci0JaW50IGluZGV4ID0gMDsKLQlleHQ0X2ZzYmxrX3QgY3VycmVudF9ibG9jayA9IDA7Ci0JaW50IHJldCA9IDA7Ci0KLQkvKgotCSAqIEhlcmUgd2UgdHJ5IHRvIGFsbG9jYXRlIHRoZSByZXF1ZXN0ZWQgbXVsdGlwbGUgYmxvY2tzIGF0IG9uY2UsCi0JICogb24gYSBiZXN0LWVmZm9ydCBiYXNpcy4KLQkgKiBUbyBidWlsZCBhIGJyYW5jaCwgd2Ugc2hvdWxkIGFsbG9jYXRlIGJsb2NrcyBmb3IKLQkgKiB0aGUgaW5kaXJlY3QgYmxvY2tzKGlmIG5vdCBhbGxvY2F0ZWQgeWV0KSwgYW5kIGF0IGxlYXN0Ci0JICogdGhlIGZpcnN0IGRpcmVjdCBibG9jayBvZiB0aGlzIGJyYW5jaC4gIFRoYXQncyB0aGUKLQkgKiBtaW5pbXVtIG51bWJlciBvZiBibG9ja3MgbmVlZCB0byBhbGxvY2F0ZShyZXF1aXJlZCkKLQkgKi8KLQkvKiBmaXJzdCB3ZSB0cnkgdG8gYWxsb2NhdGUgdGhlIGluZGlyZWN0IGJsb2NrcyAqLwotCXRhcmdldCA9IGluZGlyZWN0X2Jsa3M7Ci0Jd2hpbGUgKHRhcmdldCA+IDApIHsKLQkJY291bnQgPSB0YXJnZXQ7Ci0JCS8qIGFsbG9jYXRpbmcgYmxvY2tzIGZvciBpbmRpcmVjdCBibG9ja3MgYW5kIGRpcmVjdCBibG9ja3MgKi8KLQkJY3VycmVudF9ibG9jayA9IGV4dDRfbmV3X21ldGFfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGdvYWwsCi0JCQkJCQkgICAgIDAsICZjb3VudCwgZXJyKTsKLQkJaWYgKCplcnIpCi0JCQlnb3RvIGZhaWxlZF9vdXQ7Ci0KLQkJaWYgKHVubGlrZWx5KGN1cnJlbnRfYmxvY2sgKyBjb3VudCA+IEVYVDRfTUFYX0JMT0NLX0ZJTEVfUEhZUykpIHsKLQkJCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsCi0JCQkJCSAiY3VycmVudF9ibG9jayAlbGx1ICsgY291bnQgJWx1ID4gJWQhIiwKLQkJCQkJIGN1cnJlbnRfYmxvY2ssIGNvdW50LAotCQkJCQkgRVhUNF9NQVhfQkxPQ0tfRklMRV9QSFlTKTsKLQkJCSplcnIgPSAtRUlPOwotCQkJZ290byBmYWlsZWRfb3V0OwotCQl9Ci0KLQkJdGFyZ2V0IC09IGNvdW50OwotCQkvKiBhbGxvY2F0ZSBibG9ja3MgZm9yIGluZGlyZWN0IGJsb2NrcyAqLwotCQl3aGlsZSAoaW5kZXggPCBpbmRpcmVjdF9ibGtzICYmIGNvdW50KSB7Ci0JCQluZXdfYmxvY2tzW2luZGV4KytdID0gY3VycmVudF9ibG9jaysrOwotCQkJY291bnQtLTsKLQkJfQotCQlpZiAoY291bnQgPiAwKSB7Ci0JCQkvKgotCQkJICogc2F2ZSB0aGUgbmV3IGJsb2NrIG51bWJlcgotCQkJICogZm9yIHRoZSBmaXJzdCBkaXJlY3QgYmxvY2sKLQkJCSAqLwotCQkJbmV3X2Jsb2Nrc1tpbmRleF0gPSBjdXJyZW50X2Jsb2NrOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgcmV0dXJuZWQgbW9yZSBibG9ja3MgdGhhbiAiCi0JCQkJCQkicmVxdWVzdGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlXQVJOX09OKDEpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQl0YXJnZXQgPSBibGtzIC0gY291bnQgOwotCWJsa19hbGxvY2F0ZWQgPSBjb3VudDsKLQlpZiAoIXRhcmdldCkKLQkJZ290byBhbGxvY2F0ZWQ7Ci0JLyogTm93IGFsbG9jYXRlIGRhdGEgYmxvY2tzICovCi0JbWVtc2V0KCZhciwgMCwgc2l6ZW9mKGFyKSk7Ci0JYXIuaW5vZGUgPSBpbm9kZTsKLQlhci5nb2FsID0gZ29hbDsKLQlhci5sZW4gPSB0YXJnZXQ7Ci0JYXIubG9naWNhbCA9IGlibG9jazsKLQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKLQkJLyogZW5hYmxlIGluLWNvcmUgcHJlYWxsb2NhdGlvbiBvbmx5IGZvciByZWd1bGFyIGZpbGVzICovCi0JCWFyLmZsYWdzID0gRVhUNF9NQl9ISU5UX0RBVEE7Ci0KLQljdXJyZW50X2Jsb2NrID0gZXh0NF9tYl9uZXdfYmxvY2tzKGhhbmRsZSwgJmFyLCBlcnIpOwotCWlmICh1bmxpa2VseShjdXJyZW50X2Jsb2NrICsgYXIubGVuID4gRVhUNF9NQVhfQkxPQ0tfRklMRV9QSFlTKSkgewotCQlFWFQ0X0VSUk9SX0lOT0RFKGlub2RlLAotCQkJCSAiY3VycmVudF9ibG9jayAlbGx1ICsgYXIubGVuICVkID4gJWQhIiwKLQkJCQkgY3VycmVudF9ibG9jaywgYXIubGVuLAotCQkJCSBFWFQ0X01BWF9CTE9DS19GSUxFX1BIWVMpOwotCQkqZXJyID0gLUVJTzsKLQkJZ290byBmYWlsZWRfb3V0OwotCX0KLQotCWlmICgqZXJyICYmICh0YXJnZXQgPT0gYmxrcykpIHsKLQkJLyoKLQkJICogaWYgdGhlIGFsbG9jYXRpb24gZmFpbGVkIGFuZCB3ZSBkaWRuJ3QgYWxsb2NhdGUKLQkJICogYW55IGJsb2NrcyBiZWZvcmUKLQkJICovCi0JCWdvdG8gZmFpbGVkX291dDsKLQl9Ci0JaWYgKCEqZXJyKSB7Ci0JCWlmICh0YXJnZXQgPT0gYmxrcykgewotCQkJLyoKLQkJCSAqIHNhdmUgdGhlIG5ldyBibG9jayBudW1iZXIKLQkJCSAqIGZvciB0aGUgZmlyc3QgZGlyZWN0IGJsb2NrCi0JCQkgKi8KLQkJCW5ld19ibG9ja3NbaW5kZXhdID0gY3VycmVudF9ibG9jazsKLQkJfQotCQlibGtfYWxsb2NhdGVkICs9IGFyLmxlbjsKLQl9Ci1hbGxvY2F0ZWQ6Ci0JLyogdG90YWwgbnVtYmVyIG9mIGJsb2NrcyBhbGxvY2F0ZWQgZm9yIGRpcmVjdCBibG9ja3MgKi8KLQlyZXQgPSBibGtfYWxsb2NhdGVkOwotCSplcnIgPSAwOwotCXJldHVybiByZXQ7Ci1mYWlsZWRfb3V0OgotCWZvciAoaSA9IDA7IGkgPCBpbmRleDsgaSsrKQotCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIG5ld19ibG9ja3NbaV0sIDEsIDApOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICoJZXh0NF9hbGxvY19icmFuY2ggLSBhbGxvY2F0ZSBhbmQgc2V0IHVwIGEgY2hhaW4gb2YgYmxvY2tzLgotICoJQGhhbmRsZTogaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCi0gKglAaW5vZGU6IG93bmVyCi0gKglAaW5kaXJlY3RfYmxrczogbnVtYmVyIG9mIGFsbG9jYXRlZCBpbmRpcmVjdCBibG9ja3MKLSAqCUBibGtzOiBudW1iZXIgb2YgYWxsb2NhdGVkIGRpcmVjdCBibG9ja3MKLSAqCUBnb2FsOiBwcmVmZXJyZWQgcGxhY2UgZm9yIGFsbG9jYXRpb24KLSAqCUBvZmZzZXRzOiBvZmZzZXRzIChpbiB0aGUgYmxvY2tzKSB0byBzdG9yZSB0aGUgcG9pbnRlcnMgdG8gbmV4dC4KLSAqCUBicmFuY2g6IHBsYWNlIHRvIHN0b3JlIHRoZSBjaGFpbiBpbi4KLSAqCi0gKglUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBibG9ja3MsIHplcm9lcyBvdXQgYWxsIGJ1dCB0aGUgbGFzdCBvbmUsCi0gKglsaW5rcyB0aGVtIGludG8gY2hhaW4gYW5kIChpZiB3ZSBhcmUgc3luY2hyb25vdXMpIHdyaXRlcyB0aGVtIHRvIGRpc2suCi0gKglJbiBvdGhlciB3b3JkcywgaXQgcHJlcGFyZXMgYSBicmFuY2ggdGhhdCBjYW4gYmUgc3BsaWNlZCBvbnRvIHRoZQotICoJaW5vZGUuIEl0IHN0b3JlcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhhdCBjaGFpbiBpbiB0aGUgYnJhbmNoW10sIGluCi0gKgl0aGUgc2FtZSBmb3JtYXQgYXMgZXh0NF9nZXRfYnJhbmNoKCkgd291bGQgZG8uIFdlIGFyZSBjYWxsaW5nIGl0IGFmdGVyCi0gKgl3ZSBoYWQgcmVhZCB0aGUgZXhpc3RpbmcgcGFydCBvZiBjaGFpbiBhbmQgcGFydGlhbCBwb2ludHMgdG8gdGhlIGxhc3QKLSAqCXRyaXBsZSBvZiB0aGF0IChvbmUgd2l0aCB6ZXJvIC0+a2V5KS4gVXBvbiB0aGUgZXhpdCB3ZSBoYXZlIHRoZSBzYW1lCi0gKglwaWN0dXJlIGFzIGFmdGVyIHRoZSBzdWNjZXNzZnVsIGV4dDRfZ2V0X2Jsb2NrKCksIGV4Y2VwdCB0aGF0IGluIG9uZQotICoJcGxhY2UgY2hhaW4gaXMgZGlzY29ubmVjdGVkIC0gKmJyYW5jaC0+cCBpcyBzdGlsbCB6ZXJvICh3ZSBkaWQgbm90Ci0gKglzZXQgdGhlIGxhc3QgbGluayksIGJ1dCBicmFuY2gtPmtleSBjb250YWlucyB0aGUgbnVtYmVyIHRoYXQgc2hvdWxkCi0gKgliZSBwbGFjZWQgaW50byAqYnJhbmNoLT5wIHRvIGZpbGwgdGhhdCBnYXAuCi0gKgotICoJSWYgYWxsb2NhdGlvbiBmYWlscyB3ZSBmcmVlIGFsbCBibG9ja3Mgd2UndmUgYWxsb2NhdGVkIChhbmQgZm9yZ2V0Ci0gKgl0aGVpciBidWZmZXJfaGVhZHMpIGFuZCByZXR1cm4gdGhlIGVycm9yIHZhbHVlIHRoZSBmcm9tIGZhaWxlZAotICoJZXh0NF9hbGxvY19ibG9jaygpIChub3JtYWxseSAtRU5PU1BDKS4gT3RoZXJ3aXNlIHdlIHNldCB0aGUgY2hhaW4KLSAqCWFzIGRlc2NyaWJlZCBhYm92ZSBhbmQgcmV0dXJuIDAuCi0gKi8KLXN0YXRpYyBpbnQgZXh0NF9hbGxvY19icmFuY2goaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICAgZXh0NF9sYmxrX3QgaWJsb2NrLCBpbnQgaW5kaXJlY3RfYmxrcywKLQkJCSAgICAgaW50ICpibGtzLCBleHQ0X2ZzYmxrX3QgZ29hbCwKLQkJCSAgICAgZXh0NF9sYmxrX3QgKm9mZnNldHMsIEluZGlyZWN0ICpicmFuY2gpCi17Ci0JaW50IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKLQlpbnQgaSwgbiA9IDA7Ci0JaW50IGVyciA9IDA7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKLQlpbnQgbnVtOwotCWV4dDRfZnNibGtfdCBuZXdfYmxvY2tzWzRdOwotCWV4dDRfZnNibGtfdCBjdXJyZW50X2Jsb2NrOwotCi0JbnVtID0gZXh0NF9hbGxvY19ibG9ja3MoaGFuZGxlLCBpbm9kZSwgaWJsb2NrLCBnb2FsLCBpbmRpcmVjdF9ibGtzLAotCQkJCSpibGtzLCBuZXdfYmxvY2tzLCAmZXJyKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JYnJhbmNoWzBdLmtleSA9IGNwdV90b19sZTMyKG5ld19ibG9ja3NbMF0pOwotCS8qCi0JICogbWV0YWRhdGEgYmxvY2tzIGFuZCBkYXRhIGJsb2NrcyBhcmUgYWxsb2NhdGVkLgotCSAqLwotCWZvciAobiA9IDE7IG4gPD0gaW5kaXJlY3RfYmxrczsgIG4rKykgewotCQkvKgotCQkgKiBHZXQgYnVmZmVyX2hlYWQgZm9yIHBhcmVudCBibG9jaywgemVybyBpdCBvdXQKLQkJICogYW5kIHNldCB0aGUgcG9pbnRlciB0byBuZXcgb25lLCB0aGVuIHNlbmQKLQkJICogcGFyZW50IHRvIGRpc2suCi0JCSAqLwotCQliaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgbmV3X2Jsb2Nrc1tuLTFdKTsKLQkJaWYgKHVubGlrZWx5KCFiaCkpIHsKLQkJCWVyciA9IC1FSU87Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCi0JCWJyYW5jaFtuXS5iaCA9IGJoOwotCQlsb2NrX2J1ZmZlcihiaCk7Ci0JCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZ2V0X2NyZWF0ZV9hY2Nlc3MiKTsKLQkJZXJyID0gZXh0NF9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgYmgpOwotCQlpZiAoZXJyKSB7Ci0JCQkvKiBEb24ndCBicmVsc2UoYmgpIGhlcmU7IGl0J3MgZG9uZSBpbgotCQkJICogZXh0NF9qb3VybmFsX2ZvcmdldCgpIGJlbG93ICovCi0JCQl1bmxvY2tfYnVmZmVyKGJoKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLQkJbWVtc2V0KGJoLT5iX2RhdGEsIDAsIGJsb2Nrc2l6ZSk7Ci0JCWJyYW5jaFtuXS5wID0gKF9fbGUzMiAqKSBiaC0+Yl9kYXRhICsgb2Zmc2V0c1tuXTsKLQkJYnJhbmNoW25dLmtleSA9IGNwdV90b19sZTMyKG5ld19ibG9ja3Nbbl0pOwotCQkqYnJhbmNoW25dLnAgPSBicmFuY2hbbl0ua2V5OwotCQlpZiAobiA9PSBpbmRpcmVjdF9ibGtzKSB7Ci0JCQljdXJyZW50X2Jsb2NrID0gbmV3X2Jsb2Nrc1tuXTsKLQkJCS8qCi0JCQkgKiBFbmQgb2YgY2hhaW4sIHVwZGF0ZSB0aGUgbGFzdCBuZXcgbWV0YWJsb2NrIG9mCi0JCQkgKiB0aGUgY2hhaW4gdG8gcG9pbnQgdG8gdGhlIG5ldyBhbGxvY2F0ZWQKLQkJCSAqIGRhdGEgYmxvY2tzIG51bWJlcnMKLQkJCSAqLwotCQkJZm9yIChpID0gMTsgaSA8IG51bTsgaSsrKQotCQkJCSooYnJhbmNoW25dLnAgKyBpKSA9IGNwdV90b19sZTMyKCsrY3VycmVudF9ibG9jayk7Ci0JCX0KLQkJQlVGRkVSX1RSQUNFKGJoLCAibWFya2luZyB1cHRvZGF0ZSIpOwotCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKLQkJdW5sb2NrX2J1ZmZlcihiaCk7Ci0KLQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOwotCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGZhaWxlZDsKLQl9Ci0JKmJsa3MgPSBudW07Ci0JcmV0dXJuIGVycjsKLWZhaWxlZDoKLQkvKiBBbGxvY2F0aW9uIGZhaWxlZCwgZnJlZSB3aGF0IHdlIGFscmVhZHkgYWxsb2NhdGVkICovCi0JZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLCBuZXdfYmxvY2tzWzBdLCAxLCAwKTsKLQlmb3IgKGkgPSAxOyBpIDw9IG4gOyBpKyspIHsKLQkJLyoKLQkJICogYnJhbmNoW2ldLmJoIGlzIG5ld2x5IGFsbG9jYXRlZCwgc28gdGhlcmUgaXMgbm8KLQkJICogbmVlZCB0byByZXZva2UgdGhlIGJsb2NrLCB3aGljaCBpcyB3aHkgd2UgZG9uJ3QKLQkJICogbmVlZCB0byBzZXQgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQS4KLQkJICovCi0JCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgTlVMTCwgbmV3X2Jsb2Nrc1tpXSwgMSwKLQkJCQkgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpOwotCX0KLQlmb3IgKGkgPSBuKzE7IGkgPCBpbmRpcmVjdF9ibGtzOyBpKyspCi0JCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgTlVMTCwgbmV3X2Jsb2Nrc1tpXSwgMSwgMCk7Ci0KLQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIG5ld19ibG9ja3NbaV0sIG51bSwgMCk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0vKioKLSAqIGV4dDRfc3BsaWNlX2JyYW5jaCAtIHNwbGljZSB0aGUgYWxsb2NhdGVkIGJyYW5jaCBvbnRvIGlub2RlLgotICogQGhhbmRsZTogaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCi0gKiBAaW5vZGU6IG93bmVyCi0gKiBAYmxvY2s6IChsb2dpY2FsKSBudW1iZXIgb2YgYmxvY2sgd2UgYXJlIGFkZGluZwotICogQGNoYWluOiBjaGFpbiBvZiBpbmRpcmVjdCBibG9ja3MgKHdpdGggYSBtaXNzaW5nIGxpbmsgLSBzZWUKLSAqCWV4dDRfYWxsb2NfYnJhbmNoKQotICogQHdoZXJlOiBsb2NhdGlvbiBvZiBtaXNzaW5nIGxpbmsKLSAqIEBudW06ICAgbnVtYmVyIG9mIGluZGlyZWN0IGJsb2NrcyB3ZSBhcmUgYWRkaW5nCi0gKiBAYmxrczogIG51bWJlciBvZiBkaXJlY3QgYmxvY2tzIHdlIGFyZSBhZGRpbmcKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGZpbGxzIHRoZSBtaXNzaW5nIGxpbmsgYW5kIGRvZXMgYWxsIGhvdXNla2VlcGluZyBuZWVkZWQgaW4KLSAqIGlub2RlICgtPmlfYmxvY2tzLCBldGMuKS4gSW4gY2FzZSBvZiBzdWNjZXNzIHdlIGVuZCB1cCB3aXRoIHRoZSBmdWxsCi0gKiBjaGFpbiB0byBuZXcgYmxvY2sgYW5kIHJldHVybiAwLgotICovCi1zdGF0aWMgaW50IGV4dDRfc3BsaWNlX2JyYW5jaChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgICAgZXh0NF9sYmxrX3QgYmxvY2ssIEluZGlyZWN0ICp3aGVyZSwgaW50IG51bSwKLQkJCSAgICAgIGludCBibGtzKQotewotCWludCBpOwotCWludCBlcnIgPSAwOwotCWV4dDRfZnNibGtfdCBjdXJyZW50X2Jsb2NrOwotCi0JLyoKLQkgKiBJZiB3ZSdyZSBzcGxpY2luZyBpbnRvIGEgW3RkXWluZGlyZWN0IGJsb2NrIChhcyBvcHBvc2VkIHRvIHRoZQotCSAqIGlub2RlKSB0aGVuIHdlIG5lZWQgdG8gZ2V0IHdyaXRlIGFjY2VzcyB0byB0aGUgW3RkXWluZGlyZWN0IGJsb2NrCi0JICogYmVmb3JlIHRoZSBzcGxpY2UuCi0JICovCi0JaWYgKHdoZXJlLT5iaCkgewotCQlCVUZGRVJfVFJBQ0Uod2hlcmUtPmJoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOwotCQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIHdoZXJlLT5iaCk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycl9vdXQ7Ci0JfQotCS8qIFRoYXQncyBpdCAqLwotCi0JKndoZXJlLT5wID0gd2hlcmUtPmtleTsKLQotCS8qCi0JICogVXBkYXRlIHRoZSBob3N0IGJ1ZmZlcl9oZWFkIG9yIGlub2RlIHRvIHBvaW50IHRvIG1vcmUganVzdCBhbGxvY2F0ZWQKLQkgKiBkaXJlY3QgYmxvY2tzIGJsb2NrcwotCSAqLwotCWlmIChudW0gPT0gMCAmJiBibGtzID4gMSkgewotCQljdXJyZW50X2Jsb2NrID0gbGUzMl90b19jcHUod2hlcmUtPmtleSkgKyAxOwotCQlmb3IgKGkgPSAxOyBpIDwgYmxrczsgaSsrKQotCQkJKih3aGVyZS0+cCArIGkpID0gY3B1X3RvX2xlMzIoY3VycmVudF9ibG9jaysrKTsKLQl9Ci0KLQkvKiBXZSBhcmUgZG9uZSB3aXRoIGF0b21pYyBzdHVmZiwgbm93IGRvIHRoZSByZXN0IG9mIGhvdXNla2VlcGluZyAqLwotCS8qIGhhZCB3ZSBzcGxpY2VkIGl0IG9udG8gaW5kaXJlY3QgYmxvY2s/ICovCi0JaWYgKHdoZXJlLT5iaCkgewotCQkvKgotCQkgKiBJZiB3ZSBzcGxpY2VkIGl0IG9udG8gYW4gaW5kaXJlY3QgYmxvY2ssIHdlIGhhdmVuJ3QKLQkJICogYWx0ZXJlZCB0aGUgaW5vZGUuICBOb3RlIGhvd2V2ZXIgdGhhdCBpZiBpdCBpcyBiZWluZyBzcGxpY2VkCi0JCSAqIG9udG8gYW4gaW5kaXJlY3QgYmxvY2sgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBmaWxlICh0aGUKLQkJICogZmlsZSBpcyBncm93aW5nKSB0aGVuIHdlICp3aWxsKiBhbHRlciB0aGUgaW5vZGUgdG8gcmVmbGVjdAotCQkgKiB0aGUgbmV3IGlfc2l6ZS4gIEJ1dCB0aGF0IGlzIG5vdCBkb25lIGhlcmUgLSBpdCBpcyBkb25lIGluCi0JCSAqIGdlbmVyaWNfY29tbWl0X3dyaXRlLT5fX21hcmtfaW5vZGVfZGlydHktPmV4dDRfZGlydHlfaW5vZGUuCi0JCSAqLwotCQlqYmRfZGVidWcoNSwgInNwbGljaW5nIGluZGlyZWN0IG9ubHlcbiIpOwotCQlCVUZGRVJfVFJBQ0Uod2hlcmUtPmJoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOwotCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCB3aGVyZS0+YmgpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJfb3V0OwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIE9LLCB3ZSBzcGxpY2VkIGl0IGludG8gdGhlIGlub2RlIGl0c2VsZiBvbiBhIGRpcmVjdCBibG9jay4KLQkJICovCi0JCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKLQkJamJkX2RlYnVnKDUsICJzcGxpY2luZyBkaXJlY3RcbiIpOwotCX0KLQlyZXR1cm4gZXJyOwotCi1lcnJfb3V0OgotCWZvciAoaSA9IDE7IGkgPD0gbnVtOyBpKyspIHsKLQkJLyoKLQkJICogYnJhbmNoW2ldLmJoIGlzIG5ld2x5IGFsbG9jYXRlZCwgc28gdGhlcmUgaXMgbm8KLQkJICogbmVlZCB0byByZXZva2UgdGhlIGJsb2NrLCB3aGljaCBpcyB3aHkgd2UgZG9uJ3QKLQkJICogbmVlZCB0byBzZXQgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQS4KLQkJICovCi0JCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgd2hlcmVbaV0uYmgsIDAsIDEsCi0JCQkJIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTsKLQl9Ci0JZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLCBsZTMyX3RvX2NwdSh3aGVyZVtudW1dLmtleSksCi0JCQkgYmxrcywgMCk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogVGhlIGV4dDRfaW5kX21hcF9ibG9ja3MoKSBmdW5jdGlvbiBoYW5kbGVzIG5vbi1leHRlbnRzIGlub2RlcwotICogKGkuZS4sIHVzaW5nIHRoZSB0cmFkaXRpb25hbCBpbmRpcmVjdC9kb3VibGUtaW5kaXJlY3QgaV9ibG9ja3MKLSAqIHNjaGVtZSkgZm9yIGV4dDRfbWFwX2Jsb2NrcygpLgotICoKLSAqIEFsbG9jYXRpb24gc3RyYXRlZ3kgaXMgc2ltcGxlOiBpZiB3ZSBoYXZlIHRvIGFsbG9jYXRlIHNvbWV0aGluZywgd2Ugd2lsbAotICogaGF2ZSB0byBnbyB0aGUgd2hvbGUgd2F5IHRvIGxlYWYuIFNvIGxldCdzIGRvIGl0IGJlZm9yZSBhdHRhY2hpbmcgYW55dGhpbmcKLSAqIHRvIHRyZWUsIHNldCBsaW5rYWdlIGJldHdlZW4gdGhlIG5ld2Jvcm4gYmxvY2tzLCB3cml0ZSB0aGVtIGlmIHN5bmMgaXMKLSAqIHJlcXVpcmVkLCByZWNoZWNrIHRoZSBwYXRoLCBmcmVlIGFuZCByZXBlYXQgaWYgY2hlY2sgZmFpbHMsIG90aGVyd2lzZQotICogc2V0IHRoZSBsYXN0IG1pc3NpbmcgbGluayAodGhhdCB3aWxsIHByb3RlY3QgdXMgZnJvbSBhbnkgdHJ1bmNhdGUtZ2VuZXJhdGVkCi0gKiByZW1vdmFscyAtIGFsbCBibG9ja3Mgb24gdGhlIHBhdGggYXJlIGltbXVuZSBub3cpIGFuZCBwb3NzaWJseSBmb3JjZSB0aGUKLSAqIHdyaXRlIG9uIHRoZSBwYXJlbnQgYmxvY2suCi0gKiBUaGF0IGhhcyBhIG5pY2UgYWRkaXRpb25hbCBwcm9wZXJ0eTogbm8gc3BlY2lhbCByZWNvdmVyeSBmcm9tIHRoZSBmYWlsZWQKLSAqIGFsbG9jYXRpb25zIGlzIG5lZWRlZCAtIHdlIHNpbXBseSByZWxlYXNlIGJsb2NrcyBhbmQgZG8gbm90IHRvdWNoIGFueXRoaW5nCi0gKiByZWFjaGFibGUgZnJvbSBpbm9kZS4KLSAqCi0gKiBgaGFuZGxlJyBjYW4gYmUgTlVMTCBpZiBjcmVhdGUgPT0gMC4KLSAqCi0gKiByZXR1cm4gPiAwLCAjIG9mIGJsb2NrcyBtYXBwZWQgb3IgYWxsb2NhdGVkLgotICogcmV0dXJuID0gMCwgaWYgcGxhaW4gbG9va3VwIGZhaWxlZC4KLSAqIHJldHVybiA8IDAsIGVycm9yIGNhc2UuCi0gKgotICogVGhlIGV4dDRfaW5kX2dldF9ibG9ja3MoKSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGgKLSAqIGRvd25fd3JpdGUoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pIGlmIGFsbG9jYXRpbmcgZmlsZXN5c3RlbQotICogYmxvY2tzIChpLmUuLCBmbGFncyBoYXMgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSBzZXQpIG9yCi0gKiBkb3duX3JlYWQoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pIGlmIG5vdCBhbGxvY2F0aW5nIGZpbGUgc3lzdGVtCi0gKiBibG9ja3MuCi0gKi8KLXN0YXRpYyBpbnQgZXh0NF9pbmRfbWFwX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgICAgIHN0cnVjdCBleHQ0X21hcF9ibG9ja3MgKm1hcCwKLQkJCSAgICAgICBpbnQgZmxhZ3MpCi17Ci0JaW50IGVyciA9IC1FSU87Ci0JZXh0NF9sYmxrX3Qgb2Zmc2V0c1s0XTsKLQlJbmRpcmVjdCBjaGFpbls0XTsKLQlJbmRpcmVjdCAqcGFydGlhbDsKLQlleHQ0X2ZzYmxrX3QgZ29hbDsKLQlpbnQgaW5kaXJlY3RfYmxrczsKLQlpbnQgYmxvY2tzX3RvX2JvdW5kYXJ5ID0gMDsKLQlpbnQgZGVwdGg7Ci0JaW50IGNvdW50ID0gMDsKLQlleHQ0X2ZzYmxrX3QgZmlyc3RfYmxvY2sgPSAwOwotCi0JdHJhY2VfZXh0NF9pbmRfbWFwX2Jsb2Nrc19lbnRlcihpbm9kZSwgbWFwLT5tX2xibGssIG1hcC0+bV9sZW4sIGZsYWdzKTsKLQlKX0FTU0VSVCghKGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpKSk7Ci0JSl9BU1NFUlQoaGFuZGxlICE9IE5VTEwgfHwgKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSkgPT0gMCk7Ci0JZGVwdGggPSBleHQ0X2Jsb2NrX3RvX3BhdGgoaW5vZGUsIG1hcC0+bV9sYmxrLCBvZmZzZXRzLAotCQkJCSAgICZibG9ja3NfdG9fYm91bmRhcnkpOwotCi0JaWYgKGRlcHRoID09IDApCi0JCWdvdG8gb3V0OwotCi0JcGFydGlhbCA9IGV4dDRfZ2V0X2JyYW5jaChpbm9kZSwgZGVwdGgsIG9mZnNldHMsIGNoYWluLCAmZXJyKTsKLQotCS8qIFNpbXBsZXN0IGNhc2UgLSBibG9jayBmb3VuZCwgbm8gYWxsb2NhdGlvbiBuZWVkZWQgKi8KLQlpZiAoIXBhcnRpYWwpIHsKLQkJZmlyc3RfYmxvY2sgPSBsZTMyX3RvX2NwdShjaGFpbltkZXB0aCAtIDFdLmtleSk7Ci0JCWNvdW50Kys7Ci0JCS8qbWFwIG1vcmUgYmxvY2tzKi8KLQkJd2hpbGUgKGNvdW50IDwgbWFwLT5tX2xlbiAmJiBjb3VudCA8PSBibG9ja3NfdG9fYm91bmRhcnkpIHsKLQkJCWV4dDRfZnNibGtfdCBibGs7Ci0KLQkJCWJsayA9IGxlMzJfdG9fY3B1KCooY2hhaW5bZGVwdGgtMV0ucCArIGNvdW50KSk7Ci0KLQkJCWlmIChibGsgPT0gZmlyc3RfYmxvY2sgKyBjb3VudCkKLQkJCQljb3VudCsrOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JCWdvdG8gZ290X2l0OwotCX0KLQotCS8qIE5leHQgc2ltcGxlIGNhc2UgLSBwbGFpbiBsb29rdXAgb3IgZmFpbGVkIHJlYWQgb2YgaW5kaXJlY3QgYmxvY2sgKi8KLQlpZiAoKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSkgPT0gMCB8fCBlcnIgPT0gLUVJTykKLQkJZ290byBjbGVhbnVwOwotCi0JLyoKLQkgKiBPa2F5LCB3ZSBuZWVkIHRvIGRvIGJsb2NrIGFsbG9jYXRpb24uCi0JKi8KLQlnb2FsID0gZXh0NF9maW5kX2dvYWwoaW5vZGUsIG1hcC0+bV9sYmxrLCBwYXJ0aWFsKTsKLQotCS8qIHRoZSBudW1iZXIgb2YgYmxvY2tzIG5lZWQgdG8gYWxsb2NhdGUgZm9yIFtkLHRdaW5kaXJlY3QgYmxvY2tzICovCi0JaW5kaXJlY3RfYmxrcyA9IChjaGFpbiArIGRlcHRoKSAtIHBhcnRpYWwgLSAxOwotCi0JLyoKLQkgKiBOZXh0IGxvb2sgdXAgdGhlIGluZGlyZWN0IG1hcCB0byBjb3VudCB0aGUgdG90b2FsIG51bWJlciBvZgotCSAqIGRpcmVjdCBibG9ja3MgdG8gYWxsb2NhdGUgZm9yIHRoaXMgYnJhbmNoLgotCSAqLwotCWNvdW50ID0gZXh0NF9ibGtzX3RvX2FsbG9jYXRlKHBhcnRpYWwsIGluZGlyZWN0X2Jsa3MsCi0JCQkJICAgICAgbWFwLT5tX2xlbiwgYmxvY2tzX3RvX2JvdW5kYXJ5KTsKLQkvKgotCSAqIEJsb2NrIG91dCBleHQ0X3RydW5jYXRlIHdoaWxlIHdlIGFsdGVyIHRoZSB0cmVlCi0JICovCi0JZXJyID0gZXh0NF9hbGxvY19icmFuY2goaGFuZGxlLCBpbm9kZSwgbWFwLT5tX2xibGssIGluZGlyZWN0X2Jsa3MsCi0JCQkJJmNvdW50LCBnb2FsLAotCQkJCW9mZnNldHMgKyAocGFydGlhbCAtIGNoYWluKSwgcGFydGlhbCk7Ci0KLQkvKgotCSAqIFRoZSBleHQ0X3NwbGljZV9icmFuY2ggY2FsbCB3aWxsIGZyZWUgYW5kIGZvcmdldCBhbnkgYnVmZmVycwotCSAqIG9uIHRoZSBuZXcgY2hhaW4gaWYgdGhlcmUgaXMgYSBmYWlsdXJlLCBidXQgdGhhdCByaXNrcyB1c2luZwotCSAqIHVwIHRyYW5zYWN0aW9uIGNyZWRpdHMsIGVzcGVjaWFsbHkgZm9yIGJpdG1hcHMgd2hlcmUgdGhlCi0JICogY3JlZGl0cyBjYW5ub3QgYmUgcmV0dXJuZWQuICBDYW4gd2UgaGFuZGxlIHRoaXMgc29tZWhvdz8gIFdlCi0JICogbWF5IG5lZWQgdG8gcmV0dXJuIC1FQUdBSU4gdXB3YXJkcyBpbiB0aGUgd29yc3QgY2FzZS4gIC0tc2N0Ci0JICovCi0JaWYgKCFlcnIpCi0JCWVyciA9IGV4dDRfc3BsaWNlX2JyYW5jaChoYW5kbGUsIGlub2RlLCBtYXAtPm1fbGJsaywKLQkJCQkJIHBhcnRpYWwsIGluZGlyZWN0X2Jsa3MsIGNvdW50KTsKLQlpZiAoZXJyKQotCQlnb3RvIGNsZWFudXA7Ci0KLQltYXAtPm1fZmxhZ3MgfD0gRVhUNF9NQVBfTkVXOwotCi0JZXh0NF91cGRhdGVfaW5vZGVfZnN5bmNfdHJhbnMoaGFuZGxlLCBpbm9kZSwgMSk7Ci1nb3RfaXQ6Ci0JbWFwLT5tX2ZsYWdzIHw9IEVYVDRfTUFQX01BUFBFRDsKLQltYXAtPm1fcGJsayA9IGxlMzJfdG9fY3B1KGNoYWluW2RlcHRoLTFdLmtleSk7Ci0JbWFwLT5tX2xlbiA9IGNvdW50OwotCWlmIChjb3VudCA+IGJsb2Nrc190b19ib3VuZGFyeSkKLQkJbWFwLT5tX2ZsYWdzIHw9IEVYVDRfTUFQX0JPVU5EQVJZOwotCWVyciA9IGNvdW50OwotCS8qIENsZWFuIHVwIGFuZCBleGl0ICovCi0JcGFydGlhbCA9IGNoYWluICsgZGVwdGggLSAxOwkvKiB0aGUgd2hvbGUgY2hhaW4gKi8KLWNsZWFudXA6Ci0Jd2hpbGUgKHBhcnRpYWwgPiBjaGFpbikgewotCQlCVUZGRVJfVFJBQ0UocGFydGlhbC0+YmgsICJjYWxsIGJyZWxzZSIpOwotCQlicmVsc2UocGFydGlhbC0+YmgpOwotCQlwYXJ0aWFsLS07Ci0JfQotb3V0OgotCXRyYWNlX2V4dDRfaW5kX21hcF9ibG9ja3NfZXhpdChpbm9kZSwgbWFwLT5tX2xibGssCi0JCQkJbWFwLT5tX3BibGssIG1hcC0+bV9sZW4sIGVycik7Ci0JcmV0dXJuIGVycjsKLX0KLQogI2lmZGVmIENPTkZJR19RVU9UQQogcXNpemVfdCAqZXh0NF9nZXRfcmVzZXJ2ZWRfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSkKIHsKQEAgLTEwNzMsMzMgKzI0NCw2IEBACiAKIC8qCiAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBtZXRhZGF0YSBibG9ja3MgbmVlZCB0byByZXNlcnZlCi0gKiB0byBhbGxvY2F0ZSBhIG5ldyBibG9jayBhdCBAbGJsb2NrcyBmb3Igbm9uIGV4dGVudCBmaWxlIGJhc2VkIGZpbGUKLSAqLwotc3RhdGljIGludCBleHQ0X2luZGlyZWN0X2NhbGNfbWV0YWRhdGFfYW1vdW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJCSAgICAgIHNlY3Rvcl90IGxibG9jaykKLXsKLQlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7Ci0Jc2VjdG9yX3QgZGluZF9tYXNrID0gfigoc2VjdG9yX3QpRVhUNF9BRERSX1BFUl9CTE9DSyhpbm9kZS0+aV9zYikgLSAxKTsKLQlpbnQgYmxrX2JpdHM7Ci0KLQlpZiAobGJsb2NrIDwgRVhUNF9ORElSX0JMT0NLUykKLQkJcmV0dXJuIDA7Ci0KLQlsYmxvY2sgLT0gRVhUNF9ORElSX0JMT0NLUzsKLQotCWlmIChlaS0+aV9kYV9tZXRhZGF0YV9jYWxjX2xlbiAmJgotCSAgICAobGJsb2NrICYgZGluZF9tYXNrKSA9PSBlaS0+aV9kYV9tZXRhZGF0YV9jYWxjX2xhc3RfbGJsb2NrKSB7Ci0JCWVpLT5pX2RhX21ldGFkYXRhX2NhbGNfbGVuKys7Ci0JCXJldHVybiAwOwotCX0KLQllaS0+aV9kYV9tZXRhZGF0YV9jYWxjX2xhc3RfbGJsb2NrID0gbGJsb2NrICYgZGluZF9tYXNrOwotCWVpLT5pX2RhX21ldGFkYXRhX2NhbGNfbGVuID0gMTsKLQlibGtfYml0cyA9IG9yZGVyX2Jhc2VfMihsYmxvY2spOwotCXJldHVybiAoYmxrX2JpdHMgLyBFWFQ0X0FERFJfUEVSX0JMT0NLX0JJVFMoaW5vZGUtPmlfc2IpKSArIDE7Ci19Ci0KLS8qCi0gKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBtZXRhZGF0YSBibG9ja3MgbmVlZCB0byByZXNlcnZlCiAgKiB0byBhbGxvY2F0ZSBhIGJsb2NrIGxvY2F0ZWQgYXQgQGxibG9jawogICovCiBzdGF0aWMgaW50IGV4dDRfY2FsY19tZXRhZGF0YV9hbW91bnQoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgbGJsb2NrKQpAQCAtMTEwNyw3ICsyNTEsNyBAQAogCWlmIChleHQ0X3Rlc3RfaW5vZGVfZmxhZyhpbm9kZSwgRVhUNF9JTk9ERV9FWFRFTlRTKSkKIAkJcmV0dXJuIGV4dDRfZXh0X2NhbGNfbWV0YWRhdGFfYW1vdW50KGlub2RlLCBsYmxvY2spOwogCi0JcmV0dXJuIGV4dDRfaW5kaXJlY3RfY2FsY19tZXRhZGF0YV9hbW91bnQoaW5vZGUsIGxibG9jayk7CisJcmV0dXJuIGV4dDRfaW5kX2NhbGNfbWV0YWRhdGFfYW1vdW50KGlub2RlLCBsYmxvY2spOwogfQogCiAvKgpAQCAtMTU4OSwxNiArNzMzLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogVHJ1bmNhdGUgYmxvY2tzIHRoYXQgd2VyZSBub3QgdXNlZCBieSB3cml0ZS4gV2UgaGF2ZSB0byB0cnVuY2F0ZSB0aGUKLSAqIHBhZ2VjYWNoZSBhcyB3ZWxsIHNvIHRoYXQgY29ycmVzcG9uZGluZyBidWZmZXJzIGdldCBwcm9wZXJseSB1bm1hcHBlZC4KLSAqLwotc3RhdGljIHZvaWQgZXh0NF90cnVuY2F0ZV9mYWlsZWRfd3JpdGUoc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhpbm9kZS0+aV9tYXBwaW5nLCBpbm9kZS0+aV9zaXplKTsKLQlleHQ0X3RydW5jYXRlKGlub2RlKTsKLX0KLQogc3RhdGljIGludCBleHQ0X2dldF9ibG9ja193cml0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssCiAJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKTsKIHN0YXRpYyBpbnQgZXh0NF93cml0ZV9iZWdpbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCkBAIC0xODYzLDYgKzk5Nyw3IEBACiAJaWYgKG5ld19pX3NpemUgPiBpbm9kZS0+aV9zaXplKQogCQlpX3NpemVfd3JpdGUoaW5vZGUsIHBvcytjb3BpZWQpOwogCWV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX0pEQVRBKTsKKwlFWFQ0X0koaW5vZGUpLT5pX2RhdGFzeW5jX3RpZCA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbi0+dF90aWQ7CiAJaWYgKG5ld19pX3NpemUgPiBFWFQ0X0koaW5vZGUpLT5pX2Rpc2tzaXplKSB7CiAJCWV4dDRfdXBkYXRlX2lfZGlza3NpemUoaW5vZGUsIG5ld19pX3NpemUpOwogCQlyZXQyID0gZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwpAQCAtMjU3MSw2ICsxNzA2LDcgQEAKIAkJCQl3cml0ZV9lbmRfZm4pOwogCWlmIChyZXQgPT0gMCkKIAkJcmV0ID0gZXJyOworCUVYVDRfSShpbm9kZSktPmlfZGF0YXN5bmNfdGlkID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uLT50X3RpZDsKIAllcnIgPSBleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwogCWlmICghcmV0KQogCQlyZXQgPSBlcnI7CkBAIC0zNDUwLDExMiArMjU4Niw2IEBACiB9CiAKIC8qCi0gKiBPX0RJUkVDVCBmb3IgZXh0MyAob3IgaW5kaXJlY3QgbWFwKSBiYXNlZCBmaWxlcwotICoKLSAqIElmIHRoZSBPX0RJUkVDVCB3cml0ZSB3aWxsIGV4dGVuZCB0aGUgZmlsZSB0aGVuIGFkZCB0aGlzIGlub2RlIHRvIHRoZQotICogb3JwaGFuIGxpc3QuICBTbyByZWNvdmVyeSB3aWxsIHRydW5jYXRlIGl0IGJhY2sgdG8gdGhlIG9yaWdpbmFsIHNpemUKLSAqIGlmIHRoZSBtYWNoaW5lIGNyYXNoZXMgZHVyaW5nIHRoZSB3cml0ZS4KLSAqCi0gKiBJZiB0aGUgT19ESVJFQ1Qgd3JpdGUgaXMgaW50YW50aWF0aW5nIGhvbGVzIGluc2lkZSBpX3NpemUgYW5kIHRoZSBtYWNoaW5lCi0gKiBjcmFzaGVzIHRoZW4gc3RhbGUgZGlzayBkYXRhIF9tYXlfIGJlIGV4cG9zZWQgaW5zaWRlIHRoZSBmaWxlLiBCdXQgY3VycmVudAotICogVkZTIGNvZGUgZmFsbHMgYmFjayBpbnRvIGJ1ZmZlcmVkIHBhdGggaW4gdGhhdCBjYXNlIHNvIHdlIGFyZSBzYWZlLgotICovCi1zdGF0aWMgc3NpemVfdCBleHQ0X2luZF9kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKLXsKLQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKLQlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7Ci0JaGFuZGxlX3QgKmhhbmRsZTsKLQlzc2l6ZV90IHJldDsKLQlpbnQgb3JwaGFuID0gMDsKLQlzaXplX3QgY291bnQgPSBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2Vncyk7Ci0JaW50IHJldHJpZXMgPSAwOwotCi0JaWYgKHJ3ID09IFdSSVRFKSB7Ci0JCWxvZmZfdCBmaW5hbF9zaXplID0gb2Zmc2V0ICsgY291bnQ7Ci0KLQkJaWYgKGZpbmFsX3NpemUgPiBpbm9kZS0+aV9zaXplKSB7Ci0JCQkvKiBDcmVkaXRzIGZvciBzYiArIGlub2RlIHdyaXRlICovCi0JCQloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIDIpOwotCQkJaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJcmV0ID0gZXh0NF9vcnBoYW5fYWRkKGhhbmRsZSwgaW5vZGUpOwotCQkJaWYgKHJldCkgewotCQkJCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlvcnBoYW4gPSAxOwotCQkJZWktPmlfZGlza3NpemUgPSBpbm9kZS0+aV9zaXplOwotCQkJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKLQkJfQotCX0KLQotcmV0cnk6Ci0JaWYgKHJ3ID09IFJFQUQgJiYgZXh0NF9zaG91bGRfZGlvcmVhZF9ub2xvY2soaW5vZGUpKQotCQlyZXQgPSBfX2Jsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsCi0JCQkJIGlub2RlLT5pX3NiLT5zX2JkZXYsIGlvdiwKLQkJCQkgb2Zmc2V0LCBucl9zZWdzLAotCQkJCSBleHQ0X2dldF9ibG9jaywgTlVMTCwgTlVMTCwgMCk7Ci0JZWxzZSB7Ci0JCXJldCA9IGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlvdiwKLQkJCQkgb2Zmc2V0LCBucl9zZWdzLCBleHQ0X2dldF9ibG9jayk7Ci0KLQkJaWYgKHVubGlrZWx5KChydyAmIFdSSVRFKSAmJiByZXQgPCAwKSkgewotCQkJbG9mZl90IGlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwotCQkJbG9mZl90IGVuZCA9IG9mZnNldCArIGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKLQotCQkJaWYgKGVuZCA+IGlzaXplKQotCQkJCWV4dDRfdHJ1bmNhdGVfZmFpbGVkX3dyaXRlKGlub2RlKTsKLQkJfQotCX0KLQlpZiAocmV0ID09IC1FTk9TUEMgJiYgZXh0NF9zaG91bGRfcmV0cnlfYWxsb2MoaW5vZGUtPmlfc2IsICZyZXRyaWVzKSkKLQkJZ290byByZXRyeTsKLQotCWlmIChvcnBoYW4pIHsKLQkJaW50IGVycjsKLQotCQkvKiBDcmVkaXRzIGZvciBzYiArIGlub2RlIHdyaXRlICovCi0JCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgMik7Ci0JCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQkJLyogVGhpcyBpcyByZWFsbHkgYmFkIGx1Y2suIFdlJ3ZlIHdyaXR0ZW4gdGhlIGRhdGEKLQkJCSAqIGJ1dCBjYW5ub3QgZXh0ZW5kIGlfc2l6ZS4gQmFpbCBvdXQgYW5kIHByZXRlbmQKLQkJCSAqIHRoZSB3cml0ZSBmYWlsZWQuLi4gKi8KLQkJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKLQkJCWlmIChpbm9kZS0+aV9ubGluaykKLQkJCQlleHQ0X29ycGhhbl9kZWwoTlVMTCwgaW5vZGUpOwotCi0JCQlnb3RvIG91dDsKLQkJfQotCQlpZiAoaW5vZGUtPmlfbmxpbmspCi0JCQlleHQ0X29ycGhhbl9kZWwoaGFuZGxlLCBpbm9kZSk7Ci0JCWlmIChyZXQgPiAwKSB7Ci0JCQlsb2ZmX3QgZW5kID0gb2Zmc2V0ICsgcmV0OwotCQkJaWYgKGVuZCA+IGlub2RlLT5pX3NpemUpIHsKLQkJCQllaS0+aV9kaXNrc2l6ZSA9IGVuZDsKLQkJCQlpX3NpemVfd3JpdGUoaW5vZGUsIGVuZCk7Ci0JCQkJLyoKLQkJCQkgKiBXZSdyZSBnb2luZyB0byByZXR1cm4gYSBwb3NpdGl2ZSBgcmV0JwotCQkJCSAqIGhlcmUgZHVlIHRvIG5vbi16ZXJvLWxlbmd0aCBJL08sIHNvIHRoZXJlJ3MKLQkJCQkgKiBubyB3YXkgb2YgcmVwb3J0aW5nIGVycm9yIHJldHVybnMgZnJvbQotCQkJCSAqIGV4dDRfbWFya19pbm9kZV9kaXJ0eSgpIHRvIHVzZXJzcGFjZS4gIFNvCi0JCQkJICogaWdub3JlIGl0LgotCQkJCSAqLwotCQkJCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKLQkJCX0KLQkJfQotCQllcnIgPSBleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwotCQlpZiAocmV0ID09IDApCi0JCQlyZXQgPSBlcnI7Ci0JfQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLS8qCiAgKiBleHQ0X2dldF9ibG9jayB1c2VkIHdoZW4gcHJlcGFyaW5nIGZvciBhIERJTyB3cml0ZSBvciBidWZmZXIgd3JpdGUuCiAgKiBXZSBhbGxvY2F0ZSBhbiB1aW5pdGlhbGl6ZWQgZXh0ZW50IGlmIGJsb2NrcyBoYXZlbid0IGJlZW4gYWxsb2NhdGVkLgogICogVGhlIGV4dGVudCB3aWxsIGJlIGNvbnZlcnRlZCB0byBpbml0aWFsaXplZCBhZnRlciB0aGUgSU8gaXMgY29tcGxldGUuCkBAIC00MDMzLDM4MyArMzA2Myw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotLyoKLSAqIFByb2JhYmx5IGl0IHNob3VsZCBiZSBhIGxpYnJhcnkgZnVuY3Rpb24uLi4gc2VhcmNoIGZvciBmaXJzdCBub24temVybyB3b3JkCi0gKiBvciBtZW1jbXAgd2l0aCB6ZXJvX3BhZ2UsIHdoYXRldmVyIGlzIGJldHRlciBmb3IgcGFydGljdWxhciBhcmNoaXRlY3R1cmUuCi0gKiBMaW51cz8KLSAqLwotc3RhdGljIGlubGluZSBpbnQgYWxsX3plcm9lcyhfX2xlMzIgKnAsIF9fbGUzMiAqcSkKLXsKLQl3aGlsZSAocCA8IHEpCi0JCWlmICgqcCsrKQotCQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qKgotICoJZXh0NF9maW5kX3NoYXJlZCAtIGZpbmQgdGhlIGluZGlyZWN0IGJsb2NrcyBmb3IgcGFydGlhbCB0cnVuY2F0aW9uLgotICoJQGlub2RlOgkgIGlub2RlIGluIHF1ZXN0aW9uCi0gKglAZGVwdGg6CSAgZGVwdGggb2YgdGhlIGFmZmVjdGVkIGJyYW5jaAotICoJQG9mZnNldHM6IG9mZnNldHMgb2YgcG9pbnRlcnMgaW4gdGhhdCBicmFuY2ggKHNlZSBleHQ0X2Jsb2NrX3RvX3BhdGgpCi0gKglAY2hhaW46CSAgcGxhY2UgdG8gc3RvcmUgdGhlIHBvaW50ZXJzIHRvIHBhcnRpYWwgaW5kaXJlY3QgYmxvY2tzCi0gKglAdG9wOgkgIHBsYWNlIHRvIHRoZSAoZGV0YWNoZWQpIHRvcCBvZiBicmFuY2gKLSAqCi0gKglUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgZXh0NF90cnVuY2F0ZSgpLgotICoKLSAqCVdoZW4gd2UgZG8gdHJ1bmNhdGUoKSB3ZSBtYXkgaGF2ZSB0byBjbGVhbiB0aGUgZW5kcyBvZiBzZXZlcmFsCi0gKglpbmRpcmVjdCBibG9ja3MgYnV0IGxlYXZlIHRoZSBibG9ja3MgdGhlbXNlbHZlcyBhbGl2ZS4gQmxvY2sgaXMKLSAqCXBhcnRpYWxseSB0cnVuY2F0ZWQgaWYgc29tZSBkYXRhIGJlbG93IHRoZSBuZXcgaV9zaXplIGlzIHJlZmVycmVkCi0gKglmcm9tIGl0IChhbmQgaXQgaXMgb24gdGhlIHBhdGggdG8gdGhlIGZpcnN0IGNvbXBsZXRlbHkgdHJ1bmNhdGVkCi0gKglkYXRhIGJsb2NrLCBpbmRlZWQpLiAgV2UgaGF2ZSB0byBmcmVlIHRoZSB0b3Agb2YgdGhhdCBwYXRoIGFsb25nCi0gKgl3aXRoIGV2ZXJ5dGhpbmcgdG8gdGhlIHJpZ2h0IG9mIHRoZSBwYXRoLiBTaW5jZSBubyBhbGxvY2F0aW9uCi0gKglwYXN0IHRoZSB0cnVuY2F0aW9uIHBvaW50IGlzIHBvc3NpYmxlIHVudGlsIGV4dDRfdHJ1bmNhdGUoKQotICoJZmluaXNoZXMsIHdlIG1heSBzYWZlbHkgZG8gdGhlIGxhdHRlciwgYnV0IHRvcCBvZiBicmFuY2ggbWF5Ci0gKglyZXF1aXJlIHNwZWNpYWwgYXR0ZW50aW9uIC0gcGFnZW91dCBiZWxvdyB0aGUgdHJ1bmNhdGlvbiBwb2ludAotICoJbWlnaHQgdHJ5IHRvIHBvcHVsYXRlIGl0LgotICoKLSAqCVdlIGF0b21pY2FsbHkgZGV0YWNoIHRoZSB0b3Agb2YgYnJhbmNoIGZyb20gdGhlIHRyZWUsIHN0b3JlIHRoZQotICoJYmxvY2sgbnVtYmVyIG9mIGl0cyByb290IGluICpAdG9wLCBwb2ludGVycyB0byBidWZmZXJfaGVhZHMgb2YKLSAqCXBhcnRpYWxseSB0cnVuY2F0ZWQgYmxvY2tzIC0gaW4gQGNoYWluW10uYmggYW5kIHBvaW50ZXJzIHRvCi0gKgl0aGVpciBsYXN0IGVsZW1lbnRzIHRoYXQgc2hvdWxkIG5vdCBiZSByZW1vdmVkIC0gaW4KLSAqCUBjaGFpbltdLnAuIFJldHVybiB2YWx1ZSBpcyB0aGUgcG9pbnRlciB0byBsYXN0IGZpbGxlZCBlbGVtZW50Ci0gKglvZiBAY2hhaW4uCi0gKgotICoJVGhlIHdvcmsgbGVmdCB0byBjYWxsZXIgdG8gZG8gdGhlIGFjdHVhbCBmcmVlaW5nIG9mIHN1YnRyZWVzOgotICoJCWEpIGZyZWUgdGhlIHN1YnRyZWUgc3RhcnRpbmcgZnJvbSAqQHRvcAotICoJCWIpIGZyZWUgdGhlIHN1YnRyZWVzIHdob3NlIHJvb3RzIGFyZSBzdG9yZWQgaW4KLSAqCQkJKEBjaGFpbltpXS5wKzEgLi4gZW5kIG9mIEBjaGFpbltpXS5iaC0+Yl9kYXRhKQotICoJCWMpIGZyZWUgdGhlIHN1YnRyZWVzIGdyb3dpbmcgZnJvbSB0aGUgaW5vZGUgcGFzdCB0aGUgQGNoYWluWzBdLgotICoJCQkobm8gcGFydGlhbGx5IHRydW5jYXRlZCBzdHVmZiB0aGVyZSkuICAqLwotCi1zdGF0aWMgSW5kaXJlY3QgKmV4dDRfZmluZF9zaGFyZWQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGRlcHRoLAotCQkJCSAgZXh0NF9sYmxrX3Qgb2Zmc2V0c1s0XSwgSW5kaXJlY3QgY2hhaW5bNF0sCi0JCQkJICBfX2xlMzIgKnRvcCkKLXsKLQlJbmRpcmVjdCAqcGFydGlhbCwgKnA7Ci0JaW50IGssIGVycjsKLQotCSp0b3AgPSAwOwotCS8qIE1ha2UgayBpbmRleCB0aGUgZGVlcGVzdCBub24tbnVsbCBvZmZzZXQgKyAxICovCi0JZm9yIChrID0gZGVwdGg7IGsgPiAxICYmICFvZmZzZXRzW2stMV07IGstLSkKLQkJOwotCXBhcnRpYWwgPSBleHQ0X2dldF9icmFuY2goaW5vZGUsIGssIG9mZnNldHMsIGNoYWluLCAmZXJyKTsKLQkvKiBXcml0ZXI6IHBvaW50ZXJzICovCi0JaWYgKCFwYXJ0aWFsKQotCQlwYXJ0aWFsID0gY2hhaW4gKyBrLTE7Ci0JLyoKLQkgKiBJZiB0aGUgYnJhbmNoIGFjcXVpcmVkIGNvbnRpbnVhdGlvbiBzaW5jZSB3ZSd2ZSBsb29rZWQgYXQgaXQgLQotCSAqIGZpbmUsIGl0IHNob3VsZCBhbGwgc3Vydml2ZSBhbmQgKG5ldykgdG9wIGRvZXNuJ3QgYmVsb25nIHRvIHVzLgotCSAqLwotCWlmICghcGFydGlhbC0+a2V5ICYmICpwYXJ0aWFsLT5wKQotCQkvKiBXcml0ZXI6IGVuZCAqLwotCQlnb3RvIG5vX3RvcDsKLQlmb3IgKHAgPSBwYXJ0aWFsOyAocCA+IGNoYWluKSAmJiBhbGxfemVyb2VzKChfX2xlMzIgKikgcC0+YmgtPmJfZGF0YSwgcC0+cCk7IHAtLSkKLQkJOwotCS8qCi0JICogT0ssIHdlJ3ZlIGZvdW5kIHRoZSBsYXN0IGJsb2NrIHRoYXQgbXVzdCBzdXJ2aXZlLiBUaGUgcmVzdCBvZiBvdXIKLQkgKiBicmFuY2ggc2hvdWxkIGJlIGRldGFjaGVkIGJlZm9yZSB1bmxvY2tpbmcuIEhvd2V2ZXIsIGlmIHRoYXQgcmVzdAotCSAqIG9mIGJyYW5jaCBpcyBhbGwgb3VycyBhbmQgZG9lcyBub3QgZ3JvdyBpbW1lZGlhdGVseSBmcm9tIHRoZSBpbm9kZQotCSAqIGl0J3MgZWFzaWVyIHRvIGNoZWF0IGFuZCBqdXN0IGRlY3JlbWVudCBwYXJ0aWFsLT5wLgotCSAqLwotCWlmIChwID09IGNoYWluICsgayAtIDEgJiYgcCA+IGNoYWluKSB7Ci0JCXAtPnAtLTsKLQl9IGVsc2UgewotCQkqdG9wID0gKnAtPnA7Ci0JCS8qIE5vcGUsIGRvbid0IGRvIHRoaXMgaW4gZXh0NC4gIE11c3QgbGVhdmUgdGhlIHRyZWUgaW50YWN0ICovCi0jaWYgMAotCQkqcC0+cCA9IDA7Ci0jZW5kaWYKLQl9Ci0JLyogV3JpdGVyOiBlbmQgKi8KLQotCXdoaWxlIChwYXJ0aWFsID4gcCkgewotCQlicmVsc2UocGFydGlhbC0+YmgpOwotCQlwYXJ0aWFsLS07Ci0JfQotbm9fdG9wOgotCXJldHVybiBwYXJ0aWFsOwotfQotCi0vKgotICogWmVybyBhIG51bWJlciBvZiBibG9jayBwb2ludGVycyBpbiBlaXRoZXIgYW4gaW5vZGUgb3IgYW4gaW5kaXJlY3QgYmxvY2suCi0gKiBJZiB3ZSByZXN0YXJ0IHRoZSB0cmFuc2FjdGlvbiB3ZSBtdXN0IGFnYWluIGdldCB3cml0ZSBhY2Nlc3MgdG8gdGhlCi0gKiBpbmRpcmVjdCBibG9jayBmb3IgZnVydGhlciBtb2RpZmljYXRpb24uCi0gKgotICogV2UgcmVsZWFzZSBgY291bnQnIGJsb2NrcyBvbiBkaXNrLCBidXQgKGxhc3QgLSBmaXJzdCkgbWF5IGJlIGdyZWF0ZXIKLSAqIHRoYW4gYGNvdW50JyBiZWNhdXNlIHRoZXJlIGNhbiBiZSBob2xlcyBpbiB0aGVyZS4KLSAqCi0gKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCAxIG9uIGludmFsaWQgYmxvY2sgcmFuZ2UKLSAqIGFuZCA8IDAgb24gZmF0YWwgZXJyb3IuCi0gKi8KLXN0YXRpYyBpbnQgZXh0NF9jbGVhcl9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKLQkJCSAgICAgZXh0NF9mc2Jsa190IGJsb2NrX3RvX2ZyZWUsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIF9fbGUzMiAqZmlyc3QsCi0JCQkgICAgIF9fbGUzMiAqbGFzdCkKLXsKLQlfX2xlMzIgKnA7Ci0JaW50CWZsYWdzID0gRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQgfCBFWFQ0X0ZSRUVfQkxPQ0tTX1ZBTElEQVRFRDsKLQlpbnQJZXJyOwotCi0JaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKLQkJZmxhZ3MgfD0gRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQTsKLQotCWlmICghZXh0NF9kYXRhX2Jsb2NrX3ZhbGlkKEVYVDRfU0IoaW5vZGUtPmlfc2IpLCBibG9ja190b19mcmVlLAotCQkJCSAgIGNvdW50KSkgewotCQlFWFQ0X0VSUk9SX0lOT0RFKGlub2RlLCAiYXR0ZW1wdCB0byBjbGVhciBpbnZhbGlkICIKLQkJCQkgImJsb2NrcyAlbGx1IGxlbiAlbHUiLAotCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKSBibG9ja190b19mcmVlLCBjb3VudCk7Ci0JCXJldHVybiAxOwotCX0KLQotCWlmICh0cnlfdG9fZXh0ZW5kX3RyYW5zYWN0aW9uKGhhbmRsZSwgaW5vZGUpKSB7Ci0JCWlmIChiaCkgewotCQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOwotCQkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgYmgpOwotCQkJaWYgKHVubGlrZWx5KGVycikpCi0JCQkJZ290byBvdXRfZXJyOwotCQl9Ci0JCWVyciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKLQkJaWYgKHVubGlrZWx5KGVycikpCi0JCQlnb3RvIG91dF9lcnI7Ci0JCWVyciA9IGV4dDRfdHJ1bmNhdGVfcmVzdGFydF90cmFucyhoYW5kbGUsIGlub2RlLAotCQkJCQkJICBibG9ja3NfZm9yX3RydW5jYXRlKGlub2RlKSk7Ci0JCWlmICh1bmxpa2VseShlcnIpKQotCQkJZ290byBvdXRfZXJyOwotCQlpZiAoYmgpIHsKLQkJCUJVRkZFUl9UUkFDRShiaCwgInJldGFraW5nIHdyaXRlIGFjY2VzcyIpOwotCQkJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7Ci0JCQlpZiAodW5saWtlbHkoZXJyKSkKLQkJCQlnb3RvIG91dF9lcnI7Ci0JCX0KLQl9Ci0KLQlmb3IgKHAgPSBmaXJzdDsgcCA8IGxhc3Q7IHArKykKLQkJKnAgPSAwOwotCi0JZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLCBibG9ja190b19mcmVlLCBjb3VudCwgZmxhZ3MpOwotCXJldHVybiAwOwotb3V0X2VycjoKLQlleHQ0X3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKLQlyZXR1cm4gZXJyOwotfQotCi0vKioKLSAqIGV4dDRfZnJlZV9kYXRhIC0gZnJlZSBhIGxpc3Qgb2YgZGF0YSBibG9ja3MKLSAqIEBoYW5kbGU6CWhhbmRsZSBmb3IgdGhpcyB0cmFuc2FjdGlvbgotICogQGlub2RlOglpbm9kZSB3ZSBhcmUgZGVhbGluZyB3aXRoCi0gKiBAdGhpc19iaDoJaW5kaXJlY3QgYnVmZmVyX2hlYWQgd2hpY2ggY29udGFpbnMgKkBmaXJzdCBhbmQgKkBsYXN0Ci0gKiBAZmlyc3Q6CWFycmF5IG9mIGJsb2NrIG51bWJlcnMKLSAqIEBsYXN0Oglwb2ludHMgaW1tZWRpYXRlbHkgcGFzdCB0aGUgZW5kIG9mIGFycmF5Ci0gKgotICogV2UgYXJlIGZyZWVpbmcgYWxsIGJsb2NrcyByZWZlcnJlZCBmcm9tIHRoYXQgYXJyYXkgKG51bWJlcnMgYXJlIHN0b3JlZCBhcwotICogbGl0dGxlLWVuZGlhbiAzMi1iaXQpIGFuZCB1cGRhdGluZyBAaW5vZGUtPmlfYmxvY2tzIGFwcHJvcHJpYXRlbHkuCi0gKgotICogV2UgYWNjdW11bGF0ZSBjb250aWd1b3VzIHJ1bnMgb2YgYmxvY2tzIHRvIGZyZWUuICBDb252ZW5pZW50bHksIGlmIHRoZXNlCi0gKiBibG9ja3MgYXJlIGNvbnRpZ3VvdXMgdGhlbiByZWxlYXNpbmcgdGhlbSBhdCBvbmUgdGltZSB3aWxsIG9ubHkgYWZmZWN0IG9uZQotICogb3IgdHdvIGJpdG1hcCBibG9ja3MgKCsgZ3JvdXAgZGVzY3JpcHRvcihzKSBhbmQgc3VwZXJibG9jaykgYW5kIHdlIHdvbid0Ci0gKiBhY3R1YWxseSB1c2UgYSBsb3Qgb2Ygam91cm5hbCBzcGFjZS4KLSAqCi0gKiBAdGhpc19iaCB3aWxsIGJlICVOVUxMIGlmIEBmaXJzdCBhbmQgQGxhc3QgcG9pbnQgaW50byB0aGUgaW5vZGUncyBkaXJlY3QKLSAqIGJsb2NrIHBvaW50ZXJzLgotICovCi1zdGF0aWMgdm9pZCBleHQ0X2ZyZWVfZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICp0aGlzX2JoLAotCQkJICAgX19sZTMyICpmaXJzdCwgX19sZTMyICpsYXN0KQotewotCWV4dDRfZnNibGtfdCBibG9ja190b19mcmVlID0gMDsgICAgLyogU3RhcnRpbmcgYmxvY2sgIyBvZiBhIHJ1biAqLwotCXVuc2lnbmVkIGxvbmcgY291bnQgPSAwOwkgICAgLyogTnVtYmVyIG9mIGJsb2NrcyBpbiB0aGUgcnVuICovCi0JX19sZTMyICpibG9ja190b19mcmVlX3AgPSBOVUxMOwkgICAgLyogUG9pbnRlciBpbnRvIGlub2RlL2luZAotCQkJCQkgICAgICAgY29ycmVzcG9uZGluZyB0bwotCQkJCQkgICAgICAgYmxvY2tfdG9fZnJlZSAqLwotCWV4dDRfZnNibGtfdCBucjsJCSAgICAvKiBDdXJyZW50IGJsb2NrICMgKi8KLQlfX2xlMzIgKnA7CQkJICAgIC8qIFBvaW50ZXIgaW50byBpbm9kZS9pbmQKLQkJCQkJICAgICAgIGZvciBjdXJyZW50IGJsb2NrICovCi0JaW50IGVyciA9IDA7Ci0KLQlpZiAodGhpc19iaCkgewkJCQkvKiBGb3IgaW5kaXJlY3QgYmxvY2sgKi8KLQkJQlVGRkVSX1RSQUNFKHRoaXNfYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7Ci0JCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgdGhpc19iaCk7Ci0JCS8qIEltcG9ydGFudDogaWYgd2UgY2FuJ3QgdXBkYXRlIHRoZSBpbmRpcmVjdCBwb2ludGVycwotCQkgKiB0byB0aGUgYmxvY2tzLCB3ZSBjYW4ndCBmcmVlIHRoZW0uICovCi0JCWlmIChlcnIpCi0JCQlyZXR1cm47Ci0JfQotCi0JZm9yIChwID0gZmlyc3Q7IHAgPCBsYXN0OyBwKyspIHsKLQkJbnIgPSBsZTMyX3RvX2NwdSgqcCk7Ci0JCWlmIChucikgewotCQkJLyogYWNjdW11bGF0ZSBibG9ja3MgdG8gZnJlZSBpZiB0aGV5J3JlIGNvbnRpZ3VvdXMgKi8KLQkJCWlmIChjb3VudCA9PSAwKSB7Ci0JCQkJYmxvY2tfdG9fZnJlZSA9IG5yOwotCQkJCWJsb2NrX3RvX2ZyZWVfcCA9IHA7Ci0JCQkJY291bnQgPSAxOwotCQkJfSBlbHNlIGlmIChuciA9PSBibG9ja190b19mcmVlICsgY291bnQpIHsKLQkJCQljb3VudCsrOwotCQkJfSBlbHNlIHsKLQkJCQllcnIgPSBleHQ0X2NsZWFyX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCB0aGlzX2JoLAotCQkJCQkJICAgICAgICBibG9ja190b19mcmVlLCBjb3VudCwKLQkJCQkJCSAgICAgICAgYmxvY2tfdG9fZnJlZV9wLCBwKTsKLQkJCQlpZiAoZXJyKQotCQkJCQlicmVhazsKLQkJCQlibG9ja190b19mcmVlID0gbnI7Ci0JCQkJYmxvY2tfdG9fZnJlZV9wID0gcDsKLQkJCQljb3VudCA9IDE7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoIWVyciAmJiBjb3VudCA+IDApCi0JCWVyciA9IGV4dDRfY2xlYXJfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIHRoaXNfYmgsIGJsb2NrX3RvX2ZyZWUsCi0JCQkJCWNvdW50LCBibG9ja190b19mcmVlX3AsIHApOwotCWlmIChlcnIgPCAwKQotCQkvKiBmYXRhbCBlcnJvciAqLwotCQlyZXR1cm47Ci0KLQlpZiAodGhpc19iaCkgewotCQlCVUZGRVJfVFJBQ0UodGhpc19iaCwgImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKLQotCQkvKgotCQkgKiBUaGUgYnVmZmVyIGhlYWQgc2hvdWxkIGhhdmUgYW4gYXR0YWNoZWQgam91cm5hbCBoZWFkIGF0IHRoaXMKLQkJICogcG9pbnQuIEhvd2V2ZXIsIGlmIHRoZSBkYXRhIGlzIGNvcnJ1cHRlZCBhbmQgYW4gaW5kaXJlY3QKLQkJICogYmxvY2sgcG9pbnRlZCB0byBpdHNlbGYsIGl0IHdvdWxkIGhhdmUgYmVlbiBkZXRhY2hlZCB3aGVuCi0JCSAqIHRoZSBibG9jayB3YXMgY2xlYXJlZC4gQ2hlY2sgZm9yIHRoaXMgaW5zdGVhZCBvZiBPT1BTaW5nLgotCQkgKi8KLQkJaWYgKChFWFQ0X0pPVVJOQUwoaW5vZGUpID09IE5VTEwpIHx8IGJoMmpoKHRoaXNfYmgpKQotCQkJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgdGhpc19iaCk7Ci0JCWVsc2UKLQkJCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsCi0JCQkJCSAiY2lyY3VsYXIgaW5kaXJlY3QgYmxvY2sgZGV0ZWN0ZWQgYXQgIgotCQkJCQkgImJsb2NrICVsbHUiLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHRoaXNfYmgtPmJfYmxvY2tucik7Ci0JfQotfQotCi0vKioKLSAqCWV4dDRfZnJlZV9icmFuY2hlcyAtIGZyZWUgYW4gYXJyYXkgb2YgYnJhbmNoZXMKLSAqCUBoYW5kbGU6IEpCRCBoYW5kbGUgZm9yIHRoaXMgdHJhbnNhY3Rpb24KLSAqCUBpbm9kZToJaW5vZGUgd2UgYXJlIGRlYWxpbmcgd2l0aAotICoJQHBhcmVudF9iaDogdGhlIGJ1ZmZlcl9oZWFkIHdoaWNoIGNvbnRhaW5zICpAZmlyc3QgYW5kICpAbGFzdAotICoJQGZpcnN0OglhcnJheSBvZiBibG9jayBudW1iZXJzCi0gKglAbGFzdDoJcG9pbnRlciBpbW1lZGlhdGVseSBwYXN0IHRoZSBlbmQgb2YgYXJyYXkKLSAqCUBkZXB0aDoJZGVwdGggb2YgdGhlIGJyYW5jaGVzIHRvIGZyZWUKLSAqCi0gKglXZSBhcmUgZnJlZWluZyBhbGwgYmxvY2tzIHJlZmVycmVkIGZyb20gdGhlc2UgYnJhbmNoZXMgKG51bWJlcnMgYXJlCi0gKglzdG9yZWQgYXMgbGl0dGxlLWVuZGlhbiAzMi1iaXQpIGFuZCB1cGRhdGluZyBAaW5vZGUtPmlfYmxvY2tzCi0gKglhcHByb3ByaWF0ZWx5LgotICovCi1zdGF0aWMgdm9pZCBleHQ0X2ZyZWVfYnJhbmNoZXMoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBhcmVudF9iaCwKLQkJCSAgICAgICBfX2xlMzIgKmZpcnN0LCBfX2xlMzIgKmxhc3QsIGludCBkZXB0aCkKLXsKLQlleHQ0X2ZzYmxrX3QgbnI7Ci0JX19sZTMyICpwOwotCi0JaWYgKGV4dDRfaGFuZGxlX2lzX2Fib3J0ZWQoaGFuZGxlKSkKLQkJcmV0dXJuOwotCi0JaWYgKGRlcHRoLS0pIHsKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKLQkJaW50IGFkZHJfcGVyX2Jsb2NrID0gRVhUNF9BRERSX1BFUl9CTE9DSyhpbm9kZS0+aV9zYik7Ci0JCXAgPSBsYXN0OwotCQl3aGlsZSAoLS1wID49IGZpcnN0KSB7Ci0JCQluciA9IGxlMzJfdG9fY3B1KCpwKTsKLQkJCWlmICghbnIpCi0JCQkJY29udGludWU7CQkvKiBBIGhvbGUgKi8KLQotCQkJaWYgKCFleHQ0X2RhdGFfYmxvY2tfdmFsaWQoRVhUNF9TQihpbm9kZS0+aV9zYiksCi0JCQkJCQkgICBuciwgMSkpIHsKLQkJCQlFWFQ0X0VSUk9SX0lOT0RFKGlub2RlLAotCQkJCQkJICJpbnZhbGlkIGluZGlyZWN0IG1hcHBlZCAiCi0JCQkJCQkgImJsb2NrICVsdSAobGV2ZWwgJWQpIiwKLQkJCQkJCSAodW5zaWduZWQgbG9uZykgbnIsIGRlcHRoKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogR28gcmVhZCB0aGUgYnVmZmVyIGZvciB0aGUgbmV4dCBsZXZlbCBkb3duICovCi0JCQliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBucik7Ci0KLQkJCS8qCi0JCQkgKiBBIHJlYWQgZmFpbHVyZT8gUmVwb3J0IGVycm9yIGFuZCBjbGVhciBzbG90Ci0JCQkgKiAoc2hvdWxkIGJlIHJhcmUpLgotCQkJICovCi0JCQlpZiAoIWJoKSB7Ci0JCQkJRVhUNF9FUlJPUl9JTk9ERV9CTE9DSyhpbm9kZSwgbnIsCi0JCQkJCQkgICAgICAgIlJlYWQgZmFpbHVyZSIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvKiBUaGlzIHphcHMgdGhlIGVudGlyZSBibG9jay4gIEJvdHRvbSB1cC4gKi8KLQkJCUJVRkZFUl9UUkFDRShiaCwgImZyZWUgY2hpbGQgYnJhbmNoZXMiKTsKLQkJCWV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBiaCwKLQkJCQkJKF9fbGUzMiAqKSBiaC0+Yl9kYXRhLAotCQkJCQkoX19sZTMyICopIGJoLT5iX2RhdGEgKyBhZGRyX3Blcl9ibG9jaywKLQkJCQkJZGVwdGgpOwotCQkJYnJlbHNlKGJoKTsKLQotCQkJLyoKLQkJCSAqIEV2ZXJ5dGhpbmcgYmVsb3cgdGhpcyB0aGlzIHBvaW50ZXIgaGFzIGJlZW4KLQkJCSAqIHJlbGVhc2VkLiAgTm93IGxldCB0aGlzIHRvcC1vZi1zdWJ0cmVlIGdvLgotCQkJICoKLQkJCSAqIFdlIHdhbnQgdGhlIGZyZWVpbmcgb2YgdGhpcyBpbmRpcmVjdCBibG9jayB0byBiZQotCQkJICogYXRvbWljIGluIHRoZSBqb3VybmFsIHdpdGggdGhlIHVwZGF0aW5nIG9mIHRoZQotCQkJICogYml0bWFwIGJsb2NrIHdoaWNoIG93bnMgaXQuICBTbyBtYWtlIHNvbWUgcm9vbSBpbgotCQkJICogdGhlIGpvdXJuYWwuCi0JCQkgKgotCQkJICogV2UgemVybyB0aGUgcGFyZW50IHBvaW50ZXIgKmFmdGVyKiBmcmVlaW5nIGl0cwotCQkJICogcG9pbnRlZSBpbiB0aGUgYml0bWFwcywgc28gaWYgZXh0ZW5kX3RyYW5zYWN0aW9uKCkKLQkJCSAqIGZvciBzb21lIHJlYXNvbiBmYWlscyB0byBwdXQgdGhlIGJpdG1hcCBjaGFuZ2VzIGFuZAotCQkJICogdGhlIHJlbGVhc2UgaW50byB0aGUgc2FtZSB0cmFuc2FjdGlvbiwgcmVjb3ZlcnkKLQkJCSAqIHdpbGwgbWVyZWx5IGNvbXBsYWluIGFib3V0IHJlbGVhc2luZyBhIGZyZWUgYmxvY2ssCi0JCQkgKiByYXRoZXIgdGhhbiBsZWFraW5nIGJsb2Nrcy4KLQkJCSAqLwotCQkJaWYgKGV4dDRfaGFuZGxlX2lzX2Fib3J0ZWQoaGFuZGxlKSkKLQkJCQlyZXR1cm47Ci0JCQlpZiAodHJ5X3RvX2V4dGVuZF90cmFuc2FjdGlvbihoYW5kbGUsIGlub2RlKSkgewotCQkJCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKLQkJCQlleHQ0X3RydW5jYXRlX3Jlc3RhcnRfdHJhbnMoaGFuZGxlLCBpbm9kZSwKLQkJCQkJICAgIGJsb2Nrc19mb3JfdHJ1bmNhdGUoaW5vZGUpKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIFRoZSBmb3JnZXQgZmxhZyBoZXJlIGlzIGNyaXRpY2FsIGJlY2F1c2UgaWYKLQkJCSAqIHdlIGFyZSBqb3VybmFsaW5nIChhbmQgbm90IGRvaW5nIGRhdGEKLQkJCSAqIGpvdXJuYWxpbmcpLCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSBhIHJldm9rZQotCQkJICogcmVjb3JkIGlzIHdyaXR0ZW4gdG8gcHJldmVudCB0aGUgam91cm5hbAotCQkJICogcmVwbGF5IGZyb20gb3ZlcndyaXRpbmcgdGhlIChmb3JtZXIpCi0JCQkgKiBpbmRpcmVjdCBibG9jayBpZiBpdCBnZXRzIHJlYWxsb2NhdGVkIGFzIGEKLQkJCSAqIGRhdGEgYmxvY2suICBUaGlzIG11c3QgaGFwcGVuIGluIHRoZSBzYW1lCi0JCQkgKiB0cmFuc2FjdGlvbiB3aGVyZSB0aGUgZGF0YSBibG9ja3MgYXJlCi0JCQkgKiBhY3R1YWxseSBmcmVlZC4KLQkJCSAqLwotCQkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLCBuciwgMSwKLQkJCQkJIEVYVDRfRlJFRV9CTE9DS1NfTUVUQURBVEF8Ci0JCQkJCSBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7Ci0KLQkJCWlmIChwYXJlbnRfYmgpIHsKLQkJCQkvKgotCQkJCSAqIFRoZSBibG9jayB3aGljaCB3ZSBoYXZlIGp1c3QgZnJlZWQgaXMKLQkJCQkgKiBwb2ludGVkIHRvIGJ5IGFuIGluZGlyZWN0IGJsb2NrOiBqb3VybmFsIGl0Ci0JCQkJICovCi0JCQkJQlVGRkVSX1RSQUNFKHBhcmVudF9iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKLQkJCQlpZiAoIWV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwKLQkJCQkJCQkJICAgcGFyZW50X2JoKSl7Ci0JCQkJCSpwID0gMDsKLQkJCQkJQlVGRkVSX1RSQUNFKHBhcmVudF9iaCwKLQkJCQkJImNhbGwgZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEiKTsKLQkJCQkJZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLAotCQkJCQkJCQkgICBpbm9kZSwKLQkJCQkJCQkJICAgcGFyZW50X2JoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBXZSBoYXZlIHJlYWNoZWQgdGhlIGJvdHRvbSBvZiB0aGUgdHJlZS4gKi8KLQkJQlVGRkVSX1RSQUNFKHBhcmVudF9iaCwgImZyZWUgZGF0YSBibG9ja3MiKTsKLQkJZXh0NF9mcmVlX2RhdGEoaGFuZGxlLCBpbm9kZSwgcGFyZW50X2JoLCBmaXJzdCwgbGFzdCk7Ci0JfQotfQotCiBpbnQgZXh0NF9jYW5fdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKQEAgLTQ0NzYsMTkgKzMxMjksNiBAQAogICovCiB2b2lkIGV4dDRfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQloYW5kbGVfdCAqaGFuZGxlOwotCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKLQlfX2xlMzIgKmlfZGF0YSA9IGVpLT5pX2RhdGE7Ci0JaW50IGFkZHJfcGVyX2Jsb2NrID0gRVhUNF9BRERSX1BFUl9CTE9DSyhpbm9kZS0+aV9zYik7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwotCWV4dDRfbGJsa190IG9mZnNldHNbNF07Ci0JSW5kaXJlY3QgY2hhaW5bNF07Ci0JSW5kaXJlY3QgKnBhcnRpYWw7Ci0JX19sZTMyIG5yID0gMDsKLQlpbnQgbiA9IDA7Ci0JZXh0NF9sYmxrX3QgbGFzdF9ibG9jaywgbWF4X2Jsb2NrOwotCXVuc2lnbmVkIGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKLQogCXRyYWNlX2V4dDRfdHJ1bmNhdGVfZW50ZXIoaW5vZGUpOwogCiAJaWYgKCFleHQ0X2Nhbl90cnVuY2F0ZShpbm9kZSkpCkBAIC00NDk5LDE0OSArMzEzOSwxMSBAQAogCWlmIChpbm9kZS0+aV9zaXplID09IDAgJiYgIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBOT19BVVRPX0RBX0FMTE9DKSkKIAkJZXh0NF9zZXRfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfREFfQUxMT0NfQ0xPU0UpOwogCi0JaWYgKGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpKSB7CisJaWYgKGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpKQogCQlleHQ0X2V4dF90cnVuY2F0ZShpbm9kZSk7Ci0JCXRyYWNlX2V4dDRfdHJ1bmNhdGVfZXhpdChpbm9kZSk7Ci0JCXJldHVybjsKLQl9CisJZWxzZQorCQlleHQ0X2luZF90cnVuY2F0ZShpbm9kZSk7CiAKLQloYW5kbGUgPSBzdGFydF90cmFuc2FjdGlvbihpbm9kZSk7Ci0JaWYgKElTX0VSUihoYW5kbGUpKQotCQlyZXR1cm47CQkvKiBBS1BNOiByZXR1cm4gd2hhdD8gKi8KLQotCWxhc3RfYmxvY2sgPSAoaW5vZGUtPmlfc2l6ZSArIGJsb2Nrc2l6ZS0xKQotCQkJCQk+PiBFWFQ0X0JMT0NLX1NJWkVfQklUUyhpbm9kZS0+aV9zYik7Ci0JbWF4X2Jsb2NrID0gKEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2JpdG1hcF9tYXhieXRlcyArIGJsb2Nrc2l6ZS0xKQotCQkJCQk+PiBFWFQ0X0JMT0NLX1NJWkVfQklUUyhpbm9kZS0+aV9zYik7Ci0KLQlpZiAoaW5vZGUtPmlfc2l6ZSAmIChibG9ja3NpemUgLSAxKSkKLQkJaWYgKGV4dDRfYmxvY2tfdHJ1bmNhdGVfcGFnZShoYW5kbGUsIG1hcHBpbmcsIGlub2RlLT5pX3NpemUpKQotCQkJZ290byBvdXRfc3RvcDsKLQotCWlmIChsYXN0X2Jsb2NrICE9IG1heF9ibG9jaykgewotCQluID0gZXh0NF9ibG9ja190b19wYXRoKGlub2RlLCBsYXN0X2Jsb2NrLCBvZmZzZXRzLCBOVUxMKTsKLQkJaWYgKG4gPT0gMCkKLQkJCWdvdG8gb3V0X3N0b3A7CS8qIGVycm9yICovCi0JfQotCi0JLyoKLQkgKiBPSy4gIFRoaXMgdHJ1bmNhdGUgaXMgZ29pbmcgdG8gaGFwcGVuLiAgV2UgYWRkIHRoZSBpbm9kZSB0byB0aGUKLQkgKiBvcnBoYW4gbGlzdCwgc28gdGhhdCBpZiB0aGlzIHRydW5jYXRlIHNwYW5zIG11bHRpcGxlIHRyYW5zYWN0aW9ucywKLQkgKiBhbmQgd2UgY3Jhc2gsIHdlIHdpbGwgcmVzdW1lIHRoZSB0cnVuY2F0ZSB3aGVuIHRoZSBmaWxlc3lzdGVtCi0JICogcmVjb3ZlcnMuICBJdCBhbHNvIG1hcmtzIHRoZSBpbm9kZSBkaXJ0eSwgdG8gY2F0Y2ggdGhlIG5ldyBzaXplLgotCSAqCi0JICogSW1wbGljYXRpb246IHRoZSBmaWxlIG11c3QgYWx3YXlzIGJlIGluIGEgc2FuZSwgY29uc2lzdGVudAotCSAqIHRydW5jYXRhYmxlIHN0YXRlIHdoaWxlIGVhY2ggdHJhbnNhY3Rpb24gY29tbWl0cy4KLQkgKi8KLQlpZiAoZXh0NF9vcnBoYW5fYWRkKGhhbmRsZSwgaW5vZGUpKQotCQlnb3RvIG91dF9zdG9wOwotCi0JLyoKLQkgKiBGcm9tIGhlcmUgd2UgYmxvY2sgb3V0IGFsbCBleHQ0X2dldF9ibG9jaygpIGNhbGxlcnMgd2hvIHdhbnQgdG8KLQkgKiBtb2RpZnkgdGhlIGJsb2NrIGFsbG9jYXRpb24gdHJlZS4KLQkgKi8KLQlkb3duX3dyaXRlKCZlaS0+aV9kYXRhX3NlbSk7Ci0KLQlleHQ0X2Rpc2NhcmRfcHJlYWxsb2NhdGlvbnMoaW5vZGUpOwotCi0JLyoKLQkgKiBUaGUgb3JwaGFuIGxpc3QgZW50cnkgd2lsbCBub3cgcHJvdGVjdCB1cyBmcm9tIGFueSBjcmFzaCB3aGljaAotCSAqIG9jY3VycyBiZWZvcmUgdGhlIHRydW5jYXRlIGNvbXBsZXRlcywgc28gaXQgaXMgbm93IHNhZmUgdG8gcHJvcGFnYXRlCi0JICogdGhlIG5ldywgc2hvcnRlciBpbm9kZSBzaXplIChoZWxkIGZvciBub3cgaW4gaV9zaXplKSBpbnRvIHRoZQotCSAqIG9uLWRpc2sgaW5vZGUuIFdlIGRvIHRoaXMgdmlhIGlfZGlza3NpemUsIHdoaWNoIGlzIHRoZSB2YWx1ZSB3aGljaAotCSAqIGV4dDQgKnJlYWxseSogd3JpdGVzIG9udG8gdGhlIGRpc2sgaW5vZGUuCi0JICovCi0JZWktPmlfZGlza3NpemUgPSBpbm9kZS0+aV9zaXplOwotCi0JaWYgKGxhc3RfYmxvY2sgPT0gbWF4X2Jsb2NrKSB7Ci0JCS8qCi0JCSAqIEl0IGlzIHVubmVjZXNzYXJ5IHRvIGZyZWUgYW55IGRhdGEgYmxvY2tzIGlmIGxhc3RfYmxvY2sgaXMKLQkJICogZXF1YWwgdG8gdGhlIGluZGlyZWN0IGJsb2NrIGxpbWl0LgotCQkgKi8KLQkJZ290byBvdXRfdW5sb2NrOwotCX0gZWxzZSBpZiAobiA9PSAxKSB7CQkvKiBkaXJlY3QgYmxvY2tzICovCi0JCWV4dDRfZnJlZV9kYXRhKGhhbmRsZSwgaW5vZGUsIE5VTEwsIGlfZGF0YStvZmZzZXRzWzBdLAotCQkJICAgICAgIGlfZGF0YSArIEVYVDRfTkRJUl9CTE9DS1MpOwotCQlnb3RvIGRvX2luZGlyZWN0czsKLQl9Ci0KLQlwYXJ0aWFsID0gZXh0NF9maW5kX3NoYXJlZChpbm9kZSwgbiwgb2Zmc2V0cywgY2hhaW4sICZucik7Ci0JLyogS2lsbCB0aGUgdG9wIG9mIHNoYXJlZCBicmFuY2ggKG5vdCBkZXRhY2hlZCkgKi8KLQlpZiAobnIpIHsKLQkJaWYgKHBhcnRpYWwgPT0gY2hhaW4pIHsKLQkJCS8qIFNoYXJlZCBicmFuY2ggZ3Jvd3MgZnJvbSB0aGUgaW5vZGUgKi8KLQkJCWV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBOVUxMLAotCQkJCQkgICAmbnIsICZucisxLCAoY2hhaW4rbi0xKSAtIHBhcnRpYWwpOwotCQkJKnBhcnRpYWwtPnAgPSAwOwotCQkJLyoKLQkJCSAqIFdlIG1hcmsgdGhlIGlub2RlIGRpcnR5IHByaW9yIHRvIHJlc3RhcnQsCi0JCQkgKiBhbmQgcHJpb3IgdG8gc3RvcC4gIE5vIG5lZWQgZm9yIGl0IGhlcmUuCi0JCQkgKi8KLQkJfSBlbHNlIHsKLQkJCS8qIFNoYXJlZCBicmFuY2ggZ3Jvd3MgZnJvbSBhbiBpbmRpcmVjdCBibG9jayAqLwotCQkJQlVGRkVSX1RSQUNFKHBhcnRpYWwtPmJoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOwotCQkJZXh0NF9mcmVlX2JyYW5jaGVzKGhhbmRsZSwgaW5vZGUsIHBhcnRpYWwtPmJoLAotCQkJCQlwYXJ0aWFsLT5wLAotCQkJCQlwYXJ0aWFsLT5wKzEsIChjaGFpbituLTEpIC0gcGFydGlhbCk7Ci0JCX0KLQl9Ci0JLyogQ2xlYXIgdGhlIGVuZHMgb2YgaW5kaXJlY3QgYmxvY2tzIG9uIHRoZSBzaGFyZWQgYnJhbmNoICovCi0Jd2hpbGUgKHBhcnRpYWwgPiBjaGFpbikgewotCQlleHQ0X2ZyZWVfYnJhbmNoZXMoaGFuZGxlLCBpbm9kZSwgcGFydGlhbC0+YmgsIHBhcnRpYWwtPnAgKyAxLAotCQkJCSAgIChfX2xlMzIqKXBhcnRpYWwtPmJoLT5iX2RhdGErYWRkcl9wZXJfYmxvY2ssCi0JCQkJICAgKGNoYWluK24tMSkgLSBwYXJ0aWFsKTsKLQkJQlVGRkVSX1RSQUNFKHBhcnRpYWwtPmJoLCAiY2FsbCBicmVsc2UiKTsKLQkJYnJlbHNlKHBhcnRpYWwtPmJoKTsKLQkJcGFydGlhbC0tOwotCX0KLWRvX2luZGlyZWN0czoKLQkvKiBLaWxsIHRoZSByZW1haW5pbmcgKHdob2xlKSBzdWJ0cmVlcyAqLwotCXN3aXRjaCAob2Zmc2V0c1swXSkgewotCWRlZmF1bHQ6Ci0JCW5yID0gaV9kYXRhW0VYVDRfSU5EX0JMT0NLXTsKLQkJaWYgKG5yKSB7Ci0JCQlleHQ0X2ZyZWVfYnJhbmNoZXMoaGFuZGxlLCBpbm9kZSwgTlVMTCwgJm5yLCAmbnIrMSwgMSk7Ci0JCQlpX2RhdGFbRVhUNF9JTkRfQkxPQ0tdID0gMDsKLQkJfQotCWNhc2UgRVhUNF9JTkRfQkxPQ0s6Ci0JCW5yID0gaV9kYXRhW0VYVDRfRElORF9CTE9DS107Ci0JCWlmIChucikgewotCQkJZXh0NF9mcmVlX2JyYW5jaGVzKGhhbmRsZSwgaW5vZGUsIE5VTEwsICZuciwgJm5yKzEsIDIpOwotCQkJaV9kYXRhW0VYVDRfRElORF9CTE9DS10gPSAwOwotCQl9Ci0JY2FzZSBFWFQ0X0RJTkRfQkxPQ0s6Ci0JCW5yID0gaV9kYXRhW0VYVDRfVElORF9CTE9DS107Ci0JCWlmIChucikgewotCQkJZXh0NF9mcmVlX2JyYW5jaGVzKGhhbmRsZSwgaW5vZGUsIE5VTEwsICZuciwgJm5yKzEsIDMpOwotCQkJaV9kYXRhW0VYVDRfVElORF9CTE9DS10gPSAwOwotCQl9Ci0JY2FzZSBFWFQ0X1RJTkRfQkxPQ0s6Ci0JCTsKLQl9Ci0KLW91dF91bmxvY2s6Ci0JdXBfd3JpdGUoJmVpLT5pX2RhdGFfc2VtKTsKLQlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gZXh0NF9jdXJyZW50X3RpbWUoaW5vZGUpOwotCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKLQotCS8qCi0JICogSW4gYSBtdWx0aS10cmFuc2FjdGlvbiB0cnVuY2F0ZSwgd2Ugb25seSBtYWtlIHRoZSBmaW5hbCB0cmFuc2FjdGlvbgotCSAqIHN5bmNocm9ub3VzCi0JICovCi0JaWYgKElTX1NZTkMoaW5vZGUpKQotCQlleHQ0X2hhbmRsZV9zeW5jKGhhbmRsZSk7Ci1vdXRfc3RvcDoKLQkvKgotCSAqIElmIHRoaXMgd2FzIGEgc2ltcGxlIGZ0cnVuY2F0ZSgpLCBhbmQgdGhlIGZpbGUgd2lsbCByZW1haW4gYWxpdmUKLQkgKiB0aGVuIHdlIG5lZWQgdG8gY2xlYXIgdXAgdGhlIG9ycGhhbiByZWNvcmQgd2hpY2ggd2UgY3JlYXRlZCBhYm92ZS4KLQkgKiBIb3dldmVyLCBpZiB0aGlzIHdhcyBhIHJlYWwgdW5saW5rIHRoZW4gd2Ugd2VyZSBjYWxsZWQgYnkKLQkgKiBleHQ0X2RlbGV0ZV9pbm9kZSgpLCBhbmQgd2UgYWxsb3cgdGhhdCBmdW5jdGlvbiB0byBjbGVhbiB1cCB0aGUKLQkgKiBvcnBoYW4gaW5mbyBmb3IgdXMuCi0JICovCi0JaWYgKGlub2RlLT5pX25saW5rKQotCQlleHQ0X29ycGhhbl9kZWwoaGFuZGxlLCBpbm9kZSk7Ci0KLQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwogCXRyYWNlX2V4dDRfdHJ1bmNhdGVfZXhpdChpbm9kZSk7CiB9CiAKQEAgLTUwMTIsNyArMzUxNCw3IEBACiAJCSAgIChTX0lTTE5LKGlub2RlLT5pX21vZGUpICYmCiAJCSAgICAhZXh0NF9pbm9kZV9pc19mYXN0X3N5bWxpbmsoaW5vZGUpKSkgewogCQkvKiBWYWxpZGF0ZSBibG9jayByZWZlcmVuY2VzIHdoaWNoIGFyZSBwYXJ0IG9mIGlub2RlICovCi0JCXJldCA9IGV4dDRfY2hlY2tfaW5vZGVfYmxvY2tyZWYoaW5vZGUpOworCQlyZXQgPSBleHQ0X2luZF9jaGVja19pbm9kZShpbm9kZSk7CiAJfQogCWlmIChyZXQpCiAJCWdvdG8gYmFkX2lub2RlOwpAQCAtNTQ1OSwzNCArMzk2MSwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGV4dDRfaW5kaXJlY3RfdHJhbnNfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBucmJsb2NrcywKLQkJCQkgICAgICBpbnQgY2h1bmspCi17Ci0JaW50IGluZGlyZWN0czsKLQotCS8qIGlmIG5yYmxvY2tzIGFyZSBjb250aWd1b3VzICovCi0JaWYgKGNodW5rKSB7Ci0JCS8qCi0JCSAqIFdpdGggTiBjb250aWd1b3VzIGRhdGEgYmxvY2tzLCB3ZSBuZWVkIGF0IG1vc3QKLQkJICogTi9FWFQ0X0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKSArIDEgaW5kaXJlY3QgYmxvY2tzLAotCQkgKiAyIGRpbmRpcmVjdCBibG9ja3MsIGFuZCAxIHRpbmRpcmVjdCBibG9jawotCQkgKi8KLQkJcmV0dXJuIERJVl9ST1VORF9VUChucmJsb2NrcywKLQkJCQkgICAgRVhUNF9BRERSX1BFUl9CTE9DSyhpbm9kZS0+aV9zYikpICsgNDsKLQl9Ci0JLyoKLQkgKiBpZiBucmJsb2NrcyBhcmUgbm90IGNvbnRpZ3VvdXMsIHdvcnNlIGNhc2UsIGVhY2ggYmxvY2sgdG91Y2gKLQkgKiBhIGluZGlyZWN0IGJsb2NrLCBhbmQgZWFjaCBpbmRpcmVjdCBibG9jayB0b3VjaCBhIGRvdWJsZSBpbmRpcmVjdAotCSAqIGJsb2NrLCBwbHVzIGEgdHJpcGxlIGluZGlyZWN0IGJsb2NrCi0JICovCi0JaW5kaXJlY3RzID0gbnJibG9ja3MgKiAyICsgMTsKLQlyZXR1cm4gaW5kaXJlY3RzOwotfQotCiBzdGF0aWMgaW50IGV4dDRfaW5kZXhfdHJhbnNfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBucmJsb2NrcywgaW50IGNodW5rKQogewogCWlmICghKGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpKSkKLQkJcmV0dXJuIGV4dDRfaW5kaXJlY3RfdHJhbnNfYmxvY2tzKGlub2RlLCBucmJsb2NrcywgY2h1bmspOworCQlyZXR1cm4gZXh0NF9pbmRfdHJhbnNfYmxvY2tzKGlub2RlLCBucmJsb2NrcywgY2h1bmspOwogCXJldHVybiBleHQ0X2V4dF9pbmRleF90cmFuc19ibG9ja3MoaW5vZGUsIG5yYmxvY2tzLCBjaHVuayk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaW9jdGwuYyBiL2ZzL2V4dDQvaW9jdGwuYwppbmRleCA4MDhjNTU0Li5mMThiZmUzIDEwMDY0NAotLS0gYS9mcy9leHQ0L2lvY3RsLmMKKysrIGIvZnMvZXh0NC9pb2N0bC5jCkBAIC0yMDIsOCArMjAyLDkgQEAKIAkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCQlpbnQgZXJyLCBlcnIyPTA7CiAKLQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpKQotCQkJcmV0dXJuIC1FUEVSTTsKKwkJZXJyID0gZXh0NF9yZXNpemVfYmVnaW4oc2IpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAogCQlpZiAoZ2V0X3VzZXIobl9ibG9ja3NfY291bnQsIChfX3UzMiBfX3VzZXIgKilhcmcpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0yMjEsNiArMjIyLDcgQEAKIAkJaWYgKGVyciA9PSAwKQogCQkJZXJyID0gZXJyMjsKIAkJbW50X2Ryb3Bfd3JpdGUoZmlscC0+Zl9wYXRoLm1udCk7CisJCWV4dDRfcmVzaXplX2VuZChzYik7CiAKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC0yNzEsOCArMjczLDkgQEAKIAkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCQlpbnQgZXJyLCBlcnIyPTA7CiAKLQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpKQotCQkJcmV0dXJuIC1FUEVSTTsKKwkJZXJyID0gZXh0NF9yZXNpemVfYmVnaW4oc2IpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAogCQlpZiAoY29weV9mcm9tX3VzZXIoJmlucHV0LCAoc3RydWN0IGV4dDRfbmV3X2dyb3VwX2lucHV0IF9fdXNlciAqKWFyZywKIAkJCQlzaXplb2YoaW5wdXQpKSkKQEAgLTI5MSw2ICsyOTQsNyBAQAogCQlpZiAoZXJyID09IDApCiAJCQllcnIgPSBlcnIyOwogCQltbnRfZHJvcF93cml0ZShmaWxwLT5mX3BhdGgubW50KTsKKwkJZXh0NF9yZXNpemVfZW5kKHNiKTsKIAogCQlyZXR1cm4gZXJyOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWJhbGxvYy5jIGIvZnMvZXh0NC9tYmFsbG9jLmMKaW5kZXggNmVkODU5ZC4uMTdhNWE1NyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9tYmFsbG9jLmMKKysrIGIvZnMvZXh0NC9tYmFsbG9jLmMKQEAgLTc1LDggKzc1LDggQEAKICAqCiAgKiBUaGUgaW5vZGUgcHJlYWxsb2NhdGlvbiBzcGFjZSBpcyB1c2VkIGxvb2tpbmcgYXQgdGhlIF9sb2dpY2FsXyBzdGFydAogICogYmxvY2suIElmIG9ubHkgdGhlIGxvZ2ljYWwgZmlsZSBibG9jayBmYWxscyB3aXRoaW4gdGhlIHJhbmdlIG9mIHByZWFsbG9jCi0gKiBzcGFjZSB3ZSB3aWxsIGNvbnN1bWUgdGhlIHBhcnRpY3VsYXIgcHJlYWxsb2Mgc3BhY2UuIFRoaXMgbWFrZSBzdXJlIHRoYXQKLSAqIHRoYXQgdGhlIHdlIGhhdmUgY29udGlndW91cyBwaHlzaWNhbCBibG9ja3MgcmVwcmVzZW50aW5nIHRoZSBmaWxlIGJsb2NrcworICogc3BhY2Ugd2Ugd2lsbCBjb25zdW1lIHRoZSBwYXJ0aWN1bGFyIHByZWFsbG9jIHNwYWNlLiBUaGlzIG1ha2VzIHN1cmUgdGhhdAorICogd2UgaGF2ZSBjb250aWd1b3VzIHBoeXNpY2FsIGJsb2NrcyByZXByZXNlbnRpbmcgdGhlIGZpbGUgYmxvY2tzCiAgKgogICogVGhlIGltcG9ydGFudCB0aGluZyB0byBiZSBub3RlZCBpbiBjYXNlIG9mIGlub2RlIHByZWFsbG9jIHNwYWNlIGlzIHRoYXQKICAqIHdlIGRvbid0IG1vZGlmeSB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgdG8gaW5vZGUgcHJlYWxsb2Mgc3BhY2UgZXhjZXB0CkBAIC04NCw3ICs4NCw3IEBACiAgKgogICogSWYgd2UgYXJlIG5vdCBhYmxlIHRvIGZpbmQgYmxvY2tzIGluIHRoZSBpbm9kZSBwcmVhbGxvYyBzcGFjZSBhbmQgaWYgd2UKICAqIGhhdmUgdGhlIGdyb3VwIGFsbG9jYXRpb24gZmxhZyBzZXQgdGhlbiB3ZSBsb29rIGF0IHRoZSBsb2NhbGl0eSBncm91cAotICogcHJlYWxsb2Mgc3BhY2UuIFRoZXNlIGFyZSBwZXIgQ1BVIHByZWFsbG9jIGxpc3QgcmVwcmVhc2VudGVkIGFzCisgKiBwcmVhbGxvYyBzcGFjZS4gVGhlc2UgYXJlIHBlciBDUFUgcHJlYWxsb2MgbGlzdCByZXByZXNlbnRlZCBhcwogICoKICAqIGV4dDRfc2JfaW5mby5zX2xvY2FsaXR5X2dyb3Vwc1tzbXBfcHJvY2Vzc29yX2lkKCldCiAgKgpAQCAtMTI4LDEyICsxMjgsMTMgQEAKICAqIHdlIGFyZSBkb2luZyBhIGdyb3VwIHByZWFsbG9jIHdlIHRyeSB0byBub3JtYWxpemUgdGhlIHJlcXVlc3QgdG8KICAqIHNiaS0+c19tYl9ncm91cF9wcmVhbGxvYy4gRGVmYXVsdCB2YWx1ZSBvZiBzX21iX2dyb3VwX3ByZWFsbG9jIGlzCiAgKiA1MTIgYmxvY2tzLiBUaGlzIGNhbiBiZSB0dW5lZCB2aWEKLSAqIC9zeXMvZnMvZXh0NC88cGFydGl0aW9uL21iX2dyb3VwX3ByZWFsbG9jLiBUaGUgdmFsdWUgaXMgcmVwcmVzZW50ZWQgaW4KKyAqIC9zeXMvZnMvZXh0NC88cGFydGl0aW9uPi9tYl9ncm91cF9wcmVhbGxvYy4gVGhlIHZhbHVlIGlzIHJlcHJlc2VudGVkIGluCiAgKiB0ZXJtcyBvZiBudW1iZXIgb2YgYmxvY2tzLiBJZiB3ZSBoYXZlIG1vdW50ZWQgdGhlIGZpbGUgc3lzdGVtIHdpdGggLU8KICAqIHN0cmlwZT08dmFsdWU+IG9wdGlvbiB0aGUgZ3JvdXAgcHJlYWxsb2MgcmVxdWVzdCBpcyBub3JtYWxpemVkIHRvIHRoZQotICogc3RyaXBlIHZhbHVlIChzYmktPnNfc3RyaXBlKQorICogdGhlIHNtYWxsZXN0IG11bHRpcGxlIG9mIHRoZSBzdHJpcGUgdmFsdWUgKHNiaS0+c19zdHJpcGUpIHdoaWNoIGlzCisgKiBncmVhdGVyIHRoYW4gdGhlIGRlZmF1bHQgbWJfZ3JvdXBfcHJlYWxsb2MuCiAgKgotICogVGhlIHJlZ3VsYXIgYWxsb2NhdG9yKHVzaW5nIHRoZSBidWRkeSBjYWNoZSkgc3VwcG9ydHMgZmV3IHR1bmFibGVzLgorICogVGhlIHJlZ3VsYXIgYWxsb2NhdG9yICh1c2luZyB0aGUgYnVkZHkgY2FjaGUpIHN1cHBvcnRzIGEgZmV3IHR1bmFibGVzLgogICoKICAqIC9zeXMvZnMvZXh0NC88cGFydGl0aW9uPi9tYl9taW5fdG9fc2NhbgogICogL3N5cy9mcy9leHQ0LzxwYXJ0aXRpb24+L21iX21heF90b19zY2FuCkBAIC0xNTIsNyArMTUzLDcgQEAKICAqIGJlc3QgZXh0ZW50IGluIHRoZSBmb3VuZCBleHRlbnRzLiBTZWFyY2hpbmcgZm9yIHRoZSBibG9ja3Mgc3RhcnRzIHdpdGgKICAqIHRoZSBncm91cCBzcGVjaWZpZWQgYXMgdGhlIGdvYWwgdmFsdWUgaW4gYWxsb2NhdGlvbiBjb250ZXh0IHZpYQogICogYWNfZ19leC4gRWFjaCBncm91cCBpcyBmaXJzdCBjaGVja2VkIGJhc2VkIG9uIHRoZSBjcml0ZXJpYSB3aGV0aGVyIGl0Ci0gKiBjYW4gdXNlZCBmb3IgYWxsb2NhdGlvbi4gZXh0NF9tYl9nb29kX2dyb3VwIGV4cGxhaW5zIGhvdyB0aGUgZ3JvdXBzIGFyZQorICogY2FuIGJlIHVzZWQgZm9yIGFsbG9jYXRpb24uIGV4dDRfbWJfZ29vZF9ncm91cCBleHBsYWlucyBob3cgdGhlIGdyb3VwcyBhcmUKICAqIGNoZWNrZWQuCiAgKgogICogQm90aCB0aGUgcHJlYWxsb2Mgc3BhY2UgYXJlIGdldHRpbmcgcG9wdWxhdGVkIGFzIGFib3ZlLiBTbyBmb3IgdGhlIGZpcnN0CkBAIC00OTIsMTAgKzQ5MywxMSBAQAogCQliMiA9ICh1bnNpZ25lZCBjaGFyICopIGJpdG1hcDsKIAkJZm9yIChpID0gMDsgaSA8IGU0Yi0+YmRfc2ItPnNfYmxvY2tzaXplOyBpKyspIHsKIAkJCWlmIChiMVtpXSAhPSBiMltpXSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiY29ycnVwdGlvbiBpbiBncm91cCAldSAiCi0JCQkJICAgICAgICJhdCBieXRlICV1KCV1KTogJXggaW4gY29weSAhPSAleCAiCi0JCQkJICAgICAgICJvbiBkaXNrL3ByZWFsbG9jXG4iLAotCQkJCSAgICAgICBlNGItPmJkX2dyb3VwLCBpLCBpICogOCwgYjFbaV0sIGIyW2ldKTsKKwkJCQlleHQ0X21zZyhlNGItPmJkX3NiLCBLRVJOX0VSUiwKKwkJCQkJICJjb3JydXB0aW9uIGluIGdyb3VwICV1ICIKKwkJCQkJICJhdCBieXRlICV1KCV1KTogJXggaW4gY29weSAhPSAleCAiCisJCQkJCSAib24gZGlzay9wcmVhbGxvYyIsCisJCQkJCSBlNGItPmJkX2dyb3VwLCBpLCBpICogOCwgYjFbaV0sIGIyW2ldKTsKIAkJCQlCVUcoKTsKIAkJCX0KIAkJfQpAQCAtMTEyNSw3ICsxMTI3LDcgQEAKIAlncnAgPSBleHQ0X2dldF9ncm91cF9pbmZvKHNiLCBncm91cCk7CiAKIAllNGItPmJkX2Jsa2JpdHMgPSBzYi0+c19ibG9ja3NpemVfYml0czsKLQllNGItPmJkX2luZm8gPSBleHQ0X2dldF9ncm91cF9pbmZvKHNiLCBncm91cCk7CisJZTRiLT5iZF9pbmZvID0gZ3JwOwogCWU0Yi0+YmRfc2IgPSBzYjsKIAllNGItPmJkX2dyb3VwID0gZ3JvdXA7CiAJZTRiLT5iZF9idWRkeV9wYWdlID0gTlVMTDsKQEAgLTEyODEsNyArMTI4Myw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBtYl9zZXRfYml0cyh2b2lkICpibSwgaW50IGN1ciwgaW50IGxlbikKK3ZvaWQgZXh0NF9zZXRfYml0cyh2b2lkICpibSwgaW50IGN1ciwgaW50IGxlbikKIHsKIAlfX3UzMiAqYWRkcjsKIApAQCAtMTUxMCw3ICsxNTEyLDcgQEAKIAl9CiAJbWJfc2V0X2xhcmdlc3RfZnJlZV9vcmRlcihlNGItPmJkX3NiLCBlNGItPmJkX2luZm8pOwogCi0JbWJfc2V0X2JpdHMoRVhUNF9NQl9CSVRNQVAoZTRiKSwgZXgtPmZlX3N0YXJ0LCBsZW4wKTsKKwlleHQ0X3NldF9iaXRzKEVYVDRfTUJfQklUTUFQKGU0YiksIGV4LT5mZV9zdGFydCwgbGVuMCk7CiAJbWJfY2hlY2tfYnVkZHkoZTRiKTsKIAogCXJldHVybiByZXQ7CkBAIC0yMjIzLDggKzIyMjUsOCBAQAogCQkJRVhUNF9ERVNDX1BFUl9CTE9DS19CSVRTKHNiKTsKIAkJbWV0YV9ncm91cF9pbmZvID0ga21hbGxvYyhtZXRhbGVuLCBHRlBfS0VSTkVMKTsKIAkJaWYgKG1ldGFfZ3JvdXBfaW5mbyA9PSBOVUxMKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGNhbid0IGFsbG9jYXRlIG1lbSBmb3IgYSAiCi0JCQkgICAgICAgImJ1ZGR5IGdyb3VwXG4iKTsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgIkVYVDQtZnM6IGNhbid0IGFsbG9jYXRlIG1lbSAiCisJCQkJICJmb3IgYSBidWRkeSBncm91cCIpOwogCQkJZ290byBleGl0X21ldGFfZ3JvdXBfaW5mbzsKIAkJfQogCQlzYmktPnNfZ3JvdXBfaW5mb1tncm91cCA+PiBFWFQ0X0RFU0NfUEVSX0JMT0NLX0JJVFMoc2IpXSA9CkBAIC0yMjM3LDcgKzIyMzksNyBAQAogCiAJbWV0YV9ncm91cF9pbmZvW2ldID0ga21lbV9jYWNoZV9hbGxvYyhjYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmIChtZXRhX2dyb3VwX2luZm9baV0gPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGNhbid0IGFsbG9jYXRlIGJ1ZGR5IG1lbVxuIik7CisJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgIkVYVDQtZnM6IGNhbid0IGFsbG9jYXRlIGJ1ZGR5IG1lbSIpOwogCQlnb3RvIGV4aXRfZ3JvdXBfaW5mbzsKIAl9CiAJbWVtc2V0KG1ldGFfZ3JvdXBfaW5mb1tpXSwgMCwga21lbV9jYWNoZV9zaXplKGNhY2hlcCkpOwpAQCAtMjI3OSw4ICsyMjgxLDEwIEBACiAKIGV4aXRfZ3JvdXBfaW5mbzoKIAkvKiBJZiBhIG1ldGFfZ3JvdXBfaW5mbyB0YWJsZSBoYXMgYmVlbiBhbGxvY2F0ZWQsIHJlbGVhc2UgaXQgbm93ICovCi0JaWYgKGdyb3VwICUgRVhUNF9ERVNDX1BFUl9CTE9DSyhzYikgPT0gMCkKKwlpZiAoZ3JvdXAgJSBFWFQ0X0RFU0NfUEVSX0JMT0NLKHNiKSA9PSAwKSB7CiAJCWtmcmVlKHNiaS0+c19ncm91cF9pbmZvW2dyb3VwID4+IEVYVDRfREVTQ19QRVJfQkxPQ0tfQklUUyhzYildKTsKKwkJc2JpLT5zX2dyb3VwX2luZm9bZ3JvdXAgPj4gRVhUNF9ERVNDX1BFUl9CTE9DS19CSVRTKHNiKV0gPSBOVUxMOworCX0KIGV4aXRfbWV0YV9ncm91cF9pbmZvOgogCXJldHVybiAtRU5PTUVNOwogfSAvKiBleHQ0X21iX2FkZF9ncm91cGluZm8gKi8KQEAgLTIzMjgsMjMgKzIzMzIsMjYgQEAKIAkvKiBBbiA4VEIgZmlsZXN5c3RlbSB3aXRoIDY0LWJpdCBwb2ludGVycyByZXF1aXJlcyBhIDQwOTYgYnl0ZQogCSAqIGttYWxsb2MuIEEgMTI4a2IgbWFsbG9jIHNob3VsZCBzdWZmaWNlIGZvciBhIDI1NlRCIGZpbGVzeXN0ZW0uCiAJICogU28gYSB0d28gbGV2ZWwgc2NoZW1lIHN1ZmZpY2VzIGZvciBub3cuICovCi0Jc2JpLT5zX2dyb3VwX2luZm8gPSBremFsbG9jKGFycmF5X3NpemUsIEdGUF9LRVJORUwpOworCXNiaS0+c19ncm91cF9pbmZvID0gZXh0NF9rdnphbGxvYyhhcnJheV9zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoc2JpLT5zX2dyb3VwX2luZm8gPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGNhbid0IGFsbG9jYXRlIGJ1ZGR5IG1ldGEgZ3JvdXBcbiIpOworCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJjYW4ndCBhbGxvY2F0ZSBidWRkeSBtZXRhIGdyb3VwIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlzYmktPnNfYnVkZHlfY2FjaGUgPSBuZXdfaW5vZGUoc2IpOwogCWlmIChzYmktPnNfYnVkZHlfY2FjaGUgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGNhbid0IGdldCBuZXcgaW5vZGVcbiIpOworCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJjYW4ndCBnZXQgbmV3IGlub2RlIik7CiAJCWdvdG8gZXJyX2ZyZWVzZ2k7CiAJfQotCXNiaS0+c19idWRkeV9jYWNoZS0+aV9pbm8gPSBnZXRfbmV4dF9pbm8oKTsKKwkvKiBUbyBhdm9pZCBwb3RlbnRpYWxseSBjb2xsaWRpbmcgd2l0aCBhbiB2YWxpZCBvbi1kaXNrIGlub2RlIG51bWJlciwKKwkgKiB1c2UgRVhUNF9CQURfSU5PIGZvciB0aGUgYnVkZHkgY2FjaGUgaW5vZGUgbnVtYmVyLiAgVGhpcyBpbm9kZSBpcworCSAqIG5vdCBpbiB0aGUgaW5vZGUgaGFzaCwgc28gaXQgc2hvdWxkIG5ldmVyIGJlIGZvdW5kIGJ5IGlnZXQoKSwgYnV0CisJICogdGhpcyB3aWxsIGF2b2lkIGNvbmZ1c2lvbiBpZiBpdCBldmVyIHNob3dzIHVwIGR1cmluZyBkZWJ1Z2dpbmcuICovCisJc2JpLT5zX2J1ZGR5X2NhY2hlLT5pX2lubyA9IEVYVDRfQkFEX0lOTzsKIAlFWFQ0X0koc2JpLT5zX2J1ZGR5X2NhY2hlKS0+aV9kaXNrc2l6ZSA9IDA7CiAJZm9yIChpID0gMDsgaSA8IG5ncm91cHM7IGkrKykgewogCQlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CiAJCWlmIChkZXNjID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSJFWFQ0LWZzOiBjYW4ndCByZWFkIGRlc2NyaXB0b3IgJXVcbiIsIGkpOworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiY2FuJ3QgcmVhZCBkZXNjcmlwdG9yICV1IiwgaSk7CiAJCQlnb3RvIGVycl9mcmVlYnVkZHk7CiAJCX0KIAkJaWYgKGV4dDRfbWJfYWRkX2dyb3VwaW5mbyhzYiwgaSwgZGVzYykgIT0gMCkKQEAgLTIzNjIsNyArMjM2OSw3IEBACiAJCWtmcmVlKHNiaS0+c19ncm91cF9pbmZvW2ldKTsKIAlpcHV0KHNiaS0+c19idWRkeV9jYWNoZSk7CiBlcnJfZnJlZXNnaToKLQlrZnJlZShzYmktPnNfZ3JvdXBfaW5mbyk7CisJZXh0NF9rdmZyZWUoc2JpLT5zX2dyb3VwX2luZm8pOwogCXJldHVybiAtRU5PTUVNOwogfQogCkBAIC0yNDA0LDE0ICsyNDExLDE1IEBACiAJCQkJCXNsYWJfc2l6ZSwgMCwgU0xBQl9SRUNMQUlNX0FDQ09VTlQsCiAJCQkJCU5VTEwpOwogCisJZXh0NF9ncm91cGluZm9fY2FjaGVzW2NhY2hlX2luZGV4XSA9IGNhY2hlcDsKKwogCW11dGV4X3VubG9jaygmZXh0NF9ncnBpbmZvX3NsYWJfY3JlYXRlX211dGV4KTsKIAlpZiAoIWNhY2hlcCkgewotCQlwcmludGsoS0VSTl9FTUVSRyAiRVhUNDogbm8gbWVtb3J5IGZvciBncm91cGluZm8gc2xhYiBjYWNoZVxuIik7CisJCXByaW50ayhLRVJOX0VNRVJHCisJCSAgICAgICAiRVhUNC1mczogbm8gbWVtb3J5IGZvciBncm91cGluZm8gc2xhYiBjYWNoZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWV4dDRfZ3JvdXBpbmZvX2NhY2hlc1tjYWNoZV9pbmRleF0gPSBjYWNoZXA7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQ1NywxMiArMjQ2NSw2IEBACiAJCWkrKzsKIAl9IHdoaWxlIChpIDw9IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzICsgMSk7CiAKLQkvKiBpbml0IGZpbGUgZm9yIGJ1ZGR5IGRhdGEgKi8KLQlyZXQgPSBleHQ0X21iX2luaXRfYmFja2VuZChzYik7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWdvdG8gb3V0OwotCX0KLQogCXNwaW5fbG9ja19pbml0KCZzYmktPnNfbWRfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnNiaS0+c19iYWxfbG9jayk7CiAKQEAgLTI0NzIsNiArMjQ3NCwxOCBAQAogCXNiaS0+c19tYl9zdHJlYW1fcmVxdWVzdCA9IE1CX0RFRkFVTFRfU1RSRUFNX1RIUkVTSE9MRDsKIAlzYmktPnNfbWJfb3JkZXIyX3JlcXMgPSBNQl9ERUZBVUxUX09SREVSMl9SRVFTOwogCXNiaS0+c19tYl9ncm91cF9wcmVhbGxvYyA9IE1CX0RFRkFVTFRfR1JPVVBfUFJFQUxMT0M7CisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIHNfc3RyaXBlID4gMSwgdGhlbiB3ZSBzZXQgdGhlIHNfbWJfZ3JvdXBfcHJlYWxsb2MKKwkgKiB0byB0aGUgbG93ZXN0IG11bHRpcGxlIG9mIHNfc3RyaXBlIHdoaWNoIGlzIGJpZ2dlciB0aGFuCisJICogdGhlIHNfbWJfZ3JvdXBfcHJlYWxsb2MgYXMgZGV0ZXJtaW5lZCBhYm92ZS4gV2Ugd2FudAorCSAqIHRoZSBwcmVhbGxvY2F0aW9uIHNpemUgdG8gYmUgYW4gZXhhY3QgbXVsdGlwbGUgb2YgdGhlCisJICogUkFJRCBzdHJpcGUgc2l6ZSBzbyB0aGF0IHByZWFsbG9jYXRpb25zIGRvbid0IGZyYWdtZW50CisJICogdGhlIHN0cmlwZXMuCisJICovCisJaWYgKHNiaS0+c19zdHJpcGUgPiAxKSB7CisJCXNiaS0+c19tYl9ncm91cF9wcmVhbGxvYyA9IHJvdW5kdXAoCisJCQlzYmktPnNfbWJfZ3JvdXBfcHJlYWxsb2MsIHNiaS0+c19zdHJpcGUpOworCX0KIAogCXNiaS0+c19sb2NhbGl0eV9ncm91cHMgPSBhbGxvY19wZXJjcHUoc3RydWN0IGV4dDRfbG9jYWxpdHlfZ3JvdXApOwogCWlmIChzYmktPnNfbG9jYWxpdHlfZ3JvdXBzID09IE5VTEwpIHsKQEAgLTI0ODcsNiArMjUwMSwxMiBAQAogCQlzcGluX2xvY2tfaW5pdCgmbGctPmxnX3ByZWFsbG9jX2xvY2spOwogCX0KIAorCS8qIGluaXQgZmlsZSBmb3IgYnVkZHkgZGF0YSAqLworCXJldCA9IGV4dDRfbWJfaW5pdF9iYWNrZW5kKHNiKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZ290byBvdXQ7CisJfQorCiAJaWYgKHNiaS0+c19wcm9jKQogCQlwcm9jX2NyZWF0ZV9kYXRhKCJtYl9ncm91cHMiLCBTX0lSVUdPLCBzYmktPnNfcHJvYywKIAkJCQkgJmV4dDRfbWJfc2VxX2dyb3Vwc19mb3BzLCBzYik7CkBAIC0yNTQ0LDMyICsyNTY0LDMyIEBACiAJCQlFWFQ0X0RFU0NfUEVSX0JMT0NLX0JJVFMoc2IpOwogCQlmb3IgKGkgPSAwOyBpIDwgbnVtX21ldGFfZ3JvdXBfaW5mb3M7IGkrKykKIAkJCWtmcmVlKHNiaS0+c19ncm91cF9pbmZvW2ldKTsKLQkJa2ZyZWUoc2JpLT5zX2dyb3VwX2luZm8pOworCQlleHQ0X2t2ZnJlZShzYmktPnNfZ3JvdXBfaW5mbyk7CiAJfQogCWtmcmVlKHNiaS0+c19tYl9vZmZzZXRzKTsKIAlrZnJlZShzYmktPnNfbWJfbWF4cyk7CiAJaWYgKHNiaS0+c19idWRkeV9jYWNoZSkKIAkJaXB1dChzYmktPnNfYnVkZHlfY2FjaGUpOwogCWlmIChzYmktPnNfbWJfc3RhdHMpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTwotCQkgICAgICAgIkVYVDQtZnM6IG1iYWxsb2M6ICV1IGJsb2NrcyAldSByZXFzICgldSBzdWNjZXNzKVxuIiwKKwkJZXh0NF9tc2coc2IsIEtFUk5fSU5GTywKKwkJICAgICAgICJtYmFsbG9jOiAldSBibG9ja3MgJXUgcmVxcyAoJXUgc3VjY2VzcykiLAogCQkJCWF0b21pY19yZWFkKCZzYmktPnNfYmFsX2FsbG9jYXRlZCksCiAJCQkJYXRvbWljX3JlYWQoJnNiaS0+c19iYWxfcmVxcyksCiAJCQkJYXRvbWljX3JlYWQoJnNiaS0+c19iYWxfc3VjY2VzcykpOwotCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICJFWFQ0LWZzOiBtYmFsbG9jOiAldSBleHRlbnRzIHNjYW5uZWQsICV1IGdvYWwgaGl0cywgIgotCQkJCSIldSAyXk4gaGl0cywgJXUgYnJlYWtzLCAldSBsb3N0XG4iLAorCQlleHQ0X21zZyhzYiwgS0VSTl9JTkZPLAorCQkgICAgICAibWJhbGxvYzogJXUgZXh0ZW50cyBzY2FubmVkLCAldSBnb2FsIGhpdHMsICIKKwkJCQkiJXUgMl5OIGhpdHMsICV1IGJyZWFrcywgJXUgbG9zdCIsCiAJCQkJYXRvbWljX3JlYWQoJnNiaS0+c19iYWxfZXhfc2Nhbm5lZCksCiAJCQkJYXRvbWljX3JlYWQoJnNiaS0+c19iYWxfZ29hbHMpLAogCQkJCWF0b21pY19yZWFkKCZzYmktPnNfYmFsXzJvcmRlcnMpLAogCQkJCWF0b21pY19yZWFkKCZzYmktPnNfYmFsX2JyZWFrcyksCiAJCQkJYXRvbWljX3JlYWQoJnNiaS0+c19tYl9sb3N0X2NodW5rcykpOwotCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICAiRVhUNC1mczogbWJhbGxvYzogJWx1IGdlbmVyYXRlZCBhbmQgaXQgdG9vayAlTHVcbiIsCi0JCQkJc2JpLT5zX21iX2J1ZGRpZXNfZ2VuZXJhdGVkKyssCisJCWV4dDRfbXNnKHNiLCBLRVJOX0lORk8sCisJCSAgICAgICAibWJhbGxvYzogJWx1IGdlbmVyYXRlZCBhbmQgaXQgdG9vayAlTHUiLAorCQkJCXNiaS0+c19tYl9idWRkaWVzX2dlbmVyYXRlZCwKIAkJCQlzYmktPnNfbWJfZ2VuZXJhdGlvbl90aW1lKTsKLQkJcHJpbnRrKEtFUk5fSU5GTwotCQkgICAgICAgIkVYVDQtZnM6IG1iYWxsb2M6ICV1IHByZWFsbG9jYXRlZCwgJXUgZGlzY2FyZGVkXG4iLAorCQlleHQ0X21zZyhzYiwgS0VSTl9JTkZPLAorCQkgICAgICAgIm1iYWxsb2M6ICV1IHByZWFsbG9jYXRlZCwgJXUgZGlzY2FyZGVkIiwKIAkJCQlhdG9taWNfcmVhZCgmc2JpLT5zX21iX3ByZWFsbG9jYXRlZCksCiAJCQkJYXRvbWljX3JlYWQoJnNiaS0+c19tYl9kaXNjYXJkZWQpKTsKIAl9CkBAIC0yNjI4LDYgKzI2NDgsMTUgQEAKIAkJcmJfZXJhc2UoJmVudHJ5LT5ub2RlLCAmKGRiLT5iYl9mcmVlX3Jvb3QpKTsKIAkJbWJfZnJlZV9ibG9ja3MoTlVMTCwgJmU0YiwgZW50cnktPnN0YXJ0X2JsaywgZW50cnktPmNvdW50KTsKIAorCQkvKgorCQkgKiBDbGVhciB0aGUgdHJpbW1lZCBmbGFnIGZvciB0aGUgZ3JvdXAgc28gdGhhdCB0aGUgbmV4dAorCQkgKiBleHQ0X3RyaW1fZnMgY2FuIHRyaW0gaXQuCisJCSAqIElmIHRoZSB2b2x1bWUgaXMgbW91bnRlZCB3aXRoIC1vIGRpc2NhcmQsIG9ubGluZSBkaXNjYXJkCisJCSAqIGlzIHN1cHBvcnRlZCBhbmQgdGhlIGZyZWUgYmxvY2tzIHdpbGwgYmUgdHJpbW1lZCBvbmxpbmUuCisJCSAqLworCQlpZiAoIXRlc3Rfb3B0KHNiLCBESVNDQVJEKSkKKwkJCUVYVDRfTUJfR1JQX0NMRUFSX1RSSU1NRUQoZGIpOworCiAJCWlmICghZGItPmJiX2ZyZWVfcm9vdC5yYl9ub2RlKSB7CiAJCQkvKiBObyBtb3JlIGl0ZW1zIGluIHRoZSBwZXIgZ3JvdXAgcmIgdHJlZQogCQkJICogYmFsYW5jZSByZWZjb3VudHMgZnJvbSBleHQ0X21iX2ZyZWVfbWV0YWRhdGEoKQpAQCAtMjc3MSw4ICsyODAwLDggQEAKIAkJICogV2UgbGVhayBzb21lIG9mIHRoZSBibG9ja3MgaGVyZS4KIAkJICovCiAJCWV4dDRfbG9ja19ncm91cChzYiwgYWMtPmFjX2JfZXguZmVfZ3JvdXApOwotCQltYl9zZXRfYml0cyhiaXRtYXBfYmgtPmJfZGF0YSwgYWMtPmFjX2JfZXguZmVfc3RhcnQsCi0JCQkgICAgYWMtPmFjX2JfZXguZmVfbGVuKTsKKwkJZXh0NF9zZXRfYml0cyhiaXRtYXBfYmgtPmJfZGF0YSwgYWMtPmFjX2JfZXguZmVfc3RhcnQsCisJCQkgICAgICBhYy0+YWNfYl9leC5mZV9sZW4pOwogCQlleHQ0X3VubG9ja19ncm91cChzYiwgYWMtPmFjX2JfZXguZmVfZ3JvdXApOwogCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGJpdG1hcF9iaCk7CiAJCWlmICghZXJyKQpAQCAtMjc5MCw3ICsyODE5LDggQEAKIAkJfQogCX0KICNlbmRpZgotCW1iX3NldF9iaXRzKGJpdG1hcF9iaC0+Yl9kYXRhLCBhYy0+YWNfYl9leC5mZV9zdGFydCxhYy0+YWNfYl9leC5mZV9sZW4pOworCWV4dDRfc2V0X2JpdHMoYml0bWFwX2JoLT5iX2RhdGEsIGFjLT5hY19iX2V4LmZlX3N0YXJ0LAorCQkgICAgICBhYy0+YWNfYl9leC5mZV9sZW4pOwogCWlmIChnZHAtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19CTE9DS19VTklOSVQpKSB7CiAJCWdkcC0+YmdfZmxhZ3MgJj0gY3B1X3RvX2xlMTYofkVYVDRfQkdfQkxPQ0tfVU5JTklUKTsKIAkJZXh0NF9mcmVlX2Jsa3Nfc2V0KHNiLCBnZHAsCkBAIC0yODMwLDggKzI4NjAsOSBAQAogCiAvKgogICogaGVyZSB3ZSBub3JtYWxpemUgcmVxdWVzdCBmb3IgbG9jYWxpdHkgZ3JvdXAKLSAqIEdyb3VwIHJlcXVlc3QgYXJlIG5vcm1hbGl6ZWQgdG8gc19zdHJpcCBzaXplIGlmIHdlIHNldCB0aGUgc2FtZSB2aWEgbW91bnQKLSAqIG9wdGlvbi4gSWYgbm90IHdlIHNldCBpdCB0byBzX21iX2dyb3VwX3ByZWFsbG9jIHdoaWNoIGNhbiBiZSBjb25maWd1cmVkIHZpYQorICogR3JvdXAgcmVxdWVzdCBhcmUgbm9ybWFsaXplZCB0byBzX21iX2dyb3VwX3ByZWFsbG9jLCB3aGljaCBnb2VzIHRvCisgKiBzX3N0cmlwIGlmIHdlIHNldCB0aGUgc2FtZSB2aWEgbW91bnQgb3B0aW9uLgorICogc19tYl9ncm91cF9wcmVhbGxvYyBjYW4gYmUgY29uZmlndXJlZCB2aWEKICAqIC9zeXMvZnMvZXh0NC88cGFydGl0aW9uPi9tYl9ncm91cF9wcmVhbGxvYwogICoKICAqIFhYWDogc2hvdWxkIHdlIHRyeSB0byBwcmVhbGxvY2F0ZSBtb3JlIHRoYW4gdGhlIGdyb3VwIGhhcyBub3c/CkBAIC0yODQyLDEwICsyODczLDcgQEAKIAlzdHJ1Y3QgZXh0NF9sb2NhbGl0eV9ncm91cCAqbGcgPSBhYy0+YWNfbGc7CiAKIAlCVUdfT04obGcgPT0gTlVMTCk7Ci0JaWYgKEVYVDRfU0Ioc2IpLT5zX3N0cmlwZSkKLQkJYWMtPmFjX2dfZXguZmVfbGVuID0gRVhUNF9TQihzYiktPnNfc3RyaXBlOwotCWVsc2UKLQkJYWMtPmFjX2dfZXguZmVfbGVuID0gRVhUNF9TQihzYiktPnNfbWJfZ3JvdXBfcHJlYWxsb2M7CisJYWMtPmFjX2dfZXguZmVfbGVuID0gRVhUNF9TQihzYiktPnNfbWJfZ3JvdXBfcHJlYWxsb2M7CiAJbWJfZGVidWcoMSwgIiMldTogZ29hbCAldSBibG9ja3MgZm9yIGxvY2FsaXR5IGdyb3VwXG4iLAogCQljdXJyZW50LT5waWQsIGFjLT5hY19nX2V4LmZlX2xlbik7CiB9CkBAIC0zMDAxLDkgKzMwMjksMTAgQEAKIAogCWlmIChzdGFydCArIHNpemUgPD0gYWMtPmFjX29fZXguZmVfbG9naWNhbCAmJgogCQkJc3RhcnQgPiBhYy0+YWNfb19leC5mZV9sb2dpY2FsKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic3RhcnQgJWx1LCBzaXplICVsdSwgZmVfbG9naWNhbCAlbHVcbiIsCi0JCQkodW5zaWduZWQgbG9uZykgc3RhcnQsICh1bnNpZ25lZCBsb25nKSBzaXplLAotCQkJKHVuc2lnbmVkIGxvbmcpIGFjLT5hY19vX2V4LmZlX2xvZ2ljYWwpOworCQlleHQ0X21zZyhhYy0+YWNfc2IsIEtFUk5fRVJSLAorCQkJICJzdGFydCAlbHUsIHNpemUgJWx1LCBmZV9sb2dpY2FsICVsdSIsCisJCQkgKHVuc2lnbmVkIGxvbmcpIHN0YXJ0LCAodW5zaWduZWQgbG9uZykgc2l6ZSwKKwkJCSAodW5zaWduZWQgbG9uZykgYWMtPmFjX29fZXguZmVfbG9naWNhbCk7CiAJfQogCUJVR19PTihzdGFydCArIHNpemUgPD0gYWMtPmFjX29fZXguZmVfbG9naWNhbCAmJgogCQkJc3RhcnQgPiBhYy0+YWNfb19leC5mZV9sb2dpY2FsKTsKQEAgLTMyNjIsNyArMzI5MSw3IEBACiAKIAl3aGlsZSAobikgewogCQllbnRyeSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBleHQ0X2ZyZWVfZGF0YSwgbm9kZSk7Ci0JCW1iX3NldF9iaXRzKGJpdG1hcCwgZW50cnktPnN0YXJ0X2JsaywgZW50cnktPmNvdW50KTsKKwkJZXh0NF9zZXRfYml0cyhiaXRtYXAsIGVudHJ5LT5zdGFydF9ibGssIGVudHJ5LT5jb3VudCk7CiAJCW4gPSByYl9uZXh0KG4pOwogCX0KIAlyZXR1cm47CkBAIC0zMzA0LDcgKzMzMzMsNyBAQAogCQlpZiAodW5saWtlbHkobGVuID09IDApKQogCQkJY29udGludWU7CiAJCUJVR19PTihncm91cG5yICE9IGdyb3VwKTsKLQkJbWJfc2V0X2JpdHMoYml0bWFwLCBzdGFydCwgbGVuKTsKKwkJZXh0NF9zZXRfYml0cyhiaXRtYXAsIHN0YXJ0LCBsZW4pOwogCQlwcmVhbGxvY2F0ZWQgKz0gbGVuOwogCQljb3VudCsrOwogCX0KQEAgLTM1ODQsMTAgKzM2MTMsMTEgQEAKIAkJYml0ID0gbmV4dCArIDE7CiAJfQogCWlmIChmcmVlICE9IHBhLT5wYV9mcmVlKSB7Ci0JCXByaW50ayhLRVJOX0NSSVQgInBhICVwOiBsb2dpYyAlbHUsIHBoeXMuICVsdSwgbGVuICVsdVxuIiwKLQkJCXBhLCAodW5zaWduZWQgbG9uZykgcGEtPnBhX2xzdGFydCwKLQkJCSh1bnNpZ25lZCBsb25nKSBwYS0+cGFfcHN0YXJ0LAotCQkJKHVuc2lnbmVkIGxvbmcpIHBhLT5wYV9sZW4pOworCQlleHQ0X21zZyhlNGItPmJkX3NiLCBLRVJOX0NSSVQsCisJCQkgInBhICVwOiBsb2dpYyAlbHUsIHBoeXMuICVsdSwgbGVuICVsdSIsCisJCQkgcGEsICh1bnNpZ25lZCBsb25nKSBwYS0+cGFfbHN0YXJ0LAorCQkJICh1bnNpZ25lZCBsb25nKSBwYS0+cGFfcHN0YXJ0LAorCQkJICh1bnNpZ25lZCBsb25nKSBwYS0+cGFfbGVuKTsKIAkJZXh0NF9ncnBfbG9ja2VkX2Vycm9yKHNiLCBncm91cCwgMCwgMCwgImZyZWUgJXUsIHBhX2ZyZWUgJXUiLAogCQkJCQlmcmVlLCBwYS0+cGFfZnJlZSk7CiAJCS8qCkBAIC0zNzc1LDcgKzM4MDUsOCBAQAogCQkJICogdXNlIHByZWFsbG9jYXRpb24gd2hpbGUgd2UncmUgZGlzY2FyZGluZyBpdCAqLwogCQkJc3Bpbl91bmxvY2soJnBhLT5wYV9sb2NrKTsKIAkJCXNwaW5fdW5sb2NrKCZlaS0+aV9wcmVhbGxvY19sb2NrKTsKLQkJCXByaW50ayhLRVJOX0VSUiAidWgtb2ghIHVzZWQgcGEgd2hpbGUgZGlzY2FyZGluZ1xuIik7CisJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsCisJCQkJICJ1aC1vaCEgdXNlZCBwYSB3aGlsZSBkaXNjYXJkaW5nIik7CiAJCQlXQVJOX09OKDEpOwogCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoSFopOwogCQkJZ290byByZXBlYXQ7CkBAIC0zODUyLDEyICszODgzLDEzIEBACiAJICAgIChFWFQ0X1NCKHNiKS0+c19tb3VudF9mbGFncyAmIEVYVDRfTUZfRlNfQUJPUlRFRCkpCiAJCXJldHVybjsKIAotCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogQ2FuJ3QgYWxsb2NhdGU6IgotCQkJIiBBbGxvY2F0aW9uIGNvbnRleHQgZGV0YWlsczpcbiIpOwotCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogc3RhdHVzICVkIGZsYWdzICVkXG4iLAorCWV4dDRfbXNnKGFjLT5hY19zYiwgS0VSTl9FUlIsICJFWFQ0LWZzOiBDYW4ndCBhbGxvY2F0ZToiCisJCQkiIEFsbG9jYXRpb24gY29udGV4dCBkZXRhaWxzOiIpOworCWV4dDRfbXNnKGFjLT5hY19zYiwgS0VSTl9FUlIsICJFWFQ0LWZzOiBzdGF0dXMgJWQgZmxhZ3MgJWQiLAogCQkJYWMtPmFjX3N0YXR1cywgYWMtPmFjX2ZsYWdzKTsKLQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IG9yaWcgJWx1LyVsdS8lbHVAJWx1LCBnb2FsICVsdS8lbHUvJWx1QCVsdSwgIgotCQkJImJlc3QgJWx1LyVsdS8lbHVAJWx1IGNyICVkXG4iLAorCWV4dDRfbXNnKGFjLT5hY19zYiwgS0VSTl9FUlIsICJFWFQ0LWZzOiBvcmlnICVsdS8lbHUvJWx1QCVsdSwgIgorCQkgCSJnb2FsICVsdS8lbHUvJWx1QCVsdSwgIgorCQkJImJlc3QgJWx1LyVsdS8lbHVAJWx1IGNyICVkIiwKIAkJCSh1bnNpZ25lZCBsb25nKWFjLT5hY19vX2V4LmZlX2dyb3VwLAogCQkJKHVuc2lnbmVkIGxvbmcpYWMtPmFjX29fZXguZmVfc3RhcnQsCiAJCQkodW5zaWduZWQgbG9uZylhYy0+YWNfb19leC5mZV9sZW4sCkBAIC0zODcxLDkgKzM5MDMsOSBAQAogCQkJKHVuc2lnbmVkIGxvbmcpYWMtPmFjX2JfZXguZmVfbGVuLAogCQkJKHVuc2lnbmVkIGxvbmcpYWMtPmFjX2JfZXguZmVfbG9naWNhbCwKIAkJCShpbnQpYWMtPmFjX2NyaXRlcmlhKTsKLQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6ICVsdSBzY2FubmVkLCAlZCBmb3VuZFxuIiwgYWMtPmFjX2V4X3NjYW5uZWQsCi0JCWFjLT5hY19mb3VuZCk7Ci0JcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBncm91cHM6IFxuIik7CisJZXh0NF9tc2coYWMtPmFjX3NiLCBLRVJOX0VSUiwgIkVYVDQtZnM6ICVsdSBzY2FubmVkLCAlZCBmb3VuZCIsCisJCSBhYy0+YWNfZXhfc2Nhbm5lZCwgYWMtPmFjX2ZvdW5kKTsKKwlleHQ0X21zZyhhYy0+YWNfc2IsIEtFUk5fRVJSLCAiRVhUNC1mczogZ3JvdXBzOiAiKTsKIAluZ3JvdXBzID0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KHNiKTsKIAlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKSB7CiAJCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdycCA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGkpOwpAQCAtNDYzNyw3ICs0NjY5LDcgQEAKIAl9CiAJZXh0NF9tYXJrX3N1cGVyX2RpcnR5KHNiKTsKIGVycm9yX3JldHVybjoKLQlpZiAoZnJlZWQpCisJaWYgKGZyZWVkICYmICEoZmxhZ3MgJiBFWFQ0X0ZSRUVfQkxPQ0tTX05PX1FVT1RfVVBEQVRFKSkKIAkJZHF1b3RfZnJlZV9ibG9jayhpbm9kZSwgZnJlZWQpOwogCWJyZWxzZShiaXRtYXBfYmgpOwogCWV4dDRfc3RkX2Vycm9yKHNiLCBlcnIpOwpAQCAtNDY0NSw3ICs0Njc3LDcgQEAKIH0KIAogLyoqCi0gKiBleHQ0X2FkZF9ncm91cGJsb2NrcygpIC0tIEFkZCBnaXZlbiBibG9ja3MgdG8gYW4gZXhpc3RpbmcgZ3JvdXAKKyAqIGV4dDRfZ3JvdXBfYWRkX2Jsb2NrcygpIC0tIEFkZCBnaXZlbiBibG9ja3MgdG8gYW4gZXhpc3RpbmcgZ3JvdXAKICAqIEBoYW5kbGU6CQkJaGFuZGxlIHRvIHRoaXMgdHJhbnNhY3Rpb24KICAqIEBzYjoJCQkJc3VwZXIgYmxvY2sKICAqIEBibG9jazoJCQlzdGFydCBwaHlzY2lhbCBibG9jayB0byBhZGQgdG8gdGhlIGJsb2NrIGdyb3VwCkBAIC00NjUzLDcgKzQ2ODUsNyBAQAogICoKICAqIFRoaXMgbWFya3MgdGhlIGJsb2NrcyBhcyBmcmVlIGluIHRoZSBiaXRtYXAgYW5kIGJ1ZGR5LgogICovCi12b2lkIGV4dDRfYWRkX2dyb3VwYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCitpbnQgZXh0NF9ncm91cF9hZGRfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkgZXh0NF9mc2Jsa190IGJsb2NrLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKQEAgLTQ2NjYsMjUgKzQ2OTgsMzUgQEAKIAlzdHJ1Y3QgZXh0NF9idWRkeSBlNGI7CiAJaW50IGVyciA9IDAsIHJldCwgYmxrX2ZyZWVfY291bnQ7CiAJZXh0NF9ncnBibGtfdCBibG9ja3NfZnJlZWQ7Ci0Jc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZ3JwOwogCiAJZXh0NF9kZWJ1ZygiQWRkaW5nIGJsb2NrKHMpICVsbHUtJWxsdVxuIiwgYmxvY2ssIGJsb2NrICsgY291bnQgLSAxKTsKIAorCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKwogCWV4dDRfZ2V0X2dyb3VwX25vX2FuZF9vZmZzZXQoc2IsIGJsb2NrLCAmYmxvY2tfZ3JvdXAsICZiaXQpOwotCWdycCA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGJsb2NrX2dyb3VwKTsKIAkvKgogCSAqIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgZnJlZWluZyBibG9ja3MgYWNyb3NzIGEgZ3JvdXAKIAkgKiBib3VuZGFyeS4KIAkgKi8KLQlpZiAoYml0ICsgY291bnQgPiBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpKQorCWlmIChiaXQgKyBjb3VudCA+IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikpIHsKKwkJZXh0NF93YXJuaW5nKHNiLCAidG9vIG11Y2ggYmxvY2tzIGFkZGVkIHRvIGdyb3VwICV1XG4iLAorCQkJICAgICBibG9ja19ncm91cCk7CisJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KIAogCWJpdG1hcF9iaCA9IGV4dDRfcmVhZF9ibG9ja19iaXRtYXAoc2IsIGJsb2NrX2dyb3VwKTsKLQlpZiAoIWJpdG1hcF9iaCkKKwlpZiAoIWJpdG1hcF9iaCkgeworCQllcnIgPSAtRUlPOwogCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisKIAlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgYmxvY2tfZ3JvdXAsICZnZF9iaCk7Ci0JaWYgKCFkZXNjKQorCWlmICghZGVzYykgeworCQllcnIgPSAtRUlPOwogCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CiAKIAlpZiAoaW5fcmFuZ2UoZXh0NF9ibG9ja19iaXRtYXAoc2IsIGRlc2MpLCBibG9jaywgY291bnQpIHx8CiAJICAgIGluX3JhbmdlKGV4dDRfaW5vZGVfYml0bWFwKHNiLCBkZXNjKSwgYmxvY2ssIGNvdW50KSB8fApAQCAtNDY5NCw2ICs0NzM2LDcgQEAKIAkJZXh0NF9lcnJvcihzYiwgIkFkZGluZyBibG9ja3MgaW4gc3lzdGVtIHpvbmVzIC0gIgogCQkJICAgIkJsb2NrID0gJWxsdSwgY291bnQgPSAlbHUiLAogCQkJICAgYmxvY2ssIGNvdW50KTsKKwkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBlcnJvcl9yZXR1cm47CiAJfQogCkBAIC00NzYyLDcgKzQ4MDUsNyBAQAogZXJyb3JfcmV0dXJuOgogCWJyZWxzZShiaXRtYXBfYmgpOwogCWV4dDRfc3RkX2Vycm9yKHNiLCBlcnIpOwotCXJldHVybjsKKwlyZXR1cm4gZXJyOwogfQogCiAvKioKQEAgLTQ3ODIsNiArNDgyNSw4IEBACiB7CiAJc3RydWN0IGV4dDRfZnJlZV9leHRlbnQgZXg7CiAKKwl0cmFjZV9leHQ0X3RyaW1fZXh0ZW50KHNiLCBncm91cCwgc3RhcnQsIGNvdW50KTsKKwogCWFzc2VydF9zcGluX2xvY2tlZChleHQ0X2dyb3VwX2xvY2tfcHRyKHNiLCBncm91cCkpOwogCiAJZXguZmVfc3RhcnQgPSBzdGFydDsKQEAgLTQ4MDIsNyArNDg0Nyw3IEBACiAvKioKICAqIGV4dDRfdHJpbV9hbGxfZnJlZSAtLSBmdW5jdGlvbiB0byB0cmltIGFsbCBmcmVlIHNwYWNlIGluIGFsbG9jLiBncm91cAogICogQHNiOgkJCXN1cGVyIGJsb2NrIGZvciBmaWxlIHN5c3RlbQotICogQGU0YjoJCWV4dDQgYnVkZHkKKyAqIEBncm91cDoJCWdyb3VwIHRvIGJlIHRyaW1tZWQKICAqIEBzdGFydDoJCWZpcnN0IGdyb3VwIGJsb2NrIHRvIGV4YW1pbmUKICAqIEBtYXg6CQlsYXN0IGdyb3VwIGJsb2NrIHRvIGV4YW1pbmUKICAqIEBtaW5ibG9ja3M6CQltaW5pbXVtIGV4dGVudCBibG9jayBjb3VudApAQCAtNDgyMywxMCArNDg2OCwxMiBAQAogCQkgICBleHQ0X2dycGJsa190IG1pbmJsb2NrcykKIHsKIAl2b2lkICpiaXRtYXA7Ci0JZXh0NF9ncnBibGtfdCBuZXh0LCBjb3VudCA9IDA7CisJZXh0NF9ncnBibGtfdCBuZXh0LCBjb3VudCA9IDAsIGZyZWVfY291bnQgPSAwOwogCXN0cnVjdCBleHQ0X2J1ZGR5IGU0YjsKIAlpbnQgcmV0OwogCisJdHJhY2VfZXh0NF90cmltX2FsbF9mcmVlKHNiLCBncm91cCwgc3RhcnQsIG1heCk7CisKIAlyZXQgPSBleHQ0X21iX2xvYWRfYnVkZHkoc2IsIGdyb3VwLCAmZTRiKTsKIAlpZiAocmV0KSB7CiAJCWV4dDRfZXJyb3Ioc2IsICJFcnJvciBpbiBsb2FkaW5nIGJ1ZGR5ICIKQEAgLTQ4MzYsNiArNDg4MywxMCBAQAogCWJpdG1hcCA9IGU0Yi5iZF9iaXRtYXA7CiAKIAlleHQ0X2xvY2tfZ3JvdXAoc2IsIGdyb3VwKTsKKwlpZiAoRVhUNF9NQl9HUlBfV0FTX1RSSU1NRUQoZTRiLmJkX2luZm8pICYmCisJICAgIG1pbmJsb2NrcyA+PSBhdG9taWNfcmVhZCgmRVhUNF9TQihzYiktPnNfbGFzdF90cmltX21pbmJsa3MpKQorCQlnb3RvIG91dDsKKwogCXN0YXJ0ID0gKGU0Yi5iZF9pbmZvLT5iYl9maXJzdF9mcmVlID4gc3RhcnQpID8KIAkJZTRiLmJkX2luZm8tPmJiX2ZpcnN0X2ZyZWUgOiBzdGFydDsKIApAQCAtNDg1MCw2ICs0OTAxLDcgQEAKIAkJCQkJIG5leHQgLSBzdGFydCwgZ3JvdXAsICZlNGIpOwogCQkJY291bnQgKz0gbmV4dCAtIHN0YXJ0OwogCQl9CisJCWZyZWVfY291bnQgKz0gbmV4dCAtIHN0YXJ0OwogCQlzdGFydCA9IG5leHQgKyAxOwogCiAJCWlmIChmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewpAQCAtNDg2Myw5ICs0OTE1LDEzIEBACiAJCQlleHQ0X2xvY2tfZ3JvdXAoc2IsIGdyb3VwKTsKIAkJfQogCi0JCWlmICgoZTRiLmJkX2luZm8tPmJiX2ZyZWUgLSBjb3VudCkgPCBtaW5ibG9ja3MpCisJCWlmICgoZTRiLmJkX2luZm8tPmJiX2ZyZWUgLSBmcmVlX2NvdW50KSA8IG1pbmJsb2NrcykKIAkJCWJyZWFrOwogCX0KKworCWlmICghcmV0KQorCQlFWFQ0X01CX0dSUF9TRVRfVFJJTU1FRChlNGIuYmRfaW5mbyk7CitvdXQ6CiAJZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGdyb3VwKTsKIAlleHQ0X21iX3VubG9hZF9idWRkeSgmZTRiKTsKIApAQCAtNDkwNCw2ICs0OTYwLDggQEAKIAogCWlmICh1bmxpa2VseShtaW5sZW4gPiBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHN0YXJ0ICsgbGVuIDw9IGZpcnN0X2RhdGFfYmxrKQorCQlnb3RvIG91dDsKIAlpZiAoc3RhcnQgPCBmaXJzdF9kYXRhX2JsaykgewogCQlsZW4gLT0gZmlyc3RfZGF0YV9ibGsgLSBzdGFydDsKIAkJc3RhcnQgPSBmaXJzdF9kYXRhX2JsazsKQEAgLTQ5NTIsNSArNTAxMCw5IEBACiAJfQogCXJhbmdlLT5sZW4gPSB0cmltbWVkICogc2ItPnNfYmxvY2tzaXplOwogCisJaWYgKCFyZXQpCisJCWF0b21pY19zZXQoJkVYVDRfU0Ioc2IpLT5zX2xhc3RfdHJpbV9taW5ibGtzLCBtaW5sZW4pOworCitvdXQ6CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWJhbGxvYy5oIGIvZnMvZXh0NC9tYmFsbG9jLmgKaW5kZXggMjBiNWU3Yi4uOWQ0YTYzNiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9tYmFsbG9jLmgKKysrIGIvZnMvZXh0NC9tYmFsbG9jLmgKQEAgLTE4Nyw3ICsxODcsNiBAQAogCV9fdTE2IGFjX2ZsYWdzOwkJLyogYWxsb2NhdGlvbiBoaW50cyAqLwogCV9fdTggYWNfc3RhdHVzOwogCV9fdTggYWNfY3JpdGVyaWE7Ci0JX191OCBhY19yZXBlYXRzOwogCV9fdTggYWNfMm9yZGVyOwkJLyogaWYgcmVxdWVzdCBpcyB0byBhbGxvY2F0ZSAyXk4gYmxvY2tzIGFuZAogCQkJCSAqIE4gPiAwLCB0aGUgZmllbGQgc3RvcmVzIE4sIG90aGVyd2lzZSAwICovCiAJX191OCBhY19vcDsJCS8qIG9wZXJhdGlvbiwgZm9yIGhpc3Rvcnkgb25seSAqLwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9uYW1laS5jIGIvZnMvZXh0NC9uYW1laS5jCmluZGV4IDhjOWJhYmEuLjU2NWExNTQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbmFtZWkuYworKysgYi9mcy9leHQ0L25hbWVpLmMKQEAgLTI4OSw3ICsyODksNyBAQAogCQkJCXdoaWxlIChsZW4tLSkgcHJpbnRrKCIlYyIsICpuYW1lKyspOwogCQkJCWV4dDRmc19kaXJoYXNoKGRlLT5uYW1lLCBkZS0+bmFtZV9sZW4sICZoKTsKIAkJCQlwcmludGsoIjoleC4ldSAiLCBoLmhhc2gsCi0JCQkJICAgICAgICgoY2hhciAqKSBkZSAtIGJhc2UpKTsKKwkJCQkgICAgICAgKHVuc2lnbmVkKSAoKGNoYXIgKikgZGUgLSBiYXNlKSk7CiAJCQl9CiAJCQlzcGFjZSArPSBFWFQ0X0RJUl9SRUNfTEVOKGRlLT5uYW1lX2xlbik7CiAJCQluYW1lcysrOwpAQCAtMTAxMyw3ICsxMDEzLDcgQEAKIAogCSplcnIgPSAtRU5PRU5UOwogZXJyb3V0OgotCWR4dHJhY2UocHJpbnRrKEtFUk5fREVCVUcgIiVzIG5vdCBmb3VuZFxuIiwgbmFtZSkpOworCWR4dHJhY2UocHJpbnRrKEtFUk5fREVCVUcgIiVzIG5vdCBmb3VuZFxuIiwgZF9uYW1lLT5uYW1lKSk7CiAJZHhfcmVsZWFzZSAoZnJhbWVzKTsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTE5ODUsMTggKzE5ODUsMTEgQEAKIAlpZiAoIWxpc3RfZW1wdHkoJkVYVDRfSShpbm9kZSktPmlfb3JwaGFuKSkKIAkJZ290byBvdXRfdW5sb2NrOwogCi0JLyogT3JwaGFuIGhhbmRsaW5nIGlzIG9ubHkgdmFsaWQgZm9yIGZpbGVzIHdpdGggZGF0YSBibG9ja3MKLQkgKiBiZWluZyB0cnVuY2F0ZWQsIG9yIGZpbGVzIGJlaW5nIHVubGlua2VkLiAqLwotCi0JLyogQEBAIEZJWE1FOiBPYnNlcnZhdGlvbiBmcm9tIGF2aXJvOgotCSAqIEkgdGhpbmsgSSBjYW4gdHJpZ2dlciBKX0FTU0VSVCBpbiBleHQ0X29ycGhhbl9hZGQoKS4gIFdlIGJsb2NrCi0JICogaGVyZSAob24gc19vcnBoYW5fbG9jayksIHNvIHJhY2Ugd2l0aCBleHQ0X2xpbmsoKSB3aGljaCBtaWdodCBidW1wCi0JICogLT5pX25saW5rLiBGb3IsIHNheSBpdCwgY2hhcmFjdGVyIGRldmljZS4gTm90IGEgcmVndWxhciBmaWxlLAotCSAqIG5vdCBhIGRpcmVjdG9yeSwgbm90IGEgc3ltbGluayBhbmQgLT5pX25saW5rID4gMC4KLQkgKgotCSAqIHR5dHNvLCA0LzI1LzIwMDk6IEknbSBub3Qgc3VyZSBob3cgdGhhdCBjb3VsZCBoYXBwZW47Ci0JICogc2hvdWxkbid0IHRoZSBmcyBjb3JlIHByb3RlY3QgdXMgZnJvbSB0aGVzZSBzb3J0IG9mCi0JICogdW5saW5rKCkvbGluaygpIHJhY2VzPworCS8qCisJICogT3JwaGFuIGhhbmRsaW5nIGlzIG9ubHkgdmFsaWQgZm9yIGZpbGVzIHdpdGggZGF0YSBibG9ja3MKKwkgKiBiZWluZyB0cnVuY2F0ZWQsIG9yIGZpbGVzIGJlaW5nIHVubGlua2VkLiBOb3RlIHRoYXQgd2UgZWl0aGVyCisJICogaG9sZCBpX211dGV4LCBvciB0aGUgaW5vZGUgY2FuIG5vdCBiZSByZWZlcmVuY2VkIGZyb20gb3V0c2lkZSwKKwkgKiBzbyBpX25saW5rIHNob3VsZCBub3QgYmUgYnVtcGVkIGR1ZSB0byByYWNlCiAJICovCiAJSl9BU1NFUlQoKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fAogCQkgIFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHx8IGlub2RlLT5pX25saW5rID09IDApOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9wYWdlLWlvLmMgYi9mcy9leHQ0L3BhZ2UtaW8uYwppbmRleCA3YmI4Zjc2Li40MzBjNDAxIDEwMDY0NAotLS0gYS9mcy9leHQ0L3BhZ2UtaW8uYworKysgYi9mcy9leHQ0L3BhZ2UtaW8uYwpAQCAtMjg1LDExICsyODUsNyBAQAogCWlvX2VuZCA9IGV4dDRfaW5pdF9pb19lbmQoaW5vZGUsIEdGUF9OT0ZTKTsKIAlpZiAoIWlvX2VuZCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JZG8gewotCQliaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIG52ZWNzKTsKLQkJbnZlY3MgPj49IDE7Ci0JfSB3aGlsZSAoYmlvID09IE5VTEwpOwotCisJYmlvID0gYmlvX2FsbG9jKEdGUF9OT0lPLCBtaW4obnZlY3MsIEJJT19NQVhfUEFHRVMpKTsKIAliaW8tPmJpX3NlY3RvciA9IGJoLT5iX2Jsb2NrbnIgKiAoYmgtPmJfc2l6ZSA+PiA5KTsKIAliaW8tPmJpX2JkZXYgPSBiaC0+Yl9iZGV2OwogCWJpby0+YmlfcHJpdmF0ZSA9IGlvLT5pb19lbmQgPSBpb19lbmQ7CmRpZmYgLS1naXQgYS9mcy9leHQ0L3Jlc2l6ZS5jIGIvZnMvZXh0NC9yZXNpemUuYwppbmRleCA4MGJiYzljLi43MDdkM2YxIDEwMDY0NAotLS0gYS9mcy9leHQ0L3Jlc2l6ZS5jCisrKyBiL2ZzL2V4dDQvcmVzaXplLmMKQEAgLTE2LDYgKzE2LDM1IEBACiAKICNpbmNsdWRlICJleHQ0X2piZDIuaCIKIAoraW50IGV4dDRfcmVzaXplX2JlZ2luKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpCisJCXJldHVybiAtRVBFUk07CisKKwkvKgorCSAqIFdlIGFyZSBub3QgYWxsb3dlZCB0byBkbyBvbmxpbmUtcmVzaXppbmcgb24gYSBmaWxlc3lzdGVtIG1vdW50ZWQKKwkgKiB3aXRoIGVycm9yLCBiZWNhdXNlIGl0IGNhbiBkZXN0cm95IHRoZSBmaWxlc3lzdGVtIGVhc2lseS4KKwkgKi8KKwlpZiAoRVhUNF9TQihzYiktPnNfbW91bnRfc3RhdGUgJiBFWFQ0X0VSUk9SX0ZTKSB7CisJCWV4dDRfd2FybmluZyhzYiwgIlRoZXJlIGFyZSBlcnJvcnMgaW4gdGhlIGZpbGVzeXN0ZW0sICIKKwkJCSAgICAgInNvIG9ubGluZSByZXNpemluZyBpcyBub3QgYWxsb3dlZFxuIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaWYgKHRlc3RfYW5kX3NldF9iaXRfbG9jayhFWFQ0X1JFU0laSU5HLCAmRVhUNF9TQihzYiktPnNfcmVzaXplX2ZsYWdzKSkKKwkJcmV0ID0gLUVCVVNZOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBleHQ0X3Jlc2l6ZV9lbmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwljbGVhcl9iaXRfdW5sb2NrKEVYVDRfUkVTSVpJTkcsICZFWFQ0X1NCKHNiKS0+c19yZXNpemVfZmxhZ3MpOworCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7Cit9CisKICNkZWZpbmUgb3V0c2lkZShiLCBmaXJzdCwgbGFzdCkJKChiKSA8IChmaXJzdCkgfHwgKGIpID49IChsYXN0KSkKICNkZWZpbmUgaW5zaWRlKGIsIGZpcnN0LCBsYXN0KQkoKGIpID49IChmaXJzdCkgJiYgKGIpIDwgKGxhc3QpKQogCkBAIC0xMTgsMTAgKzE0Nyw4IEBACiAJCWJyZWxzZShiaCk7CiAJCWJoID0gRVJSX1BUUihlcnIpOwogCX0gZWxzZSB7Ci0JCWxvY2tfYnVmZmVyKGJoKTsKIAkJbWVtc2V0KGJoLT5iX2RhdGEsIDAsIHNiLT5zX2Jsb2Nrc2l6ZSk7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwotCQl1bmxvY2tfYnVmZmVyKGJoKTsKIAl9CiAKIAlyZXR1cm4gYmg7CkBAIC0xMzIsOCArMTU5LDcgQEAKICAqIElmIHRoYXQgZmFpbHMsIHJlc3RhcnQgdGhlIHRyYW5zYWN0aW9uICYgcmVnYWluIHdyaXRlIGFjY2VzcyBmb3IgdGhlCiAgKiBidWZmZXIgaGVhZCB3aGljaCBpcyB1c2VkIGZvciBibG9ja19iaXRtYXAgbW9kaWZpY2F0aW9ucy4KICAqLwotc3RhdGljIGludCBleHRlbmRfb3JfcmVzdGFydF90cmFuc2FjdGlvbihoYW5kbGVfdCAqaGFuZGxlLCBpbnQgdGhyZXNoLAotCQkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3N0YXRpYyBpbnQgZXh0ZW5kX29yX3Jlc3RhcnRfdHJhbnNhY3Rpb24oaGFuZGxlX3QgKmhhbmRsZSwgaW50IHRocmVzaCkKIHsKIAlpbnQgZXJyOwogCkBAIC0xNDQsOSArMTcwLDggQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlpZiAoZXJyKSB7Ci0JCWlmICgoZXJyID0gZXh0NF9qb3VybmFsX3Jlc3RhcnQoaGFuZGxlLCBFWFQ0X01BWF9UUkFOU19EQVRBKSkpCi0JCQlyZXR1cm4gZXJyOwotCQlpZiAoKGVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpKSkKKwkJZXJyID0gZXh0NF9qb3VybmFsX3Jlc3RhcnQoaGFuZGxlLCBFWFQ0X01BWF9UUkFOU19EQVRBKTsKKwkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAJfQogCkBAIC0xODEsMjEgKzIwNiw3IEBACiAJaWYgKElTX0VSUihoYW5kbGUpKQogCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOwogCi0JbXV0ZXhfbG9jaygmc2JpLT5zX3Jlc2l6ZV9sb2NrKTsKLQlpZiAoaW5wdXQtPmdyb3VwICE9IHNiaS0+c19ncm91cHNfY291bnQpIHsKLQkJZXJyID0gLUVCVVNZOwotCQlnb3RvIGV4aXRfam91cm5hbDsKLQl9Ci0KLQlpZiAoSVNfRVJSKGJoID0gYmNsZWFuKGhhbmRsZSwgc2IsIGlucHV0LT5ibG9ja19iaXRtYXApKSkgewotCQllcnIgPSBQVFJfRVJSKGJoKTsKLQkJZ290byBleGl0X2pvdXJuYWw7Ci0JfQotCi0JaWYgKGV4dDRfYmdfaGFzX3N1cGVyKHNiLCBpbnB1dC0+Z3JvdXApKSB7Ci0JCWV4dDRfZGVidWcoIm1hcmsgYmFja3VwIHN1cGVyYmxvY2sgJSMwNGxseCAoKzApXG4iLCBzdGFydCk7Ci0JCWV4dDRfc2V0X2JpdCgwLCBiaC0+Yl9kYXRhKTsKLQl9CisJQlVHX09OKGlucHV0LT5ncm91cCAhPSBzYmktPnNfZ3JvdXBzX2NvdW50KTsKIAogCS8qIENvcHkgYWxsIG9mIHRoZSBHRFQgYmxvY2tzIGludG8gdGhlIGJhY2t1cCBpbiB0aGlzIGdyb3VwICovCiAJZm9yIChpID0gMCwgYml0ID0gMSwgYmxvY2sgPSBzdGFydCArIDE7CkBAIC0yMDMsMjkgKzIxNCwyNiBAQAogCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmdkYjsKIAogCQlleHQ0X2RlYnVnKCJ1cGRhdGUgYmFja3VwIGdyb3VwICUjMDRsbHggKCslZClcbiIsIGJsb2NrLCBiaXQpOwotCi0JCWlmICgoZXJyID0gZXh0ZW5kX29yX3Jlc3RhcnRfdHJhbnNhY3Rpb24oaGFuZGxlLCAxLCBiaCkpKQotCQkJZ290byBleGl0X2JoOworCQllcnIgPSBleHRlbmRfb3JfcmVzdGFydF90cmFuc2FjdGlvbihoYW5kbGUsIDEpOworCQlpZiAoZXJyKQorCQkJZ290byBleGl0X2pvdXJuYWw7CiAKIAkJZ2RiID0gc2JfZ2V0YmxrKHNiLCBibG9jayk7CiAJCWlmICghZ2RiKSB7CiAJCQllcnIgPSAtRUlPOwotCQkJZ290byBleGl0X2JoOworCQkJZ290byBleGl0X2pvdXJuYWw7CiAJCX0KIAkJaWYgKChlcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGdkYikpKSB7CiAJCQlicmVsc2UoZ2RiKTsKLQkJCWdvdG8gZXhpdF9iaDsKKwkJCWdvdG8gZXhpdF9qb3VybmFsOwogCQl9Ci0JCWxvY2tfYnVmZmVyKGdkYik7CiAJCW1lbWNweShnZGItPmJfZGF0YSwgc2JpLT5zX2dyb3VwX2Rlc2NbaV0tPmJfZGF0YSwgZ2RiLT5iX3NpemUpOwogCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGdkYik7Ci0JCXVubG9ja19idWZmZXIoZ2RiKTsKIAkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBnZGIpOwogCQlpZiAodW5saWtlbHkoZXJyKSkgewogCQkJYnJlbHNlKGdkYik7Ci0JCQlnb3RvIGV4aXRfYmg7CisJCQlnb3RvIGV4aXRfam91cm5hbDsKIAkJfQotCQlleHQ0X3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKIAkJYnJlbHNlKGdkYik7CiAJfQogCkBAIC0yMzUsOSArMjQzLDIyIEBACiAJZXJyID0gc2JfaXNzdWVfemVyb291dChzYiwgZ2RibG9ja3MgKyBzdGFydCArIDEsIHJlc2VydmVkX2dkYiwKIAkJCSAgICAgICBHRlBfTk9GUyk7CiAJaWYgKGVycikKLQkJZ290byBleGl0X2JoOwotCWZvciAoaSA9IDAsIGJpdCA9IGdkYmxvY2tzICsgMTsgaSA8IHJlc2VydmVkX2dkYjsgaSsrLCBiaXQrKykKLQkJZXh0NF9zZXRfYml0KGJpdCwgYmgtPmJfZGF0YSk7CisJCWdvdG8gZXhpdF9qb3VybmFsOworCisJZXJyID0gZXh0ZW5kX29yX3Jlc3RhcnRfdHJhbnNhY3Rpb24oaGFuZGxlLCAyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfam91cm5hbDsKKworCWJoID0gYmNsZWFuKGhhbmRsZSwgc2IsIGlucHV0LT5ibG9ja19iaXRtYXApOworCWlmIChJU19FUlIoYmgpKSB7CisJCWVyciA9IFBUUl9FUlIoYmgpOworCQlnb3RvIGV4aXRfam91cm5hbDsKKwl9CisKKwlpZiAoZXh0NF9iZ19oYXNfc3VwZXIoc2IsIGlucHV0LT5ncm91cCkpIHsKKwkJZXh0NF9kZWJ1ZygibWFyayBiYWNrdXAgZ3JvdXAgdGFibGVzICUjMDRsbHggKCswKVxuIiwgc3RhcnQpOworCQlleHQ0X3NldF9iaXRzKGJoLT5iX2RhdGEsIDAsIGdkYmxvY2tzICsgcmVzZXJ2ZWRfZ2RiICsgMSk7CisJfQogCiAJZXh0NF9kZWJ1ZygibWFyayBibG9jayBiaXRtYXAgJSMwNGxseCAoKyVsbHUpXG4iLCBpbnB1dC0+YmxvY2tfYml0bWFwLAogCQkgICBpbnB1dC0+YmxvY2tfYml0bWFwIC0gc3RhcnQpOwpAQCAtMjUzLDEyICsyNzQsOSBAQAogCWVyciA9IHNiX2lzc3VlX3plcm9vdXQoc2IsIGJsb2NrLCBzYmktPnNfaXRiX3Blcl9ncm91cCwgR0ZQX05PRlMpOwogCWlmIChlcnIpCiAJCWdvdG8gZXhpdF9iaDsKLQlmb3IgKGkgPSAwLCBiaXQgPSBpbnB1dC0+aW5vZGVfdGFibGUgLSBzdGFydDsKLQkgICAgIGkgPCBzYmktPnNfaXRiX3Blcl9ncm91cDsgaSsrLCBiaXQrKykKLQkJZXh0NF9zZXRfYml0KGJpdCwgYmgtPmJfZGF0YSk7CisJZXh0NF9zZXRfYml0cyhiaC0+Yl9kYXRhLCBpbnB1dC0+aW5vZGVfdGFibGUgLSBzdGFydCwKKwkJICAgICAgc2JpLT5zX2l0Yl9wZXJfZ3JvdXApOwogCi0JaWYgKChlcnIgPSBleHRlbmRfb3JfcmVzdGFydF90cmFuc2FjdGlvbihoYW5kbGUsIDIsIGJoKSkpCi0JCWdvdG8gZXhpdF9iaDsKIAogCWV4dDRfbWFya19iaXRtYXBfZW5kKGlucHV0LT5ibG9ja3NfY291bnQsIHNiLT5zX2Jsb2Nrc2l6ZSAqIDgsCiAJCQkgICAgIGJoLT5iX2RhdGEpOwpAQCAtMjg1LDcgKzMwMyw2IEBACiAJYnJlbHNlKGJoKTsKIAogZXhpdF9qb3VybmFsOgotCW11dGV4X3VubG9jaygmc2JpLT5zX3Jlc2l6ZV9sb2NrKTsKIAlpZiAoKGVycjIgPSBleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpKSAmJiAhZXJyKQogCQllcnIgPSBlcnIyOwogCkBAIC0zNzcsMTUgKzM5NCwxNSBAQAogICogZmFpbCBvbmNlIHdlIHN0YXJ0IG1vZGlmeWluZyB0aGUgZGF0YSBvbiBkaXNrLCBiZWNhdXNlIEpCRCBoYXMgbm8gcm9sbGJhY2suCiAgKi8KIHN0YXRpYyBpbnQgYWRkX25ld19nZGIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJICAgICAgIHN0cnVjdCBleHQ0X25ld19ncm91cF9kYXRhICppbnB1dCwKLQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKnByaW1hcnkpCisJCSAgICAgICBleHQ0X2dyb3VwX3QgZ3JvdXApCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplcyA9IEVYVDRfU0Ioc2IpLT5zX2VzOwotCXVuc2lnbmVkIGxvbmcgZ2RiX251bSA9IGlucHV0LT5ncm91cCAvIEVYVDRfREVTQ19QRVJfQkxPQ0soc2IpOworCXVuc2lnbmVkIGxvbmcgZ2RiX251bSA9IGdyb3VwIC8gRVhUNF9ERVNDX1BFUl9CTE9DSyhzYik7CiAJZXh0NF9mc2Jsa190IGdkYmxvY2sgPSBFWFQ0X1NCKHNiKS0+c19zYmgtPmJfYmxvY2tuciArIDEgKyBnZGJfbnVtOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqKm9fZ3JvdXBfZGVzYywgKipuX2dyb3VwX2Rlc2M7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaW5kOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZ2RiX2JoOwogCWludCBnZGJhY2t1cHM7CiAJc3RydWN0IGV4dDRfaWxvYyBpbG9jOwogCV9fbGUzMiAqZGF0YTsKQEAgLTQwOCwxMSArNDI1LDEyIEBACiAJCXJldHVybiAtRVBFUk07CiAJfQogCi0JKnByaW1hcnkgPSBzYl9icmVhZChzYiwgZ2RibG9jayk7Ci0JaWYgKCEqcHJpbWFyeSkKKwlnZGJfYmggPSBzYl9icmVhZChzYiwgZ2RibG9jayk7CisJaWYgKCFnZGJfYmgpCiAJCXJldHVybiAtRUlPOwogCi0JaWYgKChnZGJhY2t1cHMgPSB2ZXJpZnlfcmVzZXJ2ZWRfZ2RiKHNiLCAqcHJpbWFyeSkpIDwgMCkgeworCWdkYmFja3VwcyA9IHZlcmlmeV9yZXNlcnZlZF9nZGIoc2IsIGdkYl9iaCk7CisJaWYgKGdkYmFja3VwcyA8IDApIHsKIAkJZXJyID0gZ2RiYWNrdXBzOwogCQlnb3RvIGV4aXRfYmg7CiAJfQpAQCAtNDI3LDcgKzQ0NSw3IEBACiAJZGF0YSA9IChfX2xlMzIgKilkaW5kLT5iX2RhdGE7CiAJaWYgKGxlMzJfdG9fY3B1KGRhdGFbZ2RiX251bSAlIEVYVDRfQUREUl9QRVJfQkxPQ0soc2IpXSkgIT0gZ2RibG9jaykgewogCQlleHQ0X3dhcm5pbmcoc2IsICJuZXcgZ3JvdXAgJXUgR0RUIGJsb2NrICVsbHUgbm90IHJlc2VydmVkIiwKLQkJCSAgICAgaW5wdXQtPmdyb3VwLCBnZGJsb2NrKTsKKwkJCSAgICAgZ3JvdXAsIGdkYmxvY2spOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGV4aXRfZGluZDsKIAl9CkBAIC00MzYsNyArNDU0LDcgQEAKIAlpZiAodW5saWtlbHkoZXJyKSkKIAkJZ290byBleGl0X2RpbmQ7CiAKLQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsICpwcmltYXJ5KTsKKwllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGdkYl9iaCk7CiAJaWYgKHVubGlrZWx5KGVycikpCiAJCWdvdG8gZXhpdF9zYmg7CiAKQEAgLTQ0OSwxMiArNDY3LDEzIEBACiAJaWYgKHVubGlrZWx5KGVycikpCiAJCWdvdG8gZXhpdF9kaW5kajsKIAotCW5fZ3JvdXBfZGVzYyA9IGttYWxsb2MoKGdkYl9udW0gKyAxKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksCi0JCQlHRlBfTk9GUyk7CisJbl9ncm91cF9kZXNjID0gZXh0NF9rdm1hbGxvYygoZ2RiX251bSArIDEpICoKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksCisJCQkJICAgICBHRlBfTk9GUyk7CiAJaWYgKCFuX2dyb3VwX2Rlc2MpIHsKIAkJZXJyID0gLUVOT01FTTsKLQkJZXh0NF93YXJuaW5nKHNiLAotCQkJICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciAlbHUgZ3JvdXBzIiwgZ2RiX251bSArIDEpOworCQlleHQ0X3dhcm5pbmcoc2IsICJub3QgZW5vdWdoIG1lbW9yeSBmb3IgJWx1IGdyb3VwcyIsCisJCQkgICAgIGdkYl9udW0gKyAxKTsKIAkJZ290byBleGl0X2lub2RlOwogCX0KIApAQCAtNDc1LDggKzQ5NCw4IEBACiAJfQogCWlub2RlLT5pX2Jsb2NrcyAtPSAoZ2RiYWNrdXBzICsgMSkgKiBzYi0+c19ibG9ja3NpemUgPj4gOTsKIAlleHQ0X21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCAmaWxvYyk7Ci0JbWVtc2V0KCgqcHJpbWFyeSktPmJfZGF0YSwgMCwgc2ItPnNfYmxvY2tzaXplKTsKLQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsICpwcmltYXJ5KTsKKwltZW1zZXQoZ2RiX2JoLT5iX2RhdGEsIDAsIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBnZGJfYmgpOwogCWlmICh1bmxpa2VseShlcnIpKSB7CiAJCWV4dDRfc3RkX2Vycm9yKHNiLCBlcnIpOwogCQlnb3RvIGV4aXRfaW5vZGU7CkBAIC00ODYsMTAgKzUwNSwxMCBAQAogCW9fZ3JvdXBfZGVzYyA9IEVYVDRfU0Ioc2IpLT5zX2dyb3VwX2Rlc2M7CiAJbWVtY3B5KG5fZ3JvdXBfZGVzYywgb19ncm91cF9kZXNjLAogCSAgICAgICBFWFQ0X1NCKHNiKS0+c19nZGJfY291bnQgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopKTsKLQluX2dyb3VwX2Rlc2NbZ2RiX251bV0gPSAqcHJpbWFyeTsKKwluX2dyb3VwX2Rlc2NbZ2RiX251bV0gPSBnZGJfYmg7CiAJRVhUNF9TQihzYiktPnNfZ3JvdXBfZGVzYyA9IG5fZ3JvdXBfZGVzYzsKIAlFWFQ0X1NCKHNiKS0+c19nZGJfY291bnQrKzsKLQlrZnJlZShvX2dyb3VwX2Rlc2MpOworCWV4dDRfa3ZmcmVlKG9fZ3JvdXBfZGVzYyk7CiAKIAlsZTE2X2FkZF9jcHUoJmVzLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MsIC0xKTsKIAllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIEVYVDRfU0Ioc2IpLT5zX3NiaCk7CkBAIC00OTksNiArNTE4LDcgQEAKIAlyZXR1cm4gZXJyOwogCiBleGl0X2lub2RlOgorCWV4dDRfa3ZmcmVlKG5fZ3JvdXBfZGVzYyk7CiAJLyogZXh0NF9oYW5kbGVfcmVsZWFzZV9idWZmZXIoaGFuZGxlLCBpbG9jLmJoKTsgKi8KIAlicmVsc2UoaWxvYy5iaCk7CiBleGl0X2RpbmRqOgpAQCAtNTA4LDcgKzUyOCw3IEBACiBleGl0X2RpbmQ6CiAJYnJlbHNlKGRpbmQpOwogZXhpdF9iaDoKLQlicmVsc2UoKnByaW1hcnkpOworCWJyZWxzZShnZGJfYmgpOwogCiAJZXh0NF9kZWJ1ZygibGVhdmluZyB3aXRoIGVycm9yICVkXG4iLCBlcnIpOwogCXJldHVybiBlcnI7CkBAIC01MjgsNyArNTQ4LDcgQEAKICAqIGJhY2t1cCBHRFQgYmxvY2tzIGFyZSBzdG9yZWQgaW4gdGhlaXIgcmVzZXJ2ZWQgcHJpbWFyeSBHRFQgYmxvY2suCiAgKi8KIHN0YXRpYyBpbnQgcmVzZXJ2ZV9iYWNrdXBfZ2RiKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgICBzdHJ1Y3QgZXh0NF9uZXdfZ3JvdXBfZGF0YSAqaW5wdXQpCisJCQkgICAgICBleHQ0X2dyb3VwX3QgZ3JvdXApCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCWludCByZXNlcnZlZF9nZGIgPWxlMTZfdG9fY3B1KEVYVDRfU0Ioc2IpLT5zX2VzLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MpOwpAQCAtNTk5LDcgKzYxOSw3IEBACiAJICogRmluYWxseSB3ZSBjYW4gYWRkIGVhY2ggb2YgdGhlIHJlc2VydmVkIGJhY2t1cCBHRFQgYmxvY2tzIGZyb20KIAkgKiB0aGUgbmV3IGdyb3VwIHRvIGl0cyByZXNlcnZlZCBwcmltYXJ5IEdEVCBibG9jay4KIAkgKi8KLQlibGsgPSBpbnB1dC0+Z3JvdXAgKiBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpOworCWJsayA9IGdyb3VwICogRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKTsKIAlmb3IgKGkgPSAwOyBpIDwgcmVzZXJ2ZWRfZ2RiOyBpKyspIHsKIAkJaW50IGVycjI7CiAJCWRhdGEgPSAoX19sZTMyICopcHJpbWFyeVtpXS0+Yl9kYXRhOwpAQCAtNzk5LDEzICs4MTksNiBAQAogCQlnb3RvIGV4aXRfcHV0OwogCX0KIAotCW11dGV4X2xvY2soJnNiaS0+c19yZXNpemVfbG9jayk7Ci0JaWYgKGlucHV0LT5ncm91cCAhPSBzYmktPnNfZ3JvdXBzX2NvdW50KSB7Ci0JCWV4dDRfd2FybmluZyhzYiwgIm11bHRpcGxlIHJlc2l6ZXJzIHJ1biBvbiBmaWxlc3lzdGVtISIpOwotCQllcnIgPSAtRUJVU1k7Ci0JCWdvdG8gZXhpdF9qb3VybmFsOwotCX0KLQogCWlmICgoZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBzYmktPnNfc2JoKSkpCiAJCWdvdG8gZXhpdF9qb3VybmFsOwogCkBAIC04MjAsMTYgKzgzMywyNSBAQAogCQlpZiAoKGVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgcHJpbWFyeSkpKQogCQkJZ290byBleGl0X2pvdXJuYWw7CiAKLQkJaWYgKHJlc2VydmVkX2dkYiAmJiBleHQ0X2JnX251bV9nZGIoc2IsIGlucHV0LT5ncm91cCkgJiYKLQkJICAgIChlcnIgPSByZXNlcnZlX2JhY2t1cF9nZGIoaGFuZGxlLCBpbm9kZSwgaW5wdXQpKSkKKwkJaWYgKHJlc2VydmVkX2dkYiAmJiBleHQ0X2JnX251bV9nZGIoc2IsIGlucHV0LT5ncm91cCkpIHsKKwkJCWVyciA9IHJlc2VydmVfYmFja3VwX2dkYihoYW5kbGUsIGlub2RlLCBpbnB1dC0+Z3JvdXApOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGV4aXRfam91cm5hbDsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIE5vdGUgdGhhdCB3ZSBjYW4gYWNjZXNzIG5ldyBncm91cCBkZXNjcmlwdG9yIGJsb2NrIHNhZmVseQorCQkgKiBvbmx5IGlmIGFkZF9uZXdfZ2RiKCkgc3VjY2VlZHMuCisJCSAqLworCQllcnIgPSBhZGRfbmV3X2dkYihoYW5kbGUsIGlub2RlLCBpbnB1dC0+Z3JvdXApOworCQlpZiAoZXJyKQogCQkJZ290byBleGl0X2pvdXJuYWw7Ci0JfSBlbHNlIGlmICgoZXJyID0gYWRkX25ld19nZGIoaGFuZGxlLCBpbm9kZSwgaW5wdXQsICZwcmltYXJ5KSkpCi0JCWdvdG8gZXhpdF9qb3VybmFsOworCQlwcmltYXJ5ID0gc2JpLT5zX2dyb3VwX2Rlc2NbZ2RiX251bV07CisJfQogCiAgICAgICAgIC8qCiAgICAgICAgICAqIE9LLCBub3cgd2UndmUgc2V0IHVwIHRoZSBuZXcgZ3JvdXAuICBUaW1lIHRvIG1ha2UgaXQgYWN0aXZlLgogICAgICAgICAgKgotICAgICAgICAgKiBXZSBkbyBub3QgbG9jayBhbGwgYWxsb2NhdGlvbnMgdmlhIHNfcmVzaXplX2xvY2sKICAgICAgICAgICogc28gd2UgaGF2ZSB0byBiZSBzYWZlIHdydC4gY29uY3VycmVudCBhY2Nlc3NlcyB0aGUgZ3JvdXAKICAgICAgICAgICogZGF0YS4gIFNvIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCB0byBzZXQgYWxsIG9mIHRoZSByZWxldmFudAogICAgICAgICAgKiBncm91cCBkZXNjcmlwdG9yIGRhdGEgZXRjLiAqYmVmb3JlKiB3ZSBlbmFibGUgdGhlIGdyb3VwLgpAQCAtODg2LDEzICs5MDgsOSBAQAogCSAqCiAJICogVGhlIHByZWNpc2UgcnVsZXMgd2UgdXNlIGFyZToKIAkgKgotCSAqICogV3JpdGVycyBvZiBzX2dyb3Vwc19jb3VudCAqbXVzdCogaG9sZCBzX3Jlc2l6ZV9sb2NrCi0JICogQU5ECiAJICogKiBXcml0ZXJzIG11c3QgcGVyZm9ybSBhIHNtcF93bWIoKSBhZnRlciB1cGRhdGluZyBhbGwgZGVwZW5kZW50CiAJICogICBkYXRhIGFuZCBiZWZvcmUgbW9kaWZ5aW5nIHRoZSBncm91cHMgY291bnQKIAkgKgotCSAqICogUmVhZGVycyBtdXN0IGhvbGQgc19yZXNpemVfbG9jayBvdmVyIHRoZSBhY2Nlc3MKLQkgKiBPUgogCSAqICogUmVhZGVycyBtdXN0IHBlcmZvcm0gYW4gc21wX3JtYigpIGFmdGVyIHJlYWRpbmcgdGhlIGdyb3VwcyBjb3VudAogCSAqICAgYW5kIGJlZm9yZSByZWFkaW5nIGFueSBkZXBlbmRlbnQgZGF0YS4KIAkgKgpAQCAtOTM3LDEwICs5NTUsOSBAQAogCWV4dDRfaGFuZGxlX2RpcnR5X3N1cGVyKGhhbmRsZSwgc2IpOwogCiBleGl0X2pvdXJuYWw6Ci0JbXV0ZXhfdW5sb2NrKCZzYmktPnNfcmVzaXplX2xvY2spOwogCWlmICgoZXJyMiA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSkpICYmICFlcnIpCiAJCWVyciA9IGVycjI7Ci0JaWYgKCFlcnIpIHsKKwlpZiAoIWVyciAmJiBwcmltYXJ5KSB7CiAJCXVwZGF0ZV9iYWNrdXBzKHNiLCBzYmktPnNfc2JoLT5iX2Jsb2NrbnIsIChjaGFyICopZXMsCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrKSk7CiAJCXVwZGF0ZV9iYWNrdXBzKHNiLCBwcmltYXJ5LT5iX2Jsb2NrbnIsIHByaW1hcnktPmJfZGF0YSwKQEAgLTk2OSwxNiArOTg2LDEzIEBACiAJZXh0NF9ncnBibGtfdCBhZGQ7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAloYW5kbGVfdCAqaGFuZGxlOwotCWludCBlcnI7CisJaW50IGVyciwgZXJyMjsKIAlleHQ0X2dyb3VwX3QgZ3JvdXA7CiAKLQkvKiBXZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGxvY2tpbmcgd3J0IG90aGVyIHJlc2l6ZXJzIGp1c3QKLQkgKiB5ZXQ6IHdlJ3JlIGdvaW5nIHRvIHJldmFsaWRhdGUgZXMtPnNfYmxvY2tzX2NvdW50IGFmdGVyCi0JICogdGFraW5nIHRoZSBzX3Jlc2l6ZV9sb2NrIGJlbG93LiAqLwogCW9fYmxvY2tzX2NvdW50ID0gZXh0NF9ibG9ja3NfY291bnQoZXMpOwogCiAJaWYgKHRlc3Rfb3B0KHNiLCBERUJVRykpCi0JCXByaW50ayhLRVJOX0RFQlVHICJFWFQ0LWZzOiBleHRlbmRpbmcgbGFzdCBncm91cCBmcm9tICVsbHUgdXRvICVsbHUgYmxvY2tzXG4iLAorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhUNC1mczogZXh0ZW5kaW5nIGxhc3QgZ3JvdXAgZnJvbSAlbGx1IHRvICVsbHUgYmxvY2tzXG4iLAogCQkgICAgICAgb19ibG9ja3NfY291bnQsIG5fYmxvY2tzX2NvdW50KTsKIAogCWlmIChuX2Jsb2Nrc19jb3VudCA9PSAwIHx8IG5fYmxvY2tzX2NvdW50ID09IG9fYmxvY2tzX2NvdW50KQpAQCAtOTk1LDcgKzEwMDksNyBAQAogCiAJaWYgKG5fYmxvY2tzX2NvdW50IDwgb19ibG9ja3NfY291bnQpIHsKIAkJZXh0NF93YXJuaW5nKHNiLCAiY2FuJ3Qgc2hyaW5rIEZTIC0gcmVzaXplIGFib3J0ZWQiKTsKLQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogSGFuZGxlIHRoZSByZW1haW5pbmcgYmxvY2tzIGluIHRoZSBsYXN0IGdyb3VwIG9ubHkuICovCkBAIC0xMDM4LDMyICsxMDUyLDI1IEBACiAJCWdvdG8gZXhpdF9wdXQ7CiAJfQogCi0JbXV0ZXhfbG9jaygmRVhUNF9TQihzYiktPnNfcmVzaXplX2xvY2spOwotCWlmIChvX2Jsb2Nrc19jb3VudCAhPSBleHQ0X2Jsb2Nrc19jb3VudChlcykpIHsKLQkJZXh0NF93YXJuaW5nKHNiLCAibXVsdGlwbGUgcmVzaXplcnMgcnVuIG9uIGZpbGVzeXN0ZW0hIik7Ci0JCW11dGV4X3VubG9jaygmRVhUNF9TQihzYiktPnNfcmVzaXplX2xvY2spOwotCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwotCQllcnIgPSAtRUJVU1k7Ci0JCWdvdG8gZXhpdF9wdXQ7Ci0JfQotCiAJaWYgKChlcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsCiAJCQkJCQkgRVhUNF9TQihzYiktPnNfc2JoKSkpIHsKIAkJZXh0NF93YXJuaW5nKHNiLCAiZXJyb3IgJWQgb24gam91cm5hbCB3cml0ZSBhY2Nlc3MiLCBlcnIpOwotCQltdXRleF91bmxvY2soJkVYVDRfU0Ioc2IpLT5zX3Jlc2l6ZV9sb2NrKTsKIAkJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKIAkJZ290byBleGl0X3B1dDsKIAl9CiAJZXh0NF9ibG9ja3NfY291bnRfc2V0KGVzLCBvX2Jsb2Nrc19jb3VudCArIGFkZCk7Ci0JbXV0ZXhfdW5sb2NrKCZFWFQ0X1NCKHNiKS0+c19yZXNpemVfbG9jayk7CiAJZXh0NF9kZWJ1ZygiZnJlZWluZyBibG9ja3MgJWxsdSB0aHJvdWdoICVsbHVcbiIsIG9fYmxvY2tzX2NvdW50LAogCQkgICBvX2Jsb2Nrc19jb3VudCArIGFkZCk7CiAJLyogV2UgYWRkIHRoZSBibG9ja3MgdG8gdGhlIGJpdG1hcCBhbmQgc2V0IHRoZSBncm91cCBuZWVkIGluaXQgYml0ICovCi0JZXh0NF9hZGRfZ3JvdXBibG9ja3MoaGFuZGxlLCBzYiwgb19ibG9ja3NfY291bnQsIGFkZCk7CisJZXJyID0gZXh0NF9ncm91cF9hZGRfYmxvY2tzKGhhbmRsZSwgc2IsIG9fYmxvY2tzX2NvdW50LCBhZGQpOwogCWV4dDRfaGFuZGxlX2RpcnR5X3N1cGVyKGhhbmRsZSwgc2IpOwogCWV4dDRfZGVidWcoImZyZWVkIGJsb2NrcyAlbGx1IHRocm91Z2ggJWxsdVxuIiwgb19ibG9ja3NfY291bnQsCiAJCSAgIG9fYmxvY2tzX2NvdW50ICsgYWRkKTsKLQlpZiAoKGVyciA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSkpKQorCWVycjIgPSBleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmICghZXJyICYmIGVycjIpCisJCWVyciA9IGVycjI7CisKKwlpZiAoZXJyKQogCQlnb3RvIGV4aXRfcHV0OwogCiAJaWYgKHRlc3Rfb3B0KHNiLCBERUJVRykpCmRpZmYgLS1naXQgYS9mcy9leHQ0L3N1cGVyLmMgYi9mcy9leHQ0L3N1cGVyLmMKaW5kZXggOWVhNzFhYS4uNDY4N2ZlYSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9zdXBlci5jCisrKyBiL2ZzL2V4dDQvc3VwZXIuYwpAQCAtMTEwLDYgKzExMCwzNSBAQAogI2RlZmluZSBJU19FWFQzX1NCKHNiKSAoMCkKICNlbmRpZgogCit2b2lkICpleHQ0X2t2bWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKK3sKKwl2b2lkICpyZXQ7CisKKwlyZXQgPSBrbWFsbG9jKHNpemUsIGZsYWdzKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gX192bWFsbG9jKHNpemUsIGZsYWdzLCBQQUdFX0tFUk5FTCk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCAqZXh0NF9rdnphbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCit7CisJdm9pZCAqcmV0OworCisJcmV0ID0ga3phbGxvYyhzaXplLCBmbGFncyk7CisJaWYgKCFyZXQpCisJCXJldCA9IF9fdm1hbGxvYyhzaXplLCBmbGFncyB8IF9fR0ZQX1pFUk8sIFBBR0VfS0VSTkVMKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGV4dDRfa3ZmcmVlKHZvaWQgKnB0cikKK3sKKwlpZiAoaXNfdm1hbGxvY19hZGRyKHB0cikpCisJCXZmcmVlKHB0cik7CisJZWxzZQorCQlrZnJlZShwdHIpOworCit9CisKIGV4dDRfZnNibGtfdCBleHQ0X2Jsb2NrX2JpdG1hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJICAgICAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmJnKQogewpAQCAtMjY5LDYgKzI5OCw3IEBACiAJam91cm5hbF90ICpqb3VybmFsOwogCWhhbmRsZV90ICAqaGFuZGxlOwogCisJdHJhY2VfZXh0NF9qb3VybmFsX3N0YXJ0KHNiLCBuYmxvY2tzLCBfUkVUX0lQXyk7CiAJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQogCQlyZXR1cm4gRVJSX1BUUigtRVJPRlMpOwogCkBAIC03ODksMTEgKzgxOSw4IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgc2JpLT5zX2dkYl9jb3VudDsgaSsrKQogCQlicmVsc2Uoc2JpLT5zX2dyb3VwX2Rlc2NbaV0pOwotCWtmcmVlKHNiaS0+c19ncm91cF9kZXNjKTsKLQlpZiAoaXNfdm1hbGxvY19hZGRyKHNiaS0+c19mbGV4X2dyb3VwcykpCi0JCXZmcmVlKHNiaS0+c19mbGV4X2dyb3Vwcyk7Ci0JZWxzZQotCQlrZnJlZShzYmktPnNfZmxleF9ncm91cHMpOworCWV4dDRfa3ZmcmVlKHNiaS0+c19ncm91cF9kZXNjKTsKKwlleHQ0X2t2ZnJlZShzYmktPnNfZmxleF9ncm91cHMpOwogCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOwogCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+c19mcmVlaW5vZGVzX2NvdW50ZXIpOwogCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+c19kaXJzX2NvdW50ZXIpOwpAQCAtMTk3NiwxNSArMjAwMywxMSBAQAogCQkJKChsZTE2X3RvX2NwdShzYmktPnNfZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcykgKyAxKSA8PAogCQkJICAgICAgRVhUNF9ERVNDX1BFUl9CTE9DS19CSVRTKHNiKSkpIC8gZ3JvdXBzX3Blcl9mbGV4OwogCXNpemUgPSBmbGV4X2dyb3VwX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBmbGV4X2dyb3Vwcyk7Ci0Jc2JpLT5zX2ZsZXhfZ3JvdXBzID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlzYmktPnNfZmxleF9ncm91cHMgPSBleHQ0X2t2emFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCWlmIChzYmktPnNfZmxleF9ncm91cHMgPT0gTlVMTCkgewotCQlzYmktPnNfZmxleF9ncm91cHMgPSB2emFsbG9jKHNpemUpOwotCQlpZiAoc2JpLT5zX2ZsZXhfZ3JvdXBzID09IE5VTEwpIHsKLQkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKLQkJCQkgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciAldSBmbGV4IGdyb3VwcyIsCi0JCQkJIGZsZXhfZ3JvdXBfY291bnQpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KKwkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAibm90IGVub3VnaCBtZW1vcnkgZm9yICV1IGZsZXggZ3JvdXBzIiwKKwkJCSBmbGV4X2dyb3VwX2NvdW50KTsKKwkJZ290byBmYWlsZWQ7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IHNiaS0+c19ncm91cHNfY291bnQ7IGkrKykgewpAQCAtMjM4MywxNyArMjQwNiwyNSBAQAogCXVuc2lnbmVkIGxvbmcgc3RyaWRlID0gbGUxNl90b19jcHUoc2JpLT5zX2VzLT5zX3JhaWRfc3RyaWRlKTsKIAl1bnNpZ25lZCBsb25nIHN0cmlwZV93aWR0aCA9CiAJCQlsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfcmFpZF9zdHJpcGVfd2lkdGgpOworCWludCByZXQ7CiAKIAlpZiAoc2JpLT5zX3N0cmlwZSAmJiBzYmktPnNfc3RyaXBlIDw9IHNiaS0+c19ibG9ja3NfcGVyX2dyb3VwKQotCQlyZXR1cm4gc2JpLT5zX3N0cmlwZTsKKwkJcmV0ID0gc2JpLT5zX3N0cmlwZTsKKwllbHNlIGlmIChzdHJpcGVfd2lkdGggPD0gc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXApCisJCXJldCA9IHN0cmlwZV93aWR0aDsKKwllbHNlIGlmIChzdHJpZGUgPD0gc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXApCisJCXJldCA9IHN0cmlkZTsKKwllbHNlCisJCXJldCA9IDA7CiAKLQlpZiAoc3RyaXBlX3dpZHRoIDw9IHNiaS0+c19ibG9ja3NfcGVyX2dyb3VwKQotCQlyZXR1cm4gc3RyaXBlX3dpZHRoOworCS8qCisJICogSWYgdGhlIHN0cmlwZSB3aWR0aCBpcyAxLCB0aGlzIG1ha2VzIG5vIHNlbnNlIGFuZAorCSAqIHdlIHNldCBpdCB0byAwIHRvIHR1cm4gb2ZmIHN0cmlwZSBoYW5kbGluZyBjb2RlLgorCSAqLworCWlmIChyZXQgPD0gMSkKKwkJcmV0ID0gMDsKIAotCWlmIChzdHJpZGUgPD0gc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXApCi0JCXJldHVybiBzdHJpZGU7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiAvKiBzeXNmcyBzdXBwcnQgKi8KQEAgLTM0MDgsOCArMzQzOSw5IEBACiAJCQkoRVhUNF9NQVhfQkxPQ0tfRklMRV9QSFlTIC8gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSkpOwogCWRiX2NvdW50ID0gKHNiaS0+c19ncm91cHNfY291bnQgKyBFWFQ0X0RFU0NfUEVSX0JMT0NLKHNiKSAtIDEpIC8KIAkJICAgRVhUNF9ERVNDX1BFUl9CTE9DSyhzYik7Ci0Jc2JpLT5zX2dyb3VwX2Rlc2MgPSBrbWFsbG9jKGRiX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwKLQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJc2JpLT5zX2dyb3VwX2Rlc2MgPSBleHQ0X2t2bWFsbG9jKGRiX2NvdW50ICoKKwkJCQkJICBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLAorCQkJCQkgIEdGUF9LRVJORUwpOwogCWlmIChzYmktPnNfZ3JvdXBfZGVzYyA9PSBOVUxMKSB7CiAJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgIm5vdCBlbm91Z2ggbWVtb3J5Iik7CiAJCWdvdG8gZmFpbGVkX21vdW50OwpAQCAtMzQ5MSw3ICszNTIzLDcgQEAKIAogCUlOSVRfTElTVF9IRUFEKCZzYmktPnNfb3JwaGFuKTsgLyogdW5saW5rZWQgYnV0IG9wZW4gZmlsZXMgKi8KIAltdXRleF9pbml0KCZzYmktPnNfb3JwaGFuX2xvY2spOwotCW11dGV4X2luaXQoJnNiaS0+c19yZXNpemVfbG9jayk7CisJc2JpLT5zX3Jlc2l6ZV9mbGFncyA9IDA7CiAKIAlzYi0+c19yb290ID0gTlVMTDsKIApAQCAtMzc0MSwxMiArMzc3Myw4IEBACiAJfQogZmFpbGVkX21vdW50MzoKIAlkZWxfdGltZXIoJnNiaS0+c19lcnJfcmVwb3J0KTsKLQlpZiAoc2JpLT5zX2ZsZXhfZ3JvdXBzKSB7Ci0JCWlmIChpc192bWFsbG9jX2FkZHIoc2JpLT5zX2ZsZXhfZ3JvdXBzKSkKLQkJCXZmcmVlKHNiaS0+c19mbGV4X2dyb3Vwcyk7Ci0JCWVsc2UKLQkJCWtmcmVlKHNiaS0+c19mbGV4X2dyb3Vwcyk7Ci0JfQorCWlmIChzYmktPnNfZmxleF9ncm91cHMpCisJCWV4dDRfa3ZmcmVlKHNiaS0+c19mbGV4X2dyb3Vwcyk7CiAJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcik7CiAJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7CiAJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2RpcnNfY291bnRlcik7CkBAIC0zNzU2LDcgKzM3ODQsNyBAQAogZmFpbGVkX21vdW50MjoKIAlmb3IgKGkgPSAwOyBpIDwgZGJfY291bnQ7IGkrKykKIAkJYnJlbHNlKHNiaS0+c19ncm91cF9kZXNjW2ldKTsKLQlrZnJlZShzYmktPnNfZ3JvdXBfZGVzYyk7CisJZXh0NF9rdmZyZWUoc2JpLT5zX2dyb3VwX2Rlc2MpOwogZmFpbGVkX21vdW50OgogCWlmIChzYmktPnNfcHJvYykgewogCQlyZW1vdmVfcHJvY19lbnRyeShzYi0+c19pZCwgZXh0NF9wcm9jX3Jvb3QpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC90cnVuY2F0ZS5oIGIvZnMvZXh0NC90cnVuY2F0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMWJhNjYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQ0L3RydW5jYXRlLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIGxpbnV4L2ZzL2V4dDQvdHJ1bmNhdGUuaAorICoKKyAqIENvbW1vbiBpbmxpbmUgZnVuY3Rpb25zIG5lZWRlZCBmb3IgdHJ1bmNhdGUgc3VwcG9ydAorICovCisKKy8qCisgKiBUcnVuY2F0ZSBibG9ja3MgdGhhdCB3ZXJlIG5vdCB1c2VkIGJ5IHdyaXRlLiBXZSBoYXZlIHRvIHRydW5jYXRlIHRoZQorICogcGFnZWNhY2hlIGFzIHdlbGwgc28gdGhhdCBjb3JyZXNwb25kaW5nIGJ1ZmZlcnMgZ2V0IHByb3Blcmx5IHVubWFwcGVkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF90cnVuY2F0ZV9mYWlsZWRfd3JpdGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhpbm9kZS0+aV9tYXBwaW5nLCBpbm9kZS0+aV9zaXplKTsKKwlleHQ0X3RydW5jYXRlKGlub2RlKTsKK30KKworLyoKKyAqIFdvcmsgb3V0IGhvdyBtYW55IGJsb2NrcyB3ZSBuZWVkIHRvIHByb2NlZWQgd2l0aCB0aGUgbmV4dCBjaHVuayBvZiBhCisgKiB0cnVuY2F0ZSB0cmFuc2FjdGlvbi4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGV4dDRfYmxvY2tzX2Zvcl90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWV4dDRfbGJsa190IG5lZWRlZDsKKworCW5lZWRlZCA9IGlub2RlLT5pX2Jsb2NrcyA+PiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KTsKKworCS8qIEdpdmUgb3Vyc2VsdmVzIGp1c3QgZW5vdWdoIHJvb20gdG8gY29wZSB3aXRoIGlub2RlcyBpbiB3aGljaAorCSAqIGlfYmxvY2tzIGlzIGNvcnJ1cHQ6IHdlJ3ZlIHNlZW4gZGlzayBjb3JydXB0aW9ucyBpbiB0aGUgcGFzdAorCSAqIHdoaWNoIHJlc3VsdGVkIGluIHJhbmRvbSBkYXRhIGluIGFuIGlub2RlIHdoaWNoIGxvb2tlZCBlbm91Z2gKKwkgKiBsaWtlIGEgcmVndWxhciBmaWxlIGZvciBleHQ0IHRvIHRyeSB0byBkZWxldGUgaXQuICBUaGluZ3MKKwkgKiB3aWxsIGdvIGEgYml0IGNyYXp5IGlmIHRoYXQgaGFwcGVucywgYnV0IGF0IGxlYXN0IHdlIHNob3VsZAorCSAqIHRyeSBub3QgdG8gcGFuaWMgdGhlIHdob2xlIGtlcm5lbC4gKi8KKwlpZiAobmVlZGVkIDwgMikKKwkJbmVlZGVkID0gMjsKKworCS8qIEJ1dCB3ZSBuZWVkIHRvIGJvdW5kIHRoZSB0cmFuc2FjdGlvbiBzbyB3ZSBkb24ndCBvdmVyZmxvdyB0aGUKKwkgKiBqb3VybmFsLiAqLworCWlmIChuZWVkZWQgPiBFWFQ0X01BWF9UUkFOU19EQVRBKQorCQluZWVkZWQgPSBFWFQ0X01BWF9UUkFOU19EQVRBOworCisJcmV0dXJuIEVYVDRfREFUQV9UUkFOU19CTE9DS1MoaW5vZGUtPmlfc2IpICsgbmVlZGVkOworfQorCmRpZmYgLS1naXQgYS9mcy9mcy13cml0ZWJhY2suYyBiL2ZzL2ZzLXdyaXRlYmFjay5jCmluZGV4IDE1OTlhYTkuLjA0Y2YzYjkgMTAwNjQ0Ci0tLSBhL2ZzL2ZzLXdyaXRlYmFjay5jCisrKyBiL2ZzL2ZzLXdyaXRlYmFjay5jCkBAIC02MTgsNyArNjE4LDEyIEBACiAJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKIAogCQlpZiAoIWdyYWJfc3VwZXJfcGFzc2l2ZShzYikpIHsKLQkJCXJlcXVldWVfaW8oaW5vZGUsIHdiKTsKKwkJCS8qCisJCQkgKiBncmFiX3N1cGVyX3Bhc3NpdmUoKSBtYXkgZmFpbCBjb25zaXN0ZW50bHkgZHVlIHRvCisJCQkgKiBzX3Vtb3VudCBiZWluZyBncmFiYmVkIGJ5IHNvbWVvbmUgZWxzZS4gRG9uJ3QgdXNlCisJCQkgKiByZXF1ZXVlX2lvKCkgdG8gYXZvaWQgYnVzeSByZXRyeWluZyB0aGUgaW5vZGUvc2IuCisJCQkgKi8KKwkJCXJlZGlydHlfdGFpbChpbm9kZSwgd2IpOwogCQkJY29udGludWU7CiAJCX0KIAkJd3JvdGUgKz0gd3JpdGViYWNrX3NiX2lub2RlcyhzYiwgd2IsIHdvcmspOwpkaWZmIC0tZ2l0IGEvZnMvZ2VuZXJpY19hY2wuYyBiL2ZzL2dlbmVyaWNfYWNsLmMKaW5kZXggZDVlMzNhMC4uZDBkZGRhYyAxMDA2NDQKLS0tIGEvZnMvZ2VuZXJpY19hY2wuYworKysgYi9mcy9nZW5lcmljX2FjbC5jCkBAIC04MiwxOCArODIsMTQgQEAKIAkJCXJldHVybiBQVFJfRVJSKGFjbCk7CiAJfQogCWlmIChhY2wpIHsKLQkJbW9kZV90IG1vZGU7Ci0KIAkJZXJyb3IgPSBwb3NpeF9hY2xfdmFsaWQoYWNsKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBmYWlsZWQ7CiAJCXN3aXRjaCAodHlwZSkgewogCQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKLQkJCW1vZGUgPSBpbm9kZS0+aV9tb2RlOwotCQkJZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZtb2RlKTsKKwkJCWVycm9yID0gcG9zaXhfYWNsX2VxdWl2X21vZGUoYWNsLCAmaW5vZGUtPmlfbW9kZSk7CiAJCQlpZiAoZXJyb3IgPCAwKQogCQkJCWdvdG8gZmFpbGVkOwotCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAkJCWlmIChlcnJvciA9PSAwKSB7CiAJCQkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKQEAgLTEyNSwyMSArMTIxLDIwIEBACiBnZW5lcmljX2FjbF9pbml0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyKQogewogCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCA9IE5VTEw7Ci0JbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwogCWludCBlcnJvcjsKIAotCWlub2RlLT5pX21vZGUgPSBtb2RlICYgfmN1cnJlbnRfdW1hc2soKTsKIAlpZiAoIVNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCiAJCWFjbCA9IGdldF9jYWNoZWRfYWNsKGRpciwgQUNMX1RZUEVfREVGQVVMVCk7CiAJaWYgKGFjbCkgewogCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKIAkJCXNldF9jYWNoZWRfYWNsKGlub2RlLCBBQ0xfVFlQRV9ERUZBVUxULCBhY2wpOwotCQllcnJvciA9IHBvc2l4X2FjbF9jcmVhdGUoJmFjbCwgR0ZQX0tFUk5FTCwgJm1vZGUpOworCQllcnJvciA9IHBvc2l4X2FjbF9jcmVhdGUoJmFjbCwgR0ZQX0tFUk5FTCwgJmlub2RlLT5pX21vZGUpOwogCQlpZiAoZXJyb3IgPCAwKQogCQkJcmV0dXJuIGVycm9yOwotCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJaWYgKGVycm9yID4gMCkKIAkJCXNldF9jYWNoZWRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGFjbCk7CisJfSBlbHNlIHsKKwkJaW5vZGUtPmlfbW9kZSAmPSB+Y3VycmVudF91bWFzaygpOwogCX0KIAllcnJvciA9IDA7CiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvYWNsLmMgYi9mcy9nZnMyL2FjbC5jCmluZGV4IDg4NGM5YWYuLjM0NTAxYjYgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvYWNsLmMKKysrIGIvZnMvZ2ZzMi9hY2wuYwpAQCAtNzIsNyArNzIsNyBAQAogCXJldHVybiBnZnMyX2FjbF9nZXQoR0ZTMl9JKGlub2RlKSwgdHlwZSk7CiB9CiAKLXN0YXRpYyBpbnQgZ2ZzMl9zZXRfbW9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBtb2RlX3QgbW9kZSkKK3N0YXRpYyBpbnQgZ2ZzMl9zZXRfbW9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bW9kZV90IG1vZGUpCiB7CiAJaW50IGVycm9yID0gMDsKIApAQCAtMTE3LDcgKzExNyw3IEBACiB7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKCZkaXAtPmlfaW5vZGUpOwogCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKLQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CisJdW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKIAlpbnQgZXJyb3IgPSAwOwogCiAJaWYgKCFzZHAtPnNkX2FyZ3MuYXJfcG9zaXhfYWNsKQpAQCAtMjc2LDcgKzI3Niw3IEBACiAJCWdvdG8gb3V0X3JlbGVhc2U7CiAKIAlpZiAodHlwZSA9PSBBQ0xfVFlQRV9BQ0NFU1MpIHsKLQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOworCQl1bW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwogCQllcnJvciA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJm1vZGUpOwogCiAJCWlmIChlcnJvciA8PSAwKSB7CmRpZmYgLS1naXQgYS9mcy9ocHBmcy9ocHBmcy5jIGIvZnMvaHBwZnMvaHBwZnMuYwppbmRleCA4NjM1YmU1Li45NzBlYTk4IDEwMDY0NAotLS0gYS9mcy9ocHBmcy9ocHBmcy5jCisrKyBiL2ZzL2hwcGZzL2hwcGZzLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGF0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BpZF9uYW1lc3BhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSAib3MuaCIKIApkaWZmIC0tZ2l0IGEvZnMvaW5vZGUuYyBiL2ZzL2lub2RlLmMKaW5kZXggZDBjNzJmZi4uNWFhYjgwZCAxMDA2NDQKLS0tIGEvZnMvaW5vZGUuYworKysgYi9mcy9pbm9kZS5jCkBAIC0zOTksMTIgKzM5OSwxMiBAQAogRVhQT1JUX1NZTUJPTChfX2luc2VydF9pbm9kZV9oYXNoKTsKIAogLyoqCi0gKglyZW1vdmVfaW5vZGVfaGFzaCAtIHJlbW92ZSBhbiBpbm9kZSBmcm9tIHRoZSBoYXNoCisgKglfX3JlbW92ZV9pbm9kZV9oYXNoIC0gcmVtb3ZlIGFuIGlub2RlIGZyb20gdGhlIGhhc2gKICAqCUBpbm9kZTogaW5vZGUgdG8gdW5oYXNoCiAgKgogICoJUmVtb3ZlIGFuIGlub2RlIGZyb20gdGhlIHN1cGVyYmxvY2suCiAgKi8KLXZvaWQgcmVtb3ZlX2lub2RlX2hhc2goc3RydWN0IGlub2RlICppbm9kZSkKK3ZvaWQgX19yZW1vdmVfaW5vZGVfaGFzaChzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXNwaW5fbG9jaygmaW5vZGVfaGFzaF9sb2NrKTsKIAlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwpAQCAtNDEyLDcgKzQxMiw3IEBACiAJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwogCXNwaW5fdW5sb2NrKCZpbm9kZV9oYXNoX2xvY2spOwogfQotRVhQT1JUX1NZTUJPTChyZW1vdmVfaW5vZGVfaGFzaCk7CitFWFBPUlRfU1lNQk9MKF9fcmVtb3ZlX2lub2RlX2hhc2gpOwogCiB2b2lkIGVuZF93cml0ZWJhY2soc3RydWN0IGlub2RlICppbm9kZSkKIHsKQEAgLTQ1NCw3ICs0NTQsOSBAQAogCUJVR19PTighKGlub2RlLT5pX3N0YXRlICYgSV9GUkVFSU5HKSk7CiAJQlVHX09OKCFsaXN0X2VtcHR5KCZpbm9kZS0+aV9scnUpKTsKIAotCWlub2RlX3diX2xpc3RfZGVsKGlub2RlKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmlub2RlLT5pX3diX2xpc3QpKQorCQlpbm9kZV93Yl9saXN0X2RlbChpbm9kZSk7CisKIAlpbm9kZV9zYl9saXN0X2RlbChpbm9kZSk7CiAKIAlpZiAob3AtPmV2aWN0X2lub2RlKSB7CkBAIC0xMzI4LDcgKzEzMzAsOCBAQAogCX0KIAogCWlub2RlLT5pX3N0YXRlIHw9IElfRlJFRUlORzsKLQlpbm9kZV9scnVfbGlzdF9kZWwoaW5vZGUpOworCWlmICghbGlzdF9lbXB0eSgmaW5vZGUtPmlfbHJ1KSkKKwkJaW5vZGVfbHJ1X2xpc3RfZGVsKGlub2RlKTsKIAlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAKIAlldmljdChpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9qYmQyL2NoZWNrcG9pbnQuYyBiL2ZzL2piZDIvY2hlY2twb2ludC5jCmluZGV4IDJjNjJjNWEuLjE2YTY5OGIgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvY2hlY2twb2ludC5jCisrKyBiL2ZzL2piZDIvY2hlY2twb2ludC5jCkBAIC0yNTcsOSArMjU3LDEyIEBACiBfX2ZsdXNoX2JhdGNoKGpvdXJuYWxfdCAqam91cm5hbCwgaW50ICpiYXRjaF9jb3VudCkKIHsKIAlpbnQgaTsKKwlzdHJ1Y3QgYmxrX3BsdWcgcGx1ZzsKIAorCWJsa19zdGFydF9wbHVnKCZwbHVnKTsKIAlmb3IgKGkgPSAwOyBpIDwgKmJhdGNoX2NvdW50OyBpKyspCi0JCXdyaXRlX2RpcnR5X2J1ZmZlcihqb3VybmFsLT5qX2Noa3B0X2Joc1tpXSwgV1JJVEUpOworCQl3cml0ZV9kaXJ0eV9idWZmZXIoam91cm5hbC0+al9jaGtwdF9iaHNbaV0sIFdSSVRFX1NZTkMpOworCWJsa19maW5pc2hfcGx1ZygmcGx1Zyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgKmJhdGNoX2NvdW50OyBpKyspIHsKIAkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpvdXJuYWwtPmpfY2hrcHRfYmhzW2ldOwpkaWZmIC0tZ2l0IGEvZnMvamJkMi9qb3VybmFsLmMgYi9mcy9qYmQyL2pvdXJuYWwuYwppbmRleCAwZGZhNWI1Li5mMjRkZjEzIDEwMDY0NAotLS0gYS9mcy9qYmQyL2pvdXJuYWwuYworKysgYi9mcy9qYmQyL2pvdXJuYWwuYwpAQCAtMjM5MCw3MyArMjM5MCw2IEBACiAJamJkMl9qb3VybmFsX2Rlc3Ryb3lfY2FjaGVzKCk7CiB9CiAKLS8qIAotICogamJkMl9kZXZfdG9fbmFtZSBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSB0aGUgamJkMiBhbmQgZXh0NCAKLSAqIHRyYWNpbmcgaW5mcmFzdHJ1Y3R1cmUgdG8gbWFwIGEgZGV2X3QgdG8gYSBkZXZpY2UgbmFtZS4KLSAqCi0gKiBUaGUgY2FsbGVyIHNob3VsZCB1c2UgcmN1X3JlYWRfbG9jaygpIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGUKLSAqIGRldmljZSBuYW1lIHN0YXlzIHZhbGlkIHVudGlsIGl0cyBkb25lIHdpdGggaXQuICBXZSB1c2UKLSAqIHJjdV9yZWFkX2xvY2soKSBhcyB3ZWxsIHRvIG1ha2Ugc3VyZSB3ZSdyZSBzYWZlIGluIGNhc2UgdGhlIGNhbGxlcgotICogZ2V0cyBzbG9wcHksIGFuZCBiZWNhdXNlIHJjdV9yZWFkX2xvY2soKSBpcyBjaGVhcCBhbmQgY2FuIGJlIHNhZmVseQotICogbmVzdGVkLgotICovCi1zdHJ1Y3QgZGV2bmFtZV9jYWNoZSB7Ci0Jc3RydWN0IHJjdV9oZWFkCXJjdTsKLQlkZXZfdAkJZGV2aWNlOwotCWNoYXIJCWRldm5hbWVbQkRFVk5BTUVfU0laRV07Ci19OwotI2RlZmluZSBDQUNIRV9TSVpFX0JJVFMgNgotc3RhdGljIHN0cnVjdCBkZXZuYW1lX2NhY2hlICpkZXZjYWNoZVsxIDw8IENBQ0hFX1NJWkVfQklUU107Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRldm5hbWVfY2FjaGVfbG9jayk7Ci0KLXN0YXRpYyB2b2lkIGZyZWVfZGV2Y2FjaGUoc3RydWN0IHJjdV9oZWFkICpyY3UpCi17Ci0Ja2ZyZWUocmN1KTsKLX0KLQotY29uc3QgY2hhciAqamJkMl9kZXZfdG9fbmFtZShkZXZfdCBkZXZpY2UpCi17Ci0JaW50CWkgPSBoYXNoXzMyKGRldmljZSwgQ0FDSEVfU0laRV9CSVRTKTsKLQljaGFyCSpyZXQ7Ci0Jc3RydWN0IGJsb2NrX2RldmljZSAqYmQ7Ci0Jc3RhdGljIHN0cnVjdCBkZXZuYW1lX2NhY2hlICpuZXdfZGV2OwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWlmIChkZXZjYWNoZVtpXSAmJiBkZXZjYWNoZVtpXS0+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+IDApCiAJCQllcnIgPSByZWlzZXJmc19zZXRfYWNsKHRoLCBpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBhY2wpOwpkaWZmIC0tZ2l0IGEvZnMvc3RhY2suYyBiL2ZzL3N0YWNrLmMKaW5kZXggNGE2ZjdmNC4uYjRmMmFiNCAxMDA2NDQKLS0tIGEvZnMvc3RhY2suYworKysgYi9mcy9zdGFjay5jCkBAIC0yOSwxMCArMjksNyBAQAogCSAqCiAJICogV2UgZG9uJ3QgYWN0dWFsbHkga25vdyB3aGF0IGxvY2tpbmcgaXMgdXNlZCBhdCB0aGUgbG93ZXIgbGV2ZWw7CiAJICogYnV0IGlmIGl0J3MgYSBmaWxlc3lzdGVtIHRoYXQgc3VwcG9ydHMgcXVvdGFzLCBpdCB3aWxsIGJlIHVzaW5nCi0JICogaV9sb2NrIGFzIGluIGlub2RlX2FkZF9ieXRlcygpLiAgdG1wZnMgdXNlcyBvdGhlciBsb2NraW5nLCBhbmQKLQkgKiBpdHMgMzItYml0IGlzIChqdXN0KSBhYmxlIHRvIGV4Y2VlZCAyVEIgaV9zaXplIHdpdGggdGhlIGFpZCBvZgotCSAqIGhvbGVzOyBidXQgaXRzIGlfYmxvY2tzIGNhbm5vdCBjYXJyeSBpbnRvIHRoZSB1cHBlciBsb25nIHdpdGhvdXQKLQkgKiBhbG1vc3QgMlRCIHN3YXAgLSBsZXQncyBpZ25vcmUgdGhhdCBjYXNlLgorCSAqIGlfbG9jayBhcyBpbiBpbm9kZV9hZGRfYnl0ZXMoKS4KIAkgKi8KIAlpZiAoc2l6ZW9mKGlfYmxvY2tzKSA+IHNpemVvZihsb25nKSkKIAkJc3Bpbl9sb2NrKCZzcmMtPmlfbG9jayk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19hY2wuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FjbC5jCmluZGV4IDQ0Y2U1MTYuLmI2YzRiMzcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2FjbC5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FjbC5jCkBAIC0yMjEsNyArMjIxLDcgQEAKIH0KIAogc3RhdGljIGludAoteGZzX3NldF9tb2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIG1vZGVfdCBtb2RlKQoreGZzX3NldF9tb2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVtb2RlX3QgbW9kZSkKIHsKIAlpbnQgZXJyb3IgPSAwOwogCkBAIC0yNjcsNyArMjY3LDcgQEAKIGludAogeGZzX2luaGVyaXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCkKIHsKLQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CisJdW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKIAlpbnQgZXJyb3IgPSAwLCBpbmhlcml0ID0gMDsKIAogCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CkBAIC0zODEsNyArMzgxLDcgQEAKIAkJZ290byBvdXRfcmVsZWFzZTsKIAogCWlmICh0eXBlID09IEFDTF9UWVBFX0FDQ0VTUykgewotCQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CisJCXVtb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CiAJCWVycm9yID0gcG9zaXhfYWNsX2VxdWl2X21vZGUoYWNsLCAmbW9kZSk7CiAKIAkJaWYgKGVycm9yIDw9IDApIHsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYWNsLmggYi9mcy94ZnMveGZzX2FjbC5oCmluZGV4IDJjNjU2ZWYuLjM5NjMyZDkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYWNsLmgKKysrIGIvZnMveGZzL3hmc19hY2wuaApAQCAtNTEsNyArNTEsMTAgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciB4ZnNfeGF0dHJfYWNsX2FjY2Vzc19oYW5kbGVyOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIHhmc194YXR0cl9hY2xfZGVmYXVsdF9oYW5kbGVyOwogI2Vsc2UKLSMgZGVmaW5lIHhmc19nZXRfYWNsKGlub2RlLCB0eXBlKQkJCU5VTEwKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBvc2l4X2FjbCAqeGZzX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCit7CisJcmV0dXJuIE5VTEw7Cit9CiAjIGRlZmluZSB4ZnNfaW5oZXJpdF9hY2woaW5vZGUsIGRlZmF1bHRfYWNsKQkJMAogIyBkZWZpbmUgeGZzX2FjbF9jaG1vZChpbm9kZSkJCQkJMAogIyBkZWZpbmUgcG9zaXhfYWNsX2FjY2Vzc19leGlzdHMoaW5vZGUpCQkJMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oIGIvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oCmluZGV4IDMwOTA0NzEuLmU0OWMzNmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BpX2RyaXZlcnMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmgKQEAgLTEyOCw3ICsxMjgsNyBAQAogZXh0ZXJuIGludCByZWdpc3Rlcl9kb2NrX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwogZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl9kb2NrX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwogZXh0ZXJuIGludCByZWdpc3Rlcl9ob3RwbHVnX2RvY2tfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSwKLQkJCQkJc3RydWN0IGFjcGlfZG9ja19vcHMgKm9wcywKKwkJCQkJY29uc3Qgc3RydWN0IGFjcGlfZG9ja19vcHMgKm9wcywKIAkJCQkJdm9pZCAqY29udGV4dCk7CiBleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX2hvdHBsdWdfZG9ja19kZXZpY2UoYWNwaV9oYW5kbGUgaGFuZGxlKTsKICNlbHNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaXhmLmggYi9pbmNsdWRlL2FjcGkvYWNwaXhmLmgKaW5kZXggMmVkMGE4NC4uZjU1NGE5MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpeGYuaApAQCAtNDcsNyArNDcsNyBAQAogCiAvKiBDdXJyZW50IEFDUElDQSBzdWJzeXN0ZW0gdmVyc2lvbiBpbiBZWVlZTU1ERCBmb3JtYXQgKi8KIAotI2RlZmluZSBBQ1BJX0NBX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4MjAxMTA0MTMKKyNkZWZpbmUgQUNQSV9DQV9WRVJTSU9OICAgICAgICAgICAgICAgICAweDIwMTEwNjIzCiAKICNpbmNsdWRlICJhY3R5cGVzLmgiCiAjaW5jbHVkZSAiYWN0YmwuaCIKQEAgLTY5LDYgKzY5LDcgQEAKIGV4dGVybiB1MzIgYWNwaV9nYmxfZW5hYmxlX2FtbF9kZWJ1Z19vYmplY3Q7CiBleHRlcm4gdTggYWNwaV9nYmxfY29weV9kc2R0X2xvY2FsbHk7CiBleHRlcm4gdTggYWNwaV9nYmxfdHJ1bmNhdGVfaW9fYWRkcmVzc2VzOworZXh0ZXJuIHU4IGFjcGlfZ2JsX2Rpc2FibGVfYXV0b19yZXBhaXI7CiAKIGV4dGVybiB1MzIgYWNwaV9jdXJyZW50X2dwZV9jb3VudDsKIGV4dGVybiBzdHJ1Y3QgYWNwaV90YWJsZV9mYWR0IGFjcGlfZ2JsX0ZBRFQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYXBlaS5oIGIvaW5jbHVkZS9hY3BpL2FwZWkuaAppbmRleCBlNjdiNTIzLi41MWE1MjdkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYXBlaS5oCisrKyBiL2luY2x1ZGUvYWNwaS9hcGVpLmgKQEAgLTE4LDYgKzE4LDExIEBACiAKIGV4dGVybiBpbnQgaGVzdF9kaXNhYmxlOwogZXh0ZXJuIGludCBlcnN0X2Rpc2FibGU7CisjaWZkZWYgQ09ORklHX0FDUElfQVBFSV9HSEVTCitleHRlcm4gaW50IGdoZXNfZGlzYWJsZTsKKyNlbHNlCisjZGVmaW5lIGdoZXNfZGlzYWJsZSAxCisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BQ1BJX0FQRUkKIHZvaWQgX19pbml0IGFjcGlfaGVzdF9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCmluZGV4IGJhNDkyOGMuLjY3MDU1ZjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKQEAgLTMzNyw3ICszMzcsNyBAQAogCiAvKiBpbiBwcm9jZXNzb3JfdGhlcm1hbC5jICovCiBpbnQgYWNwaV9wcm9jZXNzb3JfZ2V0X2xpbWl0X2luZm8oc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcik7Ci1leHRlcm4gc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzIHByb2Nlc3Nvcl9jb29saW5nX29wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZV9vcHMgcHJvY2Vzc29yX2Nvb2xpbmdfb3BzOwogI2lmZGVmIENPTkZJR19DUFVfRlJFUQogdm9pZCBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9pbml0KHZvaWQpOwogdm9pZCBhY3BpX3RoZXJtYWxfY3B1ZnJlcV9leGl0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hY3BpLmggYi9pbmNsdWRlL2xpbnV4L2FjcGkuaAppbmRleCAxZGViMmE3Li42MDAxYjRkYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hY3BpLmgKKysrIGIvaW5jbHVkZS9saW51eC9hY3BpLmgKQEAgLTIzOCw3ICsyMzgsNiBAQAogZXh0ZXJuIGludCBwbnBhY3BpX2Rpc2FibGVkOwogCiAjZGVmaW5lIFBYTV9JTlZBTAkoLTEpCi0jZGVmaW5lIE5JRF9JTlZBTAkoLTEpCiAKIGludCBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcmVzKTsKIApAQCAtMjgwLDYgKzI3OSw4IEBACiAjZGVmaW5lIE9TQ19TQl9DUFVIUF9PU1RfU1VQUE9SVAk4CiAjZGVmaW5lIE9TQ19TQl9BUEVJX1NVUFBPUlQJCTE2CiAKK2V4dGVybiBib29sIG9zY19zYl9hcGVpX3N1cHBvcnRfYWNrZWQ7CisKIC8qIFBDSSBkZWZpbmVkIF9PU0MgYml0cyAqLwogLyogX09TQyBEVzEgRGVmaW5pdGlvbiAoT1MgU3VwcG9ydCBGaWVsZHMpICovCiAjZGVmaW5lIE9TQ19FWFRfUENJX0NPTkZJR19TVVBQT1JUCQkxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Flci5oIGIvaW5jbHVkZS9saW51eC9hZXIuaAppbmRleCA4NDE0ZGUyLi41NDRhYmRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Flci5oCisrKyBiL2luY2x1ZGUvbGludXgvYWVyLmgKQEAgLTUxLDUgKzUxLDggQEAKIAogZXh0ZXJuIHZvaWQgY3Blcl9wcmludF9hZXIoY29uc3QgY2hhciAqcHJlZml4LCBpbnQgY3Blcl9zZXZlcml0eSwKIAkJCSAgIHN0cnVjdCBhZXJfY2FwYWJpbGl0eV9yZWdzICphZXIpOworZXh0ZXJuIGludCBjcGVyX3NldmVyaXR5X3RvX2FlcihpbnQgY3Blcl9zZXZlcml0eSk7CitleHRlcm4gdm9pZCBhZXJfcmVjb3Zlcl9xdWV1ZShpbnQgZG9tYWluLCB1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCisJCQkgICAgICBpbnQgc2V2ZXJpdHkpOwogI2VuZGlmIC8vX0FFUl9IXwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FtYmEvcGwwOHguaCBiL2luY2x1ZGUvbGludXgvYW1iYS9wbDA4eC5oCmluZGV4IDMxMTEzODUuLmU2ZTI4ZjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYW1iYS9wbDA4eC5oCisrKyBiL2luY2x1ZGUvbGludXgvYW1iYS9wbDA4eC5oCkBAIC0xNzIsOCArMTcyLDExIEBACiAJaW50IHBoeWNoYW5faG9sZDsKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFza2xldDsKIAljaGFyICpuYW1lOwotCXN0cnVjdCBwbDA4eF9jaGFubmVsX2RhdGEgKmNkOwotCWRtYV9hZGRyX3QgcnVudGltZV9hZGRyOworCWNvbnN0IHN0cnVjdCBwbDA4eF9jaGFubmVsX2RhdGEgKmNkOworCWRtYV9hZGRyX3Qgc3JjX2FkZHI7CisJZG1hX2FkZHJfdCBkc3RfYWRkcjsKKwl1MzIgc3JjX2NjdGw7CisJdTMyIGRzdF9jY3RsOwogCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uCXJ1bnRpbWVfZGlyZWN0aW9uOwogCWRtYV9jb29raWVfdCBsYzsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHBlbmRfbGlzdDsKQEAgLTIwMiw3ICsyMDUsNyBAQAogICogQG1lbV9idXNlczogYnVzZXMgd2hpY2ggbWVtb3J5IGNhbiBiZSBhY2Nlc3NlZCBmcm9tOiBQTDA4WF9BSEIxIHwgUEwwOFhfQUhCMgogICovCiBzdHJ1Y3QgcGwwOHhfcGxhdGZvcm1fZGF0YSB7Ci0Jc3RydWN0IHBsMDh4X2NoYW5uZWxfZGF0YSAqc2xhdmVfY2hhbm5lbHM7CisJY29uc3Qgc3RydWN0IHBsMDh4X2NoYW5uZWxfZGF0YSAqc2xhdmVfY2hhbm5lbHM7CiAJdW5zaWduZWQgaW50IG51bV9zbGF2ZV9jaGFubmVsczsKIAlzdHJ1Y3QgcGwwOHhfY2hhbm5lbF9kYXRhIG1lbWNweV9jaGFubmVsOwogCWludCAoKmdldF9zaWduYWwpKHN0cnVjdCBwbDA4eF9kbWFfY2hhbiAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYml0bWFwLmggYi9pbmNsdWRlL2xpbnV4L2JpdG1hcC5oCmluZGV4IDNiYWM0NGMuLjdhZDYzNDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYml0bWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9iaXRtYXAuaApAQCAtMTQ2LDYgKzE0Niw3IEBACiBleHRlcm4gdm9pZCBiaXRtYXBfY29weV9sZSh2b2lkICpkc3QsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNyYywgaW50IG5iaXRzKTsKIGV4dGVybiBpbnQgYml0bWFwX29yZF90b19wb3MoY29uc3QgdW5zaWduZWQgbG9uZyAqYml0bWFwLCBpbnQgbiwgaW50IGJpdHMpOwogCisjZGVmaW5lIEJJVE1BUF9GSVJTVF9XT1JEX01BU0soc3RhcnQpICh+MFVMIDw8ICgoc3RhcnQpICUgQklUU19QRVJfTE9ORykpCiAjZGVmaW5lIEJJVE1BUF9MQVNUX1dPUkRfTUFTSyhuYml0cykJCQkJCVwKICgJCQkJCQkJCQlcCiAJKChuYml0cykgJSBCSVRTX1BFUl9MT05HKSA/CQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdWlkbGUuaCBiL2luY2x1ZGUvbGludXgvY3B1aWRsZS5oCmluZGV4IDM2NzE5ZWEuLmI1MTYyOWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1aWRsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1aWRsZS5oCkBAIC0xMjIsNiArMTIyLDggQEAKIH07CiAKICNpZmRlZiBDT05GSUdfQ1BVX0lETEUKK2V4dGVybiB2b2lkIGRpc2FibGVfY3B1aWRsZSh2b2lkKTsKK2V4dGVybiBpbnQgY3B1aWRsZV9pZGxlX2NhbGwodm9pZCk7CiAKIGV4dGVybiBpbnQgY3B1aWRsZV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYpOwogc3RydWN0IGNwdWlkbGVfZHJpdmVyICpjcHVpZGxlX2dldF9kcml2ZXIodm9pZCk7CkBAIC0xMzUsNiArMTM3LDggQEAKIGV4dGVybiB2b2lkIGNwdWlkbGVfZGlzYWJsZV9kZXZpY2Uoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYpOwogCiAjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfY3B1aWRsZSh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGNwdWlkbGVfaWRsZV9jYWxsKHZvaWQpIHsgcmV0dXJuIC1FTk9ERVY7IH0KIAogc3RhdGljIGlubGluZSBpbnQgY3B1aWRsZV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYpCiB7cmV0dXJuIC1FTk9ERVY7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmgKaW5kZXggNDQyN2UwNC4uM2ZhMWYzZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmgKQEAgLTIwOCw2ICsyMDgsNDkgQEAKIGludCBkbV9yZWdpc3Rlcl90YXJnZXQoc3RydWN0IHRhcmdldF90eXBlICp0KTsKIHZvaWQgZG1fdW5yZWdpc3Rlcl90YXJnZXQoc3RydWN0IHRhcmdldF90eXBlICp0KTsKIAorLyoKKyAqIFRhcmdldCBhcmd1bWVudCBwYXJzaW5nLgorICovCitzdHJ1Y3QgZG1fYXJnX3NldCB7CisJdW5zaWduZWQgYXJnYzsKKwljaGFyICoqYXJndjsKK307CisKKy8qCisgKiBUaGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZSBvZiBhIG51bWVyaWMgYXJndW1lbnQsIHRvZ2V0aGVyIHdpdGgKKyAqIHRoZSBlcnJvciBtZXNzYWdlIHRvIHVzZSBpZiB0aGUgbnVtYmVyIGlzIGZvdW5kIHRvIGJlIG91dHNpZGUgdGhhdCByYW5nZS4KKyAqLworc3RydWN0IGRtX2FyZyB7CisJdW5zaWduZWQgbWluOworCXVuc2lnbmVkIG1heDsKKwljaGFyICplcnJvcjsKK307CisKKy8qCisgKiBWYWxpZGF0ZSB0aGUgbmV4dCBhcmd1bWVudCwgZWl0aGVyIHJldHVybmluZyBpdCBhcyAqdmFsdWUgb3IsIGlmIGludmFsaWQsCisgKiByZXR1cm5pbmcgLUVJTlZBTCBhbmQgc2V0dGluZyAqZXJyb3IuCisgKi8KK2ludCBkbV9yZWFkX2FyZyhzdHJ1Y3QgZG1fYXJnICphcmcsIHN0cnVjdCBkbV9hcmdfc2V0ICphcmdfc2V0LAorCQl1bnNpZ25lZCAqdmFsdWUsIGNoYXIgKiplcnJvcik7CisKKy8qCisgKiBQcm9jZXNzIHRoZSBuZXh0IGFyZ3VtZW50IGFzIHRoZSBzdGFydCBvZiBhIGdyb3VwIGNvbnRhaW5pbmcgYmV0d2VlbgorICogYXJnLT5taW4gYW5kIGFyZy0+bWF4IGZ1cnRoZXIgYXJndW1lbnRzLiBFaXRoZXIgcmV0dXJuIHRoZSBzaXplIGFzCisgKiAqbnVtX2FyZ3Mgb3IsIGlmIGludmFsaWQsIHJldHVybiAtRUlOVkFMIGFuZCBzZXQgKmVycm9yLgorICovCitpbnQgZG1fcmVhZF9hcmdfZ3JvdXAoc3RydWN0IGRtX2FyZyAqYXJnLCBzdHJ1Y3QgZG1fYXJnX3NldCAqYXJnX3NldCwKKwkJICAgICAgdW5zaWduZWQgKm51bV9hcmdzLCBjaGFyICoqZXJyb3IpOworCisvKgorICogUmV0dXJuIHRoZSBjdXJyZW50IGFyZ3VtZW50IGFuZCBzaGlmdCB0byB0aGUgbmV4dC4KKyAqLworY29uc3QgY2hhciAqZG1fc2hpZnRfYXJnKHN0cnVjdCBkbV9hcmdfc2V0ICphcyk7CisKKy8qCisgKiBNb3ZlIHRocm91Z2ggbnVtX2FyZ3MgYXJndW1lbnRzLgorICovCit2b2lkIGRtX2NvbnN1bWVfYXJncyhzdHJ1Y3QgZG1fYXJnX3NldCAqYXMsIHVuc2lnbmVkIG51bV9hcmdzKTsKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogRnVuY3Rpb25zIGZvciBjcmVhdGluZyBhbmQgbWFuaXB1bGF0aW5nIG1hcHBlZCBkZXZpY2VzLgogICogRHJvcCB0aGUgcmVmZXJlbmNlIHdpdGggZG1fcHV0IHdoZW4geW91IGZpbmlzaCB3aXRoIHRoZSBvYmplY3QuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtLWlvY3RsLmggYi9pbmNsdWRlL2xpbnV4L2RtLWlvY3RsLmgKaW5kZXggMzcwODQ1NS4uMGNiOGVmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbS1pb2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvZG0taW9jdGwuaApAQCAtMjY3LDkgKzI2Nyw5IEBACiAjZGVmaW5lIERNX0RFVl9TRVRfR0VPTUVUUlkJX0lPV1IoRE1fSU9DVEwsIERNX0RFVl9TRVRfR0VPTUVUUllfQ01ELCBzdHJ1Y3QgZG1faW9jdGwpCiAKICNkZWZpbmUgRE1fVkVSU0lPTl9NQUpPUgk0Ci0jZGVmaW5lIERNX1ZFUlNJT05fTUlOT1IJMjAKKyNkZWZpbmUgRE1fVkVSU0lPTl9NSU5PUgkyMQogI2RlZmluZSBETV9WRVJTSU9OX1BBVENITEVWRUwJMAotI2RlZmluZSBETV9WRVJTSU9OX0VYVFJBCSItaW9jdGwgKDIwMTEtMDItMDIpIgorI2RlZmluZSBETV9WRVJTSU9OX0VYVFJBCSItaW9jdGwgKDIwMTEtMDctMDYpIgogCiAvKiBTdGF0dXMgYml0cyAqLwogI2RlZmluZSBETV9SRUFET05MWV9GTEFHCSgxIDw8IDApIC8qIEluL091dCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbS1rY29weWQuaCBiL2luY2x1ZGUvbGludXgvZG0ta2NvcHlkLmgKaW5kZXggMjk4ZDU4Ny4uNWU1NDQ1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbS1rY29weWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtLWtjb3B5ZC5oCkBAIC00Miw1ICs0MiwyMCBAQAogCQkgICB1bnNpZ25lZCBudW1fZGVzdHMsIHN0cnVjdCBkbV9pb19yZWdpb24gKmRlc3RzLAogCQkgICB1bnNpZ25lZCBmbGFncywgZG1fa2NvcHlkX25vdGlmeV9mbiBmbiwgdm9pZCAqY29udGV4dCk7CiAKKy8qCisgKiBQcmVwYXJlIGEgY2FsbGJhY2sgYW5kIHN1Ym1pdCBpdCB2aWEgdGhlIGtjb3B5ZCB0aHJlYWQuCisgKgorICogZG1fa2NvcHlkX3ByZXBhcmVfY2FsbGJhY2sgYWxsb2NhdGVzIGEgY2FsbGJhY2sgc3RydWN0dXJlIGFuZCByZXR1cm5zIGl0LgorICogSXQgbXVzdCBub3QgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQuCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgc2hvdWxkIGJlIHBhc3NlZCBpbnRvIGRtX2tjb3B5ZF9kb19jYWxsYmFjay4KKyAqCisgKiBkbV9rY29weWRfZG9fY2FsbGJhY2sgc3VibWl0cyB0aGUgY2FsbGJhY2suCisgKiBJdCBtYXkgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQuCisgKiBUaGUgY2FsbGJhY2sgaXMgaXNzdWVkIGZyb20gdGhlIGtjb3B5ZCB0aHJlYWQuCisgKi8KK3ZvaWQgKmRtX2tjb3B5ZF9wcmVwYXJlX2NhbGxiYWNrKHN0cnVjdCBkbV9rY29weWRfY2xpZW50ICprYywKKwkJCQkgZG1fa2NvcHlkX25vdGlmeV9mbiBmbiwgdm9pZCAqY29udGV4dCk7Cit2b2lkIGRtX2tjb3B5ZF9kb19jYWxsYmFjayh2b2lkICpqb2IsIGludCByZWFkX2VyciwgdW5zaWduZWQgbG9uZyB3cml0ZV9lcnIpOworCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogI2VuZGlmCS8qIF9MSU5VWF9ETV9LQ09QWURfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kdmIvYXVkaW8uaCBiL2luY2x1ZGUvbGludXgvZHZiL2F1ZGlvLmgKaW5kZXggZmVjNjZiZC4uZDQ3YmNjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kdmIvYXVkaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2R2Yi9hdWRpby5oCkBAIC02Nyw3ICs2Nyw3IEBACiAKIAogdHlwZWRlZgotc3RydWN0IGF1ZGlvX2thcmFva2V7ICAvKiBpZiBWb2NhbDEgb3IgVm9jYWwyIGFyZSBub24temVybywgdGhleSBnZXQgbWl4ZWQgICovCitzdHJ1Y3QgYXVkaW9fa2FyYW9rZSB7ICAvKiBpZiBWb2NhbDEgb3IgVm9jYWwyIGFyZSBub24temVybywgdGhleSBnZXQgbWl4ZWQgICovCiAJaW50IHZvY2FsMTsgICAgLyogaW50byBsZWZ0IGFuZCByaWdodCB0IGF0IDcwJSBlYWNoICovCiAJaW50IHZvY2FsMjsgICAgLyogaWYgYm90aCwgVm9jYWwxIGFuZCBWb2NhbDIgYXJlIG5vbi16ZXJvLCBWb2NhbDEgZ2V0cyovCiAJaW50IG1lbG9keTsgICAgLyogbWl4ZWQgaW50byB0aGUgbGVmdCBjaGFubmVsIGFuZCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9lZmkuaCBiL2luY2x1ZGUvbGludXgvZWZpLmgKaW5kZXggZWMyNTcyNi4uMjM2MmEwYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9lZmkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2VmaS5oCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGZuLmg+CisjaW5jbHVkZSA8bGludXgvcHN0b3JlLmg+CiAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTIzMiw2ICsyMzMsOSBAQAogI2RlZmluZSBVVl9TWVNURU1fVEFCTEVfR1VJRCBcCiAgICAgRUZJX0dVSUQoICAweDNiMTNhN2Q0LCAweDYzM2UsIDB4MTFkZCwgMHg5MywgMHhlYywgMHhkYSwgMHgyNSwgMHg1NiwgMHhkOCwgMHg5NSwgMHg5MyApCiAKKyNkZWZpbmUgTElOVVhfRUZJX0NSQVNIX0dVSUQgXAorICAgIEVGSV9HVUlEKCAgMHhjZmM4ZmM3OSwgMHhiZTJlLCAweDRkZGMsIDB4OTcsIDB4ZjAsIDB4OWYsIDB4OTgsIDB4YmYsIDB4ZTIsIDB4OTgsIDB4YTAgKQorCiB0eXBlZGVmIHN0cnVjdCB7CiAJZWZpX2d1aWRfdCBndWlkOwogCXVuc2lnbmVkIGxvbmcgdGFibGU7CkBAIC00NTgsNiArNDYyLDggQEAKIAlzdHJ1Y3Qga3NldCAqa3NldDsKIAlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqbmV3X3ZhciwgKmRlbF92YXI7CiAJY29uc3Qgc3RydWN0IGVmaXZhcl9vcGVyYXRpb25zICpvcHM7CisJc3RydWN0IGVmaXZhcl9lbnRyeSAqd2Fsa19lbnRyeTsKKwlzdHJ1Y3QgcHN0b3JlX2luZm8gZWZpX3BzdG9yZV9pbmZvOwogfTsKIAogaW50IHJlZ2lzdGVyX2VmaXZhcnMoc3RydWN0IGVmaXZhcnMgKmVmaXZhcnMsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZhdWx0LWluamVjdC5oIGIvaW5jbHVkZS9saW51eC9mYXVsdC1pbmplY3QuaAppbmRleCAzZmYwNjBhLi5jNmY5OTZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZhdWx0LWluamVjdC5oCisrKyBiL2luY2x1ZGUvbGludXgvZmF1bHQtaW5qZWN0LmgKQEAgLTI1LDEwICsyNSw2IEBACiAJdW5zaWduZWQgbG9uZyByZWplY3RfZW5kOwogCiAJdW5zaWduZWQgbG9uZyBjb3VudDsKLQotI2lmZGVmIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fREVCVUdfRlMKLQlzdHJ1Y3QgZGVudHJ5ICpkaXI7Ci0jZW5kaWYKIH07CiAKICNkZWZpbmUgRkFVTFRfQVRUUl9JTklUSUFMSVpFUiB7CQkJCVwKQEAgLTQ1LDE5ICs0MSwxNSBAQAogCiAjaWZkZWYgQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUwogCi1pbnQgaW5pdF9mYXVsdF9hdHRyX2RlbnRyaWVzKHN0cnVjdCBmYXVsdF9hdHRyICphdHRyLCBjb25zdCBjaGFyICpuYW1lKTsKLXZvaWQgY2xlYW51cF9mYXVsdF9hdHRyX2RlbnRyaWVzKHN0cnVjdCBmYXVsdF9hdHRyICphdHRyKTsKK3N0cnVjdCBkZW50cnkgKmZhdWx0X2NyZWF0ZV9kZWJ1Z2ZzX2F0dHIoY29uc3QgY2hhciAqbmFtZSwKKwkJCXN0cnVjdCBkZW50cnkgKnBhcmVudCwgc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIpOwogCiAjZWxzZSAvKiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IGluaXRfZmF1bHRfYXR0cl9kZW50cmllcyhzdHJ1Y3QgZmF1bHRfYXR0ciAqYXR0ciwKLQkJCQkJICBjb25zdCBjaGFyICpuYW1lKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZGVudHJ5ICpmYXVsdF9jcmVhdGVfZGVidWdmc19hdHRyKGNvbnN0IGNoYXIgKm5hbWUsCisJCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHN0cnVjdCBmYXVsdF9hdHRyICphdHRyKQogewotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xlYW51cF9mYXVsdF9hdHRyX2RlbnRyaWVzKHN0cnVjdCBmYXVsdF9hdHRyICphdHRyKQoteworCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwogfQogCiAjZW5kaWYgLyogQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IGYyM2JjYjcuLjc4NmIzYjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTIzMTcsMTEgKzIzMTcsMTggQEAKIGV4dGVybiBpbnQgZmlsZV9yZW1vdmVfc3VpZChzdHJ1Y3QgZmlsZSAqKTsKIAogZXh0ZXJuIHZvaWQgX19pbnNlcnRfaW5vZGVfaGFzaChzdHJ1Y3QgaW5vZGUgKiwgdW5zaWduZWQgbG9uZyBoYXNodmFsKTsKLWV4dGVybiB2b2lkIHJlbW92ZV9pbm9kZV9oYXNoKHN0cnVjdCBpbm9kZSAqKTsKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbnNlcnRfaW5vZGVfaGFzaChzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCV9faW5zZXJ0X2lub2RlX2hhc2goaW5vZGUsIGlub2RlLT5pX2lubyk7CiB9CisKK2V4dGVybiB2b2lkIF9fcmVtb3ZlX2lub2RlX2hhc2goc3RydWN0IGlub2RlICopOworc3RhdGljIGlubGluZSB2b2lkIHJlbW92ZV9pbm9kZV9oYXNoKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKCFpbm9kZV91bmhhc2hlZChpbm9kZSkpCisJCV9fcmVtb3ZlX2lub2RlX2hhc2goaW5vZGUpOworfQorCiBleHRlcm4gdm9pZCBpbm9kZV9zYl9saXN0X2FkZChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIAogI2lmZGVmIENPTkZJR19CTE9DSwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9nZW5hbGxvYy5oIGIvaW5jbHVkZS9saW51eC9nZW5hbGxvYy5oCmluZGV4IDViYmViZGEuLjVlOThlZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2VuYWxsb2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L2dlbmFsbG9jLmgKQEAgLTEsOCArMSwyNiBAQAogLyoKLSAqIEJhc2ljIGdlbmVyYWwgcHVycG9zZSBhbGxvY2F0b3IgZm9yIG1hbmFnaW5nIHNwZWNpYWwgcHVycG9zZSBtZW1vcnkKLSAqIG5vdCBtYW5hZ2VkIGJ5IHRoZSByZWd1bGFyIGttYWxsb2Mva2ZyZWUgaW50ZXJmYWNlLgotICogVXNlcyBmb3IgdGhpcyBpbmNsdWRlcyBvbi1kZXZpY2Ugc3BlY2lhbCBtZW1vcnksIHVuY2FjaGVkIG1lbW9yeQotICogZXRjLgorICogQmFzaWMgZ2VuZXJhbCBwdXJwb3NlIGFsbG9jYXRvciBmb3IgbWFuYWdpbmcgc3BlY2lhbCBwdXJwb3NlCisgKiBtZW1vcnksIGZvciBleGFtcGxlLCBtZW1vcnkgdGhhdCBpcyBub3QgbWFuYWdlZCBieSB0aGUgcmVndWxhcgorICoga21hbGxvYy9rZnJlZSBpbnRlcmZhY2UuICBVc2VzIGZvciB0aGlzIGluY2x1ZGVzIG9uLWRldmljZSBzcGVjaWFsCisgKiBtZW1vcnksIHVuY2FjaGVkIG1lbW9yeSBldGMuCisgKgorICogSXQgaXMgc2FmZSB0byB1c2UgdGhlIGFsbG9jYXRvciBpbiBOTUkgaGFuZGxlcnMgYW5kIG90aGVyIHNwZWNpYWwKKyAqIHVuYmxvY2thYmxlIGNvbnRleHRzIHRoYXQgY291bGQgb3RoZXJ3aXNlIGRlYWRsb2NrIG9uIGxvY2tzLiAgVGhpcworICogaXMgaW1wbGVtZW50ZWQgYnkgdXNpbmcgYXRvbWljIG9wZXJhdGlvbnMgYW5kIHJldHJpZXMgb24gYW55CisgKiBjb25mbGljdHMuICBUaGUgZGlzYWR2YW50YWdlIGlzIHRoYXQgdGhlcmUgbWF5IGJlIGxpdmVsb2NrcyBpbgorICogZXh0cmVtZSBjYXNlcy4gIEZvciBiZXR0ZXIgc2NhbGFiaWxpdHksIG9uZSBhbGxvY2F0b3IgY2FuIGJlIHVzZWQKKyAqIGZvciBlYWNoIENQVS4KKyAqCisgKiBUaGUgbG9ja2xlc3Mgb3BlcmF0aW9uIG9ubHkgd29ya3MgaWYgdGhlcmUgaXMgZW5vdWdoIG1lbW9yeQorICogYXZhaWxhYmxlLiAgSWYgbmV3IG1lbW9yeSBpcyBhZGRlZCB0byB0aGUgcG9vbCBhIGxvY2sgaGFzIHRvIGJlCisgKiBzdGlsbCB0YWtlbi4gIFNvIGFueSB1c2VyIHJlbHlpbmcgb24gbG9ja2xlc3NuZXNzIGhhcyB0byBlbnN1cmUKKyAqIHRoYXQgc3VmZmljaWVudCBtZW1vcnkgaXMgcHJlYWxsb2NhdGVkLgorICoKKyAqIFRoZSBiYXNpYyBhdG9taWMgb3BlcmF0aW9uIG9mIHRoaXMgYWxsb2NhdG9yIGlzIGNtcHhjaGcgb24gbG9uZy4KKyAqIE9uIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBoYXZlIE5NSS1zYWZlIGNtcHhjaGcgaW1wbGVtZW50YXRpb24sCisgKiB0aGUgYWxsb2NhdG9yIGNhbiBOT1QgYmUgdXNlZCBpbiBOTUkgaGFuZGxlci4gIFNvIGNvZGUgdXNlcyB0aGUKKyAqIGFsbG9jYXRvciBpbiBOTUkgaGFuZGxlciBzaG91bGQgZGVwZW5kIG9uCisgKiBDT05GSUdfQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcuCiAgKgogICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCiAgKiBWZXJzaW9uIDIuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgpAQCAtMTUsNyArMzMsNyBAQAogICogIEdlbmVyYWwgcHVycG9zZSBzcGVjaWFsIG1lbW9yeSBwb29sIGRlc2NyaXB0b3IuCiAgKi8KIHN0cnVjdCBnZW5fcG9vbCB7Ci0Jcndsb2NrX3QgbG9jazsKKwlzcGlubG9ja190IGxvY2s7CiAJc3RydWN0IGxpc3RfaGVhZCBjaHVua3M7CS8qIGxpc3Qgb2YgY2h1bmtzIGluIHRoaXMgcG9vbCAqLwogCWludCBtaW5fYWxsb2Nfb3JkZXI7CQkvKiBtaW5pbXVtIGFsbG9jYXRpb24gb3JkZXIgKi8KIH07CkBAIC0yNCw4ICs0Miw4IEBACiAgKiAgR2VuZXJhbCBwdXJwb3NlIHNwZWNpYWwgbWVtb3J5IHBvb2wgY2h1bmsgZGVzY3JpcHRvci4KICAqLwogc3RydWN0IGdlbl9wb29sX2NodW5rIHsKLQlzcGlubG9ja190IGxvY2s7CiAJc3RydWN0IGxpc3RfaGVhZCBuZXh0X2NodW5rOwkvKiBuZXh0IGNodW5rIGluIHBvb2wgKi8KKwlhdG9taWNfdCBhdmFpbDsKIAlwaHlzX2FkZHJfdCBwaHlzX2FkZHI7CQkvKiBwaHlzaWNhbCBzdGFydGluZyBhZGRyZXNzIG9mIG1lbW9yeSBjaHVuayAqLwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcjsJLyogc3RhcnRpbmcgYWRkcmVzcyBvZiBtZW1vcnkgY2h1bmsgKi8KIAl1bnNpZ25lZCBsb25nIGVuZF9hZGRyOwkJLyogZW5kaW5nIGFkZHJlc3Mgb2YgbWVtb3J5IGNodW5rICovCkBAIC01Niw0ICs3NCw4IEBACiBleHRlcm4gdm9pZCBnZW5fcG9vbF9kZXN0cm95KHN0cnVjdCBnZW5fcG9vbCAqKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGdlbl9wb29sX2FsbG9jKHN0cnVjdCBnZW5fcG9vbCAqLCBzaXplX3QpOwogZXh0ZXJuIHZvaWQgZ2VuX3Bvb2xfZnJlZShzdHJ1Y3QgZ2VuX3Bvb2wgKiwgdW5zaWduZWQgbG9uZywgc2l6ZV90KTsKK2V4dGVybiB2b2lkIGdlbl9wb29sX2Zvcl9lYWNoX2NodW5rKHN0cnVjdCBnZW5fcG9vbCAqLAorCXZvaWQgKCopKHN0cnVjdCBnZW5fcG9vbCAqLCBzdHJ1Y3QgZ2VuX3Bvb2xfY2h1bmsgKiwgdm9pZCAqKSwgdm9pZCAqKTsKK2V4dGVybiBzaXplX3QgZ2VuX3Bvb2xfYXZhaWwoc3RydWN0IGdlbl9wb29sICopOworZXh0ZXJuIHNpemVfdCBnZW5fcG9vbF9zaXplKHN0cnVjdCBnZW5fcG9vbCAqKTsKICNlbmRpZiAvKiBfX0dFTkFMTE9DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9nZnAuaCBiL2luY2x1ZGUvbGludXgvZ2ZwLmgKaW5kZXggY2I0MDg5Mi4uM2E3NmZhZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9nZnAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2dmcC5oCkBAIC05Miw3ICs5Miw3IEBACiAgKi8KICNkZWZpbmUgX19HRlBfTk9UUkFDS19GQUxTRV9QT1NJVElWRSAoX19HRlBfTk9UUkFDSykKIAotI2RlZmluZSBfX0dGUF9CSVRTX1NISUZUIDIzCS8qIFJvb20gZm9yIDIzIF9fR0ZQX0ZPTyBiaXRzICovCisjZGVmaW5lIF9fR0ZQX0JJVFNfU0hJRlQgMjQJLyogUm9vbSBmb3IgTiBfX0dGUF9GT08gYml0cyAqLwogI2RlZmluZSBfX0dGUF9CSVRTX01BU0sgKChfX2ZvcmNlIGdmcF90KSgoMSA8PCBfX0dGUF9CSVRTX1NISUZUKSAtIDEpKQogCiAvKiBUaGlzIGVxdWFscyAwLCBidXQgdXNlIGNvbnN0YW50cyBpbiBjYXNlIHRoZXkgZXZlciBjaGFuZ2UgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWRyLmggYi9pbmNsdWRlL2xpbnV4L2lkci5oCmluZGV4IDEzYTgwMWYuLjI1NTQ5MWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWRyLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZHIuaApAQCAtMTQ2LDYgKzE0NiwxMCBAQAogdm9pZCBpZGFfZGVzdHJveShzdHJ1Y3QgaWRhICppZGEpOwogdm9pZCBpZGFfaW5pdChzdHJ1Y3QgaWRhICppZGEpOwogCitpbnQgaWRhX3NpbXBsZV9nZXQoc3RydWN0IGlkYSAqaWRhLCB1bnNpZ25lZCBpbnQgc3RhcnQsIHVuc2lnbmVkIGludCBlbmQsCisJCSAgIGdmcF90IGdmcF9tYXNrKTsKK3ZvaWQgaWRhX3NpbXBsZV9yZW1vdmUoc3RydWN0IGlkYSAqaWRhLCB1bnNpZ25lZCBpbnQgaWQpOworCiB2b2lkIF9faW5pdCBpZHJfaW5pdF9jYWNoZSh2b2lkKTsKIAogI2VuZGlmIC8qIF9fSURSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pb3BvcnQuaCBiL2luY2x1ZGUvbGludXgvaW9wb3J0LmgKaW5kZXggYzJlYmZlNi4uOWQ1N2E3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pb3BvcnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oCkBAIC0xNjIsNiArMTYyLDcgQEAKIAkJCQkJCSAgICAgICByZXNvdXJjZV9zaXplX3QsCiAJCQkJCQkgICAgICAgcmVzb3VyY2Vfc2l6ZV90KSwKIAkJCSAgICAgdm9pZCAqYWxpZ25mX2RhdGEpOworc3RydWN0IHJlc291cmNlICpsb29rdXBfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyb290LCByZXNvdXJjZV9zaXplX3Qgc3RhcnQpOwogaW50IGFkanVzdF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LAogCQkgICAgcmVzb3VyY2Vfc2l6ZV90IHNpemUpOwogcmVzb3VyY2Vfc2l6ZV90IHJlc291cmNlX2FsaWdubWVudChzdHJ1Y3QgcmVzb3VyY2UgKnJlcyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycS5oIGIvaW5jbHVkZS9saW51eC9pcnEuaAppbmRleCA1ZjY5NTA0Li44N2EwNmYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxLmgKQEAgLTEwOCwxNCArMTA4LDE4IEBACiB9OwogCiBzdHJ1Y3QgbXNpX2Rlc2M7CitzdHJ1Y3QgaXJxX2RvbWFpbjsKIAogLyoqCiAgKiBzdHJ1Y3QgaXJxX2RhdGEgLSBwZXIgaXJxIGFuZCBpcnEgY2hpcCBkYXRhIHBhc3NlZCBkb3duIHRvIGNoaXAgZnVuY3Rpb25zCiAgKiBAaXJxOgkJaW50ZXJydXB0IG51bWJlcgorICogQGh3aXJxOgkJaGFyZHdhcmUgaW50ZXJydXB0IG51bWJlciwgbG9jYWwgdG8gdGhlIGludGVycnVwdCBkb21haW4KICAqIEBub2RlOgkJbm9kZSBpbmRleCB1c2VmdWwgZm9yIGJhbGFuY2luZwogICogQHN0YXRlX3VzZV9hY2Nlc3NvcnM6IHN0YXR1cyBpbmZvcm1hdGlvbiBmb3IgaXJxIGNoaXAgZnVuY3Rpb25zLgogICoJCQlVc2UgYWNjZXNzb3IgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBpdAogICogQGNoaXA6CQlsb3cgbGV2ZWwgaW50ZXJydXB0IGhhcmR3YXJlIGFjY2VzcworICogQGRvbWFpbjoJCUludGVycnVwdCB0cmFuc2xhdGlvbiBkb21haW47IHJlc3BvbnNpYmxlIGZvciBtYXBwaW5nCisgKgkJCWJldHdlZW4gaHdpcnEgbnVtYmVyIGFuZCBsaW51eCBpcnEgbnVtYmVyLgogICogQGhhbmRsZXJfZGF0YToJcGVyLUlSUSBkYXRhIGZvciB0aGUgaXJxX2NoaXAgbWV0aG9kcwogICogQGNoaXBfZGF0YToJCXBsYXRmb3JtLXNwZWNpZmljIHBlci1jaGlwIHByaXZhdGUgZGF0YSBmb3IgdGhlIGNoaXAKICAqCQkJbWV0aG9kcywgdG8gYWxsb3cgc2hhcmVkIGNoaXAgaW1wbGVtZW50YXRpb25zCkBAIC0xMjgsOSArMTMyLDExIEBACiAgKi8KIHN0cnVjdCBpcnFfZGF0YSB7CiAJdW5zaWduZWQgaW50CQlpcnE7CisJdW5zaWduZWQgbG9uZwkJaHdpcnE7CiAJdW5zaWduZWQgaW50CQlub2RlOwogCXVuc2lnbmVkIGludAkJc3RhdGVfdXNlX2FjY2Vzc29yczsKIAlzdHJ1Y3QgaXJxX2NoaXAJCSpjaGlwOworCXN0cnVjdCBpcnFfZG9tYWluCSpkb21haW47CiAJdm9pZAkJCSpoYW5kbGVyX2RhdGE7CiAJdm9pZAkJCSpjaGlwX2RhdGE7CiAJc3RydWN0IG1zaV9kZXNjCQkqbXNpX2Rlc2M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycWRvbWFpbi5oIGIvaW5jbHVkZS9saW51eC9pcnFkb21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODA3YWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9pcnFkb21haW4uaApAQCAtMCwwICsxLDkxIEBACisvKgorICogaXJxX2RvbWFpbiAtIElSUSB0cmFuc2xhdGlvbiBkb21haW5zCisgKgorICogVHJhbnNsYXRpb24gaW5mcmFzdHJ1Y3R1cmUgYmV0d2VlbiBodyBhbmQgbGludXggaXJxIG51bWJlcnMuICBUaGlzIGlzCisgKiBoZWxwZnVsIGZvciBpbnRlcnJ1cHQgY29udHJvbGxlcnMgdG8gaW1wbGVtZW50IG1hcHBpbmcgYmV0d2VlbiBoYXJkd2FyZQorICogaXJxIG51bWJlcnMgYW5kIHRoZSBMaW51eCBpcnEgbnVtYmVyIHNwYWNlLgorICoKKyAqIGlycV9kb21haW5zIGFsc28gaGF2ZSBhIGhvb2sgZm9yIHRyYW5zbGF0aW5nIGRldmljZSB0cmVlIGludGVycnVwdAorICogcmVwcmVzZW50YXRpb24gaW50byBhIGhhcmR3YXJlIGlycSBudW1iZXIgdGhhdCBjYW4gYmUgbWFwcGVkIGJhY2sgdG8gYQorICogTGludXggaXJxIG51bWJlciB3aXRob3V0IGFueSBleHRyYSBwbGF0Zm9ybSBzdXBwb3J0IGNvZGUuCisgKgorICogaXJxX2RvbWFpbiBpcyBleHBlY3RlZCB0byBiZSBlbWJlZGRlZCBpbiBhbiBpbnRlcnJ1cHQgY29udHJvbGxlcidzIHByaXZhdGUKKyAqIGRhdGEgc3RydWN0dXJlLgorICovCisjaWZuZGVmIF9MSU5VWF9JUlFET01BSU5fSAorI2RlZmluZSBfTElOVVhfSVJRRE9NQUlOX0gKKworI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgorCisjaWZkZWYgQ09ORklHX0lSUV9ET01BSU4KK3N0cnVjdCBkZXZpY2Vfbm9kZTsKK3N0cnVjdCBpcnFfZG9tYWluOworCisvKioKKyAqIHN0cnVjdCBpcnFfZG9tYWluX29wcyAtIE1ldGhvZHMgZm9yIGlycV9kb21haW4gb2JqZWN0cworICogQHRvX2lycTogKG9wdGlvbmFsKSBnaXZlbiBhIGxvY2FsIGhhcmR3YXJlIGlycSBudW1iZXIsIHJldHVybiB0aGUgbGludXgKKyAqICAgICAgICAgIGlycSBudW1iZXIuICBJZiB0b19pcnEgaXMgbm90IGltcGxlbWVudGVkLCB0aGVuIHRoZSBpcnFfZG9tYWluCisgKiAgICAgICAgICB3aWxsIHVzZSB0aGlzIHRyYW5zbGF0aW9uOiBpcnEgPSAoZG9tYWluLT5pcnFfYmFzZSArIGh3aXJxKQorICogQGR0X3RyYW5zbGF0ZTogR2l2ZW4gYSBkZXZpY2UgdHJlZSBub2RlIGFuZCBpbnRlcnJ1cHQgc3BlY2lmaWVyLCBkZWNvZGUKKyAqICAgICAgICAgICAgICAgIHRoZSBoYXJkd2FyZSBpcnEgbnVtYmVyIGFuZCBsaW51eCBpcnEgdHlwZSB2YWx1ZS4KKyAqLworc3RydWN0IGlycV9kb21haW5fb3BzIHsKKwl1bnNpZ25lZCBpbnQgKCp0b19pcnEpKHN0cnVjdCBpcnFfZG9tYWluICpkLCB1bnNpZ25lZCBsb25nIGh3aXJxKTsKKworI2lmZGVmIENPTkZJR19PRgorCWludCAoKmR0X3RyYW5zbGF0ZSkoc3RydWN0IGlycV9kb21haW4gKmQsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCSAgICBjb25zdCB1MzIgKmludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgKm91dF9od2lycSwgdW5zaWduZWQgaW50ICpvdXRfdHlwZSk7CisjZW5kaWYgLyogQ09ORklHX09GICovCit9OworCisvKioKKyAqIHN0cnVjdCBpcnFfZG9tYWluIC0gSGFyZHdhcmUgaW50ZXJydXB0IG51bWJlciB0cmFuc2xhdGlvbiBvYmplY3QKKyAqIEBsaXN0OiBFbGVtZW50IGluIGdsb2JhbCBpcnFfZG9tYWluIGxpc3QuCisgKiBAaXJxX2Jhc2U6IFN0YXJ0IG9mIGlycV9kZXNjIHJhbmdlIGFzc2lnbmVkIHRvIHRoZSBpcnFfZG9tYWluLiAgVGhlIGNyZWF0b3IKKyAqICAgICAgICAgICAgb2YgdGhlIGlycV9kb21haW4gaXMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcgdGhlIGFycmF5IG9mCisgKiAgICAgICAgICAgIGlycV9kZXNjIHN0cnVjdHVyZXMuCisgKiBAbnJfaXJxOiBOdW1iZXIgb2YgaXJxcyBtYW5hZ2VkIGJ5IHRoZSBpcnEgZG9tYWluCisgKiBAb3BzOiBwb2ludGVyIHRvIGlycV9kb21haW4gbWV0aG9kcworICogQHByaXY6IHByaXZhdGUgZGF0YSBwb2ludGVyIGZvciB1c2UgYnkgb3duZXIuICBOb3QgdG91Y2hlZCBieSBpcnFfZG9tYWluCisgKiAgICAgICAgY29yZSBjb2RlLgorICogQG9mX25vZGU6IChvcHRpb25hbCkgUG9pbnRlciB0byBkZXZpY2UgdHJlZSBub2RlcyBhc3NvY2lhdGVkIHdpdGggdGhlCisgKiAgICAgICAgICAgaXJxX2RvbWFpbi4gIFVzZWQgd2hlbiBkZWNvZGluZyBkZXZpY2UgdHJlZSBpbnRlcnJ1cHQgc3BlY2lmaWVycy4KKyAqLworc3RydWN0IGlycV9kb21haW4geworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBpbnQgaXJxX2Jhc2U7CisJdW5zaWduZWQgaW50IG5yX2lycTsKKwljb25zdCBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgKm9wczsKKwl2b2lkICpwcml2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZTsKK307CisKKy8qKgorICogaXJxX2RvbWFpbl90b19pcnEoKSAtIFRyYW5zbGF0ZSBmcm9tIGEgaGFyZHdhcmUgaXJxIHRvIGEgbGludXggaXJxIG51bWJlcgorICoKKyAqIFJldHVybnMgdGhlIGxpbnV4IGlycSBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIGEgaGFyZHdhcmUgaXJxLiAgQnkgZGVmYXVsdCwKKyAqIHRoZSBtYXBwaW5nIGlzIGlycSA9PSBkb21haW4tPmlycV9iYXNlICsgaHdpcnEsIGJ1dCB0aGlzIG1hcHBpbmcgY2FuCisgKiBiZSBvdmVycmlkZGVuIGlmIHRoZSBpcnFfZG9tYWluIGltcGxlbWVudHMgYSAudG9faXJxKCkgaG9vay4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaXJxX2RvbWFpbl90b19pcnEoc3RydWN0IGlycV9kb21haW4gKmQsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBod2lycSkKK3sKKwlyZXR1cm4gZC0+b3BzLT50b19pcnEgPyBkLT5vcHMtPnRvX2lycShkLCBod2lycSkgOiBkLT5pcnFfYmFzZSArIGh3aXJxOworfQorCitleHRlcm4gdm9pZCBpcnFfZG9tYWluX2FkZChzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluKTsKK2V4dGVybiB2b2lkIGlycV9kb21haW5fZGVsKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4pOworI2VuZGlmIC8qIENPTkZJR19JUlFfRE9NQUlOICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19JUlFfRE9NQUlOKSAmJiBkZWZpbmVkKENPTkZJR19PRl9JUlEpCitleHRlcm4gdm9pZCBpcnFfZG9tYWluX2FkZF9zaW1wbGUoc3RydWN0IGRldmljZV9ub2RlICpjb250cm9sbGVyLCBpbnQgaXJxX2Jhc2UpOworZXh0ZXJuIHZvaWQgaXJxX2RvbWFpbl9nZW5lcmF0ZV9zaW1wbGUoY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gsCisJCQkJCXU2NCBwaHlzX2Jhc2UsIHVuc2lnbmVkIGludCBpcnFfc3RhcnQpOworI2Vsc2UgLyogQ09ORklHX0lSUV9ET01BSU4gJiYgQ09ORklHX09GX0lSUSAqLworc3RhdGljIGlubGluZSB2b2lkIGlycV9kb21haW5fZ2VuZXJhdGVfc2ltcGxlKGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoLAorCQkJCQl1NjQgcGh5c19iYXNlLCB1bnNpZ25lZCBpbnQgaXJxX3N0YXJ0KSB7IH0KKyNlbmRpZiAvKiBDT05GSUdfSVJRX0RPTUFJTiAmJiBDT05GSUdfT0ZfSVJRICovCisKKyNlbmRpZiAvKiBfTElOVVhfSVJRRE9NQUlOX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvamJkMi5oIGIvaW5jbHVkZS9saW51eC9qYmQyLmgKaW5kZXggZDA4N2MyZS4uMzhmMzA3YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9qYmQyLmgKKysrIGIvaW5jbHVkZS9saW51eC9qYmQyLmgKQEAgLTEzMjksMTIgKzEzMjksNiBAQAogI2RlZmluZSBCVUZGRVJfVFJBQ0UyKGJoLCBiaDIsIGluZm8pCWRvIHt9IHdoaWxlICgwKQogI2RlZmluZSBKQlVGRkVSX1RSQUNFKGpoLCBpbmZvKQlkbyB7fSB3aGlsZSAoMCkKIAotLyogCi0gKiBqYmQyX2Rldl90b19uYW1lIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiB1c2VkIGJ5IHRoZSBqYmQyIGFuZCBleHQ0IAotICogdHJhY2luZyBpbmZyYXN0cnVjdHVyZSB0byBtYXAgYSBkZXZfdCB0byBhIGRldmljZSBuYW1lLgotICovCi1leHRlcm4gY29uc3QgY2hhciAqamJkMl9kZXZfdG9fbmFtZShkZXZfdCBkZXZpY2UpOwotCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYJLyogX0xJTlVYX0pCRDJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rY29uZmlnLmggYi9pbmNsdWRlL2xpbnV4L2tjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjdlZGEwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9rY29uZmlnLmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBfX0xJTlVYX0tDT05GSUdfSAorI2RlZmluZSBfX0xJTlVYX0tDT05GSUdfSAorCisjaW5jbHVkZSA8Z2VuZXJhdGVkL2F1dG9jb25mLmg+CisKKy8qCisgKiBIZWxwZXIgbWFjcm9zIHRvIHVzZSBDT05GSUdfIG9wdGlvbnMgaW4gQyBleHByZXNzaW9ucy4gTm90ZSB0aGF0CisgKiB0aGVzZSBvbmx5IHdvcmsgd2l0aCBib29sZWFuIGFuZCB0cmlzdGF0ZSBvcHRpb25zLgorICovCisKKy8qCisgKiBJU19FTkFCTEVEKENPTkZJR19GT08pIGV2YWx1YXRlcyB0byAxIGlmIENPTkZJR19GT08gaXMgc2V0IHRvICd5JyBvciAnbScsCisgKiAwIG90aGVyd2lzZS4KKyAqCisgKi8KKyNkZWZpbmUgSVNfRU5BQkxFRChvcHRpb24pIFwKKwkoX19lbmFibGVkXyAjIyBvcHRpb24gfHwgX19lbmFibGVkXyAjIyBvcHRpb24gIyMgX01PRFVMRSkKKworLyoKKyAqIElTX0JVSUxUSU4oQ09ORklHX0ZPTykgZXZhbHVhdGVzIHRvIDEgaWYgQ09ORklHX0ZPTyBpcyBzZXQgdG8gJ3knLCAwCisgKiBvdGhlcndpc2UuIEZvciBib29sZWFuIG9wdGlvbnMsIHRoaXMgaXMgZXF1aXZhbGVudCB0bworICogSVNfRU5BQkxFRChDT05GSUdfRk9PKS4KKyAqLworI2RlZmluZSBJU19CVUlMVElOKG9wdGlvbikgX19lbmFibGVkXyAjIyBvcHRpb24KKworLyoKKyAqIElTX01PRFVMRShDT05GSUdfRk9PKSBldmFsdWF0ZXMgdG8gMSBpZiBDT05GSUdfRk9PIGlzIHNldCB0byAnbScsIDAKKyAqIG90aGVyd2lzZS4KKyAqLworI2RlZmluZSBJU19NT0RVTEUob3B0aW9uKSBfX2VuYWJsZWRfICMjIG9wdGlvbiAjIyBfTU9EVUxFCisKKyNlbmRpZiAvKiBfX0xJTlVYX0tDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sbGlzdC5oIGIvaW5jbHVkZS9saW51eC9sbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMGM4YjUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2xsaXN0LmgKQEAgLTAsMCArMSwxMjYgQEAKKyNpZm5kZWYgTExJU1RfSAorI2RlZmluZSBMTElTVF9ICisvKgorICogTG9jay1sZXNzIE5VTEwgdGVybWluYXRlZCBzaW5nbGUgbGlua2VkIGxpc3QKKyAqCisgKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgcHJvZHVjZXJzIGFuZCBtdWx0aXBsZSBjb25zdW1lcnMsIGxsaXN0X2FkZAorICogY2FuIGJlIHVzZWQgaW4gcHJvZHVjZXJzIGFuZCBsbGlzdF9kZWxfYWxsIGNhbiBiZSB1c2VkIGluCisgKiBjb25zdW1lcnMuICBUaGV5IGNhbiB3b3JrIHNpbXVsdGFuZW91c2x5IHdpdGhvdXQgbG9jay4gIEJ1dAorICogbGxpc3RfZGVsX2ZpcnN0IGNhbiBub3QgYmUgdXNlZCBoZXJlLiAgQmVjYXVzZSBsbGlzdF9kZWxfZmlyc3QKKyAqIGRlcGVuZHMgb24gbGlzdC0+Zmlyc3QtPm5leHQgZG9lcyBub3QgY2hhbmdlZCBpZiBsaXN0LT5maXJzdCBpcyBub3QKKyAqIGNoYW5nZWQgZHVyaW5nIGl0cyBvcGVyYXRpb24sIGJ1dCBsbGlzdF9kZWxfZmlyc3QsIGxsaXN0X2FkZCwKKyAqIGxsaXN0X2FkZCAob3IgbGxpc3RfZGVsX2FsbCwgbGxpc3RfYWRkLCBsbGlzdF9hZGQpIHNlcXVlbmNlIGluCisgKiBhbm90aGVyIGNvbnN1bWVyIG1heSB2aW9sYXRlIHRoYXQuCisgKgorICogSWYgdGhlcmUgYXJlIG11bHRpcGxlIHByb2R1Y2VycyBhbmQgb25lIGNvbnN1bWVyLCBsbGlzdF9hZGQgY2FuIGJlCisgKiB1c2VkIGluIHByb2R1Y2VycyBhbmQgbGxpc3RfZGVsX2FsbCBvciBsbGlzdF9kZWxfZmlyc3QgY2FuIGJlIHVzZWQKKyAqIGluIHRoZSBjb25zdW1lci4KKyAqCisgKiBUaGlzIGNhbiBiZSBzdW1tYXJpemVkIGFzIGZvbGxvdzoKKyAqCisgKiAgICAgICAgICAgfCAgIGFkZCAgICB8IGRlbF9maXJzdCB8ICBkZWxfYWxsCisgKiBhZGQgICAgICAgfCAgICAtICAgICB8ICAgICAtICAgICB8ICAgICAtCisgKiBkZWxfZmlyc3QgfCAgICAgICAgICB8ICAgICBMICAgICB8ICAgICBMCisgKiBkZWxfYWxsICAgfCAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAtCisgKgorICogV2hlcmUgIi0iIHN0YW5kcyBmb3Igbm8gbG9jayBpcyBuZWVkZWQsIHdoaWxlICJMIiBzdGFuZHMgZm9yIGxvY2sKKyAqIGlzIG5lZWRlZC4KKyAqCisgKiBUaGUgbGlzdCBlbnRyaWVzIGRlbGV0ZWQgdmlhIGxsaXN0X2RlbF9hbGwgY2FuIGJlIHRyYXZlcnNlZCB3aXRoCisgKiB0cmF2ZXJzaW5nIGZ1bmN0aW9uIHN1Y2ggYXMgbGxpc3RfZm9yX2VhY2ggZXRjLiAgQnV0IHRoZSBsaXN0CisgKiBlbnRyaWVzIGNhbiBub3QgYmUgdHJhdmVyc2VkIHNhZmVseSBiZWZvcmUgZGVsZXRlZCBmcm9tIHRoZSBsaXN0LgorICogVGhlIG9yZGVyIG9mIGRlbGV0ZWQgZW50cmllcyBpcyBmcm9tIHRoZSBuZXdlc3QgdG8gdGhlIG9sZGVzdCBhZGRlZAorICogb25lLiAgSWYgeW91IHdhbnQgdG8gdHJhdmVyc2UgZnJvbSB0aGUgb2xkZXN0IHRvIHRoZSBuZXdlc3QsIHlvdQorICogbXVzdCByZXZlcnNlIHRoZSBvcmRlciBieSB5b3Vyc2VsZiBiZWZvcmUgdHJhdmVyc2luZy4KKyAqCisgKiBUaGUgYmFzaWMgYXRvbWljIG9wZXJhdGlvbiBvZiB0aGlzIGxpc3QgaXMgY21weGNoZyBvbiBsb25nLiAgT24KKyAqIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBoYXZlIE5NSS1zYWZlIGNtcHhjaGcgaW1wbGVtZW50YXRpb24sIHRoZQorICogbGlzdCBjYW4gTk9UIGJlIHVzZWQgaW4gTk1JIGhhbmRsZXIuICBTbyBjb2RlIHVzZXMgdGhlIGxpc3QgaW4gTk1JCisgKiBoYW5kbGVyIHNob3VsZCBkZXBlbmQgb24gQ09ORklHX0FSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHLgorICovCisKK3N0cnVjdCBsbGlzdF9oZWFkIHsKKwlzdHJ1Y3QgbGxpc3Rfbm9kZSAqZmlyc3Q7Cit9OworCitzdHJ1Y3QgbGxpc3Rfbm9kZSB7CisJc3RydWN0IGxsaXN0X25vZGUgKm5leHQ7Cit9OworCisjZGVmaW5lIExMSVNUX0hFQURfSU5JVChuYW1lKQl7IE5VTEwgfQorI2RlZmluZSBMTElTVF9IRUFEKG5hbWUpCXN0cnVjdCBsbGlzdF9oZWFkIG5hbWUgPSBMTElTVF9IRUFEX0lOSVQobmFtZSkKKworLyoqCisgKiBpbml0X2xsaXN0X2hlYWQgLSBpbml0aWFsaXplIGxvY2stbGVzcyBsaXN0IGhlYWQKKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsb2NrLWxlc3MgbGlzdAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9sbGlzdF9oZWFkKHN0cnVjdCBsbGlzdF9oZWFkICpsaXN0KQoreworCWxpc3QtPmZpcnN0ID0gTlVMTDsKK30KKworLyoqCisgKiBsbGlzdF9lbnRyeSAtIGdldCB0aGUgc3RydWN0IG9mIHRoaXMgZW50cnkKKyAqIEBwdHI6CXRoZSAmc3RydWN0IGxsaXN0X25vZGUgcG9pbnRlci4KKyAqIEB0eXBlOgl0aGUgdHlwZSBvZiB0aGUgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGxpc3Rfbm9kZSB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqLworI2RlZmluZSBsbGlzdF9lbnRyeShwdHIsIHR5cGUsIG1lbWJlcikJCVwKKwljb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpCisKKy8qKgorICogbGxpc3RfZm9yX2VhY2ggLSBpdGVyYXRlIG92ZXIgc29tZSBkZWxldGVkIGVudHJpZXMgb2YgYSBsb2NrLWxlc3MgbGlzdAorICogQHBvczoJdGhlICZzdHJ1Y3QgbGxpc3Rfbm9kZSB0byB1c2UgYXMgYSBsb29wIGN1cnNvcgorICogQG5vZGU6CXRoZSBmaXJzdCBlbnRyeSBvZiBkZWxldGVkIGxpc3QgZW50cmllcworICoKKyAqIEluIGdlbmVyYWwsIHNvbWUgZW50cmllcyBvZiB0aGUgbG9jay1sZXNzIGxpc3QgY2FuIGJlIHRyYXZlcnNlZAorICogc2FmZWx5IG9ubHkgYWZ0ZXIgYmVpbmcgZGVsZXRlZCBmcm9tIGxpc3QsIHNvIHN0YXJ0IHdpdGggYW4gZW50cnkKKyAqIGluc3RlYWQgb2YgbGlzdCBoZWFkLgorICoKKyAqIElmIGJlaW5nIHVzZWQgb24gZW50cmllcyBkZWxldGVkIGZyb20gbG9jay1sZXNzIGxpc3QgZGlyZWN0bHksIHRoZQorICogdHJhdmVyc2Ugb3JkZXIgaXMgZnJvbSB0aGUgbmV3ZXN0IHRvIHRoZSBvbGRlc3QgYWRkZWQgZW50cnkuICBJZgorICogeW91IHdhbnQgdG8gdHJhdmVyc2UgZnJvbSB0aGUgb2xkZXN0IHRvIHRoZSBuZXdlc3QsIHlvdSBtdXN0CisgKiByZXZlcnNlIHRoZSBvcmRlciBieSB5b3Vyc2VsZiBiZWZvcmUgdHJhdmVyc2luZy4KKyAqLworI2RlZmluZSBsbGlzdF9mb3JfZWFjaChwb3MsIG5vZGUpCQkJXAorCWZvciAoKHBvcykgPSAobm9kZSk7IHBvczsgKHBvcykgPSAocG9zKS0+bmV4dCkKKworLyoqCisgKiBsbGlzdF9mb3JfZWFjaF9lbnRyeSAtIGl0ZXJhdGUgb3ZlciBzb21lIGRlbGV0ZWQgZW50cmllcyBvZiBsb2NrLWxlc3MgbGlzdCBvZiBnaXZlbiB0eXBlCisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQG5vZGU6CXRoZSBmaXN0IGVudHJ5IG9mIGRlbGV0ZWQgbGlzdCBlbnRyaWVzLgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxsaXN0X25vZGUgd2l0aCB0aGUgc3RydWN0LgorICoKKyAqIEluIGdlbmVyYWwsIHNvbWUgZW50cmllcyBvZiB0aGUgbG9jay1sZXNzIGxpc3QgY2FuIGJlIHRyYXZlcnNlZAorICogc2FmZWx5IG9ubHkgYWZ0ZXIgYmVpbmcgcmVtb3ZlZCBmcm9tIGxpc3QsIHNvIHN0YXJ0IHdpdGggYW4gZW50cnkKKyAqIGluc3RlYWQgb2YgbGlzdCBoZWFkLgorICoKKyAqIElmIGJlaW5nIHVzZWQgb24gZW50cmllcyBkZWxldGVkIGZyb20gbG9jay1sZXNzIGxpc3QgZGlyZWN0bHksIHRoZQorICogdHJhdmVyc2Ugb3JkZXIgaXMgZnJvbSB0aGUgbmV3ZXN0IHRvIHRoZSBvbGRlc3QgYWRkZWQgZW50cnkuICBJZgorICogeW91IHdhbnQgdG8gdHJhdmVyc2UgZnJvbSB0aGUgb2xkZXN0IHRvIHRoZSBuZXdlc3QsIHlvdSBtdXN0CisgKiByZXZlcnNlIHRoZSBvcmRlciBieSB5b3Vyc2VsZiBiZWZvcmUgdHJhdmVyc2luZy4KKyAqLworI2RlZmluZSBsbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsIG5vZGUsIG1lbWJlcikJCQkJXAorCWZvciAoKHBvcykgPSBsbGlzdF9lbnRyeSgobm9kZSksIHR5cGVvZigqKHBvcykpLCBtZW1iZXIpOwlcCisJICAgICAmKHBvcyktPm1lbWJlciAhPSBOVUxMOwkJCQkJXAorCSAgICAgKHBvcykgPSBsbGlzdF9lbnRyeSgocG9zKS0+bWVtYmVyLm5leHQsIHR5cGVvZigqKHBvcykpLCBtZW1iZXIpKQorCisvKioKKyAqIGxsaXN0X2VtcHR5IC0gdGVzdHMgd2hldGhlciBhIGxvY2stbGVzcyBsaXN0IGlzIGVtcHR5CisgKiBAaGVhZDoJdGhlIGxpc3QgdG8gdGVzdAorICoKKyAqIE5vdCBndWFyYW50ZWVkIHRvIGJlIGFjY3VyYXRlIG9yIHVwIHRvIGRhdGUuICBKdXN0IGEgcXVpY2sgd2F5IHRvCisgKiB0ZXN0IHdoZXRoZXIgdGhlIGxpc3QgaXMgZW1wdHkgd2l0aG91dCBkZWxldGluZyBzb21ldGhpbmcgZnJvbSB0aGUKKyAqIGxpc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGxsaXN0X2VtcHR5KGNvbnN0IHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQoreworCXJldHVybiBBQ0NFU1NfT05DRShoZWFkLT5maXJzdCkgPT0gTlVMTDsKK30KKwordm9pZCBsbGlzdF9hZGQoc3RydWN0IGxsaXN0X25vZGUgKm5ldywgc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpOwordm9pZCBsbGlzdF9hZGRfYmF0Y2goc3RydWN0IGxsaXN0X25vZGUgKm5ld19maXJzdCwgc3RydWN0IGxsaXN0X25vZGUgKm5ld19sYXN0LAorCQkgICAgIHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKTsKK3N0cnVjdCBsbGlzdF9ub2RlICpsbGlzdF9kZWxfZmlyc3Qoc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpOworc3RydWN0IGxsaXN0X25vZGUgKmxsaXN0X2RlbF9hbGwoc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpOworI2VuZGlmIC8qIExMSVNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oIGIvaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgKaW5kZXggYjk2NjAwNy4uM2I1MzVkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmgKQEAgLTg2LDggKzg2LDYgQEAKIAogZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF91bmNoYXJnZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKTsKIGV4dGVybiB2b2lkIG1lbV9jZ3JvdXBfdW5jaGFyZ2VfY2FjaGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSk7Ci1leHRlcm4gaW50IG1lbV9jZ3JvdXBfc2htZW1fY2hhcmdlX2ZhbGxiYWNrKHN0cnVjdCBwYWdlICpwYWdlLAotCQkJc3RydWN0IG1tX3N0cnVjdCAqbW0sIGdmcF90IGdmcF9tYXNrKTsKIAogZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF9vdXRfb2ZfbWVtb3J5KHN0cnVjdCBtZW1fY2dyb3VwICptZW0sIGdmcF90IGdmcF9tYXNrKTsKIGludCB0YXNrX2luX21lbV9jZ3JvdXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjb25zdCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtKTsKQEAgLTIyNSwxMiArMjIzLDYgQEAKIHsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbWVtX2Nncm91cF9zaG1lbV9jaGFyZ2VfZmFsbGJhY2soc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQlzdHJ1Y3QgbW1fc3RydWN0ICptbSwgZ2ZwX3QgZ2ZwX21hc2spCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBtZW1fY2dyb3VwX2FkZF9scnVfbGlzdChzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGxydSkKIHsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2FhdDI4NzAuaCBiL2luY2x1ZGUvbGludXgvbWZkL2FhdDI4NzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzMxNmMyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvYWF0Mjg3MC5oCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogbGludXgvaW5jbHVkZS9saW51eC9tZmQvYWF0Mjg3MC5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBOVklESUEgQ29ycG9yYXRpb24uCisgKiBBdXRob3I6IEppbiBQYXJrIDxqaW55b3VuZ3BAbnZpZGlhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01GRF9BQVQyODcwX0gKKyNkZWZpbmUgX19MSU5VWF9NRkRfQUFUMjg3MF9ICisKKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKKy8qIFJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgQUFUMjg3MF9CTF9DSF9FTgkweDAwCisjZGVmaW5lIEFBVDI4NzBfQkxNCQkweDAxCisjZGVmaW5lIEFBVDI4NzBfQkxTCQkweDAyCisjZGVmaW5lIEFBVDI4NzBfQkwxCQkweDAzCisjZGVmaW5lIEFBVDI4NzBfQkwyCQkweDA0CisjZGVmaW5lIEFBVDI4NzBfQkwzCQkweDA1CisjZGVmaW5lIEFBVDI4NzBfQkw0CQkweDA2CisjZGVmaW5lIEFBVDI4NzBfQkw1CQkweDA3CisjZGVmaW5lIEFBVDI4NzBfQkw2CQkweDA4CisjZGVmaW5lIEFBVDI4NzBfQkw3CQkweDA5CisjZGVmaW5lIEFBVDI4NzBfQkw4CQkweDBBCisjZGVmaW5lIEFBVDI4NzBfRkxSCQkweDBCCisjZGVmaW5lIEFBVDI4NzBfRk0JCTB4MEMKKyNkZWZpbmUgQUFUMjg3MF9GUwkJMHgwRAorI2RlZmluZSBBQVQyODcwX0FMU19DRkcwCTB4MEUKKyNkZWZpbmUgQUFUMjg3MF9BTFNfQ0ZHMQkweDBGCisjZGVmaW5lIEFBVDI4NzBfQUxTX0NGRzIJMHgxMAorI2RlZmluZSBBQVQyODcwX0FNQgkJMHgxMQorI2RlZmluZSBBQVQyODcwX0FMUzAJCTB4MTIKKyNkZWZpbmUgQUFUMjg3MF9BTFMxCQkweDEzCisjZGVmaW5lIEFBVDI4NzBfQUxTMgkJMHgxNAorI2RlZmluZSBBQVQyODcwX0FMUzMJCTB4MTUKKyNkZWZpbmUgQUFUMjg3MF9BTFM0CQkweDE2CisjZGVmaW5lIEFBVDI4NzBfQUxTNQkJMHgxNworI2RlZmluZSBBQVQyODcwX0FMUzYJCTB4MTgKKyNkZWZpbmUgQUFUMjg3MF9BTFM3CQkweDE5CisjZGVmaW5lIEFBVDI4NzBfQUxTOAkJMHgxQQorI2RlZmluZSBBQVQyODcwX0FMUzkJCTB4MUIKKyNkZWZpbmUgQUFUMjg3MF9BTFNBCQkweDFDCisjZGVmaW5lIEFBVDI4NzBfQUxTQgkJMHgxRAorI2RlZmluZSBBQVQyODcwX0FMU0MJCTB4MUUKKyNkZWZpbmUgQUFUMjg3MF9BTFNECQkweDFGCisjZGVmaW5lIEFBVDI4NzBfQUxTRQkJMHgyMAorI2RlZmluZSBBQVQyODcwX0FMU0YJCTB4MjEKKyNkZWZpbmUgQUFUMjg3MF9TVUJfU0VUCQkweDIyCisjZGVmaW5lIEFBVDI4NzBfU1VCX0NUUkwJMHgyMworI2RlZmluZSBBQVQyODcwX0xET19BQgkJMHgyNAorI2RlZmluZSBBQVQyODcwX0xET19DRAkJMHgyNQorI2RlZmluZSBBQVQyODcwX0xET19FTgkJMHgyNgorI2RlZmluZSBBQVQyODcwX1JFR19OVU0JCTB4MjcKKworLyogRGV2aWNlIElEcyAqLworZW51bSBhYXQyODcwX2lkIHsKKwlBQVQyODcwX0lEX0JMLAorCUFBVDI4NzBfSURfTERPQSwKKwlBQVQyODcwX0lEX0xET0IsCisJQUFUMjg3MF9JRF9MRE9DLAorCUFBVDI4NzBfSURfTERPRAorfTsKKworLyogQmFja2xpZ2h0IGNoYW5uZWxzICovCisjZGVmaW5lIEFBVDI4NzBfQkxfQ0gxCQkweDAxCisjZGVmaW5lIEFBVDI4NzBfQkxfQ0gyCQkweDAyCisjZGVmaW5lIEFBVDI4NzBfQkxfQ0gzCQkweDA0CisjZGVmaW5lIEFBVDI4NzBfQkxfQ0g0CQkweDA4CisjZGVmaW5lIEFBVDI4NzBfQkxfQ0g1CQkweDEwCisjZGVmaW5lIEFBVDI4NzBfQkxfQ0g2CQkweDIwCisjZGVmaW5lIEFBVDI4NzBfQkxfQ0g3CQkweDQwCisjZGVmaW5lIEFBVDI4NzBfQkxfQ0g4CQkweDgwCisjZGVmaW5lIEFBVDI4NzBfQkxfQ0hfQUxMCTB4RkYKKworLyogQmFja2xpZ2h0IGN1cnJlbnQgbWFnbml0dWRlIChtQSkgKi8KK2VudW0gYWF0Mjg3MF9jdXJyZW50IHsKKwlBQVQyODcwX0NVUlJFTlRfMF80NSA9IDEsCisJQUFUMjg3MF9DVVJSRU5UXzBfOTAsCisJQUFUMjg3MF9DVVJSRU5UXzFfODAsCisJQUFUMjg3MF9DVVJSRU5UXzJfNzAsCisJQUFUMjg3MF9DVVJSRU5UXzNfNjAsCisJQUFUMjg3MF9DVVJSRU5UXzRfNTAsCisJQUFUMjg3MF9DVVJSRU5UXzVfNDAsCisJQUFUMjg3MF9DVVJSRU5UXzZfMzAsCisJQUFUMjg3MF9DVVJSRU5UXzdfMjAsCisJQUFUMjg3MF9DVVJSRU5UXzhfMTAsCisJQUFUMjg3MF9DVVJSRU5UXzlfMDAsCisJQUFUMjg3MF9DVVJSRU5UXzlfOTAsCisJQUFUMjg3MF9DVVJSRU5UXzEwXzgsCisJQUFUMjg3MF9DVVJSRU5UXzExXzcsCisJQUFUMjg3MF9DVVJSRU5UXzEyXzYsCisJQUFUMjg3MF9DVVJSRU5UXzEzXzUsCisJQUFUMjg3MF9DVVJSRU5UXzE0XzQsCisJQUFUMjg3MF9DVVJSRU5UXzE1XzMsCisJQUFUMjg3MF9DVVJSRU5UXzE2XzIsCisJQUFUMjg3MF9DVVJSRU5UXzE3XzEsCisJQUFUMjg3MF9DVVJSRU5UXzE4XzAsCisJQUFUMjg3MF9DVVJSRU5UXzE4XzksCisJQUFUMjg3MF9DVVJSRU5UXzE5XzgsCisJQUFUMjg3MF9DVVJSRU5UXzIwXzcsCisJQUFUMjg3MF9DVVJSRU5UXzIxXzYsCisJQUFUMjg3MF9DVVJSRU5UXzIyXzUsCisJQUFUMjg3MF9DVVJSRU5UXzIzXzQsCisJQUFUMjg3MF9DVVJSRU5UXzI0XzMsCisJQUFUMjg3MF9DVVJSRU5UXzI1XzIsCisJQUFUMjg3MF9DVVJSRU5UXzI2XzEsCisJQUFUMjg3MF9DVVJSRU5UXzI3XzAsCisJQUFUMjg3MF9DVVJSRU5UXzI3XzkKK307CisKK3N0cnVjdCBhYXQyODcwX3JlZ2lzdGVyIHsKKwlib29sIHJlYWRhYmxlOworCWJvb2wgd3JpdGVhYmxlOworCXU4IHZhbHVlOworfTsKKworc3RydWN0IGFhdDI4NzBfZGF0YSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisKKwlzdHJ1Y3QgbXV0ZXggaW9fbG9jazsKKwlzdHJ1Y3QgYWF0Mjg3MF9yZWdpc3RlciAqcmVnX2NhY2hlOyAvKiByZWdpc3RlciBjYWNoZSAqLworCWludCBlbl9waW47IC8qIGVuYWJsZSBHUElPIHBpbiAoaWYgPCAwLCBpZ25vcmUgdGhpcyB2YWx1ZSkgKi8KKwlib29sIGlzX2VuYWJsZTsKKworCS8qIGluaXQgYW5kIHVuaW5pdCBmb3IgcGxhdGZvcm0gc3BlY2lmaWVkICovCisJaW50ICgqaW5pdCkoc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCk7CisJdm9pZCAoKnVuaW5pdCkoc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCk7CisKKwkvKiBpMmMgaW8gZnVuY250aW9ucyAqLworCWludCAoKnJlYWQpKHN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzAsIHU4IGFkZHIsIHU4ICp2YWwpOworCWludCAoKndyaXRlKShzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwLCB1OCBhZGRyLCB1OCB2YWwpOworCWludCAoKnVwZGF0ZSkoc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCwgdTggYWRkciwgdTggbWFzaywgdTggdmFsKTsKKworCS8qIGZvciBkZWJ1Z2ZzICovCisJc3RydWN0IGRlbnRyeSAqZGVudHJ5X3Jvb3Q7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5X3JlZzsKK307CisKK3N0cnVjdCBhYXQyODcwX3N1YmRldl9pbmZvIHsKKwlpbnQgaWQ7CisJY29uc3QgY2hhciAqbmFtZTsKKwl2b2lkICpwbGF0Zm9ybV9kYXRhOworfTsKKworc3RydWN0IGFhdDI4NzBfcGxhdGZvcm1fZGF0YSB7CisJaW50IGVuX3BpbjsgLyogZW5hYmxlIEdQSU8gcGluIChpZiA8IDAsIGlnbm9yZSB0aGlzIHZhbHVlKSAqLworCisJc3RydWN0IGFhdDI4NzBfc3ViZGV2X2luZm8gKnN1YmRldnM7CisJaW50IG51bV9zdWJkZXZzOworCisJLyogaW5pdCBhbmQgdW5pbml0IGZvciBwbGF0Zm9ybSBzcGVjaWZpZWQgKi8KKwlpbnQgKCppbml0KShzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwKTsKKwl2b2lkICgqdW5pbml0KShzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwKTsKK307CisKK3N0cnVjdCBhYXQyODcwX2JsX3BsYXRmb3JtX2RhdGEgeworCS8qIGJhY2tsaWdodCBjaGFubmVscywgZGVmYXVsdCBpcyBBQVQyODcwX0JMX0NIX0FMTCAqLworCWludCBjaGFubmVsczsKKwkvKiBiYWNrbGlnaHQgY3VycmVudCBtYWduaXR1ZGUsIGRlZmF1bHQgaXMgQUFUMjg3MF9DVVJSRU5UXzI3XzkgKi8KKwlpbnQgbWF4X2N1cnJlbnQ7CisJLyogbWF4aW11bSBicmlnaHRuZXNzLCBkZWZhdWx0IGlzIDI1NSAqLworCWludCBtYXhfYnJpZ2h0bmVzczsKK307CisKKyNlbmRpZiAvKiBfX0xJTlVYX01GRF9BQVQyODcwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2FiODUwMC5oIGIvaW5jbHVkZS9saW51eC9tZmQvYWI4NTAwLmgKaW5kZXggYjMxODQzMC4uODM4YzZiNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvYWI4NTAwLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvYWI4NTAwLmgKQEAgLTI4LDYgKzI4LDcgQEAKICNkZWZpbmUgQUI4NTAwX0lOVEVSUlVQVAkweEUKICNkZWZpbmUgQUI4NTAwX1JUQwkJMHhGCiAjZGVmaW5lIEFCODUwMF9NSVNDCQkweDEwCisjZGVmaW5lIEFCODUwMF9ERVZFTE9QTUVOVAkweDExCiAjZGVmaW5lIEFCODUwMF9ERUJVRwkJMHgxMgogI2RlZmluZSBBQjg1MDBfUFJPRF9URVNUCTB4MTMKICNkZWZpbmUgQUI4NTAwX09UUF9FTVVMCQkweDE1CkBAIC03NCwxMyArNzUsNiBAQAogI2RlZmluZSBBQjg1MDBfSU5UX0FDQ19ERVRFQ1RfMjFEQl9GCTM3CiAjZGVmaW5lIEFCODUwMF9JTlRfQUNDX0RFVEVDVF8yMURCX1IJMzgKICNkZWZpbmUgQUI4NTAwX0lOVF9HUF9TV19BRENfQ09OVl9FTkQJMzkKLSNkZWZpbmUgQUI4NTAwX0lOVF9BQ0NfREVURUNUXzFEQl9GCTMzCi0jZGVmaW5lIEFCODUwMF9JTlRfQUNDX0RFVEVDVF8xREJfUgkzNAotI2RlZmluZSBBQjg1MDBfSU5UX0FDQ19ERVRFQ1RfMjJEQl9GCTM1Ci0jZGVmaW5lIEFCODUwMF9JTlRfQUNDX0RFVEVDVF8yMkRCX1IJMzYKLSNkZWZpbmUgQUI4NTAwX0lOVF9BQ0NfREVURUNUXzIxREJfRgkzNwotI2RlZmluZSBBQjg1MDBfSU5UX0FDQ19ERVRFQ1RfMjFEQl9SCTM4Ci0jZGVmaW5lIEFCODUwMF9JTlRfR1BfU1dfQURDX0NPTlZfRU5ECTM5CiAjZGVmaW5lIEFCODUwMF9JTlRfR1BJTzZSCQk0MAogI2RlZmluZSBBQjg1MDBfSU5UX0dQSU83UgkJNDEKICNkZWZpbmUgQUI4NTAwX0lOVF9HUElPOFIJCTQyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9tYXg4OTk3LmggYi9pbmNsdWRlL2xpbnV4L21mZC9tYXg4OTk3LmgKaW5kZXggNjA5MzFkMC4uMGJiZDEzZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvbWF4ODk5Ny5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL21heDg5OTcuaApAQCAtMTA3LDExICsxMDcsMTYgQEAKIAl1bnNpZ25lZCBpbnQgYnVjazVfdm9sdGFnZVs4XTsKIAlib29sIGJ1Y2s1X2dwaW9kdnM7CiAKKwkvKiAtLS0tIENoYXJnZXIgY29udHJvbCAtLS0tICovCisJLyogZW9jIHN0YW5kcyBmb3IgJ2VuZCBvZiBjaGFyZ2UnICovCisJaW50IGVvY19tQTsgLyogNTAgfiAyMDBtQSBieSAxMG1BIHN0ZXAgKi8KKwkvKiBjaGFyZ2UgRnVsbCBUaW1lb3V0ICovCisJaW50IHRpbWVvdXQ7IC8qIDAgKG5vIHRpbWVvdXQpLCA1LCA2LCA3IGhvdXJzICovCisKIAkvKiBNVUlDOiBOb3QgaW1wbGVtZW50ZWQgKi8KIAkvKiBIQVBUSUM6IE5vdCBpbXBsZW1lbnRlZCAqLwogCS8qIFJUQzogTm90IGltcGxlbWVudGVkICovCiAJLyogRmxhc2g6IE5vdCBpbXBsZW1lbnRlZCAqLwotCS8qIENoYXJnZXIgY29udHJvbDogTm90IGltcGxlbWVudGVkICovCiB9OwogCiAjZW5kaWYgLyogX19MSU5VWF9NRkRfTUFYODk5OF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9tYXg4OTk4LmggYi9pbmNsdWRlL2xpbnV4L21mZC9tYXg4OTk4LmgKaW5kZXggNjFkYWExNi4uZjRmMGRmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvbWF4ODk5OC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL21heDg5OTguaApAQCAtODcsNiArODcsMTUgQEAKICAqIEB3YWtldXA6IEFsbG93IHRvIHdha2UgdXAgZnJvbSBzdXNwZW5kCiAgKiBAcnRjX2RlbGF5OiBMUDM5NzQgUlRDIGNoaXAgYnVnIHRoYXQgcmVxdWlyZXMgZGVsYXkgYWZ0ZXIgYSByZWdpc3RlcgogICogd3JpdGUgYmVmb3JlIHJlYWRpbmcgaXQuCisgKiBAZW9jOiBFbmQgb2YgQ2hhcmdlIExldmVsIGluIHBlcmNlbnQ6IDEwJSB+IDQ1JSBieSA1JSBzdGVwCisgKiAgIElmIGl0IGVxdWFscyAwLCBsZWF2ZSBpdCB1bmNoYW5nZWQuCisgKiAgIE90aGVyd2lzZSwgaXQgaXMgYSBpbnZhbGlkIHZhbHVlLgorICogQHJlc3RhcnQ6IFJlc3RhcnQgTGV2ZWwgaW4gbVY6IDEwMCwgMTUwLCAyMDAsIGFuZCAtMSBmb3IgZGlzYWJsZS4KKyAqICAgSWYgaXQgZXF1YWxzIDAsIGxlYXZlIGl0IHVuY2hhbmdlZC4KKyAqICAgT3RoZXJ3aXNlLCBpdCBpcyBhIGludmFsaWQgdmFsdWUuCisgKiBAdGltZW91dDogRnVsbCBUaW1lb3V0IGluIGhvdXJzOiA1LCA2LCA3LCBhbmQgLTEgZm9yIGRpc2FibGUuCisgKiAgIElmIGl0IGVxdWFscyAwLCBsZWF2ZSBpdCB1bmNoYW5nZWQuCisgKiAgIE90aGVyd2lzZSwgbGVhdmUgaXQgdW5jaGFuZ2VkLgogICovCiBzdHJ1Y3QgbWF4ODk5OF9wbGF0Zm9ybV9kYXRhIHsKIAlzdHJ1Y3QgbWF4ODk5OF9yZWd1bGF0b3JfZGF0YQkqcmVndWxhdG9yczsKQEAgLTEwNyw2ICsxMTYsOSBAQAogCWludAkJCQlidWNrMl9kZWZhdWx0X2lkeDsKIAlib29sCQkJCXdha2V1cDsKIAlib29sCQkJCXJ0Y19kZWxheTsKKwlpbnQJCQkJZW9jOworCWludAkJCQlyZXN0YXJ0OworCWludAkJCQl0aW1lb3V0OwogfTsKIAogI2VuZGlmIC8qICBfX0xJTlVYX01GRF9NQVg4OTk4X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3N0bXBlLmggYi9pbmNsdWRlL2xpbnV4L21mZC9zdG1wZS5oCmluZGV4IGU3NjJjMjcuLmJlMWFmN2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3N0bXBlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvc3RtcGUuaApAQCAtNTcsNiArNTcsNyBAQAogICogQGlycV9sb2NrOiBJUlEgYnVzIGxvY2sKICAqIEBkZXY6IGRldmljZSwgbW9zdGx5IGZvciBkZXZfZGJnKCkKICAqIEBpMmM6IGkyYyBjbGllbnQKKyAqIEBwYXJ0bnVtOiBwYXJ0IG51bWJlcgogICogQHZhcmlhbnQ6IHRoZSBkZXRlY3RlZCBTVE1QRSBtb2RlbCBudW1iZXIKICAqIEByZWdzOiBsaXN0IG9mIGFkZHJlc3NlcyBvZiByZWdpc3RlcnMgd2hpY2ggYXJlIGF0IGRpZmZlcmVudCBhZGRyZXNzZXMgb24KICAqCSAgZGlmZmVyZW50IHZhcmlhbnRzLiAgSW5kZXhlZCBieSBvbmUgb2YgU1RNUEVfSURYXyouCkBAIC0xMjEsNiArMTIyLDggQEAKICAqIEBub3JlcXVlc3RfbWFzazogYml0bWFzayBzcGVjaWZ5aW5nIHdoaWNoIEdQSU9zIHNob3VsZCBfbm90XyBiZQogICoJCSAgICByZXF1ZXN0YWJsZSBkdWUgdG8gZGlmZmVyZW50IHVzYWdlIChlLmcuIHRvdWNoLCBrZXlwYWQpCiAgKgkJICAgIFNUTVBFX0dQSU9fTk9SRVFfKiBtYWNyb3MgY2FuIGJlIHVzZWQgaGVyZS4KKyAqIEBzZXR1cDogYm9hcmQgc3BlY2lmaWMgc2V0dXAgY2FsbGJhY2suCisgKiBAcmVtb3ZlOiBib2FyZCBzcGVjaWZpYyByZW1vdmUgY2FsbGJhY2sKICAqLwogc3RydWN0IHN0bXBlX2dwaW9fcGxhdGZvcm1fZGF0YSB7CiAJaW50IGdwaW9fYmFzZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3RwczY1OTEwLmggYi9pbmNsdWRlL2xpbnV4L21mZC90cHM2NTkxMC5oCmluZGV4IDczNTcyYzYuLjgyYjRjODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3RwczY1OTEwLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvdHBzNjU5MTAuaApAQCAtNzkxLDYgKzc5MSw3IEBACiB2b2lkIHRwczY1OTEwX2dwaW9faW5pdChzdHJ1Y3QgdHBzNjU5MTAgKnRwczY1OTEwLCBpbnQgZ3Bpb19iYXNlKTsKIGludCB0cHM2NTkxMF9pcnFfaW5pdChzdHJ1Y3QgdHBzNjU5MTAgKnRwczY1OTEwLCBpbnQgaXJxLAogCQlzdHJ1Y3QgdHBzNjU5MTBfcGxhdGZvcm1fZGF0YSAqcGRhdGEpOworaW50IHRwczY1OTEwX2lycV9leGl0KHN0cnVjdCB0cHM2NTkxMCAqdHBzNjU5MTApOwogCiBzdGF0aWMgaW5saW5lIGludCB0cHM2NTkxMF9jaGlwX2lkKHN0cnVjdCB0cHM2NTkxMCAqdHBzNjU5MTApCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC90cHM2NTkxMi5oIGIvaW5jbHVkZS9saW51eC9tZmQvdHBzNjU5MTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWNlYWI0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvdHBzNjU5MTIuaApAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqIHRwczY1OTEyLmggIC0tICBUSSBUUFM2NTkxeAorICoKKyAqIENvcHlyaWdodCAyMDExIFRleGFzIEluc3RydW1lbnRzIEluYy4KKyAqCisgKiBBdXRob3I6IE1hcmdhcml0YSBPbGF5YSA8bWFnaUBzbGltbG9naWMuY28udWs+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NRkRfVFBTNjU5MTJfSAorI2RlZmluZSBfX0xJTlVYX01GRF9UUFM2NTkxMl9ICisKKy8qIFRQUyByZWd1bGF0b3IgdHlwZSBsaXN0ICovCisjZGVmaW5lIFJFR1VMQVRPUl9MRE8JCTAKKyNkZWZpbmUgUkVHVUxBVE9SX0RDREMJCTEKKworLyoKKyAqIExpc3Qgb2YgcmVnaXN0ZXJzIGZvciBUUFM2NTkxMgorICovCisKKyNkZWZpbmUgVFBTNjU5MTJfRENEQzFfQ1RSTAkJMHgwMAorI2RlZmluZSBUUFM2NTkxMl9EQ0RDMl9DVFJMCQkweDAxCisjZGVmaW5lIFRQUzY1OTEyX0RDREMzX0NUUkwJCTB4MDIKKyNkZWZpbmUgVFBTNjU5MTJfRENEQzRfQ1RSTAkJMHgwMworI2RlZmluZSBUUFM2NTkxMl9EQ0RDMV9PUAkJMHgwNAorI2RlZmluZSBUUFM2NTkxMl9EQ0RDMV9BVlMJCTB4MDUKKyNkZWZpbmUgVFBTNjU5MTJfRENEQzFfTElNSVQJCTB4MDYKKyNkZWZpbmUgVFBTNjU5MTJfRENEQzJfT1AJCTB4MDcKKyNkZWZpbmUgVFBTNjU5MTJfRENEQzJfQVZTCQkweDA4CisjZGVmaW5lIFRQUzY1OTEyX0RDREMyX0xJTUlUCQkweDA5CisjZGVmaW5lIFRQUzY1OTEyX0RDREMzX09QCQkweDBBCisjZGVmaW5lIFRQUzY1OTEyX0RDREMzX0FWUwkJMHgwQgorI2RlZmluZSBUUFM2NTkxMl9EQ0RDM19MSU1JVAkJMHgwQworI2RlZmluZSBUUFM2NTkxMl9EQ0RDNF9PUAkJMHgwRAorI2RlZmluZSBUUFM2NTkxMl9EQ0RDNF9BVlMJCTB4MEUKKyNkZWZpbmUgVFBTNjU5MTJfRENEQzRfTElNSVQJCTB4MEYKKyNkZWZpbmUgVFBTNjU5MTJfTERPMV9PUAkJMHgxMAorI2RlZmluZSBUUFM2NTkxMl9MRE8xX0FWUwkJMHgxMQorI2RlZmluZSBUUFM2NTkxMl9MRE8xX0xJTUlUCQkweDEyCisjZGVmaW5lIFRQUzY1OTEyX0xETzJfT1AJCTB4MTMKKyNkZWZpbmUgVFBTNjU5MTJfTERPMl9BVlMJCTB4MTQKKyNkZWZpbmUgVFBTNjU5MTJfTERPMl9MSU1JVAkJMHgxNQorI2RlZmluZSBUUFM2NTkxMl9MRE8zX09QCQkweDE2CisjZGVmaW5lIFRQUzY1OTEyX0xETzNfQVZTCQkweDE3CisjZGVmaW5lIFRQUzY1OTEyX0xETzNfTElNSVQJCTB4MTgKKyNkZWZpbmUgVFBTNjU5MTJfTERPNF9PUAkJMHgxOQorI2RlZmluZSBUUFM2NTkxMl9MRE80X0FWUwkJMHgxQQorI2RlZmluZSBUUFM2NTkxMl9MRE80X0xJTUlUCQkweDFCCisjZGVmaW5lIFRQUzY1OTEyX0xETzUJCQkweDFDCisjZGVmaW5lIFRQUzY1OTEyX0xETzYJCQkweDFECisjZGVmaW5lIFRQUzY1OTEyX0xETzcJCQkweDFFCisjZGVmaW5lIFRQUzY1OTEyX0xETzgJCQkweDFGCisjZGVmaW5lIFRQUzY1OTEyX0xETzkJCQkweDIwCisjZGVmaW5lIFRQUzY1OTEyX0xETzEwCQkJMHgyMQorI2RlZmluZSBUUFM2NTkxMl9USFJNCQkJMHgyMgorI2RlZmluZSBUUFM2NTkxMl9DTEszMk9VVAkJMHgyMworI2RlZmluZSBUUFM2NTkxMl9ERVZDVFJMCQkweDI0CisjZGVmaW5lIFRQUzY1OTEyX0RFVkNUUkwyCQkweDI1CisjZGVmaW5lIFRQUzY1OTEyX0kyQ19TUElfQ0ZHCQkweDI2CisjZGVmaW5lIFRQUzY1OTEyX0tFRVBfT04JCTB4MjcKKyNkZWZpbmUgVFBTNjU5MTJfS0VFUF9PTjIJCTB4MjgKKyNkZWZpbmUgVFBTNjU5MTJfU0VUX09GRjEJCTB4MjkKKyNkZWZpbmUgVFBTNjU5MTJfU0VUX09GRjIJCTB4MkEKKyNkZWZpbmUgVFBTNjU5MTJfREVGX1ZPTFQJCTB4MkIKKyNkZWZpbmUgVFBTNjU5MTJfREVGX1ZPTFRfTUFQUElORwkweDJDCisjZGVmaW5lIFRQUzY1OTEyX0RJU0NIQVJHRQkJMHgyRAorI2RlZmluZSBUUFM2NTkxMl9ESVNDSEFSR0UyCQkweDJFCisjZGVmaW5lIFRQUzY1OTEyX0VOMV9TRVQxCQkweDJGCisjZGVmaW5lIFRQUzY1OTEyX0VOMV9TRVQyCQkweDMwCisjZGVmaW5lIFRQUzY1OTEyX0VOMl9TRVQxCQkweDMxCisjZGVmaW5lIFRQUzY1OTEyX0VOMl9TRVQyCQkweDMyCisjZGVmaW5lIFRQUzY1OTEyX0VOM19TRVQxCQkweDMzCisjZGVmaW5lIFRQUzY1OTEyX0VOM19TRVQyCQkweDM0CisjZGVmaW5lIFRQUzY1OTEyX0VONF9TRVQxCQkweDM1CisjZGVmaW5lIFRQUzY1OTEyX0VONF9TRVQyCQkweDM2CisjZGVmaW5lIFRQUzY1OTEyX1BHT09ECQkJMHgzNworI2RlZmluZSBUUFM2NTkxMl9QR09PRDIJCQkweDM4CisjZGVmaW5lIFRQUzY1OTEyX0lOVF9TVFMJCTB4MzkKKyNkZWZpbmUgVFBTNjU5MTJfSU5UX01TSwkJMHgzQQorI2RlZmluZSBUUFM2NTkxMl9JTlRfU1RTMgkJMHgzQgorI2RlZmluZSBUUFM2NTkxMl9JTlRfTVNLMgkJMHgzQworI2RlZmluZSBUUFM2NTkxMl9JTlRfU1RTMwkJMHgzRAorI2RlZmluZSBUUFM2NTkxMl9JTlRfTVNLMwkJMHgzRQorI2RlZmluZSBUUFM2NTkxMl9JTlRfU1RTNAkJMHgzRgorI2RlZmluZSBUUFM2NTkxMl9JTlRfTVNLNAkJMHg0MAorI2RlZmluZSBUUFM2NTkxMl9HUElPMQkJCTB4NDEKKyNkZWZpbmUgVFBTNjU5MTJfR1BJTzIJCQkweDQyCisjZGVmaW5lIFRQUzY1OTEyX0dQSU8zCQkJMHg0MworI2RlZmluZSBUUFM2NTkxMl9HUElPNAkJCTB4NDQKKyNkZWZpbmUgVFBTNjU5MTJfR1BJTzUJCQkweDQ1CisjZGVmaW5lIFRQUzY1OTEyX1ZNT04JCQkweDQ2CisjZGVmaW5lIFRQUzY1OTEyX0xFREFfQ1RSTDEJCTB4NDcKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQV9DVFJMMgkJMHg0OAorI2RlZmluZSBUUFM2NTkxMl9MRURBX0NUUkwzCQkweDQ5CisjZGVmaW5lIFRQUzY1OTEyX0xFREFfQ1RSTDQJCTB4NEEKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQV9DVFJMNQkJMHg0QgorI2RlZmluZSBUUFM2NTkxMl9MRURBX0NUUkw2CQkweDRDCisjZGVmaW5lIFRQUzY1OTEyX0xFREFfQ1RSTDcJCTB4NEQKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQV9DVFJMOAkJMHg0RQorI2RlZmluZSBUUFM2NTkxMl9MRURCX0NUUkwxCQkweDRGCisjZGVmaW5lIFRQUzY1OTEyX0xFREJfQ1RSTDIJCTB4NTAKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQl9DVFJMMwkJMHg1MQorI2RlZmluZSBUUFM2NTkxMl9MRURCX0NUUkw0CQkweDUyCisjZGVmaW5lIFRQUzY1OTEyX0xFREJfQ1RSTDUJCTB4NTMKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQl9DVFJMNgkJMHg1NAorI2RlZmluZSBUUFM2NTkxMl9MRURCX0NUUkw3CQkweDU1CisjZGVmaW5lIFRQUzY1OTEyX0xFREJfQ1RSTDgJCTB4NTYKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQ19DVFJMMQkJMHg1NworI2RlZmluZSBUUFM2NTkxMl9MRURDX0NUUkwyCQkweDU4CisjZGVmaW5lIFRQUzY1OTEyX0xFRENfQ1RSTDMJCTB4NTkKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQ19DVFJMNAkJMHg1QQorI2RlZmluZSBUUFM2NTkxMl9MRURDX0NUUkw1CQkweDVCCisjZGVmaW5lIFRQUzY1OTEyX0xFRENfQ1RSTDYJCTB4NUMKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQ19DVFJMNwkJMHg1RAorI2RlZmluZSBUUFM2NTkxMl9MRURDX0NUUkw4CQkweDVFCisjZGVmaW5lIFRQUzY1OTEyX0xFRF9SQU1QX1VQX1RJTUUJMHg1RgorI2RlZmluZSBUUFM2NTkxMl9MRURfUkFNUF9ET1dOX1RJTUUJMHg2MAorI2RlZmluZSBUUFM2NTkxMl9MRURfU0VRX0VOCQkweDYxCisjZGVmaW5lIFRQUzY1OTEyX0xPQURTV0lUQ0gJCTB4NjIKKyNkZWZpbmUgVFBTNjU5MTJfU1BBUkUJCQkweDYzCisjZGVmaW5lIFRQUzY1OTEyX1ZFUk5VTQkJCTB4NjQKKyNkZWZpbmUgVFBTNjU5MVhfTUFYX1JFR0lTVEVSCQkweDY0CisKKy8qIElSUSBEZWZpbml0aW9ucyAqLworI2RlZmluZSBUUFM2NTkxMl9JUlFfUFdSSE9MRF9GCQkwCisjZGVmaW5lIFRQUzY1OTEyX0lSUV9WTU9OCQkxCisjZGVmaW5lIFRQUzY1OTEyX0lSUV9QV1JPTgkJMgorI2RlZmluZSBUUFM2NTkxMl9JUlFfUFdST05fTFAJCTMKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX1BXUkhPTERfUgkJNAorI2RlZmluZSBUUFM2NTkxMl9JUlFfSE9URElFCQk1CisjZGVmaW5lIFRQUzY1OTEyX0lSUV9HUElPMV9SCQk2CisjZGVmaW5lIFRQUzY1OTEyX0lSUV9HUElPMV9GCQk3CisjZGVmaW5lIFRQUzY1OTEyX0lSUV9HUElPMl9SCQk4CisjZGVmaW5lIFRQUzY1OTEyX0lSUV9HUElPMl9GCQk5CisjZGVmaW5lIFRQUzY1OTEyX0lSUV9HUElPM19SCQkxMAorI2RlZmluZSBUUFM2NTkxMl9JUlFfR1BJTzNfRgkJMTEKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX0dQSU80X1IJCTEyCisjZGVmaW5lIFRQUzY1OTEyX0lSUV9HUElPNF9GCQkxMworI2RlZmluZSBUUFM2NTkxMl9JUlFfR1BJTzVfUgkJMTQKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX0dQSU81X0YJCTE1CisjZGVmaW5lIFRQUzY1OTEyX0lSUV9QR09PRF9EQ0RDMQkxNgorI2RlZmluZSBUUFM2NTkxMl9JUlFfUEdPT0RfRENEQzIJMTcKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX1BHT09EX0RDREMzCTE4CisjZGVmaW5lIFRQUzY1OTEyX0lSUV9QR09PRF9EQ0RDNAkxOQorI2RlZmluZSBUUFM2NTkxMl9JUlFfUEdPT0RfTERPMQkJMjAKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX1BHT09EX0xETzIJCTIxCisjZGVmaW5lIFRQUzY1OTEyX0lSUV9QR09PRF9MRE8zCQkyMgorI2RlZmluZSBUUFM2NTkxMl9JUlFfUEdPT0RfTERPNAkJMjMKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX1BHT09EX0xETzUJCTI0CisjZGVmaW5lIFRQUzY1OTEyX0lSUV9QR09PRF9MRE82CQkyNQorI2RlZmluZSBUUFM2NTkxMl9JUlFfUEdPT0RfTERPNwkJMjYKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX1BHT09EX0xEMDgJCTI3CisjZGVmaW5lIFRQUzY1OTEyX0lSUV9QR09PRF9MRE85CQkyOAorI2RlZmluZSBUUFM2NTkxMl9JUlFfUEdPT0RfTERPMTAJMjkKKworI2RlZmluZSBUUFM2NTkxMl9OVU1fSVJRCQkzMAorCisvKiBHUElPIDEgYW5kIDIgUmVnaXN0ZXIgRGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgR1BJT19TTEVFUF9NQVNLCQkJMHg4MAorI2RlZmluZSBHUElPX1NMRUVQX1NISUZUCQk3CisjZGVmaW5lIEdQSU9fREVCX01BU0sJCQkweDEwCisjZGVmaW5lIEdQSU9fREVCX1NISUZUCQkJNAorI2RlZmluZSBHUElPX0NGR19NQVNLCQkJMHgwNAorI2RlZmluZSBHUElPX0NGR19TSElGVAkJCTIKKyNkZWZpbmUgR1BJT19TVFNfTUFTSwkJCTB4MDIKKyNkZWZpbmUgR1BJT19TVFNfU0hJRlQJCQkxCisjZGVmaW5lIEdQSU9fU0VUX01BU0sJCQkweDAxCisjZGVmaW5lIEdQSU9fU0VUX1NISUZUCQkJMAorCisvKiBHUElPIDMgUmVnaXN0ZXIgRGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgR1BJTzNfU0xFRVBfTUFTSwkJMHg4MAorI2RlZmluZSBHUElPM19TTEVFUF9TSElGVAkJNworI2RlZmluZSBHUElPM19TRUxfTUFTSwkJCTB4NDAKKyNkZWZpbmUgR1BJTzNfU0VMX1NISUZUCQkJNgorI2RlZmluZSBHUElPM19PREVOX01BU0sJCQkweDIwCisjZGVmaW5lIEdQSU8zX09ERU5fU0hJRlQJCTUKKyNkZWZpbmUgR1BJTzNfREVCX01BU0sJCQkweDEwCisjZGVmaW5lIEdQSU8zX0RFQl9TSElGVAkJCTQKKyNkZWZpbmUgR1BJTzNfUERFTl9NQVNLCQkJMHgwOAorI2RlZmluZSBHUElPM19QREVOX1NISUZUCQkzCisjZGVmaW5lIEdQSU8zX0NGR19NQVNLCQkJMHgwNAorI2RlZmluZSBHUElPM19DRkdfU0hJRlQJCQkyCisjZGVmaW5lIEdQSU8zX1NUU19NQVNLCQkJMHgwMgorI2RlZmluZSBHUElPM19TVFNfU0hJRlQJCQkxCisjZGVmaW5lIEdQSU8zX1NFVF9NQVNLCQkJMHgwMQorI2RlZmluZSBHUElPM19TRVRfU0hJRlQJCQkwCisKKy8qIEdQSU8gNCBSZWdpc3RlciBEZWZpbml0aW9ucyAqLworI2RlZmluZSBHUElPNF9TTEVFUF9NQVNLCQkweDgwCisjZGVmaW5lIEdQSU80X1NMRUVQX1NISUZUCQk3CisjZGVmaW5lIEdQSU80X1NFTF9NQVNLCQkJMHg0MAorI2RlZmluZSBHUElPNF9TRUxfU0hJRlQJCQk2CisjZGVmaW5lIEdQSU80X09ERU5fTUFTSwkJCTB4MjAKKyNkZWZpbmUgR1BJTzRfT0RFTl9TSElGVAkJNQorI2RlZmluZSBHUElPNF9ERUJfTUFTSwkJCTB4MTAKKyNkZWZpbmUgR1BJTzRfREVCX1NISUZUCQkJNAorI2RlZmluZSBHUElPNF9QREVOX01BU0sJCQkweDA4CisjZGVmaW5lIEdQSU80X1BERU5fU0hJRlQJCTMKKyNkZWZpbmUgR1BJTzRfQ0ZHX01BU0sJCQkweDA0CisjZGVmaW5lIEdQSU80X0NGR19TSElGVAkJCTIKKyNkZWZpbmUgR1BJTzRfU1RTX01BU0sJCQkweDAyCisjZGVmaW5lIEdQSU80X1NUU19TSElGVAkJCTEKKyNkZWZpbmUgR1BJTzRfU0VUX01BU0sJCQkweDAxCisjZGVmaW5lIEdQSU80X1NFVF9TSElGVAkJCTAKKworLyogUmVnaXN0ZXIgVEhFUk0gICgweDgwKSByZWdpc3Rlci5SZWdpc3RlckRlc2NyaXB0aW9uICovCisjZGVmaW5lIFRIRVJNX1RIRVJNX0hEX01BU0sJCTB4MjAKKyNkZWZpbmUgVEhFUk1fVEhFUk1fSERfU0hJRlQJCTUKKyNkZWZpbmUgVEhFUk1fVEhFUk1fVFNfTUFTSwkJMHgxMAorI2RlZmluZSBUSEVSTV9USEVSTV9UU19TSElGVAkJNAorI2RlZmluZSBUSEVSTV9USEVSTV9IRFNFTF9NQVNLCQkweDBDCisjZGVmaW5lIFRIRVJNX1RIRVJNX0hEU0VMX1NISUZUCQkyCisjZGVmaW5lIFRIRVJNX1JTVkQxX01BU0sJCTB4MDIKKyNkZWZpbmUgVEhFUk1fUlNWRDFfU0hJRlQJCTEKKyNkZWZpbmUgVEhFUk1fVEhFUk1fU1RBVEVfTUFTSwkJMHgwMQorI2RlZmluZSBUSEVSTV9USEVSTV9TVEFURV9TSElGVAkJMAorCisvKiBSZWdpc3RlciBEQ0RDQ1RSTDEgcmVnaXN0ZXIuUmVnaXN0ZXJEZXNjcmlwdGlvbiAqLworI2RlZmluZSBEQ0RDQ1RSTF9WQ09OX0VOQUJMRV9NQVNLCTB4ODAKKyNkZWZpbmUgRENEQ0NUUkxfVkNPTl9FTkFCTEVfU0hJRlQJNworI2RlZmluZSBEQ0RDQ1RSTF9WQ09OX1JBTkdFMV9NQVNLCTB4NDAKKyNkZWZpbmUgRENEQ0NUUkxfVkNPTl9SQU5HRTFfU0hJRlQJNgorI2RlZmluZSBEQ0RDQ1RSTF9WQ09OX1JBTkdFMF9NQVNLCTB4MjAKKyNkZWZpbmUgRENEQ0NUUkxfVkNPTl9SQU5HRTBfU0hJRlQJNQorI2RlZmluZSBEQ0RDQ1RSTF9UU1RFUDJfTUFTSwkJMHgxMAorI2RlZmluZSBEQ0RDQ1RSTF9UU1RFUDJfU0hJRlQJCTQKKyNkZWZpbmUgRENEQ0NUUkxfVFNURVAxX01BU0sJCTB4MDgKKyNkZWZpbmUgRENEQ0NUUkxfVFNURVAxX1NISUZUCQkzCisjZGVmaW5lIERDRENDVFJMX1RTVEVQMF9NQVNLCQkweDA0CisjZGVmaW5lIERDRENDVFJMX1RTVEVQMF9TSElGVAkJMgorI2RlZmluZSBEQ0RDQ1RSTF9EQ0RDMV9NT0RFX01BU0sJMHgwMgorI2RlZmluZSBEQ0RDQ1RSTF9EQ0RDMV9NT0RFX1NISUZUCTEKKworLyogUmVnaXN0ZXIgRENEQ0NUUkwyIGFuZCBEQ0RDQ1RSTDMgcmVnaXN0ZXIuUmVnaXN0ZXJEZXNjcmlwdGlvbiAqLworI2RlZmluZSBEQ0RDQ1RSTF9UU1RFUDJfTUFTSwkJMHgxMAorI2RlZmluZSBEQ0RDQ1RSTF9UU1RFUDJfU0hJRlQJCTQKKyNkZWZpbmUgRENEQ0NUUkxfVFNURVAxX01BU0sJCTB4MDgKKyNkZWZpbmUgRENEQ0NUUkxfVFNURVAxX1NISUZUCQkzCisjZGVmaW5lIERDRENDVFJMX1RTVEVQMF9NQVNLCQkweDA0CisjZGVmaW5lIERDRENDVFJMX1RTVEVQMF9TSElGVAkJMgorI2RlZmluZSBEQ0RDQ1RSTF9EQ0RDX01PREVfTUFTSwkJMHgwMgorI2RlZmluZSBEQ0RDQ1RSTF9EQ0RDX01PREVfU0hJRlQJMQorI2RlZmluZSBEQ0RDQ1RSTF9SU1ZEMF9NQVNLCQkweDAxCisjZGVmaW5lIERDRENDVFJMX1JTVkQwX1NISUZUCQkwCisKKy8qIFJlZ2lzdGVyIERDRENDVFJMNCByZWdpc3Rlci5SZWdpc3RlckRlc2NyaXB0aW9uICovCisjZGVmaW5lIERDRENDVFJMX1JBTVBfVElNRV9NQVNLCQkweDAxCisjZGVmaW5lIERDRENDVFJMX1JBTVBfVElNRV9TSElGVAkwCisKKy8qIFJlZ2lzdGVyIERDREN4X0FWUyAqLworI2RlZmluZSBEQ0RDX0FWU19FTkFCTEVfTUFTSwkJMHg4MAorI2RlZmluZSBEQ0RDX0FWU19FTkFCTEVfU0hJRlQJCTcKKyNkZWZpbmUgRENEQ19BVlNfRUNPX01BU0sJCTB4NDAKKyNkZWZpbmUgRENEQ19BVlNfRUNPX1NISUZUCQk2CisKKy8qIFJlZ2lzdGVyIERDREN4X0xJTUlUICovCisjZGVmaW5lIERDRENfTElNSVRfUkFOR0VfTUFTSwkJMHhDMAorI2RlZmluZSBEQ0RDX0xJTUlUX1JBTkdFX1NISUZUCQk2CisjZGVmaW5lIERDRENfTElNSVRfTUFYX1NFTF9NQVNLCQkweDNGCisjZGVmaW5lIERDRENfTElNSVRfTUFYX1NFTF9TSElGVAkwCisKKy8qKgorICogc3RydWN0IHRwczY1OTEyX2JvYXJkCisgKiBCb2FyZCBwbGF0Zm9ybSBkYXQgbWF5IGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSByZWd1bGF0b3JzLgorICovCitzdHJ1Y3QgdHBzNjU5MTJfYm9hcmQgeworCWludCBpc19kY2RjMV9hdnM7CisJaW50IGlzX2RjZGMyX2F2czsKKwlpbnQgaXNfZGNkYzNfYXZzOworCWludCBpc19kY2RjNF9hdnM7CisJaW50IGlycTsKKwlpbnQgaXJxX2Jhc2U7CisJaW50IGdwaW9fYmFzZTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqdHBzNjU5MTJfcG1pY19pbml0X2RhdGE7Cit9OworCisvKioKKyAqIHN0cnVjdCB0cHM2NTkxMiAtIHRwczY1OTEyIHN1Yi1kcml2ZXIgY2hpcCBhY2Nlc3Mgcm91dGluZXMKKyAqLworCitzdHJ1Y3QgdHBzNjU5MTIgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwkvKiBmb3IgcmVhZC93cml0ZSBhY2NlcyAqLworCXN0cnVjdCBtdXRleCBpb19tdXRleDsKKworCS8qIEZvciBkZXZpY2UgSU8gaW50ZXJmYWNlczogSTJDIG9yIFNQSSAqLworCXZvaWQgKmNvbnRyb2xfZGF0YTsKKworCWludCAoKnJlYWQpKHN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIsIHU4IHJlZywgaW50IHNpemUsIHZvaWQgKmRlc3QpOworCWludCAoKndyaXRlKShzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyLCB1OCByZWcsIGludCBzaXplLCB2b2lkICpzcmMpOworCisJLyogQ2xpZW50IGRldmljZXMgKi8KKwlzdHJ1Y3QgdHBzNjU5MTJfcG1pYyAqcG1pYzsKKworCS8qIEdQSU8gSGFuZGxpbmcgKi8KKwlzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW87CisKKwkvKiBJUlEgSGFuZGxpbmcgKi8KKwlzdHJ1Y3QgbXV0ZXggaXJxX2xvY2s7CisJaW50IGNoaXBfaXJxOworCWludCBpcnFfYmFzZTsKKwlpbnQgaXJxX251bTsKKwl1MzIgaXJxX21hc2s7Cit9OworCitzdHJ1Y3QgdHBzNjU5MTJfcGxhdGZvcm1fZGF0YSB7CisJaW50IGlycTsKKwlpbnQgaXJxX2Jhc2U7Cit9OworCit1bnNpZ25lZCBpbnQgdHBzX2NoaXAodm9pZCk7CisKK2ludCB0cHM2NTkxMl9zZXRfYml0cyhzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyLCB1OCByZWcsIHU4IG1hc2spOworaW50IHRwczY1OTEyX2NsZWFyX2JpdHMoc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMiwgdTggcmVnLCB1OCBtYXNrKTsKK2ludCB0cHM2NTkxMl9yZWdfcmVhZChzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyLCB1OCByZWcpOworaW50IHRwczY1OTEyX3JlZ193cml0ZShzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyLCB1OCByZWcsIHU4IHZhbCk7CitpbnQgdHBzNjU5MTJfZGV2aWNlX2luaXQoc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMik7Cit2b2lkIHRwczY1OTEyX2RldmljZV9leGl0KHN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIpOworaW50IHRwczY1OTEyX2lycV9pbml0KHN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIsIGludCBpcnEsCisJCQlzdHJ1Y3QgdHBzNjU5MTJfcGxhdGZvcm1fZGF0YSAqcGRhdGEpOworCisjZW5kaWYgLyogIF9fTElOVVhfTUZEX1RQUzY1OTEyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3dtODMxeC9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzMXgvY29yZS5oCmluZGV4IDBkNTE1ZWUuLjhkZGE4ZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3dtODMxeC9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzF4L2NvcmUuaApAQCAtMTcsNiArMTcsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIAogLyoKICAqIFJlZ2lzdGVyIHZhbHVlcy4KQEAgLTIzNCw5ICsyMzUsMTExIEBACiAjZGVmaW5lIFdNODMxWF9PTl9QSU5fVE9fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIE9OX1BJTl9UTyAtIFsxOjBdICovCiAjZGVmaW5lIFdNODMxWF9PTl9QSU5fVE9fV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIE9OX1BJTl9UTyAtIFsxOjBdICovCiAKKy8qCisgKiBSMTY1MjggKDB4NDA5MCkgLSBDbG9jayBDb250cm9sIDEKKyAqLworI2RlZmluZSBXTTgzMVhfQ0xLT1VUX0VOQSAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBDTEtPVVRfRU5BICovCisjZGVmaW5lIFdNODMxWF9DTEtPVVRfRU5BX01BU0sgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIENMS09VVF9FTkEgKi8KKyNkZWZpbmUgV004MzFYX0NMS09VVF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxNSAgLyogQ0xLT1VUX0VOQSAqLworI2RlZmluZSBXTTgzMVhfQ0xLT1VUX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBDTEtPVVRfRU5BICovCisjZGVmaW5lIFdNODMxWF9DTEtPVVRfT0QgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIENMS09VVF9PRCAqLworI2RlZmluZSBXTTgzMVhfQ0xLT1VUX09EX01BU0sgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBDTEtPVVRfT0QgKi8KKyNkZWZpbmUgV004MzFYX0NMS09VVF9PRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxMyAgLyogQ0xLT1VUX09EICovCisjZGVmaW5lIFdNODMxWF9DTEtPVVRfT0RfV0lEVEggICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIENMS09VVF9PRCAqLworI2RlZmluZSBXTTgzMVhfQ0xLT1VUX1NMT1RfTUFTSyAgICAgICAgICAgICAgICAgMHgwNzAwICAvKiBDTEtPVVRfU0xPVCAtIFsxMDo4XSAqLworI2RlZmluZSBXTTgzMVhfQ0xLT1VUX1NMT1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICA4ICAvKiBDTEtPVVRfU0xPVCAtIFsxMDo4XSAqLworI2RlZmluZSBXTTgzMVhfQ0xLT1VUX1NMT1RfV0lEVEggICAgICAgICAgICAgICAgICAgICAzICAvKiBDTEtPVVRfU0xPVCAtIFsxMDo4XSAqLworI2RlZmluZSBXTTgzMVhfQ0xLT1VUX1NMUFNMT1RfTUFTSyAgICAgICAgICAgICAgMHgwMDcwICAvKiBDTEtPVVRfU0xQU0xPVCAtIFs2OjRdICovCisjZGVmaW5lIFdNODMxWF9DTEtPVVRfU0xQU0xPVF9TSElGVCAgICAgICAgICAgICAgICAgIDQgIC8qIENMS09VVF9TTFBTTE9UIC0gWzY6NF0gKi8KKyNkZWZpbmUgV004MzFYX0NMS09VVF9TTFBTTE9UX1dJRFRIICAgICAgICAgICAgICAgICAgMyAgLyogQ0xLT1VUX1NMUFNMT1QgLSBbNjo0XSAqLworI2RlZmluZSBXTTgzMVhfQ0xLT1VUX1NSQyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBDTEtPVVRfU1JDICovCisjZGVmaW5lIFdNODMxWF9DTEtPVVRfU1JDX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIENMS09VVF9TUkMgKi8KKyNkZWZpbmUgV004MzFYX0NMS09VVF9TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMCAgLyogQ0xLT1VUX1NSQyAqLworI2RlZmluZSBXTTgzMVhfQ0xLT1VUX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBDTEtPVVRfU1JDICovCisKKy8qCisgKiBSMTY1MjkgKDB4NDA5MSkgLSBDbG9jayBDb250cm9sIDIKKyAqLworI2RlZmluZSBXTTgzMVhfWFRBTF9JTkggICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBYVEFMX0lOSCAqLworI2RlZmluZSBXTTgzMVhfWFRBTF9JTkhfTUFTSyAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBYVEFMX0lOSCAqLworI2RlZmluZSBXTTgzMVhfWFRBTF9JTkhfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDE1ICAvKiBYVEFMX0lOSCAqLworI2RlZmluZSBXTTgzMVhfWFRBTF9JTkhfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBYVEFMX0lOSCAqLworI2RlZmluZSBXTTgzMVhfWFRBTF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBYVEFMX0VOQSAqLworI2RlZmluZSBXTTgzMVhfWFRBTF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBYVEFMX0VOQSAqLworI2RlZmluZSBXTTgzMVhfWFRBTF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBYVEFMX0VOQSAqLworI2RlZmluZSBXTTgzMVhfWFRBTF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBYVEFMX0VOQSAqLworI2RlZmluZSBXTTgzMVhfWFRBTF9CS1VQRU5BICAgICAgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBYVEFMX0JLVVBFTkEgKi8KKyNkZWZpbmUgV004MzFYX1hUQUxfQktVUEVOQV9NQVNLICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogWFRBTF9CS1VQRU5BICovCisjZGVmaW5lIFdNODMxWF9YVEFMX0JLVVBFTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgMTIgIC8qIFhUQUxfQktVUEVOQSAqLworI2RlZmluZSBXTTgzMVhfWFRBTF9CS1VQRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAxICAvKiBYVEFMX0JLVVBFTkEgKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9BVVRPICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogRkxMX0FVVE8gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9BVVRPX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDA4MCAgLyogRkxMX0FVVE8gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9BVVRPX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogRkxMX0FVVE8gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9BVVRPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogRkxMX0FVVE8gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9BVVRPX0ZSRVFfTUFTSyAgICAgICAgICAgICAgIDB4MDAwNyAgLyogRkxMX0FVVE9fRlJFUSAtIFsyOjBdICovCisjZGVmaW5lIFdNODMxWF9GTExfQVVUT19GUkVRX1NISUZUICAgICAgICAgICAgICAgICAgIDAgIC8qIEZMTF9BVVRPX0ZSRVEgLSBbMjowXSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0FVVE9fRlJFUV9XSURUSCAgICAgICAgICAgICAgICAgICAzICAvKiBGTExfQVVUT19GUkVRIC0gWzI6MF0gKi8KKworLyoKKyAqIFIxNjUzMCAoMHg0MDkyKSAtIEZMTCBDb250cm9sIDEKKyAqLworI2RlZmluZSBXTTgzMVhfRkxMX0ZSQUMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBGTExfRlJBQyAqLworI2RlZmluZSBXTTgzMVhfRkxMX0ZSQUNfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDA0ICAvKiBGTExfRlJBQyAqLworI2RlZmluZSBXTTgzMVhfRkxMX0ZSQUNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBGTExfRlJBQyAqLworI2RlZmluZSBXTTgzMVhfRkxMX0ZSQUNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBGTExfRlJBQyAqLworI2RlZmluZSBXTTgzMVhfRkxMX09TQ19FTkEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBGTExfT1NDX0VOQSAqLworI2RlZmluZSBXTTgzMVhfRkxMX09TQ19FTkFfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyICAvKiBGTExfT1NDX0VOQSAqLworI2RlZmluZSBXTTgzMVhfRkxMX09TQ19FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxICAvKiBGTExfT1NDX0VOQSAqLworI2RlZmluZSBXTTgzMVhfRkxMX09TQ19FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAxICAvKiBGTExfT1NDX0VOQSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBGTExfRU5BICovCisjZGVmaW5lIFdNODMxWF9GTExfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEZMTF9FTkEgKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9FTkFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRkxMX0VOQSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBGTExfRU5BICovCisKKy8qCisgKiBSMTY1MzEgKDB4NDA5MykgLSBGTEwgQ29udHJvbCAyCisgKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9PVVRESVZfTUFTSyAgICAgICAgICAgICAgICAgIDB4M0YwMCAgLyogRkxMX09VVERJViAtIFsxMzo4XSAqLworI2RlZmluZSBXTTgzMVhfRkxMX09VVERJVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICA4ICAvKiBGTExfT1VURElWIC0gWzEzOjhdICovCisjZGVmaW5lIFdNODMxWF9GTExfT1VURElWX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDYgIC8qIEZMTF9PVVRESVYgLSBbMTM6OF0gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9DVFJMX1JBVEVfTUFTSyAgICAgICAgICAgICAgIDB4MDA3MCAgLyogRkxMX0NUUkxfUkFURSAtIFs2OjRdICovCisjZGVmaW5lIFdNODMxWF9GTExfQ1RSTF9SQVRFX1NISUZUICAgICAgICAgICAgICAgICAgIDQgIC8qIEZMTF9DVFJMX1JBVEUgLSBbNjo0XSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0NUUkxfUkFURV9XSURUSCAgICAgICAgICAgICAgICAgICAzICAvKiBGTExfQ1RSTF9SQVRFIC0gWzY6NF0gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9GUkFUSU9fTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwNyAgLyogRkxMX0ZSQVRJTyAtIFsyOjBdICovCisjZGVmaW5lIFdNODMxWF9GTExfRlJBVElPX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZMTF9GUkFUSU8gLSBbMjowXSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0ZSQVRJT19XSURUSCAgICAgICAgICAgICAgICAgICAgICAzICAvKiBGTExfRlJBVElPIC0gWzI6MF0gKi8KKworLyoKKyAqIFIxNjUzMiAoMHg0MDk0KSAtIEZMTCBDb250cm9sIDMKKyAqLworI2RlZmluZSBXTTgzMVhfRkxMX0tfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAvKiBGTExfSyAtIFsxNTowXSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0tfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBGTExfSyAtIFsxNTowXSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0tfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDE2ICAvKiBGTExfSyAtIFsxNTowXSAqLworCisvKgorICogUjE2NTMzICgweDQwOTUpIC0gRkxMIENvbnRyb2wgNAorICovCisjZGVmaW5lIFdNODMxWF9GTExfTl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAweDdGRTAgIC8qIEZMTF9OIC0gWzE0OjVdICovCisjZGVmaW5lIFdNODMxWF9GTExfTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgIC8qIEZMTF9OIC0gWzE0OjVdICovCisjZGVmaW5lIFdNODMxWF9GTExfTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgIC8qIEZMTF9OIC0gWzE0OjVdICovCisjZGVmaW5lIFdNODMxWF9GTExfR0FJTl9NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMEYgIC8qIEZMTF9HQUlOIC0gWzM6MF0gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9HQUlOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRkxMX0dBSU4gLSBbMzowXSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0dBSU5fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICA0ICAvKiBGTExfR0FJTiAtIFszOjBdICovCisKKy8qCisgKiBSMTY1MzQgKDB4NDA5NikgLSBGTEwgQ29udHJvbCA1CisgKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9DTEtfUkVGX0RJVl9NQVNLICAgICAgICAgICAgIDB4MDAxOCAgLyogRkxMX0NMS19SRUZfRElWIC0gWzQ6M10gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9DTEtfUkVGX0RJVl9TSElGVCAgICAgICAgICAgICAgICAgMyAgLyogRkxMX0NMS19SRUZfRElWIC0gWzQ6M10gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9DTEtfUkVGX0RJVl9XSURUSCAgICAgICAgICAgICAgICAgMiAgLyogRkxMX0NMS19SRUZfRElWIC0gWzQ6M10gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9DTEtfU1JDX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMyAgLyogRkxMX0NMS19TUkMgLSBbMTowXSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0NMS19TUkNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwICAvKiBGTExfQ0xLX1NSQyAtIFsxOjBdICovCisjZGVmaW5lIFdNODMxWF9GTExfQ0xLX1NSQ19XSURUSCAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEZMTF9DTEtfU1JDIC0gWzE6MF0gKi8KKwogc3RydWN0IHJlZ3VsYXRvcl9kZXY7CiAKICNkZWZpbmUgV004MzFYX05VTV9JUlFfUkVHUyA1CisjZGVmaW5lIFdNODMxWF9OVU1fR1BJT19SRUdTIDE2CiAKIGVudW0gd204MzF4X3BhcmVudCB7CiAJV004MzEwID0gMHg4MzEwLApAQCAtMjQ4LDYgKzM1MSwxMiBAQAogCVdNODMyNiA9IDB4ODMyNiwKIH07CiAKK3N0cnVjdCB3bTgzMXg7CitlbnVtIHdtODMxeF9hdXhhZGM7CisKK3R5cGVkZWYgaW50ICgqd204MzF4X2F1eGFkY19yZWFkX2ZuKShzdHJ1Y3Qgd204MzF4ICp3bTgzMXgsCisJCQkJICAgICBlbnVtIHdtODMxeF9hdXhhZGMgaW5wdXQpOworCiBzdHJ1Y3Qgd204MzF4IHsKIAlzdHJ1Y3QgbXV0ZXggaW9fbG9jazsKIApAQCAtMjYxLDcgKzM3MCw3IEBACiAKIAlpbnQgaXJxOyAgLyogT3VyIGNoaXAgSVJRICovCiAJc3RydWN0IG11dGV4IGlycV9sb2NrOwotCXVuc2lnbmVkIGludCBpcnFfYmFzZTsKKwlpbnQgaXJxX2Jhc2U7CiAJaW50IGlycV9tYXNrc19jdXJbV004MzFYX05VTV9JUlFfUkVHU107ICAgLyogQ3VycmVudGx5IGFjdGl2ZSB2YWx1ZSAqLwogCWludCBpcnFfbWFza3NfY2FjaGVbV004MzFYX05VTV9JUlFfUkVHU107IC8qIENhY2hlZCBoYXJkd2FyZSB2YWx1ZSAqLwogCkBAIC0yNzIsOCArMzgxLDEzIEBACiAKIAlpbnQgbnVtX2dwaW87CiAKKwkvKiBVc2VkIGJ5IHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciBjb2RlIHRvIHBvc3Qgd3JpdGVzICovCisJaW50IGdwaW9fdXBkYXRlW1dNODMxWF9OVU1fR1BJT19SRUdTXTsKKwogCXN0cnVjdCBtdXRleCBhdXhhZGNfbG9jazsKLQlzdHJ1Y3QgY29tcGxldGlvbiBhdXhhZGNfZG9uZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGF1eGFkY19wZW5kaW5nOworCXUxNiBhdXhhZGNfYWN0aXZlOworCXdtODMxeF9hdXhhZGNfcmVhZF9mbiBhdXhhZGNfcmVhZDsKIAogCS8qIFRoZSBXTTgzMXggaGFzIGEgc2VjdXJpdHkga2V5IGJsb2NraW5nIGFjY2VzcyB0byBjZXJ0YWluCiAJICogcmVnaXN0ZXJzLiAgVGhlIG11dGV4IGlzIHRha2VuIGJ5IHRoZSBhY2Nlc3NvcnMgZm9yIGxvY2tpbmcKQEAgLTMwMCw1ICs0MTQsNiBAQAogaW50IHdtODMxeF9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3Qgd204MzF4ICp3bTgzMXgpOwogaW50IHdtODMxeF9pcnFfaW5pdChzdHJ1Y3Qgd204MzF4ICp3bTgzMXgsIGludCBpcnEpOwogdm9pZCB3bTgzMXhfaXJxX2V4aXQoc3RydWN0IHdtODMxeCAqd204MzF4KTsKK3ZvaWQgd204MzF4X2F1eGFkY19pbml0KHN0cnVjdCB3bTgzMXggKndtODMxeCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvd204MzF4L3BkYXRhLmggYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzMXgvcGRhdGEuaAppbmRleCBmZjQyZDcwLi4wYmEyNDU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzMXgvcGRhdGEuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzMXgvcGRhdGEuaApAQCAtMTIwLDYgKzEyMCw5IEBACiAJLyoqIFB1dCB0aGUgL0lSUSBsaW5lIGludG8gQ01PUyBtb2RlICovCiAJYm9vbCBpcnFfY21vczsKIAorCS8qKiBEaXNhYmxlIHRoZSB0b3VjaHNjcmVlbiAqLworCWJvb2wgZGlzYWJsZV90b3VjaDsKKwogCWludCBpcnFfYmFzZTsKIAlpbnQgZ3Bpb19iYXNlOwogCWludCBncGlvX2RlZmF1bHRzW1dNODMxWF9HUElPX05VTV07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmgKaW5kZXggMzE3MmExYy4uZjI2OTBjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW0uaApAQCAtMTYwMCw2ICsxNjAwLDcgQEAKIH07CiBleHRlcm4gdm9pZCBtZW1vcnlfZmFpbHVyZSh1bnNpZ25lZCBsb25nIHBmbiwgaW50IHRyYXBubyk7CiBleHRlcm4gaW50IF9fbWVtb3J5X2ZhaWx1cmUodW5zaWduZWQgbG9uZyBwZm4sIGludCB0cmFwbm8sIGludCBmbGFncyk7CitleHRlcm4gdm9pZCBtZW1vcnlfZmFpbHVyZV9xdWV1ZSh1bnNpZ25lZCBsb25nIHBmbiwgaW50IHRyYXBubywgaW50IGZsYWdzKTsKIGV4dGVybiBpbnQgdW5wb2lzb25fbWVtb3J5KHVuc2lnbmVkIGxvbmcgcGZuKTsKIGV4dGVybiBpbnQgc3lzY3RsX21lbW9yeV9mYWlsdXJlX2Vhcmx5X2tpbGw7CiBleHRlcm4gaW50IHN5c2N0bF9tZW1vcnlfZmFpbHVyZV9yZWNvdmVyeTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1fdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvbW1fdHlwZXMuaAppbmRleCAwMjc5MzVjLi43NzRiODk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbV90eXBlcy5oCkBAIC0zMCwyMyArMzAsNjEgQEAKICAqIG1vbWVudC4gTm90ZSB0aGF0IHdlIGhhdmUgbm8gd2F5IHRvIHRyYWNrIHdoaWNoIHRhc2tzIGFyZSB1c2luZwogICogYSBwYWdlLCB0aG91Z2ggaWYgaXQgaXMgYSBwYWdlY2FjaGUgcGFnZSwgcm1hcCBzdHJ1Y3R1cmVzIGNhbiB0ZWxsIHVzCiAgKiB3aG8gaXMgbWFwcGluZyBpdC4KKyAqCisgKiBUaGUgb2JqZWN0cyBpbiBzdHJ1Y3QgcGFnZSBhcmUgb3JnYW5pemVkIGluIGRvdWJsZSB3b3JkIGJsb2NrcyBpbgorICogb3JkZXIgdG8gYWxsb3dzIHVzIHRvIHVzZSBhdG9taWMgZG91YmxlIHdvcmQgb3BlcmF0aW9ucyBvbiBwb3J0aW9ucworICogb2Ygc3RydWN0IHBhZ2UuIFRoYXQgaXMgY3VycmVudGx5IG9ubHkgdXNlZCBieSBzbHViIGJ1dCB0aGUgYXJyYW5nZW1lbnQKKyAqIGFsbG93cyB0aGUgdXNlIG9mIGF0b21pYyBkb3VibGUgd29yZCBvcGVyYXRpb25zIG9uIHRoZSBmbGFncy9tYXBwaW5nCisgKiBhbmQgbHJ1IGxpc3QgcG9pbnRlcnMgYWxzby4KICAqLwogc3RydWN0IHBhZ2UgeworCS8qIEZpcnN0IGRvdWJsZSB3b3JkIGJsb2NrICovCiAJdW5zaWduZWQgbG9uZyBmbGFnczsJCS8qIEF0b21pYyBmbGFncywgc29tZSBwb3NzaWJseQogCQkJCQkgKiB1cGRhdGVkIGFzeW5jaHJvbm91c2x5ICovCi0JYXRvbWljX3QgX2NvdW50OwkJLyogVXNhZ2UgY291bnQsIHNlZSBiZWxvdy4gKi8KLQl1bmlvbiB7Ci0JCWF0b21pY190IF9tYXBjb3VudDsJLyogQ291bnQgb2YgcHRlcyBtYXBwZWQgaW4gbW1zLAotCQkJCQkgKiB0byBzaG93IHdoZW4gcGFnZSBpcyBtYXBwZWQKLQkJCQkJICogJiBsaW1pdCByZXZlcnNlIG1hcCBzZWFyY2hlcy4KKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsJLyogSWYgbG93IGJpdCBjbGVhciwgcG9pbnRzIHRvCisJCQkJCSAqIGlub2RlIGFkZHJlc3Nfc3BhY2UsIG9yIE5VTEwuCisJCQkJCSAqIElmIHBhZ2UgbWFwcGVkIGFzIGFub255bW91cworCQkJCQkgKiBtZW1vcnksIGxvdyBiaXQgaXMgc2V0LCBhbmQKKwkJCQkJICogaXQgcG9pbnRzIHRvIGFub25fdm1hIG9iamVjdDoKKwkJCQkJICogc2VlIFBBR0VfTUFQUElOR19BTk9OIGJlbG93LgogCQkJCQkgKi8KLQkJc3RydWN0IHsJCS8qIFNMVUIgKi8KLQkJCXUxNiBpbnVzZTsKLQkJCXUxNiBvYmplY3RzOworCS8qIFNlY29uZCBkb3VibGUgd29yZCAqLworCXN0cnVjdCB7CisJCXVuaW9uIHsKKwkJCXBnb2ZmX3QgaW5kZXg7CQkvKiBPdXIgb2Zmc2V0IHdpdGhpbiBtYXBwaW5nLiAqLworCQkJdm9pZCAqZnJlZWxpc3Q7CQkvKiBzbHViIGZpcnN0IGZyZWUgb2JqZWN0ICovCisJCX07CisKKwkJdW5pb24geworCQkJLyogVXNlZCBmb3IgY21weGNoZ19kb3VibGUgaW4gc2x1YiAqLworCQkJdW5zaWduZWQgbG9uZyBjb3VudGVyczsKKworCQkJc3RydWN0IHsKKworCQkJCXVuaW9uIHsKKwkJCQkJYXRvbWljX3QgX21hcGNvdW50OwkvKiBDb3VudCBvZiBwdGVzIG1hcHBlZCBpbiBtbXMsCisJCQkJCQkJICogdG8gc2hvdyB3aGVuIHBhZ2UgaXMgbWFwcGVkCisJCQkJCQkJICogJiBsaW1pdCByZXZlcnNlIG1hcCBzZWFyY2hlcy4KKwkJCQkJCQkgKi8KKworCQkJCQlzdHJ1Y3QgeworCQkJCQkJdW5zaWduZWQgaW51c2U6MTY7CisJCQkJCQl1bnNpZ25lZCBvYmplY3RzOjE1OworCQkJCQkJdW5zaWduZWQgZnJvemVuOjE7CisJCQkJCX07CisJCQkJfTsKKwkJCQlhdG9taWNfdCBfY291bnQ7CQkvKiBVc2FnZSBjb3VudCwgc2VlIGJlbG93LiAqLworCQkJfTsKIAkJfTsKIAl9OworCisJLyogVGhpcmQgZG91YmxlIHdvcmQgYmxvY2sgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxydTsJCS8qIFBhZ2VvdXQgbGlzdCwgZWcuIGFjdGl2ZV9saXN0CisJCQkJCSAqIHByb3RlY3RlZCBieSB6b25lLT5scnVfbG9jayAhCisJCQkJCSAqLworCisJLyogUmVtYWluZGVyIGlzIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkICovCiAJdW5pb24gewotCSAgICBzdHJ1Y3QgewogCQl1bnNpZ25lZCBsb25nIHByaXZhdGU7CQkvKiBNYXBwaW5nLXByaXZhdGUgb3BhcXVlIGRhdGE6CiAJCQkJCSAJICogdXN1YWxseSB1c2VkIGZvciBidWZmZXJfaGVhZHMKIAkJCQkJCSAqIGlmIFBhZ2VQcml2YXRlIHNldDsgdXNlZCBmb3IKQEAgLTU0LDI3ICs5MiwxMyBAQAogCQkJCQkJICogaW5kaWNhdGVzIG9yZGVyIGluIHRoZSBidWRkeQogCQkJCQkJICogc3lzdGVtIGlmIFBHX2J1ZGR5IGlzIHNldC4KIAkJCQkJCSAqLwotCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsJLyogSWYgbG93IGJpdCBjbGVhciwgcG9pbnRzIHRvCi0JCQkJCQkgKiBpbm9kZSBhZGRyZXNzX3NwYWNlLCBvciBOVUxMLgotCQkJCQkJICogSWYgcGFnZSBtYXBwZWQgYXMgYW5vbnltb3VzCi0JCQkJCQkgKiBtZW1vcnksIGxvdyBiaXQgaXMgc2V0LCBhbmQKLQkJCQkJCSAqIGl0IHBvaW50cyB0byBhbm9uX3ZtYSBvYmplY3Q6Ci0JCQkJCQkgKiBzZWUgUEFHRV9NQVBQSU5HX0FOT04gYmVsb3cuCi0JCQkJCQkgKi8KLQkgICAgfTsKICNpZiBVU0VfU1BMSVRfUFRMT0NLUwotCSAgICBzcGlubG9ja190IHB0bDsKKwkJc3BpbmxvY2tfdCBwdGw7CiAjZW5kaWYKLQkgICAgc3RydWN0IGttZW1fY2FjaGUgKnNsYWI7CS8qIFNMVUI6IFBvaW50ZXIgdG8gc2xhYiAqLwotCSAgICBzdHJ1Y3QgcGFnZSAqZmlyc3RfcGFnZTsJLyogQ29tcG91bmQgdGFpbCBwYWdlcyAqLworCQlzdHJ1Y3Qga21lbV9jYWNoZSAqc2xhYjsJLyogU0xVQjogUG9pbnRlciB0byBzbGFiICovCisJCXN0cnVjdCBwYWdlICpmaXJzdF9wYWdlOwkvKiBDb21wb3VuZCB0YWlsIHBhZ2VzICovCiAJfTsKLQl1bmlvbiB7Ci0JCXBnb2ZmX3QgaW5kZXg7CQkvKiBPdXIgb2Zmc2V0IHdpdGhpbiBtYXBwaW5nLiAqLwotCQl2b2lkICpmcmVlbGlzdDsJCS8qIFNMVUI6IGZyZWVsaXN0IHJlcS4gc2xhYiBsb2NrICovCi0JfTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxydTsJCS8qIFBhZ2VvdXQgbGlzdCwgZWcuIGFjdGl2ZV9saXN0Ci0JCQkJCSAqIHByb3RlY3RlZCBieSB6b25lLT5scnVfbG9jayAhCi0JCQkJCSAqLworCiAJLyoKIAkgKiBPbiBtYWNoaW5lcyB3aGVyZSBhbGwgUkFNIGlzIG1hcHBlZCBpbnRvIGtlcm5lbCBhZGRyZXNzIHNwYWNlLAogCSAqIHdlIGNhbiBzaW1wbHkgY2FsY3VsYXRlIHRoZSB2aXJ0dWFsIGFkZHJlc3MuIE9uIG1hY2hpbmVzIHdpdGgKQEAgLTEwMCw3ICsxMjQsMTYgQEAKIAkgKi8KIAl2b2lkICpzaGFkb3c7CiAjZW5kaWYKLX07Cit9CisvKgorICogSWYgYW5vdGhlciBzdWJzeXN0ZW0gc3RhcnRzIHVzaW5nIHRoZSBkb3VibGUgd29yZCBwYWlyaW5nIGZvciBhdG9taWMKKyAqIG9wZXJhdGlvbnMgb24gc3RydWN0IHBhZ2UgdGhlbiBpdCBtdXN0IGNoYW5nZSB0aGUgI2lmIHRvIGVuc3VyZQorICogcHJvcGVyIGFsaWdubWVudCBvZiB0aGUgcGFnZSBzdHJ1Y3QuCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TTFVCKSAmJiBkZWZpbmVkKENPTkZJR19DTVBYQ0hHX0xPQ0FMKQorCV9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKDIqc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkpCisjZW5kaWYKKzsKIAogdHlwZWRlZiB1bnNpZ25lZCBsb25nIF9fbm9jYXN0IHZtX2ZsYWdzX3Q7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzLmggYi9pbmNsdWRlL2xpbnV4L25mcy5oCmluZGV4IGYzODc5MTkuLjhjNmVlNDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnMuaApAQCAtMjksNiArMjksOCBAQAogI2RlZmluZSBORlNfTU5UX1ZFUlNJT04JCTEKICNkZWZpbmUgTkZTX01OVDNfVkVSU0lPTgkzCiAKKyNkZWZpbmUgTkZTX1BJUEVfRElSTkFNRSAiL25mcyIKKwogLyoKICAqIE5GUyBzdGF0cy4gVGhlIGdvb2QgdGhpbmcgd2l0aCB0aGVzZSB2YWx1ZXMgaXMgdGhhdCBORlN2MyBlcnJvcnMgYXJlCiAgKiBhIHN1cGVyc2V0IG9mIE5GU3YyIGVycm9ycyAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIE5GU0VSUl9XRkxVU0ggd2hpY2gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzNC5oIGIvaW5jbHVkZS9saW51eC9uZnM0LmgKaW5kZXggYTNjNGJjOC4uNzZmOTllOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnM0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnM0LmgKQEAgLTU2Niw2ICs1NjYsNyBAQAogCU5GU1BST0M0X0NMTlRfU0VDSU5GT19OT19OQU1FLAogCU5GU1BST0M0X0NMTlRfVEVTVF9TVEFURUlELAogCU5GU1BST0M0X0NMTlRfRlJFRV9TVEFURUlELAorCU5GU1BST0M0X0NMTlRfR0VUREVWSUNFTElTVCwKIH07CiAKIC8qIG5mczQxIHR5cGVzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc19mcy5oIGIvaW5jbHVkZS9saW51eC9uZnNfZnMuaAppbmRleCA4YjU3OWJlLi5lYWFjNzcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzX2ZzLmgKQEAgLTk5LDkgKzk5LDEwIEBACiAKIHN0cnVjdCBuZnNfb3Blbl9kaXJfY29udGV4dCB7CiAJc3RydWN0IHJwY19jcmVkICpjcmVkOworCXVuc2lnbmVkIGxvbmcgYXR0cl9nZW5jb3VudDsKIAlfX3U2NCBkaXJfY29va2llOwogCV9fdTY0IGR1cF9jb29raWU7Ci0JaW50IGR1cGVkOworCXNpZ25lZCBjaGFyIGR1cGVkOwogfTsKIAogLyoKQEAgLTU2OCwxMiArNTY5LDEyIEBACiBleHRlcm4gaW50IG5mczNfcHJvY19zZXRhY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUsCiAJCQkgICAgc3RydWN0IHBvc2l4X2FjbCAqYWNsKTsKIGV4dGVybiBpbnQgbmZzM19wcm9jX3NldF9kZWZhdWx0X2FjbChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJbW9kZV90IG1vZGUpOworCQl1bW9kZV90IG1vZGUpOwogZXh0ZXJuIHZvaWQgbmZzM19mb3JnZXRfY2FjaGVkX2FjbHMoc3RydWN0IGlub2RlICppbm9kZSk7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgbmZzM19wcm9jX3NldF9kZWZhdWx0X2FjbChzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJCSAgICBtb2RlX3QgbW9kZSkKKwkJCQkJICAgIHVtb2RlX3QgbW9kZSkKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzX2ZzX3NiLmggYi9pbmNsdWRlL2xpbnV4L25mc19mc19zYi5oCmluZGV4IDUwYTY2MWYuLmI1NDc5ZGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzX2ZzX3NiLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNfZnNfc2IuaApAQCAtMTMxLDggKzEzMSw5IEBACiAJc3RydWN0IGZzY2FjaGVfY29va2llCSpmc2NhY2hlOwkvKiBzdXBlcmJsb2NrIGNvb2tpZSAqLwogI2VuZGlmCiAKKwl1MzIJCQlwbmZzX2Jsa3NpemU7CS8qIGxheW91dF9ibGtzaXplIGF0dHIgKi8KICNpZmRlZiBDT05GSUdfTkZTX1Y0Ci0JdTMyCQkJYXR0cl9iaXRtYXNrWzJdOy8qIFY0IGJpdG1hc2sgcmVwcmVzZW50aW5nIHRoZSBzZXQKKwl1MzIJCQlhdHRyX2JpdG1hc2tbM107LyogVjQgYml0bWFzayByZXByZXNlbnRpbmcgdGhlIHNldAogCQkJCQkJICAgb2YgYXR0cmlidXRlcyBzdXBwb3J0ZWQgb24gdGhpcwogCQkJCQkJICAgZmlsZXN5c3RlbSAqLwogCXUzMgkJCWNhY2hlX2NvbnNpc3RlbmN5X2JpdG1hc2tbMl07CkBAIC0xNDUsNiArMTQ2LDcgQEAKIAkJCQkJCSAgIGZpbGVzeXN0ZW0gKi8KIAlzdHJ1Y3QgcG5mc19sYXlvdXRkcml2ZXJfdHlwZSAgKnBuZnNfY3Vycl9sZDsgLyogQWN0aXZlIGxheW91dCBkcml2ZXIgKi8KIAlzdHJ1Y3QgcnBjX3dhaXRfcXVldWUJcm9jX3JwY3dhaXRxOworCXZvaWQJCQkqcG5mc19sZF9kYXRhOwkvKiBwZXIgbW91bnQgcG9pbnQgZGF0YSAqLwogCiAJLyogdGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHByb3RlY3RlZCBieSBuZnNfY2xpZW50LT5jbF9sb2NrICovCiAJc3RydWN0IHJiX3Jvb3QJCXN0YXRlX293bmVyczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzX3hkci5oIGIvaW5jbHVkZS9saW51eC9uZnNfeGRyLmgKaW5kZXggNWIxMTU5NS4uNTY5ZWE1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNfeGRyLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNfeGRyLmgKQEAgLTEyMiw2ICsxMjIsNyBAQAogCXN0cnVjdCB0aW1lc3BlYwkJdGltZV9kZWx0YTsgLyogc2VydmVyIHRpbWUgZ3JhbnVsYXJpdHkgKi8KIAlfX3UzMgkJCWxlYXNlX3RpbWU7IC8qIGluIHNlY29uZHMgKi8KIAlfX3UzMgkJCWxheW91dHR5cGU7IC8qIHN1cHBvcnRlZCBwbmZzIGxheW91dCBkcml2ZXIgKi8KKwlfX3UzMgkJCWJsa3NpemU7IC8qIHByZWZlcnJlZCBwbmZzIGlvIGJsb2NrIHNpemUgKi8KIH07CiAKIHN0cnVjdCBuZnNfZnNzdGF0IHsKQEAgLTIzNSw2ICsyMzYsMTcgQEAKIAlnZnBfdCBnZnBfZmxhZ3M7CiB9OwogCitzdHJ1Y3QgbmZzNF9nZXRkZXZpY2VsaXN0X2FyZ3MgeworCWNvbnN0IHN0cnVjdCBuZnNfZmggKmZoOworCXUzMiBsYXlvdXRjbGFzczsKKwlzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9hcmdzIHNlcV9hcmdzOworfTsKKworc3RydWN0IG5mczRfZ2V0ZGV2aWNlbGlzdF9yZXMgeworCXN0cnVjdCBwbmZzX2RldmljZWxpc3QgKmRldmxpc3Q7CisJc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzIHNlcV9yZXM7Cit9OworCiBzdHJ1Y3QgbmZzNF9nZXRkZXZpY2VpbmZvX2FyZ3MgewogCXN0cnVjdCBwbmZzX2RldmljZSAqcGRldjsKIAlzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9hcmdzIHNlcV9hcmdzOwpAQCAtMjU3LDEyICsyNjksMTMgQEAKIAlzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cjsKIAljb25zdCBzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyOwogCXN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyBzZXFfcmVzOworCWludCBzdGF0dXM7CiB9OwogCiBzdHJ1Y3QgbmZzNF9sYXlvdXRjb21taXRfZGF0YSB7CiAJc3RydWN0IHJwY190YXNrIHRhc2s7CiAJc3RydWN0IG5mc19mYXR0ciBmYXR0cjsKLQlzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqbHNlZzsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxzZWdfbGlzdDsKIAlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQ7CiAJc3RydWN0IG5mczRfbGF5b3V0Y29tbWl0X2FyZ3MgYXJnczsKIAlzdHJ1Y3QgbmZzNF9sYXlvdXRjb21taXRfcmVzIHJlczsKQEAgLTk0Myw3ICs5NTYsNyBAQAogfTsKIAogc3RydWN0IG5mczRfc2VydmVyX2NhcHNfcmVzIHsKLQl1MzIJCQkJYXR0cl9iaXRtYXNrWzJdOworCXUzMgkJCQlhdHRyX2JpdG1hc2tbM107CiAJdTMyCQkJCWFjbF9iaXRtYXNrOwogCXUzMgkJCQloYXNfbGlua3M7CiAJdTMyCQkJCWhhc19zeW1saW5rczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2YuaCBiL2luY2x1ZGUvbGludXgvb2YuaAppbmRleCBiZDcxNmY4Li4wMDg1YmIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mLmgKKysrIGIvaW5jbHVkZS9saW51eC9vZi5oCkBAIC0xOTYsMTIgKzE5NiwxMyBAQAogCQkJCQkgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkJIGludCAqbGVucCk7CiBleHRlcm4gaW50IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkJICAgICAgY2hhciAqcHJvcG5hbWUsCisJCQkJICAgICAgY29uc3QgY2hhciAqcHJvcG5hbWUsCiAJCQkJICAgICAgdTMyICpvdXRfdmFsdWVzLAogCQkJCSAgICAgIHNpemVfdCBzeik7CiAKLWV4dGVybiBpbnQgb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcoc3RydWN0IGRldmljZV9ub2RlICpucCwgY2hhciAqcHJvcG5hbWUsCi0JCQkJCWNvbnN0IGNoYXIgKipvdXRfc3RyaW5nKTsKK2V4dGVybiBpbnQgb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkgICBjb25zdCBjaGFyICpwcm9wbmFtZSwKKwkJCQkgICBjb25zdCBjaGFyICoqb3V0X3N0cmluZyk7CiBleHRlcm4gaW50IG9mX2RldmljZV9pc19jb21wYXRpYmxlKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlLAogCQkJCSAgIGNvbnN0IGNoYXIgKik7CiBleHRlcm4gaW50IG9mX2RldmljZV9pc19hdmFpbGFibGUoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UpOwpAQCAtMjQyLDEzICsyNDMsMTUgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQgb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQljaGFyICpwcm9wbmFtZSwgdTMyICpvdXRfdmFsdWVzLCBzaXplX3Qgc3opCisJCQkJCSAgICAgY29uc3QgY2hhciAqcHJvcG5hbWUsCisJCQkJCSAgICAgdTMyICpvdXRfdmFsdWVzLCBzaXplX3Qgc3opCiB7CiAJcmV0dXJuIC1FTk9TWVM7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkJY2hhciAqcHJvcG5hbWUsIGNvbnN0IGNoYXIgKipvdXRfc3RyaW5nKQorCQkJCQkgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAorCQkJCQkgIGNvbnN0IGNoYXIgKipvdXRfc3RyaW5nKQogewogCXJldHVybiAtRU5PU1lTOwogfQpAQCAtMjU2LDcgKzI1OSw3IEBACiAjZW5kaWYgLyogQ09ORklHX09GICovCiAKIHN0YXRpYyBpbmxpbmUgaW50IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkJICAgICAgIGNoYXIgKnByb3BuYW1lLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwKIAkJCQkgICAgICAgdTMyICpvdXRfdmFsdWUpCiB7CiAJcmV0dXJuIG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KG5wLCBwcm9wbmFtZSwgb3V0X3ZhbHVlLCAxKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2ZfZ3Bpby5oIGIvaW5jbHVkZS9saW51eC9vZl9ncGlvLmgKaW5kZXggYWVjODAyNS4uNTIyODBhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZl9ncGlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9vZl9ncGlvLmgKQEAgLTU3LDYgKzU3LDggQEAKIGV4dGVybiB2b2lkIG9mX2dwaW9jaGlwX2FkZChzdHJ1Y3QgZ3Bpb19jaGlwICpnYyk7CiBleHRlcm4gdm9pZCBvZl9ncGlvY2hpcF9yZW1vdmUoc3RydWN0IGdwaW9fY2hpcCAqZ2MpOwogZXh0ZXJuIHN0cnVjdCBncGlvX2NoaXAgKm9mX25vZGVfdG9fZ3Bpb2NoaXAoc3RydWN0IGRldmljZV9ub2RlICpucCk7CitleHRlcm4gaW50IG9mX2dwaW9fc2ltcGxlX3hsYXRlKHN0cnVjdCBncGlvX2NoaXAgKmdjLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCWNvbnN0IHZvaWQgKmdwaW9fc3BlYywgdTMyICpmbGFncyk7CiAKICNlbHNlIC8qIENPTkZJR19PRl9HUElPICovCiAKQEAgLTcyLDYgKzc0LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG9mX2dwaW9fc2ltcGxlX3hsYXRlKHN0cnVjdCBncGlvX2NoaXAgKmdjLAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSAgICAgICBjb25zdCB2b2lkICpncGlvX3NwZWMsIHUzMiAqZmxhZ3MpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBvZl9ncGlvY2hpcF9hZGQoc3RydWN0IGdwaW9fY2hpcCAqZ2MpIHsgfQogc3RhdGljIGlubGluZSB2b2lkIG9mX2dwaW9jaGlwX3JlbW92ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYykgeyB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2ZfaXJxLmggYi9pbmNsdWRlL2xpbnV4L29mX2lycS5oCmluZGV4IGU2OTU1ZjUuLmNkMmU2MWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvb2ZfaXJxLmgKKysrIGIvaW5jbHVkZS9saW51eC9vZl9pcnEuaApAQCAtNjMsNiArNjMsOSBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCBpcnFfY3JlYXRlX29mX21hcHBpbmcoc3RydWN0IGRldmljZV9ub2RlICpjb250cm9sbGVyLAogCQkJCQkgIGNvbnN0IHUzMiAqaW50c3BlYywKIAkJCQkJICB1bnNpZ25lZCBpbnQgaW50c2l6ZSk7CisjaWZkZWYgQ09ORklHX0lSUV9ET01BSU4KK2V4dGVybiB2b2lkIGlycV9kaXNwb3NlX21hcHBpbmcodW5zaWduZWQgaW50IGlycSk7CisjZW5kaWYKIGV4dGVybiBpbnQgb2ZfaXJxX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LCBpbnQgaW5kZXgsCiAJCQkgICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnIpOwogZXh0ZXJuIGludCBvZl9pcnFfY291bnQoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOwpAQCAtNzAsNiArNzMsNyBAQAogCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgaW50IG5yX2lycXMpOwogZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfaXJxX2ZpbmRfcGFyZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQpOwogCisKICNlbmRpZiAvKiBDT05GSUdfT0ZfSVJRICovCiAjZW5kaWYgLyogQ09ORklHX09GICovCiAjZW5kaWYgLyogX19PRl9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vZl9uZXQuaCBiL2luY2x1ZGUvbGludXgvb2ZfbmV0LmgKaW5kZXggZTkxMzA4MS4uZjQ3NDY0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZl9uZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L29mX25ldC5oCkBAIC05LDYgKzksNyBAQAogCiAjaWZkZWYgQ09ORklHX09GX05FVAogI2luY2x1ZGUgPGxpbnV4L29mLmg+CitleHRlcm4gY29uc3QgaW50IG9mX2dldF9waHlfbW9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKIGV4dGVybiBjb25zdCB2b2lkICpvZl9nZXRfbWFjX2FkZHJlc3Moc3RydWN0IGRldmljZV9ub2RlICpucCk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmggYi9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaAppbmRleCAzZTVhMWIxLi5lOTBhNjczIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaApAQCAtMTI0LDkgKzEyNCw2IEBACiAKIAkvKiBTTE9CICovCiAJUEdfc2xvYl9mcmVlID0gUEdfcHJpdmF0ZSwKLQotCS8qIFNMVUIgKi8KLQlQR19zbHViX2Zyb3plbiA9IFBHX2FjdGl2ZSwKIH07CiAKICNpZm5kZWYgX19HRU5FUkFUSU5HX0JPVU5EU19ICkBAIC0yMTIsOCArMjA5LDYgQEAKIAogX19QQUdFRkxBRyhTbG9iRnJlZSwgc2xvYl9mcmVlKQogCi1fX1BBR0VGTEFHKFNsdWJGcm96ZW4sIHNsdWJfZnJvemVuKQotCiAvKgogICogUHJpdmF0ZSBwYWdlIG1hcmtpbmdzIHRoYXQgbWF5IGJlIHVzZWQgYnkgdGhlIGZpbGVzeXN0ZW0gdGhhdCBvd25zIHRoZSBwYWdlCiAgKiBmb3IgaXRzIG93biBwdXJwb3Nlcy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpLmggYi9pbmNsdWRlL2xpbnV4L3BjaS5oCmluZGV4IDNhNTYyNmQuLmYyNzg5M2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2kuaApAQCAtODQzLDggKzg0Myw4IEBACiB2b2lkIHBjaV9kaXNhYmxlX2lkbyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1bnNpZ25lZCBsb25nIHR5cGUpOwogCiBlbnVtIHBjaV9vYmZmX3NpZ25hbF90eXBlIHsKLQlQQ0lfRVhQX09CRkZfU0lHTkFMX0wwLAotCVBDSV9FWFBfT0JGRl9TSUdOQUxfQUxXQVlTLAorCVBDSV9FWFBfT0JGRl9TSUdOQUxfTDAgPSAwLAorCVBDSV9FWFBfT0JGRl9TSUdOQUxfQUxXQVlTID0gMSwKIH07CiBpbnQgcGNpX2VuYWJsZV9vYmZmKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGVudW0gcGNpX29iZmZfc2lnbmFsX3R5cGUpOwogdm9pZCBwY2lfZGlzYWJsZV9vYmZmKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwpAQCAtODc5LDcgKzg3OSw3IEBACiB2b2lkIHBkZXZfc29ydF9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKiwgc3RydWN0IHJlc291cmNlX2xpc3QgKik7CiBpbnQgcGNpX2VuYWJsZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKiwgaW50IG1hc2spOwogdm9pZCBwY2lfZml4dXBfaXJxcyh1OCAoKikoc3RydWN0IHBjaV9kZXYgKiwgdTggKiksCi0JCSAgICBpbnQgKCopKHN0cnVjdCBwY2lfZGV2ICosIHU4LCB1OCkpOworCQkgICAgaW50ICgqKShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqLCB1OCwgdTgpKTsKICNkZWZpbmUgSEFWRV9QQ0lfUkVRX1JFR0lPTlMJMgogaW50IF9fbXVzdF9jaGVjayBwY2lfcmVxdWVzdF9yZWdpb25zKHN0cnVjdCBwY2lfZGV2ICosIGNvbnN0IGNoYXIgKik7CiBpbnQgX19tdXN0X2NoZWNrIHBjaV9yZXF1ZXN0X3JlZ2lvbnNfZXhjbHVzaXZlKHN0cnVjdCBwY2lfZGV2ICosIGNvbnN0IGNoYXIgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaCBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCmluZGV4IGIwMGM0ZWMuLmFlOTZiYmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCkBAIC0yNzA5LDYgKzI3MDksMTYgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0gxMF81CTB4M2E2MAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzVfMzQwMF9TRVJJRVNfTFBDX01JTgkweDNiMDAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF81XzM0MDBfU0VSSUVTX0xQQ19NQVgJMHgzYjFmCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkIwCTB4M2MyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfU05CMQkweDNjMjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQjIJMHgzYzIyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkIzCTB4M2MyMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfU05CNAkweDNjMjQKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQjUJMHgzYzI1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkI2CTB4M2MyNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfU05CNwkweDNjMjcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQjgJMHgzYzJlCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkI5CTB4M2MyZgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfU05CCTB4NDAyZgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzUxMDBfMTYJMHg2NWYwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfNTEwMF8yMQkweDY1ZjUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGh5LmggYi9pbmNsdWRlL2xpbnV4L3BoeS5oCmluZGV4IGFkNTE4NjMuLjU0ZmM0MTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGh5LmgKKysrIGIvaW5jbHVkZS9saW51eC9waHkuaApAQCAtNTMsNiArNTMsNyBAQAogCiAvKiBJbnRlcmZhY2UgTW9kZSBkZWZpbml0aW9ucyAqLwogdHlwZWRlZiBlbnVtIHsKKwlQSFlfSU5URVJGQUNFX01PREVfTkEsCiAJUEhZX0lOVEVSRkFDRV9NT0RFX01JSSwKIAlQSFlfSU5URVJGQUNFX01PREVfR01JSSwKIAlQSFlfSU5URVJGQUNFX01PREVfU0dNSUksCkBAIC02Miw3ICs2Myw4IEBACiAJUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJX0lELAogCVBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSV9SWElELAogCVBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSV9UWElELAotCVBIWV9JTlRFUkZBQ0VfTU9ERV9SVEJJCisJUEhZX0lOVEVSRkFDRV9NT0RFX1JUQkksCisJUEhZX0lOVEVSRkFDRV9NT0RFX1NNSUksCiB9IHBoeV9pbnRlcmZhY2VfdDsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvbnRjX3RoZXJtaXN0b3IuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9udGNfdGhlcm1pc3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZDI4NjIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvbnRjX3RoZXJtaXN0b3IuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogbnRjX3RoZXJtaXN0b3IuaCAtIE5UQyBUaGVybWlzdG9ycworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcworICogIE15dW5nSm9vIEhhbSA8bXl1bmdqb28uaGFtQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2lmbmRlZiBfTElOVVhfTlRDX0gKKyNkZWZpbmUgX0xJTlVYX05UQ19ICisKK2VudW0gbnRjX3RoZXJtaXN0b3JfdHlwZSB7CisJVFlQRV9OQ1BYWFdCNDczLAorCVRZUEVfTkNQWFhXTDMzMywKK307CisKK3N0cnVjdCBudGNfdGhlcm1pc3Rvcl9wbGF0Zm9ybV9kYXRhIHsKKwkvKgorCSAqIE9uZSAobm90IGJvdGgpIG9mIHJlYWRfdVYgYW5kIHJlYWRfb2htIHNob3VsZCBiZSBwcm92aWRlZCBhbmQgb25seQorCSAqIG9uZSBvZiB0aGUgdHdvIHNob3VsZCBiZSBwcm92aWRlZC4KKwkgKiBCb3RoIGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIG5lZ2F0aXZlIHZhbHVlIGZvciBhbiBlcnJvciBjYXNlLgorCSAqCisJICogcHVsbHVwX3VWLCBwdWxsdXBfb2htLCBwdWxsZG93bl9vaG0sIGFuZCBjb25uZWN0IGFyZSByZXF1aXJlZCB0byB1c2UKKwkgKiByZWFkX3VWKCkKKwkgKgorCSAqIEhvdyB0byBzZXR1cCBwdWxsdXBfb2htLCBwdWxsZG93bl9vaG0sIGFuZCBjb25uZWN0IGlzCisJICogZGVzY3JpYmVkIGF0IERvY3VtZW50YXRpb24vaHdtb24vbnRjCisJICoKKwkgKiBwdWxsdXAvZG93bl9vaG06IDAgZm9yIGluZmluaXRlIC8gbm90LWNvbm5lY3RlZAorCSAqLworCWludCAoKnJlYWRfdVYpKHZvaWQpOworCXVuc2lnbmVkIGludCBwdWxsdXBfdVY7CisKKwl1bnNpZ25lZCBpbnQgcHVsbHVwX29obTsKKwl1bnNpZ25lZCBpbnQgcHVsbGRvd25fb2htOworCWVudW0geyBOVENfQ09OTkVDVEVEX1BPU0lUSVZFLCBOVENfQ09OTkVDVEVEX0dST1VORCB9IGNvbm5lY3Q7CisKKwlpbnQgKCpyZWFkX29obSkodm9pZCk7Cit9OworCisjZW5kaWYgLyogX0xJTlVYX05UQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bvc2l4X2FjbC5oIGIvaW5jbHVkZS9saW51eC9wb3NpeF9hY2wuaAppbmRleCA5YTUzYjk5Li5iNzY4MTEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Bvc2l4X2FjbC5oCisrKyBiL2luY2x1ZGUvbGludXgvcG9zaXhfYWNsLmgKQEAgLTksNiArOSw3IEBACiAjZGVmaW5lIF9fTElOVVhfUE9TSVhfQUNMX0gKIAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogCiAjZGVmaW5lIEFDTF9VTkRFRklORURfSUQJKC0xKQogCkBAIC0zOCw3ICszOSwxMCBAQAogfTsKIAogc3RydWN0IHBvc2l4X2FjbCB7Ci0JYXRvbWljX3QJCWFfcmVmY291bnQ7CisJdW5pb24geworCQlhdG9taWNfdAkJYV9yZWZjb3VudDsKKwkJc3RydWN0IHJjdV9oZWFkCQlhX3JjdTsKKwl9OwogCXVuc2lnbmVkIGludAkJYV9jb3VudDsKIAlzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5CWFfZW50cmllc1swXTsKIH07CkBAIC02NSw3ICs2OSw3IEBACiBwb3NpeF9hY2xfcmVsZWFzZShzdHJ1Y3QgcG9zaXhfYWNsICphY2wpCiB7CiAJaWYgKGFjbCAmJiBhdG9taWNfZGVjX2FuZF90ZXN0KCZhY2wtPmFfcmVmY291bnQpKQotCQlrZnJlZShhY2wpOworCQlrZnJlZV9yY3UoYWNsLCBhX3JjdSk7CiB9CiAKIApAQCAtNzUsMjkgKzc5LDMxIEBACiBleHRlcm4gc3RydWN0IHBvc2l4X2FjbCAqcG9zaXhfYWNsX2FsbG9jKGludCwgZ2ZwX3QpOwogZXh0ZXJuIGludCBwb3NpeF9hY2xfdmFsaWQoY29uc3Qgc3RydWN0IHBvc2l4X2FjbCAqKTsKIGV4dGVybiBpbnQgcG9zaXhfYWNsX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICosIGNvbnN0IHN0cnVjdCBwb3NpeF9hY2wgKiwgaW50KTsKLWV4dGVybiBzdHJ1Y3QgcG9zaXhfYWNsICpwb3NpeF9hY2xfZnJvbV9tb2RlKG1vZGVfdCwgZ2ZwX3QpOwotZXh0ZXJuIGludCBwb3NpeF9hY2xfZXF1aXZfbW9kZShjb25zdCBzdHJ1Y3QgcG9zaXhfYWNsICosIG1vZGVfdCAqKTsKLWV4dGVybiBpbnQgcG9zaXhfYWNsX2NyZWF0ZShzdHJ1Y3QgcG9zaXhfYWNsICoqLCBnZnBfdCwgbW9kZV90ICopOwotZXh0ZXJuIGludCBwb3NpeF9hY2xfY2htb2Qoc3RydWN0IHBvc2l4X2FjbCAqKiwgZ2ZwX3QsIG1vZGVfdCk7CitleHRlcm4gc3RydWN0IHBvc2l4X2FjbCAqcG9zaXhfYWNsX2Zyb21fbW9kZSh1bW9kZV90LCBnZnBfdCk7CitleHRlcm4gaW50IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGNvbnN0IHN0cnVjdCBwb3NpeF9hY2wgKiwgdW1vZGVfdCAqKTsKK2V4dGVybiBpbnQgcG9zaXhfYWNsX2NyZWF0ZShzdHJ1Y3QgcG9zaXhfYWNsICoqLCBnZnBfdCwgdW1vZGVfdCAqKTsKK2V4dGVybiBpbnQgcG9zaXhfYWNsX2NobW9kKHN0cnVjdCBwb3NpeF9hY2wgKiosIGdmcF90LCB1bW9kZV90KTsKIAogZXh0ZXJuIHN0cnVjdCBwb3NpeF9hY2wgKmdldF9wb3NpeF9hY2woc3RydWN0IGlub2RlICosIGludCk7CiBleHRlcm4gaW50IHNldF9wb3NpeF9hY2woc3RydWN0IGlub2RlICosIGludCwgc3RydWN0IHBvc2l4X2FjbCAqKTsKIAogI2lmZGVmIENPTkZJR19GU19QT1NJWF9BQ0wKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHBvc2l4X2FjbCAqZ2V0X2NhY2hlZF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwb3NpeF9hY2wgKiphY2xfYnlfdHlwZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKIHsKLQlzdHJ1Y3QgcG9zaXhfYWNsICoqcCwgKmFjbDsKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKLQkJcCA9ICZpbm9kZS0+aV9hY2w7Ci0JCWJyZWFrOworCQlyZXR1cm4gJmlub2RlLT5pX2FjbDsKIAljYXNlIEFDTF9UWVBFX0RFRkFVTFQ6Ci0JCXAgPSAmaW5vZGUtPmlfZGVmYXVsdF9hY2w7Ci0JCWJyZWFrOworCQlyZXR1cm4gJmlub2RlLT5pX2RlZmF1bHRfYWNsOwogCWRlZmF1bHQ6Ci0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCQlCVUcoKTsKIAl9Ci0JYWNsID0gQUNDRVNTX09OQ0UoKnApOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwb3NpeF9hY2wgKmdldF9jYWNoZWRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKipwID0gYWNsX2J5X3R5cGUoaW5vZGUsIHR5cGUpOworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCA9IEFDQ0VTU19PTkNFKCpwKTsKIAlpZiAoYWNsKSB7CiAJCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CiAJCWFjbCA9ICpwOwpAQCAtMTA4LDQxICsxMTQsMjAgQEAKIAlyZXR1cm4gYWNsOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBuZWdhdGl2ZV9jYWNoZWRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcG9zaXhfYWNsICpnZXRfY2FjaGVkX2FjbF9yY3Uoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCiB7Ci0Jc3RydWN0IHBvc2l4X2FjbCAqKnAsICphY2w7Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6Ci0JCXAgPSAmaW5vZGUtPmlfYWNsOwotCQlicmVhazsKLQljYXNlIEFDTF9UWVBFX0RFRkFVTFQ6Ci0JCXAgPSAmaW5vZGUtPmlfZGVmYXVsdF9hY2w7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLQlhY2wgPSBBQ0NFU1NfT05DRSgqcCk7Ci0JaWYgKGFjbCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7CisJcmV0dXJuIHJjdV9kZXJlZmVyZW5jZSgqYWNsX2J5X3R5cGUoaW5vZGUsIHR5cGUpKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNldF9jYWNoZWRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICBpbnQgdHlwZSwKIAkJCQkgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCkKIHsKLQlzdHJ1Y3QgcG9zaXhfYWNsICpvbGQgPSBOVUxMOworCXN0cnVjdCBwb3NpeF9hY2wgKipwID0gYWNsX2J5X3R5cGUoaW5vZGUsIHR5cGUpOworCXN0cnVjdCBwb3NpeF9hY2wgKm9sZDsKIAlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgotCQlvbGQgPSBpbm9kZS0+aV9hY2w7Ci0JCWlub2RlLT5pX2FjbCA9IHBvc2l4X2FjbF9kdXAoYWNsKTsKLQkJYnJlYWs7Ci0JY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgotCQlvbGQgPSBpbm9kZS0+aV9kZWZhdWx0X2FjbDsKLQkJaW5vZGUtPmlfZGVmYXVsdF9hY2wgPSBwb3NpeF9hY2xfZHVwKGFjbCk7Ci0JCWJyZWFrOwotCX0KKwlvbGQgPSAqcDsKKwlyY3VfYXNzaWduX3BvaW50ZXIoKnAsIHBvc2l4X2FjbF9kdXAoYWNsKSk7CiAJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwogCWlmIChvbGQgIT0gQUNMX05PVF9DQUNIRUQpCiAJCXBvc2l4X2FjbF9yZWxlYXNlKG9sZCk7CkBAIC0xNTAsMTggKzEzNSwxMSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZm9yZ2V0X2NhY2hlZF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCiB7Ci0Jc3RydWN0IHBvc2l4X2FjbCAqb2xkID0gTlVMTDsKKwlzdHJ1Y3QgcG9zaXhfYWNsICoqcCA9IGFjbF9ieV90eXBlKGlub2RlLCB0eXBlKTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICpvbGQ7CiAJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKLQkJb2xkID0gaW5vZGUtPmlfYWNsOwotCQlpbm9kZS0+aV9hY2wgPSBBQ0xfTk9UX0NBQ0hFRDsKLQkJYnJlYWs7Ci0JY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgotCQlvbGQgPSBpbm9kZS0+aV9kZWZhdWx0X2FjbDsKLQkJaW5vZGUtPmlfZGVmYXVsdF9hY2wgPSBBQ0xfTk9UX0NBQ0hFRDsKLQkJYnJlYWs7Ci0JfQorCW9sZCA9ICpwOworCSpwID0gQUNMX05PVF9DQUNIRUQ7CiAJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwogCWlmIChvbGQgIT0gQUNMX05PVF9DQUNIRUQpCiAJCXBvc2l4X2FjbF9yZWxlYXNlKG9sZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bvd2VyL2JxMjB6NzUuaCBiL2luY2x1ZGUvbGludXgvcG93ZXIvYnEyMHo3NS5oCmluZGV4IGIwODQzYjYuLjEzOThlYjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG93ZXIvYnEyMHo3NS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG93ZXIvYnEyMHo3NS5oCkBAIC0yOSwxMSArMjksMTQgQEAKICAqIEBiYXR0ZXJ5X2RldGVjdDoJCUdQSU8gd2hpY2ggaXMgdXNlZCB0byBkZXRlY3QgYmF0dGVyeSBwcmVzZW5jZQogICogQGJhdHRlcnlfZGV0ZWN0X3ByZXNlbnQ6CWdwaW8gc3RhdGUgd2hlbiBiYXR0ZXJ5IGlzIHByZXNlbnQgKDAgLyAxKQogICogQGkyY19yZXRyeV9jb3VudDoJCSMgb2YgdGltZXMgdG8gcmV0cnkgb24gaTJjIElPIGZhaWx1cmUKKyAqIEBwb2xsX3JldHJ5X2NvdW50OgkJIyBvZiB0aW1lcyB0byByZXRyeSBsb29raW5nIGZvciBuZXcgc3RhdHVzIGFmdGVyCisgKgkJCQlleHRlcm5hbCBjaGFuZ2Ugbm90aWZpY2F0aW9uCiAgKi8KIHN0cnVjdCBicTIwejc1X3BsYXRmb3JtX2RhdGEgewogCWludCBiYXR0ZXJ5X2RldGVjdDsKIAlpbnQgYmF0dGVyeV9kZXRlY3RfcHJlc2VudDsKIAlpbnQgaTJjX3JldHJ5X2NvdW50OworCWludCBwb2xsX3JldHJ5X2NvdW50OwogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bvd2VyL21heDE3MDQyX2JhdHRlcnkuaCBiL2luY2x1ZGUvbGludXgvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5oCmluZGV4IDc5OTVkZWIuLmZlOTkyMTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5oCkBAIC0yMyw4ICsyMyw5OSBAQAogI2lmbmRlZiBfX01BWDE3MDQyX0JBVFRFUllfSF8KICNkZWZpbmUgX19NQVgxNzA0Ml9CQVRURVJZX0hfCiAKKyNkZWZpbmUgTUFYMTcwNDJfU1RBVFVTX0JhdHRBYnNlbnQJKDEgPDwgMykKKyNkZWZpbmUgTUFYMTcwNDJfQkFUVEVSWV9GVUxMCSgxMDApCisjZGVmaW5lIE1BWDE3MDQyX0RFRkFVTFRfU05TX1JFU0lTVE9SCSgxMDAwMCkKKworZW51bSBtYXgxNzA0Ml9yZWdpc3RlciB7CisJTUFYMTcwNDJfU1RBVFVTCQk9IDB4MDAsCisJTUFYMTcwNDJfVkFMUlRfVGgJPSAweDAxLAorCU1BWDE3MDQyX1RBTFJUX1RoCT0gMHgwMiwKKwlNQVgxNzA0Ml9TQUxSVF9UaAk9IDB4MDMsCisJTUFYMTcwNDJfQXRSYXRlCQk9IDB4MDQsCisJTUFYMTcwNDJfUmVwQ2FwCQk9IDB4MDUsCisJTUFYMTcwNDJfUmVwU09DCQk9IDB4MDYsCisJTUFYMTcwNDJfQWdlCQk9IDB4MDcsCisJTUFYMTcwNDJfVEVNUAkJPSAweDA4LAorCU1BWDE3MDQyX1ZDRUxMCQk9IDB4MDksCisJTUFYMTcwNDJfQ3VycmVudAk9IDB4MEEsCisJTUFYMTcwNDJfQXZnQ3VycmVudAk9IDB4MEIsCisJTUFYMTcwNDJfUXJlc2lkdWFsCT0gMHgwQywKKwlNQVgxNzA0Ml9TT0MJCT0gMHgwRCwKKwlNQVgxNzA0Ml9BdlNPQwkJPSAweDBFLAorCU1BWDE3MDQyX1JlbUNhcAkJPSAweDBGLAorCU1BWDE3NDAyX0Z1bGxDQVAJPSAweDEwLAorCU1BWDE3MDQyX1RURQkJPSAweDExLAorCU1BWDE3MDQyX1ZfZW1wdHkJPSAweDEyLAorCisJTUFYMTcwNDJfUlNMT1cJCT0gMHgxNCwKKworCU1BWDE3MDQyX0F2Z1RBCQk9IDB4MTYsCisJTUFYMTcwNDJfQ3ljbGVzCQk9IDB4MTcsCisJTUFYMTcwNDJfRGVzaWduQ2FwCT0gMHgxOCwKKwlNQVgxNzA0Ml9BdmdWQ0VMTAk9IDB4MTksCisJTUFYMTcwNDJfTWluTWF4VGVtcAk9IDB4MUEsCisJTUFYMTcwNDJfTWluTWF4Vm9sdAk9IDB4MUIsCisJTUFYMTcwNDJfTWluTWF4Q3Vycgk9IDB4MUMsCisJTUFYMTcwNDJfQ09ORklHCQk9IDB4MUQsCisJTUFYMTcwNDJfSUNIR1Rlcm0JPSAweDFFLAorCU1BWDE3MDQyX0F2Q2FwCQk9IDB4MUYsCisJTUFYMTcwNDJfTWFuTmFtZQk9IDB4MjAsCisJTUFYMTcwNDJfRGV2TmFtZQk9IDB4MjEsCisJTUFYMTcwNDJfRGV2Q2hlbQk9IDB4MjIsCisKKwlNQVgxNzA0Ml9UZW1wTm9tCT0gMHgyNCwKKwlNQVgxNzA0Ml9UZW1wQ29sZAk9IDB4MjUsCisJTUFYMTcwNDJfVGVtcEhvdAk9IDB4MjYsCisJTUFYMTcwNDJfQUlOCQk9IDB4MjcsCisJTUFYMTcwNDJfTGVhcm5DRkcJPSAweDI4LAorCU1BWDE3MDQyX1NIRlRDRkcJPSAweDI5LAorCU1BWDE3MDQyX1JlbGF4Q0ZHCT0gMHgyQSwKKwlNQVgxNzA0Ml9NaXNjQ0ZHCT0gMHgyQiwKKwlNQVgxNzA0Ml9UR0FJTgkJPSAweDJDLAorCU1BeDE3MDQyX1RPRkYJCT0gMHgyRCwKKwlNQVgxNzA0Ml9DR0FJTgkJPSAweDJFLAorCU1BWDE3MDQyX0NPRkYJCT0gMHgyRiwKKworCU1BWDE3MDQyX1FfZW1wdHkJPSAweDMzLAorCU1BWDE3MDQyX1RfZW1wdHkJPSAweDM0LAorCisJTUFYMTcwNDJfUkNPTVAwCQk9IDB4MzgsCisJTUFYMTcwNDJfVGVtcENvCQk9IDB4MzksCisJTUFYMTcwNDJfUngJCT0gMHgzQSwKKwlNQVgxNzA0Ml9UX2VtcHR5MAk9IDB4M0IsCisJTUFYMTcwNDJfVGFza1BlcmlvZAk9IDB4M0MsCisJTUFYMTcwNDJfRlNUQVQJCT0gMHgzRCwKKworCU1BWDE3MDQyX1NIRE5USU1FUgk9IDB4M0YsCisKKwlNQVgxNzA0Ml9WRlJlbUNhcAk9IDB4NEEsCisKKwlNQVgxNzA0Ml9RSAkJPSAweDRELAorCU1BWDE3MDQyX1FMCQk9IDB4NEUsCit9OworCisvKgorICogdXNlZCBmb3Igc2V0dGluZyBhIHJlZ2lzdGVyIHRvIGEgZGVzaXJlZCB2YWx1ZQorICogYWRkciA6IGFkZHJlc3MgZm9yIGEgcmVnaXN0ZXIKKyAqIGRhdGEgOiBzZXR0aW5nIHZhbHVlIGZvciB0aGUgcmVnaXN0ZXIKKyAqLworc3RydWN0IG1heDE3MDQyX3JlZ19kYXRhIHsKKwl1OCBhZGRyOworCXUxNiBkYXRhOworfTsKKwogc3RydWN0IG1heDE3MDQyX3BsYXRmb3JtX2RhdGEgeworCXN0cnVjdCBtYXgxNzA0Ml9yZWdfZGF0YSAqaW5pdF9kYXRhOworCWludCBudW1faW5pdF9kYXRhOyAvKiBOdW1iZXIgb2YgZW50aWVzIGluIGluaXRfZGF0YSBhcnJheSAqLwogCWJvb2wgZW5hYmxlX2N1cnJlbnRfc2Vuc2U7CisKKwkvKgorCSAqIFJfc25zIGluIG1pY3JvLW9obXMuCisJICogZGVmYXVsdCAxMDAwMCAoaWYgcl9zbnMgPSAwKSBhcyBpdCBpcyB0aGUgcmVjb21tZW5kZWQgdmFsdWUgYnkKKwkgKiB0aGUgZGF0YXNoZWV0IGFsdGhvdWdoIGl0IGNhbiBiZSBjaGFuZ2VkIGJ5IGJvYXJkIGRlc2lnbmVycy4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgcl9zbnM7CiB9OwogCiAjZW5kaWYgLyogX19NQVgxNzA0Ml9CQVRURVJZX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BzdG9yZS5oIGIvaW5jbHVkZS9saW51eC9wc3RvcmUuaAppbmRleCAyNDU1ZWYyLi5jYzAzYmJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BzdG9yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcHN0b3JlLmgKQEAgLTM4LDkgKzM4LDEyIEBACiAJaW50CQkoKm9wZW4pKHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKTsKIAlpbnQJCSgqY2xvc2UpKHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKTsKIAlzc2l6ZV90CQkoKnJlYWQpKHU2NCAqaWQsIGVudW0gcHN0b3JlX3R5cGVfaWQgKnR5cGUsCi0JCQlzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpOwotCXU2NAkJKCp3cml0ZSkoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCBzaXplX3Qgc2l6ZSk7Ci0JaW50CQkoKmVyYXNlKSh1NjQgaWQpOworCQkJc3RydWN0IHRpbWVzcGVjICp0aW1lLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CisJdTY0CQkoKndyaXRlKShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHVuc2lnbmVkIGludCBwYXJ0LAorCQkJc2l6ZV90IHNpemUsIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKTsKKwlpbnQJCSgqZXJhc2UpKGVudW0gcHN0b3JlX3R5cGVfaWQgdHlwZSwgdTY0IGlkLAorCQkJc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpOworCXZvaWQJCSpkYXRhOwogfTsKIAogI2lmZGVmIENPTkZJR19QU1RPUkUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oIGIvaW5jbHVkZS9saW51eC9yYWRpeC10cmVlLmgKaW5kZXggMjMyNDFjMi4uOWQ0NTM5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYWRpeC10cmVlLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYWRpeC10cmVlLmgKQEAgLTM5LDcgKzM5LDE1IEBACiAgKiB3aGVuIGl0IGlzIHNocnVuaywgYmVmb3JlIHdlIHJjdSBmcmVlIHRoZSBub2RlLiBTZWUgc2hyaW5rIGNvZGUgZm9yCiAgKiBkZXRhaWxzLgogICovCi0jZGVmaW5lIFJBRElYX1RSRUVfSU5ESVJFQ1RfUFRSCTEKKyNkZWZpbmUgUkFESVhfVFJFRV9JTkRJUkVDVF9QVFIJCTEKKy8qCisgKiBBIGNvbW1vbiB1c2Ugb2YgdGhlIHJhZGl4IHRyZWUgaXMgdG8gc3RvcmUgcG9pbnRlcnMgdG8gc3RydWN0IHBhZ2VzOworICogYnV0IHNobWVtL3RtcGZzIG5lZWRzIGFsc28gdG8gc3RvcmUgc3dhcCBlbnRyaWVzIGluIHRoZSBzYW1lIHRyZWU6CisgKiB0aG9zZSBhcmUgbWFya2VkIGFzIGV4Y2VwdGlvbmFsIGVudHJpZXMgdG8gZGlzdGluZ3Vpc2ggdGhlbS4KKyAqIEVYQ0VQVElPTkFMX0VOVFJZIHRlc3RzIHRoZSBiaXQsIEVYQ0VQVElPTkFMX1NISUZUIHNoaWZ0cyBjb250ZW50IHBhc3QgaXQuCisgKi8KKyNkZWZpbmUgUkFESVhfVFJFRV9FWENFUFRJT05BTF9FTlRSWQkyCisjZGVmaW5lIFJBRElYX1RSRUVfRVhDRVBUSU9OQUxfU0hJRlQJMgogCiAjZGVmaW5lIHJhZGl4X3RyZWVfaW5kaXJlY3RfdG9fcHRyKHB0cikgXAogCXJhZGl4X3RyZWVfaW5kaXJlY3RfdG9fcHRyKCh2b2lkIF9fZm9yY2UgKikocHRyKSkKQEAgLTE3NCw2ICsxODIsMjggQEAKIH0KIAogLyoqCisgKiByYWRpeF90cmVlX2V4Y2VwdGlvbmFsX2VudHJ5CS0gcmFkaXhfdHJlZV9kZXJlZl9zbG90IGdhdmUgZXhjZXB0aW9uYWwgZW50cnk/CisgKiBAYXJnOgl2YWx1ZSByZXR1cm5lZCBieSByYWRpeF90cmVlX2RlcmVmX3Nsb3QKKyAqIFJldHVybnM6CTAgaWYgd2VsbC1hbGlnbmVkIHBvaW50ZXIsIG5vbi0wIGlmIGV4Y2VwdGlvbmFsIGVudHJ5LgorICovCitzdGF0aWMgaW5saW5lIGludCByYWRpeF90cmVlX2V4Y2VwdGlvbmFsX2VudHJ5KHZvaWQgKmFyZykKK3sKKwkvKiBOb3QgdW5saWtlbHkgYmVjYXVzZSByYWRpeF90cmVlX2V4Y2VwdGlvbiBvZnRlbiB0ZXN0ZWQgZmlyc3QgKi8KKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpYXJnICYgUkFESVhfVFJFRV9FWENFUFRJT05BTF9FTlRSWTsKK30KKworLyoqCisgKiByYWRpeF90cmVlX2V4Y2VwdGlvbgktIHJhZGl4X3RyZWVfZGVyZWZfc2xvdCByZXR1cm5lZCBlaXRoZXIgZXhjZXB0aW9uPworICogQGFyZzoJdmFsdWUgcmV0dXJuZWQgYnkgcmFkaXhfdHJlZV9kZXJlZl9zbG90CisgKiBSZXR1cm5zOgkwIGlmIHdlbGwtYWxpZ25lZCBwb2ludGVyLCBub24tMCBpZiBlaXRoZXIga2luZCBvZiBleGNlcHRpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJhZGl4X3RyZWVfZXhjZXB0aW9uKHZvaWQgKmFyZykKK3sKKwlyZXR1cm4gdW5saWtlbHkoKHVuc2lnbmVkIGxvbmcpYXJnICYKKwkJKFJBRElYX1RSRUVfSU5ESVJFQ1RfUFRSIHwgUkFESVhfVFJFRV9FWENFUFRJT05BTF9FTlRSWSkpOworfQorCisvKioKICAqIHJhZGl4X3RyZWVfcmVwbGFjZV9zbG90CS0gcmVwbGFjZSBpdGVtIGluIGEgc2xvdAogICogQHBzbG90Oglwb2ludGVyIHRvIHNsb3QsIHJldHVybmVkIGJ5IHJhZGl4X3RyZWVfbG9va3VwX3Nsb3QKICAqIEBpdGVtOgluZXcgaXRlbSB0byBzdG9yZSBpbiB0aGUgc2xvdC4KQEAgLTE5NCw4ICsyMjQsOCBAQAogdW5zaWduZWQgaW50CiByYWRpeF90cmVlX2dhbmdfbG9va3VwKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHZvaWQgKipyZXN1bHRzLAogCQkJdW5zaWduZWQgbG9uZyBmaXJzdF9pbmRleCwgdW5zaWduZWQgaW50IG1heF9pdGVtcyk7Ci11bnNpZ25lZCBpbnQKLXJhZGl4X3RyZWVfZ2FuZ19sb29rdXBfc2xvdChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB2b2lkICoqKnJlc3VsdHMsCit1bnNpZ25lZCBpbnQgcmFkaXhfdHJlZV9nYW5nX2xvb2t1cF9zbG90KHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsCisJCQl2b2lkICoqKnJlc3VsdHMsIHVuc2lnbmVkIGxvbmcgKmluZGljZXMsCiAJCQl1bnNpZ25lZCBsb25nIGZpcnN0X2luZGV4LCB1bnNpZ25lZCBpbnQgbWF4X2l0ZW1zKTsKIHVuc2lnbmVkIGxvbmcgcmFkaXhfdHJlZV9uZXh0X2hvbGUoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKIAkJCQl1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIG1heF9zY2FuKTsKQEAgLTIyMiw2ICsyNTIsNyBAQAogCQl1bnNpZ25lZCBsb25nIG5yX3RvX3RhZywKIAkJdW5zaWduZWQgaW50IGZyb210YWcsIHVuc2lnbmVkIGludCB0b3RhZyk7CiBpbnQgcmFkaXhfdHJlZV90YWdnZWQoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwgdW5zaWduZWQgaW50IHRhZyk7Cit1bnNpZ25lZCBsb25nIHJhZGl4X3RyZWVfbG9jYXRlX2l0ZW0oc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwgdm9pZCAqaXRlbSk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByYWRpeF90cmVlX3ByZWxvYWRfZW5kKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaAppbmRleCA5ZTg3YzFjLi4yNmY2ZWE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmgKQEAgLTEyMiw2ICsxMjIsOSBAQAogc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgewogCWNvbnN0IGNoYXIgKnN1cHBseTsKIAlzdHJ1Y3QgcmVndWxhdG9yICpjb25zdW1lcjsKKworCS8qIEludGVybmFsIHVzZSAqLworCWludCByZXQ7CiB9OwogCiAjaWYgZGVmaW5lZChDT05GSUdfUkVHVUxBVE9SKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmggYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaAppbmRleCA2YzQzM2I4Li4xYTgwYmM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaApAQCAtMTg4LDE4ICsxODgsMTYgQEAKIAogCS8qIGxpc3RzIHdlIGJlbG9uZyB0byAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsgLyogbGlzdCBvZiBhbGwgcmVndWxhdG9ycyAqLwotCXN0cnVjdCBsaXN0X2hlYWQgc2xpc3Q7IC8qIGxpc3Qgb2Ygc3VwcGxpZWQgcmVndWxhdG9ycyAqLwogCiAJLyogbGlzdHMgd2Ugb3duICovCiAJc3RydWN0IGxpc3RfaGVhZCBjb25zdW1lcl9saXN0OyAvKiBjb25zdW1lcnMgd2Ugc3VwcGx5ICovCi0Jc3RydWN0IGxpc3RfaGVhZCBzdXBwbHlfbGlzdDsgLyogcmVndWxhdG9ycyB3ZSBzdXBwbHkgKi8KIAogCXN0cnVjdCBibG9ja2luZ19ub3RpZmllcl9oZWFkIG5vdGlmaWVyOwogCXN0cnVjdCBtdXRleCBtdXRleDsgLyogY29uc3VtZXIgbG9jayAqLwogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwogCXN0cnVjdCBkZXZpY2UgZGV2OwogCXN0cnVjdCByZWd1bGF0aW9uX2NvbnN0cmFpbnRzICpjb25zdHJhaW50czsKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqc3VwcGx5OwkvKiBmb3IgdHJlZSAqLworCXN0cnVjdCByZWd1bGF0b3IgKnN1cHBseTsJLyogZm9yIHRyZWUgKi8KIAogCXZvaWQgKnJlZ19kYXRhOwkJLyogcmVndWxhdG9yX2RldiBkYXRhICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfc2NpLmgKaW5kZXggYTJhZmM5Zi4uOGJmZmU5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWxfc2NpLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfc2NpLmgKQEAgLTgsNiArOCw4IEBACiAgKiBHZW5lcmljIGhlYWRlciBmb3IgU3VwZXJIIFNDSShGKSAodXNlZCBieSBzaC9zaDY0L2g4MzAwIGFuZCByZWxhdGVkIHBhcnRzKQogICovCiAKKyNkZWZpbmUgU0NJeF9OT1RfU1VQUE9SVEVECSgtMSkKKwogZW51bSB7CiAJU0NCUlJfQUxHT18xLAkJLyogKChjbGsgKyAxNiAqIGJwcykgLyAoMTYgKiBicHMpIC0gMSkgKi8KIAlTQ0JSUl9BTEdPXzIsCQkvKiAoKGNsayArIDE2ICogYnBzKSAvICgzMiAqIGJwcykgLSAxKSAqLwpAQCAtMjUsNiArMjcsMjggQEAKICNkZWZpbmUgU0NTQ1JfQ0tFMQkoMSA8PCAxKQogI2RlZmluZSBTQ1NDUl9DS0UwCSgxIDw8IDApCiAKKy8qIFNDeFNSIFNDSSAqLworI2RlZmluZSBTQ0lfVERSRSAgMHg4MAorI2RlZmluZSBTQ0lfUkRSRiAgMHg0MAorI2RlZmluZSBTQ0lfT1JFUiAgMHgyMAorI2RlZmluZSBTQ0lfRkVSICAgMHgxMAorI2RlZmluZSBTQ0lfUEVSICAgMHgwOAorI2RlZmluZSBTQ0lfVEVORCAgMHgwNAorCisjZGVmaW5lIFNDSV9ERUZBVUxUX0VSUk9SX01BU0sgKFNDSV9QRVIgfCBTQ0lfRkVSKQorCisvKiBTQ3hTUiBTQ0lGICovCisjZGVmaW5lIFNDSUZfRVIgICAgMHgwMDgwCisjZGVmaW5lIFNDSUZfVEVORCAgMHgwMDQwCisjZGVmaW5lIFNDSUZfVERGRSAgMHgwMDIwCisjZGVmaW5lIFNDSUZfQlJLICAgMHgwMDEwCisjZGVmaW5lIFNDSUZfRkVSICAgMHgwMDA4CisjZGVmaW5lIFNDSUZfUEVSICAgMHgwMDA0CisjZGVmaW5lIFNDSUZfUkRGICAgMHgwMDAyCisjZGVmaW5lIFNDSUZfRFIgICAgMHgwMDAxCisKKyNkZWZpbmUgU0NJRl9ERUZBVUxUX0VSUk9SX01BU0sgKFNDSUZfUEVSIHwgU0NJRl9GRVIgfCBTQ0lGX0VSIHwgU0NJRl9CUkspCisKIC8qIE9mZnNldHMgaW50byB0aGUgc2NpX3BvcnQtPmlycXMgYXJyYXkgKi8KIGVudW0gewogCVNDSXhfRVJJX0lSUSwKQEAgLTMyLDYgKzU2LDI0IEBACiAJU0NJeF9UWElfSVJRLAogCVNDSXhfQlJJX0lSUSwKIAlTQ0l4X05SX0lSUVMsCisKKwlTQ0l4X01VWF9JUlEgPSBTQ0l4X05SX0lSUVMsCS8qIHNwZWNpYWwgY2FzZSAqLworfTsKKworZW51bSB7CisJU0NJeF9QUk9CRV9SRUdUWVBFLAorCisJU0NJeF9TQ0lfUkVHVFlQRSwKKwlTQ0l4X0lSREFfUkVHVFlQRSwKKwlTQ0l4X1NDSUZBX1JFR1RZUEUsCisJU0NJeF9TQ0lGQl9SRUdUWVBFLAorCVNDSXhfU0gzX1NDSUZfUkVHVFlQRSwKKwlTQ0l4X1NINF9TQ0lGX1JFR1RZUEUsCisJU0NJeF9TSDRfU0NJRl9OT19TQ1NQVFJfUkVHVFlQRSwKKwlTQ0l4X1NINF9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCisJU0NJeF9TSDc3MDVfU0NJRl9SRUdUWVBFLAorCisJU0NJeF9OUl9SRUdUWVBFUywKIH07CiAKICNkZWZpbmUgU0NJeF9JUlFfTVVYRUQoaXJxKQkJXApAQCAtNDIsOCArODQsMjkgQEAKIAlbU0NJeF9CUklfSVJRXQk9IChpcnEpLAlcCiB9CiAKKyNkZWZpbmUgU0NJeF9JUlFfSVNfTVVYRUQocG9ydCkJCQlcCisJKChwb3J0KS0+Y2ZnLT5pcnFzW1NDSXhfRVJJX0lSUV0gPT0JXAorCSAocG9ydCktPmNmZy0+aXJxc1tTQ0l4X1JYSV9JUlFdKSB8fAlcCisJKChwb3J0KS0+Y2ZnLT5pcnFzW1NDSXhfRVJJX0lSUV0gJiYJXAorCSAhKHBvcnQpLT5jZmctPmlycXNbU0NJeF9SWElfSVJRXSkKKy8qCisgKiBTQ0kgcmVnaXN0ZXIgc3Vic2V0IGNvbW1vbiBmb3IgYWxsIHBvcnQgdHlwZXMuCisgKiBOb3QgYWxsIHJlZ2lzdGVycyB3aWxsIGV4aXN0IG9uIGFsbCBwYXJ0cy4KKyAqLworZW51bSB7CisJU0NTTVIsIFNDQlJSLCBTQ1NDUiwgU0N4U1IsCisJU0NGQ1IsIFNDRkRSLCBTQ3hURFIsIFNDeFJEUiwKKwlTQ0xTUiwgU0NURkRSLCBTQ1JGRFIsIFNDU1BUUiwKKworCVNDSXhfTlJfUkVHUywKK307CisKIHN0cnVjdCBkZXZpY2U7CiAKK3N0cnVjdCBwbGF0X3NjaV9wb3J0X29wcyB7CisJdm9pZCAoKmluaXRfcGlucykoc3RydWN0IHVhcnRfcG9ydCAqLCB1bnNpZ25lZCBpbnQgY2ZsYWcpOworfTsKKwogLyoKICAqIFBsYXRmb3JtIGRldmljZSBzcGVjaWZpYyBwbGF0Zm9ybV9kYXRhIHN0cnVjdAogICovCkBAIC01Niw2ICsxMTksMTggQEAKIAl1bnNpZ25lZCBpbnQJc2NicnJfYWxnb19pZDsJCS8qIFNDQlJSIGNhbGN1bGF0aW9uIGFsZ28gKi8KIAl1bnNpZ25lZCBpbnQJc2NzY3I7CQkJLyogU0NTQ1IgaW5pdGlhbGl6YXRpb24gKi8KIAorCS8qCisJICogUGxhdGZvcm0gb3ZlcnJpZGVzIGlmIG5lY2Vzc2FyeSwgZGVmYXVsdHMgb3RoZXJ3aXNlLgorCSAqLworCWludAkJb3ZlcnJ1bl9iaXQ7CisJdW5zaWduZWQgaW50CWVycm9yX21hc2s7CisKKwlpbnQJCXBvcnRfcmVnOworCXVuc2lnbmVkIGNoYXIJcmVnc2hpZnQ7CisJdW5zaWduZWQgY2hhcglyZWd0eXBlOworCisJc3RydWN0IHBsYXRfc2NpX3BvcnRfb3BzCSpvcHM7CisKIAlzdHJ1Y3QgZGV2aWNlCSpkbWFfZGV2OwogCiAJdW5zaWduZWQgaW50CWRtYV9zbGF2ZV90eDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2hfY2xrLmggYi9pbmNsdWRlL2xpbnV4L3NoX2Nsay5oCmluZGV4IDlhNTJmNzIuLjNjY2YxODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2hfY2xrLmgKKysrIGIvaW5jbHVkZS9saW51eC9zaF9jbGsuaApAQCAtMTQ3LDQgKzE0Nyw4IEBACiBpbnQgc2hfY2xrX2RpdjZfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrcywgaW50IG5yKTsKIGludCBzaF9jbGtfZGl2Nl9yZXBhcmVudF9yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGtzLCBpbnQgbnIpOwogCisjZGVmaW5lIENMS0RFVl9DT05fSUQoX2lkLCBfY2xrKSB7IC5jb25faWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KKyNkZWZpbmUgQ0xLREVWX0RFVl9JRChfaWQsIF9jbGspIHsgLmRldl9pZCA9IF9pZCwgLmNsayA9IF9jbGsgfQorI2RlZmluZSBDTEtERVZfSUNLX0lEKF9jaWQsIF9kaWQsIF9jbGspIHsgLmNvbl9pZCA9IF9jaWQsIC5kZXZfaWQgPSBfZGlkLCAuY2xrID0gX2NsayB9CisKICNlbmRpZiAvKiBfX1NIX0NMT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2hfZG1hLmggYi9pbmNsdWRlL2xpbnV4L3NoX2RtYS5oCmluZGV4IGIwOGNkNGUuLmNiMmRkMTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2hfZG1hLmgKKysrIGIvaW5jbHVkZS9saW51eC9zaF9kbWEuaApAQCAtNjIsNiArNjIsMTIgQEAKIAljb25zdCB1bnNpZ25lZCBpbnQgKnRzX3NoaWZ0OwogCWludCB0c19zaGlmdF9udW07CiAJdTE2IGRtYW9yX2luaXQ7CisJdW5zaWduZWQgaW50IGNoY3Jfb2Zmc2V0OworCXUzMiBjaGNyX2llX2JpdDsKKworCXVuc2lnbmVkIGludCBkbWFvcl9pc18zMmJpdDoxOworCXVuc2lnbmVkIGludCBuZWVkc190ZW5kX3NldDoxOworCXVuc2lnbmVkIGludCBub19kbWFyczoxOwogfTsKIAogLyogRE1BIHJlZ2lzdGVyICovCkBAIC03MSw2ICs3Nyw4IEBACiAjZGVmaW5lIENIQ1IJMHgwQwogI2RlZmluZSBETUFPUgkweDQwCiAKKyNkZWZpbmUgVEVORAkweDE4IC8qIFVTQi1ETUFDICovCisKIC8qIERNQU9SIGRlZmluaXRpb25zICovCiAjZGVmaW5lIERNQU9SX0FFCTB4MDAwMDAwMDQKICNkZWZpbmUgRE1BT1JfTk1JRgkweDAwMDAwMDAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NobS5oIGIvaW5jbHVkZS9saW51eC9zaG0uaAppbmRleCA3ZDI3ZmZkLi45MjgwOGI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NobS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2htLmgKQEAgLTk1LDYgKzk1LDkgQEAKIAlwaWRfdAkJCXNobV9jcHJpZDsKIAlwaWRfdAkJCXNobV9scHJpZDsKIAlzdHJ1Y3QgdXNlcl9zdHJ1Y3QJKm1sb2NrX3VzZXI7CisKKwkvKiBUaGUgdGFzayBjcmVhdGVkIHRoZSBzaG0gb2JqZWN0LiAgTlVMTCBpZiB0aGUgdGFzayBpcyBkZWFkLiAqLworCXN0cnVjdCB0YXNrX3N0cnVjdAkqc2htX2NyZWF0b3I7CiB9OwogCiAvKiBzaG1fbW9kZSB1cHBlciBieXRlIGZsYWdzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NobWVtX2ZzLmggYi9pbmNsdWRlL2xpbnV4L3NobWVtX2ZzLmgKaW5kZXggYWEwOGZhOC4uOTI5MWFjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zaG1lbV9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvc2htZW1fZnMuaApAQCAtOCwyMiArOCwxNSBAQAogCiAvKiBpbm9kZSBpbi1rZXJuZWwgZGF0YSAqLwogCi0jZGVmaW5lIFNITUVNX05SX0RJUkVDVCAxNgotCi0jZGVmaW5lIFNITUVNX1NZTUxJTktfSU5MSU5FX0xFTiAoU0hNRU1fTlJfRElSRUNUICogc2l6ZW9mKHN3cF9lbnRyeV90KSkKLQogc3RydWN0IHNobWVtX2lub2RlX2luZm8gewogCXNwaW5sb2NrX3QJCWxvY2s7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAJdW5zaWduZWQgbG9uZwkJYWxsb2NlZDsJLyogZGF0YSBwYWdlcyBhbGxvY2VkIHRvIGZpbGUgKi8KLQl1bnNpZ25lZCBsb25nCQlzd2FwcGVkOwkvKiBzdWJ0b3RhbCBhc3NpZ25lZCB0byBzd2FwICovCi0JdW5zaWduZWQgbG9uZwkJbmV4dF9pbmRleDsJLyogaGlnaGVzdCBhbGxvY2VkIGluZGV4ICsgMSAqLwotCXN0cnVjdCBzaGFyZWRfcG9saWN5CXBvbGljeTsJCS8qIE5VTUEgbWVtb3J5IGFsbG9jIHBvbGljeSAqLwotCXN0cnVjdCBwYWdlCQkqaV9pbmRpcmVjdDsJLyogdG9wIGluZGlyZWN0IGJsb2NrcyBwYWdlICovCiAJdW5pb24gewotCQlzd3BfZW50cnlfdAlpX2RpcmVjdFtTSE1FTV9OUl9ESVJFQ1RdOyAvKiBmaXJzdCBibG9ja3MgKi8KLQkJY2hhcgkJaW5saW5lX3N5bWxpbmtbU0hNRU1fU1lNTElOS19JTkxJTkVfTEVOXTsKKwkJdW5zaWduZWQgbG9uZwlzd2FwcGVkOwkvKiBzdWJ0b3RhbCBhc3NpZ25lZCB0byBzd2FwICovCisJCWNoYXIJCSpzeW1saW5rOwkvKiB1bnN3YXBwYWJsZSBzaG9ydCBzeW1saW5rICovCiAJfTsKKwlzdHJ1Y3Qgc2hhcmVkX3BvbGljeQlwb2xpY3k7CQkvKiBOVU1BIG1lbW9yeSBhbGxvYyBwb2xpY3kgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCXN3YXBsaXN0OwkvKiBjaGFpbiBvZiBtYXliZXMgb24gc3dhcCAqLwogCXN0cnVjdCBsaXN0X2hlYWQJeGF0dHJfbGlzdDsJLyogbGlzdCBvZiBzaG1lbV94YXR0ciAqLwogCXN0cnVjdCBpbm9kZQkJdmZzX2lub2RlOwpAQCAtNDksNyArNDIsNyBAQAogLyoKICAqIEZ1bmN0aW9ucyBpbiBtbS9zaG1lbS5jIGNhbGxlZCBkaXJlY3RseSBmcm9tIGVsc2V3aGVyZToKICAqLwotZXh0ZXJuIGludCBpbml0X3RtcGZzKHZvaWQpOworZXh0ZXJuIGludCBzaG1lbV9pbml0KHZvaWQpOwogZXh0ZXJuIGludCBzaG1lbV9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpOwogZXh0ZXJuIHN0cnVjdCBmaWxlICpzaG1lbV9maWxlX3NldHVwKGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJCWxvZmZfdCBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKQEAgLTU5LDggKzUyLDYgQEAKIAkJCQkJcGdvZmZfdCBpbmRleCwgZ2ZwX3QgZ2ZwX21hc2spOwogZXh0ZXJuIHZvaWQgc2htZW1fdHJ1bmNhdGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKTsKIGV4dGVybiBpbnQgc2htZW1fdW51c2Uoc3dwX2VudHJ5X3QgZW50cnksIHN0cnVjdCBwYWdlICpwYWdlKTsKLWV4dGVybiB2b2lkIG1lbV9jZ3JvdXBfZ2V0X3NobWVtX3RhcmdldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBwZ29mZl90IHBnb2ZmLAotCQkJCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VwLCBzd3BfZW50cnlfdCAqZW50KTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqc2htZW1fcmVhZF9tYXBwaW5nX3BhZ2UoCiAJCQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHBnb2ZmX3QgaW5kZXgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmggYi9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmgKaW5kZXggNGIzNWMwNi4uZjU4ZDY0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaApAQCAtMjQsNiArMjQsNyBAQAogCUFMTE9DX0ZST01fUEFSVElBTCwJLyogQ3B1IHNsYWIgYWNxdWlyZWQgZnJvbSBwYXJ0aWFsIGxpc3QgKi8KIAlBTExPQ19TTEFCLAkJLyogQ3B1IHNsYWIgYWNxdWlyZWQgZnJvbSBwYWdlIGFsbG9jYXRvciAqLwogCUFMTE9DX1JFRklMTCwJCS8qIFJlZmlsbCBjcHUgc2xhYiBmcm9tIHNsYWIgZnJlZWxpc3QgKi8KKwlBTExPQ19OT0RFX01JU01BVENILAkvKiBTd2l0Y2hpbmcgY3B1IHNsYWIgKi8KIAlGUkVFX1NMQUIsCQkvKiBTbGFiIGZyZWVkIHRvIHRoZSBwYWdlIGFsbG9jYXRvciAqLwogCUNQVVNMQUJfRkxVU0gsCQkvKiBBYmFuZG9uaW5nIG9mIHRoZSBjcHUgc2xhYiAqLwogCURFQUNUSVZBVEVfRlVMTCwJLyogQ3B1IHNsYWIgd2FzIGZ1bGwgd2hlbiBkZWFjdGl2YXRlZCAqLwpAQCAtMzEsOCArMzIsMTAgQEAKIAlERUFDVElWQVRFX1RPX0hFQUQsCS8qIENwdSBzbGFiIHdhcyBtb3ZlZCB0byB0aGUgaGVhZCBvZiBwYXJ0aWFscyAqLwogCURFQUNUSVZBVEVfVE9fVEFJTCwJLyogQ3B1IHNsYWIgd2FzIG1vdmVkIHRvIHRoZSB0YWlsIG9mIHBhcnRpYWxzICovCiAJREVBQ1RJVkFURV9SRU1PVEVfRlJFRVMsLyogU2xhYiBjb250YWluZWQgcmVtb3RlbHkgZnJlZWQgb2JqZWN0cyAqLworCURFQUNUSVZBVEVfQllQQVNTLAkvKiBJbXBsaWNpdCBkZWFjdGl2YXRpb24gKi8KIAlPUkRFUl9GQUxMQkFDSywJCS8qIE51bWJlciBvZiB0aW1lcyBmYWxsYmFjayB3YXMgbmVjZXNzYXJ5ICovCiAJQ01QWENIR19ET1VCTEVfQ1BVX0ZBSUwsLyogRmFpbHVyZSBvZiB0aGlzX2NwdV9jbXB4Y2hnX2RvdWJsZSAqLworCUNNUFhDSEdfRE9VQkxFX0ZBSUwsCS8qIE51bWJlciBvZiB0aW1lcyB0aGF0IGNtcHhjaGcgZG91YmxlIGRpZCBub3QgbWF0Y2ggKi8KIAlOUl9TTFVCX1NUQVRfSVRFTVMgfTsKIAogc3RydWN0IGttZW1fY2FjaGVfY3B1IHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dhcG9wcy5oIGIvaW5jbHVkZS9saW51eC9zd2Fwb3BzLmgKaW5kZXggY2Q0MmUzMC4uMjE4OWQzZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zd2Fwb3BzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zd2Fwb3BzLmgKQEAgLTEsMyArMSw4IEBACisjaWZuZGVmIF9MSU5VWF9TV0FQT1BTX0gKKyNkZWZpbmUgX0xJTlVYX1NXQVBPUFNfSAorCisjaW5jbHVkZSA8bGludXgvcmFkaXgtdHJlZS5oPgorCiAvKgogICogc3dhcGNhY2hlIHBhZ2VzIGFyZSBzdG9yZWQgaW4gdGhlIHN3YXBwZXJfc3BhY2UgcmFkaXggdHJlZS4gIFdlIHdhbnQgdG8KICAqIGdldCBnb29kIHBhY2tpbmcgZGVuc2l0eSBpbiB0aGF0IHRyZWUsIHNvIHRoZSBpbmRleCBzaG91bGQgYmUgZGVuc2UgaW4KQEAgLTc2LDYgKzgxLDIyIEBACiAJcmV0dXJuIF9fc3dwX2VudHJ5X3RvX3B0ZShhcmNoX2VudHJ5KTsKIH0KIAorc3RhdGljIGlubGluZSBzd3BfZW50cnlfdCByYWRpeF90b19zd3BfZW50cnkodm9pZCAqYXJnKQoreworCXN3cF9lbnRyeV90IGVudHJ5OworCisJZW50cnkudmFsID0gKHVuc2lnbmVkIGxvbmcpYXJnID4+IFJBRElYX1RSRUVfRVhDRVBUSU9OQUxfU0hJRlQ7CisJcmV0dXJuIGVudHJ5OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnN3cF90b19yYWRpeF9lbnRyeShzd3BfZW50cnlfdCBlbnRyeSkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCisJdmFsdWUgPSBlbnRyeS52YWwgPDwgUkFESVhfVFJFRV9FWENFUFRJT05BTF9TSElGVDsKKwlyZXR1cm4gKHZvaWQgKikodmFsdWUgfCBSQURJWF9UUkVFX0VYQ0VQVElPTkFMX0VOVFJZKTsKK30KKwogI2lmZGVmIENPTkZJR19NSUdSQVRJT04KIHN0YXRpYyBpbmxpbmUgc3dwX2VudHJ5X3QgbWFrZV9taWdyYXRpb25fZW50cnkoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCB3cml0ZSkKIHsKQEAgLTE2OSwzICsxOTAsNSBAQAogCXJldHVybiAwOwogfQogI2VuZGlmCisKKyNlbmRpZiAvKiBfTElOVVhfU1dBUE9QU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RoZXJtYWwuaCBiL2luY2x1ZGUvbGludXgvdGhlcm1hbC5oCmluZGV4IGQzZWM4OWYuLjQ3YjRhMjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGhlcm1hbC5oCisrKyBiL2luY2x1ZGUvbGludXgvdGhlcm1hbC5oCkBAIC04NSwyMiArODUsNiBAQAogCQkJCSgobG9uZyl0LTI3MzIrNSkvMTAgOiAoKGxvbmcpdC0yNzMyLTUpLzEwKQogI2RlZmluZSBDRUxTSVVTX1RPX0tFTFZJTih0KQkoKHQpKjEwKzI3MzIpCiAKLSNpZiBkZWZpbmVkKENPTkZJR19USEVSTUFMX0hXTU9OKQotLyogdGhlcm1hbCB6b25lIGRldmljZXMgd2l0aCB0aGUgc2FtZSB0eXBlIHNoYXJlIG9uZSBod21vbiBkZXZpY2UgKi8KLXN0cnVjdCB0aGVybWFsX2h3bW9uX2RldmljZSB7Ci0JY2hhciB0eXBlW1RIRVJNQUxfTkFNRV9MRU5HVEhdOwotCXN0cnVjdCBkZXZpY2UgKmRldmljZTsKLQlpbnQgY291bnQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCB0el9saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKLX07Ci0KLXN0cnVjdCB0aGVybWFsX2h3bW9uX2F0dHIgewotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGF0dHI7Ci0JY2hhciBuYW1lWzE2XTsKLX07Ci0jZW5kaWYKLQogc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgewogCWludCBpZDsKIAljaGFyIHR5cGVbVEhFUk1BTF9OQU1FX0xFTkdUSF07CkBAIC0xMjAsMTIgKzEwNCw2IEBACiAJc3RydWN0IG11dGV4IGxvY2s7CS8qIHByb3RlY3QgY29vbGluZyBkZXZpY2VzIGxpc3QgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CiAJc3RydWN0IGRlbGF5ZWRfd29yayBwb2xsX3F1ZXVlOwotI2lmIGRlZmluZWQoQ09ORklHX1RIRVJNQUxfSFdNT04pCi0Jc3RydWN0IGxpc3RfaGVhZCBod21vbl9ub2RlOwotCXN0cnVjdCB0aGVybWFsX2h3bW9uX2RldmljZSAqaHdtb247Ci0Jc3RydWN0IHRoZXJtYWxfaHdtb25fYXR0ciB0ZW1wX2lucHV0OwkvKiBod21vbiBzeXMgYXR0ciAqLwotCXN0cnVjdCB0aGVybWFsX2h3bW9uX2F0dHIgdGVtcF9jcml0OwkvKiBod21vbiBzeXMgYXR0ciAqLwotI2VuZGlmCiB9OwogLyogQWRkaW5nIGV2ZW50IG5vdGlmaWNhdGlvbiBzdXBwb3J0IGVsZW1lbnRzICovCiAjZGVmaW5lIFRIRVJNQUxfR0VOTF9GQU1JTFlfTkFNRSAgICAgICAgICAgICAgICAidGhlcm1hbF9ldmVudCIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmggYi9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oCmluZGV4IDhhNGMzMDkuLmZjYTI0Y2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgKKysrIGIvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaApAQCAtMzc2LDcgKzM3NiwxNiBAQAogI2RlZmluZSBWNEwyX1BJWF9GTVRfTUpQRUcgICAgdjRsMl9mb3VyY2MoJ00nLCAnSicsICdQJywgJ0cnKSAvKiBNb3Rpb24tSlBFRyAgICovCiAjZGVmaW5lIFY0TDJfUElYX0ZNVF9KUEVHICAgICB2NGwyX2ZvdXJjYygnSicsICdQJywgJ0UnLCAnRycpIC8qIEpGSUYgSlBFRyAgICAgKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX0RWICAgICAgIHY0bDJfZm91cmNjKCdkJywgJ3YnLCAncycsICdkJykgLyogMTM5NCAgICAgICAgICAqLwotI2RlZmluZSBWNEwyX1BJWF9GTVRfTVBFRyAgICAgdjRsMl9mb3VyY2MoJ00nLCAnUCcsICdFJywgJ0cnKSAvKiBNUEVHLTEvMi80ICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9NUEVHICAgICB2NGwyX2ZvdXJjYygnTScsICdQJywgJ0UnLCAnRycpIC8qIE1QRUctMS8yLzQgTXVsdGlwbGV4ZWQgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0gyNjQgICAgIHY0bDJfZm91cmNjKCdIJywgJzInLCAnNicsICc0JykgLyogSDI2NCB3aXRoIHN0YXJ0IGNvZGVzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9IMjY0X05PX1NDIHY0bDJfZm91cmNjKCdBJywgJ1YnLCAnQycsICcxJykgLyogSDI2NCB3aXRob3V0IHN0YXJ0IGNvZGVzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9IMjYzICAgICB2NGwyX2ZvdXJjYygnSCcsICcyJywgJzYnLCAnMycpIC8qIEgyNjMgICAgICAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX01QRUcxICAgIHY0bDJfZm91cmNjKCdNJywgJ1AnLCAnRycsICcxJykgLyogTVBFRy0xIEVTICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTVBFRzIgICAgdjRsMl9mb3VyY2MoJ00nLCAnUCcsICdHJywgJzInKSAvKiBNUEVHLTIgRVMgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9NUEVHNCAgICB2NGwyX2ZvdXJjYygnTScsICdQJywgJ0cnLCAnNCcpIC8qIE1QRUctNCBFUyAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1hWSUQgICAgIHY0bDJfZm91cmNjKCdYJywgJ1YnLCAnSScsICdEJykgLyogWHZpZCAgICAgICAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1ZDMV9BTk5FWF9HIHY0bDJfZm91cmNjKCdWJywgJ0MnLCAnMScsICdHJykgLyogU01QVEUgNDIxTSBBbm5leCBHIGNvbXBsaWFudCBzdHJlYW0gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1ZDMV9BTk5FWF9MIHY0bDJfZm91cmNjKCdWJywgJ0MnLCAnMScsICdMJykgLyogU01QVEUgNDIxTSBBbm5leCBMIGNvbXBsaWFudCBzdHJlYW0gKi8KIAogLyogIFZlbmRvci1zcGVjaWZpYyBmb3JtYXRzICAgKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX0NQSUExICAgIHY0bDJfZm91cmNjKCdDJywgJ1AnLCAnSScsICdBJykgLyogY3BpYTEgWVVWICovCkBAIC00MDIsNiArNDExLDcgQEAKICNkZWZpbmUgVjRMMl9QSVhfRk1UX0NJVF9ZWVZZVVkgdjRsMl9mb3VyY2MoJ0MnLCAnSScsICdUJywgJ1YnKSAvKiBvbmUgbGluZSBvZiBZIHRoZW4gMSBsaW5lIG9mIFZZVVkgKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX0tPTklDQTQyMCAgdjRsMl9mb3VyY2MoJ0snLCAnTycsICdOJywgJ0knKSAvKiBZVVY0MjAgcGxhbmFyIGluIGJsb2NrcyBvZiAyNTYgcGl4ZWxzICovCiAjZGVmaW5lIFY0TDJfUElYX0ZNVF9KUEdMCXY0bDJfZm91cmNjKCdKJywgJ1AnLCAnRycsICdMJykgLyogSlBFRy1MaXRlICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TRTQwMSAgICAgIHY0bDJfZm91cmNjKCdTJywgJzQnLCAnMCcsICcxJykgLyogc2U0MDEgamFuZ2d1IGNvbXByZXNzZWQgcmdiICovCiAKIC8qCiAgKglGIE8gUiBNIEEgVCAgIEUgTiBVIE0gRSBSIEEgVCBJIE8gTgpAQCAtMTAyNiw2ICsxMDM2LDcgQEAKICNkZWZpbmUgVjRMMl9DVFJMX0NMQVNTX01QRUcgMHgwMDk5MDAwMAkvKiBNUEVHLWNvbXByZXNzaW9uIGNvbnRyb2xzICovCiAjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19DQU1FUkEgMHgwMDlhMDAwMAkvKiBDYW1lcmEgY2xhc3MgY29udHJvbHMgKi8KICNkZWZpbmUgVjRMMl9DVFJMX0NMQVNTX0ZNX1RYIDB4MDA5YjAwMDAJLyogRk0gTW9kdWxhdG9yIGNvbnRyb2wgY2xhc3MgKi8KKyNkZWZpbmUgVjRMMl9DVFJMX0NMQVNTX0ZMQVNIIDB4MDA5YzAwMDAJLyogQ2FtZXJhIGZsYXNoIGNvbnRyb2xzICovCiAKICNkZWZpbmUgVjRMMl9DVFJMX0lEX01BU0sgICAgICAJICAoMHgwZmZmZmZmZikKICNkZWZpbmUgVjRMMl9DVFJMX0lEMkNMQVNTKGlkKSAgICAoKGlkKSAmIDB4MGZmZjAwMDBVTCkKQEAgLTEwMzksNiArMTA1MCw3IEBACiAJVjRMMl9DVFJMX1RZUEVfSU5URUdFUjY0ICAgICA9IDUsCiAJVjRMMl9DVFJMX1RZUEVfQ1RSTF9DTEFTUyAgICA9IDYsCiAJVjRMMl9DVFJMX1RZUEVfU1RSSU5HICAgICAgICA9IDcsCisJVjRMMl9DVFJMX1RZUEVfQklUTUFTSyAgICAgICA9IDgsCiB9OwogCiAvKiAgVXNlZCBpbiB0aGUgVklESU9DX1FVRVJZQ1RSTCBpb2N0bCBmb3IgcXVlcnlpbmcgY29udHJvbHMgKi8KQEAgLTExNDQsMTQgKzExNTYsMTkgQEAKICNkZWZpbmUgVjRMMl9DSURfSUxMVU1JTkFUT1JTXzEJCQkoVjRMMl9DSURfQkFTRSszNykKICNkZWZpbmUgVjRMMl9DSURfSUxMVU1JTkFUT1JTXzIJCQkoVjRMMl9DSURfQkFTRSszOCkKIAorI2RlZmluZSBWNEwyX0NJRF9NSU5fQlVGRkVSU19GT1JfQ0FQVFVSRQkoVjRMMl9DSURfQkFTRSszOSkKKyNkZWZpbmUgVjRMMl9DSURfTUlOX0JVRkZFUlNfRk9SX09VVFBVVAkJKFY0TDJfQ0lEX0JBU0UrNDApCisKIC8qIGxhc3QgQ0lEICsgMSAqLwotI2RlZmluZSBWNEwyX0NJRF9MQVNUUDEgICAgICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMzkpCisjZGVmaW5lIFY0TDJfQ0lEX0xBU1RQMSAgICAgICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSs0MSkKKworLyogTWluaW11bSBudW1iZXIgb2YgYnVmZmVyIG5lZWRlIGJ5IHRoZSBkZXZpY2UgKi8KIAogLyogIE1QRUctY2xhc3MgY29udHJvbCBJRHMgZGVmaW5lZCBieSBWNEwyICovCiAjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQkFTRSAJCQkoVjRMMl9DVFJMX0NMQVNTX01QRUcgfCAweDkwMCkKICNkZWZpbmUgVjRMMl9DSURfTVBFR19DTEFTUyAJCQkoVjRMMl9DVFJMX0NMQVNTX01QRUcgfCAxKQogCi0vKiAgTVBFRyBzdHJlYW1zICovCisvKiAgTVBFRyBzdHJlYW1zLCBzcGVjaWZpYyB0byBtdWx0aXBsZXhlZCBzdHJlYW1zICovCiAjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzApCiBlbnVtIHY0bDJfbXBlZ19zdHJlYW1fdHlwZSB7CiAJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX1BTICAgPSAwLCAvKiBNUEVHLTIgcHJvZ3JhbSBzdHJlYW0gKi8KQEAgLTExNzMsNyArMTE5MCw3IEBACiAJVjRMMl9NUEVHX1NUUkVBTV9WQklfRk1UX0lWVFYgPSAxLCAgLyogVkJJIGluIHByaXZhdGUgcGFja2V0cywgSVZUViBmb3JtYXQgKi8KIH07CiAKLS8qICBNUEVHIGF1ZGlvICovCisvKiAgTVBFRyBhdWRpbyBjb250cm9scyBzcGVjaWZpYyB0byBtdWx0aXBsZXhlZCBzdHJlYW1zICAqLwogI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVEgCShWNEwyX0NJRF9NUEVHX0JBU0UrMTAwKQogZW51bSB2NGwyX21wZWdfYXVkaW9fc2FtcGxpbmdfZnJlcSB7CiAJVjRMMl9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVFfNDQxMDAgPSAwLApAQCAtMTI4OSw3ICsxMzA2LDcgQEAKIAlWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNjQwSyA9IDE4LAogfTsKIAotLyogIE1QRUcgdmlkZW8gKi8KKy8qICBNUEVHIHZpZGVvIGNvbnRyb2xzIHNwZWNpZmljIHRvIG11bHRpcGxleGVkIHN0cmVhbXMgKi8KICNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjAwKQogZW51bSB2NGwyX21wZWdfdmlkZW9fZW5jb2RpbmcgewogCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzEgICAgID0gMCwKQEAgLTEzMTcsNiArMTMzNCwxNDEgQEAKICNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19URU1QT1JBTF9ERUNJTUFUSU9OIChWNEwyX0NJRF9NUEVHX0JBU0UrMjA5KQogI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIxMCkKICNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NVVRFX1lVViAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjExKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0RFQ09ERVJfU0xJQ0VfSU5URVJGQUNFCQkoVjRMMl9DSURfTVBFR19CQVNFKzIxMikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19ERUNPREVSX01QRUc0X0RFQkxPQ0tfRklMVEVSCShWNEwyX0NJRF9NUEVHX0JBU0UrMjEzKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0NZQ0xJQ19JTlRSQV9SRUZSRVNIX01CCQkoVjRMMl9DSURfTVBFR19CQVNFKzIxNCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19GUkFNRV9SQ19FTkFCTEUJCQkoVjRMMl9DSURfTVBFR19CQVNFKzIxNSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IRUFERVJfTU9ERQkJCQkoVjRMMl9DSURfTVBFR19CQVNFKzIxNikKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2hlYWRlcl9tb2RlIHsKKwlWNEwyX01QRUdfVklERU9fSEVBREVSX01PREVfU0VQQVJBVEUJCQk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0hFQURFUl9NT0RFX0pPSU5FRF9XSVRIXzFTVF9GUkFNRQk9IDEsCisKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTUFYX1JFRl9QSUMJCQkoVjRMMl9DSURfTVBFR19CQVNFKzIxNykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NQl9SQ19FTkFCTEUJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjE4KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01BWF9CWVRFUwkoVjRMMl9DSURfTVBFR19CQVNFKzIxOSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NQVhfTUIJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjIwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01PREUJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjIxKQorZW51bSB2NGwyX21wZWdfdmlkZW9fbXVsdGlfc2xpY2VfbW9kZSB7CisJVjRMMl9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01PREVfU0lOR0xFCQk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX01VTFRJX1NJQ0VfTU9ERV9NQVhfTUIJCT0gMSwKKwlWNEwyX01QRUdfVklERU9fTVVMVElfU0lDRV9NT0RFX01BWF9CWVRFUwk9IDIsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZCVl9TSVpFCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMjIpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19JX0ZSQU1FX1FQCQkoVjRMMl9DSURfTVBFR19CQVNFKzMwMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjYzX1BfRlJBTUVfUVAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzAxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjNfQl9GUkFNRV9RUAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszMDIpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19NSU5fUVAJCQkoVjRMMl9DSURfTVBFR19CQVNFKzMwMykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjYzX01BWF9RUAkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzA0KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfSV9GUkFNRV9RUAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9QX0ZSQU1FX1FQCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1MSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0JfRlJBTUVfUVAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzUyKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTUlOX1FQCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTMpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9NQVhfUVAJCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1NCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0XzhYOF9UUkFOU0ZPUk0JCShWNEwyX0NJRF9NUEVHX0JBU0UrMzU1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfQ1BCX1NJWkUJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzU2KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfRU5UUk9QWV9NT0RFCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1NykKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2gyNjRfZW50cm9weV9tb2RlIHsKKwlWNEwyX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREVfQ0FWTEMJPSAwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0VOVFJPUFlfTU9ERV9DQUJBQwk9IDEsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfSV9QRVJJT0QJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzU4KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTEVWRUwJCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1OSkKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2gyNjRfbGV2ZWwgeworCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMAk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMUIJPSAxLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMQk9IDIsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8yCT0gMywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzMJPSA0LAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzJfMAk9IDUsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMl8xCT0gNiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8yXzIJPSA3LAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzNfMAk9IDgsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfM18xCT0gOSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8zXzIJPSAxMCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzAJPSAxMSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzEJPSAxMiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzIJPSAxMywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF81XzAJPSAxNCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF81XzEJPSAxNSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9BTFBIQQkoVjRMMl9DSURfTVBFR19CQVNFKzM2MCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX0JFVEEJKFY0TDJfQ0lEX01QRUdfQkFTRSszNjEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFCShWNEwyX0NJRF9NUEVHX0JBU0UrMzYyKQorZW51bSB2NGwyX21wZWdfdmlkZW9faDI2NF9sb29wX2ZpbHRlcl9tb2RlIHsKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFX0VOQUJMRUQJCQkJPSAwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX01PREVfRElTQUJMRUQJCQkJPSAxLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX01PREVfRElTQUJMRURfQVRfU0xJQ0VfQk9VTkRBUlkJPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1BST0ZJTEUJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzYzKQorZW51bSB2NGwyX21wZWdfdmlkZW9faDI2NF9wcm9maWxlIHsKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0JBU0VMSU5FCQkJPSAwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQ09OU1RSQUlORURfQkFTRUxJTkUJPSAxLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfTUFJTgkJCT0gMiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0VYVEVOREVECQkJPSAzLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSAkJCT0gNCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfMTAJCQk9IDUsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzQyMgkJCT0gNiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfNDQ0X1BSRURJQ1RJVkUJPSA3LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF8xMF9JTlRSQQkJPSA4LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF80MjJfSU5UUkEJCT0gOSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfNDQ0X0lOVFJBCQk9IDEwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQ0FWTENfNDQ0X0lOVFJBCQk9IDExLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU0NBTEFCTEVfQkFTRUxJTkUJCT0gMTIsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9TQ0FMQUJMRV9ISUdICQk9IDEzLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU0NBTEFCTEVfSElHSF9JTlRSQQk9IDE0LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU1RFUkVPX0hJR0gJCT0gMTUsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9NVUxUSVZJRVdfSElHSAkJPSAxNiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfRVhUX1NBUl9IRUlHSFQJKFY0TDJfQ0lEX01QRUdfQkFTRSszNjQpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfRVhUX1NBUl9XSURUSAkoVjRMMl9DSURfTVBFR19CQVNFKzM2NSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfRU5BQkxFCQkoVjRMMl9DSURfTVBFR19CQVNFKzM2NikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDCQkoVjRMMl9DSURfTVBFR19CQVNFKzM2NykKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2gyNjRfdnVpX3Nhcl9pZGMgeworCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDX1VOU1BFQ0lGSUVECT0gMCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18xeDEJCT0gMSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18xMngxMQkJPSAyLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzEweDExCQk9IDMsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTZ4MTEJCT0gNCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ180MHgzMwkJPSA1LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzI0eDExCQk9IDYsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMjB4MTEJCT0gNywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18zMngxMQkJPSA4LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzgweDMzCQk9IDksCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTh4MTEJCT0gMTAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTV4MTEJCT0gMTEsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfNjR4MzMJCT0gMTIsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTYweDk5CQk9IDEzLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzR4MwkJPSAxNCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18zeDIJCT0gMTUsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMngxCQk9IDE2LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDX0VYVEVOREVECT0gMTcsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X0lfRlJBTUVfUVAJKFY0TDJfQ0lEX01QRUdfQkFTRSs0MDApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfUF9GUkFNRV9RUAkoVjRMMl9DSURfTVBFR19CQVNFKzQwMSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9CX0ZSQU1FX1FQCShWNEwyX0NJRF9NUEVHX0JBU0UrNDAyKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X01JTl9RUAkoVjRMMl9DSURfTVBFR19CQVNFKzQwMykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9NQVhfUVAJKFY0TDJfQ0lEX01QRUdfQkFTRSs0MDQpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfTEVWRUwJCShWNEwyX0NJRF9NUEVHX0JBU0UrNDA1KQorZW51bSB2NGwyX21wZWdfdmlkZW9fbXBlZzRfbGV2ZWwgeworCVY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8wCT0gMCwKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfMEIJPSAxLAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8xCT0gMiwKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfMgk9IDMsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzMJPSA0LAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8zQgk9IDUsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzQJPSA2LAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF81CT0gNywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfUFJPRklMRQkoVjRMMl9DSURfTVBFR19CQVNFKzQwNikKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX21wZWc0X3Byb2ZpbGUgeworCVY0TDJfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFX1NJTVBMRQkJCQk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfQURWQU5DRURfU0lNUExFCQkJPSAxLAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFX0NPUkUJCQkJPSAyLAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFX1NJTVBMRV9TQ0FMQUJMRQkJCT0gMywKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfUFJPRklMRV9BRFZBTkNFRF9DT0RJTkdfRUZGSUNJRU5DWQk9IDQsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1FQRUwJCShWNEwyX0NJRF9NUEVHX0JBU0UrNDA3KQogCiAvKiAgTVBFRy1jbGFzcyBjb250cm9sIElEcyBzcGVjaWZpYyB0byB0aGUgQ1gyMzQxeCBkcml2ZXIgYXMgZGVmaW5lZCBieSBWNEwyICovCiAjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFIAkJCQkoVjRMMl9DVFJMX0NMQVNTX01QRUcgfCAweDEwMDApCkBAIC0xMzU5LDYgKzE1MTEsMzMgQEAKICNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9NRURJQU5fRklMVEVSX1RPUCAJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzEwKQogI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfU1RSRUFNX0lOU0VSVF9OQVZfUEFDS0VUUyAJKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzExKQogCisvKiAgTVBFRy1jbGFzcyBjb250cm9sIElEcyBzcGVjaWZpYyB0byB0aGUgU2Ftc3VuZyBNRkMgNS4xIGRyaXZlciBhcyBkZWZpbmVkIGJ5IFY0TDIgKi8KKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFCQkJCShWNEwyX0NUUkxfQ0xBU1NfTVBFRyB8IDB4MTEwMCkKKworI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0RFQ09ERVJfSDI2NF9ESVNQTEFZX0RFTEFZCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fREVDT0RFUl9IMjY0X0RJU1BMQVlfREVMQVlfRU5BQkxFCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrMSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19GUkFNRV9TS0lQX01PREUJCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzIpCitlbnVtIHY0bDJfbXBlZ19tZmM1MV92aWRlb19mcmFtZV9za2lwX21vZGUgeworCVY0TDJfTVBFR19NRkM1MV9WSURFT19GUkFNRV9TS0lQX01PREVfRElTQUJMRUQJCT0gMCwKKwlWNEwyX01QRUdfTUZDNTFfVklERU9fRlJBTUVfU0tJUF9NT0RFX0xFVkVMX0xJTUlUCT0gMSwKKwlWNEwyX01QRUdfTUZDNTFfVklERU9fRlJBTUVfU0tJUF9NT0RFX0JVRl9MSU1JVAkJPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19GT1JDRV9GUkFNRV9UWVBFCQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSszKQorZW51bSB2NGwyX21wZWdfbWZjNTFfdmlkZW9fZm9yY2VfZnJhbWVfdHlwZSB7CisJVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZPUkNFX0ZSQU1FX1RZUEVfRElTQUJMRUQJCT0gMCwKKwlWNEwyX01QRUdfTUZDNTFfVklERU9fRk9SQ0VfRlJBTUVfVFlQRV9JX0ZSQU1FCQk9IDEsCisJVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZPUkNFX0ZSQU1FX1RZUEVfTk9UX0NPREVECT0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fUEFERElORwkJCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzQpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fUEFERElOR19ZVVYJCQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX1JDX0ZJWEVEX1RBUkdFVF9CSVQJCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzYpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fUkNfUkVBQ1RJT05fQ09FRkYJCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzcpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fSDI2NF9BREFQVElWRV9SQ19BQ1RJVklUWQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs1MCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X0FEQVBUSVZFX1JDX0RBUksJCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzUxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfQURBUFRJVkVfUkNfU01PT1RICQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzUyKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfQURBUFRJVkVfUkNfU1RBVElDCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzUzKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfTlVNX1JFRl9QSUNfRk9SX1AJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrNTQpCisKIC8qICBDYW1lcmEgY2xhc3MgY29udHJvbCBJRHMgKi8KICNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UgCShWNEwyX0NUUkxfQ0xBU1NfQ0FNRVJBIHwgMHg5MDApCiAjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9DTEFTUyAJCShWNEwyX0NUUkxfQ0xBU1NfQ0FNRVJBIHwgMSkKQEAgLTE0MjcsNiArMTYwNiw0MSBAQAogI2RlZmluZSBWNEwyX0NJRF9UVU5FX1BPV0VSX0xFVkVMCQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDExMykKICNkZWZpbmUgVjRMMl9DSURfVFVORV9BTlRFTk5BX0NBUEFDSVRPUgkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAxMTQpCiAKKy8qIEZsYXNoIGFuZCBwcml2YWN5IChpbmRpY2F0b3IpIGxpZ2h0IGNvbnRyb2xzICovCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UJCShWNEwyX0NUUkxfQ0xBU1NfRkxBU0ggfCAweDkwMCkKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfQ0xBU1MJCQkoVjRMMl9DVFJMX0NMQVNTX0ZMQVNIIHwgMSkKKworI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9MRURfTU9ERQkJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgMSkKK2VudW0gdjRsMl9mbGFzaF9sZWRfbW9kZSB7CisJVjRMMl9GTEFTSF9MRURfTU9ERV9OT05FLAorCVY0TDJfRkxBU0hfTEVEX01PREVfRkxBU0gsCisJVjRMMl9GTEFTSF9MRURfTU9ERV9UT1JDSCwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfU1RST0JFX1NPVVJDRQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyAyKQorZW51bSB2NGwyX2ZsYXNoX3N0cm9iZV9zb3VyY2UgeworCVY0TDJfRkxBU0hfU1RST0JFX1NPVVJDRV9TT0ZUV0FSRSwKKwlWNEwyX0ZMQVNIX1NUUk9CRV9TT1VSQ0VfRVhURVJOQUwsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX1NUUk9CRQkJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgMykKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfU1RST0JFX1NUT1AJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgNCkKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfU1RST0JFX1NUQVRVUwkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyA1KQorCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX1RJTUVPVVQJCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDYpCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX0lOVEVOU0lUWQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyA3KQorI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9UT1JDSF9JTlRFTlNJVFkJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgOCkKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfSU5ESUNBVE9SX0lOVEVOU0lUWQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDkpCisKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfRkFVTFQJCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDEwKQorI2RlZmluZSBWNEwyX0ZMQVNIX0ZBVUxUX09WRVJfVk9MVEFHRQkJKDEgPDwgMCkKKyNkZWZpbmUgVjRMMl9GTEFTSF9GQVVMVF9USU1FT1VUCQkoMSA8PCAxKQorI2RlZmluZSBWNEwyX0ZMQVNIX0ZBVUxUX09WRVJfVEVNUEVSQVRVUkUJKDEgPDwgMikKKyNkZWZpbmUgVjRMMl9GTEFTSF9GQVVMVF9TSE9SVF9DSVJDVUlUCQkoMSA8PCAzKQorCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX0NIQVJHRQkJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgMTEpCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX1JFQURZCQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyAxMikKKwogLyoKICAqCVQgVSBOIEkgTiBHCiAgKi8KQEAgLTE3OTEsNiArMjAwNSw3IEBACiAjZGVmaW5lIFY0TDJfRVZFTlRfQUxMCQkJCTAKICNkZWZpbmUgVjRMMl9FVkVOVF9WU1lOQwkJCTEKICNkZWZpbmUgVjRMMl9FVkVOVF9FT1MJCQkJMgorI2RlZmluZSBWNEwyX0VWRU5UX0NUUkwJCQkJMwogI2RlZmluZSBWNEwyX0VWRU5UX1BSSVZBVEVfU1RBUlQJCTB4MDgwMDAwMDAKIAogLyogUGF5bG9hZCBmb3IgVjRMMl9FVkVOVF9WU1lOQyAqLwpAQCAtMTc5OSwyMSArMjAxNCw0NiBAQAogCV9fdTggZmllbGQ7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAorLyogUGF5bG9hZCBmb3IgVjRMMl9FVkVOVF9DVFJMICovCisjZGVmaW5lIFY0TDJfRVZFTlRfQ1RSTF9DSF9WQUxVRQkJKDEgPDwgMCkKKyNkZWZpbmUgVjRMMl9FVkVOVF9DVFJMX0NIX0ZMQUdTCQkoMSA8PCAxKQorCitzdHJ1Y3QgdjRsMl9ldmVudF9jdHJsIHsKKwlfX3UzMiBjaGFuZ2VzOworCV9fdTMyIHR5cGU7CisJdW5pb24geworCQlfX3MzMiB2YWx1ZTsKKwkJX19zNjQgdmFsdWU2NDsKKwl9OworCV9fdTMyIGZsYWdzOworCV9fczMyIG1pbmltdW07CisJX19zMzIgbWF4aW11bTsKKwlfX3MzMiBzdGVwOworCV9fczMyIGRlZmF1bHRfdmFsdWU7Cit9OworCiBzdHJ1Y3QgdjRsMl9ldmVudCB7CiAJX191MzIJCQkJdHlwZTsKIAl1bmlvbiB7CiAJCXN0cnVjdCB2NGwyX2V2ZW50X3ZzeW5jIHZzeW5jOworCQlzdHJ1Y3QgdjRsMl9ldmVudF9jdHJsCWN0cmw7CiAJCV9fdTgJCQlkYXRhWzY0XTsKIAl9IHU7CiAJX191MzIJCQkJcGVuZGluZzsKIAlfX3UzMgkJCQlzZXF1ZW5jZTsKIAlzdHJ1Y3QgdGltZXNwZWMJCQl0aW1lc3RhbXA7Ci0JX191MzIJCQkJcmVzZXJ2ZWRbOV07CisJX191MzIJCQkJaWQ7CisJX191MzIJCQkJcmVzZXJ2ZWRbOF07CiB9OwogCisjZGVmaW5lIFY0TDJfRVZFTlRfU1VCX0ZMX1NFTkRfSU5JVElBTAkJKDEgPDwgMCkKKyNkZWZpbmUgVjRMMl9FVkVOVF9TVUJfRkxfQUxMT1dfRkVFREJBQ0sJKDEgPDwgMSkKKwogc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uIHsKIAlfX3UzMgkJCQl0eXBlOwotCV9fdTMyCQkJCXJlc2VydmVkWzddOworCV9fdTMyCQkJCWlkOworCV9fdTMyCQkJCWZsYWdzOworCV9fdTMyCQkJCXJlc2VydmVkWzVdOwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd2F0Y2hkb2cuaCBiL2luY2x1ZGUvbGludXgvd2F0Y2hkb2cuaAppbmRleCAwMTFiY2ZlLi4xMTE4NDNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dhdGNoZG9nLmgKKysrIGIvaW5jbHVkZS9saW51eC93YXRjaGRvZy5oCkBAIC01OSw2ICs1OSw4NCBAQAogI2RlZmluZSBXQVRDSERPR19OT1dBWU9VVAkwCiAjZW5kaWYKIAorc3RydWN0IHdhdGNoZG9nX29wczsKK3N0cnVjdCB3YXRjaGRvZ19kZXZpY2U7CisKKy8qKiBzdHJ1Y3Qgd2F0Y2hkb2dfb3BzIC0gVGhlIHdhdGNoZG9nLWRldmljZXMgb3BlcmF0aW9ucworICoKKyAqIEBvd25lcjoJVGhlIG1vZHVsZSBvd25lci4KKyAqIEBzdGFydDoJVGhlIHJvdXRpbmUgZm9yIHN0YXJ0aW5nIHRoZSB3YXRjaGRvZyBkZXZpY2UuCisgKiBAc3RvcDoJVGhlIHJvdXRpbmUgZm9yIHN0b3BwaW5nIHRoZSB3YXRjaGRvZyBkZXZpY2UuCisgKiBAcGluZzoJVGhlIHJvdXRpbmUgdGhhdCBzZW5kcyBhIGtlZXBhbGl2ZSBwaW5nIHRvIHRoZSB3YXRjaGRvZyBkZXZpY2UuCisgKiBAc3RhdHVzOglUaGUgcm91dGluZSB0aGF0IHNob3dzIHRoZSBzdGF0dXMgb2YgdGhlIHdhdGNoZG9nIGRldmljZS4KKyAqIEBzZXRfdGltZW91dDpUaGUgcm91dGluZSBmb3Igc2V0dGluZyB0aGUgd2F0Y2hkb2cgZGV2aWNlcyB0aW1lb3V0IHZhbHVlLgorICogQGlvY3RsOglUaGUgcm91dGluZXMgdGhhdCBoYW5kbGVzIGV4dHJhIGlvY3RsIGNhbGxzLgorICoKKyAqIFRoZSB3YXRjaGRvZ19vcHMgc3RydWN0dXJlIGNvbnRhaW5zIGEgbGlzdCBvZiBsb3ctbGV2ZWwgb3BlcmF0aW9ucworICogdGhhdCBjb250cm9sIGEgd2F0Y2hkb2cgZGV2aWNlLiBJdCBhbHNvIGNvbnRhaW5zIHRoZSBtb2R1bGUgdGhhdCBvd25zCisgKiB0aGVzZSBvcGVyYXRpb25zLiBUaGUgc3RhcnQgYW5kIHN0b3AgZnVuY3Rpb24gYXJlIG1hbmRhdG9yeSwgYWxsIG90aGVyCisgKiBmdW5jdGlvbnMgYXJlIG9wdG9uYWwuCisgKi8KK3N0cnVjdCB3YXRjaGRvZ19vcHMgeworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworCS8qIG1hbmRhdG9yeSBvcGVyYXRpb25zICovCisJaW50ICgqc3RhcnQpKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKik7CisJaW50ICgqc3RvcCkoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqKTsKKwkvKiBvcHRpb25hbCBvcGVyYXRpb25zICovCisJaW50ICgqcGluZykoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqKTsKKwl1bnNpZ25lZCBpbnQgKCpzdGF0dXMpKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKik7CisJaW50ICgqc2V0X3RpbWVvdXQpKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKiwgdW5zaWduZWQgaW50KTsKKwlsb25nICgqaW9jdGwpKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKK307CisKKy8qKiBzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlIC0gVGhlIHN0cnVjdHVyZSB0aGF0IGRlZmluZXMgYSB3YXRjaGRvZyBkZXZpY2UKKyAqCisgKiBAaW5mbzoJUG9pbnRlciB0byBhIHdhdGNoZG9nX2luZm8gc3RydWN0dXJlLgorICogQG9wczoJUG9pbnRlciB0byB0aGUgbGlzdCBvZiB3YXRjaGRvZyBvcGVyYXRpb25zLgorICogQGJvb3RzdGF0dXM6CVN0YXR1cyBvZiB0aGUgd2F0Y2hkb2cgZGV2aWNlIGF0IGJvb3QuCisgKiBAdGltZW91dDoJVGhlIHdhdGNoZG9nIGRldmljZXMgdGltZW91dCB2YWx1ZS4KKyAqIEBtaW5fdGltZW91dDpUaGUgd2F0Y2hkb2cgZGV2aWNlcyBtaW5pbXVtIHRpbWVvdXQgdmFsdWUuCisgKiBAbWF4X3RpbWVvdXQ6VGhlIHdhdGNoZG9nIGRldmljZXMgbWF4aW11bSB0aW1lb3V0IHZhbHVlLgorICogQGRyaXZlci1kYXRhOlBvaW50ZXIgdG8gdGhlIGRyaXZlcnMgcHJpdmF0ZSBkYXRhLgorICogQHN0YXR1czoJRmllbGQgdGhhdCBjb250YWlucyB0aGUgZGV2aWNlcyBpbnRlcm5hbCBzdGF0dXMgYml0cy4KKyAqCisgKiBUaGUgd2F0Y2hkb2dfZGV2aWNlIHN0cnVjdHVyZSBjb250YWlucyBhbGwgaW5mb3JtYXRpb24gYWJvdXQgYQorICogd2F0Y2hkb2cgdGltZXIgZGV2aWNlLgorICoKKyAqIFRoZSBkcml2ZXItZGF0YSBmaWVsZCBtYXkgbm90IGJlIGFjY2Vzc2VkIGRpcmVjdGx5LiBJdCBtdXN0IGJlIGFjY2Vzc2VkCisgKiB2aWEgdGhlIHdhdGNoZG9nX3NldF9kcnZkYXRhIGFuZCB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSBoZWxwZXJzLgorICovCitzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlIHsKKwljb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyAqaW5mbzsKKwljb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfb3BzICpvcHM7CisJdW5zaWduZWQgaW50IGJvb3RzdGF0dXM7CisJdW5zaWduZWQgaW50IHRpbWVvdXQ7CisJdW5zaWduZWQgaW50IG1pbl90aW1lb3V0OworCXVuc2lnbmVkIGludCBtYXhfdGltZW91dDsKKwl2b2lkICpkcml2ZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIHN0YXR1czsKKy8qIEJpdCBudW1iZXJzIGZvciBzdGF0dXMgZmxhZ3MgKi8KKyNkZWZpbmUgV0RPR19BQ1RJVkUJCTAJLyogSXMgdGhlIHdhdGNoZG9nIHJ1bm5pbmcvYWN0aXZlICovCisjZGVmaW5lIFdET0dfREVWX09QRU4JCTEJLyogT3BlbmVkIHZpYSAvZGV2L3dhdGNoZG9nID8gKi8KKyNkZWZpbmUgV0RPR19BTExPV19SRUxFQVNFCTIJLyogRGlkIHdlIHJlY2VpdmUgdGhlIG1hZ2ljIGNoYXIgPyAqLworI2RlZmluZSBXRE9HX05PX1dBWV9PVVQJCTMJLyogSXMgJ25vd2F5b3V0JyBmZWF0dXJlIHNldCA/ICovCit9OworCisvKiBVc2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSB3YXRjaGRvZyBkcml2ZXIgc3BlY2lmaWMgZGF0YSAqLworc3RhdGljIGlubGluZSB2b2lkIHdhdGNoZG9nX3NldF9kcnZkYXRhKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCwgdm9pZCAqZGF0YSkKK3sKKwl3ZGQtPmRyaXZlcl9kYXRhID0gZGF0YTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICp3YXRjaGRvZ19nZXRfZHJ2ZGF0YShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQpCit7CisJcmV0dXJuIHdkZC0+ZHJpdmVyX2RhdGE7Cit9CisKKy8qIGRyaXZlcnMvd2F0Y2hkb2cvY29yZS93YXRjaGRvZ19jb3JlLmMgKi8KK2V4dGVybiBpbnQgd2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKik7CitleHRlcm4gdm9pZCB3YXRjaGRvZ191bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICopOworCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgIC8qIGlmbmRlZiBfTElOVVhfV0FUQ0hET0dfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9hZHAxNjUzLmggYi9pbmNsdWRlL21lZGlhL2FkcDE2NTMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGExYWY4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9hZHAxNjUzLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBpbmNsdWRlL21lZGlhL2FkcDE2NTMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0tMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIENvbnRhY3Q6IFNha2FyaSBBaWx1cyA8c2FrYXJpLmFpbHVzQG1heHdlbGwucmVzZWFyY2gubm9raWEuY29tPgorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqCVNha2FyaSBBaWx1cyA8c2FrYXJpLmFpbHVzQG1heHdlbGwucmVzZWFyY2gubm9raWEuY29tPgorICoJVHV1a2thIFRvaXZvbmVuIDx0dXVra2F0NzZAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBBRFAxNjUzX0gKKyNkZWZpbmUgQURQMTY1M19ICisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgorCisjZGVmaW5lIEFEUDE2NTNfTkFNRQkJCQkiYWRwMTY1MyIKKyNkZWZpbmUgQURQMTY1M19JMkNfQUREUgkJCSgweDYwID4+IDEpCisKKy8qIFJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIEFEUDE2NTNfUkVHX09VVF9TRUwJCQkweDAwCisjZGVmaW5lIEFEUDE2NTNfUkVHX09VVF9TRUxfSFBMRURfVE9SQ0hfTUlOCTB4MDEKKyNkZWZpbmUgQURQMTY1M19SRUdfT1VUX1NFTF9IUExFRF9UT1JDSF9NQVgJMHgwYgorI2RlZmluZSBBRFAxNjUzX1JFR19PVVRfU0VMX0hQTEVEX0ZMQVNIX01JTgkweDBjCisjZGVmaW5lIEFEUDE2NTNfUkVHX09VVF9TRUxfSFBMRURfRkxBU0hfTUFYCTB4MWYKKyNkZWZpbmUgQURQMTY1M19SRUdfT1VUX1NFTF9IUExFRF9TSElGVAkJMworI2RlZmluZSBBRFAxNjUzX1JFR19PVVRfU0VMX0lMRURfTUFYCQkweDA3CisjZGVmaW5lIEFEUDE2NTNfUkVHX09VVF9TRUxfSUxFRF9TSElGVAkJMAorCisjZGVmaW5lIEFEUDE2NTNfUkVHX0NPTkZJRwkJCTB4MDEKKyNkZWZpbmUgQURQMTY1M19SRUdfQ09ORklHX1RNUl9DRkcJCSgxIDw8IDQpCisjZGVmaW5lIEFEUDE2NTNfUkVHX0NPTkZJR19UTVJfU0VUX01BWAkJMHgwZgorI2RlZmluZSBBRFAxNjUzX1JFR19DT05GSUdfVE1SX1NFVF9TSElGVAkwCisKKyNkZWZpbmUgQURQMTY1M19SRUdfU1dfU1RST0JFCQkJMHgwMgorI2RlZmluZSBBRFAxNjUzX1JFR19TV19TVFJPQkVfU1dfU1RST0JFCQkoMSA8PCAwKQorCisjZGVmaW5lIEFEUDE2NTNfUkVHX0ZBVUxUCQkJMHgwMworI2RlZmluZSBBRFAxNjUzX1JFR19GQVVMVF9GTFRfU0NQCQkoMSA8PCAzKQorI2RlZmluZSBBRFAxNjUzX1JFR19GQVVMVF9GTFRfT1QJCSgxIDw8IDIpCisjZGVmaW5lIEFEUDE2NTNfUkVHX0ZBVUxUX0ZMVF9UTVIJCSgxIDw8IDEpCisjZGVmaW5lIEFEUDE2NTNfUkVHX0ZBVUxUX0ZMVF9PVgkJKDEgPDwgMCkKKworI2RlZmluZSBBRFAxNjUzX0lORElDQVRPUl9JTlRFTlNJVFlfTUlOCQkwCisjZGVmaW5lIEFEUDE2NTNfSU5ESUNBVE9SX0lOVEVOU0lUWV9TVEVQCTI1MDAKKyNkZWZpbmUgQURQMTY1M19JTkRJQ0FUT1JfSU5URU5TSVRZX01BWAkJXAorCShBRFAxNjUzX1JFR19PVVRfU0VMX0lMRURfTUFYICogQURQMTY1M19JTkRJQ0FUT1JfSU5URU5TSVRZX1NURVApCisjZGVmaW5lIEFEUDE2NTNfSU5ESUNBVE9SX0lOVEVOU0lUWV91QV9UT19SRUcoYSkgXAorCSgoYSkgLyBBRFAxNjUzX0lORElDQVRPUl9JTlRFTlNJVFlfU1RFUCkKKyNkZWZpbmUgQURQMTY1M19JTkRJQ0FUT1JfSU5URU5TSVRZX1JFR19UT191QShhKSBcCisJKChhKSAqIEFEUDE2NTNfSU5ESUNBVE9SX0lOVEVOU0lUWV9TVEVQKQorCisjZGVmaW5lIEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX0JBU0UJCTM1CisjZGVmaW5lIEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX1NURVAJCTE1CisjZGVmaW5lIEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX01JTgkJCQkJXAorCShBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9CQVNFCQkJCQlcCisJICsgQURQMTY1M19SRUdfT1VUX1NFTF9IUExFRF9GTEFTSF9NSU4gKiBBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9TVEVQKQorI2RlZmluZSBBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9NQVgJCQlcCisJKEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX01JTiArCQkJXAorCSAoQURQMTY1M19SRUdfT1VUX1NFTF9IUExFRF9GTEFTSF9NQVggLQkJXAorCSAgQURQMTY1M19SRUdfT1VUX1NFTF9IUExFRF9GTEFTSF9NSU4gKyAxKSAqCVwKKwkgQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfU1RFUCkKKworI2RlZmluZSBBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9tQV9UT19SRUcoYSkJCQkJXAorCSgoYSkgPCBBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9CQVNFID8gMCA6CQkJXAorCSAoKChhKSAtIEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX0JBU0UpIC8gQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfU1RFUCkpCisjZGVmaW5lIEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX1JFR19UT19tQShhKQkJXAorCSgoYSkgKiBBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9TVEVQICsgQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfQkFTRSkKKworI2RlZmluZSBBRFAxNjUzX1RPUkNIX0lOVEVOU0lUWV9NSU4JCQkJCVwKKwkoQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfQkFTRQkJCQkJXAorCSArIEFEUDE2NTNfUkVHX09VVF9TRUxfSFBMRURfVE9SQ0hfTUlOICogQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfU1RFUCkKKyNkZWZpbmUgQURQMTY1M19UT1JDSF9JTlRFTlNJVFlfTUFYCQkJXAorCShBRFAxNjUzX1RPUkNIX0lOVEVOU0lUWV9NSU4gKwkJCVwKKwkgKEFEUDE2NTNfUkVHX09VVF9TRUxfSFBMRURfVE9SQ0hfTUFYIC0JCVwKKwkgIEFEUDE2NTNfUkVHX09VVF9TRUxfSFBMRURfVE9SQ0hfTUlOICsgMSkgKglcCisJIEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX1NURVApCisKK3N0cnVjdCBhZHAxNjUzX3BsYXRmb3JtX2RhdGEgeworCWludCAoKnBvd2VyKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgb24pOworCisJdTMyIG1heF9mbGFzaF90aW1lb3V0OwkJLyogZmxhc2ggbGlnaHQgdGltZW91dCBpbiB1cyAqLworCXUzMiBtYXhfZmxhc2hfaW50ZW5zaXR5OwkvKiBsZWQgaW50ZW5zaXR5LCBmbGFzaCBtb2RlICovCisJdTMyIG1heF90b3JjaF9pbnRlbnNpdHk7CS8qIGxlZCBpbnRlbnNpdHksIHRvcmNoIG1vZGUgKi8KKwl1MzIgbWF4X2luZGljYXRvcl9pbnRlbnNpdHk7CS8qIGluZGljYXRvciBsZWQgaW50ZW5zaXR5ICovCit9OworCisjZGVmaW5lIHRvX2FkcDE2NTNfZmxhc2goc2QpCWNvbnRhaW5lcl9vZihzZCwgc3RydWN0IGFkcDE2NTNfZmxhc2gsIHN1YmRldikKKworc3RydWN0IGFkcDE2NTNfZmxhc2ggeworCXN0cnVjdCB2NGwyX3N1YmRldiBzdWJkZXY7CisJc3RydWN0IGFkcDE2NTNfcGxhdGZvcm1fZGF0YSAqcGxhdGZvcm1fZGF0YTsKKworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciBjdHJsczsKKwlzdHJ1Y3QgdjRsMl9jdHJsICpsZWRfbW9kZTsKKwlzdHJ1Y3QgdjRsMl9jdHJsICpmbGFzaF90aW1lb3V0OworCXN0cnVjdCB2NGwyX2N0cmwgKmZsYXNoX2ludGVuc2l0eTsKKwlzdHJ1Y3QgdjRsMl9jdHJsICp0b3JjaF9pbnRlbnNpdHk7CisJc3RydWN0IHY0bDJfY3RybCAqaW5kaWNhdG9yX2ludGVuc2l0eTsKKworCXN0cnVjdCBtdXRleCBwb3dlcl9sb2NrOworCWludCBwb3dlcl9jb3VudDsKKwlpbnQgZmF1bHQ7Cit9OworCisjZW5kaWYgLyogQURQMTY1M19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2F0bWVsLWlzaS5oIGIvaW5jbHVkZS9tZWRpYS9hdG1lbC1pc2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmNlY2U1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9hdG1lbC1pc2kuaApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIFJlZ2lzdGVyIGRlZmluaXRpb25zIGZvciB0aGUgQXRtZWwgSW1hZ2UgU2Vuc29yIEludGVyZmFjZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQXRtZWwgQ29ycG9yYXRpb24KKyAqIEpvc2ggV3UsIDxqb3NoLnd1QGF0bWVsLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBwcmV2aW91cyB3b3JrIGJ5IExhcnMgSGFyaW5nLCA8bGFycy5oYXJpbmdAYXRtZWwuY29tPgorICogYW5kIFNlZGppIEdhb3Vhb3UKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaWZuZGVmIF9fQVRNRUxfSVNJX0hfXworI2RlZmluZSBfX0FUTUVMX0lTSV9IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIElTSV9WMiByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIElTSV9DRkcxCQkJCTB4MDAwMAorI2RlZmluZSBJU0lfQ0ZHMgkJCQkweDAwMDQKKyNkZWZpbmUgSVNJX1BTSVpFCQkJCTB4MDAwOAorI2RlZmluZSBJU0lfUERFQ0YJCQkJMHgwMDBjCisjZGVmaW5lIElTSV9ZMlJfU0VUMAkJCQkweDAwMTAKKyNkZWZpbmUgSVNJX1kyUl9TRVQxCQkJCTB4MDAxNAorI2RlZmluZSBJU0lfUjJZX1NFVDAJCQkJMHgwMDE4CisjZGVmaW5lIElTSV9SMllfU0VUMQkJCQkweDAwMUMKKyNkZWZpbmUgSVNJX1IyWV9TRVQyCQkJCTB4MDAyMAorI2RlZmluZSBJU0lfQ1RSTAkJCQkweDAwMjQKKyNkZWZpbmUgSVNJX1NUQVRVUwkJCQkweDAwMjgKKyNkZWZpbmUgSVNJX0lOVEVOCQkJCTB4MDAyQworI2RlZmluZSBJU0lfSU5URElTCQkJCTB4MDAzMAorI2RlZmluZSBJU0lfSU5UTUFTSwkJCQkweDAwMzQKKyNkZWZpbmUgSVNJX0RNQV9DSEVSCQkJCTB4MDAzOAorI2RlZmluZSBJU0lfRE1BX0NIRFIJCQkJMHgwMDNDCisjZGVmaW5lIElTSV9ETUFfQ0hTUgkJCQkweDAwNDAKKyNkZWZpbmUgSVNJX0RNQV9QX0FERFIJCQkJMHgwMDQ0CisjZGVmaW5lIElTSV9ETUFfUF9DVFJMCQkJCTB4MDA0OAorI2RlZmluZSBJU0lfRE1BX1BfRFNDUgkJCQkweDAwNEMKKyNkZWZpbmUgSVNJX0RNQV9DX0FERFIJCQkJMHgwMDUwCisjZGVmaW5lIElTSV9ETUFfQ19DVFJMCQkJCTB4MDA1NAorI2RlZmluZSBJU0lfRE1BX0NfRFNDUgkJCQkweDAwNTgKKworLyogQml0ZmllbGRzIGluIENGRzEgKi8KKyNkZWZpbmUgSVNJX0NGRzFfSFNZTkNfUE9MX0FDVElWRV9MT1cJCSgxIDw8IDIpCisjZGVmaW5lIElTSV9DRkcxX1ZTWU5DX1BPTF9BQ1RJVkVfTE9XCQkoMSA8PCAzKQorI2RlZmluZSBJU0lfQ0ZHMV9QSVhDTEtfUE9MX0FDVElWRV9GQUxMSU5HCSgxIDw8IDQpCisjZGVmaW5lIElTSV9DRkcxX0VNQl9TWU5DCQkJKDEgPDwgNikKKyNkZWZpbmUgSVNJX0NGRzFfQ1JDX1NZTkMJCQkoMSA8PCA3KQorLyogQ29uc3RhbnRzIGZvciBGUkFURShJU0lfVjIpICovCisjZGVmaW5lCQlJU0lfQ0ZHMV9GUkFURV9DQVBUVVJFX0FMTAkoMCA8PCA4KQorI2RlZmluZQkJSVNJX0NGRzFfRlJBVEVfRElWXzIJCSgxIDw8IDgpCisjZGVmaW5lCQlJU0lfQ0ZHMV9GUkFURV9ESVZfMwkJKDIgPDwgOCkKKyNkZWZpbmUJCUlTSV9DRkcxX0ZSQVRFX0RJVl80CQkoMyA8PCA4KQorI2RlZmluZQkJSVNJX0NGRzFfRlJBVEVfRElWXzUJCSg0IDw8IDgpCisjZGVmaW5lCQlJU0lfQ0ZHMV9GUkFURV9ESVZfNgkJKDUgPDwgOCkKKyNkZWZpbmUJCUlTSV9DRkcxX0ZSQVRFX0RJVl83CQkoNiA8PCA4KQorI2RlZmluZQkJSVNJX0NGRzFfRlJBVEVfRElWXzgJCSg3IDw8IDgpCisjZGVmaW5lIElTSV9DRkcxX0RJU0NSCQkJCSgxIDw8IDExKQorI2RlZmluZSBJU0lfQ0ZHMV9GVUxMX01PREUJCQkoMSA8PCAxMikKKworLyogQml0ZmllbGRzIGluIENGRzIgKi8KKyNkZWZpbmUgSVNJX0NGRzJfR1JBWVNDQUxFCQkJKDEgPDwgMTMpCisvKiBDb25zdGFudHMgZm9yIFlDQ19TV0FQKElTSV9WMikgKi8KKyNkZWZpbmUJCUlTSV9DRkcyX1lDQ19TV0FQX0RFRkFVTFQJKDAgPDwgMjgpCisjZGVmaW5lCQlJU0lfQ0ZHMl9ZQ0NfU1dBUF9NT0RFXzEJKDEgPDwgMjgpCisjZGVmaW5lCQlJU0lfQ0ZHMl9ZQ0NfU1dBUF9NT0RFXzIJKDIgPDwgMjgpCisjZGVmaW5lCQlJU0lfQ0ZHMl9ZQ0NfU1dBUF9NT0RFXzMJKDMgPDwgMjgpCisjZGVmaW5lIElTSV9DRkcyX0lNX1ZTSVpFX09GRlNFVAkJMAorI2RlZmluZSBJU0lfQ0ZHMl9JTV9IU0laRV9PRkZTRVQJCTE2CisjZGVmaW5lIElTSV9DRkcyX0lNX1ZTSVpFX01BU0sJCSgweDdGRiA8PCBJU0lfQ0ZHMl9JTV9WU0laRV9PRkZTRVQpCisjZGVmaW5lIElTSV9DRkcyX0lNX0hTSVpFX01BU0sJCSgweDdGRiA8PCBJU0lfQ0ZHMl9JTV9IU0laRV9PRkZTRVQpCisKKy8qIEJpdGZpZWxkcyBpbiBDVFJMICovCisvKiBBbHNvIHVzaW5nIGluIFNSKElTSV9WMikgKi8KKyNkZWZpbmUgSVNJX0NUUkxfRU4JCQkJKDEgPDwgMCkKKyNkZWZpbmUgSVNJX0NUUkxfQ0RDCQkJCSgxIDw8IDgpCisvKiBBbHNvIHVzaW5nIGluIFNSL0lFUi9JRFIvSU1SKElTSV9WMikgKi8KKyNkZWZpbmUgSVNJX0NUUkxfRElTCQkJCSgxIDw8IDEpCisjZGVmaW5lIElTSV9DVFJMX1NSU1QJCQkJKDEgPDwgMikKKworLyogQml0ZmllbGRzIGluIFNSICovCisjZGVmaW5lIElTSV9TUl9TSVAJCQkJKDEgPDwgMTkpCisvKiBBbHNvIHVzaW5nIGluIFNSL0lFUi9JRFIvSU1SICovCisjZGVmaW5lIElTSV9TUl9WU1lOQwkJCQkoMSA8PCAxMCkKKyNkZWZpbmUgSVNJX1NSX1BYRlJfRE9ORQkJCSgxIDw8IDE2KQorI2RlZmluZSBJU0lfU1JfQ1hGUl9ET05FCQkJKDEgPDwgMTcpCisjZGVmaW5lIElTSV9TUl9QX09WUgkJCQkoMSA8PCAyNCkKKyNkZWZpbmUgSVNJX1NSX0NfT1ZSCQkJCSgxIDw8IDI1KQorI2RlZmluZSBJU0lfU1JfQ1JDX0VSUgkJCQkoMSA8PCAyNikKKyNkZWZpbmUgSVNJX1NSX0ZSX09WUgkJCQkoMSA8PCAyNykKKworLyogQml0ZmllbGRzIGluIERNQV9DX0NUUkwgJiBpbiBETUFfUF9DVFJMICovCisjZGVmaW5lIElTSV9ETUFfQ1RSTF9GRVRDSAkJCSgxIDw8IDApCisjZGVmaW5lIElTSV9ETUFfQ1RSTF9XQgkJCQkoMSA8PCAxKQorI2RlZmluZSBJU0lfRE1BX0NUUkxfSUVOCQkJKDEgPDwgMikKKyNkZWZpbmUgSVNJX0RNQV9DVFJMX0RPTkUJCQkoMSA8PCAzKQorCisvKiBCaXRmaWVsZHMgaW4gRE1BX0NIU1IvQ0hFUi9DSERSICovCisjZGVmaW5lIElTSV9ETUFfQ0hTUl9QX0NICQkJKDEgPDwgMCkKKyNkZWZpbmUgSVNJX0RNQV9DSFNSX0NfQ0gJCQkoMSA8PCAxKQorCisvKiBEZWZpbml0aW9uIGZvciBpc2lfcGxhdGZvcm1fZGF0YSAqLworI2RlZmluZSBJU0lfREFUQVdJRFRIXzgJCQkJMHgwMQorI2RlZmluZSBJU0lfREFUQVdJRFRIXzEwCQkJMHgwMgorCitzdHJ1Y3QgaXNpX3BsYXRmb3JtX2RhdGEgeworCXU4IGhhc19lbWJfc3luYzsKKwl1OCBlbWJfY3JjX3N5bmM7CisJdTggaHN5bmNfYWN0X2xvdzsKKwl1OCB2c3luY19hY3RfbG93OworCXU4IHBjbGtfYWN0X2ZhbGxpbmc7CisJdTggaXNpX2Z1bGxfbW9kZTsKKwl1MzIgZGF0YV93aWR0aF9mbGFnczsKKwkvKiBVc2luZyBmb3IgSVNJX0NGRzEgKi8KKwl1MzIgZnJhdGU7Cit9OworCisjZW5kaWYgLyogX19BVE1FTF9JU0lfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2RhdmluY2kvdnBiZS5oIGIvaW5jbHVkZS9tZWRpYS9kYXZpbmNpL3ZwYmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjExZmIwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9kYXZpbmNpL3ZwYmUuaApAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cyBJbmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYgX1ZQQkVfSAorI2RlZmluZSBfVlBCRV9ICisKKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cGJlX29zZC5oPgorI2luY2x1ZGUgPG1lZGlhL2RhdmluY2kvdnBiZV92ZW5jLmg+CisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cGJlX3R5cGVzLmg+CisKKy8qIE9TRCBjb25maWd1cmF0aW9uIGluZm8gKi8KK3N0cnVjdCBvc2RfY29uZmlnX2luZm8geworCWNoYXIgbW9kdWxlX25hbWVbMzJdOworfTsKKworc3RydWN0IHZwYmVfb3V0cHV0IHsKKwlzdHJ1Y3QgdjRsMl9vdXRwdXQgb3V0cHV0OworCS8qCisJICogSWYgb3V0cHV0IGNhcGFiaWxpdGllcyBpbmNsdWRlIGR2X3ByZXNldCwgbGlzdCBzdXBwb3J0ZWQgcHJlc2V0cworCSAqIGJlbG93CisJICovCisJY2hhciAqc3ViZGV2X25hbWU7CisJLyoKKwkgKiBkZWZ1YWx0X21vZGUgaWRlbnRpZmllcyB0aGUgZGVmYXVsdCB0aW1pbmdzIHNldCBhdCB0aGUgdmVuYyBvcgorCSAqIGV4dGVybmFsIGVuY29kZXIuCisJICovCisJY2hhciAqZGVmYXVsdF9tb2RlOworCS8qCisJICogRmllbGRzIGJlbG93IGFyZSB1c2VkIGZvciBzdXBwb3J0aW5nIG11bHRpcGxlIG1vZGVzLiBGb3IgZXhhbXBsZSwKKwkgKiBMQ0QgcGFuZWwgbWlnaHQgc3VwcG9ydCBkaWZmZXJlbnQgbW9kZXMgYW5kIHRoZXkgYXJlIGxpc3RlZCBoZXJlLgorCSAqIFNpbWlsYXJseSBmb3Igc3VwcG9ydGluZyBleHRlcm5hbCBlbmNvZGVycywgbGNkIGNvbnRyb2xsZXIgcG9ydAorCSAqIHJlcXVpcmVzIGEgc2V0IG9mIG5vbi1zdGFuZGFyZCB0aW1pbmcgdmFsdWVzIHRvIGJlIGxpc3RlZCBoZXJlIGZvcgorCSAqIGVhY2ggc3VwcG9ydGVkIG1vZGUgc2luY2UgdmVuYyBpcyB1c2VkIGluIG5vbi1zdGFuZGFyZCB0aW1pbmcgbW9kZQorCSAqIGZvciBpbnRlcmZhY2luZyB3aXRoIGV4dGVybmFsIGVuY29kZXIgc2ltaWxhciB0byBjb25maWd1cmluZyBsY2QKKwkgKiBwYW5lbCB0aW1pbmdzCisJICovCisJdW5zaWduZWQgaW50IG51bV9tb2RlczsKKwlzdHJ1Y3QgdnBiZV9lbmNfbW9kZV9pbmZvICptb2RlczsKKwkvKgorCSAqIEJ1cyBjb25maWd1cmF0aW9uIGdvZXMgaGVyZSBmb3IgZXh0ZXJuYWwgZW5jb2RlcnMuIFNvbWUgZW5jb2RlcnMKKwkgKiBtYXkgcmVxdWlyZSBtdWx0aXBsZSBpbnRlcmZhY2UgdHlwZXMgZm9yIGVhY2ggb2YgdGhlIG91dHB1dC4gRm9yCisJICogZXhhbXBsZSwgU0QgbW9kZXMgd291bGQgdXNlIFlDQzggd2hlcmUgYXMgSEQgbW9kZSB3b3VsZCB1c2UgWUNDMTYuCisJICogTm90IHN1cmUgaWYgdGhpcyBpcyBuZWVkZWQgb24gYSBwZXIgbW9kZSBiYXNpcyBpbnN0ZWFkIG9mIHBlcgorCSAqIG91dHB1dCBiYXNpcy4gSWYgcGVyIG1vZGUgaXMgbmVlZGVkLCB3ZSBtYXkgaGF2ZSB0byBtb3ZlIHRoaXMgdG8KKwkgKiBtb2RlX2luZm8gc3RydWN0dXJlCisJICovCit9OworCisvKiBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gaW5mbyAqLworc3RydWN0IGVuY29kZXJfY29uZmlnX2luZm8geworCWNoYXIgbW9kdWxlX25hbWVbMzJdOworCS8qIElzIHRoaXMgYW4gaTJjIGRldmljZSA/ICovCisJdW5zaWduZWQgaW50IGlzX2kyYzoxOworCS8qIGkyYyBzdWJkZXZpY2UgYm9hcmQgaW5mbyAqLworCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBib2FyZF9pbmZvOworfTsKKworLyogc3RydWN0dXJlIGZvciBkZWZpbmluZyB2cGJlIGRpc3BsYXkgc3Vic3lzdGVtIGNvbXBvbmVudHMgKi8KK3N0cnVjdCB2cGJlX2NvbmZpZyB7CisJY2hhciBtb2R1bGVfbmFtZVszMl07CisJLyogaTJjIGJ1cyBhZGFwdGVyIG5vICovCisJaW50IGkyY19hZGFwdGVyX2lkOworCXN0cnVjdCBvc2RfY29uZmlnX2luZm8gb3NkOworCXN0cnVjdCBlbmNvZGVyX2NvbmZpZ19pbmZvIHZlbmM7CisJLyogZXh0ZXJuYWwgZW5jb2RlciBpbmZvcm1hdGlvbiBnb2VzIGhlcmUgKi8KKwlpbnQgbnVtX2V4dF9lbmNvZGVyczsKKwlzdHJ1Y3QgZW5jb2Rlcl9jb25maWdfaW5mbyAqZXh0X2VuY29kZXJzOworCWludCBudW1fb3V0cHV0czsKKwkvKiBPcmRlciBpcyB2ZW5jIG91dHB1dHMgZm9sbG93ZWQgYnkgTENEIGFuZCB0aGVuIGV4dGVybmFsIGVuY29kZXJzICovCisJc3RydWN0IHZwYmVfb3V0cHV0ICpvdXRwdXRzOworfTsKKworc3RydWN0IHZwYmVfZGV2aWNlOworCitzdHJ1Y3QgdnBiZV9kZXZpY2Vfb3BzIHsKKwkvKiBjcm9wIGNhcCBmb3IgdGhlIGRpc3BsYXkgKi8KKwlpbnQgKCpnX2Nyb3BjYXApKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsCisJCQkgc3RydWN0IHY0bDJfY3JvcGNhcCAqY3JvcGNhcCk7CisKKwkvKiBFbnVtZXJhdGUgdGhlIG91dHB1dHMgKi8KKwlpbnQgKCplbnVtX291dHB1dHMpKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsCisJCQkgICAgc3RydWN0IHY0bDJfb3V0cHV0ICpvdXRwdXQpOworCisJLyogU2V0IG91dHB1dCB0byB0aGUgZ2l2ZW4gaW5kZXggKi8KKwlpbnQgKCpzZXRfb3V0cHV0KShzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkJIGludCBpbmRleCk7CisKKwkvKiBHZXQgY3VycmVudCBvdXRwdXQgKi8KKwl1bnNpZ25lZCBpbnQgKCpnZXRfb3V0cHV0KShzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2KTsKKworCS8qIFNldCBEViBwcmVzZXQgYXQgY3VycmVudCBvdXRwdXQgKi8KKwlpbnQgKCpzX2R2X3ByZXNldCkoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwKKwkJCSAgIHN0cnVjdCB2NGwyX2R2X3ByZXNldCAqZHZfcHJlc2V0KTsKKworCS8qIEdldCBEViBwcmVzZXRzIHN1cHBvcnRlZCBhdCB0aGUgb3V0cHV0ICovCisJaW50ICgqZ19kdl9wcmVzZXQpKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsCisJCQkgICBzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQgKmR2X3ByZXNldCk7CisKKwkvKiBFbnVtZXJhdGUgdGhlIERWIFByZXNldHMgc3VwcG9ydGVkIGF0IHRoZSBvdXRwdXQgKi8KKwlpbnQgKCplbnVtX2R2X3ByZXNldHMpKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsCisJCQkgICAgICAgc3RydWN0IHY0bDJfZHZfZW51bV9wcmVzZXQgKnByZXNldF9pbmZvKTsKKworCS8qIFNldCBzdGQgYXQgdGhlIG91dHB1dCAqLworCWludCAoKnNfc3RkKShzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LCB2NGwyX3N0ZF9pZCAqc3RkX2lkKTsKKworCS8qIEdldCB0aGUgY3VycmVudCBzdGQgYXQgdGhlIG91dHB1dCAqLworCWludCAoKmdfc3RkKShzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LCB2NGwyX3N0ZF9pZCAqc3RkX2lkKTsKKworCS8qIGluaXRpYWxpemUgdGhlIGRldmljZSAqLworCWludCAoKmluaXRpYWxpemUpKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2Rldik7CisKKwkvKiBEZS1pbml0aWFsaXplIHRoZSBkZXZpY2UgKi8KKwl2b2lkICgqZGVpbml0aWFsaXplKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYpOworCisJLyogR2V0IHRoZSBjdXJyZW50IG1vZGUgaW5mbyAqLworCWludCAoKmdldF9tb2RlX2luZm8pKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsCisJCQkgICAgIHN0cnVjdCB2cGJlX2VuY19tb2RlX2luZm8qKTsKKworCS8qCisJICogU2V0IHRoZSBjdXJyZW50IG1vZGUgaW4gdGhlIGVuY29kZXIuIEFsdGVybmF0ZSB3YXkgb2Ygc2V0dGluZworCSAqIHN0YW5kYXJkIG9yIERWIHByZXNldCBvciBjdXN0b20gdGltaW5ncyBpbiB0aGUgZW5jb2RlcgorCSAqLworCWludCAoKnNldF9tb2RlKShzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkJc3RydWN0IHZwYmVfZW5jX21vZGVfaW5mbyopOworCS8qIFBvd2VyIG1hbmFnZW1lbnQgb3BlcmF0aW9ucyAqLworCWludCAoKnN1c3BlbmQpKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYpOworCWludCAoKnJlc3VtZSkoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2Rldik7Cit9OworCisvKiBzdHJ1Y3QgZm9yIHZwYmUgZGV2aWNlICovCitzdHJ1Y3QgdnBiZV9kZXZpY2UgeworCS8qIFY0bDIgZGV2aWNlICovCisJc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2OworCS8qIHZwYmUgZGlzcGF5IGNvbnRyb2xsZXIgY2ZnICovCisJc3RydWN0IHZwYmVfY29uZmlnICpjZmc7CisJLyogcGFyZW50IGRldmljZSAqLworCXN0cnVjdCBkZXZpY2UgKnBkZXY7CisJLyogZXh0ZXJuYWwgZW5jb2RlciB2NGwyIHN1YiBkZXZpY2VzICovCisJc3RydWN0IHY0bDJfc3ViZGV2ICoqZW5jb2RlcnM7CisJLyogY3VycmVudCBlbmNvZGVyIGluZGV4ICovCisJaW50IGN1cnJlbnRfc2RfaW5kZXg7CisJc3RydWN0IG11dGV4IGxvY2s7CisJLyogZGV2aWNlIGluaXRpYWxpemVkICovCisJaW50IGluaXRpYWxpemVkOworCS8qIHZwYmUgZGFjIGNsb2NrICovCisJc3RydWN0IGNsayAqZGFjX2NsazsKKwkvKiBvc2RfZGV2aWNlIHBvaW50ZXIgKi8KKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2RfZGV2aWNlOworCS8qCisJICogZmllbGRzIGJlbG93IGFyZSBhY2Nlc3NlZCBieSB1c2VycyBvZiB2cGJlX2RldmljZS4gTm90IHRoZQorCSAqIG9uZXMgYWJvdmUKKwkgKi8KKworCS8qIGN1cnJlbnQgb3V0cHV0ICovCisJaW50IGN1cnJlbnRfb3V0X2luZGV4OworCS8qIGxvY2sgdXNlZCBieSBjYWxsZXIgdG8gZG8gYXRvbWljIG9wZXJhdGlvbiBvbiB2cGJlIGRldmljZSAqLworCS8qIGN1cnJlbnQgdGltaW5ncyBzZXQgaW4gdGhlIGNvbnRyb2xsZXIgKi8KKwlzdHJ1Y3QgdnBiZV9lbmNfbW9kZV9pbmZvIGN1cnJlbnRfdGltaW5nczsKKwkvKiB2ZW5jIHN1YiBkZXZpY2UgKi8KKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnZlbmM7CisJLyogZGV2aWNlIG9wZXJhdGlvbnMgYmVsb3cgKi8KKwlzdHJ1Y3QgdnBiZV9kZXZpY2Vfb3BzIG9wczsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9kYXZpbmNpL3ZwYmVfZGlzcGxheS5oIGIvaW5jbHVkZS9tZWRpYS9kYXZpbmNpL3ZwYmVfZGlzcGxheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZjZiMzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL2RhdmluY2kvdnBiZV9kaXNwbGF5LmgKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20vCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgV0lUSE9VVCBBTlkgV0FSUkFOVFkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZDsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIFZQQkVfRElTUExBWV9ICisjZGVmaW5lIFZQQkVfRElTUExBWV9ICisKKy8qIEhlYWRlciBmaWxlcyAqLworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtZG1hLWNvbnRpZy5oPgorI2luY2x1ZGUgPG1lZGlhL2RhdmluY2kvdnBiZV90eXBlcy5oPgorI2luY2x1ZGUgPG1lZGlhL2RhdmluY2kvdnBiZV9vc2QuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmUuaD4KKworI2RlZmluZSBWUEJFX0RJU1BMQVlfTUFYX0RFVklDRVMgMgorCitlbnVtIHZwYmVfZGlzcGxheV9kZXZpY2VfaWQgeworCVZQQkVfRElTUExBWV9ERVZJQ0VfMCwKKwlWUEJFX0RJU1BMQVlfREVWSUNFXzEKK307CisKKyNkZWZpbmUgVlBCRV9ESVNQTEFZX0RSVl9OQU1FCSJ2cGJlLWRpc3BsYXkiCisKKyNkZWZpbmUgVlBCRV9ESVNQTEFZX01BSk9SX1JFTEVBU0UgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVlBCRV9ESVNQTEFZX01JTk9SX1JFTEVBU0UgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVlBCRV9ESVNQTEFZX0JVSUxEICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVlBCRV9ESVNQTEFZX1ZFUlNJT05fQ09ERSAoKFZQQkVfRElTUExBWV9NQUpPUl9SRUxFQVNFIDw8IDE2KSB8IFwKKwkoVlBCRV9ESVNQTEFZX01JTk9SX1JFTEVBU0UgPDwgOCkgIHwgXAorCVZQQkVfRElTUExBWV9CVUlMRCkKKworI2RlZmluZSBWUEJFX0RJU1BMQVlfVkFMSURfRklFTEQoZmllbGQpICAgKChWNEwyX0ZJRUxEX05PTkUgPT0gZmllbGQpIHx8IFwKKwkgKFY0TDJfRklFTERfQU5ZID09IGZpZWxkKSB8fCAoVjRMMl9GSUVMRF9JTlRFUkxBQ0VEID09IGZpZWxkKSkKKworLyogRXhwIHJhdGlvIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3IgY29uc3RhbnRzICovCisjZGVmaW5lIFZQQkVfRElTUExBWV9IX0VYUF9SQVRJT19OCTkKKyNkZWZpbmUgVlBCRV9ESVNQTEFZX0hfRVhQX1JBVElPX0QJOAorI2RlZmluZSBWUEJFX0RJU1BMQVlfVl9FWFBfUkFUSU9fTgk2CisjZGVmaW5lIFZQQkVfRElTUExBWV9WX0VYUF9SQVRJT19ECTUKKworLyogWm9vbSBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgKi8KKyNkZWZpbmUgVlBCRV9ESVNQTEFZX1pPT01fNFgJNAorI2RlZmluZSBWUEJFX0RJU1BMQVlfWk9PTV8yWAkyCisKKy8qIFN0cnVjdHVyZXMgKi8KK3N0cnVjdCBkaXNwbGF5X2xheWVyX2luZm8geworCWludCBlbmFibGU7CisJLyogTGF5ZXIgSUQgdXNlZCBieSBEaXNwbGF5IE1hbmFnZXIgKi8KKwllbnVtIG9zZF9sYXllciBpZDsKKwlzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyBjb25maWc7CisJZW51bSBvc2Rfem9vbV9mYWN0b3IgaF96b29tOworCWVudW0gb3NkX3pvb21fZmFjdG9yIHZfem9vbTsKKwllbnVtIG9zZF9oX2V4cF9yYXRpbyBoX2V4cDsKKwllbnVtIG9zZF92X2V4cF9yYXRpbyB2X2V4cDsKK307CisKKy8qIHZwYmUgZGlzcGxheSBvYmplY3Qgc3RydWN0dXJlICovCitzdHJ1Y3QgdnBiZV9sYXllciB7CisJLyogbnVtYmVyIG9mIGJ1ZmZlcnMgaW4gZmJ1ZmZlcnMgKi8KKwl1bnNpZ25lZCBpbnQgbnVtYnVmZmVyczsKKwkvKiBQb2ludGVyIHRvIHRoZSB2cGJlX2Rpc3BsYXkgKi8KKwlzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldjsKKwkvKiBQb2ludGVyIHBvaW50aW5nIHRvIGN1cnJlbnQgdjRsMl9idWZmZXIgKi8KKwlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICpjdXJfZnJtOworCS8qIFBvaW50ZXIgcG9pbnRpbmcgdG8gbmV4dCB2NGwyX2J1ZmZlciAqLworCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKm5leHRfZnJtOworCS8qIHZpZGVvYnVmIHNwZWNpZmljIHBhcmFtZXRlcnMKKwkgKiBCdWZmZXIgcXVldWUgdXNlZCBpbiB2aWRlby1idWYKKwkgKi8KKwlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgYnVmZmVyX3F1ZXVlOworCS8qIFF1ZXVlIG9mIGZpbGxlZCBmcmFtZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGRtYV9xdWV1ZTsKKwkvKiBVc2VkIGluIHZpZGVvLWJ1ZiAqLworCXNwaW5sb2NrX3QgaXJxbG9jazsKKwkvKiBWNGwyIHNwZWNpZmljIHBhcmFtZXRlcnMgKi8KKwkvKiBJZGVudGlmaWVzIHZpZGVvIGRldmljZSBmb3IgdGhpcyBsYXllciAqLworCXN0cnVjdCB2aWRlb19kZXZpY2UgdmlkZW9fZGV2OworCS8qIFRoaXMgZmllbGQga2VlcHMgdHJhY2sgb2YgdHlwZSBvZiBidWZmZXIgZXhjaGFuZ2UgbWVjaGFuaXNtIHVzZXIKKwkgKiBoYXMgc2VsZWN0ZWQKKwkgKi8KKwllbnVtIHY0bDJfbWVtb3J5IG1lbW9yeTsKKwkvKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2Ygc3RhdGUgb2YgdGhlIHByaW9yaXR5ICovCisJc3RydWN0IHY0bDJfcHJpb19zdGF0ZSBwcmlvOworCS8qIFVzZWQgdG8gc3RvcmUgcGl4ZWwgZm9ybWF0ICovCisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBwaXhfZm10OworCWVudW0gdjRsMl9maWVsZCBidWZfZmllbGQ7CisJLyogVmlkZW8gbGF5ZXIgY29uZmlndXJhdGlvbiBwYXJhbXMgKi8KKwlzdHJ1Y3QgZGlzcGxheV9sYXllcl9pbmZvIGxheWVyX2luZm87CisJLyogdnBiZSBzcGVjaWZpYyBwYXJhbWV0ZXJzCisJICogZW5hYmxlIHdpbmRvdyBmb3IgZGlzcGxheQorCSAqLworCXVuc2lnbmVkIGNoYXIgd2luZG93X2VuYWJsZTsKKwkvKiBudW1iZXIgb2Ygb3BlbiBpbnN0YW5jZXMgb2YgdGhlIGxheWVyICovCisJdW5zaWduZWQgaW50IHVzcnM7CisJLyogbnVtYmVyIG9mIHVzZXJzIHBlcmZvcm1pbmcgSU8gKi8KKwl1bnNpZ25lZCBpbnQgaW9fdXNyczsKKwkvKiBJbmRpY2F0ZXMgaWQgb2YgdGhlIGZpZWxkIHdoaWNoIGlzIGJlaW5nIGRpc3BsYXllZCAqLworCXVuc2lnbmVkIGludCBmaWVsZF9pZDsKKwkvKiBJbmRpY2F0ZXMgd2hldGhlciBzdHJlYW1pbmcgc3RhcnRlZCAqLworCXVuc2lnbmVkIGNoYXIgc3RhcnRlZDsKKwkvKiBJZGVudGlmaWVzIGRldmljZSBvYmplY3QgKi8KKwllbnVtIHZwYmVfZGlzcGxheV9kZXZpY2VfaWQgZGV2aWNlX2lkOworCS8qIGZhY2lsaXRhdGlvbiBvZiBpb2N0bCBvcHMgbG9jayBieSB2NGwyKi8KKwlzdHJ1Y3QgbXV0ZXggb3BzbG9jazsKKwl1OCBsYXllcl9maXJzdF9pbnQ7Cit9OworCisvKiB2cGJlIGRldmljZSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCB2cGJlX2Rpc3BsYXkgeworCS8qIGxheWVyIHNwZWNpZmljIHBhcmFtZXRlcnMgKi8KKwkvKiBsb2NrIGZvciBpc3IgdXBkYXRlcyB0byBidWYgbGF5ZXJzKi8KKwlzcGlubG9ja190IGRtYV9xdWV1ZV9sb2NrOworCS8qIEMtUGxhbmUgb2Zmc2V0IGZyb20gc3RhcnQgb2YgeS1wbGFuZSAqLworCXVuc2lnbmVkIGludCBjYmNyX29mc3Q7CisJc3RydWN0IHZwYmVfbGF5ZXIgKmRldltWUEJFX0RJU1BMQVlfTUFYX0RFVklDRVNdOworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXY7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkX2RldmljZTsKK307CisKKy8qIEZpbGUgaGFuZGxlIHN0cnVjdHVyZSAqLworc3RydWN0IHZwYmVfZmggeworCS8qIHZwYmUgZGV2aWNlIHN0cnVjdHVyZSAqLworCXN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3BfZGV2OworCS8qIHBvaW50ZXIgdG8gbGF5ZXIgb2JqZWN0IGZvciBvcGVuZWQgZGV2aWNlICovCisJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyOworCS8qIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgZmlsZSBoYW5kbGUgaXMgZG9pbmcgSU8gKi8KKwl1bnNpZ25lZCBjaGFyIGlvX2FsbG93ZWQ7CisJLyogVXNlZCB0byBrZWVwIHRyYWNrIHByaW9yaXR5IG9mIHRoaXMgaW5zdGFuY2UgKi8KKwllbnVtIHY0bDJfcHJpb3JpdHkgcHJpbzsKK307CisKK3N0cnVjdCBidWZfY29uZmlnX3BhcmFtcyB7CisJdW5zaWduZWQgY2hhciBtaW5fbnVtYnVmZmVyczsKKwl1bnNpZ25lZCBjaGFyIG51bWJ1ZmZlcnNbVlBCRV9ESVNQTEFZX01BWF9ERVZJQ0VTXTsKKwl1bnNpZ25lZCBpbnQgbWluX2J1ZnNpemVbVlBCRV9ESVNQTEFZX01BWF9ERVZJQ0VTXTsKKwl1bnNpZ25lZCBpbnQgbGF5ZXJfYnVmc2l6ZVtWUEJFX0RJU1BMQVlfTUFYX0RFVklDRVNdOworfTsKKworI2VuZGlmCS8qIFZQQkVfRElTUExBWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2RhdmluY2kvdnBiZV9vc2QuaCBiL2luY2x1ZGUvbWVkaWEvZGF2aW5jaS92cGJlX29zZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZTM5N2EKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL2RhdmluY2kvdnBiZV9vc2QuaApAQCAtMCwwICsxLDM5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRleGFzIEluc3RydW1lbnRzIEluYworICogQ29weXJpZ2h0IChDKSAyMDA3IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBBbmR5IExvd2UgKGFsb3dlQG12aXN0YS5jb20pLCBNb250YVZpc3RhIFNvZnR3YXJlCisgKiAtIEluaXRpYWwgdmVyc2lvbgorICogTXVyYWxpIEthcmljaGVyaSAobWthcmljaGVyaUBnbWFpbC5jb20pLCBUZXhhcyBJbnN0cnVtZW50cyBMdGQuCisgKiAtIHBvcnRlZCB0byBzdWIgZGV2aWNlIGludGVyZmFjZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisjaWZuZGVmIF9PU0RfSAorI2RlZmluZSBfT1NEX0gKKworI2luY2x1ZGUgPG1lZGlhL2RhdmluY2kvdnBiZV90eXBlcy5oPgorCisjZGVmaW5lIFZQQkVfT1NEX1NVQkRFVl9OQU1FICJ2cGJlLW9zZCIKKworLyoqCisgKiBlbnVtIG9zZF9sYXllcgorICogQFdJTl9PU0QwOiBPbi1TY3JlZW4gRGlzcGxheSBXaW5kb3cgMAorICogQFdJTl9WSUQwOiBWaWRlbyBXaW5kb3cgMAorICogQFdJTl9PU0QxOiBPbi1TY3JlZW4gRGlzcGxheSBXaW5kb3cgMQorICogQFdJTl9WSUQxOiBWaWRlbyBXaW5kb3cgMQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQW4gZW51bWVyYXRpb24gb2YgdGhlIG9zZCBkaXNwbGF5IGxheWVycy4KKyAqLworZW51bSBvc2RfbGF5ZXIgeworCVdJTl9PU0QwLAorCVdJTl9WSUQwLAorCVdJTl9PU0QxLAorCVdJTl9WSUQxLAorfTsKKworLyoqCisgKiBlbnVtIG9zZF93aW5fbGF5ZXIKKyAqIEBPU0RXSU5fT1NEMDogT24tU2NyZWVuIERpc3BsYXkgV2luZG93IDAKKyAqIEBPU0RXSU5fT1NEMTogT24tU2NyZWVuIERpc3BsYXkgV2luZG93IDEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSBPU0QgV2luZG93IGxheWVycy4KKyAqLworZW51bSBvc2Rfd2luX2xheWVyIHsKKwlPU0RXSU5fT1NEMCwKKwlPU0RXSU5fT1NEMSwKK307CisKKy8qKgorICogZW51bSBvc2RfcGl4X2Zvcm1hdAorICogQFBJWEZNVF8xQlBQOiAxLWJpdC1wZXItcGl4ZWwgYml0bWFwCisgKiBAUElYRk1UXzJCUFA6IDItYml0cy1wZXItcGl4ZWwgYml0bWFwCisgKiBAUElYRk1UXzRCUFA6IDQtYml0cy1wZXItcGl4ZWwgYml0bWFwCisgKiBAUElYRk1UXzhCUFA6IDgtYml0cy1wZXItcGl4ZWwgYml0bWFwCisgKiBAUElYRk1UX1JHQjU2NTogMTYtYml0cy1wZXItcGl4ZWwgUkdCNTY1CisgKiBAUElYRk1UX1lDYkNySTogWVVWIDQ6MjoyCisgKiBAUElYRk1UX1JHQjg4ODogMjQtYml0cy1wZXItcGl4ZWwgUkdCODg4CisgKiBAUElYRk1UX1lDckNiSTogWVVWIDQ6MjoyIHdpdGggY2hyb21hIHN3YXAKKyAqIEBQSVhGTVRfTlYxMjogWVVWIDQ6MjowIHBsYW5hcgorICogQFBJWEZNVF9PU0RfQVRUUjogT1NEIEF0dHJpYnV0ZSBXaW5kb3cgcGl4ZWwgZm9ybWF0ICg0YnBwKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQW4gZW51bWVyYXRpb24gb2YgdGhlIERhVmluY2kgcGl4ZWwgZm9ybWF0cy4KKyAqLworZW51bSBvc2RfcGl4X2Zvcm1hdCB7CisJUElYRk1UXzFCUFAgPSAwLAorCVBJWEZNVF8yQlBQLAorCVBJWEZNVF80QlBQLAorCVBJWEZNVF84QlBQLAorCVBJWEZNVF9SR0I1NjUsCisJUElYRk1UX1lDYkNySSwKKwlQSVhGTVRfUkdCODg4LAorCVBJWEZNVF9ZQ3JDYkksCisJUElYRk1UX05WMTIsCisJUElYRk1UX09TRF9BVFRSLAorfTsKKworLyoqCisgKiBlbnVtIG9zZF9oX2V4cF9yYXRpbworICogQEhfRVhQX09GRjogbm8gZXhwYW5zaW9uICgxLzEpCisgKiBASF9FWFBfOV9PVkVSXzg6IDkvOCBleHBhbnNpb24gcmF0aW8KKyAqIEBIX0VYUF8zX09WRVJfMjogMy8yIGV4cGFuc2lvbiByYXRpbworICoKKyAqIERlc2NyaXB0aW9uOgorICogQW4gZW51bWVyYXRpb24gb2YgdGhlIGF2YWlsYWJsZSBob3Jpem9udGFsIGV4cGFuc2lvbiByYXRpb3MuCisgKi8KK2VudW0gb3NkX2hfZXhwX3JhdGlvIHsKKwlIX0VYUF9PRkYsCisJSF9FWFBfOV9PVkVSXzgsCisJSF9FWFBfM19PVkVSXzIsCit9OworCisvKioKKyAqIGVudW0gb3NkX3ZfZXhwX3JhdGlvCisgKiBAVl9FWFBfT0ZGOiBubyBleHBhbnNpb24gKDEvMSkKKyAqIEBWX0VYUF82X09WRVJfNTogNi81IGV4cGFuc2lvbiByYXRpbworICoKKyAqIERlc2NyaXB0aW9uOgorICogQW4gZW51bWVyYXRpb24gb2YgdGhlIGF2YWlsYWJsZSB2ZXJ0aWNhbCBleHBhbnNpb24gcmF0aW9zLgorICovCitlbnVtIG9zZF92X2V4cF9yYXRpbyB7CisJVl9FWFBfT0ZGLAorCVZfRVhQXzZfT1ZFUl81LAorfTsKKworLyoqCisgKiBlbnVtIG9zZF96b29tX2ZhY3RvcgorICogQFpPT01fWDE6IG5vIHpvb20gKHgxKQorICogQFpPT01fWDI6IHgyIHpvb20KKyAqIEBaT09NX1g0OiB4NCB6b29tCisgKgorICogRGVzY3JpcHRpb246CisgKiBBbiBlbnVtZXJhdGlvbiBvZiB0aGUgYXZhaWxhYmxlIHpvb20gZmFjdG9ycy4KKyAqLworZW51bSBvc2Rfem9vbV9mYWN0b3IgeworCVpPT01fWDEsCisJWk9PTV9YMiwKKwlaT09NX1g0LAorfTsKKworLyoqCisgKiBlbnVtIG9zZF9jbHV0CisgKiBAUk9NX0NMVVQ6IFJPTSBDTFVUCisgKiBAUkFNX0NMVVQ6IFJBTSBDTFVUCisgKgorICogRGVzY3JpcHRpb246CisgKiBBbiBlbnVtZXJhdGlvbiBvZiB0aGUgYXZhaWxhYmxlIENvbG9yIExvb2t1cCBUYWJsZXMgKENMVVRzKS4KKyAqLworZW51bSBvc2RfY2x1dCB7CisJUk9NX0NMVVQsCisJUkFNX0NMVVQsCit9OworCisvKioKKyAqIGVudW0gb3NkX3JvbV9jbHV0CisgKiBAUk9NX0NMVVQwOiBNYWNpbnRvc2ggQ0xVVAorICogQFJPTV9DTFVUMTogQ0xVVCBmcm9tIERNMjcwIGFuZCBwcmlvciBkZXZpY2VzCisgKgorICogRGVzY3JpcHRpb246CisgKiBBbiBlbnVtZXJhdGlvbiBvZiB0aGUgUk9NIENvbG9yIExvb2t1cCBUYWJsZSAoQ0xVVCkgb3B0aW9ucy4KKyAqLworZW51bSBvc2Rfcm9tX2NsdXQgeworCVJPTV9DTFVUMCwKKwlST01fQ0xVVDEsCit9OworCisvKioKKyAqIGVudW0gb3NkX2JsZW5kaW5nX2ZhY3RvcgorICogQE9TRF8wX1ZJRF84OiBPU0QgcGl4ZWxzIGFyZSBmdWxseSB0cmFuc3BhcmVudAorICogQE9TRF8xX1ZJRF83OiBPU0QgcGl4ZWxzIGNvbnRyaWJ1dGUgMS84LCB2aWRlbyBwaXhlbHMgY29udHJpYnV0ZSA3LzgKKyAqIEBPU0RfMl9WSURfNjogT1NEIHBpeGVscyBjb250cmlidXRlIDIvOCwgdmlkZW8gcGl4ZWxzIGNvbnRyaWJ1dGUgNi84CisgKiBAT1NEXzNfVklEXzU6IE9TRCBwaXhlbHMgY29udHJpYnV0ZSAzLzgsIHZpZGVvIHBpeGVscyBjb250cmlidXRlIDUvOAorICogQE9TRF80X1ZJRF80OiBPU0QgcGl4ZWxzIGNvbnRyaWJ1dGUgNC84LCB2aWRlbyBwaXhlbHMgY29udHJpYnV0ZSA0LzgKKyAqIEBPU0RfNV9WSURfMzogT1NEIHBpeGVscyBjb250cmlidXRlIDUvOCwgdmlkZW8gcGl4ZWxzIGNvbnRyaWJ1dGUgMy84CisgKiBAT1NEXzZfVklEXzI6IE9TRCBwaXhlbHMgY29udHJpYnV0ZSA2LzgsIHZpZGVvIHBpeGVscyBjb250cmlidXRlIDIvOAorICogQE9TRF84X1ZJRF8wOiBPU0QgcGl4ZWxzIGFyZSBmdWxseSBvcGFxdWUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSBEYVZpbmNpIHBpeGVsIGJsZW5kaW5nIGZhY3RvciBvcHRpb25zLgorICovCitlbnVtIG9zZF9ibGVuZGluZ19mYWN0b3IgeworCU9TRF8wX1ZJRF84LAorCU9TRF8xX1ZJRF83LAorCU9TRF8yX1ZJRF82LAorCU9TRF8zX1ZJRF81LAorCU9TRF80X1ZJRF80LAorCU9TRF81X1ZJRF8zLAorCU9TRF82X1ZJRF8yLAorCU9TRF84X1ZJRF8wLAorfTsKKworLyoqCisgKiBlbnVtIG9zZF9ibGlua19pbnRlcnZhbAorICogQEJMSU5LX1gxOiBibGluayBpbnRlcnZhbCBpcyAxIHZlcnRpY2FsIHJlZnJlc2ggY3ljbGUKKyAqIEBCTElOS19YMjogYmxpbmsgaW50ZXJ2YWwgaXMgMiB2ZXJ0aWNhbCByZWZyZXNoIGN5Y2xlcworICogQEJMSU5LX1gzOiBibGluayBpbnRlcnZhbCBpcyAzIHZlcnRpY2FsIHJlZnJlc2ggY3ljbGVzCisgKiBAQkxJTktfWDQ6IGJsaW5rIGludGVydmFsIGlzIDQgdmVydGljYWwgcmVmcmVzaCBjeWNsZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSBEYVZpbmNpIHBpeGVsIGJsaW5raW5nIGludGVydmFsIG9wdGlvbnMuCisgKi8KK2VudW0gb3NkX2JsaW5rX2ludGVydmFsIHsKKwlCTElOS19YMSwKKwlCTElOS19YMiwKKwlCTElOS19YMywKKwlCTElOS19YNCwKK307CisKKy8qKgorICogZW51bSBvc2RfY3Vyc29yX2hfd2lkdGgKKyAqIEBIX1dJRFRIXzE6IGhvcml6b250YWwgbGluZSB3aWR0aCBpcyAxIHBpeGVsCisgKiBASF9XSURUSF80OiBob3Jpem9udGFsIGxpbmUgd2lkdGggaXMgNCBwaXhlbHMKKyAqIEBIX1dJRFRIXzg6IGhvcml6b250YWwgbGluZSB3aWR0aCBpcyA4IHBpeGVscworICogQEhfV0lEVEhfMTI6IGhvcml6b250YWwgbGluZSB3aWR0aCBpcyAxMiBwaXhlbHMKKyAqIEBIX1dJRFRIXzE2OiBob3Jpem9udGFsIGxpbmUgd2lkdGggaXMgMTYgcGl4ZWxzCisgKiBASF9XSURUSF8yMDogaG9yaXpvbnRhbCBsaW5lIHdpZHRoIGlzIDIwIHBpeGVscworICogQEhfV0lEVEhfMjQ6IGhvcml6b250YWwgbGluZSB3aWR0aCBpcyAyNCBwaXhlbHMKKyAqIEBIX1dJRFRIXzI4OiBob3Jpem9udGFsIGxpbmUgd2lkdGggaXMgMjggcGl4ZWxzCisgKi8KK2VudW0gb3NkX2N1cnNvcl9oX3dpZHRoIHsKKwlIX1dJRFRIXzEsCisJSF9XSURUSF80LAorCUhfV0lEVEhfOCwKKwlIX1dJRFRIXzEyLAorCUhfV0lEVEhfMTYsCisJSF9XSURUSF8yMCwKKwlIX1dJRFRIXzI0LAorCUhfV0lEVEhfMjgsCit9OworCisvKioKKyAqIGVudW0gZGF2aW5jaV9jdXJzb3Jfdl93aWR0aAorICogQFZfV0lEVEhfMTogdmVydGljYWwgbGluZSB3aWR0aCBpcyAxIGxpbmUKKyAqIEBWX1dJRFRIXzI6IHZlcnRpY2FsIGxpbmUgd2lkdGggaXMgMiBsaW5lcworICogQFZfV0lEVEhfNDogdmVydGljYWwgbGluZSB3aWR0aCBpcyA0IGxpbmVzCisgKiBAVl9XSURUSF82OiB2ZXJ0aWNhbCBsaW5lIHdpZHRoIGlzIDYgbGluZXMKKyAqIEBWX1dJRFRIXzg6IHZlcnRpY2FsIGxpbmUgd2lkdGggaXMgOCBsaW5lcworICogQFZfV0lEVEhfMTA6IHZlcnRpY2FsIGxpbmUgd2lkdGggaXMgMTAgbGluZXMKKyAqIEBWX1dJRFRIXzEyOiB2ZXJ0aWNhbCBsaW5lIHdpZHRoIGlzIDEyIGxpbmVzCisgKiBAVl9XSURUSF8xNDogdmVydGljYWwgbGluZSB3aWR0aCBpcyAxNCBsaW5lcworICovCitlbnVtIG9zZF9jdXJzb3Jfdl93aWR0aCB7CisJVl9XSURUSF8xLAorCVZfV0lEVEhfMiwKKwlWX1dJRFRIXzQsCisJVl9XSURUSF82LAorCVZfV0lEVEhfOCwKKwlWX1dJRFRIXzEwLAorCVZfV0lEVEhfMTIsCisJVl9XSURUSF8xNCwKK307CisKKy8qKgorICogc3RydWN0IG9zZF9jdXJzb3JfY29uZmlnCisgKiBAeHNpemU6IGhvcml6b250YWwgc2l6ZSBpbiBwaXhlbHMKKyAqIEB5c2l6ZTogdmVydGljYWwgc2l6ZSBpbiBsaW5lcworICogQHhwb3M6IGhvcml6b250YWwgb2Zmc2V0IGluIHBpeGVscyBmcm9tIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGRpc3BsYXkKKyAqIEB5cG9zOiB2ZXJ0aWNhbCBvZmZzZXQgaW4gbGluZXMgZnJvbSB0aGUgdG9wIG9mIHRoZSBkaXNwbGF5CisgKiBAaW50ZXJsYWNlZDogTm9uLXplcm8gaWYgdGhlIGRpc3BsYXkgaXMgaW50ZXJsYWNlZCwgb3IgemVybyBvdGhlcndpc2UKKyAqIEBoX3dpZHRoOiBob3Jpem9udGFsIGxpbmUgd2lkdGgKKyAqIEB2X3dpZHRoOiB2ZXJ0aWNhbCBsaW5lIHdpZHRoCisgKiBAY2x1dDogdGhlIENMVVQgc2VsZWN0b3IgKFJPTSBvciBSQU0pIGZvciB0aGUgY3Vyc29yIGNvbG9yCisgKiBAY2x1dF9pbmRleDogYW4gaW5kZXggaW50byB0aGUgQ0xVVCBmb3IgdGhlIGN1cnNvciBjb2xvcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogQSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIG9mIHRoZSBoYXJkd2FyZQorICogcmVjdGFuZ3VsYXIgY3Vyc29yLgorICovCitzdHJ1Y3Qgb3NkX2N1cnNvcl9jb25maWcgeworCXVuc2lnbmVkIHhzaXplOworCXVuc2lnbmVkIHlzaXplOworCXVuc2lnbmVkIHhwb3M7CisJdW5zaWduZWQgeXBvczsKKwlpbnQgaW50ZXJsYWNlZDsKKwllbnVtIG9zZF9jdXJzb3JfaF93aWR0aCBoX3dpZHRoOworCWVudW0gb3NkX2N1cnNvcl92X3dpZHRoIHZfd2lkdGg7CisJZW51bSBvc2RfY2x1dCBjbHV0OworCXVuc2lnbmVkIGNoYXIgY2x1dF9pbmRleDsKK307CisKKy8qKgorICogc3RydWN0IG9zZF9sYXllcl9jb25maWcKKyAqIEBwaXhmbXQ6IHBpeGVsIGZvcm1hdAorICogQGxpbmVfbGVuZ3RoOiBvZmZzZXQgaW4gYnl0ZXMgYmV0d2VlbiBzdGFydCBvZiBlYWNoIGxpbmUgaW4gbWVtb3J5CisgKiBAeHNpemU6IG51bWJlciBvZiBob3Jpem9udGFsIHBpeGVscyBkaXNwbGF5ZWQgcGVyIGxpbmUKKyAqIEB5c2l6ZTogbnVtYmVyIG9mIGxpbmVzIGRpc3BsYXllZAorICogQHhwb3M6IGhvcml6b250YWwgb2Zmc2V0IGluIHBpeGVscyBmcm9tIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGRpc3BsYXkKKyAqIEB5cG9zOiB2ZXJ0aWNhbCBvZmZzZXQgaW4gbGluZXMgZnJvbSB0aGUgdG9wIG9mIHRoZSBkaXNwbGF5CisgKiBAaW50ZXJsYWNlZDogTm9uLXplcm8gaWYgdGhlIGRpc3BsYXkgaXMgaW50ZXJsYWNlZCwgb3IgemVybyBvdGhlcndpc2UKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEEgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBvZiBhbiBPbi1TY3JlZW4gRGlzcGxheQorICogKE9TRCkgb3IgdmlkZW8gbGF5ZXIgcmVsYXRlZCB0byBob3cgdGhlIGltYWdlIGlzIHN0b3JlZCBpbiBtZW1vcnkuCisgKiBAbGluZV9sZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBjYWNoZSBsaW5lIHNpemUgKDMyIGJ5dGVzKS4KKyAqLworc3RydWN0IG9zZF9sYXllcl9jb25maWcgeworCWVudW0gb3NkX3BpeF9mb3JtYXQgcGl4Zm10OworCXVuc2lnbmVkIGxpbmVfbGVuZ3RoOworCXVuc2lnbmVkIHhzaXplOworCXVuc2lnbmVkIHlzaXplOworCXVuc2lnbmVkIHhwb3M7CisJdW5zaWduZWQgeXBvczsKKwlpbnQgaW50ZXJsYWNlZDsKK307CisKKy8qIHBhcmFtZXRlcnMgdGhhdCBhcHBseSBvbiBhIHBlci13aW5kb3cgKE9TRCBvciB2aWRlbykgYmFzaXMgKi8KK3N0cnVjdCBvc2Rfd2luZG93X3N0YXRlIHsKKwlpbnQgaXNfYWxsb2NhdGVkOworCWludCBpc19lbmFibGVkOworCXVuc2lnbmVkIGxvbmcgZmJfYmFzZV9waHlzOworCWVudW0gb3NkX3pvb21fZmFjdG9yIGhfem9vbTsKKwllbnVtIG9zZF96b29tX2ZhY3RvciB2X3pvb207CisJc3RydWN0IG9zZF9sYXllcl9jb25maWcgbGNvbmZpZzsKK307CisKKy8qIHBhcmFtZXRlcnMgdGhhdCBhcHBseSBvbiBhIHBlci1PU0Qtd2luZG93IGJhc2lzICovCitzdHJ1Y3Qgb3NkX29zZHdpbl9zdGF0ZSB7CisJZW51bSBvc2RfY2x1dCBjbHV0OworCWVudW0gb3NkX2JsZW5kaW5nX2ZhY3RvciBibGVuZDsKKwlpbnQgY29sb3JrZXlfYmxlbmRpbmc7CisJdW5zaWduZWQgY29sb3JrZXk7CisJaW50IHJlYzYwMV9hdHRlbnVhdGlvbjsKKwkvKiBpbmRleCBpcyBwaXhlbCB2YWx1ZSAqLworCXVuc2lnbmVkIGNoYXIgcGFsZXR0ZV9tYXBbMTZdOworfTsKKworLyogaGFyZHdhcmUgcmVjdGFuZ3VsYXIgY3Vyc29yIHBhcmFtZXRlcnMgKi8KK3N0cnVjdCBvc2RfY3Vyc29yX3N0YXRlIHsKKwlpbnQgaXNfZW5hYmxlZDsKKwlzdHJ1Y3Qgb3NkX2N1cnNvcl9jb25maWcgY29uZmlnOworfTsKKworc3RydWN0IG9zZF9zdGF0ZTsKKworc3RydWN0IHZwYmVfb3NkX29wcyB7CisJaW50ICgqaW5pdGlhbGl6ZSkoc3RydWN0IG9zZF9zdGF0ZSAqc2QpOworCWludCAoKnJlcXVlc3RfbGF5ZXIpKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllcik7CisJdm9pZCAoKnJlbGVhc2VfbGF5ZXIpKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllcik7CisJaW50ICgqZW5hYmxlX2xheWVyKShzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgZW51bSBvc2RfbGF5ZXIgbGF5ZXIsCisJCQkgICAgaW50IG90aGVyd2luKTsKKwl2b2lkICgqZGlzYWJsZV9sYXllcikoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyKTsKKwlpbnQgKCpzZXRfbGF5ZXJfY29uZmlnKShzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgZW51bSBvc2RfbGF5ZXIgbGF5ZXIsCisJCQkJc3RydWN0IG9zZF9sYXllcl9jb25maWcgKmxjb25maWcpOworCXZvaWQgKCpnZXRfbGF5ZXJfY29uZmlnKShzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgZW51bSBvc2RfbGF5ZXIgbGF5ZXIsCisJCQkJIHN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnICpsY29uZmlnKTsKKwl2b2lkICgqc3RhcnRfbGF5ZXIpKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllciwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGZiX2Jhc2VfcGh5cywKKwkJCSAgICB1bnNpZ25lZCBsb25nIGNiY3Jfb2ZzdCk7CisJdm9pZCAoKnNldF9sZWZ0X21hcmdpbikoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIHUzMiB2YWwpOworCXZvaWQgKCpzZXRfdG9wX21hcmdpbikoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIHUzMiB2YWwpOworCXZvaWQgKCpzZXRfaW50ZXJwb2xhdGlvbl9maWx0ZXIpKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBpbnQgZmlsdGVyKTsKKwlpbnQgKCpzZXRfdmlkX2V4cGFuc2lvbikoc3RydWN0IG9zZF9zdGF0ZSAqc2QsCisJCQkJCWVudW0gb3NkX2hfZXhwX3JhdGlvIGhfZXhwLAorCQkJCQllbnVtIG9zZF92X2V4cF9yYXRpbyB2X2V4cCk7CisJdm9pZCAoKmdldF92aWRfZXhwYW5zaW9uKShzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwKKwkJCQkJZW51bSBvc2RfaF9leHBfcmF0aW8gKmhfZXhwLAorCQkJCQllbnVtIG9zZF92X2V4cF9yYXRpbyAqdl9leHApOworCXZvaWQgKCpzZXRfem9vbSkoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyLAorCQkJCWVudW0gb3NkX3pvb21fZmFjdG9yIGhfem9vbSwKKwkJCQllbnVtIG9zZF96b29tX2ZhY3RvciB2X3pvb20pOworfTsKKworc3RydWN0IG9zZF9zdGF0ZSB7CisJZW51bSB2cGJlX3ZlcnNpb24gdnBiZV90eXBlOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJZG1hX2FkZHJfdCBvc2RfYmFzZV9waHlzOworCXVuc2lnbmVkIGxvbmcgb3NkX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBvc2Rfc2l6ZTsKKwkvKiAxLS0+dGhlIGlzciB3aWxsIHRvZ2dsZSB0aGUgVklEMCBwaW5nLXBvbmcgYnVmZmVyICovCisJaW50IHBpbmdwb25nOworCWludCBpbnRlcnBvbGF0aW9uX2ZpbHRlcjsKKwlpbnQgZmllbGRfaW52ZXJzaW9uOworCWVudW0gb3NkX2hfZXhwX3JhdGlvIG9zZF9oX2V4cDsKKwllbnVtIG9zZF92X2V4cF9yYXRpbyBvc2Rfdl9leHA7CisJZW51bSBvc2RfaF9leHBfcmF0aW8gdmlkX2hfZXhwOworCWVudW0gb3NkX3ZfZXhwX3JhdGlvIHZpZF92X2V4cDsKKwllbnVtIG9zZF9jbHV0IGJhY2tnX2NsdXQ7CisJdW5zaWduZWQgYmFja2dfY2x1dF9pbmRleDsKKwllbnVtIG9zZF9yb21fY2x1dCByb21fY2x1dDsKKwlpbnQgaXNfYmxpbmtpbmc7CisJLyogYXR0cmlidXRlIHdpbmRvdyBibGlua2luZyBlbmFibGVkICovCisJZW51bSBvc2RfYmxpbmtfaW50ZXJ2YWwgYmxpbms7CisJLyogWUNiQ3JJIG9yIFlDckNiSSAqLworCWVudW0gb3NkX3BpeF9mb3JtYXQgeWNfcGl4Zm10OworCS8qIGNvbHVtbnMgYXJlIFksIENiLCBDciAqLworCXVuc2lnbmVkIGNoYXIgY2x1dF9yYW1bMjU2XVszXTsKKwlzdHJ1Y3Qgb3NkX2N1cnNvcl9zdGF0ZSBjdXJzb3I7CisJLyogT1NEMCwgVklEMCwgT1NEMSwgVklEMSAqLworCXN0cnVjdCBvc2Rfd2luZG93X3N0YXRlIHdpbls0XTsKKwkvKiBPU0QwLCBPU0QxICovCisJc3RydWN0IG9zZF9vc2R3aW5fc3RhdGUgb3Nkd2luWzJdOworCS8qIE9TRCBkZXZpY2UgT3BlcmF0aW9ucyAqLworCXN0cnVjdCB2cGJlX29zZF9vcHMgb3BzOworfTsKKworc3RydWN0IG9zZF9wbGF0Zm9ybV9kYXRhIHsKKwllbnVtIHZwYmVfdmVyc2lvbiB2cGJlX3R5cGU7CisJaW50ICBmaWVsZF9pbnZfd2FfZW5hYmxlOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2RhdmluY2kvdnBiZV90eXBlcy5oIGIvaW5jbHVkZS9tZWRpYS9kYXZpbmNpL3ZwYmVfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjdmNTUxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9kYXZpbmNpL3ZwYmVfdHlwZXMuaApAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRleGFzIEluc3RydW1lbnRzIEluYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfVlBCRV9UWVBFU19ICisjZGVmaW5lIF9WUEJFX1RZUEVTX0gKKworZW51bSB2cGJlX3ZlcnNpb24geworCVZQQkVfVkVSU0lPTl8xID0gMSwKKwlWUEJFX1ZFUlNJT05fMiwKKwlWUEJFX1ZFUlNJT05fMywKK307CisKKy8qIHZwYmVfdGltaW5nX3R5cGUgLSBUaW1pbmcgdHlwZXMgdXNlZCBpbiB2cGJlIGRldmljZSAqLworZW51bSB2cGJlX2VuY190aW1pbmdzX3R5cGUgeworCVZQQkVfRU5DX1NURCA9IDB4MSwKKwlWUEJFX0VOQ19EVl9QUkVTRVQgPSAweDIsCisJVlBCRV9FTkNfQ1VTVE9NX1RJTUlOR1MgPSAweDQsCisJLyogVXNlZCB3aGVuIHNldCB0aW1pbmdzIHRocm91Z2ggRkIgZGV2aWNlIGludGVyZmFjZSAqLworCVZQQkVfRU5DX1RJTUlOR1NfSU5WQUxJRCA9IDB4OCwKK307CisKK3VuaW9uIHZwYmVfdGltaW5ncyB7CisJdjRsMl9zdGRfaWQgc3RkX2lkOworCXVuc2lnbmVkIGludCBkdl9wcmVzZXQ7Cit9OworCisvKgorICogc3RydWN0IHZwYmVfZW5jX21vZGVfaW5mbworICogQG5hbWU6IHB0ciB0byBuYW1lIHN0cmluZyBvZiB0aGUgc3RhbmRhcmQsICJOVFNDIiwgIlBBTCIgZXRjCisgKiBAc3RkOiBzdGFuZGFyZCBvciBub24tc3RhbmRhcmQgbW9kZS4gMSAtIHN0YW5kYXJkLCAwIC0gbm9uc3RhbmRhcmQKKyAqIEBpbnRlcmxhY2VkOiAxIC0gaW50ZXJsYWNlZCwgMCAtIG5vbiBpbnRlcmxhY2VkL3Byb2dyZXNzaXZlCisgKiBAeHJlczogeCBvciBob3Jpem9udGFsIHJlc29sdXRpb24gb2YgdGhlIGRpc3BsYXkKKyAqIEB5cmVzOiB5IG9yIHZlcnRpY2FsIHJlc29sdXRpb24gb2YgdGhlIGRpc3BsYXkKKyAqIEBmcHM6IGZyYW1lIHBlciBzZWNvbmQKKyAqIEBsZWZ0X21hcmdpbjogbGVmdCBtYXJnaW4gb2YgdGhlIGRpc3BsYXkKKyAqIEByaWdodF9tYXJnaW46IHJpZ2h0IG1hcmdpbiBvZiB0aGUgZGlzcGxheQorICogQHVwcGVyX21hcmdpbjogdXBwZXIgbWFyZ2luIG9mIHRoZSBkaXNwbGF5CisgKiBAbG93ZXJfbWFyZ2luOiBsb3dlciBtYXJnaW4gb2YgdGhlIGRpc3BsYXkKKyAqIEBoc3luY19sZW46IGgtc3luYyBsZW5ndGgKKyAqIEB2c3luY19sZW46IHYtc3luYyBsZW5ndGgKKyAqIEBmbGFnczogYml0IGZpZWxkOiBiaXQgdXNhZ2UgaXMgZG9jdW1lbnRlZCBiZWxvdworICoKKyAqIERlc2NyaXB0aW9uOgorICogIFN0cnVjdHVyZSBob2xkaW5nIHRpbWluZyBhbmQgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbiBvZiBhIHN0YW5kYXJkLgorICogVXNlZCBieSB2cGJlX2RldmljZSB0byBzZXQgcmVxdWlyZWQgbm9uLXN0YW5kYXJkIHRpbWluZyBpbiB0aGUKKyAqIHZlbmMgd2hlbiBsY2QgY29udHJvbGxlciBvdXRwdXQgaXMgY29ubmVjdGVkIHRvIGEgZXh0ZXJuYWwgZW5jb2Rlci4KKyAqIEEgdGFibGUgb2YgdGltaW5ncyBpcyBtYWludGFpbmVkIGluIHZwYmUgZGV2aWNlIHRvIHNldCB0aGlzIGluCisgKiB2ZW5jIHdoZW4gZXh0ZXJuYWwgZW5jb2RlciBpcyBjb25uZWN0ZWQgdG8gbGNkIGNvbnRyb2xsZXIgb3V0cHV0LgorICogRW5jb2RlciBtYXkgcHJvdmlkZSBhIGdfZHZfdGltaW5ncygpIEFQSSB0byBvdmVycmlkZSB0aGVzZSB2YWx1ZXMKKyAqIGFzIG5lZWRlZC4KKyAqCisgKiAgTm90ZXMKKyAqICAtLS0tLS0KKyAqICBpZl90eXBlIHNob3VsZCBiZSB1c2VkIG9ubHkgYnkgZW5jb2RlciBtYW5hZ2VyIGFuZCBlbmNvZGVyLgorICogIGZsYWdzIHVzYWdlCisgKiAgICAgYjAgKExTQikgLSBoc3luYyBwb2xhcml0eSwgMCAtIG5lZ2F0aXZlLCAxIC0gcG9zaXRpdmUKKyAqICAgICBiMSAgICAgICAtIHZzeW5jIHBvbGFyaXR5LCAwIC0gbmVnYXRpdmUsIDEgLSBwb3NpdGl2ZQorICogICAgIGIyICAgICAgIC0gZmllbGQgaWQgcG9sYXJpdHksIDAgLSBuZWdhdGl2ZSwgMSAgLSBwb3NpdGl2ZQorICovCitzdHJ1Y3QgdnBiZV9lbmNfbW9kZV9pbmZvIHsKKwl1bnNpZ25lZCBjaGFyICpuYW1lOworCWVudW0gdnBiZV9lbmNfdGltaW5nc190eXBlIHRpbWluZ3NfdHlwZTsKKwl1bmlvbiB2cGJlX3RpbWluZ3MgdGltaW5nczsKKwl1bnNpZ25lZCBpbnQgaW50ZXJsYWNlZDsKKwl1bnNpZ25lZCBpbnQgeHJlczsKKwl1bnNpZ25lZCBpbnQgeXJlczsKKwlzdHJ1Y3QgdjRsMl9mcmFjdCBhc3BlY3Q7CisJc3RydWN0IHY0bDJfZnJhY3QgZnBzOworCXVuc2lnbmVkIGludCBsZWZ0X21hcmdpbjsKKwl1bnNpZ25lZCBpbnQgcmlnaHRfbWFyZ2luOworCXVuc2lnbmVkIGludCB1cHBlcl9tYXJnaW47CisJdW5zaWduZWQgaW50IGxvd2VyX21hcmdpbjsKKwl1bnNpZ25lZCBpbnQgaHN5bmNfbGVuOworCXVuc2lnbmVkIGludCB2c3luY19sZW47CisJdW5zaWduZWQgaW50IGZsYWdzOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2RhdmluY2kvdnBiZV92ZW5jLmggYi9pbmNsdWRlL21lZGlhL2RhdmluY2kvdnBiZV92ZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI2YzIwNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvZGF2aW5jaS92cGJlX3ZlbmMuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRleGFzIEluc3RydW1lbnRzIEluYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfVlBCRV9WRU5DX0gKKyNkZWZpbmUgX1ZQQkVfVkVOQ19ICisKKyNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgorI2luY2x1ZGUgPG1lZGlhL2RhdmluY2kvdnBiZV90eXBlcy5oPgorCisjZGVmaW5lIFZQQkVfVkVOQ19TVUJERVZfTkFNRSAidnBiZS12ZW5jIgorCisvKiB2ZW5jIGV2ZW50cyAqLworI2RlZmluZSBWRU5DX0VORF9PRl9GUkFNRQlCSVQoMCkKKyNkZWZpbmUgVkVOQ19GSVJTVF9GSUVMRAlCSVQoMSkKKyNkZWZpbmUgVkVOQ19TRUNPTkRfRklFTEQJQklUKDIpCisKK3N0cnVjdCB2ZW5jX3BsYXRmb3JtX2RhdGEgeworCWVudW0gdnBiZV92ZXJzaW9uIHZlbmNfdHlwZTsKKwlpbnQgKCpzZXR1cF9jbG9jaykoZW51bSB2cGJlX2VuY190aW1pbmdzX3R5cGUgdHlwZSwKKwkJCSAgIHVuc2lnbmVkIGludCBtb2RlKTsKKwkvKiBOdW1iZXIgb2YgTENEIG91dHB1dHMgc3VwcG9ydGVkICovCisJaW50IG51bV9sY2Rfb3V0cHV0czsKK307CisKK2VudW0gdmVuY19pb2N0bHMgeworCVZFTkNfR0VUX0ZMRCA9IDEsCit9OworCisvKiBleHBvcnRlZCBmdW5jdGlvbnMgKi8KK3N0cnVjdCB2NGwyX3N1YmRldiAqdmVuY19zdWJfZGV2X2luaXQoc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiwKKwkJY29uc3QgY2hhciAqdmVuY19uYW1lKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tbXAtY2FtZXJhLmggYi9pbmNsdWRlL21lZGlhL21tcC1jYW1lcmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjExOTYzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9tbXAtY2FtZXJhLmgKQEAgLTAsMCArMSw5IEBACisvKgorICogSW5mb3JtYXRpb24gZm9yIHRoZSBNYXJ2ZWxsIEFybWFkYSBNTVAgY2FtZXJhCisgKi8KKworc3RydWN0IG1tcF9jYW1lcmFfcGxhdGZvcm1fZGF0YSB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqaTJjX2RldmljZTsKKwlpbnQgc2Vuc29yX3Bvd2VyX2dwaW87CisJaW50IHNlbnNvcl9yZXNldF9ncGlvOworfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NjcwLmggYi9pbmNsdWRlL21lZGlhL292NzY3MC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL21lZGlhL3ZpZGVvL292NzY3MC5oCnJlbmFtZSB0byBpbmNsdWRlL21lZGlhL292NzY3MC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3JjLWNvcmUuaCBiL2luY2x1ZGUvbWVkaWEvcmMtY29yZS5oCmluZGV4IDYwNTM2YzcuLmIxZjE5YjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvcmMtY29yZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvcmMtY29yZS5oCkBAIC0xMTcsNyArMTE3LDcgQEAKIAlpbnQJCQkJKCpzX3R4X2NhcnJpZXIpKHN0cnVjdCByY19kZXYgKmRldiwgdTMyIGNhcnJpZXIpOwogCWludAkJCQkoKnNfdHhfZHV0eV9jeWNsZSkoc3RydWN0IHJjX2RldiAqZGV2LCB1MzIgZHV0eV9jeWNsZSk7CiAJaW50CQkJCSgqc19yeF9jYXJyaWVyX3JhbmdlKShzdHJ1Y3QgcmNfZGV2ICpkZXYsIHUzMiBtaW4sIHUzMiBtYXgpOwotCWludAkJCQkoKnR4X2lyKShzdHJ1Y3QgcmNfZGV2ICpkZXYsIGludCAqdHhidWYsIHUzMiBuKTsKKwlpbnQJCQkJKCp0eF9pcikoc3RydWN0IHJjX2RldiAqZGV2LCB1bnNpZ25lZCAqdHhidWYsIHVuc2lnbmVkIG4pOwogCXZvaWQJCQkJKCpzX2lkbGUpKHN0cnVjdCByY19kZXYgKmRldiwgYm9vbCBlbmFibGUpOwogCWludAkJCQkoKnNfbGVhcm5pbmdfbW9kZSkoc3RydWN0IHJjX2RldiAqZGV2LCBpbnQgZW5hYmxlKTsKIAlpbnQJCQkJKCpzX2NhcnJpZXJfcmVwb3J0KSAoc3RydWN0IHJjX2RldiAqZGV2LCBpbnQgZW5hYmxlKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvcmMtbWFwLmggYi9pbmNsdWRlL21lZGlhL3JjLW1hcC5oCmluZGV4IDRlMTQwOWUuLjE3Yzk3NTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvcmMtbWFwLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9yYy1tYXAuaApAQCAtMTgsMTIgKzE4LDEzIEBACiAjZGVmaW5lIFJDX1RZUEVfSlZDCSgxICA8PCAzKQkvKiBKVkMgcHJvdG9jb2wgKi8KICNkZWZpbmUgUkNfVFlQRV9TT05ZCSgxICA8PCA0KQkvKiBTb255MTIvMTUvMjAgcHJvdG9jb2wgKi8KICNkZWZpbmUgUkNfVFlQRV9SQzVfU1oJKDEgIDw8IDUpCS8qIFJDNSB2YXJpYW50IHVzZWQgYnkgU3RyZWFtemFwICovCisjZGVmaW5lIFJDX1RZUEVfTUNFX0tCRAkoMSAgPDwgMjkpCS8qIFJDNi1pc2ggTUNFIGtleWJvYXJkL21vdXNlICovCiAjZGVmaW5lIFJDX1RZUEVfTElSQwkoMSAgPDwgMzApCS8qIFBhc3MgcmF3IElSIHRvIGxpcmMgdXNlcnNwYWNlICovCiAjZGVmaW5lIFJDX1RZUEVfT1RIRVIJKDF1IDw8IDMxKQogCiAjZGVmaW5lIFJDX1RZUEVfQUxMIChSQ19UWVBFX1JDNSB8IFJDX1RZUEVfTkVDICB8IFJDX1RZUEVfUkM2ICB8IFwKIAkJICAgICBSQ19UWVBFX0pWQyB8IFJDX1RZUEVfU09OWSB8IFJDX1RZUEVfTElSQyB8IFwKLQkJICAgICBSQ19UWVBFX1JDNV9TWiB8IFJDX1RZUEVfT1RIRVIpCisJCSAgICAgUkNfVFlQRV9SQzVfU1ogfCBSQ19UWVBFX01DRV9LQkQgfCBSQ19UWVBFX09USEVSKQogCiBzdHJ1Y3QgcmNfbWFwX3RhYmxlIHsKIAl1MzIJc2NhbmNvZGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3NoX21vYmlsZV9jZXUuaCBiL2luY2x1ZGUvbWVkaWEvc2hfbW9iaWxlX2NldS5oCmluZGV4IDgwMzQ2YTYuLjQ4NDEzYjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc2hfbW9iaWxlX2NldS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc2hfbW9iaWxlX2NldS5oCkBAIC03LDEwICs3LDE4IEBACiAjZGVmaW5lIFNIX0NFVV9GTEFHX1ZTWU5DX0xPVwkJKDEgPDwgMykgLyogZGVmYXVsdCBIaWdoIGlmIHBvc3NpYmxlICovCiAKIHN0cnVjdCBkZXZpY2U7CitzdHJ1Y3QgcmVzb3VyY2U7CisKK3N0cnVjdCBzaF9tb2JpbGVfY2V1X2NvbXBhbmlvbiB7CisJdTMyCQludW1fcmVzb3VyY2VzOworCXN0cnVjdCByZXNvdXJjZQkqcmVzb3VyY2U7CisJaW50CQlpZDsKKwl2b2lkCQkqcGxhdGZvcm1fZGF0YTsKK307CiAKIHN0cnVjdCBzaF9tb2JpbGVfY2V1X2luZm8gewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGRldmljZSAqY3NpMl9kZXY7CisJc3RydWN0IHNoX21vYmlsZV9jZXVfY29tcGFuaW9uICpjc2kyOwogfTsKIAogI2VuZGlmIC8qIF9fQVNNX1NIX01PQklMRV9DRVVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3NoX21vYmlsZV9jc2kyLmggYi9pbmNsdWRlL21lZGlhL3NoX21vYmlsZV9jc2kyLmgKaW5kZXggNGQyNjE1MS4uYzU4NmM0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zaF9tb2JpbGVfY3NpMi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc2hfbW9iaWxlX2NzaTIuaApAQCAtMTEsNiArMTEsOCBAQAogI2lmbmRlZiBTSF9NSVBJX0NTSQogI2RlZmluZSBTSF9NSVBJX0NTSQogCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCiBlbnVtIHNoX2NzaTJfcGh5IHsKIAlTSF9DU0kyX1BIWV9NQUlOLAogCVNIX0NTSTJfUEhZX1NVQiwKQEAgLTMzLDE0ICszNSwxNCBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CS8qIGNsaWVudCBwbGF0Zm9ybSBkZXZpY2UgKi8KIH07CiAKK3N0cnVjdCB2NGwyX2RldmljZTsKKwogc3RydWN0IHNoX2NzaTJfcGRhdGEgewogCWVudW0gc2hfY3NpMl90eXBlIHR5cGU7CiAJdW5zaWduZWQgaW50IGZsYWdzOwogCXN0cnVjdCBzaF9jc2kyX2NsaWVudF9jb25maWcgKmNsaWVudHM7CiAJaW50IG51bV9jbGllbnRzOworCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXY7CiB9OwogCi1zdHJ1Y3QgZGV2aWNlOwotc3RydWN0IHY0bDJfZGV2aWNlOwotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc29jX2NhbWVyYS5oIGIvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhLmgKaW5kZXggMjM4YmQzMy4uNzU4Mjk1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhLmgKQEAgLTIwLDE0ICsyMCwxNSBAQAogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1jb3JlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KIAotZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBzb2NfY2FtZXJhX2J1c190eXBlOwotCiBzdHJ1Y3QgZmlsZTsKK3N0cnVjdCBzb2NfY2FtZXJhX2xpbms7CiAKIHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCBkZXZpY2UgZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCS8qIGxpc3Qgb2YgYWxsIHJlZ2lzdGVyZWQgZGV2aWNlcyAqLworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmxpbms7CiAJc3RydWN0IGRldmljZSAqcGRldjsJCS8qIFBsYXRmb3JtIGRldmljZSAqLworCXN0cnVjdCBkZXZpY2UgKnBhcmVudDsJCS8qIENhbWVyYSBob3N0IGRldmljZSAqLworCXN0cnVjdCBkZXZpY2UgKmNvbnRyb2w7CQkvKiBFLmcuLCB0aGUgaTJjIGNsaWVudCAqLwogCXMzMiB1c2VyX3dpZHRoOwogCXMzMiB1c2VyX2hlaWdodDsKIAl1MzIgYnl0ZXNwZXJsaW5lOwkJLyogZm9yIHBhZGRpbmcsIHplcm8gaWYgdW51c2VkICovCkBAIC02Niw4ICs2Nyw2IEBACiAJc3RydWN0IG1vZHVsZSAqb3duZXI7CiAJaW50ICgqYWRkKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKik7CiAJdm9pZCAoKnJlbW92ZSkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICopOwotCWludCAoKnN1c3BlbmQpKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqLCBwbV9tZXNzYWdlX3QpOwotCWludCAoKnJlc3VtZSkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICopOwogCS8qCiAJICogLmdldF9mb3JtYXRzKCkgaXMgY2FsbGVkIGZvciBlYWNoIGNsaWVudCBkZXZpY2UgZm9ybWF0LCBidXQKIAkgKiAucHV0X2Zvcm1hdHMoKSBpcyBvbmx5IGNhbGxlZCBvbmNlLiBGdXJ0aGVyLCBpZiBhbnkgb2YgdGhlIGNhbGxzIHRvCkBAIC0xMDksMTIgKzEwOCw2IEBACiAjZGVmaW5lIFNPQ0FNX1NFTlNPUl9JTlZFUlRfSFNZTkMJKDEgPDwgMikKICNkZWZpbmUgU09DQU1fU0VOU09SX0lOVkVSVF9WU1lOQwkoMSA8PCAzKQogI2RlZmluZSBTT0NBTV9TRU5TT1JfSU5WRVJUX0RBVEEJKDEgPDwgNCkKLSNkZWZpbmUgU09DQU1fTUlQSV8xTEFORQkJKDEgPDwgNSkKLSNkZWZpbmUgU09DQU1fTUlQSV8yTEFORQkJKDEgPDwgNikKLSNkZWZpbmUgU09DQU1fTUlQSV8zTEFORQkJKDEgPDwgNykKLSNkZWZpbmUgU09DQU1fTUlQSV80TEFORQkJKDEgPDwgOCkKLSNkZWZpbmUgU09DQU1fTUlQSQkoU09DQU1fTUlQSV8xTEFORSB8IFNPQ0FNX01JUElfMkxBTkUgfCBcCi0JCQlTT0NBTV9NSVBJXzNMQU5FIHwgU09DQU1fTUlQSV80TEFORSkKIAogc3RydWN0IGkyY19ib2FyZF9pbmZvOwogc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGE7CkBAIC0xMzQsMTEgKzEyNywxMSBAQAogCWludCBudW1fcmVndWxhdG9yczsKIAogCS8qCi0JICogRm9yIG5vbi1JMkMgZGV2aWNlcyBwbGF0Zm9ybSBwbGF0Zm9ybSBoYXMgdG8gcHJvdmlkZSBtZXRob2RzIHRvCi0JICogYWRkIGEgZGV2aWNlIHRvIHRoZSBzeXN0ZW0gYW5kIHRvIHJlbW92ZQorCSAqIEZvciBub24tSTJDIGRldmljZXMgcGxhdGZvcm0gaGFzIHRvIHByb3ZpZGUgbWV0aG9kcyB0byBhZGQgYSBkZXZpY2UKKwkgKiB0byB0aGUgc3lzdGVtIGFuZCB0byByZW1vdmUgaXQKIAkgKi8KLQlpbnQgKCphZGRfZGV2aWNlKShzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICosIHN0cnVjdCBkZXZpY2UgKik7Ci0Jdm9pZCAoKmRlbF9kZXZpY2UpKHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKik7CisJaW50ICgqYWRkX2RldmljZSkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICopOworCXZvaWQgKCpkZWxfZGV2aWNlKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKik7CiAJLyogT3B0aW9uYWwgY2FsbGJhY2tzIHRvIHBvd2VyIG9uIG9yIG9mZiBhbmQgcmVzZXQgdGhlIHNlbnNvciAqLwogCWludCAoKnBvd2VyKShzdHJ1Y3QgZGV2aWNlICosIGludCk7CiAJaW50ICgqcmVzZXQpKHN0cnVjdCBkZXZpY2UgKik7CkBAIC0xNTIsMTIgKzE0NSw2IEBACiAJdm9pZCAoKmZyZWVfYnVzKShzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICopOwogfTsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKnRvX3NvY19jYW1lcmFfZGV2KAotCWNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlLCBkZXYpOwotfQotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKnRvX3NvY19jYW1lcmFfaG9zdCgKIAljb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC0xNjksMTMgKzE1NiwxMyBAQAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICp0b19zb2NfY2FtZXJhX2xpbmsoCiAJY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0JcmV0dXJuIGljZC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJcmV0dXJuIGljZC0+bGluazsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICp0b19zb2NfY2FtZXJhX2NvbnRyb2woCiAJY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0JcmV0dXJuIGRldl9nZXRfZHJ2ZGF0YSgmaWNkLT5kZXYpOworCXJldHVybiBpY2QtPmNvbnRyb2w7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHY0bDJfc3ViZGV2ICpzb2NfY2FtZXJhX3RvX3N1YmRldigKQEAgLTIwNywxMSArMTk0LDggQEAKIH07CiAKIHN0cnVjdCBzb2NfY2FtZXJhX29wcyB7Ci0JaW50ICgqc3VzcGVuZCkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICosIHBtX21lc3NhZ2VfdCBzdGF0ZSk7Ci0JaW50ICgqcmVzdW1lKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKik7CiAJdW5zaWduZWQgbG9uZyAoKnF1ZXJ5X2J1c19wYXJhbSkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICopOwogCWludCAoKnNldF9idXNfcGFyYW0pKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqLCB1bnNpZ25lZCBsb25nKTsKLQlpbnQgKCplbnVtX2lucHV0KShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKiwgc3RydWN0IHY0bDJfaW5wdXQgKik7CiAJY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsICpjb250cm9sczsKIAlpbnQgbnVtX2NvbnRyb2xzOwogfTsKQEAgLTI3MCw2ICsyNTQsMTIgQEAKICNkZWZpbmUgU09DQU1fUENMS19TQU1QTEVfRkFMTElORwkoMSA8PCAxMykKICNkZWZpbmUgU09DQU1fREFUQV9BQ1RJVkVfSElHSAkJKDEgPDwgMTQpCiAjZGVmaW5lIFNPQ0FNX0RBVEFfQUNUSVZFX0xPVwkJKDEgPDwgMTUpCisjZGVmaW5lIFNPQ0FNX01JUElfMUxBTkUJCSgxIDw8IDE2KQorI2RlZmluZSBTT0NBTV9NSVBJXzJMQU5FCQkoMSA8PCAxNykKKyNkZWZpbmUgU09DQU1fTUlQSV8zTEFORQkJKDEgPDwgMTgpCisjZGVmaW5lIFNPQ0FNX01JUElfNExBTkUJCSgxIDw8IDE5KQorI2RlZmluZSBTT0NBTV9NSVBJCShTT0NBTV9NSVBJXzFMQU5FIHwgU09DQU1fTUlQSV8yTEFORSB8IFwKKwkJCVNPQ0FNX01JUElfM0xBTkUgfCBTT0NBTV9NSVBJXzRMQU5FKQogCiAjZGVmaW5lIFNPQ0FNX0RBVEFXSURUSF9NQVNLIChTT0NBTV9EQVRBV0lEVEhfNCB8IFNPQ0FNX0RBVEFXSURUSF84IHwgXAogCQkJICAgICAgU09DQU1fREFUQVdJRFRIXzkgfCBTT0NBTV9EQVRBV0lEVEhfMTAgfCBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3NvY19jYW1lcmFfcGxhdGZvcm0uaCBiL2luY2x1ZGUvbWVkaWEvc29jX2NhbWVyYV9wbGF0Zm9ybS5oCmluZGV4IDZkN2E0ZmQuLjc0ZjBmYTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc29jX2NhbWVyYV9wbGF0Zm9ybS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc29jX2NhbWVyYV9wbGF0Zm9ybS5oCkBAIC0yMSw3ICsyMSw3IEBACiAJdW5zaWduZWQgbG9uZyBmb3JtYXRfZGVwdGg7CiAJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBmb3JtYXQ7CiAJdW5zaWduZWQgbG9uZyBidXNfcGFyYW07Ci0Jc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkOwogCWludCAoKnNldF9jYXB0dXJlKShzdHJ1Y3Qgc29jX2NhbWVyYV9wbGF0Zm9ybV9pbmZvICppbmZvLCBpbnQgZW5hYmxlKTsKIH07CiAKQEAgLTMwLDggKzMwLDcgQEAKIAkqcGRldiA9IE5VTEw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHNvY19jYW1lcmFfcGxhdGZvcm1fYWRkKGNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCwKLQkJCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXYsCitzdGF0aWMgaW5saW5lIGludCBzb2NfY2FtZXJhX3BsYXRmb3JtX2FkZChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKIAkJCQkJICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoqcGRldiwKIAkJCQkJICBzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICpwbGluaywKIAkJCQkJICB2b2lkICgqcmVsZWFzZSkoc3RydWN0IGRldmljZSAqZGV2KSwKQEAgLTQwLDcgKzM5LDcgQEAKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9wbGF0Zm9ybV9pbmZvICppbmZvID0gcGxpbmstPnByaXY7CiAJaW50IHJldDsKIAotCWlmIChpY2wgIT0gcGxpbmspCisJaWYgKGljZC0+bGluayAhPSBwbGluaykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoKnBkZXYpCkBAIC01MCw3ICs0OSw3IEBACiAJaWYgKCEqcGRldikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpbmZvLT5kZXYgPSBkZXY7CisJaW5mby0+aWNkID0gaWNkOwogCiAJKCpwZGV2KS0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBpbmZvOwogCSgqcGRldiktPmRldi5yZWxlYXNlID0gcmVsZWFzZTsKQEAgLTU5LDE3ICs1OCwxNyBAQAogCWlmIChyZXQgPCAwKSB7CiAJCXBsYXRmb3JtX2RldmljZV9wdXQoKnBkZXYpOwogCQkqcGRldiA9IE5VTEw7Ci0JCWluZm8tPmRldiA9IE5VTEw7CisJCWluZm8tPmljZCA9IE5VTEw7CiAJfQogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNvY19jYW1lcmFfcGxhdGZvcm1fZGVsKGNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCwKK3N0YXRpYyBpbmxpbmUgdm9pZCBzb2NfY2FtZXJhX3BsYXRmb3JtX2RlbChjb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKIAkJCQkJICAgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKIAkJCQkJICAgY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfbGluayAqcGxpbmspCiB7Ci0JaWYgKGljbCAhPSBwbGluayB8fCAhcGRldikKKwlpZiAoaWNkLT5saW5rICE9IHBsaW5rIHx8ICFwZGV2KQogCQlyZXR1cm47CiAKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdGltYl9yYWRpby5oIGIvaW5jbHVkZS9tZWRpYS90aW1iX3JhZGlvLmgKaW5kZXggYTU5YTg0OC4uYTQwYTZhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS90aW1iX3JhZGlvLmgKKysrIGIvaW5jbHVkZS9tZWRpYS90aW1iX3JhZGlvLmgKQEAgLTIzLDEzICsyMyw4IEBACiAKIHN0cnVjdCB0aW1iX3JhZGlvX3BsYXRmb3JtX2RhdGEgewogCWludCBpMmNfYWRhcHRlcjsgLyogSTJDIGFkYXB0ZXIgd2hlcmUgdGhlIHR1bmVyIGFuZCBkc3AgYXJlIGF0dGFjaGVkICovCi0Jc3RydWN0IHsKLQkJc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvOwotCX0gdHVuZXI7Ci0Jc3RydWN0IHsKLQkJY29uc3QgY2hhciAqbW9kdWxlX25hbWU7Ci0JCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbzsKLQl9IGRzcDsKKwlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKnR1bmVyOworCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqZHNwOwogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3R1bmVyLmggYi9pbmNsdWRlL21lZGlhL3R1bmVyLmgKaW5kZXggOTYzZTMzNC4uODljMjkwYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS90dW5lci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdHVuZXIuaApAQCAtMTI3LDYgKzEyNyw4IEBACiAjZGVmaW5lIFRVTkVSX1BISUxJUFNfRk1EMTIxNk1FWF9NSzMJNzgKICNkZWZpbmUgVFVORVJfUEhJTElQU19GTTEyMTZNSzUJCTc5CiAjZGVmaW5lIFRVTkVSX1BISUxJUFNfRlExMjE2TE1FX01LMwk4MAkvKiBBY3RpdmUgbG9vcHRocm91Z2gsIG5vIEZNICovCisjZGVmaW5lIFRVTkVSX1hDNDAwMAkJCTgxCS8qIFhjZWl2ZSBTaWxpY29uIFR1bmVyICovCisKICNkZWZpbmUgVFVORVJfUEFSVFNOSUNfUFRJXzVORjA1CTgxCiAjZGVmaW5lIFRVTkVSX1BISUxJUFNfQ1UxMjE2TCAgICAgICAgICAgODIKICNkZWZpbmUgVFVORVJfTlhQX1REQTE4MjcxCQk4MwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLWNoaXAtaWRlbnQuaCBiL2luY2x1ZGUvbWVkaWEvdjRsMi1jaGlwLWlkZW50LmgKaW5kZXggYjNlZGI2Ny4uNjNmZDlkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLWNoaXAtaWRlbnQuaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItY2hpcC1pZGVudC5oCkBAIC03Niw2ICs3Niw3IEBACiAJVjRMMl9JREVOVF9PVjY2NTAgPSAyNTgsCiAJVjRMMl9JREVOVF9PVjI2NDAgPSAyNTksCiAJVjRMMl9JREVOVF9PVjk3NDAgPSAyNjAsCisJVjRMMl9JREVOVF9PVjU2NDIgPSAyNjEsCiAKIAkvKiBtb2R1bGUgc2FhNzE0NjogcmVzZXJ2ZWQgcmFuZ2UgMzAwLTMwOSAqLwogCVY0TDJfSURFTlRfU0FBNzE0NiA9IDMwMCwKQEAgLTE4NSw4ICsxODYsOSBAQAogCS8qIG1vZHVsZSB3bTg3NzU6IGp1c3QgaWRlbnQgODc3NSAqLwogCVY0TDJfSURFTlRfV004Nzc1ID0gODc3NSwKIAotCS8qIG1vZHVsZSBjYWZlX2NjaWMsIGp1c3QgaWRlbnQgODgwMSAqLworCS8qIE1hcnZlbGwgY29udHJvbGxlcnMgc3RhcnRpbmcgYXQgODgwMSAqLwogCVY0TDJfSURFTlRfQ0FGRSA9IDg4MDEsCisJVjRMMl9JREVOVF9BUk1BREE2MTAgPSA4ODAyLAogCiAJLyogQUtNIEFLODgxMy9BSzg4MTQgKi8KIAlWNEwyX0lERU5UX0FLODgxMyA9IDg4MTMsCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItY3RybHMuaCBiL2luY2x1ZGUvbWVkaWEvdjRsMi1jdHJscy5oCmluZGV4IDk3ZDA2MzguLjEzZmU0ZDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1jdHJscy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1jdHJscy5oCkBAIC0yNyw5ICsyNywxMiBAQAogCiAvKiBmb3J3YXJkIHJlZmVyZW5jZXMgKi8KIHN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlcjsKK3N0cnVjdCB2NGwyX2N0cmxfaGVscGVyOwogc3RydWN0IHY0bDJfY3RybDsKIHN0cnVjdCB2aWRlb19kZXZpY2U7CiBzdHJ1Y3QgdjRsMl9zdWJkZXY7CitzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50Oworc3RydWN0IHY0bDJfZmg7CiAKIC8qKiBzdHJ1Y3QgdjRsMl9jdHJsX29wcyAtIFRoZSBjb250cm9sIG9wZXJhdGlvbnMgdGhhdCB0aGUgZHJpdmVyIGhhcyB0byBwcm92aWRlLgogICAqIEBnX3ZvbGF0aWxlX2N0cmw6IEdldCBhIG5ldyB2YWx1ZSBmb3IgdGhpcyBjb250cm9sLiBHZW5lcmFsbHkgb25seSByZWxldmFudApAQCAtNTEsNiArNTQsNyBAQAogCiAvKiogc3RydWN0IHY0bDJfY3RybCAtIFRoZSBjb250cm9sIHN0cnVjdHVyZS4KICAgKiBAbm9kZToJVGhlIGxpc3Qgbm9kZS4KKyAgKiBAZXZfc3ViczoJVGhlIGxpc3Qgb2YgY29udHJvbCBldmVudCBzdWJzY3JpcHRpb25zLgogICAqIEBoYW5kbGVyOglUaGUgaGFuZGxlciB0aGF0IG93bnMgdGhlIGNvbnRyb2wuCiAgICogQGNsdXN0ZXI6CVBvaW50IHRvIHN0YXJ0IG9mIGNsdXN0ZXIgYXJyYXkuCiAgICogQG5jb250cm9sczoJTnVtYmVyIG9mIGNvbnRyb2xzIGluIGNsdXN0ZXIgYXJyYXkuCkBAIC02NSw2ICs2OSwxNSBAQAogICAqCQljb250cm9sJ3MgY3VycmVudCB2YWx1ZSBjYW5ub3QgYmUgY2FjaGVkIGFuZCBuZWVkcyB0byBiZQogICAqCQlyZXRyaWV2ZWQgdGhyb3VnaCB0aGUgZ192b2xhdGlsZV9jdHJsIG9wLiBEcml2ZXJzIGNhbiBzZXQKICAgKgkJdGhpcyBmbGFnLgorICAqIEBpc19hdXRvOiAgIElmIHNldCwgdGhlbiB0aGlzIGNvbnRyb2wgc2VsZWN0cyB3aGV0aGVyIHRoZSBvdGhlciBjbHVzdGVyCisgICoJCW1lbWJlcnMgYXJlIGluICdhdXRvbWF0aWMnIG1vZGUgb3IgJ21hbnVhbCcgbW9kZS4gVGhpcyBpcworICAqCQl1c2VkIGZvciBhdXRvZ2Fpbi9nYWluIHR5cGUgY2x1c3RlcnMuIERyaXZlcnMgc2hvdWxkIG5ldmVyCisgICoJCXNldCB0aGlzIGZsYWcgZGlyZWN0bHkuCisgICogQG1hbnVhbF9tb2RlX3ZhbHVlOiBJZiB0aGUgaXNfYXV0byBmbGFnIGlzIHNldCwgdGhlbiB0aGlzIGlzIHRoZSB2YWx1ZQorICAqCQlvZiB0aGUgYXV0byBjb250cm9sIHRoYXQgZGV0ZXJtaW5lcyBpZiB0aGF0IGNvbnRyb2wgaXMgaW4KKyAgKgkJbWFudWFsIG1vZGUuIFNvIGlmIHRoZSB2YWx1ZSBvZiB0aGUgYXV0byBjb250cm9sIGVxdWFscyB0aGlzCisgICoJCXZhbHVlLCB0aGVuIHRoZSB3aG9sZSBjbHVzdGVyIGlzIGluIG1hbnVhbCBtb2RlLiBEcml2ZXJzIHNob3VsZAorICAqCQluZXZlciBzZXQgdGhpcyBmbGFnIGRpcmVjdGx5LgogICAqIEBvcHM6CVRoZSBjb250cm9sIG9wcy4KICAgKiBAaWQ6CVRoZSBjb250cm9sIElELgogICAqIEBuYW1lOglUaGUgY29udHJvbCBuYW1lLgpAQCAtOTcsNiArMTEwLDcgQEAKIHN0cnVjdCB2NGwyX2N0cmwgewogCS8qIEFkbWluaXN0cmF0aXZlIGZpZWxkcyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGV2X3N1YnM7CiAJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpoYW5kbGVyOwogCXN0cnVjdCB2NGwyX2N0cmwgKipjbHVzdGVyOwogCXVuc2lnbmVkIG5jb250cm9sczsKQEAgLTEwNSw2ICsxMTksOCBAQAogCXVuc2lnbmVkIGludCBpc19uZXc6MTsKIAl1bnNpZ25lZCBpbnQgaXNfcHJpdmF0ZToxOwogCXVuc2lnbmVkIGludCBpc192b2xhdGlsZToxOworCXVuc2lnbmVkIGludCBpc19hdXRvOjE7CisJdW5zaWduZWQgaW50IG1hbnVhbF9tb2RlX3ZhbHVlOjg7CiAKIAljb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyAqb3BzOwogCXUzMiBpZDsKQEAgLTEzNCw2ICsxNTAsNyBAQAogICAqIEBub2RlOglMaXN0IG5vZGUgZm9yIHRoZSBzb3J0ZWQgbGlzdC4KICAgKiBAbmV4dDoJU2luZ2xlLWxpbmsgbGlzdCBub2RlIGZvciB0aGUgaGFzaC4KICAgKiBAY3RybDoJVGhlIGFjdHVhbCBjb250cm9sIGluZm9ybWF0aW9uLgorICAqIEBoZWxwZXI6CVBvaW50ZXIgdG8gaGVscGVyIHN0cnVjdC4gVXNlZCBpbnRlcm5hbGx5IGluIHByZXBhcmVfZXh0X2N0cmxzKCkuCiAgICoKICAgKiBFYWNoIGNvbnRyb2wgaGFuZGxlciBoYXMgYSBsaXN0IG9mIHRoZXNlIHJlZnMuIFRoZSBsaXN0X2hlYWQgaXMgdXNlZCB0bwogICAqIGtlZXAgYSBzb3J0ZWQtYnktY29udHJvbC1JRCBsaXN0IG9mIGFsbCBjb250cm9scywgd2hpbGUgdGhlIG5leHQgcG9pbnRlcgpAQCAtMTQzLDYgKzE2MCw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBub2RlOwogCXN0cnVjdCB2NGwyX2N0cmxfcmVmICpuZXh0OwogCXN0cnVjdCB2NGwyX2N0cmwgKmN0cmw7CisJc3RydWN0IHY0bDJfY3RybF9oZWxwZXIgKmhlbHBlcjsKIH07CiAKIC8qKiBzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgLSBUaGUgY29udHJvbCBoYW5kbGVyIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUKQEAgLTM2Myw2ICszODEsNDAgQEAKIHZvaWQgdjRsMl9jdHJsX2NsdXN0ZXIodW5zaWduZWQgbmNvbnRyb2xzLCBzdHJ1Y3QgdjRsMl9jdHJsICoqY29udHJvbHMpOwogCiAKKy8qKiB2NGwyX2N0cmxfYXV0b19jbHVzdGVyKCkgLSBNYXJrIGFsbCBjb250cm9scyBpbiB0aGUgY2x1c3RlciBhcyBiZWxvbmdpbmcgdG8KKyAgKiB0aGF0IGNsdXN0ZXIgYW5kIHNldCBpdCB1cCBmb3IgYXV0b2Zvby9mb28tdHlwZSBoYW5kbGluZy4KKyAgKiBAbmNvbnRyb2xzOglUaGUgbnVtYmVyIG9mIGNvbnRyb2xzIGluIHRoaXMgY2x1c3Rlci4KKyAgKiBAY29udHJvbHM6CVRoZSBjbHVzdGVyIGNvbnRyb2wgYXJyYXkgb2Ygc2l6ZSBAbmNvbnRyb2xzLiBUaGUgZmlyc3QgY29udHJvbAorICAqCQltdXN0IGJlIHRoZSAnYXV0bycgY29udHJvbCAoZS5nLiBhdXRvZ2FpbiwgYXV0b2V4cG9zdXJlLCBldGMuKQorICAqIEBtYW51YWxfdmFsOiBUaGUgdmFsdWUgZm9yIHRoZSBmaXJzdCBjb250cm9sIGluIHRoZSBjbHVzdGVyIHRoYXQgZXF1YWxzIHRoZQorICAqCQltYW51YWwgc2V0dGluZy4KKyAgKiBAc2V0X3ZvbGF0aWxlOiBJZiB0cnVlLCB0aGVuIGFsbCBjb250cm9scyBleGNlcHQgdGhlIGZpcnN0IGF1dG8gY29udHJvbCB3aWxsCisgICoJCWhhdmUgaXNfdm9sYXRpbGUgc2V0IHRvIHRydWUuIElmIGZhbHNlLCB0aGVuIGlzX3ZvbGF0aWxlIHdpbGwgbm90CisgICoJCWJlIHRvdWNoZWQuCisgICoKKyAgKiBVc2UgZm9yIGNvbnRyb2wgZ3JvdXBzIHdoZXJlIG9uZSBjb250cm9sIHNlbGVjdHMgc29tZSBhdXRvbWF0aWMgZmVhdHVyZSBhbmQKKyAgKiB0aGUgb3RoZXIgY29udHJvbHMgYXJlIG9ubHkgYWN0aXZlIHdoZW5ldmVyIHRoZSBhdXRvbWF0aWMgZmVhdHVyZSBpcyB0dXJuZWQKKyAgKiBvZmYgKG1hbnVhbCBtb2RlKS4gVHlwaWNhbCBleGFtcGxlczogYXV0b2dhaW4gdnMgZ2FpbiwgYXV0by13aGl0ZWJhbGFuY2UgdnMKKyAgKiByZWQgYW5kIGJsdWUgYmFsYW5jZSwgZXRjLgorICAqCisgICogVGhlIGJlaGF2aW9yIG9mIHN1Y2ggY29udHJvbHMgaXMgYXMgZm9sbG93czoKKyAgKgorICAqIFdoZW4gdGhlIGF1dG9mb28gY29udHJvbCBpcyBzZXQgdG8gYXV0b21hdGljLCB0aGVuIGFueSBtYW51YWwgY29udHJvbHMKKyAgKiBhcmUgc2V0IHRvIGluYWN0aXZlIGFuZCBhbnkgcmVhZHMgd2lsbCBjYWxsIGdfdm9sYXRpbGVfY3RybCAoaWYgdGhlIGNvbnRyb2wKKyAgKiB3YXMgbWFya2VkIHZvbGF0aWxlKS4KKyAgKgorICAqIFdoZW4gdGhlIGF1dG9mb28gY29udHJvbCBpcyBzZXQgdG8gbWFudWFsLCB0aGVuIGFueSBtYW51YWwgY29udHJvbHMgd2lsbAorICAqIGJlIG1hcmtlZCBhY3RpdmUsIGFuZCBhbnkgcmVhZHMgd2lsbCBqdXN0IHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSB3aXRob3V0CisgICogZ29pbmcgdGhyb3VnaCBnX3ZvbGF0aWxlX2N0cmwuCisgICoKKyAgKiBJbiBhZGRpdGlvbiwgdGhpcyBmdW5jdGlvbiB3aWxsIHNldCB0aGUgVjRMMl9DVFJMX0ZMQUdfVVBEQVRFIGZsYWcKKyAgKiBvbiB0aGUgYXV0b2ZvbyBjb250cm9sIGFuZCBWNEwyX0NUUkxfRkxBR19JTkFDVElWRSBvbiB0aGUgZm9vIGNvbnRyb2wocykKKyAgKiBpZiBhdXRvZm9vIGlzIGluIGF1dG8gbW9kZS4KKyAgKi8KK3ZvaWQgdjRsMl9jdHJsX2F1dG9fY2x1c3Rlcih1bnNpZ25lZCBuY29udHJvbHMsIHN0cnVjdCB2NGwyX2N0cmwgKipjb250cm9scywKKwkJCXU4IG1hbnVhbF92YWwsIGJvb2wgc2V0X3ZvbGF0aWxlKTsKKworCiAvKiogdjRsMl9jdHJsX2ZpbmQoKSAtIEZpbmQgYSBjb250cm9sIHdpdGggdGhlIGdpdmVuIElELgogICAqIEBoZGw6CVRoZSBjb250cm9sIGhhbmRsZXIuCiAgICogQGlkOglUaGUgY29udHJvbCBJRCB0byBmaW5kLgpAQCAtMzc5LDkgKzQzMSw5IEBACiAgICogVGhpcyBzZXRzIG9yIGNsZWFycyB0aGUgVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkUgZmxhZyBhdG9taWNhbGx5LgogICAqIERvZXMgbm90aGluZyBpZiBAY3RybCA9PSBOVUxMLgogICAqIFRoaXMgd2lsbCB1c3VhbGx5IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB0aGUgc19jdHJsIG9wLgorICAqIFRoZSBWNEwyX0VWRU5UX0NUUkwgZXZlbnQgd2lsbCBiZSBnZW5lcmF0ZWQgYWZ0ZXJ3YXJkcy4KICAgKgotICAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGNvbnRyb2wgaGFuZGxlcgotICAqIGlzIGxvY2tlZCBvciBub3QuCisgICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgdGhlIGNvbnRyb2wgaGFuZGxlciBpcyBsb2NrZWQuCiAgICovCiB2b2lkIHY0bDJfY3RybF9hY3RpdmF0ZShzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsLCBib29sIGFjdGl2ZSk7CiAKQEAgLTM5MSwxMSArNDQzLDEyIEBACiAgICoKICAgKiBUaGlzIHNldHMgb3IgY2xlYXJzIHRoZSBWNEwyX0NUUkxfRkxBR19HUkFCQkVEIGZsYWcgYXRvbWljYWxseS4KICAgKiBEb2VzIG5vdGhpbmcgaWYgQGN0cmwgPT0gTlVMTC4KKyAgKiBUaGUgVjRMMl9FVkVOVF9DVFJMIGV2ZW50IHdpbGwgYmUgZ2VuZXJhdGVkIGFmdGVyd2FyZHMuCiAgICogVGhpcyB3aWxsIHVzdWFsbHkgYmUgY2FsbGVkIHdoZW4gc3RhcnRpbmcgb3Igc3RvcHBpbmcgc3RyZWFtaW5nIGluIHRoZQogICAqIGRyaXZlci4KICAgKgotICAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGNvbnRyb2wgaGFuZGxlcgotICAqIGlzIGxvY2tlZCBvciBub3QuCisgICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgdGhlIGNvbnRyb2wgaGFuZGxlciBpcyBub3QgbG9ja2VkIGFuZCB3aWxsCisgICogdGFrZSB0aGUgbG9jayBpdHNlbGYuCiAgICovCiB2b2lkIHY0bDJfY3RybF9ncmFiKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsIGJvb2wgZ3JhYmJlZCk7CiAKQEAgLTQ0MCwxNSArNDkzLDIyIEBACiAgICovCiBpbnQgdjRsMl9jdHJsX3NfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsLCBzMzIgdmFsKTsKIAorLyogSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9ucyB0aGF0IGRlYWwgd2l0aCBjb250cm9sIGV2ZW50cy4gKi8KK3ZvaWQgdjRsMl9jdHJsX2FkZF9ldmVudChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsLAorCQlzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50ICpzZXYpOwordm9pZCB2NGwyX2N0cmxfZGVsX2V2ZW50KHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsCisJCXN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQgKnNldik7CiAKIC8qIEhlbHBlcnMgZm9yIGlvY3RsX29wcy4gSWYgaGRsID09IE5VTEwgdGhlbiB0aGV5IHdpbGwgYWxsIHJldHVybiAtRUlOVkFMLiAqLwogaW50IHY0bDJfcXVlcnljdHJsKHN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGRsLCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjKTsKIGludCB2NGwyX3F1ZXJ5bWVudShzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCwgc3RydWN0IHY0bDJfcXVlcnltZW51ICpxbSk7CiBpbnQgdjRsMl9nX2N0cmwoc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpoZGwsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpOwotaW50IHY0bDJfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGRsLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKTsKK2ludCB2NGwyX3NfY3RybChzdHJ1Y3QgdjRsMl9maCAqZmgsIHN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGRsLAorCQkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCk7CiBpbnQgdjRsMl9nX2V4dF9jdHJscyhzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCwgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjKTsKIGludCB2NGwyX3RyeV9leHRfY3RybHMoc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpoZGwsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqYyk7Ci1pbnQgdjRsMl9zX2V4dF9jdHJscyhzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCwgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjKTsKK2ludCB2NGwyX3NfZXh0X2N0cmxzKHN0cnVjdCB2NGwyX2ZoICpmaCwgc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpoZGwsCisJCQkJCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKmMpOwogCiAvKiBIZWxwZXJzIGZvciBzdWJkZXZpY2VzLiBJZiB0aGUgYXNzb2NpYXRlZCBjdHJsX2hhbmRsZXIgPT0gTlVMTCB0aGVuIHRoZXkKICAgIHdpbGwgYWxsIHJldHVybiAtRUlOVkFMLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLWV2ZW50LmggYi9pbmNsdWRlL21lZGlhL3Y0bDItZXZlbnQuaAppbmRleCAzYjg2MTc3Li41ZjE0ZTg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3Y0bDItZXZlbnQuaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItZXZlbnQuaApAQCAtMjksMzkgKzI5LDk1IEBACiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogCisvKgorICogT3ZlcnZpZXc6CisgKgorICogRXZlbnRzIGFyZSBzdWJzY3JpYmVkIHBlci1maWxlaGFuZGxlLiBBbiBldmVudCBzcGVjaWZpY2F0aW9uIGNvbnNpc3RzIG9mIGEKKyAqIHR5cGUgYW5kIGlzIG9wdGlvbmFsbHkgYXNzb2NpYXRlZCB3aXRoIGFuIG9iamVjdCBpZGVudGlmaWVkIHRocm91Z2ggdGhlCisgKiAnaWQnIGZpZWxkLiBTbyBhbiBldmVudCBpcyB1bmlxdWVseSBpZGVudGlmaWVkIGJ5IHRoZSAodHlwZSwgaWQpIHR1cGxlLgorICoKKyAqIFRoZSB2NGwyLWZoIHN0cnVjdCBoYXMgYSBsaXN0IG9mIHN1YnNjcmliZWQgZXZlbnRzLiBUaGUgdjRsMl9zdWJzY3JpYmVkX2V2ZW50CisgKiBzdHJ1Y3QgaXMgYWRkZWQgdG8gdGhhdCBsaXN0LCBvbmUgZm9yIGV2ZXJ5IHN1YnNjcmliZWQgZXZlbnQuCisgKgorICogRWFjaCB2NGwyX3N1YnNjcmliZWRfZXZlbnQgc3RydWN0IGVuZHMgd2l0aCBhbiBhcnJheSBvZiB2NGwyX2tldmVudCBzdHJ1Y3RzLgorICogVGhpcyBhcnJheSAocmluZ2J1ZmZlciwgcmVhbGx5KSBpcyB1c2VkIHRvIHN0b3JlIGFueSBldmVudHMgcmFpc2VkIGJ5IHRoZQorICogZHJpdmVyLiBUaGUgdjRsMl9rZXZlbnQgc3RydWN0IGxpbmtzIGludG8gdGhlICdhdmFpbGFibGUnIGxpc3Qgb2YgdGhlCisgKiB2NGwyX2ZoIHN0cnVjdCBzbyBWSURJT0NfRFFFVkVOVCB3aWxsIGtub3cgd2hpY2ggZXZlbnQgdG8gZGVxdWV1ZSBmaXJzdC4KKyAqCisgKiBGaW5hbGx5LCBpZiB0aGUgZXZlbnQgc3Vic2NyaXB0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgb2JqZWN0CisgKiBzdWNoIGFzIGEgVjRMMiBjb250cm9sLCB0aGVuIHRoYXQgb2JqZWN0IG5lZWRzIHRvIGtub3cgYWJvdXQgdGhhdCBhcyB3ZWxsCisgKiBzbyB0aGF0IGFuIGV2ZW50IGNhbiBiZSByYWlzZWQgYnkgdGhhdCBvYmplY3QuIFNvIHRoZSAnbm9kZScgZmllbGQgY2FuCisgKiBiZSB1c2VkIHRvIGxpbmsgdGhlIHY0bDJfc3Vic2NyaWJlZF9ldmVudCBzdHJ1Y3QgaW50byBhIGxpc3Qgb2YgdGhhdAorICogb2JqZWN0LgorICoKKyAqIFNvIHRvIHN1bW1hcml6ZToKKyAqCisgKiBzdHJ1Y3QgdjRsMl9maCBoYXMgdHdvIGxpc3RzOiBvbmUgb2YgdGhlIHN1YnNjcmliZWQgZXZlbnRzLCBhbmQgb25lIG9mIHRoZQorICogcGVuZGluZyBldmVudHMuCisgKgorICogc3RydWN0IHY0bDJfc3Vic2NyaWJlZF9ldmVudCBoYXMgYSByaW5nYnVmZmVyIG9mIHJhaXNlZCAocGVuZGluZykgZXZlbnRzIG9mCisgKiB0aGF0IHBhcnRpY3VsYXIgdHlwZS4KKyAqCisgKiBJZiBzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIG9iamVjdCwgdGhlbgorICogdGhhdCBvYmplY3Qgd2lsbCBoYXZlIGFuIGludGVybmFsIGxpc3Qgb2Ygc3RydWN0IHY0bDJfc3Vic2NyaWJlZF9ldmVudCBzbworICogaXQga25vd3Mgd2hvIHN1YnNjcmliZWQgYW4gZXZlbnQgdG8gdGhhdCBvYmplY3QuCisgKi8KKwogc3RydWN0IHY0bDJfZmg7CitzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50Owogc3RydWN0IHZpZGVvX2RldmljZTsKIAorLyoqIHN0cnVjdCB2NGwyX2tldmVudCAtIEludGVybmFsIGtlcm5lbCBldmVudCBzdHJ1Y3QuCisgICogQGxpc3Q6CUxpc3Qgbm9kZSBmb3IgdGhlIHY0bDJfZmgtPmF2YWlsYWJsZSBsaXN0LgorICAqIEBzZXY6CVBvaW50ZXIgdG8gcGFyZW50IHY0bDJfc3Vic2NyaWJlZF9ldmVudC4KKyAgKiBAZXZlbnQ6CVRoZSBldmVudCBpdHNlbGYuCisgICovCiBzdHJ1Y3QgdjRsMl9rZXZlbnQgewogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwlzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50ICpzZXY7CiAJc3RydWN0IHY0bDJfZXZlbnQJZXZlbnQ7CiB9OwogCisvKiogc3RydWN0IHY0bDJfc3Vic2NyaWJlZF9ldmVudCAtIEludGVybmFsIHN0cnVjdCByZXByZXNlbnRpbmcgYSBzdWJzY3JpYmVkIGV2ZW50LgorICAqIEBsaXN0OglMaXN0IG5vZGUgZm9yIHRoZSB2NGwyX2ZoLT5zdWJzY3JpYmVkIGxpc3QuCisgICogQHR5cGU6CUV2ZW50IHR5cGUuCisgICogQGlkOglBc3NvY2lhdGVkIG9iamVjdCBJRCAoZS5nLiBjb250cm9sIElEKS4gMCBpZiB0aGVyZSBpc24ndCBhbnkuCisgICogQGZsYWdzOglDb3B5IG9mIHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uLT5mbGFncy4KKyAgKiBAZmg6CUZpbGVoYW5kbGUgdGhhdCBzdWJzY3JpYmVkIHRvIHRoaXMgZXZlbnQuCisgICogQG5vZGU6CUxpc3Qgbm9kZSB0aGF0IGhvb2tzIGludG8gdGhlIG9iamVjdCdzIGV2ZW50IGxpc3QgKGlmIHRoZXJlIGlzIG9uZSkuCisgICogQHJlcGxhY2U6CU9wdGlvbmFsIGNhbGxiYWNrIHRoYXQgY2FuIHJlcGxhY2UgZXZlbnQgJ29sZCcgd2l0aCBldmVudCAnbmV3Jy4KKyAgKiBAbWVyZ2U6CU9wdGlvbmFsIGNhbGxiYWNrIHRoYXQgY2FuIG1lcmdlIGV2ZW50ICdvbGQnIGludG8gZXZlbnQgJ25ldycuCisgICogQGVsZW1zOglUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBldmVudHMgYXJyYXkuCisgICogQGZpcnN0OglUaGUgaW5kZXggb2YgdGhlIGV2ZW50cyBjb250YWluaW5nIHRoZSBvbGRlc3QgYXZhaWxhYmxlIGV2ZW50LgorICAqIEBpbl91c2U6CVRoZSBudW1iZXIgb2YgcXVldWVkIGV2ZW50cy4KKyAgKiBAZXZlbnRzOglBbiBhcnJheSBvZiBAZWxlbXMgZXZlbnRzLgorICAqLwogc3RydWN0IHY0bDJfc3Vic2NyaWJlZF9ldmVudCB7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwogCXUzMgkJCXR5cGU7CisJdTMyCQkJaWQ7CisJdTMyCQkJZmxhZ3M7CisJc3RydWN0IHY0bDJfZmgJCSpmaDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CisJdm9pZAkJCSgqcmVwbGFjZSkoc3RydWN0IHY0bDJfZXZlbnQgKm9sZCwKKwkJCQkJICAgY29uc3Qgc3RydWN0IHY0bDJfZXZlbnQgKm5ldyk7CisJdm9pZAkJCSgqbWVyZ2UpKGNvbnN0IHN0cnVjdCB2NGwyX2V2ZW50ICpvbGQsCisJCQkJCSBzdHJ1Y3QgdjRsMl9ldmVudCAqbmV3KTsKKwl1bnNpZ25lZAkJZWxlbXM7CisJdW5zaWduZWQJCWZpcnN0OworCXVuc2lnbmVkCQlpbl91c2U7CisJc3RydWN0IHY0bDJfa2V2ZW50CWV2ZW50c1tdOwogfTsKIAotc3RydWN0IHY0bDJfZXZlbnRzIHsKLQl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0OwotCXN0cnVjdCBsaXN0X2hlYWQJc3Vic2NyaWJlZDsgLyogU3Vic2NyaWJlZCBldmVudHMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWZyZWU7IC8qIEV2ZW50cyByZWFkeSBmb3IgdXNlICovCi0Jc3RydWN0IGxpc3RfaGVhZAlhdmFpbGFibGU7IC8qIERlcXVldWVhYmxlIGV2ZW50ICovCi0JdW5zaWduZWQgaW50CQluYXZhaWxhYmxlOwotCXVuc2lnbmVkIGludAkJbmFsbG9jYXRlZDsgLyogTnVtYmVyIG9mIGFsbG9jYXRlZCBldmVudHMgKi8KLQl1MzIJCQlzZXF1ZW5jZTsKLX07Ci0KLWludCB2NGwyX2V2ZW50X2luaXQoc3RydWN0IHY0bDJfZmggKmZoKTsKLWludCB2NGwyX2V2ZW50X2FsbG9jKHN0cnVjdCB2NGwyX2ZoICpmaCwgdW5zaWduZWQgaW50IG4pOwotdm9pZCB2NGwyX2V2ZW50X2ZyZWUoc3RydWN0IHY0bDJfZmggKmZoKTsKIGludCB2NGwyX2V2ZW50X2RlcXVldWUoc3RydWN0IHY0bDJfZmggKmZoLCBzdHJ1Y3QgdjRsMl9ldmVudCAqZXZlbnQsCiAJCSAgICAgICBpbnQgbm9uYmxvY2tpbmcpOwogdm9pZCB2NGwyX2V2ZW50X3F1ZXVlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYsIGNvbnN0IHN0cnVjdCB2NGwyX2V2ZW50ICpldik7Cit2b2lkIHY0bDJfZXZlbnRfcXVldWVfZmgoc3RydWN0IHY0bDJfZmggKmZoLCBjb25zdCBzdHJ1Y3QgdjRsMl9ldmVudCAqZXYpOwogaW50IHY0bDJfZXZlbnRfcGVuZGluZyhzdHJ1Y3QgdjRsMl9maCAqZmgpOwogaW50IHY0bDJfZXZlbnRfc3Vic2NyaWJlKHN0cnVjdCB2NGwyX2ZoICpmaCwKLQkJCSBzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24gKnN1Yik7CisJCQkgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uICpzdWIsIHVuc2lnbmVkIGVsZW1zKTsKIGludCB2NGwyX2V2ZW50X3Vuc3Vic2NyaWJlKHN0cnVjdCB2NGwyX2ZoICpmaCwKIAkJCSAgIHN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbiAqc3ViKTsKK3ZvaWQgdjRsMl9ldmVudF91bnN1YnNjcmliZV9hbGwoc3RydWN0IHY0bDJfZmggKmZoKTsKIAogI2VuZGlmIC8qIFY0TDJfRVZFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLWZoLmggYi9pbmNsdWRlL21lZGlhL3Y0bDItZmguaAppbmRleCAwMjA2YWE1Li41MjUxM2MyIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3Y0bDItZmguaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItZmguaApAQCAtMjksMTMgKzI5LDIwIEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCiBzdHJ1Y3QgdmlkZW9fZGV2aWNlOwotc3RydWN0IHY0bDJfZXZlbnRzOworc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyOwogCiBzdHJ1Y3QgdjRsMl9maCB7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwogCXN0cnVjdCB2aWRlb19kZXZpY2UJKnZkZXY7Ci0Jc3RydWN0IHY0bDJfZXZlbnRzICAgICAgKmV2ZW50czsgLyogZXZlbnRzLCBwZW5kaW5nIGFuZCBzdWJzY3JpYmVkICovCisJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpjdHJsX2hhbmRsZXI7CiAJZW51bSB2NGwyX3ByaW9yaXR5CXByaW87CisKKwkvKiBFdmVudHMgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0OworCXN0cnVjdCBsaXN0X2hlYWQJc3Vic2NyaWJlZDsgLyogU3Vic2NyaWJlZCBldmVudHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWF2YWlsYWJsZTsgLyogRGVxdWV1ZWFibGUgZXZlbnQgKi8KKwl1bnNpZ25lZCBpbnQJCW5hdmFpbGFibGU7CisJdTMyCQkJc2VxdWVuY2U7CiB9OwogCiAvKgpAQCAtNDQsNyArNTEsNyBAQAogICogZnJvbSBkcml2ZXIncyB2NGwyX2ZpbGVfb3BlcmF0aW9ucy0+b3BlbigpIGhhbmRsZXIgaWYgdGhlIGRyaXZlcgogICogdXNlcyB2NGwyX2ZoLgogICovCi1pbnQgdjRsMl9maF9pbml0KHN0cnVjdCB2NGwyX2ZoICpmaCwgc3RydWN0IHZpZGVvX2RldmljZSAqdmRldik7Cit2b2lkIHY0bDJfZmhfaW5pdChzdHJ1Y3QgdjRsMl9maCAqZmgsIHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpOwogLyoKICAqIEFkZCB0aGUgZmggdG8gdGhlIGxpc3Qgb2YgZmlsZSBoYW5kbGVzIG9uIGEgdmlkZW9fZGV2aWNlLiBUaGUgZmlsZQogICogaGFuZGxlIG11c3QgYmUgaW5pdGlhbGlzZWQgZmlyc3QuCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItbWVkaWFidXMuaCBiL2luY2x1ZGUvbWVkaWEvdjRsMi1tZWRpYWJ1cy5oCmluZGV4IDk3MWM3ZmEuLjYxMTQwMDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1tZWRpYWJ1cy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1tZWRpYWJ1cy5oCkBAIC0xMyw2ICsxMyw2OSBAQAogCiAjaW5jbHVkZSA8bGludXgvdjRsMi1tZWRpYWJ1cy5oPgogCisvKiBQYXJhbGxlbCBmbGFncyAqLworLyoKKyAqIENhbiB0aGUgY2xpZW50IHJ1biBpbiBtYXN0ZXIgb3IgaW4gc2xhdmUgbW9kZS4gQnkgIk1hc3RlciBtb2RlIiBhbiBvcGVyYXRpb24KKyAqIG1vZGUgaXMgbWVhbnQsIHdoZW4gdGhlIGNsaWVudCAoZS5nLiwgYSBjYW1lcmEgc2Vuc29yKSBpcyBwcm9kdWNpbmcKKyAqIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIHN5bmNocm9uaXNhdGlvbi4gSW4gIlNsYXZlIG1vZGUiIHRoZSBob3N0IGlzCisgKiBwcm92aWRpbmcgdGhlc2Ugc2lnbmFscyB0byB0aGUgc2xhdmUuCisgKi8KKyNkZWZpbmUgVjRMMl9NQlVTX01BU1RFUgkJCSgxIDw8IDApCisjZGVmaW5lIFY0TDJfTUJVU19TTEFWRQkJCQkoMSA8PCAxKQorLyogV2hpY2ggc2lnbmFsIHBvbGFyaXRpZXMgaXQgc3VwcG9ydHMgKi8KKy8qIE5vdGU6IGluIEJULjY1NiBtb2RlIEhTWU5DIGFuZCBWU1lOQyBhcmUgdW51c2VkICovCisjZGVmaW5lIFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfSElHSAkJKDEgPDwgMikKKyNkZWZpbmUgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9MT1cJCSgxIDw8IDMpCisjZGVmaW5lIFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfSElHSAkJKDEgPDwgNCkKKyNkZWZpbmUgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9MT1cJCSgxIDw8IDUpCisjZGVmaW5lIFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9SSVNJTkcJCSgxIDw8IDYpCisjZGVmaW5lIFY0TDJfTUJVU19QQ0xLX1NBTVBMRV9GQUxMSU5HCQkoMSA8PCA3KQorI2RlZmluZSBWNEwyX01CVVNfREFUQV9BQ1RJVkVfSElHSAkJKDEgPDwgOCkKKyNkZWZpbmUgVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0xPVwkJKDEgPDwgOSkKKworLyogU2VyaWFsIGZsYWdzICovCisvKiBIb3cgbWFueSBsYW5lcyB0aGUgY2xpZW50IGNhbiB1c2UgKi8KKyNkZWZpbmUgVjRMMl9NQlVTX0NTSTJfMV9MQU5FCQkJKDEgPDwgMCkKKyNkZWZpbmUgVjRMMl9NQlVTX0NTSTJfMl9MQU5FCQkJKDEgPDwgMSkKKyNkZWZpbmUgVjRMMl9NQlVTX0NTSTJfM19MQU5FCQkJKDEgPDwgMikKKyNkZWZpbmUgVjRMMl9NQlVTX0NTSTJfNF9MQU5FCQkJKDEgPDwgMykKKy8qIE9uIHdoaWNoIGNoYW5uZWxzIGl0IGNhbiBzZW5kIHZpZGVvIGRhdGEgKi8KKyNkZWZpbmUgVjRMMl9NQlVTX0NTSTJfQ0hBTk5FTF8wCQkoMSA8PCA0KQorI2RlZmluZSBWNEwyX01CVVNfQ1NJMl9DSEFOTkVMXzEJCSgxIDw8IDUpCisjZGVmaW5lIFY0TDJfTUJVU19DU0kyX0NIQU5ORUxfMgkJKDEgPDwgNikKKyNkZWZpbmUgVjRMMl9NQlVTX0NTSTJfQ0hBTk5FTF8zCQkoMSA8PCA3KQorLyogRG9lcyBpdCBzdXBwb3J0IG9ubHkgY29udGludW91cyBvciBhbHNvIG5vbi1jb250aW51b3VzIGNsb2NrIG1vZGUgKi8KKyNkZWZpbmUgVjRMMl9NQlVTX0NTSTJfQ09OVElOVU9VU19DTE9DSwkJKDEgPDwgOCkKKyNkZWZpbmUgVjRMMl9NQlVTX0NTSTJfTk9OQ09OVElOVU9VU19DTE9DSwkoMSA8PCA5KQorCisjZGVmaW5lIFY0TDJfTUJVU19DU0kyX0xBTkVTCQkoVjRMMl9NQlVTX0NTSTJfMV9MQU5FIHwgVjRMMl9NQlVTX0NTSTJfMl9MQU5FIHwgXAorCQkJCQkgVjRMMl9NQlVTX0NTSTJfM19MQU5FIHwgVjRMMl9NQlVTX0NTSTJfNF9MQU5FKQorI2RlZmluZSBWNEwyX01CVVNfQ1NJMl9DSEFOTkVMUwkJKFY0TDJfTUJVU19DU0kyX0NIQU5ORUxfMCB8IFY0TDJfTUJVU19DU0kyX0NIQU5ORUxfMSB8IFwKKwkJCQkJIFY0TDJfTUJVU19DU0kyX0NIQU5ORUxfMiB8IFY0TDJfTUJVU19DU0kyX0NIQU5ORUxfMykKKworLyoqCisgKiB2NGwyX21idXNfdHlwZSAtIG1lZGlhIGJ1cyB0eXBlCisgKiBAVjRMMl9NQlVTX1BBUkFMTEVMOglwYXJhbGxlbCBpbnRlcmZhY2Ugd2l0aCBoc3luYyBhbmQgdnN5bmMKKyAqIEBWNEwyX01CVVNfQlQ2NTY6CXBhcmFsbGVsIGludGVyZmFjZSB3aXRoIGVtYmVkZGVkIHN5bmNocm9uaXNhdGlvbiwgY2FuCisgKgkJCWFsc28gYmUgdXNlZCBmb3IgQlQuMTEyMAorICogQFY0TDJfTUJVU19DU0kyOglNSVBJIENTSS0yIHNlcmlhbCBpbnRlcmZhY2UKKyAqLworZW51bSB2NGwyX21idXNfdHlwZSB7CisJVjRMMl9NQlVTX1BBUkFMTEVMLAorCVY0TDJfTUJVU19CVDY1NiwKKwlWNEwyX01CVVNfQ1NJMiwKK307CisKKy8qKgorICogdjRsMl9tYnVzX2NvbmZpZyAtIG1lZGlhIGJ1cyBjb25maWd1cmF0aW9uCisgKiBAdHlwZToJaW46IGludGVyZmFjZSB0eXBlCisgKiBAZmxhZ3M6CWluIC8gb3V0OiBjb25maWd1cmF0aW9uIGZsYWdzLCBkZXBlbmRpbmcgb24gQHR5cGUKKyAqLworc3RydWN0IHY0bDJfbWJ1c19jb25maWcgeworCWVudW0gdjRsMl9tYnVzX3R5cGUgdHlwZTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7Cit9OworCiBzdGF0aWMgaW5saW5lIHZvaWQgdjRsMl9maWxsX3BpeF9mb3JtYXQoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4X2ZtdCwKIAkJCQljb25zdCBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptYnVzX2ZtdCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1zdWJkZXYuaCBiL2luY2x1ZGUvbWVkaWEvdjRsMi1zdWJkZXYuaAppbmRleCAyODg0ZTNlLi4yNTdkYTFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3Y0bDItc3ViZGV2LmgKKysrIGIvaW5jbHVkZS9tZWRpYS92NGwyLXN1YmRldi5oCkBAIC0yMjksNiArMjI5LDEyIEBACiAgICBzX3N0ZF9vdXRwdXQ6IHNldCB2NGwyX3N0ZF9pZCBmb3IgdmlkZW8gT1VUUFVUIGRldmljZXMuIFRoaXMgaXMgaWdub3JlZCBieQogCXZpZGVvIGlucHV0IGRldmljZXMuCiAKKyAgIGdfc3RkX291dHB1dDogZ2V0IGN1cnJlbnQgc3RhbmRhcmQgZm9yIHZpZGVvIE9VVFBVVCBkZXZpY2VzLiBUaGlzIGlzIGlnbm9yZWQKKwlieSB2aWRlbyBpbnB1dCBkZXZpY2VzLgorCisgICBnX3R2bm9ybXNfb3V0cHV0OiBnZXQgdjRsMl9zdGRfaWQgd2l0aCBhbGwgc3RhbmRhcmRzIHN1cHBvcnRlZCBieSB2aWRlbworCU9VVFBVVCBkZXZpY2UuIFRoaXMgaXMgaWdub3JlZCBieSB2aWRlbyBpbnB1dCBkZXZpY2VzLgorCiAgICBzX2NyeXN0YWxfZnJlcTogc2V0cyB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjcnlzdGFsIHVzZWQgdG8gZ2VuZXJhdGUgdGhlCiAJY2xvY2tzIGluIEh6LiBBbiBleHRyYSBmbGFncyBmaWVsZCBhbGxvd3MgZGV2aWNlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24KIAlyZWdhcmRpbmcgY2xvY2sgZnJlcXVlbmN5IGRpdmlkZXJzLCBldGMuIElmIG5vdCB1c2VkLCB0aGVuIHNldCBmbGFncwpAQCAtMjQzLDYgKzI0OSw4IEBACiAgICBzX2R2X3ByZXNldDogc2V0IGR2IChEaWdpdGFsIFZpZGVvKSBwcmVzZXQgaW4gdGhlIHN1YiBkZXZpY2UuIFNpbWlsYXIgdG8KIAlzX3N0ZCgpCiAKKyAgIGdfZHZfcHJlc2V0OiBnZXQgY3VycmVudCBkdiAoRGlnaXRhbCBWaWRlbykgcHJlc2V0IGluIHRoZSBzdWIgZGV2aWNlLgorCiAgICBxdWVyeV9kdl9wcmVzZXQ6IHF1ZXJ5IGR2IHByZXNldCBpbiB0aGUgc3ViIGRldmljZS4gVGhpcyBpcyBzaW1pbGFyIHRvCiAJcXVlcnlzdGQoKQogCkBAIC0yNTksMTIgKzI2NywyMCBAQAogICAgdHJ5X21idXNfZm10OiB0cnkgdG8gc2V0IGEgcGl4ZWwgZm9ybWF0IG9uIGEgdmlkZW8gZGF0YSBzb3VyY2UKIAogICAgc19tYnVzX2ZtdDogc2V0IGEgcGl4ZWwgZm9ybWF0IG9uIGEgdmlkZW8gZGF0YSBzb3VyY2UKKworICAgZ19tYnVzX2NvbmZpZzogZ2V0IHN1cHBvcnRlZCBtZWRpYWJ1cyBjb25maWd1cmF0aW9ucworCisgICBzX21idXNfY29uZmlnOiBzZXQgYSBjZXJ0YWluIG1lZGlhYnVzIGNvbmZpZ3VyYXRpb24uIFRoaXMgb3BlcmF0aW9uIGlzIGFkZGVkCisJZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBzb2MtY2FtZXJhIGRyaXZlcnMgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBuZXcKKwlzb2Z0d2FyZS4KICAqLwogc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyB7CiAJaW50ICgqc19yb3V0aW5nKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgaW5wdXQsIHUzMiBvdXRwdXQsIHUzMiBjb25maWcpOwogCWludCAoKnNfY3J5c3RhbF9mcmVxKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgZnJlcSwgdTMyIGZsYWdzKTsKIAlpbnQgKCpzX3N0ZF9vdXRwdXQpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHY0bDJfc3RkX2lkIHN0ZCk7CisJaW50ICgqZ19zdGRfb3V0cHV0KShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2NGwyX3N0ZF9pZCAqc3RkKTsKIAlpbnQgKCpxdWVyeXN0ZCkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgKnN0ZCk7CisJaW50ICgqZ190dm5vcm1zX291dHB1dCkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgKnN0ZCk7CiAJaW50ICgqZ19pbnB1dF9zdGF0dXMpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiAqc3RhdHVzKTsKIAlpbnQgKCpzX3N0cmVhbSkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IGVuYWJsZSk7CiAJaW50ICgqY3JvcGNhcCkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3JvcGNhcCAqY2MpOwpAQCAtMjgyLDYgKzI5OCw4IEBACiAJCQlzdHJ1Y3QgdjRsMl9kdl9lbnVtX3ByZXNldCAqcHJlc2V0KTsKIAlpbnQgKCpzX2R2X3ByZXNldCkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKIAkJCXN0cnVjdCB2NGwyX2R2X3ByZXNldCAqcHJlc2V0KTsKKwlpbnQgKCpnX2R2X3ByZXNldCkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCXN0cnVjdCB2NGwyX2R2X3ByZXNldCAqcHJlc2V0KTsKIAlpbnQgKCpxdWVyeV9kdl9wcmVzZXQpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCiAJCQlzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQgKnByZXNldCk7CiAJaW50ICgqc19kdl90aW1pbmdzKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLApAQCAtMjk4LDYgKzMxNiwxMCBAQAogCQkJICAgIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZtdCk7CiAJaW50ICgqc19tYnVzX2ZtdCkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKIAkJCSAgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm10KTsKKwlpbnQgKCpnX21idXNfY29uZmlnKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJICAgICBzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnKTsKKwlpbnQgKCpzX21idXNfY29uZmlnKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyAqY2ZnKTsKIH07CiAKIC8qCkBAIC01MTMsOCArNTM1LDYgQEAKIAl2b2lkICpob3N0X3ByaXY7CiAJLyogc3ViZGV2IGRldmljZSBub2RlICovCiAJc3RydWN0IHZpZGVvX2RldmljZSBkZXZub2RlOwotCS8qIG51bWJlciBvZiBldmVudHMgdG8gYmUgYWxsb2NhdGVkIG9uIG9wZW4gKi8KLQl1bnNpZ25lZCBpbnQgbmV2ZW50czsKIH07CiAKICNkZWZpbmUgbWVkaWFfZW50aXR5X3RvX3Y0bDJfc3ViZGV2KGVudCkgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wY21jaWEvZGV2aWNlX2lkLmggYi9pbmNsdWRlL3BjbWNpYS9kZXZpY2VfaWQuaAppbmRleCA2M2U1YjhmLi4wMGRiZmFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3BjbWNpYS9kZXZpY2VfaWQuaAorKysgYi9pbmNsdWRlL3BjbWNpYS9kZXZpY2VfaWQuaApAQCAtOTUsNiArOTUsMTUgQEAKIAkucHJvZF9pZCA9IHsgKHYxKSwgTlVMTCwgTlVMTCwgTlVMTCB9LCBcCiAJLnByb2RfaWRfaGFzaCA9IHsgKHZoMSksIDAsIDAsIDAgfSwgfQogCisjZGVmaW5lIFBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEX1BST0RfSUQzKG1hbmYsIGNhcmQsIHYzLCB2aDMpIHsgXAorCS5tYXRjaF9mbGFncyA9IFBDTUNJQV9ERVZfSURfTUFUQ0hfTUFORl9JRHwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9DQVJEX0lEfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQzLCBcCisJLm1hbmZfaWQgPSAobWFuZiksIFwKKwkuY2FyZF9pZCA9IChjYXJkKSwgXAorCS5wcm9kX2lkID0geyBOVUxMLCBOVUxMLCAodjMpLCBOVUxMIH0sIFwKKwkucHJvZF9pZF9oYXNoID0geyAwLCAwLCAodmgzKSwgMCB9LCB9CisKIAogLyogbXVsdGktZnVuY3Rpb24gZGV2aWNlcyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvZmNfZnJhbWUuaCBiL2luY2x1ZGUvc2NzaS9mY19mcmFtZS5oCmluZGV4IDRhZDAyMDQuLjgyMjVkODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9mY19mcmFtZS5oCisrKyBiL2luY2x1ZGUvc2NzaS9mY19mcmFtZS5oCkBAIC03OCw3ICs3OCw2IEBACiB9OwogCiBzdHJ1Y3QgZmNvZV9yY3ZfaW5mbyB7Ci0Jc3RydWN0IHBhY2tldF90eXBlICAqcHR5cGU7CiAJc3RydWN0IGZjX2xwb3J0CSpmcl9kZXY7CS8qIHRyYW5zcG9ydCBsYXllciBwcml2YXRlIHBvaW50ZXIgKi8KIAlzdHJ1Y3QgZmNfc2VxCSpmcl9zZXE7CS8qIGZvciB1c2Ugd2l0aCBleGNoYW5nZSBtYW5hZ2VyICovCiAJc3RydWN0IGZjX2ZjcF9wa3QgKmZyX2ZzcDsJLyogZm9yIHRoZSBjb3JyZXNwb25kaW5nIGZjcCBJL08gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvdGVhNTc1eC10dW5lci5oIGIvaW5jbHVkZS9zb3VuZC90ZWE1NzV4LXR1bmVyLmgKaW5kZXggZDJlYTExMi4uNzI2ZTk0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC90ZWE1NzV4LXR1bmVyLmgKKysrIGIvaW5jbHVkZS9zb3VuZC90ZWE1NzV4LXR1bmVyLmgKQEAgLTIzLDggKzIzLDggQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogCiAjZGVmaW5lIFRFQTU3NVhfRk1JRgkxMDcwMAogCkBAIC00MiwxOCArNDIsMjAgQEAKIH07CiAKIHN0cnVjdCBzbmRfdGVhNTc1eCB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmQ7CS8qIHZpZGVvIGRldmljZSAqLworCXN0cnVjdCB2aWRlb19kZXZpY2UgdmQ7CQkvKiB2aWRlbyBkZXZpY2UgKi8KIAlib29sIHRlYTU3NTk7CQkJLyogNTc1OSBjaGlwIGlzIHByZXNlbnQgKi8KIAlib29sIG11dGU7CQkJLyogRGV2aWNlIGlzIG11dGVkPyAqLwogCWJvb2wgc3RlcmVvOwkJCS8qIHJlY2VpdmluZyBzdGVyZW8gKi8KIAlib29sIHR1bmVkOwkJCS8qIHR1bmVkIHRvIGEgc3RhdGlvbiAqLwogCXVuc2lnbmVkIGludCB2YWw7CQkvKiBodyB2YWx1ZSAqLwogCXVuc2lnbmVkIGxvbmcgZnJlcTsJCS8qIGZyZXF1ZW5jeSAqLwotCXVuc2lnbmVkIGxvbmcgaW5fdXNlOwkJLyogc2V0IGlmIHRoZSBkZXZpY2UgaXMgaW4gdXNlICovCisJc3RydWN0IG11dGV4IG11dGV4OwogCXN0cnVjdCBzbmRfdGVhNTc1eF9vcHMgKm9wczsKIAl2b2lkICpwcml2YXRlX2RhdGE7CiAJdTggY2FyZFszMl07CiAJdTggYnVzX2luZm9bMzJdOworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciBjdHJsX2hhbmRsZXI7CisJaW50ICgqZXh0X2luaXQpKHN0cnVjdCBzbmRfdGVhNTc1eCAqdGVhKTsKIH07CiAKIGludCBzbmRfdGVhNTc1eF9pbml0KHN0cnVjdCBzbmRfdGVhNTc1eCAqdGVhKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2V4dDQuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2V4dDQuaAppbmRleCA2MzYzMTkzLi5iNTBhNTQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9leHQ0LmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvZXh0NC5oCkBAIC0yMyw3ICsyMyw3IEBACiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19maWVsZCgJZGV2X3QsCWRldgkJCSkKIAkJX19maWVsZCgJaW5vX3QsCWlubwkJCSkKLQkJX19maWVsZCgJdW1vZGVfdCwgbW9kZQkJCSkKKwkJX19maWVsZCgJX191MTYsIG1vZGUJCQkpCiAJCV9fZmllbGQoCXVpZF90LAl1aWQJCQkpCiAJCV9fZmllbGQoCWdpZF90LAlnaWQJCQkpCiAJCV9fZmllbGQoCV9fdTY0LCBibG9ja3MJCQkpCkBAIC01Miw3ICs1Miw3IEBACiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19maWVsZCgJZGV2X3QsCWRldgkJCSkKIAkJX19maWVsZCgJaW5vX3QsCWRpcgkJCSkKLQkJX19maWVsZCgJdW1vZGVfdCwgbW9kZQkJCSkKKwkJX19maWVsZCgJX191MTYsIG1vZGUJCQkpCiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKApAQCAtNzUsNyArNzUsNyBAQAogCQlfX2ZpZWxkKAlkZXZfdCwJZGV2CQkJKQogCQlfX2ZpZWxkKAlpbm9fdCwJaW5vCQkJKQogCQlfX2ZpZWxkKAlpbm9fdCwJZGlyCQkJKQotCQlfX2ZpZWxkKAl1bW9kZV90LCBtb2RlCQkJKQorCQlfX2ZpZWxkKAlfX3UxNiwJbW9kZQkJCSkKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCkBAIC03MjUsNyArNzI1LDcgQEAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlfX2ZpZWxkKAlkZXZfdCwJZGV2CQkJKQogCQlfX2ZpZWxkKAlpbm9fdCwJaW5vCQkJKQotCQlfX2ZpZWxkKAl1bW9kZV90LCBtb2RlCQkJKQorCQlfX2ZpZWxkKAlfX3UxNiwJbW9kZQkJCSkKIAkJX19maWVsZCgJX191NjQsCWJsb2NrCQkJKQogCQlfX2ZpZWxkKAl1bnNpZ25lZCBsb25nLAljb3VudAkJKQogCQlfX2ZpZWxkKAlpbnQsCWZsYWdzCQkJKQpAQCAtMTAxMiw3ICsxMDEyLDcgQEAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlfX2ZpZWxkKAlkZXZfdCwJZGV2CQkJKQogCQlfX2ZpZWxkKAlpbm9fdCwJaW5vCQkJKQotCQlfX2ZpZWxkKAl1bW9kZV90LCBtb2RlCQkJKQorCQlfX2ZpZWxkKAlfX3UxNiwJbW9kZQkJCSkKIAkJX19maWVsZCgJaW50LAlpc19tZXRhZGF0YQkJKQogCQlfX2ZpZWxkKAlfX3U2NCwJYmxvY2sJCQkpCiAJKSwKQEAgLTEwMzksNyArMTAzOSw3IEBACiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19maWVsZCgJZGV2X3QsCWRldgkJCSkKIAkJX19maWVsZCgJaW5vX3QsCWlubwkJCSkKLQkJX19maWVsZCgJdW1vZGVfdCwgbW9kZQkJCSkKKwkJX19maWVsZCgJX191MTYsCW1vZGUJCQkpCiAJCV9fZmllbGQoCV9fdTY0LAlpX2Jsb2NrcwkJKQogCQlfX2ZpZWxkKAlpbnQsCXVzZWRfYmxvY2tzCQkpCiAJCV9fZmllbGQoCWludCwJcmVzZXJ2ZWRfZGF0YV9ibG9ja3MJKQpAQCAtMTA3Niw3ICsxMDc2LDcgQEAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlfX2ZpZWxkKAlkZXZfdCwJZGV2CQkJKQogCQlfX2ZpZWxkKAlpbm9fdCwJaW5vCQkJKQotCQlfX2ZpZWxkKAl1bW9kZV90LCBtb2RlCQkJKQorCQlfX2ZpZWxkKAlfX3UxNiwgIG1vZGUJCQkpCiAJCV9fZmllbGQoCV9fdTY0LAlpX2Jsb2NrcwkJKQogCQlfX2ZpZWxkKAlpbnQsCW1kX25lZWRlZAkJKQogCQlfX2ZpZWxkKAlpbnQsCXJlc2VydmVkX2RhdGFfYmxvY2tzCSkKQEAgLTExMTAsNyArMTExMCw3IEBACiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19maWVsZCgJZGV2X3QsCWRldgkJCSkKIAkJX19maWVsZCgJaW5vX3QsCWlubwkJCSkKLQkJX19maWVsZCgJdW1vZGVfdCwgbW9kZQkJCSkKKwkJX19maWVsZCgJX191MTYsICBtb2RlCQkJKQogCQlfX2ZpZWxkKAlfX3U2NCwJaV9ibG9ja3MJCSkKIAkJX19maWVsZCgJaW50LAlmcmVlZF9ibG9ja3MJCSkKIAkJX19maWVsZCgJaW50LAlyZXNlcnZlZF9kYXRhX2Jsb2NrcwkpCkBAIC0xNTE4LDYgKzE1MTgsNzcgQEAKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vKQogKTsKIAorVFJBQ0VfRVZFTlQoZXh0NF9qb3VybmFsX3N0YXJ0LAorCVRQX1BST1RPKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBuYmxvY2tzLCB1bnNpZ25lZCBsb25nIElQKSwKKworCVRQX0FSR1Moc2IsIG5ibG9ja3MsIElQKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCisJCV9fZmllbGQoCSAgaW50LCAJbmJsb2NrcwkJCSkKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLAlpcAkJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmRldgkgPSBzYi0+c19kZXY7CisJCV9fZW50cnktPm5ibG9ja3MgPSBuYmxvY2tzOworCQlfX2VudHJ5LT5pcAkgPSBJUDsKKwkpLAorCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgbmJsb2NrcyAlZCBjYWxsZXIgJXBGIiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAorCQkgIF9fZW50cnktPm5ibG9ja3MsICh2b2lkICopX19lbnRyeS0+aXApCispOworCitERUNMQVJFX0VWRU5UX0NMQVNTKGV4dDRfX3RyaW0sCisJVFBfUFJPVE8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJIGV4dDRfZ3JvdXBfdCBncm91cCwKKwkJIGV4dDRfZ3JwYmxrX3Qgc3RhcnQsCisJCSBleHQ0X2dycGJsa190IGxlbiksCisKKwlUUF9BUkdTKHNiLCBncm91cCwgc3RhcnQsIGxlbiksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAlpbnQsCWRldl9tYWpvcgkJKQorCQlfX2ZpZWxkKAlpbnQsCWRldl9taW5vcgkJKQorCQlfX2ZpZWxkKAlfX3UzMiwgCWdyb3VwCQkJKQorCQlfX2ZpZWxkKAlpbnQsCXN0YXJ0CQkJKQorCQlfX2ZpZWxkKAlpbnQsCWxlbgkJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmRldl9tYWpvcgk9IE1BSk9SKHNiLT5zX2Rldik7CisJCV9fZW50cnktPmRldl9taW5vcgk9IE1JTk9SKHNiLT5zX2Rldik7CisJCV9fZW50cnktPmdyb3VwCQk9IGdyb3VwOworCQlfX2VudHJ5LT5zdGFydAkJPSBzdGFydDsKKwkJX19lbnRyeS0+bGVuCQk9IGxlbjsKKwkpLAorCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgZ3JvdXAgJXUsIHN0YXJ0ICVkLCBsZW4gJWQiLAorCQkgIF9fZW50cnktPmRldl9tYWpvciwgX19lbnRyeS0+ZGV2X21pbm9yLAorCQkgIF9fZW50cnktPmdyb3VwLCBfX2VudHJ5LT5zdGFydCwgX19lbnRyeS0+bGVuKQorKTsKKworREVGSU5FX0VWRU5UKGV4dDRfX3RyaW0sIGV4dDRfdHJpbV9leHRlbnQsCisKKwlUUF9QUk9UTyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkgZXh0NF9ncm91cF90IGdyb3VwLAorCQkgZXh0NF9ncnBibGtfdCBzdGFydCwKKwkJIGV4dDRfZ3JwYmxrX3QgbGVuKSwKKworCVRQX0FSR1Moc2IsIGdyb3VwLCBzdGFydCwgbGVuKQorKTsKKworREVGSU5FX0VWRU5UKGV4dDRfX3RyaW0sIGV4dDRfdHJpbV9hbGxfZnJlZSwKKworCVRQX1BST1RPKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCSBleHQ0X2dyb3VwX3QgZ3JvdXAsCisJCSBleHQ0X2dycGJsa190IHN0YXJ0LAorCQkgZXh0NF9ncnBibGtfdCBsZW4pLAorCisJVFBfQVJHUyhzYiwgZ3JvdXAsIHN0YXJ0LCBsZW4pCispOworCiAjZW5kaWYgLyogX1RSQUNFX0VYVDRfSCAqLwogCiAvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2piZDIuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2piZDIuaAppbmRleCBiZjE2NTQ1Li43NTk2NDQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9qYmQyLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvamJkMi5oCkBAIC0yNiw4ICsyNiw4IEBACiAJCV9fZW50cnktPnJlc3VsdAkJPSByZXN1bHQ7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVzIHJlc3VsdCAlZCIsCi0JCSAgamJkMl9kZXZfdG9fbmFtZShfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT5yZXN1bHQpCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgcmVzdWx0ICVkIiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT5yZXN1bHQpCiApOwogCiBERUNMQVJFX0VWRU5UX0NMQVNTKGpiZDJfY29tbWl0LApAQCAtNDgsOSArNDgsOSBAQAogCQlfX2VudHJ5LT50cmFuc2FjdGlvbgk9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF90aWQ7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVzIHRyYW5zYWN0aW9uICVkIHN5bmMgJWQiLAotCQkgIGpiZDJfZGV2X3RvX25hbWUoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+dHJhbnNhY3Rpb24sCi0JCSAgX19lbnRyeS0+c3luY19jb21taXQpCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgdHJhbnNhY3Rpb24gJWQgc3luYyAlZCIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICBfX2VudHJ5LT50cmFuc2FjdGlvbiwgX19lbnRyeS0+c3luY19jb21taXQpCiApOwogCiBERUZJTkVfRVZFTlQoamJkMl9jb21taXQsIGpiZDJfc3RhcnRfY29tbWl0LApAQCAtMTAwLDkgKzEwMCw5IEBACiAJCV9fZW50cnktPmhlYWQJCT0gam91cm5hbC0+al90YWlsX3NlcXVlbmNlOwogCSksCiAKLQlUUF9wcmludGsoImRldiAlcyB0cmFuc2FjdGlvbiAlZCBzeW5jICVkIGhlYWQgJWQiLAotCQkgIGpiZDJfZGV2X3RvX25hbWUoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+dHJhbnNhY3Rpb24sCi0JCSAgX19lbnRyeS0+c3luY19jb21taXQsIF9fZW50cnktPmhlYWQpCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgdHJhbnNhY3Rpb24gJWQgc3luYyAlZCBoZWFkICVkIiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAorCQkgIF9fZW50cnktPnRyYW5zYWN0aW9uLCBfX2VudHJ5LT5zeW5jX2NvbW1pdCwgX19lbnRyeS0+aGVhZCkKICk7CiAKIFRSQUNFX0VWRU5UKGpiZDJfc3VibWl0X2lub2RlX2RhdGEsCkBAIC0xMjAsOCArMTIwLDkgQEAKIAkJX19lbnRyeS0+aW5vCT0gaW5vZGUtPmlfaW5vOwogCSksCiAKLQlUUF9wcmludGsoImRldiAlcyBpbm8gJWx1IiwKLQkJICBqYmQyX2Rldl90b19uYW1lKF9fZW50cnktPmRldiksICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8pCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vKQogKTsKIAogVFJBQ0VfRVZFTlQoamJkMl9ydW5fc3RhdHMsCkBAIC0xNTYsOSArMTU3LDkgQEAKIAkJX19lbnRyeS0+YmxvY2tzX2xvZ2dlZAk9IHN0YXRzLT5yc19ibG9ja3NfbG9nZ2VkOwogCSksCiAKLQlUUF9wcmludGsoImRldiAlcyB0aWQgJWx1IHdhaXQgJXUgcnVubmluZyAldSBsb2NrZWQgJXUgZmx1c2hpbmcgJXUgIgorCVRQX3ByaW50aygiZGV2ICVkLCVkIHRpZCAlbHUgd2FpdCAldSBydW5uaW5nICV1IGxvY2tlZCAldSBmbHVzaGluZyAldSAiCiAJCSAgImxvZ2dpbmcgJXUgaGFuZGxlX2NvdW50ICV1IGJsb2NrcyAldSBibG9ja3NfbG9nZ2VkICV1IiwKLQkJICBqYmQyX2Rldl90b19uYW1lKF9fZW50cnktPmRldiksIF9fZW50cnktPnRpZCwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT50aWQsCiAJCSAgamlmZmllc190b19tc2VjcyhfX2VudHJ5LT53YWl0KSwKIAkJICBqaWZmaWVzX3RvX21zZWNzKF9fZW50cnktPnJ1bm5pbmcpLAogCQkgIGppZmZpZXNfdG9fbXNlY3MoX19lbnRyeS0+bG9ja2VkKSwKQEAgLTE5Miw5ICsxOTMsOSBAQAogCQlfX2VudHJ5LT5kcm9wcGVkCT0gc3RhdHMtPmNzX2Ryb3BwZWQ7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVzIHRpZCAlbHUgY2hwX3RpbWUgJXUgZm9yY2VkX3RvX2Nsb3NlICV1ICIKKwlUUF9wcmludGsoImRldiAlZCwlZCB0aWQgJWx1IGNocF90aW1lICV1IGZvcmNlZF90b19jbG9zZSAldSAiCiAJCSAgIndyaXR0ZW4gJXUgZHJvcHBlZCAldSIsCi0JCSAgamJkMl9kZXZfdG9fbmFtZShfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT50aWQsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+dGlkLAogCQkgIGppZmZpZXNfdG9fbXNlY3MoX19lbnRyeS0+Y2hwX3RpbWUpLAogCQkgIF9fZW50cnktPmZvcmNlZF90b19jbG9zZSwgX19lbnRyeS0+d3JpdHRlbiwgX19lbnRyeS0+ZHJvcHBlZCkKICk7CkBAIC0yMjIsOSArMjIzLDEwIEBACiAJCV9fZW50cnktPmZyZWVkCQk9IGZyZWVkOwogCSksCiAKLQlUUF9wcmludGsoImRldiAlcyBmcm9tICV1IHRvICV1IG9mZnNldCAlbHUgZnJlZWQgJWx1IiwKLQkJICBqYmQyX2Rldl90b19uYW1lKF9fZW50cnktPmRldiksIF9fZW50cnktPnRhaWxfc2VxdWVuY2UsCi0JCSAgX19lbnRyeS0+Zmlyc3RfdGlkLCBfX2VudHJ5LT5ibG9ja19uciwgX19lbnRyeS0+ZnJlZWQpCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgZnJvbSAldSB0byAldSBvZmZzZXQgJWx1IGZyZWVkICVsdSIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICBfX2VudHJ5LT50YWlsX3NlcXVlbmNlLCBfX2VudHJ5LT5maXJzdF90aWQsCisJCSAgX19lbnRyeS0+YmxvY2tfbnIsIF9fZW50cnktPmZyZWVkKQogKTsKIAogI2VuZGlmIC8qIF9UUkFDRV9KQkQyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3hlbi5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMveGVuLmgKaW5kZXggNDRkOGRlYy4uOTJmMWE3OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMveGVuLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMveGVuLmgKQEAgLTgsNiArOCw4IEBACiAjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0X3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3hlbi90cmFjZV90eXBlcy5oPgogCitzdHJ1Y3QgbXVsdGljYWxsX2VudHJ5OworCiAvKiBNdWx0aWNhbGxzICovCiBERUNMQVJFX0VWRU5UX0NMQVNTKHhlbl9tY19fYmF0Y2gsCiAJICAgIFRQX1BST1RPKGVudW0gcGFyYXZpcnRfbGF6eV9tb2RlIG1vZGUpLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS92aWRlby9vbWFwZHNzLmggYi9pbmNsdWRlL3ZpZGVvL29tYXBkc3MuaAppbmRleCA4OTJiOTdmLi4zYjU1ZWYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3ZpZGVvL29tYXBkc3MuaAorKysgYi9pbmNsdWRlL3ZpZGVvL29tYXBkc3MuaApAQCAtMjEsOCArMjEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCiAjZGVmaW5lIERJU1BDX0lSUV9GUkFNRURPTkUJCSgxIDw8IDApCiAjZGVmaW5lIERJU1BDX0lSUV9WU1lOQwkJCSgxIDw8IDEpCkBAIC0xMzYsMTIgKzEzNCw2IEBACiAJT01BUF9EU1NfRElTUExBWV9DQVBfVEVBUl9FTElNCQk9IDEgPDwgMSwKIH07CiAKLWVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUgewotCU9NQVBfRFNTX1VQREFURV9ESVNBQkxFRCA9IDAsCi0JT01BUF9EU1NfVVBEQVRFX0FVVE8sCi0JT01BUF9EU1NfVVBEQVRFX01BTlVBTCwKLX07Ci0KIGVudW0gb21hcF9kc3NfZGlzcGxheV9zdGF0ZSB7CiAJT01BUF9EU1NfRElTUExBWV9ESVNBQkxFRCA9IDAsCiAJT01BUF9EU1NfRElTUExBWV9BQ1RJVkUsCkBAIC0yNDYsNyArMjM4LDcgQEAKIAogLyogQm9hcmQgc3BlY2lmaWMgZGF0YSAqLwogc3RydWN0IG9tYXBfZHNzX2JvYXJkX2luZm8gewotCWludCAoKmdldF9sYXN0X29mZl9vbl90cmFuc2FjdGlvbl9pZCkoc3RydWN0IGRldmljZSAqZGV2KTsKKwlpbnQgKCpnZXRfY29udGV4dF9sb3NzX2NvdW50KShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCWludCBudW1fZGV2aWNlczsKIAlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICoqZGV2aWNlczsKIAlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkZWZhdWx0X2RldmljZTsKQEAgLTI2Niw4ICsyNTgsNiBAQAogc3RydWN0IG9tYXBfZGlzcGxheV9wbGF0Zm9ybV9kYXRhIHsKIAlzdHJ1Y3Qgb21hcF9kc3NfYm9hcmRfaW5mbyAqYm9hcmRfZGF0YTsKIAkvKiBUT0RPOiBBZGRpdGlvbmFsIG1lbWJlcnMgdG8gYmUgYWRkZWQgd2hlbiBQTSBpcyBjb25zaWRlcmVkICovCi0KLQlib29sICgqb3B0X2Nsb2NrX2F2YWlsYWJsZSkoY29uc3QgY2hhciAqY2xrX3JvbGUpOwogfTsKIAogc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyB7CkBAIC0zMDAsNiArMjkwLDEyIEBACiBleHRlcm4gY29uc3Qgc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyBvbWFwX2Rzc19udHNjX3RpbWluZ3M7CiAjZW5kaWYKIAorc3RydWN0IG9tYXBfZHNzX2Nwcl9jb2VmcyB7CisJczE2IHJyLCByZywgcmI7CisJczE2IGdyLCBnZywgZ2I7CisJczE2IGJyLCBiZywgYmI7Cit9OworCiBzdHJ1Y3Qgb21hcF9vdmVybGF5X2luZm8gewogCWJvb2wgZW5hYmxlZDsKIApAQCAtMzU5LDYgKzM1NSw5IEBACiAJYm9vbCB0cmFuc19lbmFibGVkOwogCiAJYm9vbCBhbHBoYV9lbmFibGVkOworCisJYm9vbCBjcHJfZW5hYmxlOworCXN0cnVjdCBvbWFwX2Rzc19jcHJfY29lZnMgY3ByX2NvZWZzOwogfTsKIAogc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyIHsKQEAgLTUyNiwxMSArNTI1LDYgQEAKIAlpbnQgKCpyZXN1bWUpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRpc3BsYXkpOwogCWludCAoKnJ1bl90ZXN0KShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5LCBpbnQgdGVzdCk7CiAKLQlpbnQgKCpzZXRfdXBkYXRlX21vZGUpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKLQkJCWVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUpOwotCWVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUgKCpnZXRfdXBkYXRlX21vZGUpKAotCQkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KTsKLQogCWludCAoKnVwZGF0ZSkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAogCQkJICAgICAgIHUxNiB4LCB1MTYgeSwgdTE2IHcsIHUxNiBoKTsKIAlpbnQgKCpzeW5jKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpOwpkaWZmIC0tZ2l0IGEvaW5pdC9tYWluLmMgYi9pbml0L21haW4uYwppbmRleCBkNzIxMWZhLi45YzUxZWU3IDEwMDY0NAotLS0gYS9pbml0L21haW4uYworKysgYi9pbml0L21haW4uYwpAQCAtMzY5LDkgKzM2OSwxMiBAQAogCWluaXRfaWRsZV9ib290dXBfdGFzayhjdXJyZW50KTsKIAlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CiAJc2NoZWR1bGUoKTsKLQlwcmVlbXB0X2Rpc2FibGUoKTsKKworCS8qIEF0IHRoaXMgcG9pbnQsIHdlIGNhbiBlbmFibGUgdXNlciBtb2RlIGhlbHBlciBmdW5jdGlvbmFsaXR5ICovCisJdXNlcm1vZGVoZWxwZXJfZW5hYmxlKCk7CiAKIAkvKiBDYWxsIGludG8gY3B1X2lkbGUgd2l0aCBwcmVlbXB0IGRpc2FibGVkICovCisJcHJlZW1wdF9kaXNhYmxlKCk7CiAJY3B1X2lkbGUoKTsKIH0KIApAQCAtNzE1LDcgKzcxOCw3IEBACiB7CiAJY3B1c2V0X2luaXRfc21wKCk7CiAJdXNlcm1vZGVoZWxwZXJfaW5pdCgpOwotCWluaXRfdG1wZnMoKTsKKwlzaG1lbV9pbml0KCk7CiAJZHJpdmVyX2luaXQoKTsKIAlpbml0X2lycV9wcm9jKCk7CiAJZG9fY3RvcnMoKTsKZGlmZiAtLWdpdCBhL2lwYy9zaG0uYyBiL2lwYy9zaG0uYwppbmRleCAzZjViMTQzLi4wMmVjZjJjIDEwMDY0NAotLS0gYS9pcGMvc2htLmMKKysrIGIvaXBjL3NobS5jCkBAIC0xMDUsOSArMTA1LDE2IEBACiB9CiAjZW5kaWYKIAotdm9pZCBfX2luaXQgc2htX2luaXQgKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpcGNfbnNfaW5pdCh2b2lkKQogewogCXNobV9pbml0X25zKCZpbml0X2lwY19ucyk7CisJcmV0dXJuIDA7Cit9CisKK3B1cmVfaW5pdGNhbGwoaXBjX25zX2luaXQpOworCit2b2lkIF9faW5pdCBzaG1faW5pdCAodm9pZCkKK3sKIAlpcGNfaW5pdF9wcm9jX2ludGVyZmFjZSgic3lzdmlwYy9zaG0iLAogI2lmIEJJVFNfUEVSX0xPTkcgPD0gMzIKIAkJCQkiICAgICAgIGtleSAgICAgIHNobWlkIHBlcm1zICAgICAgIHNpemUgIGNwaWQgIGxwaWQgbmF0dGNoICAgdWlkICAgZ2lkICBjdWlkICBjZ2lkICAgICAgYXRpbWUgICAgICBkdGltZSAgICAgIGN0aW1lICAgICAgICByc3MgICAgICAgc3dhcFxuIiwKQEAgLTEzMSw2ICsxMzgsMTIgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKGlwY3AsIHN0cnVjdCBzaG1pZF9rZXJuZWwsIHNobV9wZXJtKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNobV9sb2NrX2J5X3B0cihzdHJ1Y3Qgc2htaWRfa2VybmVsICppcGNwKQoreworCXJjdV9yZWFkX2xvY2soKTsKKwlzcGluX2xvY2soJmlwY3AtPnNobV9wZXJtLmxvY2spOworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzaG1pZF9rZXJuZWwgKnNobV9sb2NrX2NoZWNrKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucywKIAkJCQkJCWludCBpZCkKIHsKQEAgLTIzMSw3NiArMjQ0LDgwIEBACiAJdXBfd3JpdGUoJnNobV9pZHMobnMpLnJ3X211dGV4KTsKIH0KIAorLyogQ2FsbGVkIHdpdGggbnMtPnNobV9pZHMobnMpLnJ3X211dGV4IGxvY2tlZCAqLwogc3RhdGljIGludCBzaG1fdHJ5X2Rlc3Ryb3lfY3VycmVudChpbnQgaWQsIHZvaWQgKnAsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zID0gZGF0YTsKLQlzdHJ1Y3Qgc2htaWRfa2VybmVsICpzaHAgPSBzaG1fbG9jayhucywgaWQpOworCXN0cnVjdCBrZXJuX2lwY19wZXJtICppcGNwID0gcDsKKwlzdHJ1Y3Qgc2htaWRfa2VybmVsICpzaHAgPSBjb250YWluZXJfb2YoaXBjcCwgc3RydWN0IHNobWlkX2tlcm5lbCwgc2htX3Blcm0pOwogCi0JaWYgKElTX0VSUihzaHApKQorCWlmIChzaHAtPnNobV9jcmVhdG9yICE9IGN1cnJlbnQpCiAJCXJldHVybiAwOwogCi0JaWYgKHNocC0+c2htX2NwcmlkICE9IHRhc2tfdGdpZF92bnIoY3VycmVudCkpIHsKLQkJc2htX3VubG9jayhzaHApOwotCQlyZXR1cm4gMDsKLQl9CisJLyoKKwkgKiBNYXJrIGl0IGFzIG9ycGhhbmVkIHRvIGRlc3Ryb3kgdGhlIHNlZ21lbnQgd2hlbgorCSAqIGtlcm5lbC5zaG1fcm1pZF9mb3JjZWQgaXMgY2hhbmdlZC4KKwkgKiBJdCBpcyBub29wIGlmIHRoZSBmb2xsb3dpbmcgc2htX21heV9kZXN0cm95KCkgcmV0dXJucyB0cnVlLgorCSAqLworCXNocC0+c2htX2NyZWF0b3IgPSBOVUxMOwogCi0JaWYgKHNobV9tYXlfZGVzdHJveShucywgc2hwKSkKKwkvKgorCSAqIERvbid0IGV2ZW4gdHJ5IHRvIGRlc3Ryb3kgaXQuICBJZiBzaG1fcm1pZF9mb3JjZWQ9MCBhbmQgSVBDX1JNSUQKKwkgKiBpcyBub3Qgc2V0LCBpdCBzaG91bGRuJ3QgYmUgZGVsZXRlZCBoZXJlLgorCSAqLworCWlmICghbnMtPnNobV9ybWlkX2ZvcmNlZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2htX21heV9kZXN0cm95KG5zLCBzaHApKSB7CisJCXNobV9sb2NrX2J5X3B0cihzaHApOwogCQlzaG1fZGVzdHJveShucywgc2hwKTsKLQllbHNlCi0JCXNobV91bmxvY2soc2hwKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKKy8qIENhbGxlZCB3aXRoIG5zLT5zaG1faWRzKG5zKS5yd19tdXRleCBsb2NrZWQgKi8KIHN0YXRpYyBpbnQgc2htX3RyeV9kZXN0cm95X29ycGhhbmVkKGludCBpZCwgdm9pZCAqcCwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMgPSBkYXRhOwotCXN0cnVjdCBzaG1pZF9rZXJuZWwgKnNocCA9IHNobV9sb2NrKG5zLCBpZCk7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwotCi0JaWYgKElTX0VSUihzaHApKQotCQlyZXR1cm4gMDsKKwlzdHJ1Y3Qga2Vybl9pcGNfcGVybSAqaXBjcCA9IHA7CisJc3RydWN0IHNobWlkX2tlcm5lbCAqc2hwID0gY29udGFpbmVyX29mKGlwY3AsIHN0cnVjdCBzaG1pZF9rZXJuZWwsIHNobV9wZXJtKTsKIAogCS8qCiAJICogV2Ugd2FudCB0byBkZXN0cm95IHNlZ21lbnRzIHdpdGhvdXQgdXNlcnMgYW5kIHdpdGggYWxyZWFkeQogCSAqIGV4aXQnZWQgb3JpZ2luYXRpbmcgcHJvY2Vzcy4KIAkgKgotCSAqIFhYWDogdGhlIG9yaWdpbmF0aW5nIHByb2Nlc3MgbWF5IGV4aXN0IGluIGFub3RoZXIgcGlkIG5hbWVzcGFjZS4KKwkgKiBBcyBzaHAtPiogYXJlIGNoYW5nZWQgdW5kZXIgcndfbXV0ZXgsIGl0J3Mgc2FmZSB0byBza2lwIHNocCBsb2NraW5nLgogCSAqLwotCXRhc2sgPSBmaW5kX3Rhc2tfYnlfdnBpZChzaHAtPnNobV9jcHJpZCk7Ci0JaWYgKHRhc2sgIT0gTlVMTCkgewotCQlzaG1fdW5sb2NrKHNocCk7CisJaWYgKHNocC0+c2htX2NyZWF0b3IgIT0gTlVMTCkKIAkJcmV0dXJuIDA7Ci0JfQogCi0JaWYgKHNobV9tYXlfZGVzdHJveShucywgc2hwKSkKKwlpZiAoc2htX21heV9kZXN0cm95KG5zLCBzaHApKSB7CisJCXNobV9sb2NrX2J5X3B0cihzaHApOwogCQlzaG1fZGVzdHJveShucywgc2hwKTsKLQllbHNlCi0JCXNobV91bmxvY2soc2hwKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKIHZvaWQgc2htX2Rlc3Ryb3lfb3JwaGFuZWQoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKQogewogCWRvd25fd3JpdGUoJnNobV9pZHMobnMpLnJ3X211dGV4KTsKLQlpZHJfZm9yX2VhY2goJnNobV9pZHMobnMpLmlwY3NfaWRyLCAmc2htX3RyeV9kZXN0cm95X29ycGhhbmVkLCBucyk7CisJaWYgKHNobV9pZHMobnMpLmluX3VzZSkKKwkJaWRyX2Zvcl9lYWNoKCZzaG1faWRzKG5zKS5pcGNzX2lkciwgJnNobV90cnlfZGVzdHJveV9vcnBoYW5lZCwgbnMpOwogCXVwX3dyaXRlKCZzaG1faWRzKG5zKS5yd19tdXRleCk7CiB9CiAKIAogdm9pZCBleGl0X3NobShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0Jc3RydWN0IG5zcHJveHkgKm5zcCA9IHRhc2stPm5zcHJveHk7Ci0Jc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zOworCXN0cnVjdCBpcGNfbmFtZXNwYWNlICpucyA9IHRhc2stPm5zcHJveHktPmlwY19uczsKIAotCWlmICghbnNwKQotCQlyZXR1cm47Ci0JbnMgPSBuc3AtPmlwY19uczsKLQlpZiAoIW5zIHx8ICFucy0+c2htX3JtaWRfZm9yY2VkKQorCWlmIChzaG1faWRzKG5zKS5pbl91c2UgPT0gMCkKIAkJcmV0dXJuOwogCiAJLyogRGVzdHJveSBhbGwgYWxyZWFkeSBjcmVhdGVkIHNlZ21lbnRzLCBidXQgbm90IG1hcHBlZCB5ZXQgKi8KIAlkb3duX3dyaXRlKCZzaG1faWRzKG5zKS5yd19tdXRleCk7Ci0JaWRyX2Zvcl9lYWNoKCZzaG1faWRzKG5zKS5pcGNzX2lkciwgJnNobV90cnlfZGVzdHJveV9jdXJyZW50LCBucyk7CisJaWYgKHNobV9pZHMobnMpLmluX3VzZSkKKwkJaWRyX2Zvcl9lYWNoKCZzaG1faWRzKG5zKS5pcGNzX2lkciwgJnNobV90cnlfZGVzdHJveV9jdXJyZW50LCBucyk7CiAJdXBfd3JpdGUoJnNobV9pZHMobnMpLnJ3X211dGV4KTsKIH0KIApAQCAtNDk0LDYgKzUxMSw3IEBACiAJc2hwLT5zaG1fc2Vnc3ogPSBzaXplOwogCXNocC0+c2htX25hdHRjaCA9IDA7CiAJc2hwLT5zaG1fZmlsZSA9IGZpbGU7CisJc2hwLT5zaG1fY3JlYXRvciA9IGN1cnJlbnQ7CiAJLyoKIAkgKiBzaG1pZCBnZXRzIHJlcG9ydGVkIGFzICJpbm9kZSMiIGluIC9wcm9jL3BpZC9tYXBzLgogCSAqIHByb2MtcHMgdG9vbHMgdXNlIHRoaXMuIENoYW5naW5nIHRoaXMgd2lsbCBicmVhayB0aGVtLgpkaWZmIC0tZ2l0IGEva2VybmVsL2NvbXBhdC5jIGIva2VybmVsL2NvbXBhdC5jCmluZGV4IDYxNmM3ODEuLmUyNDM1ZWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jb21wYXQuYworKysgYi9rZXJuZWwvY29tcGF0LmMKQEAgLTE1OCw2ICsxNTgsNyBAQAogCQkJX19wdXRfdXNlcih0cy0+dHZfc2VjLCAmY3RzLT50dl9zZWMpIHx8CiAJCQlfX3B1dF91c2VyKHRzLT50dl9uc2VjLCAmY3RzLT50dl9uc2VjKSkgPyAtRUZBVUxUIDogMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHB1dF9jb21wYXRfdGltZXNwZWMpOwogCiBzdGF0aWMgbG9uZyBjb21wYXRfbmFub3NsZWVwX3Jlc3RhcnQoc3RydWN0IHJlc3RhcnRfYmxvY2sgKnJlc3RhcnQpCiB7CmRpZmYgLS1naXQgYS9rZXJuZWwvZGVidWcvZ2Ric3R1Yi5jIGIva2VybmVsL2RlYnVnL2dkYnN0dWIuYwppbmRleCBhMTFkYjk1Li4zNDg3MjQ4IDEwMDY0NAotLS0gYS9rZXJuZWwvZGVidWcvZ2Ric3R1Yi5jCisrKyBiL2tlcm5lbC9kZWJ1Zy9nZGJzdHViLmMKQEAgLTQyLDYgKzQyLDggQEAKIC8qIE91ciBJL08gYnVmZmVycy4gKi8KIHN0YXRpYyBjaGFyCQkJcmVtY29tX2luX2J1ZmZlcltCVUZNQVhdOwogc3RhdGljIGNoYXIJCQlyZW1jb21fb3V0X2J1ZmZlcltCVUZNQVhdOworc3RhdGljIGludAkJCWdkYnN0dWJfdXNlX3ByZXZfaW5fYnVmOworc3RhdGljIGludAkJCWdkYnN0dWJfcHJldl9pbl9idWZfcG9zOwogCiAvKiBTdG9yYWdlIGZvciB0aGUgcmVnaXN0ZXJzLCBpbiBHREIgZm9ybWF0LiAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcJCWdkYl9yZWdzWyhOVU1SRUdCWVRFUyArCkBAIC01OCw2ICs2MCwxMyBAQAogCWludCByZXQgPSAtMTsKIAlpbnQgaTsKIAorCWlmICh1bmxpa2VseShnZGJzdHViX3VzZV9wcmV2X2luX2J1ZikpIHsKKwkJaWYgKGdkYnN0dWJfcHJldl9pbl9idWZfcG9zIDwgZ2Ric3R1Yl91c2VfcHJldl9pbl9idWYpCisJCQlyZXR1cm4gcmVtY29tX2luX2J1ZmZlcltnZGJzdHViX3ByZXZfaW5fYnVmX3BvcysrXTsKKwkJZWxzZQorCQkJZ2Ric3R1Yl91c2VfcHJldl9pbl9idWYgPSAwOworCX0KKwogCS8qIHBvbGwgYW55IGFkZGl0aW9uYWwgSS9PIGludGVyZmFjZXMgdGhhdCBhcmUgZGVmaW5lZCAqLwogCXdoaWxlIChyZXQgPCAwKQogCQlmb3IgKGkgPSAwOyBrZGJfcG9sbF9mdW5jc1tpXSAhPSBOVUxMOyBpKyspIHsKQEAgLTEwOSw3ICsxMTgsNiBAQAogCQkJYnVmZmVyW2NvdW50XSA9IGNoOwogCQkJY291bnQgPSBjb3VudCArIDE7CiAJCX0KLQkJYnVmZmVyW2NvdW50XSA9IDA7CiAKIAkJaWYgKGNoID09ICcjJykgewogCQkJeG1pdGNzdW0gPSBoZXhfdG9fYmluKGdkYnN0dWJfcmVhZF93YWl0KCkpIDw8IDQ7CkBAIC0xMjQsNiArMTMyLDcgQEAKIAkJCWlmIChkYmdfaW9fb3BzLT5mbHVzaCkKIAkJCQlkYmdfaW9fb3BzLT5mbHVzaCgpOwogCQl9CisJCWJ1ZmZlcltjb3VudF0gPSAwOwogCX0gd2hpbGUgKGNoZWNrc3VtICE9IHhtaXRjc3VtKTsKIH0KIApAQCAtMTA4MiwxMiArMTA5MSwxMSBAQAogCWNhc2UgJ2MnOgogCQlzdHJjcHkocmVtY29tX2luX2J1ZmZlciwgY21kKTsKIAkJcmV0dXJuIDA7Ci0JY2FzZSAnPyc6Ci0JCWdkYl9jbWRfc3RhdHVzKGtzKTsKLQkJYnJlYWs7Ci0JY2FzZSAnXDAnOgotCQlzdHJjcHkocmVtY29tX291dF9idWZmZXIsICIiKTsKLQkJYnJlYWs7CisJY2FzZSAnJCc6CisJCXN0cmNweShyZW1jb21faW5fYnVmZmVyLCBjbWQpOworCQlnZGJzdHViX3VzZV9wcmV2X2luX2J1ZiA9IHN0cmxlbihyZW1jb21faW5fYnVmZmVyKTsKKwkJZ2Ric3R1Yl9wcmV2X2luX2J1Zl9wb3MgPSAwOworCQlyZXR1cm4gMDsKIAl9CiAJZGJnX2lvX29wcy0+d3JpdGVfY2hhcignKycpOwogCXB1dF9wYWNrZXQocmVtY29tX291dF9idWZmZXIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2RlYnVnL2tkYi9rZGJfYnQuYyBiL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX2J0LmMKaW5kZXggMmY2MmZlOC4uNzE3OWVhYyAxMDA2NDQKLS0tIGEva2VybmVsL2RlYnVnL2tkYi9rZGJfYnQuYworKysgYi9rZXJuZWwvZGVidWcva2RiL2tkYl9idC5jCkBAIC0xMTIsOSArMTEyLDggQEAKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAJbG9uZyBvZmZzZXQ7CiAKLQlrZGJnZXRpbnRlbnYoIkJUQVJHUyIsICZhcmdjb3VudCk7CS8qIEFyZ3VtZW50cyB0byBwcmludCAqLwotCWtkYmdldGludGVudigiQlRBUFJPTVBUIiwgJmJ0YXByb21wdCk7CS8qIFByb21wdCBhZnRlciBlYWNoCi0JCQkJCQkgKiBwcm9jIGluIGJ0YSAqLworCS8qIFByb21wdCBhZnRlciBlYWNoIHByb2MgaW4gYnRhICovCisJa2RiZ2V0aW50ZW52KCJCVEFQUk9NUFQiLCAmYnRhcHJvbXB0KTsKIAogCWlmIChzdHJjbXAoYXJndlswXSwgImJ0YSIpID09IDApIHsKIAkJc3RydWN0IHRhc2tfc3RydWN0ICpnLCAqcDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX2NtZHMgYi9rZXJuZWwvZGVidWcva2RiL2tkYl9jbWRzCmluZGV4IDU2Yzg4ZTQuLjk4MzRhZDMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX2NtZHMKKysrIGIva2VybmVsL2RlYnVnL2tkYi9rZGJfY21kcwpAQCAtMTgsMTYgKzE4LDEyIEBACiBlbmRlZmNtZAogCiBkZWZjbWQgZHVtcGFsbCAiIiAiRmlyc3QgbGluZSBkZWJ1Z2dpbmciCi0gIHNldCBCVFNZTUFSRyAxCi0gIHNldCBCVEFSR1MgOQogICBwaWQgUgogICAtZHVtcGNvbW1vbgogICAtYnRhCiBlbmRlZmNtZAogCiBkZWZjbWQgZHVtcGNwdSAiIiAiU2FtZSBhcyBkdW1wYWxsIGJ1dCBvbmx5IHRhc2tzIG9uIGNwdXMiCi0gIHNldCBCVFNZTUFSRyAxCi0gIHNldCBCVEFSR1MgOQogICBwaWQgUgogICAtZHVtcGNvbW1vbgogICAtYnRjCmRpZmYgLS1naXQgYS9rZXJuZWwvZGVidWcva2RiL2tkYl9kZWJ1Z2dlci5jIGIva2VybmVsL2RlYnVnL2tkYi9rZGJfZGVidWdnZXIuYwppbmRleCBkZDBiMWI3Li5kOWNhOWFhIDEwMDY0NAotLS0gYS9rZXJuZWwvZGVidWcva2RiL2tkYl9kZWJ1Z2dlci5jCisrKyBiL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX2RlYnVnZ2VyLmMKQEAgLTMwLDYgKzMwLDggQEAKIGludCBrZGJfcG9sbF9pZHggPSAxOwogRVhQT1JUX1NZTUJPTF9HUEwoa2RiX3BvbGxfaWR4KTsKIAorc3RhdGljIHN0cnVjdCBrZ2RiX3N0YXRlICprZGJfa3M7CisKIGludCBrZGJfc3R1YihzdHJ1Y3Qga2dkYl9zdGF0ZSAqa3MpCiB7CiAJaW50IGVycm9yID0gMDsKQEAgLTM5LDYgKzQxLDcgQEAKIAlrZGJfZGJ0cmFwX3QgZGJfcmVzdWx0ID0gS0RCX0RCX05PQlBUOwogCWludCBpOwogCisJa2RiX2tzID0ga3M7CiAJaWYgKEtEQl9TVEFURShSRUVOVFJZKSkgewogCQlyZWFzb24gPSBLREJfUkVBU09OX1NXSVRDSDsKIAkJS0RCX1NUQVRFX0NMRUFSKFJFRU5UUlkpOwpAQCAtMTIzLDIwICsxMjYsOCBAQAogCUtEQl9TVEFURV9DTEVBUihQQUdFUik7CiAJa2RibmVhcnN5bV9jbGVhbnVwKCk7CiAJaWYgKGVycm9yID09IEtEQl9DTURfS0dEQikgewotCQlpZiAoS0RCX1NUQVRFKERPSU5HX0tHREIpIHx8IEtEQl9TVEFURShET0lOR19LR0RCMikpIHsKLQkvKgotCSAqIFRoaXMgaW50ZWZhY2UgZ2x1ZSB3aGljaCBhbGxvd3Mga2RiIHRvIHRyYW5zaXRpb24gaW4gaW50bwotCSAqIHRoZSBnZGIgc3R1Yi4gIEluIG9yZGVyIHRvIGRvIHRoaXMgdGhlICc/JyBvciAnJyBnZGIgc2VyaWFsCi0JICogcGFja2V0IHJlc3BvbnNlIGlzIHByb2Nlc3NlZCBoZXJlLiAgQW5kIHRoZW4gY29udHJvbCBpcwotCSAqIHBhc3NlZCB0byB0aGUgZ2Ric3R1Yi4KLQkgKi8KLQkJCWlmIChLREJfU1RBVEUoRE9JTkdfS0dEQikpCi0JCQkJZ2Ric3R1Yl9zdGF0ZShrcywgIj8iKTsKLQkJCWVsc2UKLQkJCQlnZGJzdHViX3N0YXRlKGtzLCAiIik7CisJCWlmIChLREJfU1RBVEUoRE9JTkdfS0dEQikpCiAJCQlLREJfU1RBVEVfQ0xFQVIoRE9JTkdfS0dEQik7Ci0JCQlLREJfU1RBVEVfQ0xFQVIoRE9JTkdfS0dEQjIpOwotCQl9CiAJCXJldHVybiBEQkdfUEFTU19FVkVOVDsKIAl9CiAJa2RiX2JwX2luc3RhbGwoa3MtPmxpbnV4X3JlZ3MpOwpAQCAtMTY2LDMgKzE1Nyw3IEBACiAJcmV0dXJuIGtnZGJfaW5mb1trcy0+Y3B1XS5yZXRfc3RhdGU7CiB9CiAKK3ZvaWQga2RiX2dkYl9zdGF0ZV9wYXNzKGNoYXIgKmJ1ZikKK3sKKwlnZGJzdHViX3N0YXRlKGtkYl9rcywgYnVmKTsKK30KZGlmZiAtLWdpdCBhL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX2lvLmMgYi9rZXJuZWwvZGVidWcva2RiL2tkYl9pby5jCmluZGV4IDk2ZmRhYWMuLjQ4MDJlYjUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX2lvLmMKKysrIGIva2VybmVsL2RlYnVnL2tkYi9rZGJfaW8uYwpAQCAtMzEsMTUgKzMxLDIxIEBACiAKIGludCBrZGJfdHJhcF9wcmludGs7CiAKLXN0YXRpYyB2b2lkIGtnZGJfdHJhbnNpdGlvbl9jaGVjayhjaGFyICpidWZmZXIpCitzdGF0aWMgaW50IGtnZGJfdHJhbnNpdGlvbl9jaGVjayhjaGFyICpidWZmZXIpCiB7Ci0JaW50IHNsZW4gPSBzdHJsZW4oYnVmZmVyKTsKLQlpZiAoc3RybmNtcChidWZmZXIsICIkPyMzZiIsIHNsZW4pICE9IDAgJiYKLQkgICAgc3RybmNtcChidWZmZXIsICIkcVN1cHBvcnRlZCMzNyIsIHNsZW4pICE9IDAgJiYKLQkgICAgc3RybmNtcChidWZmZXIsICIrJHFTdXBwb3J0ZWQjMzciLCBzbGVuKSAhPSAwKSB7CisJaWYgKGJ1ZmZlclswXSAhPSAnKycgJiYgYnVmZmVyWzBdICE9ICckJykgewogCQlLREJfU1RBVEVfU0VUKEtHREJfVFJBTlMpOwogCQlrZGJfcHJpbnRmKCIlcyIsIGJ1ZmZlcik7CisJfSBlbHNlIHsKKwkJaW50IHNsZW4gPSBzdHJsZW4oYnVmZmVyKTsKKwkJaWYgKHNsZW4gPiAzICYmIGJ1ZmZlcltzbGVuIC0gM10gPT0gJyMnKSB7CisJCQlrZGJfZ2RiX3N0YXRlX3Bhc3MoYnVmZmVyKTsKKwkJCXN0cmNweShidWZmZXIsICJrZ2RiIik7CisJCQlLREJfU1RBVEVfU0VUKERPSU5HX0tHREIpOworCQkJcmV0dXJuIDE7CisJCX0KIAl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQga2RiX3JlYWRfZ2V0X2tleShjaGFyICpidWZmZXIsIHNpemVfdCBidWZzaXplKQpAQCAtMjUxLDYgKzI1NywxMCBAQAogCWNhc2UgMTM6IC8qIGVudGVyICovCiAJCSpsYXN0Y2hhcisrID0gJ1xuJzsKIAkJKmxhc3RjaGFyKysgPSAnXDAnOworCQlpZiAoIUtEQl9TVEFURShLR0RCX1RSQU5TKSkgeworCQkJS0RCX1NUQVRFX1NFVChLR0RCX1RSQU5TKTsKKwkJCWtkYl9wcmludGYoIiVzIiwgYnVmZmVyKTsKKwkJfQogCQlrZGJfcHJpbnRmKCJcbiIpOwogCQlyZXR1cm4gYnVmZmVyOwogCWNhc2UgNDogLyogRGVsICovCkBAIC0zODIsMjIgKzM5MiwyNiBAQAogCQkJCSAqIHByaW50ZWQgY2hhcmFjdGVycyBpZiB3ZSB0aGluayB0aGF0CiAJCQkJICoga2dkYiBpcyBjb25uZWN0aW5nLCB1bnRpbCB0aGUgY2hlY2sKIAkJCQkgKiBmYWlscyAqLwotCQkJCWlmICghS0RCX1NUQVRFKEtHREJfVFJBTlMpKQotCQkJCQlrZ2RiX3RyYW5zaXRpb25fY2hlY2soYnVmZmVyKTsKLQkJCQllbHNlCisJCQkJaWYgKCFLREJfU1RBVEUoS0dEQl9UUkFOUykpIHsKKwkJCQkJaWYgKGtnZGJfdHJhbnNpdGlvbl9jaGVjayhidWZmZXIpKQorCQkJCQkJcmV0dXJuIGJ1ZmZlcjsKKwkJCQl9IGVsc2UgewogCQkJCQlrZGJfcHJpbnRmKCIlYyIsIGtleSk7CisJCQkJfQogCQkJfQogCQkJLyogU3BlY2lhbCBlc2NhcGUgdG8ga2dkYiAqLwogCQkJaWYgKGxhc3RjaGFyIC0gYnVmZmVyID49IDUgJiYKIAkJCSAgICBzdHJjbXAobGFzdGNoYXIgLSA1LCAiJD8jM2YiKSA9PSAwKSB7CisJCQkJa2RiX2dkYl9zdGF0ZV9wYXNzKGxhc3RjaGFyIC0gNSk7CiAJCQkJc3RyY3B5KGJ1ZmZlciwgImtnZGIiKTsKIAkJCQlLREJfU1RBVEVfU0VUKERPSU5HX0tHREIpOwogCQkJCXJldHVybiBidWZmZXI7CiAJCQl9Ci0JCQlpZiAobGFzdGNoYXIgLSBidWZmZXIgPj0gMTQgJiYKLQkJCSAgICBzdHJjbXAobGFzdGNoYXIgLSAxNCwgIiRxU3VwcG9ydGVkIzM3IikgPT0gMCkgeworCQkJaWYgKGxhc3RjaGFyIC0gYnVmZmVyID49IDExICYmCisJCQkgICAgc3RyY21wKGxhc3RjaGFyIC0gMTEsICIkcVN1cHBvcnRlZCIpID09IDApIHsKKwkJCQlrZGJfZ2RiX3N0YXRlX3Bhc3MobGFzdGNoYXIgLSAxMSk7CiAJCQkJc3RyY3B5KGJ1ZmZlciwgImtnZGIiKTsKLQkJCQlLREJfU1RBVEVfU0VUKERPSU5HX0tHREIyKTsKKwkJCQlLREJfU1RBVEVfU0VUKERPSU5HX0tHREIpOwogCQkJCXJldHVybiBidWZmZXI7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX21haW4uYyBiL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX21haW4uYwppbmRleCBiZTE0Nzc5Li42Mzc4NmU3IDEwMDY0NAotLS0gYS9rZXJuZWwvZGVidWcva2RiL2tkYl9tYWluLmMKKysrIGIva2VybmVsL2RlYnVnL2tkYi9rZGJfbWFpbi5jCkBAIC0xNDUsNyArMTQ1LDYgQEAKICNlbmRpZgogICJSQURJWD0xNiIsCiAgIk1EQ09VTlQ9OCIsCQkJLyogbGluZXMgb2YgbWQgb3V0cHV0ICovCi0gIkJUQVJHUz05IiwJCQkvKiA5IHBvc3NpYmxlIGFyZ3MgaW4gYnQgKi8KICBLREJfUExBVEZPUk1fRU5WLAogICJEVEFCQ09VTlQ9MzAiLAogICJOT1NFQ1Q9MSIsCkBAIC0xNzIsNiArMTcxLDcgQEAKICAoY2hhciAqKTAsCiAgKGNoYXIgKikwLAogIChjaGFyICopMCwKKyAoY2hhciAqKTAsCiB9OwogCiBzdGF0aWMgY29uc3QgaW50IF9fbmVudiA9IChzaXplb2YoX19lbnYpIC8gc2l6ZW9mKGNoYXIgKikpOwpAQCAtMTM4Niw3ICsxMzg2LDcgQEAKIAkJfQogCiAJCWlmIChyZXN1bHQgPT0gS0RCX0NNRF9LR0RCKSB7Ci0JCQlpZiAoIShLREJfU1RBVEUoRE9JTkdfS0dEQikgfHwgS0RCX1NUQVRFKERPSU5HX0tHREIyKSkpCisJCQlpZiAoIUtEQl9TVEFURShET0lOR19LR0RCKSkKIAkJCQlrZGJfcHJpbnRmKCJFbnRlcmluZyBwbGVhc2UgYXR0YWNoIGRlYnVnZ2VyICIKIAkJCQkJICAgIm9yIHVzZSAkRCM0NCsgb3IgJDMjMzNcbiIpOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9rZXJuZWwvZGVidWcva2RiL2tkYl9wcml2YXRlLmggYi9rZXJuZWwvZGVidWcva2RiL2tkYl9wcml2YXRlLmgKaW5kZXggMzVkNjllZC4uZTM4MWQxMCAxMDA2NDQKLS0tIGEva2VybmVsL2RlYnVnL2tkYi9rZGJfcHJpdmF0ZS5oCisrKyBiL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX3ByaXZhdGUuaApAQCAtMjEsNyArMjEsNiBAQAogI2RlZmluZSBLREJfQ01EX1NTCSgtMTAwMykKICNkZWZpbmUgS0RCX0NNRF9TU0IJKC0xMDA0KQogI2RlZmluZSBLREJfQ01EX0tHREIgKC0xMDA1KQotI2RlZmluZSBLREJfQ01EX0tHREIyICgtMTAwNikKIAogLyogSW50ZXJuYWwgZGVidWcgZmxhZ3MgKi8KICNkZWZpbmUgS0RCX0RFQlVHX0ZMQUdfQlAJMHgwMDAyCS8qIEJyZWFrcG9pbnQgc3Vic3lzdGVtIGRlYnVnICovCkBAIC0xNDYsNyArMTQ1LDYgQEAKIAkJCQkJCSAqIGtleWJvYXJkIG9uIHRoaXMgY3B1ICovCiAjZGVmaW5lIEtEQl9TVEFURV9LRVhFQwkJMHgwMDA0MDAwMAkvKiBrZXhlYyBpc3N1ZWQgKi8KICNkZWZpbmUgS0RCX1NUQVRFX0RPSU5HX0tHREIJMHgwMDA4MDAwMAkvKiBrZ2RiIGVudGVyIG5vdyBpc3N1ZWQgKi8KLSNkZWZpbmUgS0RCX1NUQVRFX0RPSU5HX0tHREIyCTB4MDAxMDAwMDAJLyoga2dkYiBlbnRlciBub3cgaXNzdWVkICovCiAjZGVmaW5lIEtEQl9TVEFURV9LR0RCX1RSQU5TCTB4MDAyMDAwMDAJLyogVHJhbnNpdGlvbiB0byBrZ2RiICovCiAjZGVmaW5lIEtEQl9TVEFURV9BUkNICQkweGZmMDAwMDAwCS8qIFJlc2VydmVkIGZvciBhcmNoCiAJCQkJCQkgKiBzcGVjaWZpYyB1c2UgKi8KQEAgLTIxOCw2ICsyMTYsNyBAQAogZXh0ZXJuIHZvaWQga2RiX3NlbmRfc2lnX2luZm8oc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3Qgc2lnaW5mbyAqaW5mbyk7CiBleHRlcm4gdm9pZCBrZGJfbWVtaW5mb19wcm9jX3Nob3codm9pZCk7CiBleHRlcm4gY2hhciAqa2RiX2dldHN0cihjaGFyICosIHNpemVfdCwgY2hhciAqKTsKK2V4dGVybiB2b2lkIGtkYl9nZGJfc3RhdGVfcGFzcyhjaGFyICpidWYpOwogCiAvKiBEZWZpbmVzIGZvciBrZGJfc3ltYm9sX3ByaW50ICovCiAjZGVmaW5lIEtEQl9TUF9TUEFDRUIJMHgwMDAxCQkvKiBTcGFjZSBiZWZvcmUgc3RyaW5nICovCmRpZmYgLS1naXQgYS9rZXJuZWwvZnV0ZXguYyBiL2tlcm5lbC9mdXRleC5jCmluZGV4IDBhMzA4OTcuLjExY2JlMDUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mdXRleC5jCisrKyBiL2tlcm5lbC9mdXRleC5jCkBAIC0yMTgsNiArMjE4LDggQEAKICAqIEB1YWRkcjoJdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBmdXRleAogICogQGZzaGFyZWQ6CTAgZm9yIGEgUFJPQ0VTU19QUklWQVRFIGZ1dGV4LCAxIGZvciBQUk9DRVNTX1NIQVJFRAogICogQGtleToJYWRkcmVzcyB3aGVyZSByZXN1bHQgaXMgc3RvcmVkLgorICogQHJ3OgkJbWFwcGluZyBuZWVkcyB0byBiZSByZWFkL3dyaXRlICh2YWx1ZXM6IFZFUklGWV9SRUFELAorICogICAgICAgICAgICAgIFZFUklGWV9XUklURSkKICAqCiAgKiBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvciAwCiAgKiBUaGUga2V5IHdvcmRzIGFyZSBzdG9yZWQgaW4gKmtleSBvbiBzdWNjZXNzLgpAQCAtMjI5LDEyICsyMzEsMTIgQEAKICAqIGxvY2tfcGFnZSgpIG1pZ2h0IHNsZWVwLCB0aGUgY2FsbGVyIHNob3VsZCBub3QgaG9sZCBhIHNwaW5sb2NrLgogICovCiBzdGF0aWMgaW50Ci1nZXRfZnV0ZXhfa2V5KHUzMiBfX3VzZXIgKnVhZGRyLCBpbnQgZnNoYXJlZCwgdW5pb24gZnV0ZXhfa2V5ICprZXkpCitnZXRfZnV0ZXhfa2V5KHUzMiBfX3VzZXIgKnVhZGRyLCBpbnQgZnNoYXJlZCwgdW5pb24gZnV0ZXhfa2V5ICprZXksIGludCBydykKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZyl1YWRkcjsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwogCXN0cnVjdCBwYWdlICpwYWdlLCAqcGFnZV9oZWFkOwotCWludCBlcnI7CisJaW50IGVyciwgcm8gPSAwOwogCiAJLyoKIAkgKiBUaGUgZnV0ZXggYWRkcmVzcyBtdXN0IGJlICJuYXR1cmFsbHkiIGFsaWduZWQuCkBAIC0yNjIsOCArMjY0LDE4IEBACiAKIGFnYWluOgogCWVyciA9IGdldF91c2VyX3BhZ2VzX2Zhc3QoYWRkcmVzcywgMSwgMSwgJnBhZ2UpOworCS8qCisJICogSWYgd3JpdGUgYWNjZXNzIGlzIG5vdCByZXF1aXJlZCAoZWcuIEZVVEVYX1dBSVQpLCB0cnkKKwkgKiBhbmQgZ2V0IHJlYWQtb25seSBhY2Nlc3MuCisJICovCisJaWYgKGVyciA9PSAtRUZBVUxUICYmIHJ3ID09IFZFUklGWV9SRUFEKSB7CisJCWVyciA9IGdldF91c2VyX3BhZ2VzX2Zhc3QoYWRkcmVzcywgMSwgMCwgJnBhZ2UpOworCQlybyA9IDE7CisJfQogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOworCWVsc2UKKwkJZXJyID0gMDsKIAogI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQogCXBhZ2VfaGVhZCA9IHBhZ2U7CkBAIC0zMDUsNiArMzE3LDEzIEBACiAJaWYgKCFwYWdlX2hlYWQtPm1hcHBpbmcpIHsKIAkJdW5sb2NrX3BhZ2UocGFnZV9oZWFkKTsKIAkJcHV0X3BhZ2UocGFnZV9oZWFkKTsKKwkJLyoKKwkJKiBaRVJPX1BBR0UgcGFnZXMgZG9uJ3QgaGF2ZSBhIG1hcHBpbmcuIEF2b2lkIGEgYnVzeSBsb29wCisJCSogdHJ5aW5nIHRvIGZpbmQgb25lLiBSVyBtYXBwaW5nIHdvdWxkIGhhdmUgQ09XJ2QgKGFuZCB0aHVzCisJCSogaGF2ZSBhIG1hcHBpbmcpIHNvIHRoaXMgcGFnZSBpcyBSTyBhbmQgd29uJ3QgZXZlciBjaGFuZ2UuCisJCSovCisJCWlmICgocGFnZV9oZWFkID09IFpFUk9fUEFHRShhZGRyZXNzKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAkJZ290byBhZ2FpbjsKIAl9CiAKQEAgLTMxNiw2ICszMzUsMTUgQEAKIAkgKiB0aGUgb2JqZWN0IG5vdCB0aGUgcGFydGljdWxhciBwcm9jZXNzLgogCSAqLwogCWlmIChQYWdlQW5vbihwYWdlX2hlYWQpKSB7CisJCS8qCisJCSAqIEEgUk8gYW5vbnltb3VzIHBhZ2Ugd2lsbCBuZXZlciBjaGFuZ2UgYW5kIHRodXMgZG9lc24ndCBtYWtlCisJCSAqIHNlbnNlIGZvciBmdXRleCBvcGVyYXRpb25zLgorCQkgKi8KKwkJaWYgKHJvKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwogCQlrZXktPmJvdGgub2Zmc2V0IHw9IEZVVF9PRkZfTU1TSEFSRUQ7IC8qIHJlZiB0YWtlbiBvbiBtbSAqLwogCQlrZXktPnByaXZhdGUubW0gPSBtbTsKIAkJa2V5LT5wcml2YXRlLmFkZHJlc3MgPSBhZGRyZXNzOwpAQCAtMzI3LDkgKzM1NSwxMCBAQAogCiAJZ2V0X2Z1dGV4X2tleV9yZWZzKGtleSk7CiAKK291dDoKIAl1bmxvY2tfcGFnZShwYWdlX2hlYWQpOwogCXB1dF9wYWdlKHBhZ2VfaGVhZCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHB1dF9mdXRleF9rZXkodW5pb24gZnV0ZXhfa2V5ICprZXkpCkBAIC05NDAsNyArOTY5LDcgQEAKIAlpZiAoIWJpdHNldCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyLCBmbGFncyAmIEZMQUdTX1NIQVJFRCwgJmtleSk7CisJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkciwgZmxhZ3MgJiBGTEFHU19TSEFSRUQsICZrZXksIFZFUklGWV9SRUFEKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlnb3RvIG91dDsKIApAQCAtOTg2LDEwICsxMDE1LDEwIEBACiAJaW50IHJldCwgb3BfcmV0OwogCiByZXRyeToKLQlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyMSwgZmxhZ3MgJiBGTEFHU19TSEFSRUQsICZrZXkxKTsKKwlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyMSwgZmxhZ3MgJiBGTEFHU19TSEFSRUQsICZrZXkxLCBWRVJJRllfUkVBRCk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXQ7Ci0JcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjIsIGZsYWdzICYgRkxBR1NfU0hBUkVELCAma2V5Mik7CisJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjIsIGZsYWdzICYgRkxBR1NfU0hBUkVELCAma2V5MiwgVkVSSUZZX1dSSVRFKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlnb3RvIG91dF9wdXRfa2V5MTsKIApAQCAtMTI0MywxMCArMTI3MiwxMSBAQAogCQlwaV9zdGF0ZSA9IE5VTEw7CiAJfQogCi0JcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjEsIGZsYWdzICYgRkxBR1NfU0hBUkVELCAma2V5MSk7CisJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjEsIGZsYWdzICYgRkxBR1NfU0hBUkVELCAma2V5MSwgVkVSSUZZX1JFQUQpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCWdvdG8gb3V0OwotCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIyLCBmbGFncyAmIEZMQUdTX1NIQVJFRCwgJmtleTIpOworCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIyLCBmbGFncyAmIEZMQUdTX1NIQVJFRCwgJmtleTIsCisJCQkgICAgcmVxdWV1ZV9waSA/IFZFUklGWV9XUklURSA6IFZFUklGWV9SRUFEKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlnb3RvIG91dF9wdXRfa2V5MTsKIApAQCAtMTc5MCw3ICsxODIwLDcgQEAKIAkgKiB3aGlsZSB0aGUgc3lzY2FsbCBleGVjdXRlcy4KIAkgKi8KIHJldHJ5OgotCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZsYWdzICYgRkxBR1NfU0hBUkVELCAmcS0+a2V5KTsKKwlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyLCBmbGFncyAmIEZMQUdTX1NIQVJFRCwgJnEtPmtleSwgVkVSSUZZX1JFQUQpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCXJldHVybiByZXQ7CiAKQEAgLTE5NDEsNyArMTk3MSw3IEBACiAJfQogCiByZXRyeToKLQlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyLCBmbGFncyAmIEZMQUdTX1NIQVJFRCwgJnEua2V5KTsKKwlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyLCBmbGFncyAmIEZMQUdTX1NIQVJFRCwgJnEua2V5LCBWRVJJRllfV1JJVEUpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCWdvdG8gb3V0OwogCkBAIC0yMDYwLDcgKzIwOTAsNyBAQAogCWlmICgodXZhbCAmIEZVVEVYX1RJRF9NQVNLKSAhPSB2cGlkKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkciwgZmxhZ3MgJiBGTEFHU19TSEFSRUQsICZrZXkpOworCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZsYWdzICYgRkxBR1NfU0hBUkVELCAma2V5LCBWRVJJRllfV1JJVEUpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCWdvdG8gb3V0OwogCkBAIC0yMjQ5LDcgKzIyNzksNyBAQAogCWRlYnVnX3J0X211dGV4X2luaXRfd2FpdGVyKCZydF93YWl0ZXIpOwogCXJ0X3dhaXRlci50YXNrID0gTlVMTDsKIAotCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIyLCBmbGFncyAmIEZMQUdTX1NIQVJFRCwgJmtleTIpOworCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIyLCBmbGFncyAmIEZMQUdTX1NIQVJFRCwgJmtleTIsIFZFUklGWV9XUklURSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXQ7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvS2NvbmZpZyBiL2tlcm5lbC9pcnEvS2NvbmZpZwppbmRleCBkMWQwNTFiMy4uNWEzOGJmNCAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9LY29uZmlnCisrKyBiL2tlcm5lbC9pcnEvS2NvbmZpZwpAQCAtNTIsNiArNTIsMTAgQEAKIGNvbmZpZyBHRU5FUklDX0lSUV9DSElQCiAgICAgICAgYm9vbAogCisjIEdlbmVyaWMgaXJxX2RvbWFpbiBodyA8LS0+IGxpbnV4IGlycSBudW1iZXIgdHJhbnNsYXRpb24KK2NvbmZpZyBJUlFfRE9NQUlOCisJYm9vbAorCiAjIFN1cHBvcnQgZm9yY2VkIGlycSB0aHJlYWRpbmcKIGNvbmZpZyBJUlFfRk9SQ0VEX1RIUkVBRElORwogICAgICAgIGJvb2wKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvTWFrZWZpbGUgYi9rZXJuZWwvaXJxL01ha2VmaWxlCmluZGV4IDczMjkwMDUuLmZmZjE3MzggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvTWFrZWZpbGUKKysrIGIva2VybmVsL2lycS9NYWtlZmlsZQpAQCAtMiw2ICsyLDcgQEAKIG9iai15IDo9IGlycWRlc2MubyBoYW5kbGUubyBtYW5hZ2UubyBzcHVyaW91cy5vIHJlc2VuZC5vIGNoaXAubyBkdW1teWNoaXAubyBkZXZyZXMubwogb2JqLSQoQ09ORklHX0dFTkVSSUNfSVJRX0NISVApICs9IGdlbmVyaWMtY2hpcC5vCiBvYmotJChDT05GSUdfR0VORVJJQ19JUlFfUFJPQkUpICs9IGF1dG9wcm9iZS5vCitvYmotJChDT05GSUdfSVJRX0RPTUFJTikgKz0gaXJxZG9tYWluLm8KIG9iai0kKENPTkZJR19QUk9DX0ZTKSArPSBwcm9jLm8KIG9iai0kKENPTkZJR19HRU5FUklDX1BFTkRJTkdfSVJRKSArPSBtaWdyYXRpb24ubwogb2JqLSQoQ09ORklHX1BNX1NMRUVQKSArPSBwbS5vCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2lycWRvbWFpbi5jIGIva2VybmVsL2lycS9pcnFkb21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTgyOGRhCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL2lycS9pcnFkb21haW4uYwpAQCAtMCwwICsxLDE4MCBAQAorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCitzdGF0aWMgTElTVF9IRUFEKGlycV9kb21haW5fbGlzdCk7CitzdGF0aWMgREVGSU5FX01VVEVYKGlycV9kb21haW5fbXV0ZXgpOworCisvKioKKyAqIGlycV9kb21haW5fYWRkKCkgLSBSZWdpc3RlciBhbiBpcnFfZG9tYWluCisgKiBAZG9tYWluOiBwdHIgdG8gaW5pdGlhbGl6ZWQgaXJxX2RvbWFpbiBzdHJ1Y3R1cmUKKyAqCisgKiBSZWdpc3RlcnMgYW4gaXJxX2RvbWFpbiBzdHJ1Y3R1cmUuICBUaGUgaXJxX2RvbWFpbiBtdXN0IGF0IGEgbWluaW11bSBiZQorICogaW5pdGlhbGl6ZWQgd2l0aCBhbiBvcHMgc3RydWN0dXJlIHBvaW50ZXIsIGFuZCBlaXRoZXIgYSAtPnRvX2lycSBob29rIG9yCisgKiBhIHZhbGlkIGlycV9iYXNlIHZhbHVlLiAgRXZlcnl0aGluZyBlbHNlIGlzIG9wdGlvbmFsLgorICovCit2b2lkIGlycV9kb21haW5fYWRkKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4pCit7CisJc3RydWN0IGlycV9kYXRhICpkOworCWludCBod2lycTsKKworCS8qCisJICogVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGlycV9kb21haW4gb3duZXIgaGFzIGFscmVhZHkgYWxsb2NhdGVkCisJICogdGhlIGlycV9kZXNjcy4gIFRoaXMgYmxvY2sgd2lsbCBiZSByZW1vdmVkIHdoZW4gc3VwcG9ydCBmb3IgZHluYW1pYworCSAqIGFsbG9jYXRpb24gb2YgaXJxX2Rlc2NzIGlzIGFkZGVkIHRvIGlycV9kb21haW4uCisJICovCisJZm9yIChod2lycSA9IDA7IGh3aXJxIDwgZG9tYWluLT5ucl9pcnE7IGh3aXJxKyspIHsKKwkJZCA9IGlycV9nZXRfaXJxX2RhdGEoaXJxX2RvbWFpbl90b19pcnEoZG9tYWluLCBod2lycSkpOworCQlpZiAoZCB8fCBkLT5kb21haW4pIHsKKwkJCS8qIHRoaW5ncyBhcmUgYnJva2VuOyBqdXN0IHJlcG9ydCwgZG9uJ3QgY2xlYW4gdXAgKi8KKwkJCVdBUk4oMSwgImVycm9yOiBpcnFfZGVzYyBhbHJlYWR5IGFzc2lnbmVkIHRvIGEgZG9tYWluIik7CisJCQlyZXR1cm47CisJCX0KKwkJZC0+ZG9tYWluID0gZG9tYWluOworCQlkLT5od2lycSA9IGh3aXJxOworCX0KKworCW11dGV4X2xvY2soJmlycV9kb21haW5fbXV0ZXgpOworCWxpc3RfYWRkKCZkb21haW4tPmxpc3QsICZpcnFfZG9tYWluX2xpc3QpOworCW11dGV4X3VubG9jaygmaXJxX2RvbWFpbl9tdXRleCk7Cit9CisKKy8qKgorICogaXJxX2RvbWFpbl9kZWwoKSAtIFVucmVnaXN0ZXIgYW4gaXJxX2RvbWFpbgorICogQGRvbWFpbjogcHRyIHRvIHJlZ2lzdGVyZWQgaXJxX2RvbWFpbi4KKyAqLwordm9pZCBpcnFfZG9tYWluX2RlbChzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluKQoreworCXN0cnVjdCBpcnFfZGF0YSAqZDsKKwlpbnQgaHdpcnE7CisKKwltdXRleF9sb2NrKCZpcnFfZG9tYWluX211dGV4KTsKKwlsaXN0X2RlbCgmZG9tYWluLT5saXN0KTsKKwltdXRleF91bmxvY2soJmlycV9kb21haW5fbXV0ZXgpOworCisJLyogQ2xlYXIgdGhlIGlycV9kb21haW4gYXNzaWdubWVudHMgKi8KKwlmb3IgKGh3aXJxID0gMDsgaHdpcnEgPCBkb21haW4tPm5yX2lycTsgaHdpcnErKykgeworCQlkID0gaXJxX2dldF9pcnFfZGF0YShpcnFfZG9tYWluX3RvX2lycShkb21haW4sIGh3aXJxKSk7CisJCWQtPmRvbWFpbiA9IE5VTEw7CisJfQorfQorCisjaWYgZGVmaW5lZChDT05GSUdfT0ZfSVJRKQorLyoqCisgKiBpcnFfY3JlYXRlX29mX21hcHBpbmcoKSAtIE1hcCBhIGxpbnV4IGlycSBudW1iZXIgZnJvbSBhIERUIGludGVycnVwdCBzcGVjCisgKgorICogVXNlZCBieSB0aGUgZGV2aWNlIHRyZWUgaW50ZXJydXB0IG1hcHBpbmcgY29kZSB0byB0cmFuc2xhdGUgYSBkZXZpY2UgdHJlZQorICogaW50ZXJydXB0IHNwZWNpZmllciB0byBhIHZhbGlkIGxpbnV4IGlycSBudW1iZXIuICBSZXR1cm5zIGVpdGhlciBhIHZhbGlkCisgKiBsaW51eCBJUlEgbnVtYmVyIG9yIDAuCisgKgorICogV2hlbiB0aGUgY2FsbGVyIG5vIGxvbmdlciBuZWVkIHRoZSBpcnEgbnVtYmVyIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gaXQKKyAqIHNob3VsZCBhcnJhbmdlIHRvIGNhbGwgaXJxX2Rpc3Bvc2VfbWFwcGluZygpLgorICovCit1bnNpZ25lZCBpbnQgaXJxX2NyZWF0ZV9vZl9tYXBwaW5nKHN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbGxlciwKKwkJCQkgICBjb25zdCB1MzIgKmludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplKQoreworCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW47CisJdW5zaWduZWQgbG9uZyBod2lycTsKKwl1bnNpZ25lZCBpbnQgaXJxLCB0eXBlOworCWludCByYyA9IC1FSU5WQUw7CisKKwkvKiBGaW5kIGEgZG9tYWluIHdoaWNoIGNhbiB0cmFuc2xhdGUgdGhlIGlycSBzcGVjICovCisJbXV0ZXhfbG9jaygmaXJxX2RvbWFpbl9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkb21haW4sICZpcnFfZG9tYWluX2xpc3QsIGxpc3QpIHsKKwkJaWYgKCFkb21haW4tPm9wcy0+ZHRfdHJhbnNsYXRlKQorCQkJY29udGludWU7CisJCXJjID0gZG9tYWluLT5vcHMtPmR0X3RyYW5zbGF0ZShkb21haW4sIGNvbnRyb2xsZXIsCisJCQkJCWludHNwZWMsIGludHNpemUsICZod2lycSwgJnR5cGUpOworCQlpZiAocmMgPT0gMCkKKwkJCWJyZWFrOworCX0KKwltdXRleF91bmxvY2soJmlycV9kb21haW5fbXV0ZXgpOworCisJaWYgKHJjICE9IDApCisJCXJldHVybiAwOworCisJaXJxID0gaXJxX2RvbWFpbl90b19pcnEoZG9tYWluLCBod2lycSk7CisJaWYgKHR5cGUgIT0gSVJRX1RZUEVfTk9ORSkKKwkJaXJxX3NldF9pcnFfdHlwZShpcnEsIHR5cGUpOworCXByX2RlYnVnKCIlczogbWFwcGVkIGh3aXJxPSVpIHRvIGlycT0laSwgZmxhZ3M9JXhcbiIsCisJCSBjb250cm9sbGVyLT5mdWxsX25hbWUsIChpbnQpaHdpcnEsIGlycSwgdHlwZSk7CisJcmV0dXJuIGlycTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlycV9jcmVhdGVfb2ZfbWFwcGluZyk7CisKKy8qKgorICogaXJxX2Rpc3Bvc2VfbWFwcGluZygpIC0gRGlzY2FyZCBhIG1hcHBpbmcgY3JlYXRlZCBieSBpcnFfY3JlYXRlX29mX21hcHBpbmcoKQorICogQGlycTogbGludXggaXJxIG51bWJlciB0byBiZSBkaXNjYXJkZWQKKyAqCisgKiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gaW5kaWNhdGVzIHRoZSBjYWxsZXIgbm8gbG9uZ2VyIG5lZWRzIGEgcmVmZXJlbmNlIHRvCisgKiB0aGUgbGludXggaXJxIG51bWJlciByZXR1cm5lZCBieSBhIHByaW9yIGNhbGwgdG8gaXJxX2NyZWF0ZV9vZl9tYXBwaW5nKCkuCisgKi8KK3ZvaWQgaXJxX2Rpc3Bvc2VfbWFwcGluZyh1bnNpZ25lZCBpbnQgaXJxKQoreworCS8qCisJICogbm90aGluZyB5ZXQ7IHdpbGwgYmUgZmlsbGVkIHdoZW4gc3VwcG9ydCBmb3IgZHluYW1pYyBhbGxvY2F0aW9uIG9mCisJICogaXJxX2Rlc2NzIGlzIGFkZGVkIHRvIGlycV9kb21haW4KKwkgKi8KK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlycV9kaXNwb3NlX21hcHBpbmcpOworCitpbnQgaXJxX2RvbWFpbl9zaW1wbGVfZHRfdHJhbnNsYXRlKHN0cnVjdCBpcnFfZG9tYWluICpkLAorCQkJICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbGxlciwKKwkJCSAgICBjb25zdCB1MzIgKmludHNwZWMsIHVuc2lnbmVkIGludCBpbnRzaXplLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgKm91dF9od2lycSwgdW5zaWduZWQgaW50ICpvdXRfdHlwZSkKK3sKKwlpZiAoZC0+b2Zfbm9kZSAhPSBjb250cm9sbGVyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaW50c2l6ZSA8IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJKm91dF9od2lycSA9IGludHNwZWNbMF07CisJKm91dF90eXBlID0gSVJRX1RZUEVfTk9ORTsKKwlpZiAoaW50c2l6ZSA+IDEpCisJCSpvdXRfdHlwZSA9IGludHNwZWNbMV0gJiBJUlFfVFlQRV9TRU5TRV9NQVNLOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgaXJxX2RvbWFpbl9zaW1wbGVfb3BzID0geworCS5kdF90cmFuc2xhdGUgPSBpcnFfZG9tYWluX3NpbXBsZV9kdF90cmFuc2xhdGUsCit9OworRVhQT1JUX1NZTUJPTF9HUEwoaXJxX2RvbWFpbl9zaW1wbGVfb3BzKTsKKworLyoqCisgKiBpcnFfZG9tYWluX2NyZWF0ZV9zaW1wbGUoKSAtIFNldCB1cCBhICdzaW1wbGUnIHRyYW5zbGF0aW9uIHJhbmdlCisgKi8KK3ZvaWQgaXJxX2RvbWFpbl9hZGRfc2ltcGxlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbGxlciwgaW50IGlycV9iYXNlKQoreworCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW47CisKKwlkb21haW4gPSBremFsbG9jKHNpemVvZigqZG9tYWluKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkb21haW4pIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuOworCX0KKworCWRvbWFpbi0+aXJxX2Jhc2UgPSBpcnFfYmFzZTsKKwlkb21haW4tPm9mX25vZGUgPSBvZl9ub2RlX2dldChjb250cm9sbGVyKTsKKwlkb21haW4tPm9wcyA9ICZpcnFfZG9tYWluX3NpbXBsZV9vcHM7CisJaXJxX2RvbWFpbl9hZGQoZG9tYWluKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlycV9kb21haW5fYWRkX3NpbXBsZSk7CisKK3ZvaWQgaXJxX2RvbWFpbl9nZW5lcmF0ZV9zaW1wbGUoY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gsCisJCQkJdTY0IHBoeXNfYmFzZSwgdW5zaWduZWQgaW50IGlycV9zdGFydCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJcHJfaW5mbygibG9va2luZyBmb3IgcGh5c19iYXNlPSVsbHgsIGlycV9zdGFydD0laVxuIiwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcGh5c19iYXNlLCAoaW50KSBpcnFfc3RhcnQpOworCW5vZGUgPSBvZl9maW5kX21hdGNoaW5nX25vZGVfYnlfYWRkcmVzcyhOVUxMLCBtYXRjaCwgcGh5c19iYXNlKTsKKwlpZiAobm9kZSkKKwkJaXJxX2RvbWFpbl9hZGRfc2ltcGxlKG5vZGUsIGlycV9zdGFydCk7CisJZWxzZQorCQlwcl9pbmZvKCJubyBub2RlIGZvdW5kXG4iKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlycV9kb21haW5fZ2VuZXJhdGVfc2ltcGxlKTsKKyNlbmRpZiAvKiBDT05GSUdfT0ZfSVJRICovCmRpZmYgLS1naXQgYS9rZXJuZWwva21vZC5jIGIva2VybmVsL2ttb2QuYwppbmRleCA0NzYxM2RmLi5kZGM3NjQ0IDEwMDY0NAotLS0gYS9rZXJuZWwva21vZC5jCisrKyBiL2tlcm5lbC9rbW9kLmMKQEAgLTI3NCw3ICsyNzQsNyBAQAogICogKHVzZWQgZm9yIHByZXZlbnRpbmcgdXNlciBsYW5kIHByb2Nlc3NlcyBmcm9tIGJlaW5nIGNyZWF0ZWQgYWZ0ZXIgdGhlIHVzZXIKICAqIGxhbmQgaGFzIGJlZW4gZnJvemVuIGR1cmluZyBhIHN5c3RlbS13aWRlIGhpYmVybmF0aW9uIG9yIHN1c3BlbmQgb3BlcmF0aW9uKS4KICAqLwotc3RhdGljIGludCB1c2VybW9kZWhlbHBlcl9kaXNhYmxlZDsKK3N0YXRpYyBpbnQgdXNlcm1vZGVoZWxwZXJfZGlzYWJsZWQgPSAxOwogCiAvKiBOdW1iZXIgb2YgaGVscGVycyBydW5uaW5nICovCiBzdGF0aWMgYXRvbWljX3QgcnVubmluZ19oZWxwZXJzID0gQVRPTUlDX0lOSVQoMCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2RlcC5jIGIva2VybmVsL2xvY2tkZXAuYwppbmRleCAzOTU2ZjUxLi44YzI0Mjk0IDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2RlcC5jCisrKyBiL2tlcm5lbC9sb2NrZGVwLmMKQEAgLTI0NjgsNyArMjQ2OCw3IEBACiAKIAkJQlVHX09OKHVzYWdlX2JpdCA+PSBMT0NLX1VTQUdFX1NUQVRFUyk7CiAKLQkJaWYgKGhsb2NrX2NsYXNzKGhsb2NrKS0+a2V5ID09ICZfX2xvY2tkZXBfbm9fdmFsaWRhdGVfXykKKwkJaWYgKGhsb2NrX2NsYXNzKGhsb2NrKS0+a2V5ID09IF9fbG9ja2RlcF9ub192YWxpZGF0ZV9fLnN1YmtleXMpCiAJCQljb250aW51ZTsKIAogCQlpZiAoIW1hcmtfbG9jayhjdXJyLCBobG9jaywgdXNhZ2VfYml0KSkKQEAgLTI0ODUsMjMgKzI0ODUsOSBAQAogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyciA9IGN1cnJlbnQ7CiAKLQlpZiAoREVCVUdfTE9DS1NfV0FSTl9PTih1bmxpa2VseShlYXJseV9ib290X2lycXNfZGlzYWJsZWQpKSkKLQkJcmV0dXJuOwotCi0JaWYgKHVubGlrZWx5KGN1cnItPmhhcmRpcnFzX2VuYWJsZWQpKSB7Ci0JCS8qCi0JCSAqIE5laXRoZXIgaXJxIG5vciBwcmVlbXB0aW9uIGFyZSBkaXNhYmxlZCBoZXJlCi0JCSAqIHNvIHRoaXMgaXMgcmFjeSBieSBuYXR1cmUgYnV0IGxvc2luZyBvbmUgaGl0Ci0JCSAqIGluIGEgc3RhdCBpcyBub3QgYSBiaWcgZGVhbC4KLQkJICovCi0JCV9fZGVidWdfYXRvbWljX2luYyhyZWR1bmRhbnRfaGFyZGlycXNfb24pOwotCQlyZXR1cm47Ci0JfQogCS8qIHdlJ2xsIGRvIGFuIE9GRiAtPiBPTiB0cmFuc2l0aW9uOiAqLwogCWN1cnItPmhhcmRpcnFzX2VuYWJsZWQgPSAxOwogCi0JaWYgKERFQlVHX0xPQ0tTX1dBUk5fT04oY3VycmVudC0+aGFyZGlycV9jb250ZXh0KSkKLQkJcmV0dXJuOwogCS8qCiAJICogV2UgYXJlIGdvaW5nIHRvIHR1cm4gaGFyZGlycXMgb24sIHNvIHNldCB0aGUKIAkgKiB1c2FnZSBiaXQgZm9yIGFsbCBoZWxkIGxvY2tzOgpAQCAtMjUyOSw5ICsyNTE1LDI1IEBACiAJaWYgKHVubGlrZWx5KCFkZWJ1Z19sb2NrcyB8fCBjdXJyZW50LT5sb2NrZGVwX3JlY3Vyc2lvbikpCiAJCXJldHVybjsKIAorCWlmICh1bmxpa2VseShjdXJyZW50LT5oYXJkaXJxc19lbmFibGVkKSkgeworCQkvKgorCQkgKiBOZWl0aGVyIGlycSBub3IgcHJlZW1wdGlvbiBhcmUgZGlzYWJsZWQgaGVyZQorCQkgKiBzbyB0aGlzIGlzIHJhY3kgYnkgbmF0dXJlIGJ1dCBsb3Npbmcgb25lIGhpdAorCQkgKiBpbiBhIHN0YXQgaXMgbm90IGEgYmlnIGRlYWwuCisJCSAqLworCQlfX2RlYnVnX2F0b21pY19pbmMocmVkdW5kYW50X2hhcmRpcnFzX29uKTsKKwkJcmV0dXJuOworCX0KKwogCWlmIChERUJVR19MT0NLU19XQVJOX09OKCFpcnFzX2Rpc2FibGVkKCkpKQogCQlyZXR1cm47CiAKKwlpZiAoREVCVUdfTE9DS1NfV0FSTl9PTih1bmxpa2VseShlYXJseV9ib290X2lycXNfZGlzYWJsZWQpKSkKKwkJcmV0dXJuOworCisJaWYgKERFQlVHX0xPQ0tTX1dBUk5fT04oY3VycmVudC0+aGFyZGlycV9jb250ZXh0KSkKKwkJcmV0dXJuOworCiAJY3VycmVudC0+bG9ja2RlcF9yZWN1cnNpb24gPSAxOwogCV9fdHJhY2VfaGFyZGlycXNfb25fY2FsbGVyKGlwKTsKIAljdXJyZW50LT5sb2NrZGVwX3JlY3Vyc2lvbiA9IDA7CkBAIC0yODcyLDEwICsyODc0LDcgQEAKIHZvaWQgbG9ja2RlcF9pbml0X21hcChzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssIGNvbnN0IGNoYXIgKm5hbWUsCiAJCSAgICAgIHN0cnVjdCBsb2NrX2NsYXNzX2tleSAqa2V5LCBpbnQgc3ViY2xhc3MpCiB7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJfTE9DS0RFUF9DQUNISU5HX0NMQVNTRVM7IGkrKykKLQkJbG9jay0+Y2xhc3NfY2FjaGVbaV0gPSBOVUxMOworCW1lbXNldChsb2NrLCAwLCBzaXplb2YoKmxvY2spKTsKIAogI2lmZGVmIENPTkZJR19MT0NLX1NUQVQKIAlsb2NrLT5jcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Jlc291cmNlLmMgYi9rZXJuZWwvcmVzb3VyY2UuYwppbmRleCAzZmY0MDE3Li4zYjNjZWRjIDEwMDY0NAotLS0gYS9rZXJuZWwvcmVzb3VyY2UuYworKysgYi9rZXJuZWwvcmVzb3VyY2UuYwpAQCAtNTUzLDYgKzU1MywyNyBAQAogCiBFWFBPUlRfU1lNQk9MKGFsbG9jYXRlX3Jlc291cmNlKTsKIAorLyoqCisgKiBsb29rdXBfcmVzb3VyY2UgLSBmaW5kIGFuIGV4aXN0aW5nIHJlc291cmNlIGJ5IGEgcmVzb3VyY2Ugc3RhcnQgYWRkcmVzcworICogQHJvb3Q6IHJvb3QgcmVzb3VyY2UgZGVzY3JpcHRvcgorICogQHN0YXJ0OiByZXNvdXJjZSBzdGFydCBhZGRyZXNzCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGlmIGZvdW5kLCBOVUxMIG90aGVyd2lzZQorICovCitzdHJ1Y3QgcmVzb3VyY2UgKmxvb2t1cF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QsIHJlc291cmNlX3NpemVfdCBzdGFydCkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCXJlYWRfbG9jaygmcmVzb3VyY2VfbG9jayk7CisJZm9yIChyZXMgPSByb290LT5jaGlsZDsgcmVzOyByZXMgPSByZXMtPnNpYmxpbmcpIHsKKwkJaWYgKHJlcy0+c3RhcnQgPT0gc3RhcnQpCisJCQlicmVhazsKKwl9CisJcmVhZF91bmxvY2soJnJlc291cmNlX2xvY2spOworCisJcmV0dXJuIHJlczsKK30KKwogLyoKICAqIEluc2VydCBhIHJlc291cmNlIGludG8gdGhlIHJlc291cmNlIHRyZWUuIElmIHN1Y2Nlc3NmdWwsIHJldHVybiBOVUxMLAogICogb3RoZXJ3aXNlIHJldHVybiB0aGUgY29uZmxpY3RpbmcgcmVzb3VyY2UgKGNvbXBhcmUgdG8gX19yZXF1ZXN0X3Jlc291cmNlKCkpCmRpZmYgLS1naXQgYS9rZXJuZWwvdGFza3N0YXRzLmMgYi9rZXJuZWwvdGFza3N0YXRzLmMKaW5kZXggZDFkYjI4OC4uZTE5Y2UxNCAxMDA2NDQKLS0tIGEva2VybmVsL3Rhc2tzdGF0cy5jCisrKyBiL2tlcm5lbC90YXNrc3RhdHMuYwpAQCAtMjkxLDMwICsyOTEsMjggQEAKIAlpZiAoIWNwdW1hc2tfc3Vic2V0KG1hc2ssIGNwdV9wb3NzaWJsZV9tYXNrKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzID0gTlVMTDsKIAlpZiAoaXNhZGQgPT0gUkVHSVNURVIpIHsKIAkJZm9yX2VhY2hfY3B1KGNwdSwgbWFzaykgewotCQkJaWYgKCFzKQotCQkJCXMgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBsaXN0ZW5lciksCi0JCQkJCQkgR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoY3B1KSk7CisJCQlzID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgbGlzdGVuZXIpLAorCQkJCQlHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShjcHUpKTsKIAkJCWlmICghcykKIAkJCQlnb3RvIGNsZWFudXA7CisKIAkJCXMtPnBpZCA9IHBpZDsKLQkJCUlOSVRfTElTVF9IRUFEKCZzLT5saXN0KTsKIAkJCXMtPnZhbGlkID0gMTsKIAogCQkJbGlzdGVuZXJzID0gJnBlcl9jcHUobGlzdGVuZXJfYXJyYXksIGNwdSk7CiAJCQlkb3duX3dyaXRlKCZsaXN0ZW5lcnMtPnNlbSk7Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoczIsIHRtcCwgJmxpc3RlbmVycy0+bGlzdCwgbGlzdCkgewotCQkJCWlmIChzMi0+cGlkID09IHBpZCkKLQkJCQkJZ290byBuZXh0X2NwdTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoczIsICZsaXN0ZW5lcnMtPmxpc3QsIGxpc3QpIHsKKwkJCQlpZiAoczItPnBpZCA9PSBwaWQgJiYgczItPnZhbGlkKQorCQkJCQlnb3RvIGV4aXN0czsKIAkJCX0KIAkJCWxpc3RfYWRkKCZzLT5saXN0LCAmbGlzdGVuZXJzLT5saXN0KTsKIAkJCXMgPSBOVUxMOwotbmV4dF9jcHU6CitleGlzdHM6CiAJCQl1cF93cml0ZSgmbGlzdGVuZXJzLT5zZW0pOworCQkJa2ZyZWUocyk7IC8qIG5vcCBpZiBOVUxMICovCiAJCX0KLQkJa2ZyZWUocyk7CiAJCXJldHVybiAwOwogCX0KIApkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcgYi9saWIvS2NvbmZpZwppbmRleCAzMmYzZTVhLi42YzY5NWZmIDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZworKysgYi9saWIvS2NvbmZpZwpAQCAtMjc2LDQgKzI3Niw3IEBACiAJICBzbyBpdHMgY2FsY3VsYXRpb25zIGFyZSBpbiBmaXhlZCBwb2ludC4gTW9kdWxlcyBjYW4gc2VsZWN0IHRoaXMKIAkgIHdoZW4gdGhleSByZXF1aXJlIHRoaXMgZnVuY3Rpb24uIE1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjb3JkaWMuCiAKK2NvbmZpZyBMTElTVAorCWJvb2wKKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvbGliL01ha2VmaWxlIGIvbGliL01ha2VmaWxlCmluZGV4IDg5MmY0ZTIuLjY0NTdhZjQgMTAwNjQ0Ci0tLSBhL2xpYi9NYWtlZmlsZQorKysgYi9saWIvTWFrZWZpbGUKQEAgLTExNSw2ICsxMTUsOCBAQAogCiBvYmotJChDT05GSUdfQ09SRElDKSArPSBjb3JkaWMubwogCitvYmotJChDT05GSUdfTExJU1QpICs9IGxsaXN0Lm8KKwogaG9zdHByb2dzLXkJOj0gZ2VuX2NyYzMydGFibGUKIGNsZWFuLWZpbGVzCTo9IGNyYzMydGFibGUuaAogCmRpZmYgLS1naXQgYS9saWIvYml0bWFwLmMgYi9saWIvYml0bWFwLmMKaW5kZXggMzdlZjRiMC4uMmY0NDEyZSAxMDA2NDQKLS0tIGEvbGliL2JpdG1hcC5jCisrKyBiL2xpYi9iaXRtYXAuYwpAQCAtMjcxLDggKzI3MSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKF9fYml0bWFwX3dlaWdodCk7CiAKLSNkZWZpbmUgQklUTUFQX0ZJUlNUX1dPUkRfTUFTSyhzdGFydCkgKH4wVUwgPDwgKChzdGFydCkgJSBCSVRTX1BFUl9MT05HKSkKLQogdm9pZCBiaXRtYXBfc2V0KHVuc2lnbmVkIGxvbmcgKm1hcCwgaW50IHN0YXJ0LCBpbnQgbnIpCiB7CiAJdW5zaWduZWQgbG9uZyAqcCA9IG1hcCArIEJJVF9XT1JEKHN0YXJ0KTsKZGlmZiAtLWdpdCBhL2xpYi9mYXVsdC1pbmplY3QuYyBiL2xpYi9mYXVsdC1pbmplY3QuYwppbmRleCAyNTc3YjEyLi5mMTkzYjc3IDEwMDY0NAotLS0gYS9saWIvZmF1bHQtaW5qZWN0LmMKKysrIGIvbGliL2ZhdWx0LWluamVjdC5jCkBAIC0xOTcsMjEgKzE5NywxNSBAQAogCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgdmFsdWUsICZmb3BzX2F0b21pY190KTsKIH0KIAotdm9pZCBjbGVhbnVwX2ZhdWx0X2F0dHJfZGVudHJpZXMoc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIpCi17Ci0JZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGF0dHItPmRpcik7Ci19Ci0KLWludCBpbml0X2ZhdWx0X2F0dHJfZGVudHJpZXMoc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIsIGNvbnN0IGNoYXIgKm5hbWUpCitzdHJ1Y3QgZGVudHJ5ICpmYXVsdF9jcmVhdGVfZGVidWdmc19hdHRyKGNvbnN0IGNoYXIgKm5hbWUsCisJCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHN0cnVjdCBmYXVsdF9hdHRyICphdHRyKQogewogCW1vZGVfdCBtb2RlID0gU19JRlJFRyB8IFNfSVJVU1IgfCBTX0lXVVNSOwogCXN0cnVjdCBkZW50cnkgKmRpcjsKIAotCWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihuYW1lLCBOVUxMKTsKKwlkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIobmFtZSwgcGFyZW50KTsKIAlpZiAoIWRpcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlhdHRyLT5kaXIgPSBkaXI7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV91bCgicHJvYmFiaWxpdHkiLCBtb2RlLCBkaXIsICZhdHRyLT5wcm9iYWJpbGl0eSkpCiAJCWdvdG8gZmFpbDsKQEAgLTI0MywxMSArMjM3LDExIEBACiAKICNlbmRpZiAvKiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX1NUQUNLVFJBQ0VfRklMVEVSICovCiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZGlyOwogZmFpbDoKLQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoYXR0ci0+ZGlyKTsKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGlyKTsKIAotCXJldHVybiAtRU5PTUVNOworCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogfQogCiAjZW5kaWYgLyogQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUyAqLwpkaWZmIC0tZ2l0IGEvbGliL2dlbmFsbG9jLmMgYi9saWIvZ2VuYWxsb2MuYwppbmRleCA1NzdkZGY4Li5mMzUyY2M0IDEwMDY0NAotLS0gYS9saWIvZ2VuYWxsb2MuYworKysgYi9saWIvZ2VuYWxsb2MuYwpAQCAtMSw4ICsxLDI2IEBACiAvKgotICogQmFzaWMgZ2VuZXJhbCBwdXJwb3NlIGFsbG9jYXRvciBmb3IgbWFuYWdpbmcgc3BlY2lhbCBwdXJwb3NlIG1lbW9yeQotICogbm90IG1hbmFnZWQgYnkgdGhlIHJlZ3VsYXIga21hbGxvYy9rZnJlZSBpbnRlcmZhY2UuCi0gKiBVc2VzIGZvciB0aGlzIGluY2x1ZGVzIG9uLWRldmljZSBzcGVjaWFsIG1lbW9yeSwgdW5jYWNoZWQgbWVtb3J5Ci0gKiBldGMuCisgKiBCYXNpYyBnZW5lcmFsIHB1cnBvc2UgYWxsb2NhdG9yIGZvciBtYW5hZ2luZyBzcGVjaWFsIHB1cnBvc2UKKyAqIG1lbW9yeSwgZm9yIGV4YW1wbGUsIG1lbW9yeSB0aGF0IGlzIG5vdCBtYW5hZ2VkIGJ5IHRoZSByZWd1bGFyCisgKiBrbWFsbG9jL2tmcmVlIGludGVyZmFjZS4gIFVzZXMgZm9yIHRoaXMgaW5jbHVkZXMgb24tZGV2aWNlIHNwZWNpYWwKKyAqIG1lbW9yeSwgdW5jYWNoZWQgbWVtb3J5IGV0Yy4KKyAqCisgKiBJdCBpcyBzYWZlIHRvIHVzZSB0aGUgYWxsb2NhdG9yIGluIE5NSSBoYW5kbGVycyBhbmQgb3RoZXIgc3BlY2lhbAorICogdW5ibG9ja2FibGUgY29udGV4dHMgdGhhdCBjb3VsZCBvdGhlcndpc2UgZGVhZGxvY2sgb24gbG9ja3MuICBUaGlzCisgKiBpcyBpbXBsZW1lbnRlZCBieSB1c2luZyBhdG9taWMgb3BlcmF0aW9ucyBhbmQgcmV0cmllcyBvbiBhbnkKKyAqIGNvbmZsaWN0cy4gIFRoZSBkaXNhZHZhbnRhZ2UgaXMgdGhhdCB0aGVyZSBtYXkgYmUgbGl2ZWxvY2tzIGluCisgKiBleHRyZW1lIGNhc2VzLiAgRm9yIGJldHRlciBzY2FsYWJpbGl0eSwgb25lIGFsbG9jYXRvciBjYW4gYmUgdXNlZAorICogZm9yIGVhY2ggQ1BVLgorICoKKyAqIFRoZSBsb2NrbGVzcyBvcGVyYXRpb24gb25seSB3b3JrcyBpZiB0aGVyZSBpcyBlbm91Z2ggbWVtb3J5CisgKiBhdmFpbGFibGUuICBJZiBuZXcgbWVtb3J5IGlzIGFkZGVkIHRvIHRoZSBwb29sIGEgbG9jayBoYXMgdG8gYmUKKyAqIHN0aWxsIHRha2VuLiAgU28gYW55IHVzZXIgcmVseWluZyBvbiBsb2NrbGVzc25lc3MgaGFzIHRvIGVuc3VyZQorICogdGhhdCBzdWZmaWNpZW50IG1lbW9yeSBpcyBwcmVhbGxvY2F0ZWQuCisgKgorICogVGhlIGJhc2ljIGF0b21pYyBvcGVyYXRpb24gb2YgdGhpcyBhbGxvY2F0b3IgaXMgY21weGNoZyBvbiBsb25nLgorICogT24gYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhdmUgTk1JLXNhZmUgY21weGNoZyBpbXBsZW1lbnRhdGlvbiwKKyAqIHRoZSBhbGxvY2F0b3IgY2FuIE5PVCBiZSB1c2VkIGluIE5NSSBoYW5kbGVyLiAgU28gY29kZSB1c2VzIHRoZQorICogYWxsb2NhdG9yIGluIE5NSSBoYW5kbGVyIHNob3VsZCBkZXBlbmQgb24KKyAqIENPTkZJR19BUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRy4KICAqCiAgKiBDb3B5cmlnaHQgMjAwNSAoQykgSmVzIFNvcmVuc2VuIDxqZXNAdHJhaW5lZC1tb25rZXkub3JnPgogICoKQEAgLTEzLDggKzMxLDEwOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2VuYWxsb2MuaD4KIAorc3RhdGljIGludCBzZXRfYml0c19sbCh1bnNpZ25lZCBsb25nICphZGRyLCB1bnNpZ25lZCBsb25nIG1hc2tfdG9fc2V0KQoreworCXVuc2lnbmVkIGxvbmcgdmFsLCBudmFsOworCisJbnZhbCA9ICphZGRyOworCWRvIHsKKwkJdmFsID0gbnZhbDsKKwkJaWYgKHZhbCAmIG1hc2tfdG9fc2V0KQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJY3B1X3JlbGF4KCk7CisJfSB3aGlsZSAoKG52YWwgPSBjbXB4Y2hnKGFkZHIsIHZhbCwgdmFsIHwgbWFza190b19zZXQpKSAhPSB2YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2xlYXJfYml0c19sbCh1bnNpZ25lZCBsb25nICphZGRyLCB1bnNpZ25lZCBsb25nIG1hc2tfdG9fY2xlYXIpCit7CisJdW5zaWduZWQgbG9uZyB2YWwsIG52YWw7CisKKwludmFsID0gKmFkZHI7CisJZG8geworCQl2YWwgPSBudmFsOworCQlpZiAoKHZhbCAmIG1hc2tfdG9fY2xlYXIpICE9IG1hc2tfdG9fY2xlYXIpCisJCQlyZXR1cm4gLUVCVVNZOworCQljcHVfcmVsYXgoKTsKKwl9IHdoaWxlICgobnZhbCA9IGNtcHhjaGcoYWRkciwgdmFsLCB2YWwgJiB+bWFza190b19jbGVhcikpICE9IHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGJpdG1hcF9zZXRfbGwgLSBzZXQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYml0cyBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uCisgKiBAbWFwOiBwb2ludGVyIHRvIGEgYml0bWFwCisgKiBAc3RhcnQ6IGEgYml0IHBvc2l0aW9uIGluIEBtYXAKKyAqIEBucjogbnVtYmVyIG9mIGJpdHMgdG8gc2V0CisgKgorICogU2V0IEBuciBiaXRzIHN0YXJ0IGZyb20gQHN0YXJ0IGluIEBtYXAgbG9jay1sZXNzbHkuIFNldmVyYWwgdXNlcnMKKyAqIGNhbiBzZXQvY2xlYXIgdGhlIHNhbWUgYml0bWFwIHNpbXVsdGFuZW91c2x5IHdpdGhvdXQgbG9jay4gSWYgdHdvCisgKiB1c2VycyBzZXQgdGhlIHNhbWUgYml0LCBvbmUgdXNlciB3aWxsIHJldHVybiByZW1haW4gYml0cywgb3RoZXJ3aXNlCisgKiByZXR1cm4gMC4KKyAqLworc3RhdGljIGludCBiaXRtYXBfc2V0X2xsKHVuc2lnbmVkIGxvbmcgKm1hcCwgaW50IHN0YXJ0LCBpbnQgbnIpCit7CisJdW5zaWduZWQgbG9uZyAqcCA9IG1hcCArIEJJVF9XT1JEKHN0YXJ0KTsKKwljb25zdCBpbnQgc2l6ZSA9IHN0YXJ0ICsgbnI7CisJaW50IGJpdHNfdG9fc2V0ID0gQklUU19QRVJfTE9ORyAtIChzdGFydCAlIEJJVFNfUEVSX0xPTkcpOworCXVuc2lnbmVkIGxvbmcgbWFza190b19zZXQgPSBCSVRNQVBfRklSU1RfV09SRF9NQVNLKHN0YXJ0KTsKKworCXdoaWxlIChuciAtIGJpdHNfdG9fc2V0ID49IDApIHsKKwkJaWYgKHNldF9iaXRzX2xsKHAsIG1hc2tfdG9fc2V0KSkKKwkJCXJldHVybiBucjsKKwkJbnIgLT0gYml0c190b19zZXQ7CisJCWJpdHNfdG9fc2V0ID0gQklUU19QRVJfTE9ORzsKKwkJbWFza190b19zZXQgPSB+MFVMOworCQlwKys7CisJfQorCWlmIChucikgeworCQltYXNrX3RvX3NldCAmPSBCSVRNQVBfTEFTVF9XT1JEX01BU0soc2l6ZSk7CisJCWlmIChzZXRfYml0c19sbChwLCBtYXNrX3RvX3NldCkpCisJCQlyZXR1cm4gbnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBiaXRtYXBfY2xlYXJfbGwgLSBjbGVhciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBiaXRzIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24KKyAqIEBtYXA6IHBvaW50ZXIgdG8gYSBiaXRtYXAKKyAqIEBzdGFydDogYSBiaXQgcG9zaXRpb24gaW4gQG1hcAorICogQG5yOiBudW1iZXIgb2YgYml0cyB0byBzZXQKKyAqCisgKiBDbGVhciBAbnIgYml0cyBzdGFydCBmcm9tIEBzdGFydCBpbiBAbWFwIGxvY2stbGVzc2x5LiBTZXZlcmFsIHVzZXJzCisgKiBjYW4gc2V0L2NsZWFyIHRoZSBzYW1lIGJpdG1hcCBzaW11bHRhbmVvdXNseSB3aXRob3V0IGxvY2suIElmIHR3bworICogdXNlcnMgY2xlYXIgdGhlIHNhbWUgYml0LCBvbmUgdXNlciB3aWxsIHJldHVybiByZW1haW4gYml0cywKKyAqIG90aGVyd2lzZSByZXR1cm4gMC4KKyAqLworc3RhdGljIGludCBiaXRtYXBfY2xlYXJfbGwodW5zaWduZWQgbG9uZyAqbWFwLCBpbnQgc3RhcnQsIGludCBucikKK3sKKwl1bnNpZ25lZCBsb25nICpwID0gbWFwICsgQklUX1dPUkQoc3RhcnQpOworCWNvbnN0IGludCBzaXplID0gc3RhcnQgKyBucjsKKwlpbnQgYml0c190b19jbGVhciA9IEJJVFNfUEVSX0xPTkcgLSAoc3RhcnQgJSBCSVRTX1BFUl9MT05HKTsKKwl1bnNpZ25lZCBsb25nIG1hc2tfdG9fY2xlYXIgPSBCSVRNQVBfRklSU1RfV09SRF9NQVNLKHN0YXJ0KTsKKworCXdoaWxlIChuciAtIGJpdHNfdG9fY2xlYXIgPj0gMCkgeworCQlpZiAoY2xlYXJfYml0c19sbChwLCBtYXNrX3RvX2NsZWFyKSkKKwkJCXJldHVybiBucjsKKwkJbnIgLT0gYml0c190b19jbGVhcjsKKwkJYml0c190b19jbGVhciA9IEJJVFNfUEVSX0xPTkc7CisJCW1hc2tfdG9fY2xlYXIgPSB+MFVMOworCQlwKys7CisJfQorCWlmIChucikgeworCQltYXNrX3RvX2NsZWFyICY9IEJJVE1BUF9MQVNUX1dPUkRfTUFTSyhzaXplKTsKKwkJaWYgKGNsZWFyX2JpdHNfbGwocCwgbWFza190b19jbGVhcikpCisJCQlyZXR1cm4gbnI7CisJfQorCisJcmV0dXJuIDA7Cit9CiAKIC8qKgogICogZ2VuX3Bvb2xfY3JlYXRlIC0gY3JlYXRlIGEgbmV3IHNwZWNpYWwgbWVtb3J5IHBvb2wKQEAgLTMwLDcgKzE0OSw3IEBACiAKIAlwb29sID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgZ2VuX3Bvb2wpLCBHRlBfS0VSTkVMLCBuaWQpOwogCWlmIChwb29sICE9IE5VTEwpIHsKLQkJcndsb2NrX2luaXQoJnBvb2wtPmxvY2spOworCQlzcGluX2xvY2tfaW5pdCgmcG9vbC0+bG9jayk7CiAJCUlOSVRfTElTVF9IRUFEKCZwb29sLT5jaHVua3MpOwogCQlwb29sLT5taW5fYWxsb2Nfb3JkZXIgPSBtaW5fYWxsb2Nfb3JkZXI7CiAJfQpAQCAtNjMsMTQgKzE4MiwxNCBAQAogCWlmICh1bmxpa2VseShjaHVuayA9PSBOVUxMKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzcGluX2xvY2tfaW5pdCgmY2h1bmstPmxvY2spOwogCWNodW5rLT5waHlzX2FkZHIgPSBwaHlzOwogCWNodW5rLT5zdGFydF9hZGRyID0gdmlydDsKIAljaHVuay0+ZW5kX2FkZHIgPSB2aXJ0ICsgc2l6ZTsKKwlhdG9taWNfc2V0KCZjaHVuay0+YXZhaWwsIHNpemUpOwogCi0Jd3JpdGVfbG9jaygmcG9vbC0+bG9jayk7Ci0JbGlzdF9hZGQoJmNodW5rLT5uZXh0X2NodW5rLCAmcG9vbC0+Y2h1bmtzKTsKLQl3cml0ZV91bmxvY2soJnBvb2wtPmxvY2spOworCXNwaW5fbG9jaygmcG9vbC0+bG9jayk7CisJbGlzdF9hZGRfcmN1KCZjaHVuay0+bmV4dF9jaHVuaywgJnBvb2wtPmNodW5rcyk7CisJc3Bpbl91bmxvY2soJnBvb2wtPmxvY2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04NSwxOSArMjA0LDE5IEBACiAgKi8KIHBoeXNfYWRkcl90IGdlbl9wb29sX3ZpcnRfdG9fcGh5cyhzdHJ1Y3QgZ2VuX3Bvb2wgKnBvb2wsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfY2h1bms7CiAJc3RydWN0IGdlbl9wb29sX2NodW5rICpjaHVuazsKKwlwaHlzX2FkZHJfdCBwYWRkciA9IC0xOwogCi0JcmVhZF9sb2NrKCZwb29sLT5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKF9jaHVuaywgJnBvb2wtPmNodW5rcykgewotCQljaHVuayA9IGxpc3RfZW50cnkoX2NodW5rLCBzdHJ1Y3QgZ2VuX3Bvb2xfY2h1bmssIG5leHRfY2h1bmspOwotCi0JCWlmIChhZGRyID49IGNodW5rLT5zdGFydF9hZGRyICYmIGFkZHIgPCBjaHVuay0+ZW5kX2FkZHIpCi0JCQlyZXR1cm4gY2h1bmstPnBoeXNfYWRkciArIGFkZHIgLSBjaHVuay0+c3RhcnRfYWRkcjsKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2h1bmssICZwb29sLT5jaHVua3MsIG5leHRfY2h1bmspIHsKKwkJaWYgKGFkZHIgPj0gY2h1bmstPnN0YXJ0X2FkZHIgJiYgYWRkciA8IGNodW5rLT5lbmRfYWRkcikgeworCQkJcGFkZHIgPSBjaHVuay0+cGh5c19hZGRyICsgKGFkZHIgLSBjaHVuay0+c3RhcnRfYWRkcik7CisJCQlicmVhazsKKwkJfQogCX0KLQlyZWFkX3VubG9jaygmcG9vbC0+bG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlyZXR1cm4gLTE7CisJcmV0dXJuIHBhZGRyOwogfQogRVhQT1JUX1NZTUJPTChnZW5fcG9vbF92aXJ0X3RvX3BoeXMpOwogCkBAIC0xMTUsNyArMjM0LDYgQEAKIAlpbnQgb3JkZXIgPSBwb29sLT5taW5fYWxsb2Nfb3JkZXI7CiAJaW50IGJpdCwgZW5kX2JpdDsKIAotCiAJbGlzdF9mb3JfZWFjaF9zYWZlKF9jaHVuaywgX25leHRfY2h1bmssICZwb29sLT5jaHVua3MpIHsKIAkJY2h1bmsgPSBsaXN0X2VudHJ5KF9jaHVuaywgc3RydWN0IGdlbl9wb29sX2NodW5rLCBuZXh0X2NodW5rKTsKIAkJbGlzdF9kZWwoJmNodW5rLT5uZXh0X2NodW5rKTsKQEAgLTEzNyw0NCArMjU1LDUwIEBACiAgKiBAc2l6ZTogbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlIGZyb20gdGhlIHBvb2wKICAqCiAgKiBBbGxvY2F0ZSB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzcGVjaWZpZWQgcG9vbC4KLSAqIFVzZXMgYSBmaXJzdC1maXQgYWxnb3JpdGhtLgorICogVXNlcyBhIGZpcnN0LWZpdCBhbGdvcml0aG0uIENhbiBub3QgYmUgdXNlZCBpbiBOTUkgaGFuZGxlciBvbgorICogYXJjaGl0ZWN0dXJlcyB3aXRob3V0IE5NSS1zYWZlIGNtcHhjaGcgaW1wbGVtZW50YXRpb24uCiAgKi8KIHVuc2lnbmVkIGxvbmcgZ2VuX3Bvb2xfYWxsb2Moc3RydWN0IGdlbl9wb29sICpwb29sLCBzaXplX3Qgc2l6ZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfY2h1bms7CiAJc3RydWN0IGdlbl9wb29sX2NodW5rICpjaHVuazsKLQl1bnNpZ25lZCBsb25nIGFkZHIsIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IDA7CiAJaW50IG9yZGVyID0gcG9vbC0+bWluX2FsbG9jX29yZGVyOwotCWludCBuYml0cywgc3RhcnRfYml0LCBlbmRfYml0OworCWludCBuYml0cywgc3RhcnRfYml0ID0gMCwgZW5kX2JpdCwgcmVtYWluOworCisjaWZuZGVmIENPTkZJR19BUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRworCUJVR19PTihpbl9ubWkoKSk7CisjZW5kaWYKIAogCWlmIChzaXplID09IDApCiAJCXJldHVybiAwOwogCiAJbmJpdHMgPSAoc2l6ZSArICgxVUwgPDwgb3JkZXIpIC0gMSkgPj4gb3JkZXI7Ci0KLQlyZWFkX2xvY2soJnBvb2wtPmxvY2spOwotCWxpc3RfZm9yX2VhY2goX2NodW5rLCAmcG9vbC0+Y2h1bmtzKSB7Ci0JCWNodW5rID0gbGlzdF9lbnRyeShfY2h1bmssIHN0cnVjdCBnZW5fcG9vbF9jaHVuaywgbmV4dF9jaHVuayk7CisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNodW5rLCAmcG9vbC0+Y2h1bmtzLCBuZXh0X2NodW5rKSB7CisJCWlmIChzaXplID4gYXRvbWljX3JlYWQoJmNodW5rLT5hdmFpbCkpCisJCQljb250aW51ZTsKIAogCQllbmRfYml0ID0gKGNodW5rLT5lbmRfYWRkciAtIGNodW5rLT5zdGFydF9hZGRyKSA+PiBvcmRlcjsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2h1bmstPmxvY2ssIGZsYWdzKTsKLQkJc3RhcnRfYml0ID0gYml0bWFwX2ZpbmRfbmV4dF96ZXJvX2FyZWEoY2h1bmstPmJpdHMsIGVuZF9iaXQsIDAsCi0JCQkJCQluYml0cywgMCk7Ci0JCWlmIChzdGFydF9iaXQgPj0gZW5kX2JpdCkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2h1bmstPmxvY2ssIGZsYWdzKTsKK3JldHJ5OgorCQlzdGFydF9iaXQgPSBiaXRtYXBfZmluZF9uZXh0X3plcm9fYXJlYShjaHVuay0+Yml0cywgZW5kX2JpdCwKKwkJCQkJCSAgICAgICBzdGFydF9iaXQsIG5iaXRzLCAwKTsKKwkJaWYgKHN0YXJ0X2JpdCA+PSBlbmRfYml0KQogCQkJY29udGludWU7CisJCXJlbWFpbiA9IGJpdG1hcF9zZXRfbGwoY2h1bmstPmJpdHMsIHN0YXJ0X2JpdCwgbmJpdHMpOworCQlpZiAocmVtYWluKSB7CisJCQlyZW1haW4gPSBiaXRtYXBfY2xlYXJfbGwoY2h1bmstPmJpdHMsIHN0YXJ0X2JpdCwKKwkJCQkJCSBuYml0cyAtIHJlbWFpbik7CisJCQlCVUdfT04ocmVtYWluKTsKKwkJCWdvdG8gcmV0cnk7CiAJCX0KIAogCQlhZGRyID0gY2h1bmstPnN0YXJ0X2FkZHIgKyAoKHVuc2lnbmVkIGxvbmcpc3RhcnRfYml0IDw8IG9yZGVyKTsKLQotCQliaXRtYXBfc2V0KGNodW5rLT5iaXRzLCBzdGFydF9iaXQsIG5iaXRzKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2h1bmstPmxvY2ssIGZsYWdzKTsKLQkJcmVhZF91bmxvY2soJnBvb2wtPmxvY2spOwotCQlyZXR1cm4gYWRkcjsKKwkJc2l6ZSA9IG5iaXRzIDw8IG9yZGVyOworCQlhdG9taWNfc3ViKHNpemUsICZjaHVuay0+YXZhaWwpOworCQlicmVhazsKIAl9Ci0JcmVhZF91bmxvY2soJnBvb2wtPmxvY2spOwotCXJldHVybiAwOworCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBhZGRyOwogfQogRVhQT1JUX1NZTUJPTChnZW5fcG9vbF9hbGxvYyk7CiAKQEAgLTE4NCwzMyArMzA4LDk1IEBACiAgKiBAYWRkcjogc3RhcnRpbmcgYWRkcmVzcyBvZiBtZW1vcnkgdG8gZnJlZSBiYWNrIHRvIHBvb2wKICAqIEBzaXplOiBzaXplIGluIGJ5dGVzIG9mIG1lbW9yeSB0byBmcmVlCiAgKgotICogRnJlZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBzcGVjaWFsIG1lbW9yeSBiYWNrIHRvIHRoZSBzcGVjaWZpZWQgcG9vbC4KKyAqIEZyZWUgcHJldmlvdXNseSBhbGxvY2F0ZWQgc3BlY2lhbCBtZW1vcnkgYmFjayB0byB0aGUgc3BlY2lmaWVkCisgKiBwb29sLiAgQ2FuIG5vdCBiZSB1c2VkIGluIE5NSSBoYW5kbGVyIG9uIGFyY2hpdGVjdHVyZXMgd2l0aG91dAorICogTk1JLXNhZmUgY21weGNoZyBpbXBsZW1lbnRhdGlvbi4KICAqLwogdm9pZCBnZW5fcG9vbF9mcmVlKHN0cnVjdCBnZW5fcG9vbCAqcG9vbCwgdW5zaWduZWQgbG9uZyBhZGRyLCBzaXplX3Qgc2l6ZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfY2h1bms7CiAJc3RydWN0IGdlbl9wb29sX2NodW5rICpjaHVuazsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBvcmRlciA9IHBvb2wtPm1pbl9hbGxvY19vcmRlcjsKLQlpbnQgYml0LCBuYml0czsKKwlpbnQgc3RhcnRfYml0LCBuYml0cywgcmVtYWluOworCisjaWZuZGVmIENPTkZJR19BUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRworCUJVR19PTihpbl9ubWkoKSk7CisjZW5kaWYKIAogCW5iaXRzID0gKHNpemUgKyAoMVVMIDw8IG9yZGVyKSAtIDEpID4+IG9yZGVyOwotCi0JcmVhZF9sb2NrKCZwb29sLT5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKF9jaHVuaywgJnBvb2wtPmNodW5rcykgewotCQljaHVuayA9IGxpc3RfZW50cnkoX2NodW5rLCBzdHJ1Y3QgZ2VuX3Bvb2xfY2h1bmssIG5leHRfY2h1bmspOwotCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNodW5rLCAmcG9vbC0+Y2h1bmtzLCBuZXh0X2NodW5rKSB7CiAJCWlmIChhZGRyID49IGNodW5rLT5zdGFydF9hZGRyICYmIGFkZHIgPCBjaHVuay0+ZW5kX2FkZHIpIHsKIAkJCUJVR19PTihhZGRyICsgc2l6ZSA+IGNodW5rLT5lbmRfYWRkcik7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2h1bmstPmxvY2ssIGZsYWdzKTsKLQkJCWJpdCA9IChhZGRyIC0gY2h1bmstPnN0YXJ0X2FkZHIpID4+IG9yZGVyOwotCQkJd2hpbGUgKG5iaXRzLS0pCi0JCQkJX19jbGVhcl9iaXQoYml0KyssIGNodW5rLT5iaXRzKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNodW5rLT5sb2NrLCBmbGFncyk7Ci0JCQlicmVhazsKKwkJCXN0YXJ0X2JpdCA9IChhZGRyIC0gY2h1bmstPnN0YXJ0X2FkZHIpID4+IG9yZGVyOworCQkJcmVtYWluID0gYml0bWFwX2NsZWFyX2xsKGNodW5rLT5iaXRzLCBzdGFydF9iaXQsIG5iaXRzKTsKKwkJCUJVR19PTihyZW1haW4pOworCQkJc2l6ZSA9IG5iaXRzIDw8IG9yZGVyOworCQkJYXRvbWljX2FkZChzaXplLCAmY2h1bmstPmF2YWlsKTsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJcmV0dXJuOwogCQl9CiAJfQotCUJVR19PTihuYml0cyA+IDApOwotCXJlYWRfdW5sb2NrKCZwb29sLT5sb2NrKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlCVUcoKTsKIH0KIEVYUE9SVF9TWU1CT0woZ2VuX3Bvb2xfZnJlZSk7CisKKy8qKgorICogZ2VuX3Bvb2xfZm9yX2VhY2hfY2h1bmsgLSBjYWxsIGZ1bmMgZm9yIGV2ZXJ5IGNodW5rIG9mIGdlbmVyaWMgbWVtb3J5IHBvb2wKKyAqIEBwb29sOgl0aGUgZ2VuZXJpYyBtZW1vcnkgcG9vbAorICogQGZ1bmM6CWZ1bmMgdG8gY2FsbAorICogQGRhdGE6CWFkZGl0aW9uYWwgZGF0YSB1c2VkIGJ5IEBmdW5jCisgKgorICogQ2FsbCBAZnVuYyBmb3IgZXZlcnkgY2h1bmsgb2YgZ2VuZXJpYyBtZW1vcnkgcG9vbC4gIFRoZSBAZnVuYyBpcworICogY2FsbGVkIHdpdGggcmN1X3JlYWRfbG9jayBoZWxkLgorICovCit2b2lkIGdlbl9wb29sX2Zvcl9lYWNoX2NodW5rKHN0cnVjdCBnZW5fcG9vbCAqcG9vbCwKKwl2b2lkICgqZnVuYykoc3RydWN0IGdlbl9wb29sICpwb29sLCBzdHJ1Y3QgZ2VuX3Bvb2xfY2h1bmsgKmNodW5rLCB2b2lkICpkYXRhKSwKKwl2b2lkICpkYXRhKQoreworCXN0cnVjdCBnZW5fcG9vbF9jaHVuayAqY2h1bms7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2h1bmssICYocG9vbCktPmNodW5rcywgbmV4dF9jaHVuaykKKwkJZnVuYyhwb29sLCBjaHVuaywgZGF0YSk7CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CitFWFBPUlRfU1lNQk9MKGdlbl9wb29sX2Zvcl9lYWNoX2NodW5rKTsKKworLyoqCisgKiBnZW5fcG9vbF9hdmFpbCAtIGdldCBhdmFpbGFibGUgZnJlZSBzcGFjZSBvZiB0aGUgcG9vbAorICogQHBvb2w6IHBvb2wgdG8gZ2V0IGF2YWlsYWJsZSBmcmVlIHNwYWNlCisgKgorICogUmV0dXJuIGF2YWlsYWJsZSBmcmVlIHNwYWNlIG9mIHRoZSBzcGVjaWZpZWQgcG9vbC4KKyAqLworc2l6ZV90IGdlbl9wb29sX2F2YWlsKHN0cnVjdCBnZW5fcG9vbCAqcG9vbCkKK3sKKwlzdHJ1Y3QgZ2VuX3Bvb2xfY2h1bmsgKmNodW5rOworCXNpemVfdCBhdmFpbCA9IDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2h1bmssICZwb29sLT5jaHVua3MsIG5leHRfY2h1bmspCisJCWF2YWlsICs9IGF0b21pY19yZWFkKCZjaHVuay0+YXZhaWwpOworCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBhdmFpbDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdlbl9wb29sX2F2YWlsKTsKKworLyoqCisgKiBnZW5fcG9vbF9zaXplIC0gZ2V0IHNpemUgaW4gYnl0ZXMgb2YgbWVtb3J5IG1hbmFnZWQgYnkgdGhlIHBvb2wKKyAqIEBwb29sOiBwb29sIHRvIGdldCBzaXplCisgKgorICogUmV0dXJuIHNpemUgaW4gYnl0ZXMgb2YgbWVtb3J5IG1hbmFnZWQgYnkgdGhlIHBvb2wuCisgKi8KK3NpemVfdCBnZW5fcG9vbF9zaXplKHN0cnVjdCBnZW5fcG9vbCAqcG9vbCkKK3sKKwlzdHJ1Y3QgZ2VuX3Bvb2xfY2h1bmsgKmNodW5rOworCXNpemVfdCBzaXplID0gMDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjaHVuaywgJnBvb2wtPmNodW5rcywgbmV4dF9jaHVuaykKKwkJc2l6ZSArPSBjaHVuay0+ZW5kX2FkZHIgLSBjaHVuay0+c3RhcnRfYWRkcjsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gc2l6ZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdlbl9wb29sX3NpemUpOwpkaWZmIC0tZ2l0IGEvbGliL2lkci5jIGIvbGliL2lkci5jCmluZGV4IGUxNTUwMmUuLmRiMDQwY2UgMTAwNjQ0Ci0tLSBhL2xpYi9pZHIuYworKysgYi9saWIvaWRyLmMKQEAgLTM0LDggKzM0LDEwIEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICppZHJfbGF5ZXJfY2FjaGU7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNpbXBsZV9pZGFfbG9jayk7CiAKIHN0YXRpYyBzdHJ1Y3QgaWRyX2xheWVyICpnZXRfZnJvbV9mcmVlX2xpc3Qoc3RydWN0IGlkciAqaWRwKQogewpAQCAtOTI2LDYgKzkyOCw3MSBAQAogRVhQT1JUX1NZTUJPTChpZGFfZGVzdHJveSk7CiAKIC8qKgorICogaWRhX3NpbXBsZV9nZXQgLSBnZXQgYSBuZXcgaWQuCisgKiBAaWRhOiB0aGUgKGluaXRpYWxpemVkKSBpZGEuCisgKiBAc3RhcnQ6IHRoZSBtaW5pbXVtIGlkIChpbmNsdXNpdmUsIDwgMHg4MDAwMDAwKQorICogQGVuZDogdGhlIG1heGltdW0gaWQgKGV4Y2x1c2l2ZSwgPCAweDgwMDAwMDAgb3IgMCkKKyAqIEBnZnBfbWFzazogbWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MKKyAqCisgKiBBbGxvY2F0ZXMgYW4gaWQgaW4gdGhlIHJhbmdlIHN0YXJ0IDw9IGlkIDwgZW5kLCBvciByZXR1cm5zIC1FTk9TUEMuCisgKiBPbiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLCByZXR1cm5zIC1FTk9NRU0uCisgKgorICogVXNlIGlkYV9zaW1wbGVfcmVtb3ZlKCkgdG8gZ2V0IHJpZCBvZiBhbiBpZC4KKyAqLworaW50IGlkYV9zaW1wbGVfZ2V0KHN0cnVjdCBpZGEgKmlkYSwgdW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgZW5kLAorCQkgICBnZnBfdCBnZnBfbWFzaykKK3sKKwlpbnQgcmV0LCBpZDsKKwl1bnNpZ25lZCBpbnQgbWF4OworCisJQlVHX09OKChpbnQpc3RhcnQgPCAwKTsKKwlCVUdfT04oKGludCllbmQgPCAwKTsKKworCWlmIChlbmQgPT0gMCkKKwkJbWF4ID0gMHg4MDAwMDAwMDsKKwllbHNlIHsKKwkJQlVHX09OKGVuZCA8IHN0YXJ0KTsKKwkJbWF4ID0gZW5kIC0gMTsKKwl9CisKK2FnYWluOgorCWlmICghaWRhX3ByZV9nZXQoaWRhLCBnZnBfbWFzaykpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrKCZzaW1wbGVfaWRhX2xvY2spOworCXJldCA9IGlkYV9nZXRfbmV3X2Fib3ZlKGlkYSwgc3RhcnQsICZpZCk7CisJaWYgKCFyZXQpIHsKKwkJaWYgKGlkID4gbWF4KSB7CisJCQlpZGFfcmVtb3ZlKGlkYSwgaWQpOworCQkJcmV0ID0gLUVOT1NQQzsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IGlkOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZzaW1wbGVfaWRhX2xvY2spOworCisJaWYgKHVubGlrZWx5KHJldCA9PSAtRUFHQUlOKSkKKwkJZ290byBhZ2FpbjsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGlkYV9zaW1wbGVfZ2V0KTsKKworLyoqCisgKiBpZGFfc2ltcGxlX3JlbW92ZSAtIHJlbW92ZSBhbiBhbGxvY2F0ZWQgaWQuCisgKiBAaWRhOiB0aGUgKGluaXRpYWxpemVkKSBpZGEuCisgKiBAaWQ6IHRoZSBpZCByZXR1cm5lZCBieSBpZGFfc2ltcGxlX2dldC4KKyAqLwordm9pZCBpZGFfc2ltcGxlX3JlbW92ZShzdHJ1Y3QgaWRhICppZGEsIHVuc2lnbmVkIGludCBpZCkKK3sKKwlCVUdfT04oKGludClpZCA8IDApOworCXNwaW5fbG9jaygmc2ltcGxlX2lkYV9sb2NrKTsKKwlpZGFfcmVtb3ZlKGlkYSwgaWQpOworCXNwaW5fdW5sb2NrKCZzaW1wbGVfaWRhX2xvY2spOworfQorRVhQT1JUX1NZTUJPTChpZGFfc2ltcGxlX3JlbW92ZSk7CisKKy8qKgogICogaWRhX2luaXQgLSBpbml0aWFsaXplIGlkYSBoYW5kbGUKICAqIEBpZGE6CWlkYSBoYW5kbGUKICAqCmRpZmYgLS1naXQgYS9saWIvbGxpc3QuYyBiL2xpYi9sbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNDQ1NzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbGxpc3QuYwpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIExvY2stbGVzcyBOVUxMIHRlcm1pbmF0ZWQgc2luZ2xlIGxpbmtlZCBsaXN0CisgKgorICogVGhlIGJhc2ljIGF0b21pYyBvcGVyYXRpb24gb2YgdGhpcyBsaXN0IGlzIGNtcHhjaGcgb24gbG9uZy4gIE9uCisgKiBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGF2ZSBOTUktc2FmZSBjbXB4Y2hnIGltcGxlbWVudGF0aW9uLCB0aGUKKyAqIGxpc3QgY2FuIE5PVCBiZSB1c2VkIGluIE5NSSBoYW5kbGVyLiAgU28gY29kZSB1c2VzIHRoZSBsaXN0IGluIE5NSQorICogaGFuZGxlciBzaG91bGQgZGVwZW5kIG9uIENPTkZJR19BUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMCwyMDExIEludGVsIENvcnAuCisgKiAgIEF1dGhvcjogSHVhbmcgWWluZyA8eWluZy5odWFuZ0BpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGxpc3QuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworLyoqCisgKiBsbGlzdF9hZGQgLSBhZGQgYSBuZXcgZW50cnkKKyAqIEBuZXc6CW5ldyBlbnRyeSB0byBiZSBhZGRlZAorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxvY2stbGVzcyBsaXN0CisgKi8KK3ZvaWQgbGxpc3RfYWRkKHN0cnVjdCBsbGlzdF9ub2RlICpuZXcsIHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBsbGlzdF9ub2RlICplbnRyeSwgKm9sZF9lbnRyeTsKKworI2lmbmRlZiBDT05GSUdfQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKKwlCVUdfT04oaW5fbm1pKCkpOworI2VuZGlmCisKKwllbnRyeSA9IGhlYWQtPmZpcnN0OworCWRvIHsKKwkJb2xkX2VudHJ5ID0gZW50cnk7CisJCW5ldy0+bmV4dCA9IGVudHJ5OworCQljcHVfcmVsYXgoKTsKKwl9IHdoaWxlICgoZW50cnkgPSBjbXB4Y2hnKCZoZWFkLT5maXJzdCwgb2xkX2VudHJ5LCBuZXcpKSAhPSBvbGRfZW50cnkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobGxpc3RfYWRkKTsKKworLyoqCisgKiBsbGlzdF9hZGRfYmF0Y2ggLSBhZGQgc2V2ZXJhbCBsaW5rZWQgZW50cmllcyBpbiBiYXRjaAorICogQG5ld19maXJzdDoJZmlyc3QgZW50cnkgaW4gYmF0Y2ggdG8gYmUgYWRkZWQKKyAqIEBuZXdfbGFzdDoJbGFzdCBlbnRyeSBpbiBiYXRjaCB0byBiZSBhZGRlZAorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxvY2stbGVzcyBsaXN0CisgKi8KK3ZvaWQgbGxpc3RfYWRkX2JhdGNoKHN0cnVjdCBsbGlzdF9ub2RlICpuZXdfZmlyc3QsIHN0cnVjdCBsbGlzdF9ub2RlICpuZXdfbGFzdCwKKwkJICAgICBzdHJ1Y3QgbGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgbGxpc3Rfbm9kZSAqZW50cnksICpvbGRfZW50cnk7CisKKyNpZm5kZWYgQ09ORklHX0FSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHCisJQlVHX09OKGluX25taSgpKTsKKyNlbmRpZgorCisJZW50cnkgPSBoZWFkLT5maXJzdDsKKwlkbyB7CisJCW9sZF9lbnRyeSA9IGVudHJ5OworCQluZXdfbGFzdC0+bmV4dCA9IGVudHJ5OworCQljcHVfcmVsYXgoKTsKKwl9IHdoaWxlICgoZW50cnkgPSBjbXB4Y2hnKCZoZWFkLT5maXJzdCwgb2xkX2VudHJ5LCBuZXdfZmlyc3QpKSAhPSBvbGRfZW50cnkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobGxpc3RfYWRkX2JhdGNoKTsKKworLyoqCisgKiBsbGlzdF9kZWxfZmlyc3QgLSBkZWxldGUgdGhlIGZpcnN0IGVudHJ5IG9mIGxvY2stbGVzcyBsaXN0CisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbG9jay1sZXNzIGxpc3QKKyAqCisgKiBJZiBsaXN0IGlzIGVtcHR5LCByZXR1cm4gTlVMTCwgb3RoZXJ3aXNlLCByZXR1cm4gdGhlIGZpcnN0IGVudHJ5CisgKiBkZWxldGVkLCB0aGlzIGlzIHRoZSBuZXdlc3QgYWRkZWQgb25lLgorICoKKyAqIE9ubHkgb25lIGxsaXN0X2RlbF9maXJzdCB1c2VyIGNhbiBiZSB1c2VkIHNpbXVsdGFuZW91c2x5IHdpdGgKKyAqIG11bHRpcGxlIGxsaXN0X2FkZCB1c2VycyB3aXRob3V0IGxvY2suICBCZWNhdXNlIG90aGVyd2lzZQorICogbGxpc3RfZGVsX2ZpcnN0LCBsbGlzdF9hZGQsIGxsaXN0X2FkZCAob3IgbGxpc3RfZGVsX2FsbCwgbGxpc3RfYWRkLAorICogbGxpc3RfYWRkKSBzZXF1ZW5jZSBpbiBhbm90aGVyIHVzZXIgbWF5IGNoYW5nZSBAaGVhZC0+Zmlyc3QtPm5leHQsCisgKiBidXQga2VlcCBAaGVhZC0+Zmlyc3QuICBJZiBtdWx0aXBsZSBjb25zdW1lcnMgYXJlIG5lZWRlZCwgcGxlYXNlCisgKiB1c2UgbGxpc3RfZGVsX2FsbCBvciB1c2UgbG9jayBiZXR3ZWVuIGNvbnN1bWVycy4KKyAqLworc3RydWN0IGxsaXN0X25vZGUgKmxsaXN0X2RlbF9maXJzdChzdHJ1Y3QgbGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgbGxpc3Rfbm9kZSAqZW50cnksICpvbGRfZW50cnksICpuZXh0OworCisjaWZuZGVmIENPTkZJR19BUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRworCUJVR19PTihpbl9ubWkoKSk7CisjZW5kaWYKKworCWVudHJ5ID0gaGVhZC0+Zmlyc3Q7CisJZG8geworCQlpZiAoZW50cnkgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCQlvbGRfZW50cnkgPSBlbnRyeTsKKwkJbmV4dCA9IGVudHJ5LT5uZXh0OworCQljcHVfcmVsYXgoKTsKKwl9IHdoaWxlICgoZW50cnkgPSBjbXB4Y2hnKCZoZWFkLT5maXJzdCwgb2xkX2VudHJ5LCBuZXh0KSkgIT0gb2xkX2VudHJ5KTsKKworCXJldHVybiBlbnRyeTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGxsaXN0X2RlbF9maXJzdCk7CisKKy8qKgorICogbGxpc3RfZGVsX2FsbCAtIGRlbGV0ZSBhbGwgZW50cmllcyBmcm9tIGxvY2stbGVzcyBsaXN0CisgKiBAaGVhZDoJdGhlIGhlYWQgb2YgbG9jay1sZXNzIGxpc3QgdG8gZGVsZXRlIGFsbCBlbnRyaWVzCisgKgorICogSWYgbGlzdCBpcyBlbXB0eSwgcmV0dXJuIE5VTEwsIG90aGVyd2lzZSwgZGVsZXRlIGFsbCBlbnRyaWVzIGFuZAorICogcmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSBmaXJzdCBlbnRyeS4gIFRoZSBvcmRlciBvZiBlbnRyaWVzCisgKiBkZWxldGVkIGlzIGZyb20gdGhlIG5ld2VzdCB0byB0aGUgb2xkZXN0IGFkZGVkIG9uZS4KKyAqLworc3RydWN0IGxsaXN0X25vZGUgKmxsaXN0X2RlbF9hbGwoc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpCit7CisjaWZuZGVmIENPTkZJR19BUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRworCUJVR19PTihpbl9ubWkoKSk7CisjZW5kaWYKKworCXJldHVybiB4Y2hnKCZoZWFkLT5maXJzdCwgTlVMTCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChsbGlzdF9kZWxfYWxsKTsKZGlmZiAtLWdpdCBhL2xpYi9yYWRpeC10cmVlLmMgYi9saWIvcmFkaXgtdHJlZS5jCmluZGV4IDdlYTJlMDMuLmEyZjlkYTUgMTAwNjQ0Ci0tLSBhL2xpYi9yYWRpeC10cmVlLmMKKysrIGIvbGliL3JhZGl4LXRyZWUuYwpAQCAtODIzLDggKzgyMyw4IEBACiBFWFBPUlRfU1lNQk9MKHJhZGl4X3RyZWVfcHJldl9ob2xlKTsKIAogc3RhdGljIHVuc2lnbmVkIGludAotX19sb29rdXAoc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqc2xvdCwgdm9pZCAqKipyZXN1bHRzLCB1bnNpZ25lZCBsb25nIGluZGV4LAotCXVuc2lnbmVkIGludCBtYXhfaXRlbXMsIHVuc2lnbmVkIGxvbmcgKm5leHRfaW5kZXgpCitfX2xvb2t1cChzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpzbG90LCB2b2lkICoqKnJlc3VsdHMsIHVuc2lnbmVkIGxvbmcgKmluZGljZXMsCisJdW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgaW50IG1heF9pdGVtcywgdW5zaWduZWQgbG9uZyAqbmV4dF9pbmRleCkKIHsKIAl1bnNpZ25lZCBpbnQgbnJfZm91bmQgPSAwOwogCXVuc2lnbmVkIGludCBzaGlmdCwgaGVpZ2h0OwpAQCAtODU3LDEyICs4NTcsMTYgQEAKIAogCS8qIEJvdHRvbSBsZXZlbDogZ3JhYiBzb21lIGl0ZW1zICovCiAJZm9yIChpID0gaW5kZXggJiBSQURJWF9UUkVFX01BUF9NQVNLOyBpIDwgUkFESVhfVFJFRV9NQVBfU0laRTsgaSsrKSB7Ci0JCWluZGV4Kys7CiAJCWlmIChzbG90LT5zbG90c1tpXSkgewotCQkJcmVzdWx0c1tucl9mb3VuZCsrXSA9ICYoc2xvdC0+c2xvdHNbaV0pOwotCQkJaWYgKG5yX2ZvdW5kID09IG1heF9pdGVtcykKKwkJCXJlc3VsdHNbbnJfZm91bmRdID0gJihzbG90LT5zbG90c1tpXSk7CisJCQlpZiAoaW5kaWNlcykKKwkJCQlpbmRpY2VzW25yX2ZvdW5kXSA9IGluZGV4OworCQkJaWYgKCsrbnJfZm91bmQgPT0gbWF4X2l0ZW1zKSB7CisJCQkJaW5kZXgrKzsKIAkJCQlnb3RvIG91dDsKKwkJCX0KIAkJfQorCQlpbmRleCsrOwogCX0KIG91dDoKIAkqbmV4dF9pbmRleCA9IGluZGV4OwpAQCAtOTE4LDggKzkyMiw4IEBACiAKIAkJaWYgKGN1cl9pbmRleCA+IG1heF9pbmRleCkKIAkJCWJyZWFrOwotCQlzbG90c19mb3VuZCA9IF9fbG9va3VwKG5vZGUsICh2b2lkICoqKilyZXN1bHRzICsgcmV0LCBjdXJfaW5kZXgsCi0JCQkJCW1heF9pdGVtcyAtIHJldCwgJm5leHRfaW5kZXgpOworCQlzbG90c19mb3VuZCA9IF9fbG9va3VwKG5vZGUsICh2b2lkICoqKilyZXN1bHRzICsgcmV0LCBOVUxMLAorCQkJCWN1cl9pbmRleCwgbWF4X2l0ZW1zIC0gcmV0LCAmbmV4dF9pbmRleCk7CiAJCW5yX2ZvdW5kID0gMDsKIAkJZm9yIChpID0gMDsgaSA8IHNsb3RzX2ZvdW5kOyBpKyspIHsKIAkJCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKnNsb3Q7CkBAIC05NDQsNiArOTQ4LDcgQEAKICAqCXJhZGl4X3RyZWVfZ2FuZ19sb29rdXBfc2xvdCAtIHBlcmZvcm0gbXVsdGlwbGUgc2xvdCBsb29rdXAgb24gcmFkaXggdHJlZQogICoJQHJvb3Q6CQlyYWRpeCB0cmVlIHJvb3QKICAqCUByZXN1bHRzOgl3aGVyZSB0aGUgcmVzdWx0cyBvZiB0aGUgbG9va3VwIGFyZSBwbGFjZWQKKyAqCUBpbmRpY2VzOgl3aGVyZSB0aGVpciBpbmRpY2VzIHNob3VsZCBiZSBwbGFjZWQgKGJ1dCB1c3VhbGx5IE5VTEwpCiAgKglAZmlyc3RfaW5kZXg6CXN0YXJ0IHRoZSBsb29rdXAgZnJvbSB0aGlzIGtleQogICoJQG1heF9pdGVtczoJcGxhY2UgdXAgdG8gdGhpcyBtYW55IGl0ZW1zIGF0ICpyZXN1bHRzCiAgKgpAQCAtOTU4LDcgKzk2Myw4IEBACiAgKglwcm90ZWN0aW9uLCByYWRpeF90cmVlX2RlcmVmX3Nsb3QgbWF5IGZhaWwgcmVxdWlyaW5nIGEgcmV0cnkuCiAgKi8KIHVuc2lnbmVkIGludAotcmFkaXhfdHJlZV9nYW5nX2xvb2t1cF9zbG90KHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHZvaWQgKioqcmVzdWx0cywKK3JhZGl4X3RyZWVfZ2FuZ19sb29rdXBfc2xvdChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAorCQkJdm9pZCAqKipyZXN1bHRzLCB1bnNpZ25lZCBsb25nICppbmRpY2VzLAogCQkJdW5zaWduZWQgbG9uZyBmaXJzdF9pbmRleCwgdW5zaWduZWQgaW50IG1heF9pdGVtcykKIHsKIAl1bnNpZ25lZCBsb25nIG1heF9pbmRleDsKQEAgLTk3NCw2ICs5ODAsOCBAQAogCQlpZiAoZmlyc3RfaW5kZXggPiAwKQogCQkJcmV0dXJuIDA7CiAJCXJlc3VsdHNbMF0gPSAodm9pZCAqKikmcm9vdC0+cm5vZGU7CisJCWlmIChpbmRpY2VzKQorCQkJaW5kaWNlc1swXSA9IDA7CiAJCXJldHVybiAxOwogCX0KIAlub2RlID0gaW5kaXJlY3RfdG9fcHRyKG5vZGUpOwpAQCAtOTg3LDggKzk5NSw5IEBACiAKIAkJaWYgKGN1cl9pbmRleCA+IG1heF9pbmRleCkKIAkJCWJyZWFrOwotCQlzbG90c19mb3VuZCA9IF9fbG9va3VwKG5vZGUsIHJlc3VsdHMgKyByZXQsIGN1cl9pbmRleCwKLQkJCQkJbWF4X2l0ZW1zIC0gcmV0LCAmbmV4dF9pbmRleCk7CisJCXNsb3RzX2ZvdW5kID0gX19sb29rdXAobm9kZSwgcmVzdWx0cyArIHJldCwKKwkJCQlpbmRpY2VzID8gaW5kaWNlcyArIHJldCA6IE5VTEwsCisJCQkJY3VyX2luZGV4LCBtYXhfaXRlbXMgLSByZXQsICZuZXh0X2luZGV4KTsKIAkJcmV0ICs9IHNsb3RzX2ZvdW5kOwogCQlpZiAobmV4dF9pbmRleCA9PSAwKQogCQkJYnJlYWs7CkBAIC0xMTk0LDYgKzEyMDMsOTggQEAKIH0KIEVYUE9SVF9TWU1CT0wocmFkaXhfdHJlZV9nYW5nX2xvb2t1cF90YWdfc2xvdCk7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19TSE1FTSkgJiYgZGVmaW5lZChDT05GSUdfU1dBUCkKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPiAvKiBmb3IgY29uZF9yZXNjaGVkKCkgKi8KKworLyoKKyAqIFRoaXMgbGluZWFyIHNlYXJjaCBpcyBhdCBwcmVzZW50IG9ubHkgdXNlZnVsIHRvIHNobWVtX3VudXNlX2lub2RlKCkuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fbG9jYXRlKHN0cnVjdCByYWRpeF90cmVlX25vZGUgKnNsb3QsIHZvaWQgKml0ZW0sCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nICpmb3VuZF9pbmRleCkKK3sKKwl1bnNpZ25lZCBpbnQgc2hpZnQsIGhlaWdodDsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwloZWlnaHQgPSBzbG90LT5oZWlnaHQ7CisJc2hpZnQgPSAoaGVpZ2h0LTEpICogUkFESVhfVFJFRV9NQVBfU0hJRlQ7CisKKwlmb3IgKCA7IGhlaWdodCA+IDE7IGhlaWdodC0tKSB7CisJCWkgPSAoaW5kZXggPj4gc2hpZnQpICYgUkFESVhfVFJFRV9NQVBfTUFTSzsKKwkJZm9yICg7OykgeworCQkJaWYgKHNsb3QtPnNsb3RzW2ldICE9IE5VTEwpCisJCQkJYnJlYWs7CisJCQlpbmRleCAmPSB+KCgxVUwgPDwgc2hpZnQpIC0gMSk7CisJCQlpbmRleCArPSAxVUwgPDwgc2hpZnQ7CisJCQlpZiAoaW5kZXggPT0gMCkKKwkJCQlnb3RvIG91dDsJLyogMzItYml0IHdyYXBhcm91bmQgKi8KKwkJCWkrKzsKKwkJCWlmIChpID09IFJBRElYX1RSRUVfTUFQX1NJWkUpCisJCQkJZ290byBvdXQ7CisJCX0KKworCQlzaGlmdCAtPSBSQURJWF9UUkVFX01BUF9TSElGVDsKKwkJc2xvdCA9IHJjdV9kZXJlZmVyZW5jZV9yYXcoc2xvdC0+c2xvdHNbaV0pOworCQlpZiAoc2xvdCA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJfQorCisJLyogQm90dG9tIGxldmVsOiBjaGVjayBpdGVtcyAqLworCWZvciAoaSA9IDA7IGkgPCBSQURJWF9UUkVFX01BUF9TSVpFOyBpKyspIHsKKwkJaWYgKHNsb3QtPnNsb3RzW2ldID09IGl0ZW0pIHsKKwkJCSpmb3VuZF9pbmRleCA9IGluZGV4ICsgaTsKKwkJCWluZGV4ID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWluZGV4ICs9IFJBRElYX1RSRUVfTUFQX1NJWkU7CitvdXQ6CisJcmV0dXJuIGluZGV4OworfQorCisvKioKKyAqCXJhZGl4X3RyZWVfbG9jYXRlX2l0ZW0gLSBzZWFyY2ggdGhyb3VnaCByYWRpeCB0cmVlIGZvciBpdGVtCisgKglAcm9vdDoJCXJhZGl4IHRyZWUgcm9vdAorICoJQGl0ZW06CQlpdGVtIHRvIGJlIGZvdW5kCisgKgorICoJUmV0dXJucyBpbmRleCB3aGVyZSBpdGVtIHdhcyBmb3VuZCwgb3IgLTEgaWYgbm90IGZvdW5kLgorICoJQ2FsbGVyIG11c3QgaG9sZCBubyBsb2NrIChzaW5jZSB0aGlzIHRpbWUtY29uc3VtaW5nIGZ1bmN0aW9uIG5lZWRzCisgKgl0byBiZSBwcmVlbXB0aWJsZSksIGFuZCBtdXN0IGNoZWNrIGFmdGVyd2FyZHMgaWYgaXRlbSBpcyBzdGlsbCB0aGVyZS4KKyAqLwordW5zaWduZWQgbG9uZyByYWRpeF90cmVlX2xvY2F0ZV9pdGVtKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHZvaWQgKml0ZW0pCit7CisJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZTsKKwl1bnNpZ25lZCBsb25nIG1heF9pbmRleDsKKwl1bnNpZ25lZCBsb25nIGN1cl9pbmRleCA9IDA7CisJdW5zaWduZWQgbG9uZyBmb3VuZF9pbmRleCA9IC0xOworCisJZG8geworCQlyY3VfcmVhZF9sb2NrKCk7CisJCW5vZGUgPSByY3VfZGVyZWZlcmVuY2VfcmF3KHJvb3QtPnJub2RlKTsKKwkJaWYgKCFyYWRpeF90cmVlX2lzX2luZGlyZWN0X3B0cihub2RlKSkgeworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQlpZiAobm9kZSA9PSBpdGVtKQorCQkJCWZvdW5kX2luZGV4ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJbm9kZSA9IGluZGlyZWN0X3RvX3B0cihub2RlKTsKKwkJbWF4X2luZGV4ID0gcmFkaXhfdHJlZV9tYXhpbmRleChub2RlLT5oZWlnaHQpOworCQlpZiAoY3VyX2luZGV4ID4gbWF4X2luZGV4KQorCQkJYnJlYWs7CisKKwkJY3VyX2luZGV4ID0gX19sb2NhdGUobm9kZSwgaXRlbSwgY3VyX2luZGV4LCAmZm91bmRfaW5kZXgpOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJY29uZF9yZXNjaGVkKCk7CisJfSB3aGlsZSAoY3VyX2luZGV4ICE9IDAgJiYgY3VyX2luZGV4IDw9IG1heF9pbmRleCk7CisKKwlyZXR1cm4gZm91bmRfaW5kZXg7Cit9CisjZWxzZQordW5zaWduZWQgbG9uZyByYWRpeF90cmVlX2xvY2F0ZV9pdGVtKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHZvaWQgKml0ZW0pCit7CisJcmV0dXJuIC0xOworfQorI2VuZGlmIC8qIENPTkZJR19TSE1FTSAmJiBDT05GSUdfU1dBUCAqLwogCiAvKioKICAqCXJhZGl4X3RyZWVfc2hyaW5rICAgIC0gICAgc2hyaW5rIGhlaWdodCBvZiBhIHJhZGl4IHRyZWUgdG8gbWluaW1hbApkaWZmIC0tZ2l0IGEvbW0vZmFpbHNsYWIuYyBiL21tL2ZhaWxzbGFiLmMKaW5kZXggMWNlNThjMi4uMGRkN2I4ZiAxMDA2NDQKLS0tIGEvbW0vZmFpbHNsYWIuYworKysgYi9tbS9mYWlsc2xhYi5jCkBAIC0zNCwyMyArMzQsMjMgQEAKICNpZmRlZiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTCiBzdGF0aWMgaW50IF9faW5pdCBmYWlsc2xhYl9kZWJ1Z2ZzX2luaXQodm9pZCkKIHsKKwlzdHJ1Y3QgZGVudHJ5ICpkaXI7CiAJbW9kZV90IG1vZGUgPSBTX0lGUkVHIHwgU19JUlVTUiB8IFNfSVdVU1I7Ci0JaW50IGVycjsKIAotCWVyciA9IGluaXRfZmF1bHRfYXR0cl9kZW50cmllcygmZmFpbHNsYWIuYXR0ciwgImZhaWxzbGFiIik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwlkaXIgPSBmYXVsdF9jcmVhdGVfZGVidWdmc19hdHRyKCJmYWlsc2xhYiIsIE5VTEwsICZmYWlsc2xhYi5hdHRyKTsKKwlpZiAoSVNfRVJSKGRpcikpCisJCXJldHVybiBQVFJfRVJSKGRpcik7CiAKLQlpZiAoIWRlYnVnZnNfY3JlYXRlX2Jvb2woImlnbm9yZS1nZnAtd2FpdCIsIG1vZGUsIGZhaWxzbGFiLmF0dHIuZGlyLAorCWlmICghZGVidWdmc19jcmVhdGVfYm9vbCgiaWdub3JlLWdmcC13YWl0IiwgbW9kZSwgZGlyLAogCQkJCSZmYWlsc2xhYi5pZ25vcmVfZ2ZwX3dhaXQpKQogCQlnb3RvIGZhaWw7Ci0JaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCJjYWNoZS1maWx0ZXIiLCBtb2RlLCBmYWlsc2xhYi5hdHRyLmRpciwKKwlpZiAoIWRlYnVnZnNfY3JlYXRlX2Jvb2woImNhY2hlLWZpbHRlciIsIG1vZGUsIGRpciwKIAkJCQkmZmFpbHNsYWIuY2FjaGVfZmlsdGVyKSkKIAkJZ290byBmYWlsOwogCiAJcmV0dXJuIDA7CiBmYWlsOgotCWNsZWFudXBfZmF1bHRfYXR0cl9kZW50cmllcygmZmFpbHNsYWIuYXR0cik7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRpcik7CiAKIAlyZXR1cm4gLUVOT01FTTsKIH0KZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXAuYyBiL21tL2ZpbGVtYXAuYwppbmRleCA4NjdkNDAyLi42NDVhMDgwIDEwMDY0NAotLS0gYS9tbS9maWxlbWFwLmMKKysrIGIvbW0vZmlsZW1hcC5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgvY3B1c2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPiAvKiBmb3IgQlVHX09OKCFpbl9hdG9taWMoKSkgb25seSAqLwogI2luY2x1ZGUgPGxpbnV4L21lbWNvbnRyb2wuaD4KLSNpbmNsdWRlIDxsaW51eC9tbV9pbmxpbmUuaD4gLyogZm9yIHBhZ2VfaXNfZmlsZV9jYWNoZSgpICovCiAjaW5jbHVkZSA8bGludXgvY2xlYW5jYWNoZS5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKQEAgLTQ2Miw2ICs0NjEsNyBAQAogCWludCBlcnJvcjsKIAogCVZNX0JVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJVk1fQlVHX09OKFBhZ2VTd2FwQmFja2VkKHBhZ2UpKTsKIAogCWVycm9yID0gbWVtX2Nncm91cF9jYWNoZV9jaGFyZ2UocGFnZSwgY3VycmVudC0+bW0sCiAJCQkJCWdmcF9tYXNrICYgR0ZQX1JFQ0xBSU1fTUFTSyk7CkBAIC00NzksOCArNDc5LDYgQEAKIAkJaWYgKGxpa2VseSghZXJyb3IpKSB7CiAJCQltYXBwaW5nLT5ucnBhZ2VzKys7CiAJCQlfX2luY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfRklMRV9QQUdFUyk7Ci0JCQlpZiAoUGFnZVN3YXBCYWNrZWQocGFnZSkpCi0JCQkJX19pbmNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX1NITUVNKTsKIAkJCXNwaW5fdW5sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKIAkJfSBlbHNlIHsKIAkJCXBhZ2UtPm1hcHBpbmcgPSBOVUxMOwpAQCAtNTAyLDIyICs1MDAsOSBAQAogewogCWludCByZXQ7CiAKLQkvKgotCSAqIFNwbGljZV9yZWFkIGFuZCByZWFkYWhlYWQgYWRkIHNobWVtL3RtcGZzIHBhZ2VzIGludG8gdGhlIHBhZ2UgY2FjaGUKLQkgKiBiZWZvcmUgc2htZW1fcmVhZHBhZ2UgaGFzIGEgY2hhbmNlIHRvIG1hcmsgdGhlbSBhcyBTd2FwQmFja2VkOiB0aGV5Ci0JICogbmVlZCB0byBnbyBvbiB0aGUgYW5vbiBscnUgYmVsb3csIGFuZCBtZW1fY2dyb3VwX2NhY2hlX2NoYXJnZQotCSAqIChjYWxsZWQgaW4gYWRkX3RvX3BhZ2VfY2FjaGUpIG5lZWRzIHRvIGtub3cgd2hlcmUgdGhleSdyZSBnb2luZyB0b28uCi0JICovCi0JaWYgKG1hcHBpbmdfY2FwX3N3YXBfYmFja2VkKG1hcHBpbmcpKQotCQlTZXRQYWdlU3dhcEJhY2tlZChwYWdlKTsKLQogCXJldCA9IGFkZF90b19wYWdlX2NhY2hlKHBhZ2UsIG1hcHBpbmcsIG9mZnNldCwgZ2ZwX21hc2spOwotCWlmIChyZXQgPT0gMCkgewotCQlpZiAocGFnZV9pc19maWxlX2NhY2hlKHBhZ2UpKQotCQkJbHJ1X2NhY2hlX2FkZF9maWxlKHBhZ2UpOwotCQllbHNlCi0JCQlscnVfY2FjaGVfYWRkX2Fub24ocGFnZSk7Ci0JfQorCWlmIChyZXQgPT0gMCkKKwkJbHJ1X2NhY2hlX2FkZF9maWxlKHBhZ2UpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhZGRfdG9fcGFnZV9jYWNoZV9scnUpOwpAQCAtNzE0LDkgKzY5OSwxNiBAQAogCQlwYWdlID0gcmFkaXhfdHJlZV9kZXJlZl9zbG90KHBhZ2VwKTsKIAkJaWYgKHVubGlrZWx5KCFwYWdlKSkKIAkJCWdvdG8gb3V0OwotCQlpZiAocmFkaXhfdHJlZV9kZXJlZl9yZXRyeShwYWdlKSkKLQkJCWdvdG8gcmVwZWF0OwotCisJCWlmIChyYWRpeF90cmVlX2V4Y2VwdGlvbihwYWdlKSkgeworCQkJaWYgKHJhZGl4X3RyZWVfZGVyZWZfcmV0cnkocGFnZSkpCisJCQkJZ290byByZXBlYXQ7CisJCQkvKgorCQkJICogT3RoZXJ3aXNlLCBzaG1lbS90bXBmcyBtdXN0IGJlIHN0b3JpbmcgYSBzd2FwIGVudHJ5CisJCQkgKiBoZXJlIGFzIGFuIGV4Y2VwdGlvbmFsIGVudHJ5OiBzbyByZXR1cm4gaXQgd2l0aG91dAorCQkJICogYXR0ZW1wdGluZyB0byByYWlzZSBwYWdlIGNvdW50LgorCQkJICovCisJCQlnb3RvIG91dDsKKwkJfQogCQlpZiAoIXBhZ2VfY2FjaGVfZ2V0X3NwZWN1bGF0aXZlKHBhZ2UpKQogCQkJZ290byByZXBlYXQ7CiAKQEAgLTc1Myw3ICs3NDUsNyBAQAogCiByZXBlYXQ6CiAJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UobWFwcGluZywgb2Zmc2V0KTsKLQlpZiAocGFnZSkgeworCWlmIChwYWdlICYmICFyYWRpeF90cmVlX2V4Y2VwdGlvbihwYWdlKSkgewogCQlsb2NrX3BhZ2UocGFnZSk7CiAJCS8qIEhhcyB0aGUgcGFnZSBiZWVuIHRydW5jYXRlZD8gKi8KIAkJaWYgKHVubGlrZWx5KHBhZ2UtPm1hcHBpbmcgIT0gbWFwcGluZykpIHsKQEAgLTg0MCw3ICs4MzIsNyBAQAogCXJjdV9yZWFkX2xvY2soKTsKIHJlc3RhcnQ6CiAJbnJfZm91bmQgPSByYWRpeF90cmVlX2dhbmdfbG9va3VwX3Nsb3QoJm1hcHBpbmctPnBhZ2VfdHJlZSwKLQkJCQkodm9pZCAqKiopcGFnZXMsIHN0YXJ0LCBucl9wYWdlcyk7CisJCQkJKHZvaWQgKioqKXBhZ2VzLCBOVUxMLCBzdGFydCwgbnJfcGFnZXMpOwogCXJldCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IG5yX2ZvdW5kOyBpKyspIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7CkBAIC04NDksMTMgKzg0MSwyMiBAQAogCQlpZiAodW5saWtlbHkoIXBhZ2UpKQogCQkJY29udGludWU7CiAKLQkJLyoKLQkJICogVGhpcyBjYW4gb25seSB0cmlnZ2VyIHdoZW4gdGhlIGVudHJ5IGF0IGluZGV4IDAgbW92ZXMgb3V0Ci0JCSAqIG9mIG9yIGJhY2sgdG8gdGhlIHJvb3Q6IG5vbmUgeWV0IGdvdHRlbiwgc2FmZSB0byByZXN0YXJ0LgotCQkgKi8KLQkJaWYgKHJhZGl4X3RyZWVfZGVyZWZfcmV0cnkocGFnZSkpIHsKLQkJCVdBUk5fT04oc3RhcnQgfCBpKTsKLQkJCWdvdG8gcmVzdGFydDsKKwkJaWYgKHJhZGl4X3RyZWVfZXhjZXB0aW9uKHBhZ2UpKSB7CisJCQlpZiAocmFkaXhfdHJlZV9kZXJlZl9yZXRyeShwYWdlKSkgeworCQkJCS8qCisJCQkJICogVHJhbnNpZW50IGNvbmRpdGlvbiB3aGljaCBjYW4gb25seSB0cmlnZ2VyCisJCQkJICogd2hlbiBlbnRyeSBhdCBpbmRleCAwIG1vdmVzIG91dCBvZiBvciBiYWNrCisJCQkJICogdG8gcm9vdDogbm9uZSB5ZXQgZ290dGVuLCBzYWZlIHRvIHJlc3RhcnQuCisJCQkJICovCisJCQkJV0FSTl9PTihzdGFydCB8IGkpOworCQkJCWdvdG8gcmVzdGFydDsKKwkJCX0KKwkJCS8qCisJCQkgKiBPdGhlcndpc2UsIHNobWVtL3RtcGZzIG11c3QgYmUgc3RvcmluZyBhIHN3YXAgZW50cnkKKwkJCSAqIGhlcmUgYXMgYW4gZXhjZXB0aW9uYWwgZW50cnk6IHNvIHNraXAgb3ZlciBpdCAtCisJCQkgKiB3ZSBvbmx5IHJlYWNoIHRoaXMgZnJvbSBpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoKS4KKwkJCSAqLworCQkJY29udGludWU7CiAJCX0KIAogCQlpZiAoIXBhZ2VfY2FjaGVfZ2V0X3NwZWN1bGF0aXZlKHBhZ2UpKQpAQCAtOTAzLDcgKzkwNCw3IEBACiAJcmN1X3JlYWRfbG9jaygpOwogcmVzdGFydDoKIAlucl9mb3VuZCA9IHJhZGl4X3RyZWVfZ2FuZ19sb29rdXBfc2xvdCgmbWFwcGluZy0+cGFnZV90cmVlLAotCQkJCSh2b2lkICoqKilwYWdlcywgaW5kZXgsIG5yX3BhZ2VzKTsKKwkJCQkodm9pZCAqKiopcGFnZXMsIE5VTEwsIGluZGV4LCBucl9wYWdlcyk7CiAJcmV0ID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgbnJfZm91bmQ7IGkrKykgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKQEAgLTkxMiwxMiArOTEzLDIyIEBACiAJCWlmICh1bmxpa2VseSghcGFnZSkpCiAJCQljb250aW51ZTsKIAotCQkvKgotCQkgKiBUaGlzIGNhbiBvbmx5IHRyaWdnZXIgd2hlbiB0aGUgZW50cnkgYXQgaW5kZXggMCBtb3ZlcyBvdXQKLQkJICogb2Ygb3IgYmFjayB0byB0aGUgcm9vdDogbm9uZSB5ZXQgZ290dGVuLCBzYWZlIHRvIHJlc3RhcnQuCi0JCSAqLwotCQlpZiAocmFkaXhfdHJlZV9kZXJlZl9yZXRyeShwYWdlKSkKLQkJCWdvdG8gcmVzdGFydDsKKwkJaWYgKHJhZGl4X3RyZWVfZXhjZXB0aW9uKHBhZ2UpKSB7CisJCQlpZiAocmFkaXhfdHJlZV9kZXJlZl9yZXRyeShwYWdlKSkgeworCQkJCS8qCisJCQkJICogVHJhbnNpZW50IGNvbmRpdGlvbiB3aGljaCBjYW4gb25seSB0cmlnZ2VyCisJCQkJICogd2hlbiBlbnRyeSBhdCBpbmRleCAwIG1vdmVzIG91dCBvZiBvciBiYWNrCisJCQkJICogdG8gcm9vdDogbm9uZSB5ZXQgZ290dGVuLCBzYWZlIHRvIHJlc3RhcnQuCisJCQkJICovCisJCQkJZ290byByZXN0YXJ0OworCQkJfQorCQkJLyoKKwkJCSAqIE90aGVyd2lzZSwgc2htZW0vdG1wZnMgbXVzdCBiZSBzdG9yaW5nIGEgc3dhcCBlbnRyeQorCQkJICogaGVyZSBhcyBhbiBleGNlcHRpb25hbCBlbnRyeTogc28gc3RvcCBsb29raW5nIGZvcgorCQkJICogY29udGlndW91cyBwYWdlcy4KKwkJCSAqLworCQkJYnJlYWs7CisJCX0KIAogCQlpZiAoIXBhZ2VfY2FjaGVfZ2V0X3NwZWN1bGF0aXZlKHBhZ2UpKQogCQkJZ290byByZXBlYXQ7CkBAIC05NzcsMTIgKzk4OCwyMSBAQAogCQlpZiAodW5saWtlbHkoIXBhZ2UpKQogCQkJY29udGludWU7CiAKLQkJLyoKLQkJICogVGhpcyBjYW4gb25seSB0cmlnZ2VyIHdoZW4gdGhlIGVudHJ5IGF0IGluZGV4IDAgbW92ZXMgb3V0Ci0JCSAqIG9mIG9yIGJhY2sgdG8gdGhlIHJvb3Q6IG5vbmUgeWV0IGdvdHRlbiwgc2FmZSB0byByZXN0YXJ0LgotCQkgKi8KLQkJaWYgKHJhZGl4X3RyZWVfZGVyZWZfcmV0cnkocGFnZSkpCi0JCQlnb3RvIHJlc3RhcnQ7CisJCWlmIChyYWRpeF90cmVlX2V4Y2VwdGlvbihwYWdlKSkgeworCQkJaWYgKHJhZGl4X3RyZWVfZGVyZWZfcmV0cnkocGFnZSkpIHsKKwkJCQkvKgorCQkJCSAqIFRyYW5zaWVudCBjb25kaXRpb24gd2hpY2ggY2FuIG9ubHkgdHJpZ2dlcgorCQkJCSAqIHdoZW4gZW50cnkgYXQgaW5kZXggMCBtb3ZlcyBvdXQgb2Ygb3IgYmFjaworCQkJCSAqIHRvIHJvb3Q6IG5vbmUgeWV0IGdvdHRlbiwgc2FmZSB0byByZXN0YXJ0LgorCQkJCSAqLworCQkJCWdvdG8gcmVzdGFydDsKKwkJCX0KKwkJCS8qCisJCQkgKiBUaGlzIGZ1bmN0aW9uIGlzIG5ldmVyIHVzZWQgb24gYSBzaG1lbS90bXBmcworCQkJICogbWFwcGluZywgc28gYSBzd2FwIGVudHJ5IHdvbid0IGJlIGZvdW5kIGhlcmUuCisJCQkgKi8KKwkJCUJVRygpOworCQl9CiAKIAkJaWYgKCFwYWdlX2NhY2hlX2dldF9zcGVjdWxhdGl2ZShwYWdlKSkKIAkJCWdvdG8gcmVwZWF0OwpkaWZmIC0tZ2l0IGEvbW0vbWVtY29udHJvbC5jIGIvbW0vbWVtY29udHJvbC5jCmluZGV4IDVmODRkMjM1Li5mNGVjNGU3IDEwMDY0NAotLS0gYS9tbS9tZW1jb250cm9sLmMKKysrIGIvbW0vbWVtY29udHJvbC5jCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KLSNpbmNsdWRlIDxsaW51eC9zaG1lbV9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcG9wcy5oPgpAQCAtMjg3MywzMCArMjg3Miw2IEBACiAJCXJldHVybiAwOwogCWlmIChQYWdlQ29tcG91bmQocGFnZSkpCiAJCXJldHVybiAwOwotCS8qCi0JICogQ29ybmVyIGNhc2UgaGFuZGxpbmcuIFRoaXMgaXMgY2FsbGVkIGZyb20gYWRkX3RvX3BhZ2VfY2FjaGUoKQotCSAqIGluIHVzdWFsLiBCdXQgc29tZSBGUyAoc2htZW0pIHByZWNoYXJnZXMgdGhpcyBwYWdlIGJlZm9yZSBjYWxsaW5nIGl0Ci0JICogYW5kIGNhbGwgYWRkX3RvX3BhZ2VfY2FjaGUoKSB3aXRoIEdGUF9OT1dBSVQuCi0JICoKLQkgKiBGb3IgR0ZQX05PV0FJVCBjYXNlLCB0aGUgcGFnZSBtYXkgYmUgcHJlLWNoYXJnZWQgYmVmb3JlIGNhbGxpbmcKLQkgKiBhZGRfdG9fcGFnZV9jYWNoZSgpLiAoU2VlIHNobWVtLmMpIGNoZWNrIGl0IGhlcmUgYW5kIGF2b2lkIHRvIGNhbGwKLQkgKiBjaGFyZ2UgdHdpY2UuIChJdCB3b3JrcyBidXQgaGFzIHRvIHBheSBhIGJpdCBsYXJnZXIgY29zdC4pCi0JICogQW5kIHdoZW4gdGhlIHBhZ2UgaXMgU3dhcENhY2hlLCBpdCBzaG91bGQgdGFrZSBzd2FwIGluZm9ybWF0aW9uCi0JICogaW50byBhY2NvdW50LiBUaGlzIGlzIHVuZGVyIGxvY2tfcGFnZSgpIG5vdy4KLQkgKi8KLQlpZiAoIShnZnBfbWFzayAmIF9fR0ZQX1dBSVQpKSB7Ci0JCXN0cnVjdCBwYWdlX2Nncm91cCAqcGM7Ci0KLQkJcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAocGFnZSk7Ci0JCWlmICghcGMpCi0JCQlyZXR1cm4gMDsKLQkJbG9ja19wYWdlX2Nncm91cChwYyk7Ci0JCWlmIChQYWdlQ2dyb3VwVXNlZChwYykpIHsKLQkJCXVubG9ja19wYWdlX2Nncm91cChwYyk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOwotCX0KIAogCWlmICh1bmxpa2VseSghbW0pKQogCQltbSA9ICZpbml0X21tOwpAQCAtMzQ4NiwzMSArMzQ2MSw2IEBACiAJY2dyb3VwX3JlbGVhc2VfYW5kX3dha2V1cF9ybWRpcigmbWVtLT5jc3MpOwogfQogCi0vKgotICogQSBjYWxsIHRvIHRyeSB0byBzaHJpbmsgbWVtb3J5IHVzYWdlIG9uIGNoYXJnZSBmYWlsdXJlIGF0IHNobWVtJ3Mgc3dhcGluLgotICogQ2FsbGluZyBoaWVyYXJjaGljYWxfcmVjbGFpbSBpcyBub3QgZW5vdWdoIGJlY2F1c2Ugd2Ugc2hvdWxkIHVwZGF0ZQotICogbGFzdF9vb21famlmZmllcyB0byBwcmV2ZW50IHBhZ2VmYXVsdF9vdXRfb2ZfbWVtb3J5IGZyb20gaW52b2tpbmcgZ2xvYmFsIE9PTS4KLSAqIE1vcmVvdmVyIGNvbnNpZGVyaW5nIGhpZXJhcmNoeSwgd2Ugc2hvdWxkIHJlY2xhaW0gZnJvbSB0aGUgbWVtX292ZXJfbGltaXQsCi0gKiBub3QgZnJvbSB0aGUgbWVtY2cgd2hpY2ggdGhpcyBwYWdlIHdvdWxkIGJlIGNoYXJnZWQgdG8uCi0gKiB0cnlfY2hhcmdlX3N3YXBpbiBkb2VzIGFsbCBvZiB0aGVzZSB3b3JrcyBwcm9wZXJseS4KLSAqLwotaW50IG1lbV9jZ3JvdXBfc2htZW1fY2hhcmdlX2ZhbGxiYWNrKHN0cnVjdCBwYWdlICpwYWdlLAotCQkJICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAotCQkJICAgIGdmcF90IGdmcF9tYXNrKQotewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW07Ci0JaW50IHJldDsKLQotCWlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpCi0JCXJldHVybiAwOwotCi0JcmV0ID0gbWVtX2Nncm91cF90cnlfY2hhcmdlX3N3YXBpbihtbSwgcGFnZSwgZ2ZwX21hc2ssICZtZW0pOwotCWlmICghcmV0KQotCQltZW1fY2dyb3VwX2NhbmNlbF9jaGFyZ2Vfc3dhcGluKG1lbSk7IC8qIGl0IGRvZXMgIW1lbSBjaGVjayAqLwotCi0JcmV0dXJuIHJldDsKLX0KLQogI2lmZGVmIENPTkZJR19ERUJVR19WTQogc3RhdGljIHN0cnVjdCBwYWdlX2Nncm91cCAqbG9va3VwX3BhZ2VfY2dyb3VwX3VzZWQoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CkBAIC01MzMwLDE1ICs1MjgwLDE3IEBACiAJCXBnb2ZmID0gcHRlX3RvX3Bnb2ZmKHB0ZW50KTsKIAogCS8qIHBhZ2UgaXMgbW92ZWQgZXZlbiBpZiBpdCdzIG5vdCBSU1Mgb2YgdGhpcyB0YXNrKHBhZ2UtZmF1bHRlZCkuICovCi0JaWYgKCFtYXBwaW5nX2NhcF9zd2FwX2JhY2tlZChtYXBwaW5nKSkgeyAvKiBub3JtYWwgZmlsZSAqLwotCQlwYWdlID0gZmluZF9nZXRfcGFnZShtYXBwaW5nLCBwZ29mZik7Ci0JfSBlbHNlIHsgLyogc2htZW0vdG1wZnMgZmlsZS4gd2Ugc2hvdWxkIHRha2UgYWNjb3VudCBvZiBzd2FwIHRvby4gKi8KLQkJc3dwX2VudHJ5X3QgZW50OwotCQltZW1fY2dyb3VwX2dldF9zaG1lbV90YXJnZXQoaW5vZGUsIHBnb2ZmLCAmcGFnZSwgJmVudCk7Ci0JCWlmIChkb19zd2FwX2FjY291bnQpCi0JCQllbnRyeS0+dmFsID0gZW50LnZhbDsKLQl9CisJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UobWFwcGluZywgcGdvZmYpOwogCisjaWZkZWYgQ09ORklHX1NXQVAKKwkvKiBzaG1lbS90bXBmcyBtYXkgcmVwb3J0IHBhZ2Ugb3V0IG9uIHN3YXA6IGFjY291bnQgZm9yIHRoYXQgdG9vLiAqLworCWlmIChyYWRpeF90cmVlX2V4Y2VwdGlvbmFsX2VudHJ5KHBhZ2UpKSB7CisJCXN3cF9lbnRyeV90IHN3YXAgPSByYWRpeF90b19zd3BfZW50cnkocGFnZSk7CisJCWlmIChkb19zd2FwX2FjY291bnQpCisJCQkqZW50cnkgPSBzd2FwOworCQlwYWdlID0gZmluZF9nZXRfcGFnZSgmc3dhcHBlcl9zcGFjZSwgc3dhcC52YWwpOworCX0KKyNlbmRpZgogCXJldHVybiBwYWdlOwogfQogCmRpZmYgLS1naXQgYS9tbS9tZW1vcnktZmFpbHVyZS5jIGIvbW0vbWVtb3J5LWZhaWx1cmUuYwppbmRleCA3NDBjNGY1Li4yYjQzYmEwIDEwMDY0NAotLS0gYS9tbS9tZW1vcnktZmFpbHVyZS5jCisrKyBiL21tL21lbW9yeS1mYWlsdXJlLmMKQEAgLTUzLDYgKzUzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtb3J5X2hvdHBsdWcuaD4KICNpbmNsdWRlIDxsaW51eC9tbV9pbmxpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKIGludCBzeXNjdGxfbWVtb3J5X2ZhaWx1cmVfZWFybHlfa2lsbCBfX3JlYWRfbW9zdGx5ID0gMDsKQEAgLTExNzgsNiArMTE3OSw5NyBAQAogCV9fbWVtb3J5X2ZhaWx1cmUocGZuLCB0cmFwbm8sIDApOwogfQogCisjZGVmaW5lIE1FTU9SWV9GQUlMVVJFX0ZJRk9fT1JERVIJNAorI2RlZmluZSBNRU1PUllfRkFJTFVSRV9GSUZPX1NJWkUJKDEgPDwgTUVNT1JZX0ZBSUxVUkVfRklGT19PUkRFUikKKworc3RydWN0IG1lbW9yeV9mYWlsdXJlX2VudHJ5IHsKKwl1bnNpZ25lZCBsb25nIHBmbjsKKwlpbnQgdHJhcG5vOworCWludCBmbGFnczsKK307CisKK3N0cnVjdCBtZW1vcnlfZmFpbHVyZV9jcHUgeworCURFQ0xBUkVfS0ZJRk8oZmlmbywgc3RydWN0IG1lbW9yeV9mYWlsdXJlX2VudHJ5LAorCQkgICAgICBNRU1PUllfRkFJTFVSRV9GSUZPX1NJWkUpOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKK307CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbWVtb3J5X2ZhaWx1cmVfY3B1LCBtZW1vcnlfZmFpbHVyZV9jcHUpOworCisvKioKKyAqIG1lbW9yeV9mYWlsdXJlX3F1ZXVlIC0gU2NoZWR1bGUgaGFuZGxpbmcgbWVtb3J5IGZhaWx1cmUgb2YgYSBwYWdlLgorICogQHBmbjogUGFnZSBOdW1iZXIgb2YgdGhlIGNvcnJ1cHRlZCBwYWdlCisgKiBAdHJhcG5vOiBUcmFwIG51bWJlciByZXBvcnRlZCBpbiB0aGUgc2lnbmFsIHRvIHVzZXIgc3BhY2UuCisgKiBAZmxhZ3M6IEZsYWdzIGZvciBtZW1vcnkgZmFpbHVyZSBoYW5kbGluZworICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgZXJyb3IgaGFuZGxlcgorICogd2hlbiBpdCBkZXRlY3RzIGhhcmR3YXJlIG1lbW9yeSBjb3JydXB0aW9uIG9mIGEgcGFnZS4gSXQgc2NoZWR1bGVzCisgKiB0aGUgcmVjb3ZlcmluZyBvZiBlcnJvciBwYWdlLCBpbmNsdWRpbmcgZHJvcHBpbmcgcGFnZXMsIGtpbGxpbmcKKyAqIHByb2Nlc3NlcyBldGMuCisgKgorICogVGhlIGZ1bmN0aW9uIGlzIHByaW1hcmlseSBvZiB1c2UgZm9yIGNvcnJ1cHRpb25zIHRoYXQKKyAqIGhhcHBlbiBvdXRzaWRlIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0IChlLmcuIHdoZW4KKyAqIGRldGVjdGVkIGJ5IGEgYmFja2dyb3VuZCBzY3J1YmJlcikKKyAqCisgKiBDYW4gcnVuIGluIElSUSBjb250ZXh0LgorICovCit2b2lkIG1lbW9yeV9mYWlsdXJlX3F1ZXVlKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgdHJhcG5vLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IG1lbW9yeV9mYWlsdXJlX2NwdSAqbWZfY3B1OworCXVuc2lnbmVkIGxvbmcgcHJvY19mbGFnczsKKwlzdHJ1Y3QgbWVtb3J5X2ZhaWx1cmVfZW50cnkgZW50cnkgPSB7CisJCS5wZm4gPQkJcGZuLAorCQkudHJhcG5vID0JdHJhcG5vLAorCQkuZmxhZ3MgPQlmbGFncywKKwl9OworCisJbWZfY3B1ID0gJmdldF9jcHVfdmFyKG1lbW9yeV9mYWlsdXJlX2NwdSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm1mX2NwdS0+bG9jaywgcHJvY19mbGFncyk7CisJaWYgKGtmaWZvX3B1dCgmbWZfY3B1LT5maWZvLCAmZW50cnkpKQorCQlzY2hlZHVsZV93b3JrX29uKHNtcF9wcm9jZXNzb3JfaWQoKSwgJm1mX2NwdS0+d29yayk7CisJZWxzZQorCQlwcl9lcnIoIk1lbW9yeSBmYWlsdXJlOiBidWZmZXIgb3ZlcmZsb3cgd2hlbiBxdWV1aW5nIG1lbW9yeSBmYWlsdXJlIGF0IDB4JSNseFxuIiwKKwkJICAgICAgIHBmbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWZfY3B1LT5sb2NrLCBwcm9jX2ZsYWdzKTsKKwlwdXRfY3B1X3ZhcihtZW1vcnlfZmFpbHVyZV9jcHUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobWVtb3J5X2ZhaWx1cmVfcXVldWUpOworCitzdGF0aWMgdm9pZCBtZW1vcnlfZmFpbHVyZV93b3JrX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBtZW1vcnlfZmFpbHVyZV9jcHUgKm1mX2NwdTsKKwlzdHJ1Y3QgbWVtb3J5X2ZhaWx1cmVfZW50cnkgZW50cnkgPSB7IDAsIH07CisJdW5zaWduZWQgbG9uZyBwcm9jX2ZsYWdzOworCWludCBnb3R0ZW47CisKKwltZl9jcHUgPSAmX19nZXRfY3B1X3ZhcihtZW1vcnlfZmFpbHVyZV9jcHUpOworCWZvciAoOzspIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1mX2NwdS0+bG9jaywgcHJvY19mbGFncyk7CisJCWdvdHRlbiA9IGtmaWZvX2dldCgmbWZfY3B1LT5maWZvLCAmZW50cnkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZl9jcHUtPmxvY2ssIHByb2NfZmxhZ3MpOworCQlpZiAoIWdvdHRlbikKKwkJCWJyZWFrOworCQlfX21lbW9yeV9mYWlsdXJlKGVudHJ5LnBmbiwgZW50cnkudHJhcG5vLCBlbnRyeS5mbGFncyk7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBtZW1vcnlfZmFpbHVyZV9pbml0KHZvaWQpCit7CisJc3RydWN0IG1lbW9yeV9mYWlsdXJlX2NwdSAqbWZfY3B1OworCWludCBjcHU7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCW1mX2NwdSA9ICZwZXJfY3B1KG1lbW9yeV9mYWlsdXJlX2NwdSwgY3B1KTsKKwkJc3Bpbl9sb2NrX2luaXQoJm1mX2NwdS0+bG9jayk7CisJCUlOSVRfS0ZJRk8obWZfY3B1LT5maWZvKTsKKwkJSU5JVF9XT1JLKCZtZl9jcHUtPndvcmssIG1lbW9yeV9mYWlsdXJlX3dvcmtfZnVuYyk7CisJfQorCisJcmV0dXJuIDA7Cit9Citjb3JlX2luaXRjYWxsKG1lbW9yeV9mYWlsdXJlX2luaXQpOworCiAvKioKICAqIHVucG9pc29uX21lbW9yeSAtIFVucG9pc29uIGEgcHJldmlvdXNseSBwb2lzb25lZCBwYWdlCiAgKiBAcGZuOiBQYWdlIG51bWJlciBvZiB0aGUgdG8gYmUgdW5wb2lzb25lZCBwYWdlCmRpZmYgLS1naXQgYS9tbS9taW5jb3JlLmMgYi9tbS9taW5jb3JlLmMKaW5kZXggYTRlNmI5ZC4uNjM2YTg2OCAxMDA2NDQKLS0tIGEvbW0vbWluY29yZS5jCisrKyBiL21tL21pbmNvcmUuYwpAQCAtNjksMTIgKzY5LDE1IEBACiAJICogZmlsZSB3aWxsIG5vdCBnZXQgYSBzd3BfZW50cnlfdCBpbiBpdHMgcHRlLCBidXQgcmF0aGVyIGl0IGlzIGxpa2UKIAkgKiBhbnkgb3RoZXIgZmlsZSBtYXBwaW5nIChpZS4gbWFya2VkICFwcmVzZW50IGFuZCBmYXVsdGVkIGluIHdpdGgKIAkgKiB0bXBmcydzIC5mYXVsdCkuIFNvIHN3YXBwZWQgb3V0IHRtcGZzIG1hcHBpbmdzIGFyZSB0ZXN0ZWQgaGVyZS4KLQkgKgotCSAqIEhvd2V2ZXIgd2hlbiB0bXBmcyBtb3ZlcyB0aGUgcGFnZSBmcm9tIHBhZ2VjYWNoZSBhbmQgaW50byBzd2FwY2FjaGUsCi0JICogaXQgaXMgc3RpbGwgaW4gY29yZSwgYnV0IHRoZSBmaW5kX2dldF9wYWdlIGJlbG93IHdvbid0IGZpbmQgaXQuCi0JICogTm8gYmlnIGRlYWwsIGJ1dCBtYWtlIGEgbm90ZSBvZiBpdC4KIAkgKi8KIAlwYWdlID0gZmluZF9nZXRfcGFnZShtYXBwaW5nLCBwZ29mZik7CisjaWZkZWYgQ09ORklHX1NXQVAKKwkvKiBzaG1lbS90bXBmcyBtYXkgcmV0dXJuIHN3YXA6IGFjY291bnQgZm9yIHN3YXBjYWNoZSBwYWdlIHRvby4gKi8KKwlpZiAocmFkaXhfdHJlZV9leGNlcHRpb25hbF9lbnRyeShwYWdlKSkgeworCQlzd3BfZW50cnlfdCBzd2FwID0gcmFkaXhfdG9fc3dwX2VudHJ5KHBhZ2UpOworCQlwYWdlID0gZmluZF9nZXRfcGFnZSgmc3dhcHBlcl9zcGFjZSwgc3dhcC52YWwpOworCX0KKyNlbmRpZgogCWlmIChwYWdlKSB7CiAJCXByZXNlbnQgPSBQYWdlVXB0b2RhdGUocGFnZSk7CiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKZGlmZiAtLWdpdCBhL21tL29vbV9raWxsLmMgYi9tbS9vb21fa2lsbC5jCmluZGV4IGVhZmZmODkuLjYyNjMwM2I1IDEwMDY0NAotLS0gYS9tbS9vb21fa2lsbC5jCisrKyBiL21tL29vbV9raWxsLmMKQEAgLTMwMyw3ICszMDMsNyBAQAogCWRvX2VhY2hfdGhyZWFkKGcsIHApIHsKIAkJdW5zaWduZWQgaW50IHBvaW50czsKIAotCQlpZiAoIXAtPm1tKQorCQlpZiAocC0+ZXhpdF9zdGF0ZSkKIAkJCWNvbnRpbnVlOwogCQlpZiAob29tX3Vua2lsbGFibGVfdGFzayhwLCBtZW0sIG5vZGVtYXNrKSkKIAkJCWNvbnRpbnVlOwpAQCAtMzE5LDYgKzMxOSw4IEBACiAJCSAqLwogCQlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcocCwgVElGX01FTURJRSkpCiAJCQlyZXR1cm4gRVJSX1BUUigtMVVMKTsKKwkJaWYgKCFwLT5tbSkKKwkJCWNvbnRpbnVlOwogCiAJCWlmIChwLT5mbGFncyAmIFBGX0VYSVRJTkcpIHsKIAkJCS8qCmRpZmYgLS1naXQgYS9tbS9wYWdlX2FsbG9jLmMgYi9tbS9wYWdlX2FsbG9jLmMKaW5kZXggMWRiY2Y4OC4uNmU4ZWNiNiAxMDA2NDQKLS0tIGEvbW0vcGFnZV9hbGxvYy5jCisrKyBiL21tL3BhZ2VfYWxsb2MuYwpAQCAtMTQwOSwxNCArMTQwOSwxMSBAQAogewogCW1vZGVfdCBtb2RlID0gU19JRlJFRyB8IFNfSVJVU1IgfCBTX0lXVVNSOwogCXN0cnVjdCBkZW50cnkgKmRpcjsKLQlpbnQgZXJyOwogCi0JZXJyID0gaW5pdF9mYXVsdF9hdHRyX2RlbnRyaWVzKCZmYWlsX3BhZ2VfYWxsb2MuYXR0ciwKLQkJCQkgICAgICAgImZhaWxfcGFnZV9hbGxvYyIpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlkaXIgPSBmYWlsX3BhZ2VfYWxsb2MuYXR0ci5kaXI7CisJZGlyID0gZmF1bHRfY3JlYXRlX2RlYnVnZnNfYXR0cigiZmFpbF9wYWdlX2FsbG9jIiwgTlVMTCwKKwkJCQkJJmZhaWxfcGFnZV9hbGxvYy5hdHRyKTsKKwlpZiAoSVNfRVJSKGRpcikpCisJCXJldHVybiBQVFJfRVJSKGRpcik7CiAKIAlpZiAoIWRlYnVnZnNfY3JlYXRlX2Jvb2woImlnbm9yZS1nZnAtd2FpdCIsIG1vZGUsIGRpciwKIAkJCQkmZmFpbF9wYWdlX2FsbG9jLmlnbm9yZV9nZnBfd2FpdCkpCkBAIC0xNDMwLDcgKzE0MjcsNyBAQAogCiAJcmV0dXJuIDA7CiBmYWlsOgotCWNsZWFudXBfZmF1bHRfYXR0cl9kZW50cmllcygmZmFpbF9wYWdlX2FsbG9jLmF0dHIpOworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkaXIpOwogCiAJcmV0dXJuIC1FTk9NRU07CiB9CmRpZmYgLS1naXQgYS9tbS9zaG1lbS5jIGIvbW0vc2htZW0uYwppbmRleCA1Y2MyMWY4Li4zMmY2NzYzIDEwMDY0NAotLS0gYS9tbS9zaG1lbS5jCisrKyBiL21tL3NobWVtLmMKQEAgLTYsNyArNiw4IEBACiAgKgkJIDIwMDAtMjAwMSBDaHJpc3RvcGggUm9obGFuZAogICoJCSAyMDAwLTIwMDEgU0FQIEFHCiAgKgkJIDIwMDIgUmVkIEhhdCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBIdWdoIERpY2tpbnMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMSBIdWdoIERpY2tpbnMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KICAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFZFUklUQVMgU29mdHdhcmUgQ29ycG9yYXRpb24uCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQgQW5kaSBLbGVlbiwgU3VTRSBMYWJzCiAgKgpAQCAtMjgsNyArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BlcmNwdV9jb3VudGVyLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogCiBzdGF0aWMgc3RydWN0IHZmc21vdW50ICpzaG1fbW50OwpAQCAtNTEsNiArNTEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NobWVtX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcGFnZXZlYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdV9jb3VudGVyLmg+CiAjaW5jbHVkZSA8bGludXgvc3BsaWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zd2Fwb3BzLmg+CkBAIC02Myw0MyArNjUsMTcgQEAKICNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogCi0vKgotICogVGhlIG1heGltdW0gc2l6ZSBvZiBhIHNobWVtL3RtcGZzIGZpbGUgaXMgbGltaXRlZCBieSB0aGUgbWF4aW11bSBzaXplIG9mCi0gKiBpdHMgdHJpcGxlLWluZGlyZWN0IHN3YXAgdmVjdG9yIC0gc2VlIGlsbHVzdHJhdGlvbiBhdCBzaG1lbV9zd3BfZW50cnkoKS4KLSAqCi0gKiBXaXRoIDRrQiBwYWdlIHNpemUsIG1heGltdW0gZmlsZSBzaXplIGlzIGp1c3Qgb3ZlciAyVEIgb24gYSAzMi1iaXQga2VybmVsLAotICogYnV0IG9uZSBlaWdodGggb2YgdGhhdCBvbiBhIDY0LWJpdCBrZXJuZWwuICBXaXRoIDhrQiBwYWdlIHNpemUsIG1heGltdW0KLSAqIGZpbGUgc2l6ZSBpcyBqdXN0IG92ZXIgNFRCIG9uIGEgNjQtYml0IGtlcm5lbCwgYnV0IDE2VEIgb24gYSAzMi1iaXQga2VybmVsLAotICogTUFYX0xGU19GSUxFU0laRSBiZWluZyB0aGVuIG1vcmUgcmVzdHJpY3RpdmUgdGhhbiBzd2FwIHZlY3RvciBsYXlvdXQuCi0gKgotICogV2UgdXNlIC8gYW5kICogaW5zdGVhZCBvZiBzaGlmdHMgaW4gdGhlIGRlZmluaXRpb25zIGJlbG93LCBzbyB0aGF0IHRoZSBzd2FwCi0gKiB2ZWN0b3IgY2FuIGJlIHRlc3RlZCB3aXRoIHNtYWxsIGV2ZW4gdmFsdWVzIChlLmcuIDIwKSBmb3IgRU5UUklFU19QRVJfUEFHRS4KLSAqLwotI2RlZmluZSBFTlRSSUVTX1BFUl9QQUdFIChQQUdFX0NBQ0hFX1NJWkUvc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQotI2RlZmluZSBFTlRSSUVTX1BFUl9QQUdFUEFHRSAoKHVuc2lnbmVkIGxvbmcgbG9uZylFTlRSSUVTX1BFUl9QQUdFKkVOVFJJRVNfUEVSX1BBR0UpCi0KLSNkZWZpbmUgU0hNU1dQX01BWF9JTkRFWCAoU0hNRU1fTlJfRElSRUNUICsgKEVOVFJJRVNfUEVSX1BBR0VQQUdFLzIpICogKEVOVFJJRVNfUEVSX1BBR0UrMSkpCi0jZGVmaW5lIFNITVNXUF9NQVhfQllURVMgKFNITVNXUF9NQVhfSU5ERVggPDwgUEFHRV9DQUNIRV9TSElGVCkKLQotI2RlZmluZSBTSE1FTV9NQVhfQllURVMgIG1pbl90KHVuc2lnbmVkIGxvbmcgbG9uZywgU0hNU1dQX01BWF9CWVRFUywgTUFYX0xGU19GSUxFU0laRSkKLSNkZWZpbmUgU0hNRU1fTUFYX0lOREVYICAoKHVuc2lnbmVkIGxvbmcpKChTSE1FTV9NQVhfQllURVMrMSkgPj4gUEFHRV9DQUNIRV9TSElGVCkpCi0KICNkZWZpbmUgQkxPQ0tTX1BFUl9QQUdFICAoUEFHRV9DQUNIRV9TSVpFLzUxMikKICNkZWZpbmUgVk1fQUNDVChzaXplKSAgICAoUEFHRV9DQUNIRV9BTElHTihzaXplKSA+PiBQQUdFX1NISUZUKQogCi0vKiBpbmZvLT5mbGFncyBuZWVkcyBWTV9mbGFncyB0byBoYW5kbGUgcGFnZWluL3RydW5jYXRlIHJhY2VzIGVmZmljaWVudGx5ICovCi0jZGVmaW5lIFNITUVNX1BBR0VJTgkgVk1fUkVBRAotI2RlZmluZSBTSE1FTV9UUlVOQ0FURQkgVk1fV1JJVEUKLQotLyogRGVmaW5pdGlvbiB0byBsaW1pdCBzaG1lbV90cnVuY2F0ZSdzIHN0ZXBzIGJldHdlZW4gY29uZF9yZXNjaGVkcyAqLwotI2RlZmluZSBMQVRFTkNZX0xJTUlUCSA2NAotCiAvKiBQcmV0ZW5kIHRoYXQgZWFjaCBlbnRyeSBpcyBvZiB0aGlzIHNpemUgaW4gZGlyZWN0b3J5J3MgaV9zaXplICovCiAjZGVmaW5lIEJPR09fRElSRU5UX1NJWkUgMjAKIAorLyogU3ltbGluayB1cCB0byB0aGlzIHNpemUgaXMga21hbGxvYydlZCBpbnN0ZWFkIG9mIHVzaW5nIGEgc3dhcHBhYmxlIHBhZ2UgKi8KKyNkZWZpbmUgU0hPUlRfU1lNTElOS19MRU4gMTI4CisKIHN0cnVjdCBzaG1lbV94YXR0ciB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKiBhbmNob3JlZCBieSBzaG1lbV9pbm9kZV9pbmZvLT54YXR0cl9saXN0ICovCiAJY2hhciAqbmFtZTsJCS8qIHhhdHRyIG5hbWUgKi8KQEAgLTEwNyw3ICs4Myw3IEBACiAJY2hhciB2YWx1ZVswXTsKIH07CiAKLS8qIEZsYWcgYWxsb2NhdGlvbiByZXF1aXJlbWVudHMgdG8gc2htZW1fZ2V0cGFnZSBhbmQgc2htZW1fc3dwX2FsbG9jICovCisvKiBGbGFnIGFsbG9jYXRpb24gcmVxdWlyZW1lbnRzIHRvIHNobWVtX2dldHBhZ2UgKi8KIGVudW0gc2dwX3R5cGUgewogCVNHUF9SRUFELAkvKiBkb24ndCBleGNlZWQgaV9zaXplLCBkb24ndCBhbGxvY2F0ZSBwYWdlICovCiAJU0dQX0NBQ0hFLAkvKiBkb24ndCBleGNlZWQgaV9zaXplLCBtYXkgYWxsb2NhdGUgcGFnZSAqLwpAQCAtMTM3LDU2ICsxMTMsNiBAQAogCQkJbWFwcGluZ19nZnBfbWFzayhpbm9kZS0+aV9tYXBwaW5nKSwgZmF1bHRfdHlwZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnNobWVtX2Rpcl9hbGxvYyhnZnBfdCBnZnBfbWFzaykKLXsKLQkvKgotCSAqIFRoZSBhYm92ZSBkZWZpbml0aW9uIG9mIEVOVFJJRVNfUEVSX1BBR0UsIGFuZCB0aGUgdXNlIG9mCi0JICogQkxPQ0tTX1BFUl9QQUdFIG9uIGluZGlyZWN0IHBhZ2VzLCBhc3N1bWUgUEFHRV9DQUNIRV9TSVpFOgotCSAqIG1pZ2h0IGJlIHJlY29uc2lkZXJlZCBpZiBpdCBldmVyIGRpdmVyZ2VzIGZyb20gUEFHRV9TSVpFLgotCSAqCi0JICogTW9iaWxpdHkgZmxhZ3MgYXJlIG1hc2tlZCBvdXQgYXMgc3dhcCB2ZWN0b3JzIGNhbm5vdCBtb3ZlCi0JICovCi0JcmV0dXJuIGFsbG9jX3BhZ2VzKChnZnBfbWFzayAmIH5HRlBfTU9WQUJMRV9NQVNLKSB8IF9fR0ZQX1pFUk8sCi0JCQkJUEFHRV9DQUNIRV9TSElGVC1QQUdFX1NISUZUKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNobWVtX2Rpcl9mcmVlKHN0cnVjdCBwYWdlICpwYWdlKQotewotCV9fZnJlZV9wYWdlcyhwYWdlLCBQQUdFX0NBQ0hFX1NISUZULVBBR0VfU0hJRlQpOwotfQotCi1zdGF0aWMgc3RydWN0IHBhZ2UgKipzaG1lbV9kaXJfbWFwKHN0cnVjdCBwYWdlICpwYWdlKQotewotCXJldHVybiAoc3RydWN0IHBhZ2UgKiopa21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2htZW1fZGlyX3VubWFwKHN0cnVjdCBwYWdlICoqZGlyKQotewotCWt1bm1hcF9hdG9taWMoZGlyLCBLTV9VU0VSMCk7Ci19Ci0KLXN0YXRpYyBzd3BfZW50cnlfdCAqc2htZW1fc3dwX21hcChzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlyZXR1cm4gKHN3cF9lbnRyeV90ICopa21hcF9hdG9taWMocGFnZSwgS01fVVNFUjEpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2htZW1fc3dwX2JhbGFuY2VfdW5tYXAodm9pZCkKLXsKLQkvKgotCSAqIFdoZW4gcGFzc2luZyBhIHBvaW50ZXIgdG8gYW4gaV9kaXJlY3QgZW50cnksIHRvIGNvZGUgd2hpY2gKLQkgKiBhbHNvIGhhbmRsZXMgaW5kaXJlY3QgZW50cmllcyBhbmQgc28gd2lsbCBzaG1lbV9zd3BfdW5tYXAsCi0JICogd2UgbXVzdCBhcnJhbmdlIGZvciB0aGUgcHJlZW1wdCBjb3VudCB0byByZW1haW4gaW4gYmFsYW5jZS4KLQkgKiBXaGF0IGttYXBfYXRvbWljIG9mIGEgbG93bWVtIHBhZ2UgZG9lcyBkZXBlbmRzIG9uIGNvbmZpZwotCSAqIGFuZCBhcmNoaXRlY3R1cmUsIHNvIHByZXRlbmQgdG8ga21hcF9hdG9taWMgc29tZSBsb3dtZW0gcGFnZS4KLQkgKi8KLQkodm9pZCkga21hcF9hdG9taWMoWkVST19QQUdFKDApLCBLTV9VU0VSMSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzaG1lbV9zd3BfdW5tYXAoc3dwX2VudHJ5X3QgKmVudHJ5KQotewotCWt1bm1hcF9hdG9taWMoZW50cnksIEtNX1VTRVIxKTsKLX0KLQogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2htZW1fc2JfaW5mbyAqU0hNRU1fU0Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlyZXR1cm4gc2ItPnNfZnNfaW5mbzsKQEAgLTI0NCwxNSArMTcwLDYgQEAKIHN0YXRpYyBMSVNUX0hFQUQoc2htZW1fc3dhcGxpc3QpOwogc3RhdGljIERFRklORV9NVVRFWChzaG1lbV9zd2FwbGlzdF9tdXRleCk7CiAKLXN0YXRpYyB2b2lkIHNobWVtX2ZyZWVfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvbmcgcGFnZXMpCi17Ci0Jc3RydWN0IHNobWVtX3NiX2luZm8gKnNiaW5mbyA9IFNITUVNX1NCKGlub2RlLT5pX3NiKTsKLQlpZiAoc2JpbmZvLT5tYXhfYmxvY2tzKSB7Ci0JCXBlcmNwdV9jb3VudGVyX2FkZCgmc2JpbmZvLT51c2VkX2Jsb2NrcywgLXBhZ2VzKTsKLQkJaW5vZGUtPmlfYmxvY2tzIC09IHBhZ2VzKkJMT0NLU19QRVJfUEFHRTsKLQl9Ci19Ci0KIHN0YXRpYyBpbnQgc2htZW1fcmVzZXJ2ZV9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBzaG1lbV9zYl9pbmZvICpzYmluZm8gPSBTSE1FTV9TQihzYik7CkBAIC0yNzksNyArMTk2LDcgQEAKIH0KIAogLyoqCi0gKiBzaG1lbV9yZWNhbGNfaW5vZGUgLSByZWNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBhbiBpbm9kZQorICogc2htZW1fcmVjYWxjX2lub2RlIC0gcmVjYWxjdWxhdGUgdGhlIGJsb2NrIHVzYWdlIG9mIGFuIGlub2RlCiAgKiBAaW5vZGU6IGlub2RlIHRvIHJlY2FsYwogICoKICAqIFdlIGhhdmUgdG8gY2FsY3VsYXRlIHRoZSBmcmVlIGJsb2NrcyBzaW5jZSB0aGUgbW0gY2FuIGRyb3AKQEAgLTI5Nyw0NzQgKzIxNCwyOTcgQEAKIAogCWZyZWVkID0gaW5mby0+YWxsb2NlZCAtIGluZm8tPnN3YXBwZWQgLSBpbm9kZS0+aV9tYXBwaW5nLT5ucnBhZ2VzOwogCWlmIChmcmVlZCA+IDApIHsKKwkJc3RydWN0IHNobWVtX3NiX2luZm8gKnNiaW5mbyA9IFNITUVNX1NCKGlub2RlLT5pX3NiKTsKKwkJaWYgKHNiaW5mby0+bWF4X2Jsb2NrcykKKwkJCXBlcmNwdV9jb3VudGVyX2FkZCgmc2JpbmZvLT51c2VkX2Jsb2NrcywgLWZyZWVkKTsKIAkJaW5mby0+YWxsb2NlZCAtPSBmcmVlZDsKKwkJaW5vZGUtPmlfYmxvY2tzIC09IGZyZWVkICogQkxPQ0tTX1BFUl9QQUdFOwogCQlzaG1lbV91bmFjY3RfYmxvY2tzKGluZm8tPmZsYWdzLCBmcmVlZCk7Ci0JCXNobWVtX2ZyZWVfYmxvY2tzKGlub2RlLCBmcmVlZCk7CiAJfQogfQogCi0vKioKLSAqIHNobWVtX3N3cF9lbnRyeSAtIGZpbmQgdGhlIHN3YXAgdmVjdG9yIHBvc2l0aW9uIGluIHRoZSBpbmZvIHN0cnVjdHVyZQotICogQGluZm86ICBpbmZvIHN0cnVjdHVyZSBmb3IgdGhlIGlub2RlCi0gKiBAaW5kZXg6IGluZGV4IG9mIHRoZSBwYWdlIHRvIGZpbmQKLSAqIEBwYWdlOiAgb3B0aW9uYWwgcGFnZSB0byBhZGQgdG8gdGhlIHN0cnVjdHVyZS4gSGFzIHRvIGJlIHByZXNldCB0bwotICogICAgICAgICBhbGwgemVyb3MKLSAqCi0gKiBJZiB0aGVyZSBpcyBubyBzcGFjZSBhbGxvY2F0ZWQgeWV0IGl0IHdpbGwgcmV0dXJuIE5VTEwgd2hlbgotICogcGFnZSBpcyBOVUxMLCBlbHNlIGl0IHdpbGwgdXNlIHRoZSBwYWdlIGZvciB0aGUgbmVlZGVkIGJsb2NrLAotICogc2V0dGluZyBpdCB0byBOVUxMIG9uIHJldHVybiB0byBpbmRpY2F0ZSB0aGF0IGl0IGhhcyBiZWVuIHVzZWQuCi0gKgotICogVGhlIHN3YXAgdmVjdG9yIGlzIG9yZ2FuaXplZCB0aGUgZm9sbG93aW5nIHdheToKLSAqCi0gKiBUaGVyZSBhcmUgU0hNRU1fTlJfRElSRUNUIGVudHJpZXMgZGlyZWN0bHkgc3RvcmVkIGluIHRoZQotICogc2htZW1faW5vZGVfaW5mbyBzdHJ1Y3R1cmUuIFNvIHNtYWxsIGZpbGVzIGRvIG5vdCBuZWVkIGFuIGFkZGlvbmFsCi0gKiBhbGxvY2F0aW9uLgotICoKLSAqIEZvciBwYWdlcyB3aXRoIGluZGV4ID4gU0hNRU1fTlJfRElSRUNUIHRoZXJlIGlzIHRoZSBwb2ludGVyCi0gKiBpX2luZGlyZWN0IHdoaWNoIHBvaW50cyB0byBhIHBhZ2Ugd2hpY2ggaG9sZHMgaW4gdGhlIGZpcnN0IGhhbGYKLSAqIGRvdWJseSBpbmRpcmVjdCBibG9ja3MsIGluIHRoZSBzZWNvbmQgaGFsZiB0cmlwbGUgaW5kaXJlY3QgYmxvY2tzOgotICoKLSAqIEZvciBhbiBhcnRpZmljaWFsIEVOVFJJRVNfUEVSX1BBR0UgPSA0IHRoaXMgd291bGQgbGVhZCB0byB0aGUKLSAqIGZvbGxvd2luZyBsYXlvdXQgKGZvciBTSE1FTV9OUl9ESVJFQ1QgPT0gMTYpOgotICoKLSAqIGlfaW5kaXJlY3QgLT4gZGlyIC0tPiAxNi0xOQotICogCSAgICAgIHwJICAgICArLT4gMjAtMjMKLSAqIAkgICAgICB8Ci0gKiAJICAgICAgKy0tPmRpcjIgLS0+IDI0LTI3Ci0gKiAJICAgICAgfAkgICAgICAgKy0+IDI4LTMxCi0gKiAJICAgICAgfAkgICAgICAgKy0+IDMyLTM1Ci0gKiAJICAgICAgfAkgICAgICAgKy0+IDM2LTM5Ci0gKiAJICAgICAgfAotICogCSAgICAgICstLT5kaXIzIC0tPiA0MC00MwotICogCSAgICAgICAJICAgICAgICstPiA0NC00NwotICogCSAgICAgIAkgICAgICAgKy0+IDQ4LTUxCi0gKiAJICAgICAgCSAgICAgICArLT4gNTItNTUKKy8qCisgKiBSZXBsYWNlIGl0ZW0gZXhwZWN0ZWQgaW4gcmFkaXggdHJlZSBieSBhIG5ldyBpdGVtLCB3aGlsZSBob2xkaW5nIHRyZWUgbG9jay4KICAqLwotc3RhdGljIHN3cF9lbnRyeV90ICpzaG1lbV9zd3BfZW50cnkoc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8sIHVuc2lnbmVkIGxvbmcgaW5kZXgsIHN0cnVjdCBwYWdlICoqcGFnZSkKK3N0YXRpYyBpbnQgc2htZW1fcmFkaXhfdHJlZV9yZXBsYWNlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJcGdvZmZfdCBpbmRleCwgdm9pZCAqZXhwZWN0ZWQsIHZvaWQgKnJlcGxhY2VtZW50KQogewotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXN0cnVjdCBwYWdlICoqZGlyOwotCXN0cnVjdCBwYWdlICpzdWJkaXI7CisJdm9pZCAqKnBzbG90OworCXZvaWQgKml0ZW0gPSBOVUxMOwogCi0JaWYgKGluZGV4IDwgU0hNRU1fTlJfRElSRUNUKSB7Ci0JCXNobWVtX3N3cF9iYWxhbmNlX3VubWFwKCk7Ci0JCXJldHVybiBpbmZvLT5pX2RpcmVjdCtpbmRleDsKLQl9Ci0JaWYgKCFpbmZvLT5pX2luZGlyZWN0KSB7Ci0JCWlmIChwYWdlKSB7Ci0JCQlpbmZvLT5pX2luZGlyZWN0ID0gKnBhZ2U7Ci0JCQkqcGFnZSA9IE5VTEw7CisJVk1fQlVHX09OKCFleHBlY3RlZCk7CisJcHNsb3QgPSByYWRpeF90cmVlX2xvb2t1cF9zbG90KCZtYXBwaW5nLT5wYWdlX3RyZWUsIGluZGV4KTsKKwlpZiAocHNsb3QpCisJCWl0ZW0gPSByYWRpeF90cmVlX2RlcmVmX3Nsb3RfcHJvdGVjdGVkKHBzbG90LAorCQkJCQkJCSZtYXBwaW5nLT50cmVlX2xvY2spOworCWlmIChpdGVtICE9IGV4cGVjdGVkKQorCQlyZXR1cm4gLUVOT0VOVDsKKwlpZiAocmVwbGFjZW1lbnQpCisJCXJhZGl4X3RyZWVfcmVwbGFjZV9zbG90KHBzbG90LCByZXBsYWNlbWVudCk7CisJZWxzZQorCQlyYWRpeF90cmVlX2RlbGV0ZSgmbWFwcGluZy0+cGFnZV90cmVlLCBpbmRleCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBMaWtlIGFkZF90b19wYWdlX2NhY2hlX2xvY2tlZCwgYnV0IGVycm9yIGlmIGV4cGVjdGVkIGl0ZW0gaGFzIGdvbmUuCisgKi8KK3N0YXRpYyBpbnQgc2htZW1fYWRkX3RvX3BhZ2VfY2FjaGUoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJICAgcGdvZmZfdCBpbmRleCwgZ2ZwX3QgZ2ZwLCB2b2lkICpleHBlY3RlZCkKK3sKKwlpbnQgZXJyb3IgPSAwOworCisJVk1fQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwlWTV9CVUdfT04oIVBhZ2VTd2FwQmFja2VkKHBhZ2UpKTsKKworCWlmICghZXhwZWN0ZWQpCisJCWVycm9yID0gcmFkaXhfdHJlZV9wcmVsb2FkKGdmcCAmIEdGUF9SRUNMQUlNX01BU0spOworCWlmICghZXJyb3IpIHsKKwkJcGFnZV9jYWNoZV9nZXQocGFnZSk7CisJCXBhZ2UtPm1hcHBpbmcgPSBtYXBwaW5nOworCQlwYWdlLT5pbmRleCA9IGluZGV4OworCisJCXNwaW5fbG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJCWlmICghZXhwZWN0ZWQpCisJCQllcnJvciA9IHJhZGl4X3RyZWVfaW5zZXJ0KCZtYXBwaW5nLT5wYWdlX3RyZWUsCisJCQkJCQkJaW5kZXgsIHBhZ2UpOworCQllbHNlCisJCQllcnJvciA9IHNobWVtX3JhZGl4X3RyZWVfcmVwbGFjZShtYXBwaW5nLCBpbmRleCwKKwkJCQkJCQlleHBlY3RlZCwgcGFnZSk7CisJCWlmICghZXJyb3IpIHsKKwkJCW1hcHBpbmctPm5ycGFnZXMrKzsKKwkJCV9faW5jX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9GSUxFX1BBR0VTKTsKKwkJCV9faW5jX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9TSE1FTSk7CisJCQlzcGluX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJCX0gZWxzZSB7CisJCQlwYWdlLT5tYXBwaW5nID0gTlVMTDsKKwkJCXNwaW5fdW5sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJfQotCQlyZXR1cm4gTlVMTDsJCQkvKiBuZWVkIGFub3RoZXIgcGFnZSAqLworCQlpZiAoIWV4cGVjdGVkKQorCQkJcmFkaXhfdHJlZV9wcmVsb2FkX2VuZCgpOwogCX0KKwlpZiAoZXJyb3IpCisJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfY2FjaGVfcGFnZShwYWdlKTsKKwlyZXR1cm4gZXJyb3I7Cit9CiAKLQlpbmRleCAtPSBTSE1FTV9OUl9ESVJFQ1Q7Ci0Jb2Zmc2V0ID0gaW5kZXggJSBFTlRSSUVTX1BFUl9QQUdFOwotCWluZGV4IC89IEVOVFJJRVNfUEVSX1BBR0U7Ci0JZGlyID0gc2htZW1fZGlyX21hcChpbmZvLT5pX2luZGlyZWN0KTsKKy8qCisgKiBMaWtlIGRlbGV0ZV9mcm9tX3BhZ2VfY2FjaGUsIGJ1dCBzdWJzdGl0dXRlcyBzd2FwIGZvciBwYWdlLgorICovCitzdGF0aWMgdm9pZCBzaG1lbV9kZWxldGVfZnJvbV9wYWdlX2NhY2hlKHN0cnVjdCBwYWdlICpwYWdlLCB2b2lkICpyYWRzd2FwKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKKwlpbnQgZXJyb3I7CiAKLQlpZiAoaW5kZXggPj0gRU5UUklFU19QRVJfUEFHRS8yKSB7Ci0JCWluZGV4IC09IEVOVFJJRVNfUEVSX1BBR0UvMjsKLQkJZGlyICs9IEVOVFJJRVNfUEVSX1BBR0UvMiArIGluZGV4L0VOVFJJRVNfUEVSX1BBR0U7Ci0JCWluZGV4ICU9IEVOVFJJRVNfUEVSX1BBR0U7Ci0JCXN1YmRpciA9ICpkaXI7Ci0JCWlmICghc3ViZGlyKSB7Ci0JCQlpZiAocGFnZSkgewotCQkJCSpkaXIgPSAqcGFnZTsKLQkJCQkqcGFnZSA9IE5VTEw7CisJc3Bpbl9sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKKwllcnJvciA9IHNobWVtX3JhZGl4X3RyZWVfcmVwbGFjZShtYXBwaW5nLCBwYWdlLT5pbmRleCwgcGFnZSwgcmFkc3dhcCk7CisJcGFnZS0+bWFwcGluZyA9IE5VTEw7CisJbWFwcGluZy0+bnJwYWdlcy0tOworCV9fZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9GSUxFX1BBR0VTKTsKKwlfX2RlY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfU0hNRU0pOworCXNwaW5fdW5sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJQlVHX09OKGVycm9yKTsKK30KKworLyoKKyAqIExpa2UgZmluZF9nZXRfcGFnZXMsIGJ1dCBjb2xsZWN0aW5nIHN3YXAgZW50cmllcyBhcyB3ZWxsIGFzIHBhZ2VzLgorICovCitzdGF0aWMgdW5zaWduZWQgc2htZW1fZmluZF9nZXRfcGFnZXNfYW5kX3N3YXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJCXBnb2ZmX3Qgc3RhcnQsIHVuc2lnbmVkIGludCBucl9wYWdlcywKKwkJCQkJc3RydWN0IHBhZ2UgKipwYWdlcywgcGdvZmZfdCAqaW5kaWNlcykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgcmV0OworCXVuc2lnbmVkIGludCBucl9mb3VuZDsKKworCXJjdV9yZWFkX2xvY2soKTsKK3Jlc3RhcnQ6CisJbnJfZm91bmQgPSByYWRpeF90cmVlX2dhbmdfbG9va3VwX3Nsb3QoJm1hcHBpbmctPnBhZ2VfdHJlZSwKKwkJCQkodm9pZCAqKiopcGFnZXMsIGluZGljZXMsIHN0YXJ0LCBucl9wYWdlcyk7CisJcmV0ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfZm91bmQ7IGkrKykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKK3JlcGVhdDoKKwkJcGFnZSA9IHJhZGl4X3RyZWVfZGVyZWZfc2xvdCgodm9pZCAqKilwYWdlc1tpXSk7CisJCWlmICh1bmxpa2VseSghcGFnZSkpCisJCQljb250aW51ZTsKKwkJaWYgKHJhZGl4X3RyZWVfZXhjZXB0aW9uKHBhZ2UpKSB7CisJCQlpZiAocmFkaXhfdHJlZV9kZXJlZl9yZXRyeShwYWdlKSkKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQkvKgorCQkJICogT3RoZXJ3aXNlLCB3ZSBtdXN0IGJlIHN0b3JpbmcgYSBzd2FwIGVudHJ5CisJCQkgKiBoZXJlIGFzIGFuIGV4Y2VwdGlvbmFsIGVudHJ5OiBzbyByZXR1cm4gaXQKKwkJCSAqIHdpdGhvdXQgYXR0ZW1wdGluZyB0byByYWlzZSBwYWdlIGNvdW50LgorCQkJICovCisJCQlnb3RvIGV4cG9ydDsKKwkJfQorCQlpZiAoIXBhZ2VfY2FjaGVfZ2V0X3NwZWN1bGF0aXZlKHBhZ2UpKQorCQkJZ290byByZXBlYXQ7CisKKwkJLyogSGFzIHRoZSBwYWdlIG1vdmVkPyAqLworCQlpZiAodW5saWtlbHkocGFnZSAhPSAqKCh2b2lkICoqKXBhZ2VzW2ldKSkpIHsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCWdvdG8gcmVwZWF0OworCQl9CitleHBvcnQ6CisJCWluZGljZXNbcmV0XSA9IGluZGljZXNbaV07CisJCXBhZ2VzW3JldF0gPSBwYWdlOworCQlyZXQrKzsKKwl9CisJaWYgKHVubGlrZWx5KCFyZXQgJiYgbnJfZm91bmQpKQorCQlnb3RvIHJlc3RhcnQ7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlbW92ZSBzd2FwIGVudHJ5IGZyb20gcmFkaXggdHJlZSwgZnJlZSB0aGUgc3dhcCBhbmQgaXRzIHBhZ2UgY2FjaGUuCisgKi8KK3N0YXRpYyBpbnQgc2htZW1fZnJlZV9zd2FwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJICAgcGdvZmZfdCBpbmRleCwgdm9pZCAqcmFkc3dhcCkKK3sKKwlpbnQgZXJyb3I7CisKKwlzcGluX2xvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOworCWVycm9yID0gc2htZW1fcmFkaXhfdHJlZV9yZXBsYWNlKG1hcHBpbmcsIGluZGV4LCByYWRzd2FwLCBOVUxMKTsKKwlzcGluX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJaWYgKCFlcnJvcikKKwkJZnJlZV9zd2FwX2FuZF9jYWNoZShyYWRpeF90b19zd3BfZW50cnkocmFkc3dhcCkpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFBhZ2V2ZWMgbWF5IGNvbnRhaW4gc3dhcCBlbnRyaWVzLCBzbyBzaHVmZmxlIHVwIHBhZ2VzIGJlZm9yZSByZWxlYXNpbmcuCisgKi8KK3N0YXRpYyB2b2lkIHNobWVtX3BhZ2V2ZWNfcmVsZWFzZShzdHJ1Y3QgcGFnZXZlYyAqcHZlYykKK3sKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgcGFnZXZlY19jb3VudChwdmVjKTsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gcHZlYy0+cGFnZXNbaV07CisJCWlmICghcmFkaXhfdHJlZV9leGNlcHRpb25hbF9lbnRyeShwYWdlKSkKKwkJCXB2ZWMtPnBhZ2VzW2orK10gPSBwYWdlOworCX0KKwlwdmVjLT5uciA9IGo7CisJcGFnZXZlY19yZWxlYXNlKHB2ZWMpOworfQorCisvKgorICogUmVtb3ZlIHJhbmdlIG9mIHBhZ2VzIGFuZCBzd2FwIGVudHJpZXMgZnJvbSByYWRpeCB0cmVlLCBhbmQgZnJlZSB0aGVtLgorICovCit2b2lkIHNobWVtX3RydW5jYXRlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIGxvZmZfdCBsZW5kKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbyA9IFNITUVNX0koaW5vZGUpOworCXBnb2ZmX3Qgc3RhcnQgPSAobHN0YXJ0ICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBwYXJ0aWFsID0gbHN0YXJ0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCXBnb2ZmX3QgZW5kID0gKGxlbmQgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKKwlwZ29mZl90IGluZGljZXNbUEFHRVZFQ19TSVpFXTsKKwlsb25nIG5yX3N3YXBzX2ZyZWVkID0gMDsKKwlwZ29mZl90IGluZGV4OworCWludCBpOworCisJQlVHX09OKChsZW5kICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSAhPSAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOworCisJcGFnZXZlY19pbml0KCZwdmVjLCAwKTsKKwlpbmRleCA9IHN0YXJ0OworCXdoaWxlIChpbmRleCA8PSBlbmQpIHsKKwkJcHZlYy5uciA9IHNobWVtX2ZpbmRfZ2V0X3BhZ2VzX2FuZF9zd2FwKG1hcHBpbmcsIGluZGV4LAorCQkJbWluKGVuZCAtIGluZGV4LCAocGdvZmZfdClQQUdFVkVDX1NJWkUgLSAxKSArIDEsCisJCQkJCQkJcHZlYy5wYWdlcywgaW5kaWNlcyk7CisJCWlmICghcHZlYy5ucikKKwkJCWJyZWFrOworCQltZW1fY2dyb3VwX3VuY2hhcmdlX3N0YXJ0KCk7CisJCWZvciAoaSA9IDA7IGkgPCBwYWdldmVjX2NvdW50KCZwdmVjKTsgaSsrKSB7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMucGFnZXNbaV07CisKKwkJCWluZGV4ID0gaW5kaWNlc1tpXTsKKwkJCWlmIChpbmRleCA+IGVuZCkKKwkJCQlicmVhazsKKworCQkJaWYgKHJhZGl4X3RyZWVfZXhjZXB0aW9uYWxfZW50cnkocGFnZSkpIHsKKwkJCQlucl9zd2Fwc19mcmVlZCArPSAhc2htZW1fZnJlZV9zd2FwKG1hcHBpbmcsCisJCQkJCQkJCWluZGV4LCBwYWdlKTsKKwkJCQljb250aW51ZTsKIAkJCX0KLQkJCXNobWVtX2Rpcl91bm1hcChkaXIpOwotCQkJcmV0dXJuIE5VTEw7CQkvKiBuZWVkIGFub3RoZXIgcGFnZSAqLworCisJCQlpZiAoIXRyeWxvY2tfcGFnZShwYWdlKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChwYWdlLT5tYXBwaW5nID09IG1hcHBpbmcpIHsKKwkJCQlWTV9CVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CisJCQkJdHJ1bmNhdGVfaW5vZGVfcGFnZShtYXBwaW5nLCBwYWdlKTsKKwkJCX0KKwkJCXVubG9ja19wYWdlKHBhZ2UpOwogCQl9Ci0JCXNobWVtX2Rpcl91bm1hcChkaXIpOwotCQlkaXIgPSBzaG1lbV9kaXJfbWFwKHN1YmRpcik7CisJCXNobWVtX3BhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CisJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfZW5kKCk7CisJCWNvbmRfcmVzY2hlZCgpOworCQlpbmRleCsrOwogCX0KIAotCWRpciArPSBpbmRleDsKLQlzdWJkaXIgPSAqZGlyOwotCWlmICghc3ViZGlyKSB7Ci0JCWlmICghcGFnZSB8fCAhKHN1YmRpciA9ICpwYWdlKSkgewotCQkJc2htZW1fZGlyX3VubWFwKGRpcik7Ci0JCQlyZXR1cm4gTlVMTDsJCS8qIG5lZWQgYSBwYWdlICovCisJaWYgKHBhcnRpYWwpIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCQlzaG1lbV9nZXRwYWdlKGlub2RlLCBzdGFydCAtIDEsICZwYWdlLCBTR1BfUkVBRCwgTlVMTCk7CisJCWlmIChwYWdlKSB7CisJCQl6ZXJvX3VzZXJfc2VnbWVudChwYWdlLCBwYXJ0aWFsLCBQQUdFX0NBQ0hFX1NJWkUpOworCQkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJfQotCQkqZGlyID0gc3ViZGlyOwotCQkqcGFnZSA9IE5VTEw7CiAJfQotCXNobWVtX2Rpcl91bm1hcChkaXIpOwotCXJldHVybiBzaG1lbV9zd3BfbWFwKHN1YmRpcikgKyBvZmZzZXQ7Ci19CiAKLXN0YXRpYyB2b2lkIHNobWVtX3N3cF9zZXQoc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8sIHN3cF9lbnRyeV90ICplbnRyeSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKLXsKLQlsb25nIGluY2RlYyA9IHZhbHVlPyAxOiAtMTsKLQotCWVudHJ5LT52YWwgPSB2YWx1ZTsKLQlpbmZvLT5zd2FwcGVkICs9IGluY2RlYzsKLQlpZiAoKHVuc2lnbmVkIGxvbmcpKGVudHJ5IC0gaW5mby0+aV9kaXJlY3QpID49IFNITUVNX05SX0RJUkVDVCkgewotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGttYXBfYXRvbWljX3RvX3BhZ2UoZW50cnkpOwotCQlzZXRfcGFnZV9wcml2YXRlKHBhZ2UsIHBhZ2VfcHJpdmF0ZShwYWdlKSArIGluY2RlYyk7Ci0JfQotfQotCi0vKioKLSAqIHNobWVtX3N3cF9hbGxvYyAtIGdldCB0aGUgcG9zaXRpb24gb2YgdGhlIHN3YXAgZW50cnkgZm9yIHRoZSBwYWdlLgotICogQGluZm86CWluZm8gc3RydWN0dXJlIGZvciB0aGUgaW5vZGUKLSAqIEBpbmRleDoJaW5kZXggb2YgdGhlIHBhZ2UgdG8gZmluZAotICogQHNncDoJY2hlY2sgYW5kIHJlY2hlY2sgaV9zaXplPyBza2lwIGFsbG9jYXRpb24/Ci0gKiBAZ2ZwOglnZnAgbWFzayB0byB1c2UgZm9yIGFueSBwYWdlIGFsbG9jYXRpb24KLSAqCi0gKiBJZiB0aGUgZW50cnkgZG9lcyBub3QgZXhpc3QsIGFsbG9jYXRlIGl0LgotICovCi1zdGF0aWMgc3dwX2VudHJ5X3QgKnNobWVtX3N3cF9hbGxvYyhzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbywKLQkJCXVuc2lnbmVkIGxvbmcgaW5kZXgsIGVudW0gc2dwX3R5cGUgc2dwLCBnZnBfdCBnZnApCi17Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9ICZpbmZvLT52ZnNfaW5vZGU7Ci0Jc3RydWN0IHNobWVtX3NiX2luZm8gKnNiaW5mbyA9IFNITUVNX1NCKGlub2RlLT5pX3NiKTsKLQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7Ci0Jc3dwX2VudHJ5X3QgKmVudHJ5OwotCi0JaWYgKHNncCAhPSBTR1BfV1JJVEUgJiYKLQkgICAgKChsb2ZmX3QpIGluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpID49IGlfc2l6ZV9yZWFkKGlub2RlKSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0KLQl3aGlsZSAoIShlbnRyeSA9IHNobWVtX3N3cF9lbnRyeShpbmZvLCBpbmRleCwgJnBhZ2UpKSkgewotCQlpZiAoc2dwID09IFNHUF9SRUFEKQotCQkJcmV0dXJuIHNobWVtX3N3cF9tYXAoWkVST19QQUdFKDApKTsKLQkJLyoKLQkJICogVGVzdCB1c2VkX2Jsb2NrcyBhZ2FpbnN0IDEgbGVzcyBtYXhfYmxvY2tzLCBzaW5jZSB3ZSBoYXZlIDEgZGF0YQotCQkgKiBwYWdlIChhbmQgcGVyaGFwcyBpbmRpcmVjdCBpbmRleCBwYWdlcykgeWV0IHRvIGFsbG9jYXRlOgotCQkgKiBhIHdhc3RlIHRvIGFsbG9jYXRlIGluZGV4IGlmIHdlIGNhbm5vdCBhbGxvY2F0ZSBkYXRhLgotCQkgKi8KLQkJaWYgKHNiaW5mby0+bWF4X2Jsb2NrcykgewotCQkJaWYgKHBlcmNwdV9jb3VudGVyX2NvbXBhcmUoJnNiaW5mby0+dXNlZF9ibG9ja3MsCi0JCQkJCQlzYmluZm8tPm1heF9ibG9ja3MgLSAxKSA+PSAwKQotCQkJCXJldHVybiBFUlJfUFRSKC1FTk9TUEMpOwotCQkJcGVyY3B1X2NvdW50ZXJfaW5jKCZzYmluZm8tPnVzZWRfYmxvY2tzKTsKLQkJCWlub2RlLT5pX2Jsb2NrcyArPSBCTE9DS1NfUEVSX1BBR0U7CisJaW5kZXggPSBzdGFydDsKKwlmb3IgKCA7IDsgKSB7CisJCWNvbmRfcmVzY2hlZCgpOworCQlwdmVjLm5yID0gc2htZW1fZmluZF9nZXRfcGFnZXNfYW5kX3N3YXAobWFwcGluZywgaW5kZXgsCisJCQltaW4oZW5kIC0gaW5kZXgsIChwZ29mZl90KVBBR0VWRUNfU0laRSAtIDEpICsgMSwKKwkJCQkJCQlwdmVjLnBhZ2VzLCBpbmRpY2VzKTsKKwkJaWYgKCFwdmVjLm5yKSB7CisJCQlpZiAoaW5kZXggPT0gc3RhcnQpCisJCQkJYnJlYWs7CisJCQlpbmRleCA9IHN0YXJ0OworCQkJY29udGludWU7CiAJCX0KLQotCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0JCXBhZ2UgPSBzaG1lbV9kaXJfYWxsb2MoZ2ZwKTsKLQkJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKLQotCQlpZiAoIXBhZ2UpIHsKLQkJCXNobWVtX2ZyZWVfYmxvY2tzKGlub2RlLCAxKTsKLQkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCQl9Ci0JCWlmIChzZ3AgIT0gU0dQX1dSSVRFICYmCi0JCSAgICAoKGxvZmZfdCkgaW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgPj0gaV9zaXplX3JlYWQoaW5vZGUpKSB7Ci0JCQllbnRyeSA9IEVSUl9QVFIoLUVJTlZBTCk7CisJCWlmIChpbmRleCA9PSBzdGFydCAmJiBpbmRpY2VzWzBdID4gZW5kKSB7CisJCQlzaG1lbV9wYWdldmVjX3JlbGVhc2UoJnB2ZWMpOwogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKGluZm8tPm5leHRfaW5kZXggPD0gaW5kZXgpCi0JCQlpbmZvLT5uZXh0X2luZGV4ID0gaW5kZXggKyAxOwotCX0KLQlpZiAocGFnZSkgewotCQkvKiBhbm90aGVyIHRhc2sgZ2F2ZSBpdHMgcGFnZSwgb3IgdHJ1bmNhdGVkIHRoZSBmaWxlICovCi0JCXNobWVtX2ZyZWVfYmxvY2tzKGlub2RlLCAxKTsKLQkJc2htZW1fZGlyX2ZyZWUocGFnZSk7Ci0JfQotCWlmIChpbmZvLT5uZXh0X2luZGV4IDw9IGluZGV4ICYmICFJU19FUlIoZW50cnkpKQotCQlpbmZvLT5uZXh0X2luZGV4ID0gaW5kZXggKyAxOwotCXJldHVybiBlbnRyeTsKLX0KKwkJbWVtX2Nncm91cF91bmNoYXJnZV9zdGFydCgpOworCQlmb3IgKGkgPSAwOyBpIDwgcGFnZXZlY19jb3VudCgmcHZlYyk7IGkrKykgeworCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwdmVjLnBhZ2VzW2ldOwogCi0vKioKLSAqIHNobWVtX2ZyZWVfc3dwIC0gZnJlZSBzb21lIHN3YXAgZW50cmllcyBpbiBhIGRpcmVjdG9yeQotICogQGRpcjogICAgICAgIHBvaW50ZXIgdG8gdGhlIGRpcmVjdG9yeQotICogQGVkaXI6ICAgICAgIHBvaW50ZXIgYWZ0ZXIgbGFzdCBlbnRyeSBvZiB0aGUgZGlyZWN0b3J5Ci0gKiBAcHVuY2hfbG9jazogcG9pbnRlciB0byBzcGlubG9jayB3aGVuIG5lZWRlZCBmb3IgdGhlIGhvbGVwdW5jaCBjYXNlCi0gKi8KLXN0YXRpYyBpbnQgc2htZW1fZnJlZV9zd3Aoc3dwX2VudHJ5X3QgKmRpciwgc3dwX2VudHJ5X3QgKmVkaXIsCi0JCQkJCQlzcGlubG9ja190ICpwdW5jaF9sb2NrKQotewotCXNwaW5sb2NrX3QgKnB1bmNoX3VubG9jayA9IE5VTEw7Ci0Jc3dwX2VudHJ5X3QgKnB0cjsKLQlpbnQgZnJlZWQgPSAwOworCQkJaW5kZXggPSBpbmRpY2VzW2ldOworCQkJaWYgKGluZGV4ID4gZW5kKQorCQkJCWJyZWFrOwogCi0JZm9yIChwdHIgPSBkaXI7IHB0ciA8IGVkaXI7IHB0cisrKSB7Ci0JCWlmIChwdHItPnZhbCkgewotCQkJaWYgKHVubGlrZWx5KHB1bmNoX2xvY2spKSB7Ci0JCQkJcHVuY2hfdW5sb2NrID0gcHVuY2hfbG9jazsKLQkJCQlwdW5jaF9sb2NrID0gTlVMTDsKLQkJCQlzcGluX2xvY2socHVuY2hfdW5sb2NrKTsKLQkJCQlpZiAoIXB0ci0+dmFsKQotCQkJCQljb250aW51ZTsKKwkJCWlmIChyYWRpeF90cmVlX2V4Y2VwdGlvbmFsX2VudHJ5KHBhZ2UpKSB7CisJCQkJbnJfc3dhcHNfZnJlZWQgKz0gIXNobWVtX2ZyZWVfc3dhcChtYXBwaW5nLAorCQkJCQkJCQlpbmRleCwgcGFnZSk7CisJCQkJY29udGludWU7CiAJCQl9Ci0JCQlmcmVlX3N3YXBfYW5kX2NhY2hlKCpwdHIpOwotCQkJKnB0ciA9IChzd3BfZW50cnlfdCl7MH07Ci0JCQlmcmVlZCsrOwotCQl9Ci0JfQotCWlmIChwdW5jaF91bmxvY2spCi0JCXNwaW5fdW5sb2NrKHB1bmNoX3VubG9jayk7Ci0JcmV0dXJuIGZyZWVkOwotfQogCi1zdGF0aWMgaW50IHNobWVtX21hcF9hbmRfZnJlZV9zd3Aoc3RydWN0IHBhZ2UgKnN1YmRpciwgaW50IG9mZnNldCwKLQkJaW50IGxpbWl0LCBzdHJ1Y3QgcGFnZSAqKipkaXIsIHNwaW5sb2NrX3QgKnB1bmNoX2xvY2spCi17Ci0Jc3dwX2VudHJ5X3QgKnB0cjsKLQlpbnQgZnJlZWQgPSAwOwotCi0JcHRyID0gc2htZW1fc3dwX21hcChzdWJkaXIpOwotCWZvciAoOyBvZmZzZXQgPCBsaW1pdDsgb2Zmc2V0ICs9IExBVEVOQ1lfTElNSVQpIHsKLQkJaW50IHNpemUgPSBsaW1pdCAtIG9mZnNldDsKLQkJaWYgKHNpemUgPiBMQVRFTkNZX0xJTUlUKQotCQkJc2l6ZSA9IExBVEVOQ1lfTElNSVQ7Ci0JCWZyZWVkICs9IHNobWVtX2ZyZWVfc3dwKHB0citvZmZzZXQsIHB0citvZmZzZXQrc2l6ZSwKLQkJCQkJCQlwdW5jaF9sb2NrKTsKLQkJaWYgKG5lZWRfcmVzY2hlZCgpKSB7Ci0JCQlzaG1lbV9zd3BfdW5tYXAocHRyKTsKLQkJCWlmICgqZGlyKSB7Ci0JCQkJc2htZW1fZGlyX3VubWFwKCpkaXIpOwotCQkJCSpkaXIgPSBOVUxMOworCQkJbG9ja19wYWdlKHBhZ2UpOworCQkJaWYgKHBhZ2UtPm1hcHBpbmcgPT0gbWFwcGluZykgeworCQkJCVZNX0JVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKKwkJCQl0cnVuY2F0ZV9pbm9kZV9wYWdlKG1hcHBpbmcsIHBhZ2UpOwogCQkJfQotCQkJY29uZF9yZXNjaGVkKCk7Ci0JCQlwdHIgPSBzaG1lbV9zd3BfbWFwKHN1YmRpcik7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJfQotCX0KLQlzaG1lbV9zd3BfdW5tYXAocHRyKTsKLQlyZXR1cm4gZnJlZWQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHNobWVtX2ZyZWVfcGFnZXMoc3RydWN0IGxpc3RfaGVhZCAqbmV4dCkKLXsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlpbnQgZnJlZWQgPSAwOwotCi0JZG8gewotCQlwYWdlID0gY29udGFpbmVyX29mKG5leHQsIHN0cnVjdCBwYWdlLCBscnUpOwotCQluZXh0ID0gbmV4dC0+bmV4dDsKLQkJc2htZW1fZGlyX2ZyZWUocGFnZSk7Ci0JCWZyZWVkKys7Ci0JCWlmIChmcmVlZCA+PSBMQVRFTkNZX0xJTUlUKSB7Ci0JCQljb25kX3Jlc2NoZWQoKTsKLQkJCWZyZWVkID0gMDsKLQkJfQotCX0gd2hpbGUgKG5leHQpOwotfQotCi12b2lkIHNobWVtX3RydW5jYXRlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCkKLXsKLQlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbyA9IFNITUVNX0koaW5vZGUpOwotCXVuc2lnbmVkIGxvbmcgaWR4OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGxpbWl0OwotCXVuc2lnbmVkIGxvbmcgc3RhZ2U7Ci0JdW5zaWduZWQgbG9uZyBkaXJvZmY7Ci0Jc3RydWN0IHBhZ2UgKipkaXI7Ci0Jc3RydWN0IHBhZ2UgKnRvcGRpcjsKLQlzdHJ1Y3QgcGFnZSAqbWlkZGlyOwotCXN0cnVjdCBwYWdlICpzdWJkaXI7Ci0Jc3dwX2VudHJ5X3QgKnB0cjsKLQlMSVNUX0hFQUQocGFnZXNfdG9fZnJlZSk7Ci0JbG9uZyBucl9wYWdlc190b19mcmVlID0gMDsKLQlsb25nIG5yX3N3YXBzX2ZyZWVkID0gMDsKLQlpbnQgb2Zmc2V0OwotCWludCBmcmVlZDsKLQlpbnQgcHVuY2hfaG9sZTsKLQlzcGlubG9ja190ICpuZWVkc19sb2NrOwotCXNwaW5sb2NrX3QgKnB1bmNoX2xvY2s7Ci0JdW5zaWduZWQgbG9uZyB1cHBlcl9saW1pdDsKLQotCXRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBlbmQpOwotCi0JaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKLQlpZHggPSAoc3RhcnQgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCWlmIChpZHggPj0gaW5mby0+bmV4dF9pbmRleCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKLQlpbmZvLT5mbGFncyB8PSBTSE1FTV9UUlVOQ0FURTsKLQlpZiAobGlrZWx5KGVuZCA9PSAobG9mZl90KSAtMSkpIHsKLQkJbGltaXQgPSBpbmZvLT5uZXh0X2luZGV4OwotCQl1cHBlcl9saW1pdCA9IFNITUVNX01BWF9JTkRFWDsKLQkJaW5mby0+bmV4dF9pbmRleCA9IGlkeDsKLQkJbmVlZHNfbG9jayA9IE5VTEw7Ci0JCXB1bmNoX2hvbGUgPSAwOwotCX0gZWxzZSB7Ci0JCWlmIChlbmQgKyAxID49IGlub2RlLT5pX3NpemUpIHsJLyogd2UgbWF5IGZyZWUgYSBsaXR0bGUgbW9yZSAqLwotCQkJbGltaXQgPSAoaW5vZGUtPmlfc2l6ZSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+Ci0JCQkJCQkJUEFHRV9DQUNIRV9TSElGVDsKLQkJCXVwcGVyX2xpbWl0ID0gU0hNRU1fTUFYX0lOREVYOwotCQl9IGVsc2UgewotCQkJbGltaXQgPSAoZW5kICsgMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQkJCXVwcGVyX2xpbWl0ID0gbGltaXQ7Ci0JCX0KLQkJbmVlZHNfbG9jayA9ICZpbmZvLT5sb2NrOwotCQlwdW5jaF9ob2xlID0gMTsKLQl9Ci0KLQl0b3BkaXIgPSBpbmZvLT5pX2luZGlyZWN0OwotCWlmICh0b3BkaXIgJiYgaWR4IDw9IFNITUVNX05SX0RJUkVDVCAmJiAhcHVuY2hfaG9sZSkgewotCQlpbmZvLT5pX2luZGlyZWN0ID0gTlVMTDsKLQkJbnJfcGFnZXNfdG9fZnJlZSsrOwotCQlsaXN0X2FkZCgmdG9wZGlyLT5scnUsICZwYWdlc190b19mcmVlKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCi0JaWYgKGluZm8tPnN3YXBwZWQgJiYgaWR4IDwgU0hNRU1fTlJfRElSRUNUKSB7Ci0JCXB0ciA9IGluZm8tPmlfZGlyZWN0OwotCQlzaXplID0gbGltaXQ7Ci0JCWlmIChzaXplID4gU0hNRU1fTlJfRElSRUNUKQotCQkJc2l6ZSA9IFNITUVNX05SX0RJUkVDVDsKLQkJbnJfc3dhcHNfZnJlZWQgPSBzaG1lbV9mcmVlX3N3cChwdHIraWR4LCBwdHIrc2l6ZSwgbmVlZHNfbG9jayk7Ci0JfQotCi0JLyoKLQkgKiBJZiB0aGVyZSBhcmUgbm8gaW5kaXJlY3QgYmxvY2tzIG9yIHdlIGFyZSBwdW5jaGluZyBhIGhvbGUKLQkgKiBiZWxvdyBpbmRpcmVjdCBibG9ja3MsIG5vdGhpbmcgdG8gYmUgZG9uZS4KLQkgKi8KLQlpZiAoIXRvcGRpciB8fCBsaW1pdCA8PSBTSE1FTV9OUl9ESVJFQ1QpCi0JCWdvdG8gZG9uZTI7Ci0KLQkvKgotCSAqIFRoZSB0cnVuY2F0aW9uIGNhc2UgaGFzIGFscmVhZHkgZHJvcHBlZCBpbmZvLT5sb2NrLCBhbmQgd2UncmUgc2FmZQotCSAqIGJlY2F1c2UgaV9zaXplIGFuZCBuZXh0X2luZGV4IGhhdmUgYWxyZWFkeSBiZWVuIGxvd2VyZWQsIHByZXZlbnRpbmcKLQkgKiBhY2Nlc3MgYmV5b25kLiAgQnV0IGluIHRoZSBwdW5jaF9ob2xlIGNhc2UsIHdlIHN0aWxsIG5lZWQgdG8gdGFrZQotCSAqIHRoZSBsb2NrIHdoZW4gdXBkYXRpbmcgdGhlIHN3YXAgZGlyZWN0b3J5LCBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlCi0JICogcmFjaW5nIGFjY2Vzc2VzIGJ5IHNobWVtX2dldHBhZ2UoU0dQX0NBQ0hFKSwgc2htZW1fdW51c2VfaW5vZGUgb3IKLQkgKiBzaG1lbV93cml0ZXBhZ2UuICBIb3dldmVyLCB3aGVuZXZlciB3ZSBmaW5kIHdlIGNhbiByZW1vdmUgYSB3aG9sZQotCSAqIGRpcmVjdG9yeSBwYWdlIChub3QgYXQgdGhlIG1pc2FsaWduZWQgc3RhcnQgb3IgZW5kIG9mIHRoZSByYW5nZSksCi0JICogd2UgZmlyc3QgTlVMTGlmeSBpdHMgcG9pbnRlciBpbiB0aGUgbGV2ZWwgYWJvdmUsIGFuZCB0aGVuIGhhdmUgbm8KLQkgKiBuZWVkIHRvIHRha2UgdGhlIGxvY2sgd2hlbiB1cGRhdGluZyBpdHMgY29udGVudHM6IG5lZWRzX2xvY2sgYW5kCi0JICogcHVuY2hfbG9jayAoZWl0aGVyIHBvaW50aW5nIHRvIGluZm8tPmxvY2sgb3IgTlVMTCkgbWFuYWdlIHRoaXMuCi0JICovCi0KLQl1cHBlcl9saW1pdCAtPSBTSE1FTV9OUl9ESVJFQ1Q7Ci0JbGltaXQgLT0gU0hNRU1fTlJfRElSRUNUOwotCWlkeCA9IChpZHggPiBTSE1FTV9OUl9ESVJFQ1QpPyAoaWR4IC0gU0hNRU1fTlJfRElSRUNUKTogMDsKLQlvZmZzZXQgPSBpZHggJSBFTlRSSUVTX1BFUl9QQUdFOwotCWlkeCAtPSBvZmZzZXQ7Ci0KLQlkaXIgPSBzaG1lbV9kaXJfbWFwKHRvcGRpcik7Ci0Jc3RhZ2UgPSBFTlRSSUVTX1BFUl9QQUdFUEFHRS8yOwotCWlmIChpZHggPCBFTlRSSUVTX1BFUl9QQUdFUEFHRS8yKSB7Ci0JCW1pZGRpciA9IHRvcGRpcjsKLQkJZGlyb2ZmID0gaWR4L0VOVFJJRVNfUEVSX1BBR0U7Ci0JfSBlbHNlIHsKLQkJZGlyICs9IEVOVFJJRVNfUEVSX1BBR0UvMjsKLQkJZGlyICs9IChpZHggLSBFTlRSSUVTX1BFUl9QQUdFUEFHRS8yKS9FTlRSSUVTX1BFUl9QQUdFUEFHRTsKLQkJd2hpbGUgKHN0YWdlIDw9IGlkeCkKLQkJCXN0YWdlICs9IEVOVFJJRVNfUEVSX1BBR0VQQUdFOwotCQltaWRkaXIgPSAqZGlyOwotCQlpZiAoKmRpcikgewotCQkJZGlyb2ZmID0gKChpZHggLSBFTlRSSUVTX1BFUl9QQUdFUEFHRS8yKSAlCi0JCQkJRU5UUklFU19QRVJfUEFHRVBBR0UpIC8gRU5UUklFU19QRVJfUEFHRTsKLQkJCWlmICghZGlyb2ZmICYmICFvZmZzZXQgJiYgdXBwZXJfbGltaXQgPj0gc3RhZ2UpIHsKLQkJCQlpZiAobmVlZHNfbG9jaykgewotCQkJCQlzcGluX2xvY2sobmVlZHNfbG9jayk7Ci0JCQkJCSpkaXIgPSBOVUxMOwotCQkJCQlzcGluX3VubG9jayhuZWVkc19sb2NrKTsKLQkJCQkJbmVlZHNfbG9jayA9IE5VTEw7Ci0JCQkJfSBlbHNlCi0JCQkJCSpkaXIgPSBOVUxMOwotCQkJCW5yX3BhZ2VzX3RvX2ZyZWUrKzsKLQkJCQlsaXN0X2FkZCgmbWlkZGlyLT5scnUsICZwYWdlc190b19mcmVlKTsKLQkJCX0KLQkJCXNobWVtX2Rpcl91bm1hcChkaXIpOwotCQkJZGlyID0gc2htZW1fZGlyX21hcChtaWRkaXIpOwotCQl9IGVsc2UgewotCQkJZGlyb2ZmID0gMDsKLQkJCW9mZnNldCA9IDA7Ci0JCQlpZHggPSBzdGFnZTsKLQkJfQotCX0KLQotCWZvciAoOyBpZHggPCBsaW1pdDsgaWR4ICs9IEVOVFJJRVNfUEVSX1BBR0UsIGRpcm9mZisrKSB7Ci0JCWlmICh1bmxpa2VseShpZHggPT0gc3RhZ2UpKSB7Ci0JCQlzaG1lbV9kaXJfdW5tYXAoZGlyKTsKLQkJCWRpciA9IHNobWVtX2Rpcl9tYXAodG9wZGlyKSArCi0JCQkgICAgRU5UUklFU19QRVJfUEFHRS8yICsgaWR4L0VOVFJJRVNfUEVSX1BBR0VQQUdFOwotCQkJd2hpbGUgKCEqZGlyKSB7Ci0JCQkJZGlyKys7Ci0JCQkJaWR4ICs9IEVOVFJJRVNfUEVSX1BBR0VQQUdFOwotCQkJCWlmIChpZHggPj0gbGltaXQpCi0JCQkJCWdvdG8gZG9uZTE7Ci0JCQl9Ci0JCQlzdGFnZSA9IGlkeCArIEVOVFJJRVNfUEVSX1BBR0VQQUdFOwotCQkJbWlkZGlyID0gKmRpcjsKLQkJCWlmIChwdW5jaF9ob2xlKQotCQkJCW5lZWRzX2xvY2sgPSAmaW5mby0+bG9jazsKLQkJCWlmICh1cHBlcl9saW1pdCA+PSBzdGFnZSkgewotCQkJCWlmIChuZWVkc19sb2NrKSB7Ci0JCQkJCXNwaW5fbG9jayhuZWVkc19sb2NrKTsKLQkJCQkJKmRpciA9IE5VTEw7Ci0JCQkJCXNwaW5fdW5sb2NrKG5lZWRzX2xvY2spOwotCQkJCQluZWVkc19sb2NrID0gTlVMTDsKLQkJCQl9IGVsc2UKLQkJCQkJKmRpciA9IE5VTEw7Ci0JCQkJbnJfcGFnZXNfdG9fZnJlZSsrOwotCQkJCWxpc3RfYWRkKCZtaWRkaXItPmxydSwgJnBhZ2VzX3RvX2ZyZWUpOwotCQkJfQotCQkJc2htZW1fZGlyX3VubWFwKGRpcik7Ci0JCQljb25kX3Jlc2NoZWQoKTsKLQkJCWRpciA9IHNobWVtX2Rpcl9tYXAobWlkZGlyKTsKLQkJCWRpcm9mZiA9IDA7Ci0JCX0KLQkJcHVuY2hfbG9jayA9IG5lZWRzX2xvY2s7Ci0JCXN1YmRpciA9IGRpcltkaXJvZmZdOwotCQlpZiAoc3ViZGlyICYmICFvZmZzZXQgJiYgdXBwZXJfbGltaXQtaWR4ID49IEVOVFJJRVNfUEVSX1BBR0UpIHsKLQkJCWlmIChuZWVkc19sb2NrKSB7Ci0JCQkJc3Bpbl9sb2NrKG5lZWRzX2xvY2spOwotCQkJCWRpcltkaXJvZmZdID0gTlVMTDsKLQkJCQlzcGluX3VubG9jayhuZWVkc19sb2NrKTsKLQkJCQlwdW5jaF9sb2NrID0gTlVMTDsKLQkJCX0gZWxzZQotCQkJCWRpcltkaXJvZmZdID0gTlVMTDsKLQkJCW5yX3BhZ2VzX3RvX2ZyZWUrKzsKLQkJCWxpc3RfYWRkKCZzdWJkaXItPmxydSwgJnBhZ2VzX3RvX2ZyZWUpOwotCQl9Ci0JCWlmIChzdWJkaXIgJiYgcGFnZV9wcml2YXRlKHN1YmRpcikgLyogaGFzIHN3YXAgZW50cmllcyAqLykgewotCQkJc2l6ZSA9IGxpbWl0IC0gaWR4OwotCQkJaWYgKHNpemUgPiBFTlRSSUVTX1BFUl9QQUdFKQotCQkJCXNpemUgPSBFTlRSSUVTX1BFUl9QQUdFOwotCQkJZnJlZWQgPSBzaG1lbV9tYXBfYW5kX2ZyZWVfc3dwKHN1YmRpciwKLQkJCQkJb2Zmc2V0LCBzaXplLCAmZGlyLCBwdW5jaF9sb2NrKTsKLQkJCWlmICghZGlyKQotCQkJCWRpciA9IHNobWVtX2Rpcl9tYXAobWlkZGlyKTsKLQkJCW5yX3N3YXBzX2ZyZWVkICs9IGZyZWVkOwotCQkJaWYgKG9mZnNldCB8fCBwdW5jaF9sb2NrKSB7Ci0JCQkJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKLQkJCQlzZXRfcGFnZV9wcml2YXRlKHN1YmRpciwKLQkJCQkJcGFnZV9wcml2YXRlKHN1YmRpcikgLSBmcmVlZCk7Ci0JCQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQkJfSBlbHNlCi0JCQkJQlVHX09OKHBhZ2VfcHJpdmF0ZShzdWJkaXIpICE9IGZyZWVkKTsKLQkJfQotCQlvZmZzZXQgPSAwOwotCX0KLWRvbmUxOgotCXNobWVtX2Rpcl91bm1hcChkaXIpOwotZG9uZTI6Ci0JaWYgKGlub2RlLT5pX21hcHBpbmctPm5ycGFnZXMgJiYgKGluZm8tPmZsYWdzICYgU0hNRU1fUEFHRUlOKSkgewotCQkvKgotCQkgKiBDYWxsIHRydW5jYXRlX2lub2RlX3BhZ2VzIGFnYWluOiByYWNpbmcgc2htZW1fdW51c2VfaW5vZGUKLQkJICogbWF5IGhhdmUgc3dpenpsZWQgYSBwYWdlIGluIGZyb20gc3dhcCBzaW5jZQotCQkgKiB0cnVuY2F0ZV9wYWdlY2FjaGUgb3IgZ2VuZXJpY19kZWxldGVfaW5vZGUgZGlkIGl0LCBiZWZvcmUgd2UKLQkJICogbG93ZXJlZCBuZXh0X2luZGV4LiAgQWxzbywgdGhvdWdoIHNobWVtX2dldHBhZ2UgY2hlY2tzCi0JCSAqIGlfc2l6ZSBiZWZvcmUgYWRkaW5nIHRvIGNhY2hlLCBubyByZWNoZWNrIGFmdGVyOiBzbyBmaXggdGhlCi0JCSAqIG5hcnJvdyB3aW5kb3cgdGhlcmUgdG9vLgotCQkgKi8KLQkJdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIGVuZCk7CisJCXNobWVtX3BhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CisJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfZW5kKCk7CisJCWluZGV4Kys7CiAJfQogCiAJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKLQlpbmZvLT5mbGFncyAmPSB+U0hNRU1fVFJVTkNBVEU7CiAJaW5mby0+c3dhcHBlZCAtPSBucl9zd2Fwc19mcmVlZDsKLQlpZiAobnJfcGFnZXNfdG9fZnJlZSkKLQkJc2htZW1fZnJlZV9ibG9ja3MoaW5vZGUsIG5yX3BhZ2VzX3RvX2ZyZWUpOwogCXNobWVtX3JlY2FsY19pbm9kZShpbm9kZSk7CiAJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwogCi0JLyoKLQkgKiBFbXB0eSBzd2FwIHZlY3RvciBkaXJlY3RvcnkgcGFnZXMgdG8gYmUgZnJlZWQ/Ci0JICovCi0JaWYgKCFsaXN0X2VtcHR5KCZwYWdlc190b19mcmVlKSkgewotCQlwYWdlc190b19mcmVlLnByZXYtPm5leHQgPSBOVUxMOwotCQlzaG1lbV9mcmVlX3BhZ2VzKHBhZ2VzX3RvX2ZyZWUubmV4dCk7Ci0JfQorCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzaG1lbV90cnVuY2F0ZV9yYW5nZSk7CiAKQEAgLTc4MCwzNyArNTIwLDcgQEAKIAlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpKSB7CiAJCWxvZmZfdCBvbGRzaXplID0gaW5vZGUtPmlfc2l6ZTsKIAkJbG9mZl90IG5ld3NpemUgPSBhdHRyLT5pYV9zaXplOwotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CiAKLQkJaWYgKG5ld3NpemUgPCBvbGRzaXplKSB7Ci0JCQkvKgotCQkJICogSWYgdHJ1bmNhdGluZyBkb3duIHRvIGEgcGFydGlhbCBwYWdlLCB0aGVuCi0JCQkgKiBpZiB0aGF0IHBhZ2UgaXMgYWxyZWFkeSBhbGxvY2F0ZWQsIGhvbGQgaXQKLQkJCSAqIGluIG1lbW9yeSB1bnRpbCB0aGUgdHJ1bmNhdGlvbiBpcyBvdmVyLCBzbwotCQkJICogdHJ1bmNhdGVfcGFydGlhbF9wYWdlIGNhbm5vdCBtaXNzIGl0IHdlcmUKLQkJCSAqIGl0IGFzc2lnbmVkIHRvIHN3YXAuCi0JCQkgKi8KLQkJCWlmIChuZXdzaXplICYgKFBBR0VfQ0FDSEVfU0laRS0xKSkgewotCQkJCSh2b2lkKSBzaG1lbV9nZXRwYWdlKGlub2RlLAotCQkJCQluZXdzaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQsCi0JCQkJCQkmcGFnZSwgU0dQX1JFQUQsIE5VTEwpOwotCQkJCWlmIChwYWdlKQotCQkJCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJCX0KLQkJCS8qCi0JCQkgKiBSZXNldCBTSE1FTV9QQUdFSU4gZmxhZyBzbyB0aGF0IHNobWVtX3RydW5jYXRlIGNhbgotCQkJICogZGV0ZWN0IGlmIGFueSBwYWdlcyBtaWdodCBoYXZlIGJlZW4gYWRkZWQgdG8gY2FjaGUKLQkJCSAqIGFmdGVyIHRydW5jYXRlX2lub2RlX3BhZ2VzLiAgQnV0IHdlIG5lZWRuJ3QgYm90aGVyCi0JCQkgKiBpZiBpdCdzIGJlaW5nIGZ1bGx5IHRydW5jYXRlZCB0byB6ZXJvLWxlbmd0aDogdGhlCi0JCQkgKiBucnBhZ2VzIGNoZWNrIGlzIGVmZmljaWVudCBlbm91Z2ggaW4gdGhhdCBjYXNlLgotCQkJICovCi0JCQlpZiAobmV3c2l6ZSkgewotCQkJCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvID0gU0hNRU1fSShpbm9kZSk7Ci0JCQkJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKLQkJCQlpbmZvLT5mbGFncyAmPSB+U0hNRU1fUEFHRUlOOwotCQkJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJCX0KLQkJfQogCQlpZiAobmV3c2l6ZSAhPSBvbGRzaXplKSB7CiAJCQlpX3NpemVfd3JpdGUoaW5vZGUsIG5ld3NpemUpOwogCQkJaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKQEAgLTgyMiw4ICs1MzIsNiBAQAogCQkJLyogdW5tYXAgYWdhaW4gdG8gcmVtb3ZlIHJhY2lseSBDT1dlZCBwcml2YXRlIHBhZ2VzICovCiAJCQl1bm1hcF9tYXBwaW5nX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIGhvbGViZWdpbiwgMCwgMSk7CiAJCX0KLQkJaWYgKHBhZ2UpCi0JCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJfQogCiAJc2V0YXR0cl9jb3B5KGlub2RlLCBhdHRyKTsKQEAgLTg0OCw3ICs1NTYsOCBAQAogCQkJbGlzdF9kZWxfaW5pdCgmaW5mby0+c3dhcGxpc3QpOwogCQkJbXV0ZXhfdW5sb2NrKCZzaG1lbV9zd2FwbGlzdF9tdXRleCk7CiAJCX0KLQl9CisJfSBlbHNlCisJCWtmcmVlKGluZm8tPnN5bWxpbmspOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHhhdHRyLCBueGF0dHIsICZpbmZvLT54YXR0cl9saXN0LCBsaXN0KSB7CiAJCWtmcmVlKHhhdHRyLT5uYW1lKTsKQEAgLTg1OSwxMDYgKzU2OCwyNyBAQAogCWVuZF93cml0ZWJhY2soaW5vZGUpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzaG1lbV9maW5kX3N3cChzd3BfZW50cnlfdCBlbnRyeSwgc3dwX2VudHJ5X3QgKmRpciwgc3dwX2VudHJ5X3QgKmVkaXIpCisvKgorICogSWYgc3dhcCBmb3VuZCBpbiBpbm9kZSwgZnJlZSBpdCBhbmQgbW92ZSBwYWdlIGZyb20gc3dhcGNhY2hlIHRvIGZpbGVjYWNoZS4KKyAqLworc3RhdGljIGludCBzaG1lbV91bnVzZV9pbm9kZShzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbywKKwkJCSAgICAgc3dwX2VudHJ5X3Qgc3dhcCwgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0Jc3dwX2VudHJ5X3QgKnB0cjsKLQotCWZvciAocHRyID0gZGlyOyBwdHIgPCBlZGlyOyBwdHIrKykgewotCQlpZiAocHRyLT52YWwgPT0gZW50cnkudmFsKQotCQkJcmV0dXJuIHB0ciAtIGRpcjsKLQl9Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IHNobWVtX3VudXNlX2lub2RlKHN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvLCBzd3BfZW50cnlfdCBlbnRyeSwgc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7Ci0JdW5zaWduZWQgbG9uZyBpZHg7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCXVuc2lnbmVkIGxvbmcgbGltaXQ7Ci0JdW5zaWduZWQgbG9uZyBzdGFnZTsKLQlzdHJ1Y3QgcGFnZSAqKmRpcjsKLQlzdHJ1Y3QgcGFnZSAqc3ViZGlyOwotCXN3cF9lbnRyeV90ICpwdHI7Ci0JaW50IG9mZnNldDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGluZm8tPnZmc19pbm9kZS5pX21hcHBpbmc7CisJdm9pZCAqcmFkc3dhcDsKKwlwZ29mZl90IGluZGV4OwogCWludCBlcnJvcjsKIAotCWlkeCA9IDA7Ci0JcHRyID0gaW5mby0+aV9kaXJlY3Q7Ci0Jc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKLQlpZiAoIWluZm8tPnN3YXBwZWQpIHsKLQkJbGlzdF9kZWxfaW5pdCgmaW5mby0+c3dhcGxpc3QpOwotCQlnb3RvIGxvc3QyOwotCX0KLQlsaW1pdCA9IGluZm8tPm5leHRfaW5kZXg7Ci0Jc2l6ZSA9IGxpbWl0OwotCWlmIChzaXplID4gU0hNRU1fTlJfRElSRUNUKQotCQlzaXplID0gU0hNRU1fTlJfRElSRUNUOwotCW9mZnNldCA9IHNobWVtX2ZpbmRfc3dwKGVudHJ5LCBwdHIsIHB0citzaXplKTsKLQlpZiAob2Zmc2V0ID49IDApIHsKLQkJc2htZW1fc3dwX2JhbGFuY2VfdW5tYXAoKTsKLQkJZ290byBmb3VuZDsKLQl9Ci0JaWYgKCFpbmZvLT5pX2luZGlyZWN0KQotCQlnb3RvIGxvc3QyOwotCi0JZGlyID0gc2htZW1fZGlyX21hcChpbmZvLT5pX2luZGlyZWN0KTsKLQlzdGFnZSA9IFNITUVNX05SX0RJUkVDVCArIEVOVFJJRVNfUEVSX1BBR0VQQUdFLzI7Ci0KLQlmb3IgKGlkeCA9IFNITUVNX05SX0RJUkVDVDsgaWR4IDwgbGltaXQ7IGlkeCArPSBFTlRSSUVTX1BFUl9QQUdFLCBkaXIrKykgewotCQlpZiAodW5saWtlbHkoaWR4ID09IHN0YWdlKSkgewotCQkJc2htZW1fZGlyX3VubWFwKGRpci0xKTsKLQkJCWlmIChjb25kX3Jlc2NoZWRfbG9jaygmaW5mby0+bG9jaykpIHsKLQkJCQkvKiBjaGVjayBpdCBoYXMgbm90IGJlZW4gdHJ1bmNhdGVkICovCi0JCQkJaWYgKGxpbWl0ID4gaW5mby0+bmV4dF9pbmRleCkgewotCQkJCQlsaW1pdCA9IGluZm8tPm5leHRfaW5kZXg7Ci0JCQkJCWlmIChpZHggPj0gbGltaXQpCi0JCQkJCQlnb3RvIGxvc3QyOwotCQkJCX0KLQkJCX0KLQkJCWRpciA9IHNobWVtX2Rpcl9tYXAoaW5mby0+aV9pbmRpcmVjdCkgKwotCQkJICAgIEVOVFJJRVNfUEVSX1BBR0UvMiArIGlkeC9FTlRSSUVTX1BFUl9QQUdFUEFHRTsKLQkJCXdoaWxlICghKmRpcikgewotCQkJCWRpcisrOwotCQkJCWlkeCArPSBFTlRSSUVTX1BFUl9QQUdFUEFHRTsKLQkJCQlpZiAoaWR4ID49IGxpbWl0KQotCQkJCQlnb3RvIGxvc3QxOwotCQkJfQotCQkJc3RhZ2UgPSBpZHggKyBFTlRSSUVTX1BFUl9QQUdFUEFHRTsKLQkJCXN1YmRpciA9ICpkaXI7Ci0JCQlzaG1lbV9kaXJfdW5tYXAoZGlyKTsKLQkJCWRpciA9IHNobWVtX2Rpcl9tYXAoc3ViZGlyKTsKLQkJfQotCQlzdWJkaXIgPSAqZGlyOwotCQlpZiAoc3ViZGlyICYmIHBhZ2VfcHJpdmF0ZShzdWJkaXIpKSB7Ci0JCQlwdHIgPSBzaG1lbV9zd3BfbWFwKHN1YmRpcik7Ci0JCQlzaXplID0gbGltaXQgLSBpZHg7Ci0JCQlpZiAoc2l6ZSA+IEVOVFJJRVNfUEVSX1BBR0UpCi0JCQkJc2l6ZSA9IEVOVFJJRVNfUEVSX1BBR0U7Ci0JCQlvZmZzZXQgPSBzaG1lbV9maW5kX3N3cChlbnRyeSwgcHRyLCBwdHIrc2l6ZSk7Ci0JCQlzaG1lbV9zd3BfdW5tYXAocHRyKTsKLQkJCWlmIChvZmZzZXQgPj0gMCkgewotCQkJCXNobWVtX2Rpcl91bm1hcChkaXIpOwotCQkJCXB0ciA9IHNobWVtX3N3cF9tYXAoc3ViZGlyKTsKLQkJCQlnb3RvIGZvdW5kOwotCQkJfQotCQl9Ci0JfQotbG9zdDE6Ci0Jc2htZW1fZGlyX3VubWFwKGRpci0xKTsKLWxvc3QyOgotCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQlyZXR1cm4gMDsKLWZvdW5kOgotCWlkeCArPSBvZmZzZXQ7Ci0JcHRyICs9IG9mZnNldDsKKwlyYWRzd2FwID0gc3dwX3RvX3JhZGl4X2VudHJ5KHN3YXApOworCWluZGV4ID0gcmFkaXhfdHJlZV9sb2NhdGVfaXRlbSgmbWFwcGluZy0+cGFnZV90cmVlLCByYWRzd2FwKTsKKwlpZiAoaW5kZXggPT0gLTEpCisJCXJldHVybiAwOwogCiAJLyoKIAkgKiBNb3ZlIF9oZWFkXyB0byBzdGFydCBzZWFyY2ggZm9yIG5leHQgZnJvbSBoZXJlLgogCSAqIEJ1dCBiZSBjYXJlZnVsOiBzaG1lbV9ldmljdF9pbm9kZSBjaGVja3MgbGlzdF9lbXB0eSB3aXRob3V0IHRha2luZwogCSAqIG11dGV4LCBhbmQgdGhlcmUncyBhbiBpbnN0YW50IGluIGxpc3RfbW92ZV90YWlsIHdoZW4gaW5mby0+c3dhcGxpc3QKLQkgKiB3b3VsZCBhcHBlYXIgZW1wdHksIGlmIGl0IHdlcmUgdGhlIG9ubHkgb25lIG9uIHNobWVtX3N3YXBsaXN0LiAgV2UKLQkgKiBjb3VsZCBhdm9pZCBkb2luZyBpdCBpZiBpbm9kZSBOVUxMOyBvciB1c2UgdGhpcyBtaW5vciBvcHRpbWl6YXRpb24uCisJICogd291bGQgYXBwZWFyIGVtcHR5LCBpZiBpdCB3ZXJlIHRoZSBvbmx5IG9uZSBvbiBzaG1lbV9zd2FwbGlzdC4KIAkgKi8KIAlpZiAoc2htZW1fc3dhcGxpc3QubmV4dCAhPSAmaW5mby0+c3dhcGxpc3QpCiAJCWxpc3RfbW92ZV90YWlsKCZzaG1lbV9zd2FwbGlzdCwgJmluZm8tPnN3YXBsaXN0KTsKQEAgLTk2OCwyOSArNTk4LDM0IEBACiAJICogYnV0IGFsc28gdG8gaG9sZCB1cCBzaG1lbV9ldmljdF9pbm9kZSgpOiBzbyBpbm9kZSBjYW5ub3QgYmUgZnJlZWQKIAkgKiBiZW5lYXRoIHVzIChwYWdlbG9jayBkb2Vzbid0IGhlbHAgdW50aWwgdGhlIHBhZ2UgaXMgaW4gcGFnZWNhY2hlKS4KIAkgKi8KLQltYXBwaW5nID0gaW5mby0+dmZzX2lub2RlLmlfbWFwcGluZzsKLQllcnJvciA9IGFkZF90b19wYWdlX2NhY2hlX2xvY2tlZChwYWdlLCBtYXBwaW5nLCBpZHgsIEdGUF9OT1dBSVQpOworCWVycm9yID0gc2htZW1fYWRkX3RvX3BhZ2VfY2FjaGUocGFnZSwgbWFwcGluZywgaW5kZXgsCisJCQkJCQlHRlBfTk9XQUlULCByYWRzd2FwKTsKIAkvKiB3aGljaCBkb2VzIG1lbV9jZ3JvdXBfdW5jaGFyZ2VfY2FjaGVfcGFnZSBvbiBlcnJvciAqLwogCiAJaWYgKGVycm9yICE9IC1FTk9NRU0pIHsKKwkJLyoKKwkJICogVHJ1bmNhdGlvbiBhbmQgZXZpY3Rpb24gdXNlIGZyZWVfc3dhcF9hbmRfY2FjaGUoKSwgd2hpY2gKKwkJICogb25seSBkb2VzIHRyeWxvY2sgcGFnZTogaWYgd2UgcmFjZWQsIGJlc3QgY2xlYW4gdXAgaGVyZS4KKwkJICovCiAJCWRlbGV0ZV9mcm9tX3N3YXBfY2FjaGUocGFnZSk7CiAJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOwotCQlpbmZvLT5mbGFncyB8PSBTSE1FTV9QQUdFSU47Ci0JCXNobWVtX3N3cF9zZXQoaW5mbywgcHRyLCAwKTsKLQkJc3dhcF9mcmVlKGVudHJ5KTsKKwkJaWYgKCFlcnJvcikgeworCQkJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKKwkJCWluZm8tPnN3YXBwZWQtLTsKKwkJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKKwkJCXN3YXBfZnJlZShzd2FwKTsKKwkJfQogCQllcnJvciA9IDE7CS8qIG5vdCBhbiBlcnJvciwgYnV0IGVudHJ5IHdhcyBmb3VuZCAqLwogCX0KLQlzaG1lbV9zd3BfdW5tYXAocHRyKTsKLQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CiAJcmV0dXJuIGVycm9yOwogfQogCiAvKgotICogc2htZW1fdW51c2UoKSBzZWFyY2ggZm9yIGFuIGV2ZW50dWFsbHkgc3dhcHBlZCBvdXQgc2htZW0gcGFnZS4KKyAqIFNlYXJjaCB0aHJvdWdoIHN3YXBwZWQgaW5vZGVzIHRvIGZpbmQgYW5kIHJlcGxhY2Ugc3dhcCBieSBwYWdlLgogICovCi1pbnQgc2htZW1fdW51c2Uoc3dwX2VudHJ5X3QgZW50cnksIHN0cnVjdCBwYWdlICpwYWdlKQoraW50IHNobWVtX3VudXNlKHN3cF9lbnRyeV90IHN3YXAsIHN0cnVjdCBwYWdlICpwYWdlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnAsICpuZXh0OworCXN0cnVjdCBsaXN0X2hlYWQgKnRoaXMsICpuZXh0OwogCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvOwogCWludCBmb3VuZCA9IDA7CiAJaW50IGVycm9yOwpAQCAtOTk5LDMyICs2MzQsMjUgQEAKIAkgKiBDaGFyZ2UgcGFnZSB1c2luZyBHRlBfS0VSTkVMIHdoaWxlIHdlIGNhbiB3YWl0LCBiZWZvcmUgdGFraW5nCiAJICogdGhlIHNobWVtX3N3YXBsaXN0X211dGV4IHdoaWNoIG1pZ2h0IGhvbGQgdXAgc2htZW1fd3JpdGVwYWdlKCkuCiAJICogQ2hhcmdlZCBiYWNrIHRvIHRoZSB1c2VyIChub3QgdG8gY2FsbGVyKSB3aGVuIHN3YXAgYWNjb3VudCBpcyB1c2VkLgotCSAqIGFkZF90b19wYWdlX2NhY2hlKCkgd2lsbCBiZSBjYWxsZWQgd2l0aCBHRlBfTk9XQUlULgogCSAqLwogCWVycm9yID0gbWVtX2Nncm91cF9jYWNoZV9jaGFyZ2UocGFnZSwgY3VycmVudC0+bW0sIEdGUF9LRVJORUwpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXQ7Ci0JLyoKLQkgKiBUcnkgdG8gcHJlbG9hZCB3aGlsZSB3ZSBjYW4gd2FpdCwgdG8gbm90IG1ha2UgYSBoYWJpdCBvZgotCSAqIGRyYWluaW5nIGF0b21pYyByZXNlcnZlczsgYnV0IGRvbid0IGxhdGNoIG9uIHRvIHRoaXMgY3B1LAotCSAqIGl0J3Mgb2theSBpZiBzb21ldGltZXMgd2UgZ2V0IHJlc2NoZWR1bGVkIGFmdGVyIHRoaXMuCi0JICovCi0JZXJyb3IgPSByYWRpeF90cmVlX3ByZWxvYWQoR0ZQX0tFUk5FTCk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIHVuY2hhcmdlOwotCXJhZGl4X3RyZWVfcHJlbG9hZF9lbmQoKTsKKwkvKiBObyByYWRpeF90cmVlX3ByZWxvYWQ6IHN3YXAgZW50cnkga2VlcHMgYSBwbGFjZSBmb3IgcGFnZSBpbiB0cmVlICovCiAKIAltdXRleF9sb2NrKCZzaG1lbV9zd2FwbGlzdF9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG5leHQsICZzaG1lbV9zd2FwbGlzdCkgewotCQlpbmZvID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbywgc3dhcGxpc3QpOwotCQlmb3VuZCA9IHNobWVtX3VudXNlX2lub2RlKGluZm8sIGVudHJ5LCBwYWdlKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUodGhpcywgbmV4dCwgJnNobWVtX3N3YXBsaXN0KSB7CisJCWluZm8gPSBsaXN0X2VudHJ5KHRoaXMsIHN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvLCBzd2FwbGlzdCk7CisJCWlmIChpbmZvLT5zd2FwcGVkKQorCQkJZm91bmQgPSBzaG1lbV91bnVzZV9pbm9kZShpbmZvLCBzd2FwLCBwYWdlKTsKKwkJZWxzZQorCQkJbGlzdF9kZWxfaW5pdCgmaW5mby0+c3dhcGxpc3QpOwogCQljb25kX3Jlc2NoZWQoKTsKIAkJaWYgKGZvdW5kKQogCQkJYnJlYWs7CiAJfQogCW11dGV4X3VubG9jaygmc2htZW1fc3dhcGxpc3RfbXV0ZXgpOwogCi11bmNoYXJnZToKIAlpZiAoIWZvdW5kKQogCQltZW1fY2dyb3VwX3VuY2hhcmdlX2NhY2hlX3BhZ2UocGFnZSk7CiAJaWYgKGZvdW5kIDwgMCkKQEAgLTEwNDEsMTAgKzY2OSwxMCBAQAogc3RhdGljIGludCBzaG1lbV93cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQogewogCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvOwotCXN3cF9lbnRyeV90ICplbnRyeSwgc3dhcDsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKLQl1bnNpZ25lZCBsb25nIGluZGV4OwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3dwX2VudHJ5X3Qgc3dhcDsKKwlwZ29mZl90IGluZGV4OwogCiAJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKIAltYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKQEAgLTEwNzMsNTAgKzcwMSwzMiBAQAogCiAJLyoKIAkgKiBBZGQgaW5vZGUgdG8gc2htZW1fdW51c2UoKSdzIGxpc3Qgb2Ygc3dhcHBlZC1vdXQgaW5vZGVzLAotCSAqIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUuICBEbyBpdCBub3cgYmVjYXVzZSB3ZSBjYW5ub3QgdGFrZQotCSAqIG11dGV4IHdoaWxlIGhvbGRpbmcgc3BpbmxvY2ssIGFuZCBtdXN0IGRvIHNvIGJlZm9yZSB0aGUgcGFnZQotCSAqIGlzIG1vdmVkIHRvIHN3YXAgY2FjaGUsIHdoZW4gaXRzIHBhZ2Vsb2NrIG5vIGxvbmdlciBwcm90ZWN0cworCSAqIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUuICBEbyBpdCBub3cgYmVmb3JlIHRoZSBwYWdlIGlzCisJICogbW92ZWQgdG8gc3dhcCBjYWNoZSwgd2hlbiBpdHMgcGFnZWxvY2sgbm8gbG9uZ2VyIHByb3RlY3RzCiAJICogdGhlIGlub2RlIGZyb20gZXZpY3Rpb24uICBCdXQgZG9uJ3QgdW5sb2NrIHRoZSBtdXRleCB1bnRpbAotCSAqIHdlJ3ZlIHRha2VuIHRoZSBzcGlubG9jaywgYmVjYXVzZSBzaG1lbV91bnVzZV9pbm9kZSgpIHdpbGwKLQkgKiBwcnVuZSBhICFzd2FwcGVkIGlub2RlIGZyb20gdGhlIHN3YXBsaXN0IHVuZGVyIGJvdGggbG9ja3MuCisJICogd2UndmUgaW5jcmVtZW50ZWQgc3dhcHBlZCwgYmVjYXVzZSBzaG1lbV91bnVzZV9pbm9kZSgpIHdpbGwKKwkgKiBwcnVuZSBhICFzd2FwcGVkIGlub2RlIGZyb20gdGhlIHN3YXBsaXN0IHVuZGVyIHRoaXMgbXV0ZXguCiAJICovCiAJbXV0ZXhfbG9jaygmc2htZW1fc3dhcGxpc3RfbXV0ZXgpOwogCWlmIChsaXN0X2VtcHR5KCZpbmZvLT5zd2FwbGlzdCkpCiAJCWxpc3RfYWRkX3RhaWwoJmluZm8tPnN3YXBsaXN0LCAmc2htZW1fc3dhcGxpc3QpOwogCi0Jc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKLQltdXRleF91bmxvY2soJnNobWVtX3N3YXBsaXN0X211dGV4KTsKLQotCWlmIChpbmRleCA+PSBpbmZvLT5uZXh0X2luZGV4KSB7Ci0JCUJVR19PTighKGluZm8tPmZsYWdzICYgU0hNRU1fVFJVTkNBVEUpKTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCWVudHJ5ID0gc2htZW1fc3dwX2VudHJ5KGluZm8sIGluZGV4LCBOVUxMKTsKLQlpZiAoZW50cnktPnZhbCkgewotCQlXQVJOX09OX09OQ0UoMSk7CS8qIFN0aWxsIGhhcHBlbnM/IFRlbGwgdXMgYWJvdXQgaXQhICovCi0JCWZyZWVfc3dhcF9hbmRfY2FjaGUoKmVudHJ5KTsKLQkJc2htZW1fc3dwX3NldChpbmZvLCBlbnRyeSwgMCk7Ci0JfQotCXNobWVtX3JlY2FsY19pbm9kZShpbm9kZSk7Ci0KIAlpZiAoYWRkX3RvX3N3YXBfY2FjaGUocGFnZSwgc3dhcCwgR0ZQX0FUT01JQykgPT0gMCkgewotCQlkZWxldGVfZnJvbV9wYWdlX2NhY2hlKHBhZ2UpOwotCQlzaG1lbV9zd3Bfc2V0KGluZm8sIGVudHJ5LCBzd2FwLnZhbCk7Ci0JCXNobWVtX3N3cF91bm1hcChlbnRyeSk7CiAJCXN3YXBfc2htZW1fYWxsb2Moc3dhcCk7CisJCXNobWVtX2RlbGV0ZV9mcm9tX3BhZ2VfY2FjaGUocGFnZSwgc3dwX3RvX3JhZGl4X2VudHJ5KHN3YXApKTsKKworCQlzcGluX2xvY2soJmluZm8tPmxvY2spOworCQlpbmZvLT5zd2FwcGVkKys7CisJCXNobWVtX3JlY2FsY19pbm9kZShpbm9kZSk7CiAJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKKworCQltdXRleF91bmxvY2soJnNobWVtX3N3YXBsaXN0X211dGV4KTsKIAkJQlVHX09OKHBhZ2VfbWFwcGVkKHBhZ2UpKTsKIAkJc3dhcF93cml0ZXBhZ2UocGFnZSwgd2JjKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0Jc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKLXVubG9jazoKLQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0JLyoKLQkgKiBhZGRfdG9fc3dhcF9jYWNoZSgpIGRvZXNuJ3QgcmV0dXJuIC1FRVhJU1QsIHNvIHdlIGNhbiBzYWZlbHkKLQkgKiBjbGVhciBTV0FQX0hBU19DQUNIRSBmbGFnLgotCSAqLworCW11dGV4X3VubG9jaygmc2htZW1fc3dhcGxpc3RfbXV0ZXgpOwogCXN3YXBjYWNoZV9mcmVlKHN3YXAsIE5VTEwpOwogcmVkaXJ0eToKIAlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKQEAgLTExNTMsMzUgKzc2MywzMyBAQAogfQogI2VuZGlmIC8qIENPTkZJR19UTVBGUyAqLwogCi1zdGF0aWMgc3RydWN0IHBhZ2UgKnNobWVtX3N3YXBpbihzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwLAotCQkJc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8sIHVuc2lnbmVkIGxvbmcgaWR4KQorc3RhdGljIHN0cnVjdCBwYWdlICpzaG1lbV9zd2FwaW4oc3dwX2VudHJ5X3Qgc3dhcCwgZ2ZwX3QgZ2ZwLAorCQkJc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8sIHBnb2ZmX3QgaW5kZXgpCiB7CiAJc3RydWN0IG1lbXBvbGljeSBtcG9sLCAqc3BvbDsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgcHZtYTsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAogCXNwb2wgPSBtcG9sX2NvbmRfY29weSgmbXBvbCwKLQkJCQltcG9sX3NoYXJlZF9wb2xpY3lfbG9va3VwKCZpbmZvLT5wb2xpY3ksIGlkeCkpOworCQkJbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cCgmaW5mby0+cG9saWN5LCBpbmRleCkpOwogCiAJLyogQ3JlYXRlIGEgcHNldWRvIHZtYSB0aGF0IGp1c3QgY29udGFpbnMgdGhlIHBvbGljeSAqLwogCXB2bWEudm1fc3RhcnQgPSAwOwotCXB2bWEudm1fcGdvZmYgPSBpZHg7CisJcHZtYS52bV9wZ29mZiA9IGluZGV4OwogCXB2bWEudm1fb3BzID0gTlVMTDsKIAlwdm1hLnZtX3BvbGljeSA9IHNwb2w7Ci0JcGFnZSA9IHN3YXBpbl9yZWFkYWhlYWQoZW50cnksIGdmcCwgJnB2bWEsIDApOwotCXJldHVybiBwYWdlOworCXJldHVybiBzd2FwaW5fcmVhZGFoZWFkKHN3YXAsIGdmcCwgJnB2bWEsIDApOwogfQogCiBzdGF0aWMgc3RydWN0IHBhZ2UgKnNobWVtX2FsbG9jX3BhZ2UoZ2ZwX3QgZ2ZwLAotCQkJc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8sIHVuc2lnbmVkIGxvbmcgaWR4KQorCQkJc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8sIHBnb2ZmX3QgaW5kZXgpCiB7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0IHB2bWE7CiAKIAkvKiBDcmVhdGUgYSBwc2V1ZG8gdm1hIHRoYXQganVzdCBjb250YWlucyB0aGUgcG9saWN5ICovCiAJcHZtYS52bV9zdGFydCA9IDA7Ci0JcHZtYS52bV9wZ29mZiA9IGlkeDsKKwlwdm1hLnZtX3Bnb2ZmID0gaW5kZXg7CiAJcHZtYS52bV9vcHMgPSBOVUxMOwotCXB2bWEudm1fcG9saWN5ID0gbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cCgmaW5mby0+cG9saWN5LCBpZHgpOworCXB2bWEudm1fcG9saWN5ID0gbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cCgmaW5mby0+cG9saWN5LCBpbmRleCk7CiAKIAkvKgogCSAqIGFsbG9jX3BhZ2Vfdm1hKCkgd2lsbCBkcm9wIHRoZSBzaGFyZWQgcG9saWN5IHJlZmVyZW5jZQpAQCAtMTE5MCwxOSArNzk4LDE5IEBACiB9CiAjZWxzZSAvKiAhQ09ORklHX05VTUEgKi8KICNpZmRlZiBDT05GSUdfVE1QRlMKLXN0YXRpYyBpbmxpbmUgdm9pZCBzaG1lbV9zaG93X21wb2woc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBtZW1wb2xpY3kgKnApCitzdGF0aWMgaW5saW5lIHZvaWQgc2htZW1fc2hvd19tcG9sKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKQogewogfQogI2VuZGlmIC8qIENPTkZJR19UTVBGUyAqLwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpzaG1lbV9zd2FwaW4oc3dwX2VudHJ5X3QgZW50cnksIGdmcF90IGdmcCwKLQkJCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvLCB1bnNpZ25lZCBsb25nIGlkeCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnNobWVtX3N3YXBpbihzd3BfZW50cnlfdCBzd2FwLCBnZnBfdCBnZnAsCisJCQlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbywgcGdvZmZfdCBpbmRleCkKIHsKLQlyZXR1cm4gc3dhcGluX3JlYWRhaGVhZChlbnRyeSwgZ2ZwLCBOVUxMLCAwKTsKKwlyZXR1cm4gc3dhcGluX3JlYWRhaGVhZChzd2FwLCBnZnAsIE5VTEwsIDApOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpzaG1lbV9hbGxvY19wYWdlKGdmcF90IGdmcCwKLQkJCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvLCB1bnNpZ25lZCBsb25nIGlkeCkKKwkJCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvLCBwZ29mZl90IGluZGV4KQogewogCXJldHVybiBhbGxvY19wYWdlKGdmcCk7CiB9CkBAIC0xMjIyLDI0MyArODMwLDE5MCBAQAogICogdm0uIElmIHdlIHN3YXAgaXQgaW4gd2UgbWFyayBpdCBkaXJ0eSBzaW5jZSB3ZSBhbHNvIGZyZWUgdGhlIHN3YXAKICAqIGVudHJ5IHNpbmNlIGEgcGFnZSBjYW5ub3QgbGl2ZSBpbiBib3RoIHRoZSBzd2FwIGFuZCBwYWdlIGNhY2hlCiAgKi8KLXN0YXRpYyBpbnQgc2htZW1fZ2V0cGFnZV9nZnAoc3RydWN0IGlub2RlICppbm9kZSwgcGdvZmZfdCBpZHgsCitzdGF0aWMgaW50IHNobWVtX2dldHBhZ2VfZ2ZwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHBnb2ZmX3QgaW5kZXgsCiAJc3RydWN0IHBhZ2UgKipwYWdlcCwgZW51bSBzZ3BfdHlwZSBzZ3AsIGdmcF90IGdmcCwgaW50ICpmYXVsdF90eXBlKQogewogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKLQlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbyA9IFNITUVNX0koaW5vZGUpOworCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvOwogCXN0cnVjdCBzaG1lbV9zYl9pbmZvICpzYmluZm87CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0Jc3RydWN0IHBhZ2UgKnByZWFsbG9jX3BhZ2UgPSBOVUxMOwotCXN3cF9lbnRyeV90ICplbnRyeTsKIAlzd3BfZW50cnlfdCBzd2FwOwogCWludCBlcnJvcjsKLQlpbnQgcmV0OworCWludCBvbmNlID0gMDsKIAotCWlmIChpZHggPj0gU0hNRU1fTUFYX0lOREVYKQorCWlmIChpbmRleCA+IChNQVhfTEZTX0ZJTEVTSVpFID4+IFBBR0VfQ0FDSEVfU0hJRlQpKQogCQlyZXR1cm4gLUVGQklHOwogcmVwZWF0OgotCXBhZ2UgPSBmaW5kX2xvY2tfcGFnZShtYXBwaW5nLCBpZHgpOwotCWlmIChwYWdlKSB7CisJc3dhcC52YWwgPSAwOworCXBhZ2UgPSBmaW5kX2xvY2tfcGFnZShtYXBwaW5nLCBpbmRleCk7CisJaWYgKHJhZGl4X3RyZWVfZXhjZXB0aW9uYWxfZW50cnkocGFnZSkpIHsKKwkJc3dhcCA9IHJhZGl4X3RvX3N3cF9lbnRyeShwYWdlKTsKKwkJcGFnZSA9IE5VTEw7CisJfQorCisJaWYgKHNncCAhPSBTR1BfV1JJVEUgJiYKKwkgICAgKChsb2ZmX3QpaW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgPj0gaV9zaXplX3JlYWQoaW5vZGUpKSB7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJaWYgKHBhZ2UgfHwgKHNncCA9PSBTR1BfUkVBRCAmJiAhc3dhcC52YWwpKSB7CiAJCS8qCiAJCSAqIE9uY2Ugd2UgY2FuIGdldCB0aGUgcGFnZSBsb2NrLCBpdCBtdXN0IGJlIHVwdG9kYXRlOgogCQkgKiBpZiB0aGVyZSB3ZXJlIGFuIGVycm9yIGluIHJlYWRpbmcgYmFjayBmcm9tIHN3YXAsCiAJCSAqIHRoZSBwYWdlIHdvdWxkIG5vdCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBmaWxlY2FjaGUuCiAJCSAqLwotCQlCVUdfT04oIVBhZ2VVcHRvZGF0ZShwYWdlKSk7Ci0JCWdvdG8gZG9uZTsKKwkJQlVHX09OKHBhZ2UgJiYgIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CisJCSpwYWdlcCA9IHBhZ2U7CisJCXJldHVybiAwOwogCX0KIAogCS8qCi0JICogVHJ5IHRvIHByZWxvYWQgd2hpbGUgd2UgY2FuIHdhaXQsIHRvIG5vdCBtYWtlIGEgaGFiaXQgb2YKLQkgKiBkcmFpbmluZyBhdG9taWMgcmVzZXJ2ZXM7IGJ1dCBkb24ndCBsYXRjaCBvbiB0byB0aGlzIGNwdS4KKwkgKiBGYXN0IGNhY2hlIGxvb2t1cCBkaWQgbm90IGZpbmQgaXQ6CisJICogYnJpbmcgaXQgYmFjayBmcm9tIHN3YXAgb3IgYWxsb2NhdGUuCiAJICovCi0JZXJyb3IgPSByYWRpeF90cmVlX3ByZWxvYWQoZ2ZwICYgR0ZQX1JFQ0xBSU1fTUFTSyk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dDsKLQlyYWRpeF90cmVlX3ByZWxvYWRfZW5kKCk7Ci0KLQlpZiAoc2dwICE9IFNHUF9SRUFEICYmICFwcmVhbGxvY19wYWdlKSB7Ci0JCXByZWFsbG9jX3BhZ2UgPSBzaG1lbV9hbGxvY19wYWdlKGdmcCwgaW5mbywgaWR4KTsKLQkJaWYgKHByZWFsbG9jX3BhZ2UpIHsKLQkJCVNldFBhZ2VTd2FwQmFja2VkKHByZWFsbG9jX3BhZ2UpOwotCQkJaWYgKG1lbV9jZ3JvdXBfY2FjaGVfY2hhcmdlKHByZWFsbG9jX3BhZ2UsCi0JCQkJCWN1cnJlbnQtPm1tLCBHRlBfS0VSTkVMKSkgewotCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwcmVhbGxvY19wYWdlKTsKLQkJCQlwcmVhbGxvY19wYWdlID0gTlVMTDsKLQkJCX0KLQkJfQotCX0KLQotCXNwaW5fbG9jaygmaW5mby0+bG9jayk7Ci0Jc2htZW1fcmVjYWxjX2lub2RlKGlub2RlKTsKLQllbnRyeSA9IHNobWVtX3N3cF9hbGxvYyhpbmZvLCBpZHgsIHNncCwgZ2ZwKTsKLQlpZiAoSVNfRVJSKGVudHJ5KSkgewotCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0JCWVycm9yID0gUFRSX0VSUihlbnRyeSk7Ci0JCWdvdG8gb3V0OwotCX0KLQlzd2FwID0gKmVudHJ5OworCWluZm8gPSBTSE1FTV9JKGlub2RlKTsKKwlzYmluZm8gPSBTSE1FTV9TQihpbm9kZS0+aV9zYik7CiAKIAlpZiAoc3dhcC52YWwpIHsKIAkJLyogTG9vayBpdCB1cCBhbmQgcmVhZCBpdCBpbi4uICovCiAJCXBhZ2UgPSBsb29rdXBfc3dhcF9jYWNoZShzd2FwKTsKIAkJaWYgKCFwYWdlKSB7Ci0JCQlzaG1lbV9zd3BfdW5tYXAoZW50cnkpOwotCQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwogCQkJLyogaGVyZSB3ZSBhY3R1YWxseSBkbyB0aGUgaW8gKi8KIAkJCWlmIChmYXVsdF90eXBlKQogCQkJCSpmYXVsdF90eXBlIHw9IFZNX0ZBVUxUX01BSk9SOwotCQkJcGFnZSA9IHNobWVtX3N3YXBpbihzd2FwLCBnZnAsIGluZm8sIGlkeCk7CisJCQlwYWdlID0gc2htZW1fc3dhcGluKHN3YXAsIGdmcCwgaW5mbywgaW5kZXgpOwogCQkJaWYgKCFwYWdlKSB7Ci0JCQkJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKLQkJCQllbnRyeSA9IHNobWVtX3N3cF9hbGxvYyhpbmZvLCBpZHgsIHNncCwgZ2ZwKTsKLQkJCQlpZiAoSVNfRVJSKGVudHJ5KSkKLQkJCQkJZXJyb3IgPSBQVFJfRVJSKGVudHJ5KTsKLQkJCQllbHNlIHsKLQkJCQkJaWYgKGVudHJ5LT52YWwgPT0gc3dhcC52YWwpCi0JCQkJCQllcnJvciA9IC1FTk9NRU07Ci0JCQkJCXNobWVtX3N3cF91bm1hcChlbnRyeSk7Ci0JCQkJfQotCQkJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJCQlpZiAoZXJyb3IpCi0JCQkJCWdvdG8gb3V0OwotCQkJCWdvdG8gcmVwZWF0OworCQkJCWVycm9yID0gLUVOT01FTTsKKwkJCQlnb3RvIGZhaWxlZDsKIAkJCX0KLQkJCXdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7Ci0JCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQlnb3RvIHJlcGVhdDsKIAkJfQogCiAJCS8qIFdlIGhhdmUgdG8gZG8gdGhpcyB3aXRoIHBhZ2UgbG9ja2VkIHRvIHByZXZlbnQgcmFjZXMgKi8KLQkJaWYgKCF0cnlsb2NrX3BhZ2UocGFnZSkpIHsKLQkJCXNobWVtX3N3cF91bm1hcChlbnRyeSk7Ci0JCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0JCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJZ290byByZXBlYXQ7Ci0JCX0KLQkJaWYgKFBhZ2VXcml0ZWJhY2socGFnZSkpIHsKLQkJCXNobWVtX3N3cF91bm1hcChlbnRyeSk7Ci0JCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0JCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwotCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQlnb3RvIHJlcGVhdDsKLQkJfQorCQlsb2NrX3BhZ2UocGFnZSk7CiAJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7Ci0JCQlzaG1lbV9zd3BfdW5tYXAoZW50cnkpOwotCQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCQllcnJvciA9IC1FSU87Ci0JCQlnb3RvIG91dDsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7CisKKwkJLyogU29tZW9uZSBtYXkgaGF2ZSBhbHJlYWR5IGRvbmUgaXQgZm9yIHVzICovCisJCWlmIChwYWdlLT5tYXBwaW5nKSB7CisJCQlpZiAocGFnZS0+bWFwcGluZyA9PSBtYXBwaW5nICYmCisJCQkgICAgcGFnZS0+aW5kZXggPT0gaW5kZXgpCisJCQkJZ290byBkb25lOworCQkJZXJyb3IgPSAtRUVYSVNUOworCQkJZ290byBmYWlsZWQ7CiAJCX0KIAotCQllcnJvciA9IGFkZF90b19wYWdlX2NhY2hlX2xvY2tlZChwYWdlLCBtYXBwaW5nLAotCQkJCQkJIGlkeCwgR0ZQX05PV0FJVCk7Ci0JCWlmIChlcnJvcikgewotCQkJc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKLQkJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJCWlmIChlcnJvciA9PSAtRU5PTUVNKSB7Ci0JCQkJLyoKLQkJCQkgKiByZWNsYWltIGZyb20gcHJvcGVyIG1lbW9yeSBjZ3JvdXAgYW5kCi0JCQkJICogY2FsbCBtZW1jZydzIE9PTSBpZiBuZWVkZWQuCi0JCQkJICovCi0JCQkJZXJyb3IgPSBtZW1fY2dyb3VwX3NobWVtX2NoYXJnZV9mYWxsYmFjaygKLQkJCQkJCXBhZ2UsIGN1cnJlbnQtPm1tLCBnZnApOwotCQkJCWlmIChlcnJvcikgewotCQkJCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJCQlnb3RvIG91dDsKLQkJCQl9Ci0JCQl9Ci0JCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJCWdvdG8gcmVwZWF0OwotCQl9CisJCWVycm9yID0gbWVtX2Nncm91cF9jYWNoZV9jaGFyZ2UocGFnZSwgY3VycmVudC0+bW0sCisJCQkJCQlnZnAgJiBHRlBfUkVDTEFJTV9NQVNLKTsKKwkJaWYgKCFlcnJvcikKKwkJCWVycm9yID0gc2htZW1fYWRkX3RvX3BhZ2VfY2FjaGUocGFnZSwgbWFwcGluZywgaW5kZXgsCisJCQkJCQlnZnAsIHN3cF90b19yYWRpeF9lbnRyeShzd2FwKSk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZmFpbGVkOwogCi0JCWluZm8tPmZsYWdzIHw9IFNITUVNX1BBR0VJTjsKLQkJc2htZW1fc3dwX3NldChpbmZvLCBlbnRyeSwgMCk7Ci0JCXNobWVtX3N3cF91bm1hcChlbnRyeSk7Ci0JCWRlbGV0ZV9mcm9tX3N3YXBfY2FjaGUocGFnZSk7CisJCXNwaW5fbG9jaygmaW5mby0+bG9jayk7CisJCWluZm8tPnN3YXBwZWQtLTsKKwkJc2htZW1fcmVjYWxjX2lub2RlKGlub2RlKTsKIAkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOworCisJCWRlbGV0ZV9mcm9tX3N3YXBfY2FjaGUocGFnZSk7CiAJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOwogCQlzd2FwX2ZyZWUoc3dhcCk7CiAKLQl9IGVsc2UgaWYgKHNncCA9PSBTR1BfUkVBRCkgewotCQlzaG1lbV9zd3BfdW5tYXAoZW50cnkpOwotCQlwYWdlID0gZmluZF9nZXRfcGFnZShtYXBwaW5nLCBpZHgpOwotCQlpZiAocGFnZSAmJiAhdHJ5bG9ja19wYWdlKHBhZ2UpKSB7Ci0JCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0JCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJZ290byByZXBlYXQ7CisJfSBlbHNlIHsKKwkJaWYgKHNobWVtX2FjY3RfYmxvY2soaW5mby0+ZmxhZ3MpKSB7CisJCQllcnJvciA9IC1FTk9TUEM7CisJCQlnb3RvIGZhaWxlZDsKIAkJfQotCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0KLQl9IGVsc2UgaWYgKHByZWFsbG9jX3BhZ2UpIHsKLQkJc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKLQkJc2JpbmZvID0gU0hNRU1fU0IoaW5vZGUtPmlfc2IpOwogCQlpZiAoc2JpbmZvLT5tYXhfYmxvY2tzKSB7CiAJCQlpZiAocGVyY3B1X2NvdW50ZXJfY29tcGFyZSgmc2JpbmZvLT51c2VkX2Jsb2NrcywKLQkJCQkJCXNiaW5mby0+bWF4X2Jsb2NrcykgPj0gMCB8fAotCQkJICAgIHNobWVtX2FjY3RfYmxvY2soaW5mby0+ZmxhZ3MpKQotCQkJCWdvdG8gbm9zcGFjZTsKKwkJCQkJCXNiaW5mby0+bWF4X2Jsb2NrcykgPj0gMCkgeworCQkJCWVycm9yID0gLUVOT1NQQzsKKwkJCQlnb3RvIHVuYWNjdDsKKwkJCX0KIAkJCXBlcmNwdV9jb3VudGVyX2luYygmc2JpbmZvLT51c2VkX2Jsb2Nrcyk7Ci0JCQlpbm9kZS0+aV9ibG9ja3MgKz0gQkxPQ0tTX1BFUl9QQUdFOwotCQl9IGVsc2UgaWYgKHNobWVtX2FjY3RfYmxvY2soaW5mby0+ZmxhZ3MpKQotCQkJZ290byBub3NwYWNlOwotCi0JCXBhZ2UgPSBwcmVhbGxvY19wYWdlOwotCQlwcmVhbGxvY19wYWdlID0gTlVMTDsKLQotCQllbnRyeSA9IHNobWVtX3N3cF9hbGxvYyhpbmZvLCBpZHgsIHNncCwgZ2ZwKTsKLQkJaWYgKElTX0VSUihlbnRyeSkpCi0JCQllcnJvciA9IFBUUl9FUlIoZW50cnkpOwotCQllbHNlIHsKLQkJCXN3YXAgPSAqZW50cnk7Ci0JCQlzaG1lbV9zd3BfdW5tYXAoZW50cnkpOwotCQl9Ci0JCXJldCA9IGVycm9yIHx8IHN3YXAudmFsOwotCQlpZiAocmV0KQotCQkJbWVtX2Nncm91cF91bmNoYXJnZV9jYWNoZV9wYWdlKHBhZ2UpOwotCQllbHNlCi0JCQlyZXQgPSBhZGRfdG9fcGFnZV9jYWNoZV9scnUocGFnZSwgbWFwcGluZywKLQkJCQkJCWlkeCwgR0ZQX05PV0FJVCk7Ci0JCS8qCi0JCSAqIEF0IGFkZF90b19wYWdlX2NhY2hlX2xydSgpIGZhaWx1cmUsCi0JCSAqIHVuY2hhcmdlIHdpbGwgYmUgZG9uZSBhdXRvbWF0aWNhbGx5LgotCQkgKi8KLQkJaWYgKHJldCkgewotCQkJc2htZW1fdW5hY2N0X2Jsb2NrcyhpbmZvLT5mbGFncywgMSk7Ci0JCQlzaG1lbV9mcmVlX2Jsb2Nrcyhpbm9kZSwgMSk7Ci0JCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0JCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQlpZiAoZXJyb3IpCi0JCQkJZ290byBvdXQ7Ci0JCQlnb3RvIHJlcGVhdDsKIAkJfQogCi0JCWluZm8tPmZsYWdzIHw9IFNITUVNX1BBR0VJTjsKKwkJcGFnZSA9IHNobWVtX2FsbG9jX3BhZ2UoZ2ZwLCBpbmZvLCBpbmRleCk7CisJCWlmICghcGFnZSkgeworCQkJZXJyb3IgPSAtRU5PTUVNOworCQkJZ290byBkZWN1c2VkOworCQl9CisKKwkJU2V0UGFnZVN3YXBCYWNrZWQocGFnZSk7CisJCV9fc2V0X3BhZ2VfbG9ja2VkKHBhZ2UpOworCQllcnJvciA9IG1lbV9jZ3JvdXBfY2FjaGVfY2hhcmdlKHBhZ2UsIGN1cnJlbnQtPm1tLAorCQkJCQkJZ2ZwICYgR0ZQX1JFQ0xBSU1fTUFTSyk7CisJCWlmICghZXJyb3IpCisJCQllcnJvciA9IHNobWVtX2FkZF90b19wYWdlX2NhY2hlKHBhZ2UsIG1hcHBpbmcsIGluZGV4LAorCQkJCQkJZ2ZwLCBOVUxMKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBkZWN1c2VkOworCQlscnVfY2FjaGVfYWRkX2Fub24ocGFnZSk7CisKKwkJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKIAkJaW5mby0+YWxsb2NlZCsrOworCQlpbm9kZS0+aV9ibG9ja3MgKz0gQkxPQ0tTX1BFUl9QQUdFOworCQlzaG1lbV9yZWNhbGNfaW5vZGUoaW5vZGUpOwogCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CisKIAkJY2xlYXJfaGlnaHBhZ2UocGFnZSk7CiAJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwogCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CiAJCWlmIChzZ3AgPT0gU0dQX0RJUlRZKQogCQkJc2V0X3BhZ2VfZGlydHkocGFnZSk7Ci0KLQl9IGVsc2UgewotCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0JCWVycm9yID0gLUVOT01FTTsKLQkJZ290byBvdXQ7CiAJfQogZG9uZToKLQkqcGFnZXAgPSBwYWdlOwotCWVycm9yID0gMDsKLW91dDoKLQlpZiAocHJlYWxsb2NfcGFnZSkgewotCQltZW1fY2dyb3VwX3VuY2hhcmdlX2NhY2hlX3BhZ2UocHJlYWxsb2NfcGFnZSk7Ci0JCXBhZ2VfY2FjaGVfcmVsZWFzZShwcmVhbGxvY19wYWdlKTsKKwkvKiBQZXJoYXBzIHRoZSBmaWxlIGhhcyBiZWVuIHRydW5jYXRlZCBzaW5jZSB3ZSBjaGVja2VkICovCisJaWYgKHNncCAhPSBTR1BfV1JJVEUgJiYKKwkgICAgKChsb2ZmX3QpaW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgPj0gaV9zaXplX3JlYWQoaW5vZGUpKSB7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byB0cnVuYzsKIAl9Ci0JcmV0dXJuIGVycm9yOworCSpwYWdlcCA9IHBhZ2U7CisJcmV0dXJuIDA7CiAKLW5vc3BhY2U6CiAJLyoKLQkgKiBQZXJoYXBzIHRoZSBwYWdlIHdhcyBicm91Z2h0IGluIGZyb20gc3dhcCBiZXR3ZWVuIGZpbmRfbG9ja19wYWdlCi0JICogYW5kIHRha2luZyBpbmZvLT5sb2NrPyAgV2UgYWxsb3cgZm9yIHRoYXQgYXQgYWRkX3RvX3BhZ2VfY2FjaGVfbHJ1LAotCSAqIGJ1dCBtdXN0IGFsc28gYXZvaWQgcmVwb3J0aW5nIGEgc3B1cmlvdXMgRU5PU1BDIHdoaWxlIHdvcmtpbmcgb24gYQotCSAqIGZ1bGwgdG1wZnMuCisJICogRXJyb3IgcmVjb3ZlcnkuCiAJICovCi0JcGFnZSA9IGZpbmRfZ2V0X3BhZ2UobWFwcGluZywgaWR4KTsKK3RydW5jOgorCUNsZWFyUGFnZURpcnR5KHBhZ2UpOworCWRlbGV0ZV9mcm9tX3BhZ2VfY2FjaGUocGFnZSk7CisJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKKwlpbmZvLT5hbGxvY2VkLS07CisJaW5vZGUtPmlfYmxvY2tzIC09IEJMT0NLU19QRVJfUEFHRTsKIAlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CitkZWN1c2VkOgorCWlmIChzYmluZm8tPm1heF9ibG9ja3MpCisJCXBlcmNwdV9jb3VudGVyX2FkZCgmc2JpbmZvLT51c2VkX2Jsb2NrcywgLTEpOwordW5hY2N0OgorCXNobWVtX3VuYWNjdF9ibG9ja3MoaW5mby0+ZmxhZ3MsIDEpOworZmFpbGVkOgorCWlmIChzd2FwLnZhbCAmJiBlcnJvciAhPSAtRUlOVkFMKSB7CisJCXN0cnVjdCBwYWdlICp0ZXN0ID0gZmluZF9nZXRfcGFnZShtYXBwaW5nLCBpbmRleCk7CisJCWlmICh0ZXN0ICYmICFyYWRpeF90cmVlX2V4Y2VwdGlvbmFsX2VudHJ5KHRlc3QpKQorCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHRlc3QpOworCQkvKiBIYXZlIGFub3RoZXIgdHJ5IGlmIHRoZSBlbnRyeSBoYXMgY2hhbmdlZCAqLworCQlpZiAodGVzdCAhPSBzd3BfdG9fcmFkaXhfZW50cnkoc3dhcCkpCisJCQllcnJvciA9IC1FRVhJU1Q7CisJfQogCWlmIChwYWdlKSB7CisJCXVubG9ja19wYWdlKHBhZ2UpOwogCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJfQorCWlmIChlcnJvciA9PSAtRU5PU1BDICYmICFvbmNlKyspIHsKKwkJaW5mbyA9IFNITUVNX0koaW5vZGUpOworCQlzcGluX2xvY2soJmluZm8tPmxvY2spOworCQlzaG1lbV9yZWNhbGNfaW5vZGUoaW5vZGUpOworCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CiAJCWdvdG8gcmVwZWF0OwogCX0KLQllcnJvciA9IC1FTk9TUEM7Ci0JZ290byBvdXQ7CisJaWYgKGVycm9yID09IC1FRVhJU1QpCisJCWdvdG8gcmVwZWF0OworCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIGludCBzaG1lbV9mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpCkBAIC0xNDY3LDkgKzEwMjIsNiBAQAogCWludCBlcnJvcjsKIAlpbnQgcmV0ID0gVk1fRkFVTFRfTE9DS0VEOwogCi0JaWYgKCgobG9mZl90KXZtZi0+cGdvZmYgPDwgUEFHRV9DQUNIRV9TSElGVCkgPj0gaV9zaXplX3JlYWQoaW5vZGUpKQotCQlyZXR1cm4gVk1fRkFVTFRfU0lHQlVTOwotCiAJZXJyb3IgPSBzaG1lbV9nZXRwYWdlKGlub2RlLCB2bWYtPnBnb2ZmLCAmdm1mLT5wYWdlLCBTR1BfQ0FDSEUsICZyZXQpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuICgoZXJyb3IgPT0gLUVOT01FTSkgPyBWTV9GQVVMVF9PT00gOiBWTV9GQVVMVF9TSUdCVVMpOwpAQCAtMTQ4MiwyMCArMTAzNCwyMCBAQAogfQogCiAjaWZkZWYgQ09ORklHX05VTUEKLXN0YXRpYyBpbnQgc2htZW1fc2V0X3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqbmV3KQorc3RhdGljIGludCBzaG1lbV9zZXRfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICptcG9sKQogewotCXN0cnVjdCBpbm9kZSAqaSA9IHZtYS0+dm1fZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQlyZXR1cm4gbXBvbF9zZXRfc2hhcmVkX3BvbGljeSgmU0hNRU1fSShpKS0+cG9saWN5LCB2bWEsIG5ldyk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHZtYS0+dm1fZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlyZXR1cm4gbXBvbF9zZXRfc2hhcmVkX3BvbGljeSgmU0hNRU1fSShpbm9kZSktPnBvbGljeSwgdm1hLCBtcG9sKTsKIH0KIAogc3RhdGljIHN0cnVjdCBtZW1wb2xpY3kgKnNobWVtX2dldF9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkJCSAgdW5zaWduZWQgbG9uZyBhZGRyKQogewotCXN0cnVjdCBpbm9kZSAqaSA9IHZtYS0+dm1fZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQl1bnNpZ25lZCBsb25nIGlkeDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gdm1hLT52bV9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCXBnb2ZmX3QgaW5kZXg7CiAKLQlpZHggPSAoKGFkZHIgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUKSArIHZtYS0+dm1fcGdvZmY7Ci0JcmV0dXJuIG1wb2xfc2hhcmVkX3BvbGljeV9sb29rdXAoJlNITUVNX0koaSktPnBvbGljeSwgaWR4KTsKKwlpbmRleCA9ICgoYWRkciAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQpICsgdm1hLT52bV9wZ29mZjsKKwlyZXR1cm4gbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cCgmU0hNRU1fSShpbm9kZSktPnBvbGljeSwgaW5kZXgpOwogfQogI2VuZGlmCiAKQEAgLTE1OTMsNyArMTE0NSw3IEBACiAKICNpZmRlZiBDT05GSUdfVE1QRlMKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzaG1lbV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc2htZW1fc3ltbGlua19pbmxpbmVfb3BlcmF0aW9uczsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzaG1lbV9zaG9ydF9zeW1saW5rX29wZXJhdGlvbnM7CiAKIHN0YXRpYyBpbnQKIHNobWVtX3dyaXRlX2JlZ2luKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKQEAgLTE2MjYsNyArMTE3OCw4IEBACiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwotCXVuc2lnbmVkIGxvbmcgaW5kZXgsIG9mZnNldDsKKwlwZ29mZl90IGluZGV4OworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCWVudW0gc2dwX3R5cGUgc2dwID0gU0dQX1JFQUQ7CiAKIAkvKgpAQCAtMTY0Miw3ICsxMTk1LDggQEAKIAogCWZvciAoOzspIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwotCQl1bnNpZ25lZCBsb25nIGVuZF9pbmRleCwgbnIsIHJldDsKKwkJcGdvZmZfdCBlbmRfaW5kZXg7CisJCXVuc2lnbmVkIGxvbmcgbnIsIHJldDsKIAkJbG9mZl90IGlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAogCQllbmRfaW5kZXggPSBpX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKQEAgLTE4ODAsOCArMTQzNCw5IEBACiAJYnVmLT5mX25hbWVsZW4gPSBOQU1FX01BWDsKIAlpZiAoc2JpbmZvLT5tYXhfYmxvY2tzKSB7CiAJCWJ1Zi0+Zl9ibG9ja3MgPSBzYmluZm8tPm1heF9ibG9ja3M7Ci0JCWJ1Zi0+Zl9iYXZhaWwgPSBidWYtPmZfYmZyZWUgPQotCQkJCXNiaW5mby0+bWF4X2Jsb2NrcyAtIHBlcmNwdV9jb3VudGVyX3N1bSgmc2JpbmZvLT51c2VkX2Jsb2Nrcyk7CisJCWJ1Zi0+Zl9iYXZhaWwgPQorCQlidWYtPmZfYmZyZWUgID0gc2JpbmZvLT5tYXhfYmxvY2tzIC0KKwkJCQlwZXJjcHVfY291bnRlcl9zdW0oJnNiaW5mby0+dXNlZF9ibG9ja3MpOwogCX0KIAlpZiAoc2JpbmZvLT5tYXhfaW5vZGVzKSB7CiAJCWJ1Zi0+Zl9maWxlcyA9IHNiaW5mby0+bWF4X2lub2RlczsKQEAgLTIwNTUsMTAgKzE2MTAsMTMgQEAKIAogCWluZm8gPSBTSE1FTV9JKGlub2RlKTsKIAlpbm9kZS0+aV9zaXplID0gbGVuLTE7Ci0JaWYgKGxlbiA8PSBTSE1FTV9TWU1MSU5LX0lOTElORV9MRU4pIHsKLQkJLyogZG8gaXQgaW5saW5lICovCi0JCW1lbWNweShpbmZvLT5pbmxpbmVfc3ltbGluaywgc3ltbmFtZSwgbGVuKTsKLQkJaW5vZGUtPmlfb3AgPSAmc2htZW1fc3ltbGlua19pbmxpbmVfb3BlcmF0aW9uczsKKwlpZiAobGVuIDw9IFNIT1JUX1NZTUxJTktfTEVOKSB7CisJCWluZm8tPnN5bWxpbmsgPSBrbWVtZHVwKHN5bW5hbWUsIGxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghaW5mby0+c3ltbGluaykgeworCQkJaXB1dChpbm9kZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlpbm9kZS0+aV9vcCA9ICZzaG1lbV9zaG9ydF9zeW1saW5rX29wZXJhdGlvbnM7CiAJfSBlbHNlIHsKIAkJZXJyb3IgPSBzaG1lbV9nZXRwYWdlKGlub2RlLCAwLCAmcGFnZSwgU0dQX1dSSVRFLCBOVUxMKTsKIAkJaWYgKGVycm9yKSB7CkBAIC0yMDgxLDE3ICsxNjM5LDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkICpzaG1lbV9mb2xsb3dfbGlua19pbmxpbmUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3N0YXRpYyB2b2lkICpzaG1lbV9mb2xsb3dfc2hvcnRfc3ltbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewotCW5kX3NldF9saW5rKG5kLCBTSE1FTV9JKGRlbnRyeS0+ZF9pbm9kZSktPmlubGluZV9zeW1saW5rKTsKKwluZF9zZXRfbGluayhuZCwgU0hNRU1fSShkZW50cnktPmRfaW5vZGUpLT5zeW1saW5rKTsKIAlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgKnNobWVtX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwotCWludCByZXMgPSBzaG1lbV9nZXRwYWdlKGRlbnRyeS0+ZF9pbm9kZSwgMCwgJnBhZ2UsIFNHUF9SRUFELCBOVUxMKTsKLQluZF9zZXRfbGluayhuZCwgcmVzID8gRVJSX1BUUihyZXMpIDoga21hcChwYWdlKSk7CisJaW50IGVycm9yID0gc2htZW1fZ2V0cGFnZShkZW50cnktPmRfaW5vZGUsIDAsICZwYWdlLCBTR1BfUkVBRCwgTlVMTCk7CisJbmRfc2V0X2xpbmsobmQsIGVycm9yID8gRVJSX1BUUihlcnJvcikgOiBrbWFwKHBhZ2UpKTsKIAlpZiAocGFnZSkKIAkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJcmV0dXJuIHBhZ2U7CkBAIC0yMjAyLDcgKzE3NjAsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLQogc3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpzaG1lbV94YXR0cl9oYW5kbGVyc1tdID0gewogI2lmZGVmIENPTkZJR19UTVBGU19QT1NJWF9BQ0wKIAkmZ2VuZXJpY19hY2xfYWNjZXNzX2hhbmRsZXIsCkBAIC0yMzMyLDkgKzE4ODksOSBAQAogfQogI2VuZGlmIC8qIENPTkZJR19UTVBGU19YQVRUUiAqLwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc2htZW1fc3ltbGlua19pbmxpbmVfb3BlcmF0aW9ucyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzaG1lbV9zaG9ydF9zeW1saW5rX29wZXJhdGlvbnMgPSB7CiAJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKLQkuZm9sbG93X2xpbmsJPSBzaG1lbV9mb2xsb3dfbGlua19pbmxpbmUsCisJLmZvbGxvd19saW5rCT0gc2htZW1fZm9sbG93X3Nob3J0X3N5bWxpbmssCiAjaWZkZWYgQ09ORklHX1RNUEZTX1hBVFRSCiAJLnNldHhhdHRyCT0gc2htZW1fc2V0eGF0dHIsCiAJLmdldHhhdHRyCT0gc2htZW1fZ2V0eGF0dHIsCkBAIC0yNTM0LDggKzIwOTEsNyBAQAogCWlmIChjb25maWcubWF4X2lub2RlcyA8IGlub2RlcykKIAkJZ290byBvdXQ7CiAJLyoKLQkgKiBUaG9zZSB0ZXN0cyBhbHNvIGRpc2FsbG93IGxpbWl0ZWQtPnVubGltaXRlZCB3aGlsZSBhbnkgYXJlIGluCi0JICogdXNlLCBzbyBpX2Jsb2NrcyB3aWxsIGFsd2F5cyBiZSB6ZXJvIHdoZW4gbWF4X2Jsb2NrcyBpcyB6ZXJvOworCSAqIFRob3NlIHRlc3RzIGRpc2FsbG93IGxpbWl0ZWQtPnVubGltaXRlZCB3aGlsZSBhbnkgYXJlIGluIHVzZTsKIAkgKiBidXQgd2UgbXVzdCBzZXBhcmF0ZWx5IGRpc2FsbG93IHVubGltaXRlZC0+bGltaXRlZCwgYmVjYXVzZQogCSAqIGluIHRoYXQgY2FzZSB3ZSBoYXZlIG5vIHJlY29yZCBvZiBob3cgbXVjaCBpcyBhbHJlYWR5IGluIHVzZS4KIAkgKi8KQEAgLTI2MjcsNyArMjE4Myw3IEBACiAJCWdvdG8gZmFpbGVkOwogCXNiaW5mby0+ZnJlZV9pbm9kZXMgPSBzYmluZm8tPm1heF9pbm9kZXM7CiAKLQlzYi0+c19tYXhieXRlcyA9IFNITUVNX01BWF9CWVRFUzsKKwlzYi0+c19tYXhieXRlcyA9IE1BWF9MRlNfRklMRVNJWkU7CiAJc2ItPnNfYmxvY2tzaXplID0gUEFHRV9DQUNIRV9TSVpFOwogCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gUEFHRV9DQUNIRV9TSElGVDsKIAlzYi0+c19tYWdpYyA9IFRNUEZTX01BR0lDOwpAQCAtMjY2MiwxNCArMjIxOCwxNCBAQAogCiBzdGF0aWMgc3RydWN0IGlub2RlICpzaG1lbV9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICpwOwotCXAgPSAoc3RydWN0IHNobWVtX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKHNobWVtX2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwKQorCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvOworCWluZm8gPSBrbWVtX2NhY2hlX2FsbG9jKHNobWVtX2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKQogCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gJnAtPnZmc19pbm9kZTsKKwlyZXR1cm4gJmluZm8tPnZmc19pbm9kZTsKIH0KIAotc3RhdGljIHZvaWQgc2htZW1faV9jYWxsYmFjayhzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCitzdGF0aWMgdm9pZCBzaG1lbV9kZXN0cm95X2NhbGxiYWNrKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBpbm9kZSwgaV9yY3UpOwogCUlOSVRfTElTVF9IRUFEKCZpbm9kZS0+aV9kZW50cnkpOwpAQCAtMjY3OCwyOSArMjIzNCwyNiBAQAogCiBzdGF0aWMgdm9pZCBzaG1lbV9kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0JaWYgKChpbm9kZS0+aV9tb2RlICYgU19JRk1UKSA9PSBTX0lGUkVHKSB7Ci0JCS8qIG9ubHkgc3RydWN0IGlub2RlIGlzIHZhbGlkIGlmIGl0J3MgYW4gaW5saW5lIHN5bWxpbmsgKi8KKwlpZiAoKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpID09IFNfSUZSRUcpCiAJCW1wb2xfZnJlZV9zaGFyZWRfcG9saWN5KCZTSE1FTV9JKGlub2RlKS0+cG9saWN5KTsKLQl9Ci0JY2FsbF9yY3UoJmlub2RlLT5pX3JjdSwgc2htZW1faV9jYWxsYmFjayk7CisJY2FsbF9yY3UoJmlub2RlLT5pX3JjdSwgc2htZW1fZGVzdHJveV9jYWxsYmFjayk7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28pCitzdGF0aWMgdm9pZCBzaG1lbV9pbml0X2lub2RlKHZvaWQgKmZvbykKIHsKLQlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqcCA9IChzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqKSBmb287Ci0KLQlpbm9kZV9pbml0X29uY2UoJnAtPnZmc19pbm9kZSk7CisJc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8gPSBmb287CisJaW5vZGVfaW5pdF9vbmNlKCZpbmZvLT52ZnNfaW5vZGUpOwogfQogCi1zdGF0aWMgaW50IGluaXRfaW5vZGVjYWNoZSh2b2lkKQorc3RhdGljIGludCBzaG1lbV9pbml0X2lub2RlY2FjaGUodm9pZCkKIHsKIAlzaG1lbV9pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgic2htZW1faW5vZGVfY2FjaGUiLAogCQkJCXNpemVvZihzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyksCi0JCQkJMCwgU0xBQl9QQU5JQywgaW5pdF9vbmNlKTsKKwkJCQkwLCBTTEFCX1BBTklDLCBzaG1lbV9pbml0X2lub2RlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCitzdGF0aWMgdm9pZCBzaG1lbV9kZXN0cm95X2lub2RlY2FjaGUodm9pZCkKIHsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koc2htZW1faW5vZGVfY2FjaGVwKTsKIH0KQEAgLTI3OTcsMjEgKzIzNTAsMjAgQEAKICNlbmRpZgogfTsKIAotCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqc2htZW1fbW91bnQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCiAJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKIHsKIAlyZXR1cm4gbW91bnRfbm9kZXYoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIHNobWVtX2ZpbGxfc3VwZXIpOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgdG1wZnNfZnNfdHlwZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBzaG1lbV9mc190eXBlID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkubmFtZQkJPSAidG1wZnMiLAogCS5tb3VudAkJPSBzaG1lbV9tb3VudCwKIAkua2lsbF9zYgk9IGtpbGxfbGl0dGVyX3N1cGVyLAogfTsKIAotaW50IF9faW5pdCBpbml0X3RtcGZzKHZvaWQpCitpbnQgX19pbml0IHNobWVtX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyb3I7CiAKQEAgLTI4MTksMTggKzIzNzEsMTggQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0NDsKIAotCWVycm9yID0gaW5pdF9pbm9kZWNhY2hlKCk7CisJZXJyb3IgPSBzaG1lbV9pbml0X2lub2RlY2FjaGUoKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0MzsKIAotCWVycm9yID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmdG1wZnNfZnNfdHlwZSk7CisJZXJyb3IgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZzaG1lbV9mc190eXBlKTsKIAlpZiAoZXJyb3IpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgcmVnaXN0ZXIgdG1wZnNcbiIpOwogCQlnb3RvIG91dDI7CiAJfQogCi0Jc2htX21udCA9IHZmc19rZXJuX21vdW50KCZ0bXBmc19mc190eXBlLCBNU19OT1VTRVIsCi0JCQkJdG1wZnNfZnNfdHlwZS5uYW1lLCBOVUxMKTsKKwlzaG1fbW50ID0gdmZzX2tlcm5fbW91bnQoJnNobWVtX2ZzX3R5cGUsIE1TX05PVVNFUiwKKwkJCQkgc2htZW1fZnNfdHlwZS5uYW1lLCBOVUxMKTsKIAlpZiAoSVNfRVJSKHNobV9tbnQpKSB7CiAJCWVycm9yID0gUFRSX0VSUihzaG1fbW50KTsKIAkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3Qga2Vybl9tb3VudCB0bXBmc1xuIik7CkBAIC0yODM5LDkgKzIzOTEsOSBAQAogCXJldHVybiAwOwogCiBvdXQxOgotCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmdG1wZnNfZnNfdHlwZSk7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZzaG1lbV9mc190eXBlKTsKIG91dDI6Ci0JZGVzdHJveV9pbm9kZWNhY2hlKCk7CisJc2htZW1fZGVzdHJveV9pbm9kZWNhY2hlKCk7CiBvdXQzOgogCWJkaV9kZXN0cm95KCZzaG1lbV9iYWNraW5nX2Rldl9pbmZvKTsKIG91dDQ6CkBAIC0yODQ5LDQ1ICsyNDAxLDYgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLSNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUgotLyoqCi0gKiBtZW1fY2dyb3VwX2dldF9zaG1lbV90YXJnZXQgLSBmaW5kIGEgcGFnZSBvciBlbnRyeSBhc3NpZ25lZCB0byB0aGUgc2htZW0gZmlsZQotICogQGlub2RlOiB0aGUgaW5vZGUgdG8gYmUgc2VhcmNoZWQKLSAqIEBwZ29mZjogdGhlIG9mZnNldCB0byBiZSBzZWFyY2hlZAotICogQHBhZ2VwOiB0aGUgcG9pbnRlciBmb3IgdGhlIGZvdW5kIHBhZ2UgdG8gYmUgc3RvcmVkCi0gKiBAZW50OiB0aGUgcG9pbnRlciBmb3IgdGhlIGZvdW5kIHN3YXAgZW50cnkgdG8gYmUgc3RvcmVkCi0gKgotICogSWYgYSBwYWdlIGlzIGZvdW5kLCByZWZjb3VudCBvZiBpdCBpcyBpbmNyZW1lbnRlZC4gQ2FsbGVycyBzaG91bGQgaGFuZGxlCi0gKiB0aGVzZSByZWZjb3VudC4KLSAqLwotdm9pZCBtZW1fY2dyb3VwX2dldF9zaG1lbV90YXJnZXQoc3RydWN0IGlub2RlICppbm9kZSwgcGdvZmZfdCBwZ29mZiwKLQkJCQkJc3RydWN0IHBhZ2UgKipwYWdlcCwgc3dwX2VudHJ5X3QgKmVudCkKLXsKLQlzd3BfZW50cnlfdCBlbnRyeSA9IHsgLnZhbCA9IDAgfSwgKnB0cjsKLQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7Ci0Jc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8gPSBTSE1FTV9JKGlub2RlKTsKLQotCWlmICgocGdvZmYgPDwgUEFHRV9DQUNIRV9TSElGVCkgPj0gaV9zaXplX3JlYWQoaW5vZGUpKQotCQlnb3RvIG91dDsKLQotCXNwaW5fbG9jaygmaW5mby0+bG9jayk7Ci0JcHRyID0gc2htZW1fc3dwX2VudHJ5KGluZm8sIHBnb2ZmLCBOVUxMKTsKLSNpZmRlZiBDT05GSUdfU1dBUAotCWlmIChwdHIgJiYgcHRyLT52YWwpIHsKLQkJZW50cnkudmFsID0gcHRyLT52YWw7Ci0JCXBhZ2UgPSBmaW5kX2dldF9wYWdlKCZzd2FwcGVyX3NwYWNlLCBlbnRyeS52YWwpOwotCX0gZWxzZQotI2VuZGlmCi0JCXBhZ2UgPSBmaW5kX2dldF9wYWdlKGlub2RlLT5pX21hcHBpbmcsIHBnb2ZmKTsKLQlpZiAocHRyKQotCQlzaG1lbV9zd3BfdW5tYXAocHRyKTsKLQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci1vdXQ6Ci0JKnBhZ2VwID0gcGFnZTsKLQkqZW50ID0gZW50cnk7Ci19Ci0jZW5kaWYKLQogI2Vsc2UgLyogIUNPTkZJR19TSE1FTSAqLwogCiAvKgpAQCAtMjkwMSwyMyArMjQxNCwyMyBAQAogCiAjaW5jbHVkZSA8bGludXgvcmFtZnMuaD4KIAotc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHRtcGZzX2ZzX3R5cGUgPSB7CitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgc2htZW1fZnNfdHlwZSA9IHsKIAkubmFtZQkJPSAidG1wZnMiLAogCS5tb3VudAkJPSByYW1mc19tb3VudCwKIAkua2lsbF9zYgk9IGtpbGxfbGl0dGVyX3N1cGVyLAogfTsKIAotaW50IF9faW5pdCBpbml0X3RtcGZzKHZvaWQpCitpbnQgX19pbml0IHNobWVtX2luaXQodm9pZCkKIHsKLQlCVUdfT04ocmVnaXN0ZXJfZmlsZXN5c3RlbSgmdG1wZnNfZnNfdHlwZSkgIT0gMCk7CisJQlVHX09OKHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnNobWVtX2ZzX3R5cGUpICE9IDApOwogCi0Jc2htX21udCA9IGtlcm5fbW91bnQoJnRtcGZzX2ZzX3R5cGUpOworCXNobV9tbnQgPSBrZXJuX21vdW50KCZzaG1lbV9mc190eXBlKTsKIAlCVUdfT04oSVNfRVJSKHNobV9tbnQpKTsKIAogCXJldHVybiAwOwogfQogCi1pbnQgc2htZW1fdW51c2Uoc3dwX2VudHJ5X3QgZW50cnksIHN0cnVjdCBwYWdlICpwYWdlKQoraW50IHNobWVtX3VudXNlKHN3cF9lbnRyeV90IHN3YXAsIHN0cnVjdCBwYWdlICpwYWdlKQogewogCXJldHVybiAwOwogfQpAQCAtMjkyNyw0MyArMjQ0MCwxNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHNobWVtX3RydW5jYXRlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCkKK3ZvaWQgc2htZW1fdHJ1bmNhdGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgbG9mZl90IGxlbmQpCiB7Ci0JdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIGVuZCk7CisJdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgbHN0YXJ0LCBsZW5kKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNobWVtX3RydW5jYXRlX3JhbmdlKTsKIAotI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSCi0vKioKLSAqIG1lbV9jZ3JvdXBfZ2V0X3NobWVtX3RhcmdldCAtIGZpbmQgYSBwYWdlIG9yIGVudHJ5IGFzc2lnbmVkIHRvIHRoZSBzaG1lbSBmaWxlCi0gKiBAaW5vZGU6IHRoZSBpbm9kZSB0byBiZSBzZWFyY2hlZAotICogQHBnb2ZmOiB0aGUgb2Zmc2V0IHRvIGJlIHNlYXJjaGVkCi0gKiBAcGFnZXA6IHRoZSBwb2ludGVyIGZvciB0aGUgZm91bmQgcGFnZSB0byBiZSBzdG9yZWQKLSAqIEBlbnQ6IHRoZSBwb2ludGVyIGZvciB0aGUgZm91bmQgc3dhcCBlbnRyeSB0byBiZSBzdG9yZWQKLSAqCi0gKiBJZiBhIHBhZ2UgaXMgZm91bmQsIHJlZmNvdW50IG9mIGl0IGlzIGluY3JlbWVudGVkLiBDYWxsZXJzIHNob3VsZCBoYW5kbGUKLSAqIHRoZXNlIHJlZmNvdW50LgotICovCi12b2lkIG1lbV9jZ3JvdXBfZ2V0X3NobWVtX3RhcmdldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBwZ29mZl90IHBnb2ZmLAotCQkJCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VwLCBzd3BfZW50cnlfdCAqZW50KQotewotCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKLQotCWlmICgocGdvZmYgPDwgUEFHRV9DQUNIRV9TSElGVCkgPj0gaV9zaXplX3JlYWQoaW5vZGUpKQotCQlnb3RvIG91dDsKLQlwYWdlID0gZmluZF9nZXRfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBwZ29mZik7Ci1vdXQ6Ci0JKnBhZ2VwID0gcGFnZTsKLQkqZW50ID0gKHN3cF9lbnRyeV90KXsgLnZhbCA9IDAgfTsKLX0KLSNlbmRpZgotCiAjZGVmaW5lIHNobWVtX3ZtX29wcwkJCQlnZW5lcmljX2ZpbGVfdm1fb3BzCiAjZGVmaW5lIHNobWVtX2ZpbGVfb3BlcmF0aW9ucwkJCXJhbWZzX2ZpbGVfb3BlcmF0aW9ucwogI2RlZmluZSBzaG1lbV9nZXRfaW5vZGUoc2IsIGRpciwgbW9kZSwgZGV2LCBmbGFncykJcmFtZnNfZ2V0X2lub2RlKHNiLCBkaXIsIG1vZGUsIGRldikKICNkZWZpbmUgc2htZW1fYWNjdF9zaXplKGZsYWdzLCBzaXplKQkJMAogI2RlZmluZSBzaG1lbV91bmFjY3Rfc2l6ZShmbGFncywgc2l6ZSkJCWRvIHt9IHdoaWxlICgwKQotI2RlZmluZSBTSE1FTV9NQVhfQllURVMJCQkJTUFYX0xGU19GSUxFU0laRQogCiAjZW5kaWYgLyogQ09ORklHX1NITUVNICovCiAKQEAgLTI5ODcsNyArMjQ3NCw3IEBACiAJaWYgKElTX0VSUihzaG1fbW50KSkKIAkJcmV0dXJuICh2b2lkICopc2htX21udDsKIAotCWlmIChzaXplIDwgMCB8fCBzaXplID4gU0hNRU1fTUFYX0JZVEVTKQorCWlmIChzaXplIDwgMCB8fCBzaXplID4gTUFYX0xGU19GSUxFU0laRSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKIAlpZiAoc2htZW1fYWNjdF9zaXplKGZsYWdzLCBzaXplKSkKZGlmZiAtLWdpdCBhL21tL3NsYWIuYyBiL21tL3NsYWIuYwppbmRleCAxZTUyM2VkLi42ZDkwYTA5IDEwMDY0NAotLS0gYS9tbS9zbGFiLmMKKysrIGIvbW0vc2xhYi5jCkBAIC02MjIsNiArNjIyLDUxIEBACiBzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IG9uX3NsYWJfbDNfa2V5Owogc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBvbl9zbGFiX2FsY19rZXk7CiAKK3N0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgZGVidWdvYmpfbDNfa2V5Oworc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBkZWJ1Z29ial9hbGNfa2V5OworCitzdGF0aWMgdm9pZCBzbGFiX3NldF9sb2NrX2NsYXNzZXMoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKKwkJc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICpsM19rZXksIHN0cnVjdCBsb2NrX2NsYXNzX2tleSAqYWxjX2tleSwKKwkJaW50IHEpCit7CisJc3RydWN0IGFycmF5X2NhY2hlICoqYWxjOworCXN0cnVjdCBrbWVtX2xpc3QzICpsMzsKKwlpbnQgcjsKKworCWwzID0gY2FjaGVwLT5ub2RlbGlzdHNbcV07CisJaWYgKCFsMykKKwkJcmV0dXJuOworCisJbG9ja2RlcF9zZXRfY2xhc3MoJmwzLT5saXN0X2xvY2ssIGwzX2tleSk7CisJYWxjID0gbDMtPmFsaWVuOworCS8qCisJICogRklYTUU6IFRoaXMgY2hlY2sgZm9yIEJBRF9BTElFTl9NQUdJQworCSAqIHNob3VsZCBnbyBhd2F5IHdoZW4gY29tbW9uIHNsYWIgY29kZSBpcyB0YXVnaHQgdG8KKwkgKiB3b3JrIGV2ZW4gd2l0aG91dCBhbGllbiBjYWNoZXMuCisJICogQ3VycmVudGx5LCBub24gTlVNQSBjb2RlIHJldHVybnMgQkFEX0FMSUVOX01BR0lDCisJICogZm9yIGFsbG9jX2FsaWVuX2NhY2hlLAorCSAqLworCWlmICghYWxjIHx8ICh1bnNpZ25lZCBsb25nKWFsYyA9PSBCQURfQUxJRU5fTUFHSUMpCisJCXJldHVybjsKKwlmb3JfZWFjaF9ub2RlKHIpIHsKKwkJaWYgKGFsY1tyXSkKKwkJCWxvY2tkZXBfc2V0X2NsYXNzKCZhbGNbcl0tPmxvY2ssIGFsY19rZXkpOworCX0KK30KKworc3RhdGljIHZvaWQgc2xhYl9zZXRfZGVidWdvYmpfbG9ja19jbGFzc2VzX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgaW50IG5vZGUpCit7CisJc2xhYl9zZXRfbG9ja19jbGFzc2VzKGNhY2hlcCwgJmRlYnVnb2JqX2wzX2tleSwgJmRlYnVnb2JqX2FsY19rZXksIG5vZGUpOworfQorCitzdGF0aWMgdm9pZCBzbGFiX3NldF9kZWJ1Z29ial9sb2NrX2NsYXNzZXMoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCkKK3sKKwlpbnQgbm9kZTsKKworCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpCisJCXNsYWJfc2V0X2RlYnVnb2JqX2xvY2tfY2xhc3Nlc19ub2RlKGNhY2hlcCwgbm9kZSk7Cit9CisKIHN0YXRpYyB2b2lkIGluaXRfbm9kZV9sb2NrX2tleXMoaW50IHEpCiB7CiAJc3RydWN0IGNhY2hlX3NpemVzICpzID0gbWFsbG9jX3NpemVzOwpAQCAtNjMwLDI5ICs2NzUsMTQgQEAKIAkJcmV0dXJuOwogCiAJZm9yIChzID0gbWFsbG9jX3NpemVzOyBzLT5jc19zaXplICE9IFVMT05HX01BWDsgcysrKSB7Ci0JCXN0cnVjdCBhcnJheV9jYWNoZSAqKmFsYzsKIAkJc3RydWN0IGttZW1fbGlzdDMgKmwzOwotCQlpbnQgcjsKIAogCQlsMyA9IHMtPmNzX2NhY2hlcC0+bm9kZWxpc3RzW3FdOwogCQlpZiAoIWwzIHx8IE9GRl9TTEFCKHMtPmNzX2NhY2hlcCkpCiAJCQljb250aW51ZTsKLQkJbG9ja2RlcF9zZXRfY2xhc3MoJmwzLT5saXN0X2xvY2ssICZvbl9zbGFiX2wzX2tleSk7Ci0JCWFsYyA9IGwzLT5hbGllbjsKLQkJLyoKLQkJICogRklYTUU6IFRoaXMgY2hlY2sgZm9yIEJBRF9BTElFTl9NQUdJQwotCQkgKiBzaG91bGQgZ28gYXdheSB3aGVuIGNvbW1vbiBzbGFiIGNvZGUgaXMgdGF1Z2h0IHRvCi0JCSAqIHdvcmsgZXZlbiB3aXRob3V0IGFsaWVuIGNhY2hlcy4KLQkJICogQ3VycmVudGx5LCBub24gTlVNQSBjb2RlIHJldHVybnMgQkFEX0FMSUVOX01BR0lDCi0JCSAqIGZvciBhbGxvY19hbGllbl9jYWNoZSwKLQkJICovCi0JCWlmICghYWxjIHx8ICh1bnNpZ25lZCBsb25nKWFsYyA9PSBCQURfQUxJRU5fTUFHSUMpCi0JCQljb250aW51ZTsKLQkJZm9yX2VhY2hfbm9kZShyKSB7Ci0JCQlpZiAoYWxjW3JdKQotCQkJCWxvY2tkZXBfc2V0X2NsYXNzKCZhbGNbcl0tPmxvY2ssCi0JCQkJCSZvbl9zbGFiX2FsY19rZXkpOwotCQl9CisKKwkJc2xhYl9zZXRfbG9ja19jbGFzc2VzKHMtPmNzX2NhY2hlcCwgJm9uX3NsYWJfbDNfa2V5LAorCQkJCSZvbl9zbGFiX2FsY19rZXksIHEpOwogCX0KIH0KIApAQCAtNjcxLDYgKzcwMSwxNCBAQAogc3RhdGljIGlubGluZSB2b2lkIGluaXRfbG9ja19rZXlzKHZvaWQpCiB7CiB9CisKK3N0YXRpYyB2b2lkIHNsYWJfc2V0X2RlYnVnb2JqX2xvY2tfY2xhc3Nlc19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIGludCBub2RlKQoreworfQorCitzdGF0aWMgdm9pZCBzbGFiX3NldF9kZWJ1Z29ial9sb2NrX2NsYXNzZXMoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCkKK3sKK30KICNlbmRpZgogCiAvKgpAQCAtMTI2NCw2ICsxMzAyLDggQEAKIAkJc3Bpbl91bmxvY2tfaXJxKCZsMy0+bGlzdF9sb2NrKTsKIAkJa2ZyZWUoc2hhcmVkKTsKIAkJZnJlZV9hbGllbl9jYWNoZShhbGllbik7CisJCWlmIChjYWNoZXAtPmZsYWdzICYgU0xBQl9ERUJVR19PQkpFQ1RTKQorCQkJc2xhYl9zZXRfZGVidWdvYmpfbG9ja19jbGFzc2VzX25vZGUoY2FjaGVwLCBub2RlKTsKIAl9CiAJaW5pdF9ub2RlX2xvY2tfa2V5cyhub2RlKTsKIApAQCAtMTYyNiw2ICsxNjY2LDkgQEAKIHsKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwOwogCisJLyogQW5ub3RhdGUgc2xhYiBmb3IgbG9ja2RlcCAtLSBhbm5vdGF0ZSB0aGUgbWFsbG9jIGNhY2hlcyAqLworCWluaXRfbG9ja19rZXlzKCk7CisKIAkvKiA2KSByZXNpemUgdGhlIGhlYWQgYXJyYXlzIHRvIHRoZWlyIGZpbmFsIHNpemVzICovCiAJbXV0ZXhfbG9jaygmY2FjaGVfY2hhaW5fbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FjaGVwLCAmY2FjaGVfY2hhaW4sIG5leHQpCkBAIC0xNjM2LDkgKzE2NzksNiBAQAogCS8qIERvbmUhICovCiAJZ19jcHVjYWNoZV91cCA9IEZVTEw7CiAKLQkvKiBBbm5vdGF0ZSBzbGFiIGZvciBsb2NrZGVwIC0tIGFubm90YXRlIHRoZSBtYWxsb2MgY2FjaGVzICovCi0JaW5pdF9sb2NrX2tleXMoKTsKLQogCS8qCiAJICogUmVnaXN0ZXIgYSBjcHUgc3RhcnR1cCBub3RpZmllciBjYWxsYmFjayB0aGF0IGluaXRpYWxpemVzCiAJICogY3B1X2NhY2hlX2dldCBmb3IgYWxsIG5ldyBjcHVzCkBAIC0yNDI2LDYgKzI0NjYsMTYgQEAKIAkJZ290byBvb3BzOwogCX0KIAorCWlmIChmbGFncyAmIFNMQUJfREVCVUdfT0JKRUNUUykgeworCQkvKgorCQkgKiBXb3VsZCBkZWFkbG9jayB0aHJvdWdoIHNsYWJfZGVzdHJveSgpLT5jYWxsX3JjdSgpLT4KKwkJICogZGVidWdfb2JqZWN0X2FjdGl2YXRlKCktPmttZW1fY2FjaGVfYWxsb2MoKS4KKwkJICovCisJCVdBUk5fT05fT05DRShmbGFncyAmIFNMQUJfREVTVFJPWV9CWV9SQ1UpOworCisJCXNsYWJfc2V0X2RlYnVnb2JqX2xvY2tfY2xhc3NlcyhjYWNoZXApOworCX0KKwogCS8qIGNhY2hlIHNldHVwIGNvbXBsZXRlZCwgbGluayBpdCBpbnRvIHRoZSBsaXN0ICovCiAJbGlzdF9hZGQoJmNhY2hlcC0+bmV4dCwgJmNhY2hlX2NoYWluKTsKIG9vcHM6CkBAIC0zNDAzLDcgKzM0NTMsNyBAQAogCWNhY2hlX2FsbG9jX2RlYnVnY2hlY2tfYmVmb3JlKGNhY2hlcCwgZmxhZ3MpOwogCWxvY2FsX2lycV9zYXZlKHNhdmVfZmxhZ3MpOwogCi0JaWYgKG5vZGVpZCA9PSAtMSkKKwlpZiAobm9kZWlkID09IE5VTUFfTk9fTk9ERSkKIAkJbm9kZWlkID0gc2xhYl9ub2RlOwogCiAJaWYgKHVubGlrZWx5KCFjYWNoZXAtPm5vZGVsaXN0c1tub2RlaWRdKSkgewpAQCAtMzkzNCw3ICszOTg0LDcgQEAKIAogc3RydWN0IGNjdXBkYXRlX3N0cnVjdCB7CiAJc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcDsKLQlzdHJ1Y3QgYXJyYXlfY2FjaGUgKm5ld1tOUl9DUFVTXTsKKwlzdHJ1Y3QgYXJyYXlfY2FjaGUgKm5ld1swXTsKIH07CiAKIHN0YXRpYyB2b2lkIGRvX2NjdXBkYXRlX2xvY2FsKHZvaWQgKmluZm8pCkBAIC0zOTU2LDcgKzQwMDYsOCBAQAogCXN0cnVjdCBjY3VwZGF0ZV9zdHJ1Y3QgKm5ldzsKIAlpbnQgaTsKIAotCW5ldyA9IGt6YWxsb2Moc2l6ZW9mKCpuZXcpLCBnZnApOworCW5ldyA9IGt6YWxsb2Moc2l6ZW9mKCpuZXcpICsgbnJfY3B1X2lkcyAqIHNpemVvZihzdHJ1Y3QgYXJyYXlfY2FjaGUgKiksCisJCSAgICAgIGdmcCk7CiAJaWYgKCFuZXcpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9tbS9zbHViLmMgYi9tbS9zbHViLmMKaW5kZXggZjhmNWU4ZS4uZWI1YThmOSAxMDA2NDQKLS0tIGEvbW0vc2x1Yi5jCisrKyBiL21tL3NsdWIuYwpAQCAtMiwxMCArMiwxMSBAQAogICogU0xVQjogQSBzbGFiIGFsbG9jYXRvciB0aGF0IGxpbWl0cyBjYWNoZSBsaW5lIHVzZSBpbnN0ZWFkIG9mIHF1ZXVpbmcKICAqIG9iamVjdHMgaW4gcGVyIGNwdSBhbmQgcGVyIG5vZGUgbGlzdHMuCiAgKgotICogVGhlIGFsbG9jYXRvciBzeW5jaHJvbml6ZXMgdXNpbmcgcGVyIHNsYWIgbG9ja3MgYW5kIG9ubHkKLSAqIHVzZXMgYSBjZW50cmFsaXplZCBsb2NrIHRvIG1hbmFnZSBhIHBvb2wgb2YgcGFydGlhbCBzbGFicy4KKyAqIFRoZSBhbGxvY2F0b3Igc3luY2hyb25pemVzIHVzaW5nIHBlciBzbGFiIGxvY2tzIG9yIGF0b21pYyBvcGVyYXRpb3MKKyAqIGFuZCBvbmx5IHVzZXMgYSBjZW50cmFsaXplZCBsb2NrIHRvIG1hbmFnZSBhIHBvb2wgb2YgcGFydGlhbCBzbGFicy4KICAqCiAgKiAoQykgMjAwNyBTR0ksIENocmlzdG9waCBMYW1ldGVyCisgKiAoQykgMjAxMSBMaW51eCBGb3VuZGF0aW9uLCBDaHJpc3RvcGggTGFtZXRlcgogICovCiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgpAQCAtMzMsMTUgKzM0LDI3IEBACiAKIC8qCiAgKiBMb2NrIG9yZGVyOgotICogICAxLiBzbGFiX2xvY2socGFnZSkKLSAqICAgMi4gc2xhYi0+bGlzdF9sb2NrCisgKiAgIDEuIHNsdWJfbG9jayAoR2xvYmFsIFNlbWFwaG9yZSkKKyAqICAgMi4gbm9kZS0+bGlzdF9sb2NrCisgKiAgIDMuIHNsYWJfbG9jayhwYWdlKSAoT25seSBvbiBzb21lIGFyY2hlcyBhbmQgZm9yIGRlYnVnZ2luZykKICAqCi0gKiAgIFRoZSBzbGFiX2xvY2sgcHJvdGVjdHMgb3BlcmF0aW9ucyBvbiB0aGUgb2JqZWN0IG9mIGEgcGFydGljdWxhcgotICogICBzbGFiIGFuZCBpdHMgbWV0YWRhdGEgaW4gdGhlIHBhZ2Ugc3RydWN0LiBJZiB0aGUgc2xhYiBsb2NrCi0gKiAgIGhhcyBiZWVuIHRha2VuIHRoZW4gbm8gYWxsb2NhdGlvbnMgbm9yIGZyZWVzIGNhbiBiZSBwZXJmb3JtZWQKLSAqICAgb24gdGhlIG9iamVjdHMgaW4gdGhlIHNsYWIgbm9yIGNhbiB0aGUgc2xhYiBiZSBhZGRlZCBvciByZW1vdmVkCi0gKiAgIGZyb20gdGhlIHBhcnRpYWwgb3IgZnVsbCBsaXN0cyBzaW5jZSB0aGlzIHdvdWxkIG1lYW4gbW9kaWZ5aW5nCi0gKiAgIHRoZSBwYWdlX3N0cnVjdCBvZiB0aGUgc2xhYi4KKyAqICAgc2x1Yl9sb2NrCisgKgorICogICBUaGUgcm9sZSBvZiB0aGUgc2x1Yl9sb2NrIGlzIHRvIHByb3RlY3QgdGhlIGxpc3Qgb2YgYWxsIHRoZSBzbGFicworICogICBhbmQgdG8gc3luY2hyb25pemUgbWFqb3IgbWV0YWRhdGEgY2hhbmdlcyB0byBzbGFiIGNhY2hlIHN0cnVjdHVyZXMuCisgKgorICogICBUaGUgc2xhYl9sb2NrIGlzIG9ubHkgdXNlZCBmb3IgZGVidWdnaW5nIGFuZCBvbiBhcmNoZXMgdGhhdCBkbyBub3QKKyAqICAgaGF2ZSB0aGUgYWJpbGl0eSB0byBkbyBhIGNtcHhjaGdfZG91YmxlLiBJdCBvbmx5IHByb3RlY3RzIHRoZSBzZWNvbmQKKyAqICAgZG91YmxlIHdvcmQgaW4gdGhlIHBhZ2Ugc3RydWN0LiBNZWFuaW5nCisgKglBLiBwYWdlLT5mcmVlbGlzdAktPiBMaXN0IG9mIG9iamVjdCBmcmVlIGluIGEgcGFnZQorICoJQi4gcGFnZS0+Y291bnRlcnMJLT4gQ291bnRlcnMgb2Ygb2JqZWN0cworICoJQy4gcGFnZS0+ZnJvemVuCQktPiBmcm96ZW4gc3RhdGUKKyAqCisgKiAgIElmIGEgc2xhYiBpcyBmcm96ZW4gdGhlbiBpdCBpcyBleGVtcHQgZnJvbSBsaXN0IG1hbmFnZW1lbnQuIEl0IGlzIG5vdAorICogICBvbiBhbnkgbGlzdC4gVGhlIHByb2Nlc3NvciB0aGF0IGZyb3plIHRoZSBzbGFiIGlzIHRoZSBvbmUgd2hvIGNhbgorICogICBwZXJmb3JtIGxpc3Qgb3BlcmF0aW9ucyBvbiB0aGUgcGFnZS4gT3RoZXIgcHJvY2Vzc29ycyBtYXkgcHV0IG9iamVjdHMKKyAqICAgb250byB0aGUgZnJlZWxpc3QgYnV0IHRoZSBwcm9jZXNzb3IgdGhhdCBmcm96ZSB0aGUgc2xhYiBpcyB0aGUgb25seQorICogICBvbmUgdGhhdCBjYW4gcmV0cmlldmUgdGhlIG9iamVjdHMgZnJvbSB0aGUgcGFnZSdzIGZyZWVsaXN0LgogICoKICAqICAgVGhlIGxpc3RfbG9jayBwcm90ZWN0cyB0aGUgcGFydGlhbCBhbmQgZnVsbCBsaXN0IG9uIGVhY2ggbm9kZSBhbmQKICAqICAgdGhlIHBhcnRpYWwgc2xhYiBjb3VudGVyLiBJZiB0YWtlbiB0aGVuIG5vIG5ldyBzbGFicyBtYXkgYmUgYWRkZWQgb3IKQEAgLTU0LDIwICs2Nyw2IEBACiAgKiAgIHNsYWJzLCBvcGVyYXRpb25zIGNhbiBjb250aW51ZSB3aXRob3V0IGFueSBjZW50cmFsaXplZCBsb2NrLiBGLmUuCiAgKiAgIGFsbG9jYXRpbmcgYSBsb25nIHNlcmllcyBvZiBvYmplY3RzIHRoYXQgZmlsbCB1cCBzbGFicyBkb2VzIG5vdCByZXF1aXJlCiAgKiAgIHRoZSBsaXN0IGxvY2suCi0gKgotICogICBUaGUgbG9jayBvcmRlciBpcyBzb21ldGltZXMgaW52ZXJ0ZWQgd2hlbiB3ZSBhcmUgdHJ5aW5nIHRvIGdldCBhIHNsYWIKLSAqICAgb2ZmIGEgbGlzdC4gV2UgdGFrZSB0aGUgbGlzdF9sb2NrIGFuZCB0aGVuIGxvb2sgZm9yIGEgcGFnZSBvbiB0aGUgbGlzdAotICogICB0byB1c2UuIFdoaWxlIHdlIGRvIHRoYXQgb2JqZWN0cyBpbiB0aGUgc2xhYnMgbWF5IGJlIGZyZWVkLiBXZSBjYW4KLSAqICAgb25seSBvcGVyYXRlIG9uIHRoZSBzbGFiIGlmIHdlIGhhdmUgYWxzbyB0YWtlbiB0aGUgc2xhYl9sb2NrLiBTbyB3ZSB1c2UKLSAqICAgYSBzbGFiX3RyeWxvY2soKSBvbiB0aGUgc2xhYi4gSWYgdHJ5bG9jayB3YXMgc3VjY2Vzc2Z1bCB0aGVuIG5vIGZyZWVzCi0gKiAgIGNhbiBvY2N1ciBhbnltb3JlIGFuZCB3ZSBjYW4gdXNlIHRoZSBzbGFiIGZvciBhbGxvY2F0aW9ucyBldGMuIElmIHRoZQotICogICBzbGFiX3RyeWxvY2soKSBkb2VzIG5vdCBzdWNjZWVkIHRoZW4gZnJlZXMgYXJlIGluIHByb2dyZXNzIGluIHRoZSBzbGFiIGFuZAotICogICB3ZSBtdXN0IHN0YXkgYXdheSBmcm9tIGl0IGZvciBhIHdoaWxlIHNpbmNlIHdlIG1heSBjYXVzZSBhIGJvdW5jaW5nCi0gKiAgIGNhY2hlbGluZSBpZiB3ZSB0cnkgdG8gYWNxdWlyZSB0aGUgbG9jay4gU28gZ28gb250byB0aGUgbmV4dCBzbGFiLgotICogICBJZiBhbGwgcGFnZXMgYXJlIGJ1c3kgdGhlbiB3ZSBtYXkgYWxsb2NhdGUgYSBuZXcgc2xhYiBpbnN0ZWFkIG9mIHJldXNpbmcKLSAqICAgYSBwYXJ0aWFsIHNsYWIuIEEgbmV3IHNsYWIgaGFzIG5vIG9uZSBvcGVyYXRpbmcgb24gaXQgYW5kIHRodXMgdGhlcmUgaXMKLSAqICAgbm8gZGFuZ2VyIG9mIGNhY2hlbGluZSBjb250ZW50aW9uLgotICoKICAqICAgSW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgZHVyaW5nIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiBpbiBvcmRlciB0bwogICogICBtYWtlIHRoZSBzbGFiIGFsbG9jYXRvciBzYWZlIHRvIHVzZSBpbiB0aGUgY29udGV4dCBvZiBhbiBpcnEuIEluIGFkZGl0aW9uCiAgKiAgIGludGVycnVwdHMgYXJlIGRpc2FibGVkIHRvIGVuc3VyZSB0aGF0IHRoZSBwcm9jZXNzb3IgZG9lcyBub3QgY2hhbmdlCkBAIC0xMzIsNiArMTMxLDkgQEAKIC8qIEVuYWJsZSB0byB0ZXN0IHJlY292ZXJ5IGZyb20gc2xhYiBjb3JydXB0aW9uIG9uIGJvb3QgKi8KICN1bmRlZiBTTFVCX1JFU0lMSUVOQ1lfVEVTVAogCisvKiBFbmFibGUgdG8gbG9nIGNtcHhjaGcgZmFpbHVyZXMgKi8KKyN1bmRlZiBTTFVCX0RFQlVHX0NNUFhDSEcKKwogLyoKICAqIE1pbmludW0gbnVtYmVyIG9mIHBhcnRpYWwgc2xhYnMuIFRoZXNlIHdpbGwgYmUgbGVmdCBvbiB0aGUgcGFydGlhbAogICogbGlzdHMgZXZlbiBpZiB0aGV5IGFyZSBlbXB0eS4ga21lbV9jYWNoZV9zaHJpbmsgbWF5IHJlY2xhaW0gdGhlbS4KQEAgLTE2NywxMCArMTY5LDExIEBACiAKICNkZWZpbmUgT09fU0hJRlQJMTYKICNkZWZpbmUgT09fTUFTSwkJKCgxIDw8IE9PX1NISUZUKSAtIDEpCi0jZGVmaW5lIE1BWF9PQkpTX1BFUl9QQUdFCTY1NTM1IC8qIHNpbmNlIHBhZ2Uub2JqZWN0cyBpcyB1MTYgKi8KKyNkZWZpbmUgTUFYX09CSlNfUEVSX1BBR0UJMzI3NjcgLyogc2luY2UgcGFnZS5vYmplY3RzIGlzIHUxNSAqLwogCiAvKiBJbnRlcm5hbCBTTFVCIGZsYWdzICovCiAjZGVmaW5lIF9fT0JKRUNUX1BPSVNPTgkJMHg4MDAwMDAwMFVMIC8qIFBvaXNvbiBvYmplY3QgKi8KKyNkZWZpbmUgX19DTVBYQ0hHX0RPVUJMRQkweDQwMDAwMDAwVUwgLyogVXNlIGNtcHhjaGdfZG91YmxlICovCiAKIHN0YXRpYyBpbnQga21lbV9zaXplID0gc2l6ZW9mKHN0cnVjdCBrbWVtX2NhY2hlKTsKIApAQCAtMzQzLDExICszNDYsOTkgQEAKIAlyZXR1cm4geC54ICYgT09fTUFTSzsKIH0KIAorLyoKKyAqIFBlciBzbGFiIGxvY2tpbmcgdXNpbmcgdGhlIHBhZ2Vsb2NrCisgKi8KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBzbGFiX2xvY2soc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJYml0X3NwaW5fbG9jayhQR19sb2NrZWQsICZwYWdlLT5mbGFncyk7Cit9CisKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBzbGFiX3VubG9jayhzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlfX2JpdF9zcGluX3VubG9jayhQR19sb2NrZWQsICZwYWdlLT5mbGFncyk7Cit9CisKKy8qIEludGVycnVwdHMgbXVzdCBiZSBkaXNhYmxlZCAoZm9yIHRoZSBmYWxsYmFjayBjb2RlIHRvIHdvcmsgcmlnaHQpICovCitzdGF0aWMgaW5saW5lIGJvb2wgX19jbXB4Y2hnX2RvdWJsZV9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJdm9pZCAqZnJlZWxpc3Rfb2xkLCB1bnNpZ25lZCBsb25nIGNvdW50ZXJzX29sZCwKKwkJdm9pZCAqZnJlZWxpc3RfbmV3LCB1bnNpZ25lZCBsb25nIGNvdW50ZXJzX25ldywKKwkJY29uc3QgY2hhciAqbikKK3sKKwlWTV9CVUdfT04oIWlycXNfZGlzYWJsZWQoKSk7CisjaWZkZWYgQ09ORklHX0NNUFhDSEdfRE9VQkxFCisJaWYgKHMtPmZsYWdzICYgX19DTVBYQ0hHX0RPVUJMRSkgeworCQlpZiAoY21weGNoZ19kb3VibGUoJnBhZ2UtPmZyZWVsaXN0LAorCQkJZnJlZWxpc3Rfb2xkLCBjb3VudGVyc19vbGQsCisJCQlmcmVlbGlzdF9uZXcsIGNvdW50ZXJzX25ldykpCisJCXJldHVybiAxOworCX0gZWxzZQorI2VuZGlmCisJeworCQlzbGFiX2xvY2socGFnZSk7CisJCWlmIChwYWdlLT5mcmVlbGlzdCA9PSBmcmVlbGlzdF9vbGQgJiYgcGFnZS0+Y291bnRlcnMgPT0gY291bnRlcnNfb2xkKSB7CisJCQlwYWdlLT5mcmVlbGlzdCA9IGZyZWVsaXN0X25ldzsKKwkJCXBhZ2UtPmNvdW50ZXJzID0gY291bnRlcnNfbmV3OworCQkJc2xhYl91bmxvY2socGFnZSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlzbGFiX3VubG9jayhwYWdlKTsKKwl9CisKKwljcHVfcmVsYXgoKTsKKwlzdGF0KHMsIENNUFhDSEdfRE9VQkxFX0ZBSUwpOworCisjaWZkZWYgU0xVQl9ERUJVR19DTVBYQ0hHCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgJXM6IGNtcHhjaGcgZG91YmxlIHJlZG8gIiwgbiwgcy0+bmFtZSk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgY21weGNoZ19kb3VibGVfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCXZvaWQgKmZyZWVsaXN0X29sZCwgdW5zaWduZWQgbG9uZyBjb3VudGVyc19vbGQsCisJCXZvaWQgKmZyZWVsaXN0X25ldywgdW5zaWduZWQgbG9uZyBjb3VudGVyc19uZXcsCisJCWNvbnN0IGNoYXIgKm4pCit7CisjaWZkZWYgQ09ORklHX0NNUFhDSEdfRE9VQkxFCisJaWYgKHMtPmZsYWdzICYgX19DTVBYQ0hHX0RPVUJMRSkgeworCQlpZiAoY21weGNoZ19kb3VibGUoJnBhZ2UtPmZyZWVsaXN0LAorCQkJZnJlZWxpc3Rfb2xkLCBjb3VudGVyc19vbGQsCisJCQlmcmVlbGlzdF9uZXcsIGNvdW50ZXJzX25ldykpCisJCXJldHVybiAxOworCX0gZWxzZQorI2VuZGlmCisJeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJc2xhYl9sb2NrKHBhZ2UpOworCQlpZiAocGFnZS0+ZnJlZWxpc3QgPT0gZnJlZWxpc3Rfb2xkICYmIHBhZ2UtPmNvdW50ZXJzID09IGNvdW50ZXJzX29sZCkgeworCQkJcGFnZS0+ZnJlZWxpc3QgPSBmcmVlbGlzdF9uZXc7CisJCQlwYWdlLT5jb3VudGVycyA9IGNvdW50ZXJzX25ldzsKKwkJCXNsYWJfdW5sb2NrKHBhZ2UpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJc2xhYl91bmxvY2socGFnZSk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl9CisKKwljcHVfcmVsYXgoKTsKKwlzdGF0KHMsIENNUFhDSEdfRE9VQkxFX0ZBSUwpOworCisjaWZkZWYgU0xVQl9ERUJVR19DTVBYQ0hHCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgJXM6IGNtcHhjaGcgZG91YmxlIHJlZG8gIiwgbiwgcy0+bmFtZSk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCiAjaWZkZWYgQ09ORklHX1NMVUJfREVCVUcKIC8qCiAgKiBEZXRlcm1pbmUgYSBtYXAgb2Ygb2JqZWN0IGluIHVzZSBvbiBhIHBhZ2UuCiAgKgotICogU2xhYiBsb2NrIG9yIG5vZGUgbGlzdGxvY2sgbXVzdCBiZSBoZWxkIHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBwYWdlIGRvZXMKKyAqIE5vZGUgbGlzdGxvY2sgbXVzdCBiZSBoZWxkIHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBwYWdlIGRvZXMKICAqIG5vdCB2YW5pc2ggZnJvbSB1bmRlciB1cy4KICAqLwogc3RhdGljIHZvaWQgZ2V0X21hcChzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgKm1hcCkKQEAgLTgzOCwxMCArOTI5LDExIEBACiBzdGF0aWMgaW50IG9uX2ZyZWVsaXN0KHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqc2VhcmNoKQogewogCWludCBuciA9IDA7Ci0Jdm9pZCAqZnAgPSBwYWdlLT5mcmVlbGlzdDsKKwl2b2lkICpmcDsKIAl2b2lkICpvYmplY3QgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgbWF4X29iamVjdHM7CiAKKwlmcCA9IHBhZ2UtPmZyZWVsaXN0OwogCXdoaWxlIChmcCAmJiBuciA8PSBwYWdlLT5vYmplY3RzKSB7CiAJCWlmIChmcCA9PSBzZWFyY2gpCiAJCQlyZXR1cm4gMTsKQEAgLTk0NiwyNiArMTAzOCwyNyBAQAogCiAvKgogICogVHJhY2tpbmcgb2YgZnVsbHkgYWxsb2NhdGVkIHNsYWJzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgKgorICogbGlzdF9sb2NrIG11c3QgYmUgaGVsZC4KICAqLwotc3RhdGljIHZvaWQgYWRkX2Z1bGwoc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiwgc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgdm9pZCBhZGRfZnVsbChzdHJ1Y3Qga21lbV9jYWNoZSAqcywKKwlzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlzcGluX2xvY2soJm4tPmxpc3RfbG9jayk7Ci0JbGlzdF9hZGQoJnBhZ2UtPmxydSwgJm4tPmZ1bGwpOwotCXNwaW5fdW5sb2NrKCZuLT5saXN0X2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCByZW1vdmVfZnVsbChzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0Jc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbjsKLQogCWlmICghKHMtPmZsYWdzICYgU0xBQl9TVE9SRV9VU0VSKSkKIAkJcmV0dXJuOwogCi0JbiA9IGdldF9ub2RlKHMsIHBhZ2VfdG9fbmlkKHBhZ2UpKTsKKwlsaXN0X2FkZCgmcGFnZS0+bHJ1LCAmbi0+ZnVsbCk7Cit9CiAKLQlzcGluX2xvY2soJm4tPmxpc3RfbG9jayk7CisvKgorICogbGlzdF9sb2NrIG11c3QgYmUgaGVsZC4KKyAqLworc3RhdGljIHZvaWQgcmVtb3ZlX2Z1bGwoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCWlmICghKHMtPmZsYWdzICYgU0xBQl9TVE9SRV9VU0VSKSkKKwkJcmV0dXJuOworCiAJbGlzdF9kZWwoJnBhZ2UtPmxydSk7Ci0Jc3Bpbl91bmxvY2soJm4tPmxpc3RfbG9jayk7CiB9CiAKIC8qIFRyYWNraW5nIG9mIHRoZSBudW1iZXIgb2Ygc2xhYnMgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyAqLwpAQCAtMTAyMSwxMSArMTExNCw2IEBACiAJaWYgKCFjaGVja19zbGFiKHMsIHBhZ2UpKQogCQlnb3RvIGJhZDsKIAotCWlmICghb25fZnJlZWxpc3QocywgcGFnZSwgb2JqZWN0KSkgewotCQlvYmplY3RfZXJyKHMsIHBhZ2UsIG9iamVjdCwgIk9iamVjdCBhbHJlYWR5IGFsbG9jYXRlZCIpOwotCQlnb3RvIGJhZDsKLQl9Ci0KIAlpZiAoIWNoZWNrX3ZhbGlkX3BvaW50ZXIocywgcGFnZSwgb2JqZWN0KSkgewogCQlvYmplY3RfZXJyKHMsIHBhZ2UsIG9iamVjdCwgIkZyZWVsaXN0IFBvaW50ZXIgY2hlY2sgZmFpbHMiKTsKIAkJZ290byBiYWQ7CkBAIC0xMDU4LDYgKzExNDYsMTIgQEAKIHN0YXRpYyBub2lubGluZSBpbnQgZnJlZV9kZWJ1Z19wcm9jZXNzaW5nKHN0cnVjdCBrbWVtX2NhY2hlICpzLAogCQkgc3RydWN0IHBhZ2UgKnBhZ2UsIHZvaWQgKm9iamVjdCwgdW5zaWduZWQgbG9uZyBhZGRyKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gMDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlzbGFiX2xvY2socGFnZSk7CisKIAlpZiAoIWNoZWNrX3NsYWIocywgcGFnZSkpCiAJCWdvdG8gZmFpbDsKIApAQCAtMTA3Miw3ICsxMTY2LDcgQEAKIAl9CiAKIAlpZiAoIWNoZWNrX29iamVjdChzLCBwYWdlLCBvYmplY3QsIFNMVUJfUkVEX0FDVElWRSkpCi0JCXJldHVybiAwOworCQlnb3RvIG91dDsKIAogCWlmICh1bmxpa2VseShzICE9IHBhZ2UtPnNsYWIpKSB7CiAJCWlmICghUGFnZVNsYWIocGFnZSkpIHsKQEAgLTEwODksMTggKzExODMsMTkgQEAKIAkJZ290byBmYWlsOwogCX0KIAotCS8qIFNwZWNpYWwgZGVidWcgYWN0aXZpdGllcyBmb3IgZnJlZWluZyBvYmplY3RzICovCi0JaWYgKCFQYWdlU2x1YkZyb3plbihwYWdlKSAmJiAhcGFnZS0+ZnJlZWxpc3QpCi0JCXJlbW92ZV9mdWxsKHMsIHBhZ2UpOwogCWlmIChzLT5mbGFncyAmIFNMQUJfU1RPUkVfVVNFUikKIAkJc2V0X3RyYWNrKHMsIG9iamVjdCwgVFJBQ0tfRlJFRSwgYWRkcik7CiAJdHJhY2UocywgcGFnZSwgb2JqZWN0LCAwKTsKIAlpbml0X29iamVjdChzLCBvYmplY3QsIFNMVUJfUkVEX0lOQUNUSVZFKTsKLQlyZXR1cm4gMTsKKwlyYyA9IDE7CitvdXQ6CisJc2xhYl91bmxvY2socGFnZSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiByYzsKIAogZmFpbDoKIAlzbGFiX2ZpeChzLCAiT2JqZWN0IGF0IDB4JXAgbm90IGZyZWVkIiwgb2JqZWN0KTsKLQlyZXR1cm4gMDsKKwlnb3RvIG91dDsKIH0KIAogc3RhdGljIGludCBfX2luaXQgc2V0dXBfc2x1Yl9kZWJ1ZyhjaGFyICpzdHIpCkBAIC0xMjAwLDcgKzEyOTUsOSBAQAogCQkJeyByZXR1cm4gMTsgfQogc3RhdGljIGlubGluZSBpbnQgY2hlY2tfb2JqZWN0KHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJCXZvaWQgKm9iamVjdCwgdTggdmFsKSB7IHJldHVybiAxOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgYWRkX2Z1bGwoc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiwgc3RydWN0IHBhZ2UgKnBhZ2UpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgYWRkX2Z1bGwoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4sCisJCQkJCXN0cnVjdCBwYWdlICpwYWdlKSB7fQorc3RhdGljIGlubGluZSB2b2lkIHJlbW92ZV9mdWxsKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSkge30KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBrbWVtX2NhY2hlX2ZsYWdzKHVuc2lnbmVkIGxvbmcgb2Jqc2l6ZSwKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpuYW1lLAogCXZvaWQgKCpjdG9yKSh2b2lkICopKQpAQCAtMTI1Miw2ICsxMzQ5LDExIEBACiAJc3RydWN0IGttZW1fY2FjaGVfb3JkZXJfb2JqZWN0cyBvbyA9IHMtPm9vOwogCWdmcF90IGFsbG9jX2dmcDsKIAorCWZsYWdzICY9IGdmcF9hbGxvd2VkX21hc2s7CisKKwlpZiAoZmxhZ3MgJiBfX0dGUF9XQUlUKQorCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisKIAlmbGFncyB8PSBzLT5hbGxvY2ZsYWdzOwogCiAJLyoKQEAgLTEyNjgsMTIgKzEzNzAsMTcgQEAKIAkJICogVHJ5IGEgbG93ZXIgb3JkZXIgYWxsb2MgaWYgcG9zc2libGUKIAkJICovCiAJCXBhZ2UgPSBhbGxvY19zbGFiX3BhZ2UoZmxhZ3MsIG5vZGUsIG9vKTsKLQkJaWYgKCFwYWdlKQotCQkJcmV0dXJuIE5VTEw7CiAKLQkJc3RhdChzLCBPUkRFUl9GQUxMQkFDSyk7CisJCWlmIChwYWdlKQorCQkJc3RhdChzLCBPUkRFUl9GQUxMQkFDSyk7CiAJfQogCisJaWYgKGZsYWdzICYgX19HRlBfV0FJVCkKKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCWlmICghcGFnZSkKKwkJcmV0dXJuIE5VTEw7CisKIAlpZiAoa21lbWNoZWNrX2VuYWJsZWQKIAkJJiYgIShzLT5mbGFncyAmIChTTEFCX05PVFJBQ0sgfCBERUJVR19ERUZBVUxUX0ZMQUdTKSkpIHsKIAkJaW50IHBhZ2VzID0gMSA8PCBvb19vcmRlcihvbyk7CkBAIC0xMzQxLDYgKzE0NDgsNyBAQAogCiAJcGFnZS0+ZnJlZWxpc3QgPSBzdGFydDsKIAlwYWdlLT5pbnVzZSA9IDA7CisJcGFnZS0+ZnJvemVuID0gMTsKIG91dDoKIAlyZXR1cm4gcGFnZTsKIH0KQEAgLTE0MTgsNzcgKzE1MjYsODcgQEAKIH0KIAogLyoKLSAqIFBlciBzbGFiIGxvY2tpbmcgdXNpbmcgdGhlIHBhZ2Vsb2NrCisgKiBNYW5hZ2VtZW50IG9mIHBhcnRpYWxseSBhbGxvY2F0ZWQgc2xhYnMuCisgKgorICogbGlzdF9sb2NrIG11c3QgYmUgaGVsZC4KICAqLwotc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIHNsYWJfbG9jayhzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQliaXRfc3Bpbl9sb2NrKFBHX2xvY2tlZCwgJnBhZ2UtPmZsYWdzKTsKLX0KLQotc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIHNsYWJfdW5sb2NrKHN0cnVjdCBwYWdlICpwYWdlKQotewotCV9fYml0X3NwaW5fdW5sb2NrKFBHX2xvY2tlZCwgJnBhZ2UtPmZsYWdzKTsKLX0KLQotc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgc2xhYl90cnlsb2NrKHN0cnVjdCBwYWdlICpwYWdlKQotewotCWludCByYyA9IDE7Ci0KLQlyYyA9IGJpdF9zcGluX3RyeWxvY2soUEdfbG9ja2VkLCAmcGFnZS0+ZmxhZ3MpOwotCXJldHVybiByYzsKLX0KLQotLyoKLSAqIE1hbmFnZW1lbnQgb2YgcGFydGlhbGx5IGFsbG9jYXRlZCBzbGFicwotICovCi1zdGF0aWMgdm9pZCBhZGRfcGFydGlhbChzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuLAorc3RhdGljIGlubGluZSB2b2lkIGFkZF9wYXJ0aWFsKHN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4sCiAJCQkJc3RydWN0IHBhZ2UgKnBhZ2UsIGludCB0YWlsKQogewotCXNwaW5fbG9jaygmbi0+bGlzdF9sb2NrKTsKIAluLT5ucl9wYXJ0aWFsKys7CiAJaWYgKHRhaWwpCiAJCWxpc3RfYWRkX3RhaWwoJnBhZ2UtPmxydSwgJm4tPnBhcnRpYWwpOwogCWVsc2UKIAkJbGlzdF9hZGQoJnBhZ2UtPmxydSwgJm4tPnBhcnRpYWwpOwotCXNwaW5fdW5sb2NrKCZuLT5saXN0X2xvY2spOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19yZW1vdmVfcGFydGlhbChzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuLAorLyoKKyAqIGxpc3RfbG9jayBtdXN0IGJlIGhlbGQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfcGFydGlhbChzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuLAogCQkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKIAluLT5ucl9wYXJ0aWFsLS07CiB9CiAKLXN0YXRpYyB2b2lkIHJlbW92ZV9wYXJ0aWFsKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuID0gZ2V0X25vZGUocywgcGFnZV90b19uaWQocGFnZSkpOwotCi0Jc3Bpbl9sb2NrKCZuLT5saXN0X2xvY2spOwotCV9fcmVtb3ZlX3BhcnRpYWwobiwgcGFnZSk7Ci0Jc3Bpbl91bmxvY2soJm4tPmxpc3RfbG9jayk7Ci19Ci0KIC8qCi0gKiBMb2NrIHNsYWIgYW5kIHJlbW92ZSBmcm9tIHRoZSBwYXJ0aWFsIGxpc3QuCisgKiBMb2NrIHNsYWIsIHJlbW92ZSBmcm9tIHRoZSBwYXJ0aWFsIGxpc3QgYW5kIHB1dCB0aGUgb2JqZWN0IGludG8gdGhlCisgKiBwZXIgY3B1IGZyZWVsaXN0LgogICoKICAqIE11c3QgaG9sZCBsaXN0X2xvY2suCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGxvY2tfYW5kX2ZyZWV6ZV9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4sCi0JCQkJCQkJc3RydWN0IHBhZ2UgKnBhZ2UpCitzdGF0aWMgaW5saW5lIGludCBhY3F1aXJlX3NsYWIoc3RydWN0IGttZW1fY2FjaGUgKnMsCisJCXN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4sIHN0cnVjdCBwYWdlICpwYWdlKQogewotCWlmIChzbGFiX3RyeWxvY2socGFnZSkpIHsKLQkJX19yZW1vdmVfcGFydGlhbChuLCBwYWdlKTsKLQkJX19TZXRQYWdlU2x1YkZyb3plbihwYWdlKTsKKwl2b2lkICpmcmVlbGlzdDsKKwl1bnNpZ25lZCBsb25nIGNvdW50ZXJzOworCXN0cnVjdCBwYWdlIG5ldzsKKworCS8qCisJICogWmFwIHRoZSBmcmVlbGlzdCBhbmQgc2V0IHRoZSBmcm96ZW4gYml0LgorCSAqIFRoZSBvbGQgZnJlZWxpc3QgaXMgdGhlIGxpc3Qgb2Ygb2JqZWN0cyBmb3IgdGhlCisJICogcGVyIGNwdSBhbGxvY2F0aW9uIGxpc3QuCisJICovCisJZG8geworCQlmcmVlbGlzdCA9IHBhZ2UtPmZyZWVsaXN0OworCQljb3VudGVycyA9IHBhZ2UtPmNvdW50ZXJzOworCQluZXcuY291bnRlcnMgPSBjb3VudGVyczsKKwkJbmV3LmludXNlID0gcGFnZS0+b2JqZWN0czsKKworCQlWTV9CVUdfT04obmV3LmZyb3plbik7CisJCW5ldy5mcm96ZW4gPSAxOworCisJfSB3aGlsZSAoIV9fY21weGNoZ19kb3VibGVfc2xhYihzLCBwYWdlLAorCQkJZnJlZWxpc3QsIGNvdW50ZXJzLAorCQkJTlVMTCwgbmV3LmNvdW50ZXJzLAorCQkJImxvY2sgYW5kIGZyZWV6ZSIpKTsKKworCXJlbW92ZV9wYXJ0aWFsKG4sIHBhZ2UpOworCisJaWYgKGZyZWVsaXN0KSB7CisJCS8qIFBvcHVsYXRlIHRoZSBwZXIgY3B1IGZyZWVsaXN0ICovCisJCXRoaXNfY3B1X3dyaXRlKHMtPmNwdV9zbGFiLT5mcmVlbGlzdCwgZnJlZWxpc3QpOworCQl0aGlzX2NwdV93cml0ZShzLT5jcHVfc2xhYi0+cGFnZSwgcGFnZSk7CisJCXRoaXNfY3B1X3dyaXRlKHMtPmNwdV9zbGFiLT5ub2RlLCBwYWdlX3RvX25pZChwYWdlKSk7CiAJCXJldHVybiAxOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFNsYWIgcGFnZSBjYW1lIGZyb20gdGhlIHdyb25nIGxpc3QuIE5vIG9iamVjdCB0byBhbGxvY2F0ZQorCQkgKiBmcm9tLiBQdXQgaXQgb250byB0aGUgY29ycmVjdCBsaXN0IGFuZCBjb250aW51ZSBwYXJ0aWFsCisJCSAqIHNjYW4uCisJCSAqLworCQlwcmludGsoS0VSTl9FUlIgIlNMVUI6ICVzIDogUGFnZSB3aXRob3V0IGF2YWlsYWJsZSBvYmplY3RzIG9uIgorCQkJIiBwYXJ0aWFsIGxpc3RcbiIsIHMtPm5hbWUpOworCQlyZXR1cm4gMDsKIAl9Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBUcnkgdG8gYWxsb2NhdGUgYSBwYXJ0aWFsIHNsYWIgZnJvbSBhIHNwZWNpZmljIG5vZGUuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZ2V0X3BhcnRpYWxfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuKQorc3RhdGljIHN0cnVjdCBwYWdlICpnZXRfcGFydGlhbF9ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICpzLAorCQkJCQlzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuKQogewogCXN0cnVjdCBwYWdlICpwYWdlOwogCkBAIC0xNTAzLDcgKzE2MjEsNyBAQAogCiAJc3Bpbl9sb2NrKCZuLT5saXN0X2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocGFnZSwgJm4tPnBhcnRpYWwsIGxydSkKLQkJaWYgKGxvY2tfYW5kX2ZyZWV6ZV9zbGFiKG4sIHBhZ2UpKQorCQlpZiAoYWNxdWlyZV9zbGFiKHMsIG4sIHBhZ2UpKQogCQkJZ290byBvdXQ7CiAJcGFnZSA9IE5VTEw7CiBvdXQ6CkBAIC0xNTU0LDcgKzE2NzIsNyBAQAogCiAJCWlmIChuICYmIGNwdXNldF96b25lX2FsbG93ZWRfaGFyZHdhbGwoem9uZSwgZmxhZ3MpICYmCiAJCQkJbi0+bnJfcGFydGlhbCA+IHMtPm1pbl9wYXJ0aWFsKSB7Ci0JCQlwYWdlID0gZ2V0X3BhcnRpYWxfbm9kZShuKTsKKwkJCXBhZ2UgPSBnZXRfcGFydGlhbF9ub2RlKHMsIG4pOwogCQkJaWYgKHBhZ2UpIHsKIAkJCQlwdXRfbWVtc19hbGxvd2VkKCk7CiAJCQkJcmV0dXJuIHBhZ2U7CkBAIC0xNTc0LDYwICsxNjkyLDEzIEBACiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJaW50IHNlYXJjaG5vZGUgPSAobm9kZSA9PSBOVU1BX05PX05PREUpID8gbnVtYV9ub2RlX2lkKCkgOiBub2RlOwogCi0JcGFnZSA9IGdldF9wYXJ0aWFsX25vZGUoZ2V0X25vZGUocywgc2VhcmNobm9kZSkpOworCXBhZ2UgPSBnZXRfcGFydGlhbF9ub2RlKHMsIGdldF9ub2RlKHMsIHNlYXJjaG5vZGUpKTsKIAlpZiAocGFnZSB8fCBub2RlICE9IE5VTUFfTk9fTk9ERSkKIAkJcmV0dXJuIHBhZ2U7CiAKIAlyZXR1cm4gZ2V0X2FueV9wYXJ0aWFsKHMsIGZsYWdzKTsKIH0KIAotLyoKLSAqIE1vdmUgYSBwYWdlIGJhY2sgdG8gdGhlIGxpc3RzLgotICoKLSAqIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHNsYWIgbG9jayBoZWxkLgotICoKLSAqIE9uIGV4aXQgdGhlIHNsYWIgbG9jayB3aWxsIGhhdmUgYmVlbiBkcm9wcGVkLgotICovCi1zdGF0aWMgdm9pZCB1bmZyZWV6ZV9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHRhaWwpCi0JX19yZWxlYXNlcyhiaXRsb2NrKQotewotCXN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4gPSBnZXRfbm9kZShzLCBwYWdlX3RvX25pZChwYWdlKSk7Ci0KLQlfX0NsZWFyUGFnZVNsdWJGcm96ZW4ocGFnZSk7Ci0JaWYgKHBhZ2UtPmludXNlKSB7Ci0KLQkJaWYgKHBhZ2UtPmZyZWVsaXN0KSB7Ci0JCQlhZGRfcGFydGlhbChuLCBwYWdlLCB0YWlsKTsKLQkJCXN0YXQocywgdGFpbCA/IERFQUNUSVZBVEVfVE9fVEFJTCA6IERFQUNUSVZBVEVfVE9fSEVBRCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdGF0KHMsIERFQUNUSVZBVEVfRlVMTCk7Ci0JCQlpZiAoa21lbV9jYWNoZV9kZWJ1ZyhzKSAmJiAocy0+ZmxhZ3MgJiBTTEFCX1NUT1JFX1VTRVIpKQotCQkJCWFkZF9mdWxsKG4sIHBhZ2UpOwotCQl9Ci0JCXNsYWJfdW5sb2NrKHBhZ2UpOwotCX0gZWxzZSB7Ci0JCXN0YXQocywgREVBQ1RJVkFURV9FTVBUWSk7Ci0JCWlmIChuLT5ucl9wYXJ0aWFsIDwgcy0+bWluX3BhcnRpYWwpIHsKLQkJCS8qCi0JCQkgKiBBZGRpbmcgYW4gZW1wdHkgc2xhYiB0byB0aGUgcGFydGlhbCBzbGFicyBpbiBvcmRlcgotCQkJICogdG8gYXZvaWQgcGFnZSBhbGxvY2F0b3Igb3ZlcmhlYWQuIFRoaXMgc2xhYiBuZWVkcwotCQkJICogdG8gY29tZSBhZnRlciB0aGUgb3RoZXIgc2xhYnMgd2l0aCBvYmplY3RzIGluCi0JCQkgKiBzbyB0aGF0IHRoZSBvdGhlcnMgZ2V0IGZpbGxlZCBmaXJzdC4gVGhhdCB3YXkgdGhlCi0JCQkgKiBzaXplIG9mIHRoZSBwYXJ0aWFsIGxpc3Qgc3RheXMgc21hbGwuCi0JCQkgKgotCQkJICoga21lbV9jYWNoZV9zaHJpbmsgY2FuIHJlY2xhaW0gYW55IGVtcHR5IHNsYWJzIGZyb20KLQkJCSAqIHRoZSBwYXJ0aWFsIGxpc3QuCi0JCQkgKi8KLQkJCWFkZF9wYXJ0aWFsKG4sIHBhZ2UsIDEpOwotCQkJc2xhYl91bmxvY2socGFnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzbGFiX3VubG9jayhwYWdlKTsKLQkJCXN0YXQocywgRlJFRV9TTEFCKTsKLQkJCWRpc2NhcmRfc2xhYihzLCBwYWdlKTsKLQkJfQotCX0KLX0KLQogI2lmZGVmIENPTkZJR19QUkVFTVBUCiAvKgogICogQ2FsY3VsYXRlIHRoZSBuZXh0IGdsb2JhbGx5IHVuaXF1ZSB0cmFuc2FjdGlvbiBmb3IgZGlzYW1iaWd1aWF0aW9uCkBAIC0xNjk3LDQyICsxNzY4LDE2MSBAQAogLyoKICAqIFJlbW92ZSB0aGUgY3B1IHNsYWIKICAqLworCisvKgorICogUmVtb3ZlIHRoZSBjcHUgc2xhYgorICovCiBzdGF0aWMgdm9pZCBkZWFjdGl2YXRlX3NsYWIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBrbWVtX2NhY2hlX2NwdSAqYykKLQlfX3JlbGVhc2VzKGJpdGxvY2spCiB7CisJZW51bSBzbGFiX21vZGVzIHsgTV9OT05FLCBNX1BBUlRJQUwsIE1fRlVMTCwgTV9GUkVFIH07CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBjLT5wYWdlOwotCWludCB0YWlsID0gMTsKKwlzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuID0gZ2V0X25vZGUocywgcGFnZV90b19uaWQocGFnZSkpOworCWludCBsb2NrID0gMDsKKwllbnVtIHNsYWJfbW9kZXMgbCA9IE1fTk9ORSwgbSA9IE1fTk9ORTsKKwl2b2lkICpmcmVlbGlzdDsKKwl2b2lkICpuZXh0ZnJlZTsKKwlpbnQgdGFpbCA9IDA7CisJc3RydWN0IHBhZ2UgbmV3OworCXN0cnVjdCBwYWdlIG9sZDsKIAotCWlmIChwYWdlLT5mcmVlbGlzdCkKKwlpZiAocGFnZS0+ZnJlZWxpc3QpIHsKIAkJc3RhdChzLCBERUFDVElWQVRFX1JFTU9URV9GUkVFUyk7Ci0JLyoKLQkgKiBNZXJnZSBjcHUgZnJlZWxpc3QgaW50byBzbGFiIGZyZWVsaXN0LiBUeXBpY2FsbHkgd2UgZ2V0IGhlcmUKLQkgKiBiZWNhdXNlIGJvdGggZnJlZWxpc3RzIGFyZSBlbXB0eS4gU28gdGhpcyBpcyB1bmxpa2VseQotCSAqIHRvIG9jY3VyLgotCSAqLwotCXdoaWxlICh1bmxpa2VseShjLT5mcmVlbGlzdCkpIHsKLQkJdm9pZCAqKm9iamVjdDsKLQotCQl0YWlsID0gMDsJLyogSG90IG9iamVjdHMuIFB1dCB0aGUgc2xhYiBmaXJzdCAqLwotCi0JCS8qIFJldHJpZXZlIG9iamVjdCBmcm9tIGNwdV9mcmVlbGlzdCAqLwotCQlvYmplY3QgPSBjLT5mcmVlbGlzdDsKLQkJYy0+ZnJlZWxpc3QgPSBnZXRfZnJlZXBvaW50ZXIocywgYy0+ZnJlZWxpc3QpOwotCi0JCS8qIEFuZCBwdXQgb250byB0aGUgcmVndWxhciBmcmVlbGlzdCAqLwotCQlzZXRfZnJlZXBvaW50ZXIocywgb2JqZWN0LCBwYWdlLT5mcmVlbGlzdCk7Ci0JCXBhZ2UtPmZyZWVsaXN0ID0gb2JqZWN0OwotCQlwYWdlLT5pbnVzZS0tOworCQl0YWlsID0gMTsKIAl9Ci0JYy0+cGFnZSA9IE5VTEw7CisKIAljLT50aWQgPSBuZXh0X3RpZChjLT50aWQpOwotCXVuZnJlZXplX3NsYWIocywgcGFnZSwgdGFpbCk7CisJYy0+cGFnZSA9IE5VTEw7CisJZnJlZWxpc3QgPSBjLT5mcmVlbGlzdDsKKwljLT5mcmVlbGlzdCA9IE5VTEw7CisKKwkvKgorCSAqIFN0YWdlIG9uZTogRnJlZSBhbGwgYXZhaWxhYmxlIHBlciBjcHUgb2JqZWN0cyBiYWNrCisJICogdG8gdGhlIHBhZ2UgZnJlZWxpc3Qgd2hpbGUgaXQgaXMgc3RpbGwgZnJvemVuLiBMZWF2ZSB0aGUKKwkgKiBsYXN0IG9uZS4KKwkgKgorCSAqIFRoZXJlIGlzIG5vIG5lZWQgdG8gdGFrZSB0aGUgbGlzdC0+bG9jayBiZWNhdXNlIHRoZSBwYWdlCisJICogaXMgc3RpbGwgZnJvemVuLgorCSAqLworCXdoaWxlIChmcmVlbGlzdCAmJiAobmV4dGZyZWUgPSBnZXRfZnJlZXBvaW50ZXIocywgZnJlZWxpc3QpKSkgeworCQl2b2lkICpwcmlvcjsKKwkJdW5zaWduZWQgbG9uZyBjb3VudGVyczsKKworCQlkbyB7CisJCQlwcmlvciA9IHBhZ2UtPmZyZWVsaXN0OworCQkJY291bnRlcnMgPSBwYWdlLT5jb3VudGVyczsKKwkJCXNldF9mcmVlcG9pbnRlcihzLCBmcmVlbGlzdCwgcHJpb3IpOworCQkJbmV3LmNvdW50ZXJzID0gY291bnRlcnM7CisJCQluZXcuaW51c2UtLTsKKwkJCVZNX0JVR19PTighbmV3LmZyb3plbik7CisKKwkJfSB3aGlsZSAoIV9fY21weGNoZ19kb3VibGVfc2xhYihzLCBwYWdlLAorCQkJcHJpb3IsIGNvdW50ZXJzLAorCQkJZnJlZWxpc3QsIG5ldy5jb3VudGVycywKKwkJCSJkcmFpbiBwZXJjcHUgZnJlZWxpc3QiKSk7CisKKwkJZnJlZWxpc3QgPSBuZXh0ZnJlZTsKKwl9CisKKwkvKgorCSAqIFN0YWdlIHR3bzogRW5zdXJlIHRoYXQgdGhlIHBhZ2UgaXMgdW5mcm96ZW4gd2hpbGUgdGhlCisJICogbGlzdCBwcmVzZW5jZSByZWZsZWN0cyB0aGUgYWN0dWFsIG51bWJlciBvZiBvYmplY3RzCisJICogZHVyaW5nIHVuZnJlZXplLgorCSAqCisJICogV2Ugc2V0dXAgdGhlIGxpc3QgbWVtYmVyc2hpcCBhbmQgdGhlbiBwZXJmb3JtIGEgY21weGNoZworCSAqIHdpdGggdGhlIGNvdW50LiBJZiB0aGVyZSBpcyBhIG1pc21hdGNoIHRoZW4gdGhlIHBhZ2UKKwkgKiBpcyBub3QgdW5mcm96ZW4gYnV0IHRoZSBwYWdlIGlzIG9uIHRoZSB3cm9uZyBsaXN0LgorCSAqCisJICogVGhlbiB3ZSByZXN0YXJ0IHRoZSBwcm9jZXNzIHdoaWNoIG1heSBoYXZlIHRvIHJlbW92ZQorCSAqIHRoZSBwYWdlIGZyb20gdGhlIGxpc3QgdGhhdCB3ZSBqdXN0IHB1dCBpdCBvbiBhZ2FpbgorCSAqIGJlY2F1c2UgdGhlIG51bWJlciBvZiBvYmplY3RzIGluIHRoZSBzbGFiIG1heSBoYXZlCisJICogY2hhbmdlZC4KKwkgKi8KK3JlZG86CisKKwlvbGQuZnJlZWxpc3QgPSBwYWdlLT5mcmVlbGlzdDsKKwlvbGQuY291bnRlcnMgPSBwYWdlLT5jb3VudGVyczsKKwlWTV9CVUdfT04oIW9sZC5mcm96ZW4pOworCisJLyogRGV0ZXJtaW5lIHRhcmdldCBzdGF0ZSBvZiB0aGUgc2xhYiAqLworCW5ldy5jb3VudGVycyA9IG9sZC5jb3VudGVyczsKKwlpZiAoZnJlZWxpc3QpIHsKKwkJbmV3LmludXNlLS07CisJCXNldF9mcmVlcG9pbnRlcihzLCBmcmVlbGlzdCwgb2xkLmZyZWVsaXN0KTsKKwkJbmV3LmZyZWVsaXN0ID0gZnJlZWxpc3Q7CisJfSBlbHNlCisJCW5ldy5mcmVlbGlzdCA9IG9sZC5mcmVlbGlzdDsKKworCW5ldy5mcm96ZW4gPSAwOworCisJaWYgKCFuZXcuaW51c2UgJiYgbi0+bnJfcGFydGlhbCA8IHMtPm1pbl9wYXJ0aWFsKQorCQltID0gTV9GUkVFOworCWVsc2UgaWYgKG5ldy5mcmVlbGlzdCkgeworCQltID0gTV9QQVJUSUFMOworCQlpZiAoIWxvY2spIHsKKwkJCWxvY2sgPSAxOworCQkJLyoKKwkJCSAqIFRha2luZyB0aGUgc3BpbmxvY2sgcmVtb3ZlcyB0aGUgcG9zc2libGl0eQorCQkJICogdGhhdCBhY3F1aXJlX3NsYWIoKSB3aWxsIHNlZSBhIHNsYWIgcGFnZSB0aGF0CisJCQkgKiBpcyBmcm96ZW4KKwkJCSAqLworCQkJc3Bpbl9sb2NrKCZuLT5saXN0X2xvY2spOworCQl9CisJfSBlbHNlIHsKKwkJbSA9IE1fRlVMTDsKKwkJaWYgKGttZW1fY2FjaGVfZGVidWcocykgJiYgIWxvY2spIHsKKwkJCWxvY2sgPSAxOworCQkJLyoKKwkJCSAqIFRoaXMgYWxzbyBlbnN1cmVzIHRoYXQgdGhlIHNjYW5uaW5nIG9mIGZ1bGwKKwkJCSAqIHNsYWJzIGZyb20gZGlhZ25vc3RpYyBmdW5jdGlvbnMgd2lsbCBub3Qgc2VlCisJCQkgKiBhbnkgZnJvemVuIHNsYWJzLgorCQkJICovCisJCQlzcGluX2xvY2soJm4tPmxpc3RfbG9jayk7CisJCX0KKwl9CisKKwlpZiAobCAhPSBtKSB7CisKKwkJaWYgKGwgPT0gTV9QQVJUSUFMKQorCisJCQlyZW1vdmVfcGFydGlhbChuLCBwYWdlKTsKKworCQllbHNlIGlmIChsID09IE1fRlVMTCkKKworCQkJcmVtb3ZlX2Z1bGwocywgcGFnZSk7CisKKwkJaWYgKG0gPT0gTV9QQVJUSUFMKSB7CisKKwkJCWFkZF9wYXJ0aWFsKG4sIHBhZ2UsIHRhaWwpOworCQkJc3RhdChzLCB0YWlsID8gREVBQ1RJVkFURV9UT19UQUlMIDogREVBQ1RJVkFURV9UT19IRUFEKTsKKworCQl9IGVsc2UgaWYgKG0gPT0gTV9GVUxMKSB7CisKKwkJCXN0YXQocywgREVBQ1RJVkFURV9GVUxMKTsKKwkJCWFkZF9mdWxsKHMsIG4sIHBhZ2UpOworCisJCX0KKwl9CisKKwlsID0gbTsKKwlpZiAoIV9fY21weGNoZ19kb3VibGVfc2xhYihzLCBwYWdlLAorCQkJCW9sZC5mcmVlbGlzdCwgb2xkLmNvdW50ZXJzLAorCQkJCW5ldy5mcmVlbGlzdCwgbmV3LmNvdW50ZXJzLAorCQkJCSJ1bmZyZWV6aW5nIHNsYWIiKSkKKwkJZ290byByZWRvOworCisJaWYgKGxvY2spCisJCXNwaW5fdW5sb2NrKCZuLT5saXN0X2xvY2spOworCisJaWYgKG0gPT0gTV9GUkVFKSB7CisJCXN0YXQocywgREVBQ1RJVkFURV9FTVBUWSk7CisJCWRpc2NhcmRfc2xhYihzLCBwYWdlKTsKKwkJc3RhdChzLCBGUkVFX1NMQUIpOworCX0KIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3NsYWIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBrbWVtX2NhY2hlX2NwdSAqYykKIHsKIAlzdGF0KHMsIENQVVNMQUJfRkxVU0gpOwotCXNsYWJfbG9jayhjLT5wYWdlKTsKIAlkZWFjdGl2YXRlX3NsYWIocywgYyk7CiB9CiAKQEAgLTE4NjEsNiArMjA1MSw4IEBACiAJdm9pZCAqKm9iamVjdDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBwYWdlIG5ldzsKKwl1bnNpZ25lZCBsb25nIGNvdW50ZXJzOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogI2lmZGVmIENPTkZJR19QUkVFTVBUCkBAIC0xODc5LDcyICsyMDcxLDk3IEBACiAJaWYgKCFwYWdlKQogCQlnb3RvIG5ld19zbGFiOwogCi0Jc2xhYl9sb2NrKHBhZ2UpOwotCWlmICh1bmxpa2VseSghbm9kZV9tYXRjaChjLCBub2RlKSkpCi0JCWdvdG8gYW5vdGhlcl9zbGFiOworCWlmICh1bmxpa2VseSghbm9kZV9tYXRjaChjLCBub2RlKSkpIHsKKwkJc3RhdChzLCBBTExPQ19OT0RFX01JU01BVENIKTsKKwkJZGVhY3RpdmF0ZV9zbGFiKHMsIGMpOworCQlnb3RvIG5ld19zbGFiOworCX0KKworCXN0YXQocywgQUxMT0NfU0xPV1BBVEgpOworCisJZG8geworCQlvYmplY3QgPSBwYWdlLT5mcmVlbGlzdDsKKwkJY291bnRlcnMgPSBwYWdlLT5jb3VudGVyczsKKwkJbmV3LmNvdW50ZXJzID0gY291bnRlcnM7CisJCVZNX0JVR19PTighbmV3LmZyb3plbik7CisKKwkJLyoKKwkJICogSWYgdGhlcmUgaXMgbm8gb2JqZWN0IGxlZnQgdGhlbiB3ZSB1c2UgdGhpcyBsb29wIHRvCisJCSAqIGRlYWN0aXZhdGUgdGhlIHNsYWIgd2hpY2ggaXMgc2ltcGxlIHNpbmNlIG5vIG9iamVjdHMKKwkJICogYXJlIGxlZnQgaW4gdGhlIHNsYWIgYW5kIHRoZXJlZm9yZSB3ZSBkbyBub3QgbmVlZCB0bworCQkgKiBwdXQgdGhlIHBhZ2UgYmFjayBvbnRvIHRoZSBwYXJ0aWFsIGxpc3QuCisJCSAqCisJCSAqIElmIHRoZXJlIGFyZSBvYmplY3RzIGxlZnQgdGhlbiB3ZSByZXRyaWV2ZSB0aGVtCisJCSAqIGFuZCB1c2UgdGhlbSB0byByZWZpbGwgdGhlIHBlciBjcHUgcXVldWUuCisJCSovCisKKwkJbmV3LmludXNlID0gcGFnZS0+b2JqZWN0czsKKwkJbmV3LmZyb3plbiA9IG9iamVjdCAhPSBOVUxMOworCisJfSB3aGlsZSAoIV9fY21weGNoZ19kb3VibGVfc2xhYihzLCBwYWdlLAorCQkJb2JqZWN0LCBjb3VudGVycywKKwkJCU5VTEwsIG5ldy5jb3VudGVycywKKwkJCSJfX3NsYWJfYWxsb2MiKSk7CisKKwlpZiAodW5saWtlbHkoIW9iamVjdCkpIHsKKwkJYy0+cGFnZSA9IE5VTEw7CisJCXN0YXQocywgREVBQ1RJVkFURV9CWVBBU1MpOworCQlnb3RvIG5ld19zbGFiOworCX0KIAogCXN0YXQocywgQUxMT0NfUkVGSUxMKTsKIAogbG9hZF9mcmVlbGlzdDoKLQlvYmplY3QgPSBwYWdlLT5mcmVlbGlzdDsKLQlpZiAodW5saWtlbHkoIW9iamVjdCkpCi0JCWdvdG8gYW5vdGhlcl9zbGFiOwotCWlmIChrbWVtX2NhY2hlX2RlYnVnKHMpKQotCQlnb3RvIGRlYnVnOwotCisJVk1fQlVHX09OKCFwYWdlLT5mcm96ZW4pOwogCWMtPmZyZWVsaXN0ID0gZ2V0X2ZyZWVwb2ludGVyKHMsIG9iamVjdCk7Ci0JcGFnZS0+aW51c2UgPSBwYWdlLT5vYmplY3RzOwotCXBhZ2UtPmZyZWVsaXN0ID0gTlVMTDsKLQotCXNsYWJfdW5sb2NrKHBhZ2UpOwogCWMtPnRpZCA9IG5leHRfdGlkKGMtPnRpZCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXN0YXQocywgQUxMT0NfU0xPV1BBVEgpOwogCXJldHVybiBvYmplY3Q7CiAKLWFub3RoZXJfc2xhYjoKLQlkZWFjdGl2YXRlX3NsYWIocywgYyk7Ci0KIG5ld19zbGFiOgogCXBhZ2UgPSBnZXRfcGFydGlhbChzLCBnZnBmbGFncywgbm9kZSk7CiAJaWYgKHBhZ2UpIHsKIAkJc3RhdChzLCBBTExPQ19GUk9NX1BBUlRJQUwpOwotCQljLT5ub2RlID0gcGFnZV90b19uaWQocGFnZSk7Ci0JCWMtPnBhZ2UgPSBwYWdlOworCQlvYmplY3QgPSBjLT5mcmVlbGlzdDsKKworCQlpZiAoa21lbV9jYWNoZV9kZWJ1ZyhzKSkKKwkJCWdvdG8gZGVidWc7CiAJCWdvdG8gbG9hZF9mcmVlbGlzdDsKIAl9CiAKLQlnZnBmbGFncyAmPSBnZnBfYWxsb3dlZF9tYXNrOwotCWlmIChnZnBmbGFncyAmIF9fR0ZQX1dBSVQpCi0JCWxvY2FsX2lycV9lbmFibGUoKTsKLQogCXBhZ2UgPSBuZXdfc2xhYihzLCBnZnBmbGFncywgbm9kZSk7CiAKLQlpZiAoZ2ZwZmxhZ3MgJiBfX0dGUF9XQUlUKQotCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCiAJaWYgKHBhZ2UpIHsKIAkJYyA9IF9fdGhpc19jcHVfcHRyKHMtPmNwdV9zbGFiKTsKLQkJc3RhdChzLCBBTExPQ19TTEFCKTsKIAkJaWYgKGMtPnBhZ2UpCiAJCQlmbHVzaF9zbGFiKHMsIGMpOwogCi0JCXNsYWJfbG9jayhwYWdlKTsKLQkJX19TZXRQYWdlU2x1YkZyb3plbihwYWdlKTsKKwkJLyoKKwkJICogTm8gb3RoZXIgcmVmZXJlbmNlIHRvIHRoZSBwYWdlIHlldCBzbyB3ZSBjYW4KKwkJICogbXVjayBhcm91bmQgd2l0aCBpdCBmcmVlbHkgd2l0aG91dCBjbXB4Y2hnCisJCSAqLworCQlvYmplY3QgPSBwYWdlLT5mcmVlbGlzdDsKKwkJcGFnZS0+ZnJlZWxpc3QgPSBOVUxMOworCQlwYWdlLT5pbnVzZSA9IHBhZ2UtPm9iamVjdHM7CisKKwkJc3RhdChzLCBBTExPQ19TTEFCKTsKIAkJYy0+bm9kZSA9IHBhZ2VfdG9fbmlkKHBhZ2UpOwogCQljLT5wYWdlID0gcGFnZTsKKworCQlpZiAoa21lbV9jYWNoZV9kZWJ1ZyhzKSkKKwkJCWdvdG8gZGVidWc7CiAJCWdvdG8gbG9hZF9mcmVlbGlzdDsKIAl9CiAJaWYgKCEoZ2ZwZmxhZ3MgJiBfX0dGUF9OT1dBUk4pICYmIHByaW50a19yYXRlbGltaXQoKSkKIAkJc2xhYl9vdXRfb2ZfbWVtb3J5KHMsIGdmcGZsYWdzLCBub2RlKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJcmV0dXJuIE5VTEw7Ci1kZWJ1ZzoKLQlpZiAoIWFsbG9jX2RlYnVnX3Byb2Nlc3NpbmcocywgcGFnZSwgb2JqZWN0LCBhZGRyKSkKLQkJZ290byBhbm90aGVyX3NsYWI7CiAKLQlwYWdlLT5pbnVzZSsrOwotCXBhZ2UtPmZyZWVsaXN0ID0gZ2V0X2ZyZWVwb2ludGVyKHMsIG9iamVjdCk7CitkZWJ1ZzoKKwlpZiAoIW9iamVjdCB8fCAhYWxsb2NfZGVidWdfcHJvY2Vzc2luZyhzLCBwYWdlLCBvYmplY3QsIGFkZHIpKQorCQlnb3RvIG5ld19zbGFiOworCisJYy0+ZnJlZWxpc3QgPSBnZXRfZnJlZXBvaW50ZXIocywgb2JqZWN0KTsKIAlkZWFjdGl2YXRlX3NsYWIocywgYyk7CiAJYy0+cGFnZSA9IE5VTEw7CiAJYy0+bm9kZSA9IE5VTUFfTk9fTk9ERTsKQEAgLTIwOTYsNDAgKzIzMTMsNzUgQEAKIHsKIAl2b2lkICpwcmlvcjsKIAl2b2lkICoqb2JqZWN0ID0gKHZvaWQgKil4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHdhc19mcm96ZW47CisJaW50IGludXNlOworCXN0cnVjdCBwYWdlIG5ldzsKKwl1bnNpZ25lZCBsb25nIGNvdW50ZXJzOworCXN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4gPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgdW5pbml0aWFsaXplZF92YXIoZmxhZ3MpOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXNsYWJfbG9jayhwYWdlKTsKIAlzdGF0KHMsIEZSRUVfU0xPV1BBVEgpOwogCiAJaWYgKGttZW1fY2FjaGVfZGVidWcocykgJiYgIWZyZWVfZGVidWdfcHJvY2Vzc2luZyhzLCBwYWdlLCB4LCBhZGRyKSkKLQkJZ290byBvdXRfdW5sb2NrOworCQlyZXR1cm47CiAKLQlwcmlvciA9IHBhZ2UtPmZyZWVsaXN0OwotCXNldF9mcmVlcG9pbnRlcihzLCBvYmplY3QsIHByaW9yKTsKLQlwYWdlLT5mcmVlbGlzdCA9IG9iamVjdDsKLQlwYWdlLT5pbnVzZS0tOworCWRvIHsKKwkJcHJpb3IgPSBwYWdlLT5mcmVlbGlzdDsKKwkJY291bnRlcnMgPSBwYWdlLT5jb3VudGVyczsKKwkJc2V0X2ZyZWVwb2ludGVyKHMsIG9iamVjdCwgcHJpb3IpOworCQluZXcuY291bnRlcnMgPSBjb3VudGVyczsKKwkJd2FzX2Zyb3plbiA9IG5ldy5mcm96ZW47CisJCW5ldy5pbnVzZS0tOworCQlpZiAoKCFuZXcuaW51c2UgfHwgIXByaW9yKSAmJiAhd2FzX2Zyb3plbiAmJiAhbikgeworICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGdldF9ub2RlKHMsIHBhZ2VfdG9fbmlkKHBhZ2UpKTsKKwkJCS8qCisJCQkgKiBTcGVjdWxhdGl2ZWx5IGFjcXVpcmUgdGhlIGxpc3RfbG9jay4KKwkJCSAqIElmIHRoZSBjbXB4Y2hnIGRvZXMgbm90IHN1Y2NlZWQgdGhlbiB3ZSBtYXkKKwkJCSAqIGRyb3AgdGhlIGxpc3RfbG9jayB3aXRob3V0IGFueSBwcm9jZXNzaW5nLgorCQkJICoKKwkJCSAqIE90aGVyd2lzZSB0aGUgbGlzdF9sb2NrIHdpbGwgc3luY2hyb25pemUgd2l0aAorCQkJICogb3RoZXIgcHJvY2Vzc29ycyB1cGRhdGluZyB0aGUgbGlzdCBvZiBzbGFicy4KKwkJCSAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm4tPmxpc3RfbG9jaywgZmxhZ3MpOworCQl9CisJCWludXNlID0gbmV3LmludXNlOwogCi0JaWYgKHVubGlrZWx5KFBhZ2VTbHViRnJvemVuKHBhZ2UpKSkgewotCQlzdGF0KHMsIEZSRUVfRlJPWkVOKTsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KKwl9IHdoaWxlICghY21weGNoZ19kb3VibGVfc2xhYihzLCBwYWdlLAorCQlwcmlvciwgY291bnRlcnMsCisJCW9iamVjdCwgbmV3LmNvdW50ZXJzLAorCQkiX19zbGFiX2ZyZWUiKSk7CiAKLQlpZiAodW5saWtlbHkoIXBhZ2UtPmludXNlKSkKLQkJZ290byBzbGFiX2VtcHR5OworCWlmIChsaWtlbHkoIW4pKSB7CisgICAgICAgICAgICAgICAgLyoKKwkJICogVGhlIGxpc3QgbG9jayB3YXMgbm90IHRha2VuIHRoZXJlZm9yZSBubyBsaXN0CisJCSAqIGFjdGl2aXR5IGNhbiBiZSBuZWNlc3NhcnkuCisJCSAqLworICAgICAgICAgICAgICAgIGlmICh3YXNfZnJvemVuKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdChzLCBGUkVFX0ZST1pFTik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKIAkvKgotCSAqIE9iamVjdHMgbGVmdCBpbiB0aGUgc2xhYi4gSWYgaXQgd2FzIG5vdCBvbiB0aGUgcGFydGlhbCBsaXN0IGJlZm9yZQotCSAqIHRoZW4gYWRkIGl0LgorCSAqIHdhc19mcm96ZW4gbWF5IGhhdmUgYmVlbiBzZXQgYWZ0ZXIgd2UgYWNxdWlyZWQgdGhlIGxpc3RfbG9jayBpbgorCSAqIGFuIGVhcmxpZXIgbG9vcC4gU28gd2UgbmVlZCB0byBjaGVjayBpdCBoZXJlIGFnYWluLgogCSAqLwotCWlmICh1bmxpa2VseSghcHJpb3IpKSB7Ci0JCWFkZF9wYXJ0aWFsKGdldF9ub2RlKHMsIHBhZ2VfdG9fbmlkKHBhZ2UpKSwgcGFnZSwgMSk7Ci0JCXN0YXQocywgRlJFRV9BRERfUEFSVElBTCk7Ci0JfQorCWlmICh3YXNfZnJvemVuKQorCQlzdGF0KHMsIEZSRUVfRlJPWkVOKTsKKwllbHNlIHsKKwkJaWYgKHVubGlrZWx5KCFpbnVzZSAmJiBuLT5ucl9wYXJ0aWFsID4gcy0+bWluX3BhcnRpYWwpKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBzbGFiX2VtcHR5OwogCi1vdXRfdW5sb2NrOgotCXNsYWJfdW5sb2NrKHBhZ2UpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJLyoKKwkJICogT2JqZWN0cyBsZWZ0IGluIHRoZSBzbGFiLiBJZiBpdCB3YXMgbm90IG9uIHRoZSBwYXJ0aWFsIGxpc3QgYmVmb3JlCisJCSAqIHRoZW4gYWRkIGl0LgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KCFwcmlvcikpIHsKKwkJCXJlbW92ZV9mdWxsKHMsIHBhZ2UpOworCQkJYWRkX3BhcnRpYWwobiwgcGFnZSwgMCk7CisJCQlzdGF0KHMsIEZSRUVfQUREX1BBUlRJQUwpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm4tPmxpc3RfbG9jaywgZmxhZ3MpOwogCXJldHVybjsKIAogc2xhYl9lbXB0eToKQEAgLTIxMzcsMTEgKzIzODksMTEgQEAKIAkJLyoKIAkJICogU2xhYiBzdGlsbCBvbiB0aGUgcGFydGlhbCBsaXN0LgogCQkgKi8KLQkJcmVtb3ZlX3BhcnRpYWwocywgcGFnZSk7CisJCXJlbW92ZV9wYXJ0aWFsKG4sIHBhZ2UpOwogCQlzdGF0KHMsIEZSRUVfUkVNT1ZFX1BBUlRJQUwpOwogCX0KLQlzbGFiX3VubG9jayhwYWdlKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuLT5saXN0X2xvY2ssIGZsYWdzKTsKIAlzdGF0KHMsIEZSRUVfU0xBQik7CiAJZGlzY2FyZF9zbGFiKHMsIHBhZ2UpOwogfQpAQCAtMjQxNSw3ICsyNjY3LDYgQEAKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlCVUdfT04oa21lbV9jYWNoZV9ub2RlLT5zaXplIDwgc2l6ZW9mKHN0cnVjdCBrbWVtX2NhY2hlX25vZGUpKTsKIApAQCAtMjQzMyw2ICsyNjg0LDcgQEAKIAlCVUdfT04oIW4pOwogCXBhZ2UtPmZyZWVsaXN0ID0gZ2V0X2ZyZWVwb2ludGVyKGttZW1fY2FjaGVfbm9kZSwgbik7CiAJcGFnZS0+aW51c2UrKzsKKwlwYWdlLT5mcm96ZW4gPSAwOwogCWttZW1fY2FjaGVfbm9kZS0+bm9kZVtub2RlXSA9IG47CiAjaWZkZWYgQ09ORklHX1NMVUJfREVCVUcKIAlpbml0X29iamVjdChrbWVtX2NhY2hlX25vZGUsIG4sIFNMVUJfUkVEX0FDVElWRSk7CkBAIC0yNDQxLDE0ICsyNjkzLDcgQEAKIAlpbml0X2ttZW1fY2FjaGVfbm9kZShuLCBrbWVtX2NhY2hlX25vZGUpOwogCWluY19zbGFic19ub2RlKGttZW1fY2FjaGVfbm9kZSwgbm9kZSwgcGFnZS0+b2JqZWN0cyk7CiAKLQkvKgotCSAqIGxvY2tkZXAgcmVxdWlyZXMgY29uc2lzdGVudCBpcnEgdXNhZ2UgZm9yIGVhY2ggbG9jawotCSAqIHNvIGV2ZW4gdGhvdWdoIHRoZXJlIGNhbm5vdCBiZSBhIHJhY2UgdGhpcyBlYXJseSBpbgotCSAqIHRoZSBib290IHNlcXVlbmNlLCB3ZSBzdGlsbCBkaXNhYmxlIGlycXMuCi0JICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWFkZF9wYXJ0aWFsKG4sIHBhZ2UsIDApOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgZnJlZV9rbWVtX2NhY2hlX25vZGVzKHN0cnVjdCBrbWVtX2NhY2hlICpzKQpAQCAtMjY1NCw2ICsyODk5LDEyIEBACiAJCX0KIAl9CiAKKyNpZmRlZiBDT05GSUdfQ01QWENIR19ET1VCTEUKKwlpZiAoc3lzdGVtX2hhc19jbXB4Y2hnX2RvdWJsZSgpICYmIChzLT5mbGFncyAmIFNMQUJfREVCVUdfRkxBR1MpID09IDApCisJCS8qIEVuYWJsZSBmYXN0IG1vZGUgKi8KKwkJcy0+ZmxhZ3MgfD0gX19DTVBYQ0hHX0RPVUJMRTsKKyNlbmRpZgorCiAJLyoKIAkgKiBUaGUgbGFyZ2VyIHRoZSBvYmplY3Qgc2l6ZSBpcywgdGhlIG1vcmUgcGFnZXMgd2Ugd2FudCBvbiB0aGUgcGFydGlhbAogCSAqIGxpc3QgdG8gYXZvaWQgcG91bmRpbmcgdGhlIHBhZ2UgYWxsb2NhdG9yIGV4Y2Vzc2l2ZWx5LgpAQCAtMjcyNiw3ICsyOTc3LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbi0+bGlzdF9sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhZ2UsIGgsICZuLT5wYXJ0aWFsLCBscnUpIHsKIAkJaWYgKCFwYWdlLT5pbnVzZSkgewotCQkJX19yZW1vdmVfcGFydGlhbChuLCBwYWdlKTsKKwkJCXJlbW92ZV9wYXJ0aWFsKG4sIHBhZ2UpOwogCQkJZGlzY2FyZF9zbGFiKHMsIHBhZ2UpOwogCQl9IGVsc2UgewogCQkJbGlzdF9zbGFiX29iamVjdHMocywgcGFnZSwKQEAgLTMwOTQsMTQgKzMzNDUsOCBAQAogCQkgKiBsaXN0X2xvY2suIHBhZ2UtPmludXNlIGhlcmUgaXMgdGhlIHVwcGVyIGxpbWl0LgogCQkgKi8KIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhZ2UsIHQsICZuLT5wYXJ0aWFsLCBscnUpIHsKLQkJCWlmICghcGFnZS0+aW51c2UgJiYgc2xhYl90cnlsb2NrKHBhZ2UpKSB7Ci0JCQkJLyoKLQkJCQkgKiBNdXN0IGhvbGQgc2xhYiBsb2NrIGhlcmUgYmVjYXVzZSBzbGFiX2ZyZWUKLQkJCQkgKiBtYXkgaGF2ZSBmcmVlZCB0aGUgbGFzdCBvYmplY3QgYW5kIGJlCi0JCQkJICogd2FpdGluZyB0byByZWxlYXNlIHRoZSBzbGFiLgotCQkJCSAqLwotCQkJCV9fcmVtb3ZlX3BhcnRpYWwobiwgcGFnZSk7Ci0JCQkJc2xhYl91bmxvY2socGFnZSk7CisJCQlpZiAoIXBhZ2UtPmludXNlKSB7CisJCQkJcmVtb3ZlX3BhcnRpYWwobiwgcGFnZSk7CiAJCQkJZGlzY2FyZF9zbGFiKHMsIHBhZ2UpOwogCQkJfSBlbHNlIHsKIAkJCQlsaXN0X21vdmUoJnBhZ2UtPmxydSwKQEAgLTM2ODksMTIgKzM5MzQsOSBAQAogc3RhdGljIHZvaWQgdmFsaWRhdGVfc2xhYl9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJCQkJCXVuc2lnbmVkIGxvbmcgKm1hcCkKIHsKLQlpZiAoc2xhYl90cnlsb2NrKHBhZ2UpKSB7Ci0JCXZhbGlkYXRlX3NsYWIocywgcGFnZSwgbWFwKTsKLQkJc2xhYl91bmxvY2socGFnZSk7Ci0JfSBlbHNlCi0JCXByaW50ayhLRVJOX0lORk8gIlNMVUIgJXM6IFNraXBwZWQgYnVzeSBzbGFiIDB4JXBcbiIsCi0JCQlzLT5uYW1lLCBwYWdlKTsKKwlzbGFiX2xvY2socGFnZSk7CisJdmFsaWRhdGVfc2xhYihzLCBwYWdlLCBtYXApOworCXNsYWJfdW5sb2NrKHBhZ2UpOwogfQogCiBzdGF0aWMgaW50IHZhbGlkYXRlX3NsYWJfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqcywKQEAgLTQzNDIsOCArNDU4NCwxMCBAQAogCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbmd0aCkKIHsKIAlzLT5mbGFncyAmPSB+U0xBQl9ERUJVR19GUkVFOwotCWlmIChidWZbMF0gPT0gJzEnKQorCWlmIChidWZbMF0gPT0gJzEnKSB7CisJCXMtPmZsYWdzICY9IH5fX0NNUFhDSEdfRE9VQkxFOwogCQlzLT5mbGFncyB8PSBTTEFCX0RFQlVHX0ZSRUU7CisJfQogCXJldHVybiBsZW5ndGg7CiB9CiBTTEFCX0FUVFIoc2FuaXR5X2NoZWNrcyk7CkBAIC00MzU3LDggKzQ2MDEsMTAgQEAKIAkJCQkJCQlzaXplX3QgbGVuZ3RoKQogewogCXMtPmZsYWdzICY9IH5TTEFCX1RSQUNFOwotCWlmIChidWZbMF0gPT0gJzEnKQorCWlmIChidWZbMF0gPT0gJzEnKSB7CisJCXMtPmZsYWdzICY9IH5fX0NNUFhDSEdfRE9VQkxFOwogCQlzLT5mbGFncyB8PSBTTEFCX1RSQUNFOworCX0KIAlyZXR1cm4gbGVuZ3RoOwogfQogU0xBQl9BVFRSKHRyYWNlKTsKQEAgLTQzNzUsOCArNDYyMSwxMCBAQAogCQlyZXR1cm4gLUVCVVNZOwogCiAJcy0+ZmxhZ3MgJj0gflNMQUJfUkVEX1pPTkU7Ci0JaWYgKGJ1ZlswXSA9PSAnMScpCisJaWYgKGJ1ZlswXSA9PSAnMScpIHsKKwkJcy0+ZmxhZ3MgJj0gfl9fQ01QWENIR19ET1VCTEU7CiAJCXMtPmZsYWdzIHw9IFNMQUJfUkVEX1pPTkU7CisJfQogCWNhbGN1bGF0ZV9zaXplcyhzLCAtMSk7CiAJcmV0dXJuIGxlbmd0aDsKIH0KQEAgLTQzOTQsOCArNDY0MiwxMCBAQAogCQlyZXR1cm4gLUVCVVNZOwogCiAJcy0+ZmxhZ3MgJj0gflNMQUJfUE9JU09OOwotCWlmIChidWZbMF0gPT0gJzEnKQorCWlmIChidWZbMF0gPT0gJzEnKSB7CisJCXMtPmZsYWdzICY9IH5fX0NNUFhDSEdfRE9VQkxFOwogCQlzLT5mbGFncyB8PSBTTEFCX1BPSVNPTjsKKwl9CiAJY2FsY3VsYXRlX3NpemVzKHMsIC0xKTsKIAlyZXR1cm4gbGVuZ3RoOwogfQpAQCAtNDQxMyw4ICs0NjYzLDEwIEBACiAJCXJldHVybiAtRUJVU1k7CiAKIAlzLT5mbGFncyAmPSB+U0xBQl9TVE9SRV9VU0VSOwotCWlmIChidWZbMF0gPT0gJzEnKQorCWlmIChidWZbMF0gPT0gJzEnKSB7CisJCXMtPmZsYWdzICY9IH5fX0NNUFhDSEdfRE9VQkxFOwogCQlzLT5mbGFncyB8PSBTTEFCX1NUT1JFX1VTRVI7CisJfQogCWNhbGN1bGF0ZV9zaXplcyhzLCAtMSk7CiAJcmV0dXJuIGxlbmd0aDsKIH0KQEAgLTQ1NzksNiArNDgzMSw3IEBACiBTVEFUX0FUVFIoQUxMT0NfRlJPTV9QQVJUSUFMLCBhbGxvY19mcm9tX3BhcnRpYWwpOwogU1RBVF9BVFRSKEFMTE9DX1NMQUIsIGFsbG9jX3NsYWIpOwogU1RBVF9BVFRSKEFMTE9DX1JFRklMTCwgYWxsb2NfcmVmaWxsKTsKK1NUQVRfQVRUUihBTExPQ19OT0RFX01JU01BVENILCBhbGxvY19ub2RlX21pc21hdGNoKTsKIFNUQVRfQVRUUihGUkVFX1NMQUIsIGZyZWVfc2xhYik7CiBTVEFUX0FUVFIoQ1BVU0xBQl9GTFVTSCwgY3B1c2xhYl9mbHVzaCk7CiBTVEFUX0FUVFIoREVBQ1RJVkFURV9GVUxMLCBkZWFjdGl2YXRlX2Z1bGwpOwpAQCAtNDU4Niw3ICs0ODM5LDEwIEBACiBTVEFUX0FUVFIoREVBQ1RJVkFURV9UT19IRUFELCBkZWFjdGl2YXRlX3RvX2hlYWQpOwogU1RBVF9BVFRSKERFQUNUSVZBVEVfVE9fVEFJTCwgZGVhY3RpdmF0ZV90b190YWlsKTsKIFNUQVRfQVRUUihERUFDVElWQVRFX1JFTU9URV9GUkVFUywgZGVhY3RpdmF0ZV9yZW1vdGVfZnJlZXMpOworU1RBVF9BVFRSKERFQUNUSVZBVEVfQllQQVNTLCBkZWFjdGl2YXRlX2J5cGFzcyk7CiBTVEFUX0FUVFIoT1JERVJfRkFMTEJBQ0ssIG9yZGVyX2ZhbGxiYWNrKTsKK1NUQVRfQVRUUihDTVBYQ0hHX0RPVUJMRV9DUFVfRkFJTCwgY21weGNoZ19kb3VibGVfY3B1X2ZhaWwpOworU1RBVF9BVFRSKENNUFhDSEdfRE9VQkxFX0ZBSUwsIGNtcHhjaGdfZG91YmxlX2ZhaWwpOwogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpzbGFiX2F0dHJzW10gPSB7CkBAIC00NjM2LDYgKzQ4OTIsNyBAQAogCSZhbGxvY19mcm9tX3BhcnRpYWxfYXR0ci5hdHRyLAogCSZhbGxvY19zbGFiX2F0dHIuYXR0ciwKIAkmYWxsb2NfcmVmaWxsX2F0dHIuYXR0ciwKKwkmYWxsb2Nfbm9kZV9taXNtYXRjaF9hdHRyLmF0dHIsCiAJJmZyZWVfc2xhYl9hdHRyLmF0dHIsCiAJJmNwdXNsYWJfZmx1c2hfYXR0ci5hdHRyLAogCSZkZWFjdGl2YXRlX2Z1bGxfYXR0ci5hdHRyLApAQCAtNDY0Myw3ICs0OTAwLDEwIEBACiAJJmRlYWN0aXZhdGVfdG9faGVhZF9hdHRyLmF0dHIsCiAJJmRlYWN0aXZhdGVfdG9fdGFpbF9hdHRyLmF0dHIsCiAJJmRlYWN0aXZhdGVfcmVtb3RlX2ZyZWVzX2F0dHIuYXR0ciwKKwkmZGVhY3RpdmF0ZV9ieXBhc3NfYXR0ci5hdHRyLAogCSZvcmRlcl9mYWxsYmFja19hdHRyLmF0dHIsCisJJmNtcHhjaGdfZG91YmxlX2ZhaWxfYXR0ci5hdHRyLAorCSZjbXB4Y2hnX2RvdWJsZV9jcHVfZmFpbF9hdHRyLmF0dHIsCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRkFJTFNMQUIKIAkmZmFpbHNsYWJfYXR0ci5hdHRyLApkaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmMKaW5kZXggMWI4YzMzOS4uMTdiYzIyNCAxMDA2NDQKLS0tIGEvbW0vc3dhcGZpbGUuYworKysgYi9tbS9zd2FwZmlsZS5jCkBAIC0xOTI0LDIwICsxOTI0LDI0IEBACiAKIAkvKgogCSAqIEZpbmQgb3V0IGhvdyBtYW55IHBhZ2VzIGFyZSBhbGxvd2VkIGZvciBhIHNpbmdsZSBzd2FwCi0JICogZGV2aWNlLiBUaGVyZSBhcmUgdHdvIGxpbWl0aW5nIGZhY3RvcnM6IDEpIHRoZSBudW1iZXIgb2YKLQkgKiBiaXRzIGZvciB0aGUgc3dhcCBvZmZzZXQgaW4gdGhlIHN3cF9lbnRyeV90IHR5cGUgYW5kCi0JICogMikgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBhIHN3YXAgcHRlIGFzIGRlZmluZWQgYnkKLQkgKiB0aGUgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuIEluIG9yZGVyIHRvIGZpbmQgdGhlCi0JICogbGFyZ2VzdCBwb3NzaWJsZSBiaXQgbWFzayBhIHN3YXAgZW50cnkgd2l0aCBzd2FwIHR5cGUgMAorCSAqIGRldmljZS4gVGhlcmUgYXJlIHRocmVlIGxpbWl0aW5nIGZhY3RvcnM6IDEpIHRoZSBudW1iZXIKKwkgKiBvZiBiaXRzIGZvciB0aGUgc3dhcCBvZmZzZXQgaW4gdGhlIHN3cF9lbnRyeV90IHR5cGUsIGFuZAorCSAqIDIpIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgc3dhcCBwdGUgYXMgZGVmaW5lZCBieSB0aGUKKwkgKiB0aGUgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMsIGFuZCAzKSB0aGUgbnVtYmVyIG9mIGZyZWUgYml0cworCSAqIGluIGFuIGV4Y2VwdGlvbmFsIHJhZGl4X3RyZWUgZW50cnkuIEluIG9yZGVyIHRvIGZpbmQgdGhlCisJICogbGFyZ2VzdCBwb3NzaWJsZSBiaXQgbWFzaywgYSBzd2FwIGVudHJ5IHdpdGggc3dhcCB0eXBlIDAKIAkgKiBhbmQgc3dhcCBvZmZzZXQgfjBVTCBpcyBjcmVhdGVkLCBlbmNvZGVkIHRvIGEgc3dhcCBwdGUsCi0JICogZGVjb2RlZCB0byBhIHN3cF9lbnRyeV90IGFnYWluIGFuZCBmaW5hbGx5IHRoZSBzd2FwCisJICogZGVjb2RlZCB0byBhIHN3cF9lbnRyeV90IGFnYWluLCBhbmQgZmluYWxseSB0aGUgc3dhcAogCSAqIG9mZnNldCBpcyBleHRyYWN0ZWQuIFRoaXMgd2lsbCBtYXNrIGFsbCB0aGUgYml0cyBmcm9tCiAJICogdGhlIGluaXRpYWwgfjBVTCBtYXNrIHRoYXQgY2FuJ3QgYmUgZW5jb2RlZCBpbiBlaXRoZXIKIAkgKiB0aGUgc3dwX2VudHJ5X3Qgb3IgdGhlIGFyY2hpdGVjdHVyZSBkZWZpbml0aW9uIG9mIGEKLQkgKiBzd2FwIHB0ZS4KKwkgKiBzd2FwIHB0ZS4gIFRoZW4gdGhlIHNhbWUgaXMgZG9uZSBmb3IgYSByYWRpeF90cmVlIGVudHJ5LgogCSAqLwogCW1heHBhZ2VzID0gc3dwX29mZnNldChwdGVfdG9fc3dwX2VudHJ5KAotCQkJc3dwX2VudHJ5X3RvX3B0ZShzd3BfZW50cnkoMCwgfjBVTCkpKSkgKyAxOworCQkJc3dwX2VudHJ5X3RvX3B0ZShzd3BfZW50cnkoMCwgfjBVTCkpKSk7CisJbWF4cGFnZXMgPSBzd3Bfb2Zmc2V0KHJhZGl4X3RvX3N3cF9lbnRyeSgKKwkJCXN3cF90b19yYWRpeF9lbnRyeShzd3BfZW50cnkoMCwgbWF4cGFnZXMpKSkpICsgMTsKKwogCWlmIChtYXhwYWdlcyA+IHN3YXBfaGVhZGVyLT5pbmZvLmxhc3RfcGFnZSkgewogCQltYXhwYWdlcyA9IHN3YXBfaGVhZGVyLT5pbmZvLmxhc3RfcGFnZSArIDE7CiAJCS8qIHAtPm1heCBpcyBhbiB1bnNpZ25lZCBpbnQ6IGRvbid0IG92ZXJmbG93IGl0ICovCmRpZmYgLS1naXQgYS9tbS90cnVuY2F0ZS5jIGIvbW0vdHJ1bmNhdGUuYwppbmRleCAyMzJlYjI3Li5iNDBhYzZkIDEwMDY0NAotLS0gYS9tbS90cnVuY2F0ZS5jCisrKyBiL21tL3RydW5jYXRlLmMKQEAgLTMzNiw2ICszMzYsMTQgQEAKIAl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKIAlpbnQgaTsKIAorCS8qCisJICogTm90ZTogdGhpcyBmdW5jdGlvbiBtYXkgZ2V0IGNhbGxlZCBvbiBhIHNobWVtL3RtcGZzIG1hcHBpbmc6CisJICogcGFnZXZlY19sb29rdXAoKSBtaWdodCB0aGVuIHJldHVybiAwIHByZW1hdHVyZWx5IChiZWNhdXNlIGl0CisJICogZ290IGEgZ2FuZ2Z1bCBvZiBzd2FwIGVudHJpZXMpOyBidXQgaXQncyBoYXJkbHkgd29ydGggd29ycnlpbmcKKwkgKiBhYm91dCAtIGl0IGNhbiByYXJlbHkgaGF2ZSBhbnl0aGluZyB0byBmcmVlIGZyb20gc3VjaCBhIG1hcHBpbmcKKwkgKiAobW9zdCBwYWdlcyBhcmUgZGlydHkpLCBhbmQgYWxyZWFkeSBza2lwcyBvdmVyIGFueSBkaWZmaWN1bHRpZXMuCisJICovCisKIAlwYWdldmVjX2luaXQoJnB2ZWMsIDApOwogCXdoaWxlIChpbmRleCA8PSBlbmQgJiYgcGFnZXZlY19sb29rdXAoJnB2ZWMsIG1hcHBpbmcsIGluZGV4LAogCQkJbWluKGVuZCAtIGluZGV4LCAocGdvZmZfdClQQUdFVkVDX1NJWkUgLSAxKSArIDEpKSB7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvTWFrZWZpbGUgYi9zY3JpcHRzL2tjb25maWcvTWFrZWZpbGUKaW5kZXggMGI0Mjc2Yy4uODJkMmViMiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlCisrKyBiL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZQpAQCAtMTcwLDggKzE3MCw4IEBACiBuY29uZi1vYmpzICAgICA6PSBuY29uZi5vIHpjb25mLnRhYi5vIG5jb25mLmd1aS5vCiBreGdldHRleHQtb2Jqcwk6PSBreGdldHRleHQubyB6Y29uZi50YWIubwogcWNvbmYtY3h4b2Jqcwk6PSBxY29uZi5vCi1xY29uZi1vYmpzCTo9IGtjb25maWdfbG9hZC5vIHpjb25mLnRhYi5vCi1nY29uZi1vYmpzCTo9IGdjb25mLm8ga2NvbmZpZ19sb2FkLm8gemNvbmYudGFiLm8KK3Fjb25mLW9ianMJOj0gemNvbmYudGFiLm8KK2djb25mLW9ianMJOj0gZ2NvbmYubyB6Y29uZi50YWIubwogCiBob3N0cHJvZ3MteSA6PSBjb25mCiAKQEAgLTIwMyw3ICsyMDMsNyBAQAogCWhvc3Rwcm9ncy15ICs9IGdjb25mCiBlbmRpZgogCi1jbGVhbi1maWxlcwk6PSBsa2NfZGVmcy5oIHFjb25mLm1vYyAudG1wX3F0Y2hlY2sgLnRtcF9ndGtjaGVjaworY2xlYW4tZmlsZXMJOj0gcWNvbmYubW9jIC50bXBfcXRjaGVjayAudG1wX2d0a2NoZWNrCiBjbGVhbi1maWxlcwkrPSB6Y29uZi50YWIuYyB6Y29uZi5sZXguYyB6Y29uZi5oYXNoLmMgZ2NvbmYuZ2xhZGUuaAogY2xlYW4tZmlsZXMgICAgICs9IG1jb25mIHFjb25mIGdjb25mIG5jb25mCiBjbGVhbi1maWxlcyAgICAgKz0gY29uZmlnLnBvdCBsaW51eC5wb3QKQEAgLTIyNiwxMiArMjI2LDEyIEBACiBMRVhfUFJFRklYX3pjb25mCTo9IHpjb25mCiBZQUNDX1BSRUZJWF96Y29uZgk6PSB6Y29uZgogCi1IT1NUTE9BRExJQkVTX3Fjb25mCT0gJChLQ19RVF9MSUJTKSAtbGRsCi1IT1NUQ1hYRkxBR1NfcWNvbmYubwk9ICQoS0NfUVRfQ0ZMQUdTKSAtRCBMS0NfRElSRUNUX0xJTksKK0hPU1RMT0FETElCRVNfcWNvbmYJPSAkKEtDX1FUX0xJQlMpCitIT1NUQ1hYRkxBR1NfcWNvbmYubwk9ICQoS0NfUVRfQ0ZMQUdTKQogCi1IT1NUTE9BRExJQkVTX2djb25mCT0gYHBrZy1jb25maWcgLS1saWJzIGd0aystMi4wIGdtb2R1bGUtMi4wIGxpYmdsYWRlLTIuMGAgLWxkbAorSE9TVExPQURMSUJFU19nY29uZgk9IGBwa2ctY29uZmlnIC0tbGlicyBndGsrLTIuMCBnbW9kdWxlLTIuMCBsaWJnbGFkZS0yLjBgCiBIT1NUQ0ZMQUdTX2djb25mLm8JPSBgcGtnLWNvbmZpZyAtLWNmbGFncyBndGsrLTIuMCBnbW9kdWxlLTIuMCBsaWJnbGFkZS0yLjBgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLUQgTEtDX0RJUkVDVF9MSU5LCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1Xbm8tbWlzc2luZy1wcm90b3R5cGVzCiAKIEhPU1RMT0FETElCRVNfbWNvbmYgICA9ICQoc2hlbGwgJChDT05GSUdfU0hFTEwpICQoY2hlY2stbHhkaWFsb2cpIC1sZGZsYWdzICQoSE9TVENDKSkKIApAQCAtMzIxLDE4ICszMjEsMTEgQEAKIAogJChvYmopL3pjb25mLnRhYi5vOiAkKG9iaikvemNvbmYubGV4LmMgJChvYmopL3pjb25mLmhhc2guYwogCi0kKG9iaikva2NvbmZpZ19sb2FkLm86ICQob2JqKS9sa2NfZGVmcy5oCi0KLSQob2JqKS9xY29uZi5vOiAkKG9iaikvcWNvbmYubW9jICQob2JqKS9sa2NfZGVmcy5oCi0KLSQob2JqKS9nY29uZi5vOiAkKG9iaikvbGtjX2RlZnMuaAorJChvYmopL3Fjb25mLm86ICQob2JqKS9xY29uZi5tb2MKIAogJChvYmopLyUubW9jOiAkKHNyYykvJS5oCiAJJChLQ19RVF9NT0MpIC1pICQ8IC1vICRACiAKLSQob2JqKS9sa2NfZGVmcy5oOiAkKHNyYykvbGtjX3Byb3RvLmgKLQkkKFEpc2VkIDwgJDwgPiAkQCAncy9QKFwoW14sXSpcKSwuKi8jZGVmaW5lIFwxIChcKlwxX3ApLycKLQogIyBFeHRyYWN0IGdjb25mIG1lbnUgaXRlbXMgZm9yIEkxOE4gc3VwcG9ydAogJChvYmopL2djb25mLmdsYWRlLmg6ICQob2JqKS9nY29uZi5nbGFkZQogCSQoUSlpbnRsdG9vbC1leHRyYWN0IC0tdHlwZT1nZXR0ZXh0L2dsYWRlIC0tc3JjZGlyPSQoc3JjdHJlZSkgXApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2NvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKaW5kZXggMDA2YWQ4MS4uZjIwOGY5MCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2NvbmYuYworKysgYi9zY3JpcHRzL2tjb25maWcvY29uZi5jCkBAIC0xNCwxMSArMTQsMTEgQEAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAKLSNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCiAjaW5jbHVkZSAibGtjLmgiCiAKIHN0YXRpYyB2b2lkIGNvbmYoc3RydWN0IG1lbnUgKm1lbnUpOwogc3RhdGljIHZvaWQgY2hlY2tfY29uZihzdHJ1Y3QgbWVudSAqbWVudSk7CitzdGF0aWMgdm9pZCB4ZmdldHMoY2hhciAqc3RyLCBpbnQgc2l6ZSwgRklMRSAqaW4pOwogCiBlbnVtIGlucHV0X21vZGUgewogCW9sZGFza2NvbmZpZywKQEAgLTM1LDggKzM1LDYgQEAKIAlvbGRub2NvbmZpZywKIH0gaW5wdXRfbW9kZSA9IG9sZGFza2NvbmZpZzsKIAotY2hhciAqZGVmY29uZmlnX2ZpbGU7Ci0KIHN0YXRpYyBpbnQgaW5kZW50ID0gMTsKIHN0YXRpYyBpbnQgdmFsaWRfc3RkaW4gPSAxOwogc3RhdGljIGludCBzeW5jX2tjb25maWc7CkBAIC0xMDYsNiArMTA0LDcgQEAKIAkJCXJldHVybiAwOwogCQl9CiAJCWNoZWNrX3N0ZGluKCk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2Ugb2xkYXNrY29uZmlnOgogCQlmZmx1c2goc3Rkb3V0KTsKIAkJeGZnZXRzKGxpbmUsIDEyOCwgc3RkaW4pOwpAQCAtMTUwLDYgKzE0OSw3IEBACiAJCQkJZGVmID0gTlVMTDsKIAkJCQlicmVhazsKIAkJCX0KKwkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQlkZWZhdWx0OgogCQkJbGluZVtzdHJsZW4obGluZSktMV0gPSAwOwogCQkJZGVmID0gbGluZTsKQEAgLTMwNCw2ICszMDQsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCQkJY2hlY2tfc3RkaW4oKTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQljYXNlIG9sZGFza2NvbmZpZzoKIAkJCWZmbHVzaChzdGRvdXQpOwogCQkJeGZnZXRzKGxpbmUsIDEyOCwgc3RkaW4pOwpAQCAtMzY5LDYgKzM3MCw3IEBACiAJCQkJY2hlY2tfY29uZihtZW51KTsKIAkJCQlyZXR1cm47CiAJCQl9CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KIAkJY2FzZSBQX0NPTU1FTlQ6CiAJCQlwcm9tcHQgPSBtZW51X2dldF9wcm9tcHQobWVudSk7CiAJCQlpZiAocHJvbXB0KQpAQCAtNDU2LDEwICs0NTgsMzAgQEAKIAl7TlVMTCwgMCwgTlVMTCwgMH0KIH07CiAKK3N0YXRpYyB2b2lkIGNvbmZfdXNhZ2UoY29uc3QgY2hhciAqcHJvZ25hbWUpCit7CisKKwlwcmludGYoIlVzYWdlOiAlcyBbb3B0aW9uXSA8a2NvbmZpZy1maWxlPlxuIiwgcHJvZ25hbWUpOworCXByaW50ZigiW29wdGlvbl0gaXMgX29uZV8gb2YgdGhlIGZvbGxvd2luZzpcbiIpOworCXByaW50ZigiICAtLWxpc3RuZXdjb25maWcgICAgICAgICBMaXN0IG5ldyBvcHRpb25zXG4iKTsKKwlwcmludGYoIiAgLS1vbGRhc2tjb25maWcgICAgICAgICAgU3RhcnQgYSBuZXcgY29uZmlndXJhdGlvbiB1c2luZyBhIGxpbmUtb3JpZW50ZWQgcHJvZ3JhbVxuIik7CisJcHJpbnRmKCIgIC0tb2xkY29uZmlnICAgICAgICAgICAgIFVwZGF0ZSBhIGNvbmZpZ3VyYXRpb24gdXNpbmcgYSBwcm92aWRlZCAuY29uZmlnIGFzIGJhc2VcbiIpOworCXByaW50ZigiICAtLXNpbGVudG9sZGNvbmZpZyAgICAgICBTYW1lIGFzIG9sZGNvbmZpZywgYnV0IHF1aWV0bHksIGFkZGl0aW9uYWxseSB1cGRhdGUgZGVwc1xuIik7CisJcHJpbnRmKCIgIC0tb2xkbm9jb25maWcgICAgICAgICAgIFNhbWUgYXMgc2lsZW50b2xkY29uZmlnIGJ1dCBzZXQgbmV3IHN5bWJvbHMgdG8gbm9cbiIpOworCXByaW50ZigiICAtLWRlZmNvbmZpZyA8ZmlsZT4gICAgICBOZXcgY29uZmlnIHdpdGggZGVmYXVsdCBkZWZpbmVkIGluIDxmaWxlPlxuIik7CisJcHJpbnRmKCIgIC0tc2F2ZWRlZmNvbmZpZyA8ZmlsZT4gIFNhdmUgdGhlIG1pbmltYWwgY3VycmVudCBjb25maWd1cmF0aW9uIHRvIDxmaWxlPlxuIik7CisJcHJpbnRmKCIgIC0tYWxsbm9jb25maWcgICAgICAgICAgIE5ldyBjb25maWcgd2hlcmUgYWxsIG9wdGlvbnMgYXJlIGFuc3dlcmVkIHdpdGggbm9cbiIpOworCXByaW50ZigiICAtLWFsbHllc2NvbmZpZyAgICAgICAgICBOZXcgY29uZmlnIHdoZXJlIGFsbCBvcHRpb25zIGFyZSBhbnN3ZXJlZCB3aXRoIHllc1xuIik7CisJcHJpbnRmKCIgIC0tYWxsbW9kY29uZmlnICAgICAgICAgIE5ldyBjb25maWcgd2hlcmUgYWxsIG9wdGlvbnMgYXJlIGFuc3dlcmVkIHdpdGggbW9kXG4iKTsKKwlwcmludGYoIiAgLS1hbGxkZWZjb25maWcgICAgICAgICAgTmV3IGNvbmZpZyB3aXRoIGFsbCBzeW1ib2xzIHNldCB0byBkZWZhdWx0XG4iKTsKKwlwcmludGYoIiAgLS1yYW5kY29uZmlnICAgICAgICAgICAgTmV3IGNvbmZpZyB3aXRoIHJhbmRvbSBhbnN3ZXIgdG8gYWxsIG9wdGlvbnNcbiIpOworfQorCiBpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikKIHsKKwljb25zdCBjaGFyICpwcm9nbmFtZSA9IGF2WzBdOwogCWludCBvcHQ7Ci0JY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpuYW1lLCAqZGVmY29uZmlnX2ZpbGUgPSBOVUxMIC8qIGdjYyB1bmluaXQgKi87CiAJc3RydWN0IHN0YXQgdG1wc3RhdDsKIAogCXNldGxvY2FsZShMQ19BTEwsICIiKTsKQEAgLTQ5MSwxNCArNTEzLDI0IEBACiAJCQlzcmFuZChzZWVkKTsKIAkJCWJyZWFrOwogCQl9CisJCWNhc2Ugb2xkYXNrY29uZmlnOgorCQljYXNlIG9sZGNvbmZpZzoKKwkJY2FzZSBhbGxub2NvbmZpZzoKKwkJY2FzZSBhbGx5ZXNjb25maWc6CisJCWNhc2UgYWxsbW9kY29uZmlnOgorCQljYXNlIGFsbGRlZmNvbmZpZzoKKwkJY2FzZSBsaXN0bmV3Y29uZmlnOgorCQljYXNlIG9sZG5vY29uZmlnOgorCQkJYnJlYWs7CiAJCWNhc2UgJz8nOgotCQkJZnByaW50ZihzdGRlcnIsIF8oIlNlZSBSRUFETUUgZm9yIHVzYWdlIGluZm9cbiIpKTsKKwkJCWNvbmZfdXNhZ2UocHJvZ25hbWUpOwogCQkJZXhpdCgxKTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCWlmIChhYyA9PSBvcHRpbmQpIHsKIAkJcHJpbnRmKF8oIiVzOiBLY29uZmlnIGZpbGUgbWlzc2luZ1xuIiksIGF2WzBdKTsKKwkJY29uZl91c2FnZShwcm9nbmFtZSk7CiAJCWV4aXQoMSk7CiAJfQogCW5hbWUgPSBhdltvcHRpbmRdOwpAQCAtNjQxLDEzICs2NzMsMTEgQEAKIAl9CiAJcmV0dXJuIDA7CiB9CisKIC8qCiAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZmFjaWxpdGF0ZSBmZ2V0cygpIGJ5IEplYW4gU2FjcmVuLgogICovCi12b2lkIHhmZ2V0cyhzdHIsIHNpemUsIGluKQotCWNoYXIgKnN0cjsKLQlpbnQgc2l6ZTsKLQlGSUxFICppbjsKK3ZvaWQgeGZnZXRzKGNoYXIgKnN0ciwgaW50IHNpemUsIEZJTEUgKmluKQogewogCWlmIChmZ2V0cyhzdHIsIHNpemUsIGluKSA9PSBOVUxMKQogCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgaW4gcmVhZGluZyBvciBlbmQgb2YgZmlsZS5cbiIpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMgYi9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYwppbmRleCAyYmFmZDlhLi41OWI2NjdjIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYworKysgYi9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYwpAQCAtNywxMyArNywxMyBAQAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jZGVmaW5lIExLQ19ESVJFQ1RfTElOSwogI2luY2x1ZGUgImxrYy5oIgogCiBzdGF0aWMgdm9pZCBjb25mX3dhcm5pbmcoY29uc3QgY2hhciAqZm10LCAuLi4pCkBAIC0xMjgsNiArMTI4LDcgQEAKIAkJCXN5bS0+ZmxhZ3MgfD0gZGVmX2ZsYWdzOwogCQkJYnJlYWs7CiAJCX0KKwkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBTX0JPT0xFQU46CiAJCWlmIChwWzBdID09ICd5JykgewogCQkJc3ltLT5kZWZbZGVmXS50cmkgPSB5ZXM7CkBAIC0xNDAsNyArMTQxLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJCWNvbmZfd2FybmluZygic3ltYm9sIHZhbHVlICclcycgaW52YWxpZCBmb3IgJXMiLCBwLCBzeW0tPm5hbWUpOwotCQlicmVhazsKKwkJcmV0dXJuIDE7CiAJY2FzZSBTX09USEVSOgogCQlpZiAoKnAgIT0gJyInKSB7CiAJCQlmb3IgKHAyID0gcDsgKnAyICYmICFpc3NwYWNlKCpwMik7IHAyKyspCkBAIC0xNDgsNiArMTQ5LDcgQEAKIAkJCXN5bS0+dHlwZSA9IFNfU1RSSU5HOwogCQkJZ290byBkb25lOwogCQl9CisJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgU19TVFJJTkc6CiAJCWlmICgqcCsrICE9ICciJykKIAkJCWJyZWFrOwpAQCAtMTYyLDYgKzE2NCw3IEBACiAJCQljb25mX3dhcm5pbmcoImludmFsaWQgc3RyaW5nIGZvdW5kIik7CiAJCQlyZXR1cm4gMTsKIAkJfQorCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIFNfSU5UOgogCWNhc2UgU19IRVg6CiAJZG9uZToKQEAgLTIzNyw2ICsyNDAsNyBAQAogCQljYXNlIFNfU1RSSU5HOgogCQkJaWYgKHN5bS0+ZGVmW2RlZl0udmFsKQogCQkJCWZyZWUoc3ltLT5kZWZbZGVmXS52YWwpOworCQkJLyogZmFsbCB0aHJvdWdoICovCiAJCWRlZmF1bHQ6CiAJCQlzeW0tPmRlZltkZWZdLnZhbCA9IE5VTEw7CiAJCQlzeW0tPmRlZltkZWZdLnRyaSA9IG5vOwpAQCAtMzYzLDYgKzM2Nyw3IEBACiAJCQkJCWJyZWFrOwogCQkJCWlmICghc3ltX2lzX2Nob2ljZShzeW0pKQogCQkJCQlnb3RvIHN5bV9vazsKKwkJCQkvKiBmYWxsIHRocm91Z2ggKi8KIAkJCWRlZmF1bHQ6CiAJCQkJaWYgKCFzdHJjbXAoc3ltLT5jdXJyLnZhbCwgc3ltLT5kZWZbU19ERUZfVVNFUl0udmFsKSkKIAkJCQkJZ290byBzeW1fb2s7CkBAIC00MTcsNjQgKzQyMiwyMDIgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogV3JpdGUgYSBTX1NUUklORyAqLwotc3RhdGljIHZvaWQgY29uZl93cml0ZV9zdHJpbmcoYm9vbCBoZWFkZXJmaWxlLCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyLCBGSUxFICpvdXQpCisvKgorICogS2NvbmZpZyBjb25maWd1cmF0aW9uIHByaW50ZXIKKyAqCisgKiBUaGlzIHByaW50ZXIgaXMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIHJlc3VsdGluZyBjb25maWd1cmF0aW9uIGFmdGVyCisgKiBrY29uZmlnIGludm9jYXRpb24gYW5kIGBkZWZjb25maWcnIGZpbGVzLiBVbnNldCBzeW1ib2wgbWlnaHQgYmUgb21pdHRlZCBieQorICogcGFzc2luZyBhIG5vbi1OVUxMIGFyZ3VtZW50IHRvIHRoZSBwcmludGVyLgorICoKKyAqLworc3RhdGljIHZvaWQKK2tjb25maWdfcHJpbnRfc3ltYm9sKEZJTEUgKmZwLCBzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKnZhbHVlLCB2b2lkICphcmcpCiB7Ci0JaW50IGw7Ci0JaWYgKGhlYWRlcmZpbGUpCi0JCWZwcmludGYob3V0LCAiI2RlZmluZSAlcyVzIFwiIiwgQ09ORklHXywgbmFtZSk7Ci0JZWxzZQotCQlmcHJpbnRmKG91dCwgIiVzJXM9XCIiLCBDT05GSUdfLCBuYW1lKTsKLQotCXdoaWxlICgxKSB7Ci0JCWwgPSBzdHJjc3BuKHN0ciwgIlwiXFwiKTsKLQkJaWYgKGwpIHsKLQkJCXhmd3JpdGUoc3RyLCBsLCAxLCBvdXQpOwotCQkJc3RyICs9IGw7Ci0JCX0KLQkJaWYgKCEqc3RyKQotCQkJYnJlYWs7Ci0JCWZwcmludGYob3V0LCAiXFwlYyIsICpzdHIrKyk7Ci0JfQotCWZwdXRzKCJcIlxuIiwgb3V0KTsKLX0KLQotc3RhdGljIHZvaWQgY29uZl93cml0ZV9zeW1ib2woc3RydWN0IHN5bWJvbCAqc3ltLCBGSUxFICpvdXQsIGJvb2wgd3JpdGVfbm8pCi17Ci0JY29uc3QgY2hhciAqc3RyOwogCiAJc3dpdGNoIChzeW0tPnR5cGUpIHsKIAljYXNlIFNfQk9PTEVBTjoKIAljYXNlIFNfVFJJU1RBVEU6Ci0JCXN3aXRjaCAoc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pKSB7Ci0JCWNhc2Ugbm86Ci0JCQlpZiAod3JpdGVfbm8pCi0JCQkJZnByaW50ZihvdXQsICIjICVzJXMgaXMgbm90IHNldFxuIiwKKwkJaWYgKCp2YWx1ZSA9PSAnbicpIHsKKwkJCWJvb2wgc2tpcF91bnNldCA9IChhcmcgIT0gTlVMTCk7CisKKwkJCWlmICghc2tpcF91bnNldCkKKwkJCQlmcHJpbnRmKGZwLCAiIyAlcyVzIGlzIG5vdCBzZXRcbiIsCiAJCQkJICAgIENPTkZJR18sIHN5bS0+bmFtZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBtb2Q6Ci0JCQlmcHJpbnRmKG91dCwgIiVzJXM9bVxuIiwgQ09ORklHXywgc3ltLT5uYW1lKTsKLQkJCWJyZWFrOwotCQljYXNlIHllczoKLQkJCWZwcmludGYob3V0LCAiJXMlcz15XG4iLCBDT05GSUdfLCBzeW0tPm5hbWUpOwotCQkJYnJlYWs7CisJCQlyZXR1cm47CiAJCX0KIAkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJZnByaW50ZihmcCwgIiVzJXM9JXNcbiIsIENPTkZJR18sIHN5bS0+bmFtZSwgdmFsdWUpOworfQorCitzdGF0aWMgdm9pZAora2NvbmZpZ19wcmludF9jb21tZW50KEZJTEUgKmZwLCBjb25zdCBjaGFyICp2YWx1ZSwgdm9pZCAqYXJnKQoreworCWNvbnN0IGNoYXIgKnAgPSB2YWx1ZTsKKwlzaXplX3QgbDsKKworCWZvciAoOzspIHsKKwkJbCA9IHN0cmNzcG4ocCwgIlxuIik7CisJCWZwcmludGYoZnAsICIjIik7CisJCWlmIChsKSB7CisJCQlmcHJpbnRmKGZwLCAiICIpOworCQkJZndyaXRlKHAsIGwsIDEsIGZwKTsKKwkJCXAgKz0gbDsKKwkJfQorCQlmcHJpbnRmKGZwLCAiXG4iKTsKKwkJaWYgKCpwKysgPT0gJ1wwJykKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIHN0cnVjdCBjb25mX3ByaW50ZXIga2NvbmZpZ19wcmludGVyX2NiID0KK3sKKwkucHJpbnRfc3ltYm9sID0ga2NvbmZpZ19wcmludF9zeW1ib2wsCisJLnByaW50X2NvbW1lbnQgPSBrY29uZmlnX3ByaW50X2NvbW1lbnQsCit9OworCisvKgorICogSGVhZGVyIHByaW50ZXIKKyAqCisgKiBUaGlzIHByaW50ZXIgaXMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIGBpbmNsdWRlL2dlbmVyYXRlZC9hdXRvY29uZi5oJyBmaWxlLgorICovCitzdGF0aWMgdm9pZAoraGVhZGVyX3ByaW50X3N5bWJvbChGSUxFICpmcCwgc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICp2YWx1ZSwgdm9pZCAqYXJnKQoreworCisJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6IHsKKwkJY29uc3QgY2hhciAqc3VmZml4ID0gIiI7CisKKwkJc3dpdGNoICgqdmFsdWUpIHsKKwkJY2FzZSAnbic6CisJCQlicmVhazsKKwkJY2FzZSAnbSc6CisJCQlzdWZmaXggPSAiX01PRFVMRSI7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoZnAsICIjZGVmaW5lICVzJXMlcyAxXG4iLAorCQkJICAgIENPTkZJR18sIHN5bS0+bmFtZSwgc3VmZml4KTsKKwkJfQorCQkvKgorCQkgKiBHZW5lcmF0ZSB0aGUgX19lbmFibGVkX0NPTkZJR18qIGFuZAorCQkgKiBfX2VuYWJsZWRfQ09ORklHXypfTU9EVUxFIG1hY3JvcyBmb3IgdXNlIGJ5IHRoZQorCQkgKiBJU197RU5BQkxFRCxCVUlMVElOLE1PRFVMRX0gbWFjcm9zLiBUaGUgX01PRFVMRSB2YXJpYW50IGlzCisJCSAqIGdlbmVyYXRlZCBldmVuIGZvciBib29sZWFucyBzbyB0aGF0IHRoZSBJU19FTkFCTEVEKCkgbWFjcm8KKwkJICogd29ya3MuCisJCSAqLworCQlmcHJpbnRmKGZwLCAiI2RlZmluZSBfX2VuYWJsZWRfIiBDT05GSUdfICIlcyAlZFxuIiwKKwkJCQlzeW0tPm5hbWUsICgqdmFsdWUgPT0gJ3knKSk7CisJCWZwcmludGYoZnAsICIjZGVmaW5lIF9fZW5hYmxlZF8iIENPTkZJR18gIiVzX01PRFVMRSAlZFxuIiwKKwkJCQlzeW0tPm5hbWUsICgqdmFsdWUgPT0gJ20nKSk7CisJCWJyZWFrOworCX0KKwljYXNlIFNfSEVYOiB7CisJCWNvbnN0IGNoYXIgKnByZWZpeCA9ICIiOworCisJCWlmICh2YWx1ZVswXSAhPSAnMCcgfHwgKHZhbHVlWzFdICE9ICd4JyAmJiB2YWx1ZVsxXSAhPSAnWCcpKQorCQkJcHJlZml4ID0gIjB4IjsKKwkJZnByaW50ZihmcCwgIiNkZWZpbmUgJXMlcyAlcyVzXG4iLAorCQkgICAgQ09ORklHXywgc3ltLT5uYW1lLCBwcmVmaXgsIHZhbHVlKTsKKwkJYnJlYWs7CisJfQogCWNhc2UgU19TVFJJTkc6Ci0JCWNvbmZfd3JpdGVfc3RyaW5nKGZhbHNlLCBzeW0tPm5hbWUsIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSksIG91dCk7Ci0JCWJyZWFrOwotCWNhc2UgU19IRVg6CiAJY2FzZSBTX0lOVDoKLQkJc3RyID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKLQkJZnByaW50ZihvdXQsICIlcyVzPSVzXG4iLCBDT05GSUdfLCBzeW0tPm5hbWUsIHN0cik7CisJCWZwcmludGYoZnAsICIjZGVmaW5lICVzJXMgJXNcbiIsCisJCSAgICBDT05GSUdfLCBzeW0tPm5hbWUsIHZhbHVlKTsKIAkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCit9CisKK3N0YXRpYyB2b2lkCitoZWFkZXJfcHJpbnRfY29tbWVudChGSUxFICpmcCwgY29uc3QgY2hhciAqdmFsdWUsIHZvaWQgKmFyZykKK3sKKwljb25zdCBjaGFyICpwID0gdmFsdWU7CisJc2l6ZV90IGw7CisKKwlmcHJpbnRmKGZwLCAiLypcbiIpOworCWZvciAoOzspIHsKKwkJbCA9IHN0cmNzcG4ocCwgIlxuIik7CisJCWZwcmludGYoZnAsICIgKiIpOworCQlpZiAobCkgeworCQkJZnByaW50ZihmcCwgIiAiKTsKKwkJCWZ3cml0ZShwLCBsLCAxLCBmcCk7CisJCQlwICs9IGw7CisJCX0KKwkJZnByaW50ZihmcCwgIlxuIik7CisJCWlmICgqcCsrID09ICdcMCcpCisJCQlicmVhazsKKwl9CisJZnByaW50ZihmcCwgIiAqL1xuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29uZl9wcmludGVyIGhlYWRlcl9wcmludGVyX2NiID0KK3sKKwkucHJpbnRfc3ltYm9sID0gaGVhZGVyX3ByaW50X3N5bWJvbCwKKwkucHJpbnRfY29tbWVudCA9IGhlYWRlcl9wcmludF9jb21tZW50LAorfTsKKworLyoKKyAqIFRyaXN0YXRlIHByaW50ZXIKKyAqCisgKiBUaGlzIHByaW50ZXIgaXMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIGBpbmNsdWRlL2NvbmZpZy90cmlzdGF0ZS5jb25mJyBmaWxlLgorICovCitzdGF0aWMgdm9pZAordHJpc3RhdGVfcHJpbnRfc3ltYm9sKEZJTEUgKmZwLCBzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKnZhbHVlLCB2b2lkICphcmcpCit7CisKKwlpZiAoc3ltLT50eXBlID09IFNfVFJJU1RBVEUgJiYgKnZhbHVlICE9ICduJykKKwkJZnByaW50ZihmcCwgIiVzJXM9JWNcbiIsIENPTkZJR18sIHN5bS0+bmFtZSwgKGNoYXIpdG91cHBlcigqdmFsdWUpKTsKK30KKworc3RhdGljIHN0cnVjdCBjb25mX3ByaW50ZXIgdHJpc3RhdGVfcHJpbnRlcl9jYiA9Cit7CisJLnByaW50X3N5bWJvbCA9IHRyaXN0YXRlX3ByaW50X3N5bWJvbCwKKwkucHJpbnRfY29tbWVudCA9IGtjb25maWdfcHJpbnRfY29tbWVudCwKK307CisKK3N0YXRpYyB2b2lkIGNvbmZfd3JpdGVfc3ltYm9sKEZJTEUgKmZwLCBzdHJ1Y3Qgc3ltYm9sICpzeW0sCisJCQkgICAgICBzdHJ1Y3QgY29uZl9wcmludGVyICpwcmludGVyLCB2b2lkICpwcmludGVyX2FyZykKK3sKKwljb25zdCBjaGFyICpzdHI7CisKKwlzd2l0Y2ggKHN5bS0+dHlwZSkgewogCWNhc2UgU19PVEhFUjoKIAljYXNlIFNfVU5LTk9XTjoKIAkJYnJlYWs7CisJY2FzZSBTX1NUUklORzoKKwkJc3RyID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKKwkJc3RyID0gc3ltX2VzY2FwZV9zdHJpbmdfdmFsdWUoc3RyKTsKKwkJcHJpbnRlci0+cHJpbnRfc3ltYm9sKGZwLCBzeW0sIHN0ciwgcHJpbnRlcl9hcmcpOworCQlmcmVlKCh2b2lkICopc3RyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RyID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKKwkJcHJpbnRlci0+cHJpbnRfc3ltYm9sKGZwLCBzeW0sIHN0ciwgcHJpbnRlcl9hcmcpOwogCX0KIH0KIAorc3RhdGljIHZvaWQKK2NvbmZfd3JpdGVfaGVhZGluZyhGSUxFICpmcCwgc3RydWN0IGNvbmZfcHJpbnRlciAqcHJpbnRlciwgdm9pZCAqcHJpbnRlcl9hcmcpCit7CisJY2hhciBidWZbMjU2XTsKKworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJICAgICJcbiIKKwkgICAgIkF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGU7IERPIE5PVCBFRElULlxuIgorCSAgICAiJXNcbiIsCisJICAgIHJvb3RtZW51LnByb21wdC0+dGV4dCk7CisKKwlwcmludGVyLT5wcmludF9jb21tZW50KGZwLCBidWYsIHByaW50ZXJfYXJnKTsKK30KKwogLyoKICAqIFdyaXRlIG91dCBhIG1pbmltYWwgY29uZmlnLgogICogQWxsIHZhbHVlcyB0aGF0IGhhcyBkZWZhdWx0IHZhbHVlcyBhcmUgc2tpcHBlZCBhcyB0aGlzIGlzIHJlZHVuZGFudC4KQEAgLTUzMSw3ICs2NzQsNyBAQAogCQkJCQkJZ290byBuZXh0X21lbnU7CiAJCQkJfQogCQkJfQotCQkJY29uZl93cml0ZV9zeW1ib2woc3ltLCBvdXQsIHRydWUpOworCQkJY29uZl93cml0ZV9zeW1ib2wob3V0LCBzeW0sICZrY29uZmlnX3ByaW50ZXJfY2IsIE5VTEwpOwogCQl9CiBuZXh0X21lbnU6CiAJCWlmIChtZW51LT5saXN0ICE9IE5VTEwpIHsKQEAgLTU5NiwxMSArNzM5LDcgQEAKIAlpZiAoIW91dCkKIAkJcmV0dXJuIDE7CiAKLQlmcHJpbnRmKG91dCwgXygiI1xuIgotCQkgICAgICAgIiMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXRcbiIKLQkJICAgICAgICIjICVzXG4iCi0JCSAgICAgICAiI1xuIiksCi0JCSAgICAgcm9vdG1lbnUucHJvbXB0LT50ZXh0KTsKKwljb25mX3dyaXRlX2hlYWRpbmcob3V0LCAma2NvbmZpZ19wcmludGVyX2NiLCBOVUxMKTsKIAogCWlmICghY29uZl9nZXRfY2hhbmdlZCgpKQogCQlzeW1fY2xlYXJfYWxsX3ZhbGlkKCk7CkBAIC02MjEsOCArNzYwLDggQEAKIAkJCWlmICghKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfV1JJVEUpKQogCQkJCWdvdG8gbmV4dDsKIAkJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9XUklURTsKLQkJCS8qIFdyaXRlIGNvbmZpZyBzeW1ib2wgdG8gZmlsZSAqLwotCQkJY29uZl93cml0ZV9zeW1ib2woc3ltLCBvdXQsIHRydWUpOworCisJCQljb25mX3dyaXRlX3N5bWJvbChvdXQsIHN5bSwgJmtjb25maWdfcHJpbnRlcl9jYiwgTlVMTCk7CiAJCX0KIAogbmV4dDoKQEAgLTc3MSw3ICs5MTAsNiBAQAogaW50IGNvbmZfd3JpdGVfYXV0b2NvbmYodm9pZCkKIHsKIAlzdHJ1Y3Qgc3ltYm9sICpzeW07Ci0JY29uc3QgY2hhciAqc3RyOwogCWNvbnN0IGNoYXIgKm5hbWU7CiAJRklMRSAqb3V0LCAqdHJpc3RhdGUsICpvdXRfaDsKIAlpbnQgaTsKQEAgLTgwMCw2OCArOTM4LDIzIEBACiAJCXJldHVybiAxOwogCX0KIAotCWZwcmludGYob3V0LCAiI1xuIgotCQkgICAgICIjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0XG4iCi0JCSAgICAgIiMgJXNcbiIKLQkJICAgICAiI1xuIiwKLQkJICAgICByb290bWVudS5wcm9tcHQtPnRleHQpOwotCWZwcmludGYodHJpc3RhdGUsICIjXG4iCi0JCQkgICIjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIC0gZG8gbm90IGVkaXRcbiIKLQkJCSAgIlxuIik7Ci0JZnByaW50ZihvdXRfaCwgIi8qXG4iCi0JCSAgICAgICAiICogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgQyBjb25maWc6IGRvbid0IGVkaXRcbiIKLQkJICAgICAgICIgKiAlc1xuIgotCQkgICAgICAgIiAqL1xuIiwKLQkJICAgICAgIHJvb3RtZW51LnByb21wdC0+dGV4dCk7CisJY29uZl93cml0ZV9oZWFkaW5nKG91dCwgJmtjb25maWdfcHJpbnRlcl9jYiwgTlVMTCk7CisKKwljb25mX3dyaXRlX2hlYWRpbmcodHJpc3RhdGUsICZ0cmlzdGF0ZV9wcmludGVyX2NiLCBOVUxMKTsKKworCWNvbmZfd3JpdGVfaGVhZGluZyhvdXRfaCwgJmhlYWRlcl9wcmludGVyX2NiLCBOVUxMKTsKIAogCWZvcl9hbGxfc3ltYm9scyhpLCBzeW0pIHsKIAkJc3ltX2NhbGNfdmFsdWUoc3ltKTsKIAkJaWYgKCEoc3ltLT5mbGFncyAmIFNZTUJPTF9XUklURSkgfHwgIXN5bS0+bmFtZSkKIAkJCWNvbnRpbnVlOwogCi0JCS8qIHdyaXRlIHN5bWJvbCB0byBjb25maWcgZmlsZSAqLwotCQljb25mX3dyaXRlX3N5bWJvbChzeW0sIG91dCwgZmFsc2UpOworCQkvKiB3cml0ZSBzeW1ib2wgdG8gYXV0by5jb25mLCB0cmlzdGF0ZSBhbmQgaGVhZGVyIGZpbGVzICovCisJCWNvbmZfd3JpdGVfc3ltYm9sKG91dCwgc3ltLCAma2NvbmZpZ19wcmludGVyX2NiLCAodm9pZCAqKTEpOwogCi0JCS8qIHVwZGF0ZSBhdXRvY29uZiBhbmQgdHJpc3RhdGUgZmlsZXMgKi8KLQkJc3dpdGNoIChzeW0tPnR5cGUpIHsKLQkJY2FzZSBTX0JPT0xFQU46Ci0JCWNhc2UgU19UUklTVEFURToKLQkJCXN3aXRjaCAoc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pKSB7Ci0JCQljYXNlIG5vOgotCQkJCWJyZWFrOwotCQkJY2FzZSBtb2Q6Ci0JCQkJZnByaW50Zih0cmlzdGF0ZSwgIiVzJXM9TVxuIiwKLQkJCQkgICAgQ09ORklHXywgc3ltLT5uYW1lKTsKLQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSAlcyVzX01PRFVMRSAxXG4iLAotCQkJCSAgICBDT05GSUdfLCBzeW0tPm5hbWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSB5ZXM6Ci0JCQkJaWYgKHN5bS0+dHlwZSA9PSBTX1RSSVNUQVRFKQotCQkJCQlmcHJpbnRmKHRyaXN0YXRlLCIlcyVzPVlcbiIsCi0JCQkJCSAgICBDT05GSUdfLCBzeW0tPm5hbWUpOwotCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lICVzJXMgMVxuIiwKLQkJCQkgICAgQ09ORklHXywgc3ltLT5uYW1lKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFNfU1RSSU5HOgotCQkJY29uZl93cml0ZV9zdHJpbmcodHJ1ZSwgc3ltLT5uYW1lLCBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pLCBvdXRfaCk7Ci0JCQlicmVhazsKLQkJY2FzZSBTX0hFWDoKLQkJCXN0ciA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7Ci0JCQlpZiAoc3RyWzBdICE9ICcwJyB8fCAoc3RyWzFdICE9ICd4JyAmJiBzdHJbMV0gIT0gJ1gnKSkgewotCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lICVzJXMgMHglc1xuIiwKLQkJCQkgICAgQ09ORklHXywgc3ltLT5uYW1lLCBzdHIpOwotCQkJCWJyZWFrOwotCQkJfQotCQljYXNlIFNfSU5UOgotCQkJc3RyID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKLQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lICVzJXMgJXNcbiIsCi0JCQkgICAgQ09ORklHXywgc3ltLT5uYW1lLCBzdHIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQorCQljb25mX3dyaXRlX3N5bWJvbCh0cmlzdGF0ZSwgc3ltLCAmdHJpc3RhdGVfcHJpbnRlcl9jYiwgKHZvaWQgKikxKTsKKworCQljb25mX3dyaXRlX3N5bWJvbChvdXRfaCwgc3ltLCAmaGVhZGVyX3ByaW50ZXJfY2IsIE5VTEwpOwogCX0KIAlmY2xvc2Uob3V0KTsKIAlmY2xvc2UodHJpc3RhdGUpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2V4cHIuYyBiL3NjcmlwdHMva2NvbmZpZy9leHByLmMKaW5kZXggMDAxMDAzNC4uMjkwY2U0MSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2V4cHIuYworKysgYi9zY3JpcHRzL2tjb25maWcvZXhwci5jCkBAIC03LDE1ICs3LDEzIEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLSNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCiAjaW5jbHVkZSAibGtjLmgiCiAKICNkZWZpbmUgREVCVUdfRVhQUgkwCiAKIHN0cnVjdCBleHByICpleHByX2FsbG9jX3N5bWJvbChzdHJ1Y3Qgc3ltYm9sICpzeW0pCiB7Ci0Jc3RydWN0IGV4cHIgKmUgPSBtYWxsb2Moc2l6ZW9mKCplKSk7Ci0JbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOworCXN0cnVjdCBleHByICplID0gY2FsbG9jKDEsIHNpemVvZigqZSkpOwogCWUtPnR5cGUgPSBFX1NZTUJPTDsKIAllLT5sZWZ0LnN5bSA9IHN5bTsKIAlyZXR1cm4gZTsKQEAgLTIzLDggKzIxLDcgQEAKIAogc3RydWN0IGV4cHIgKmV4cHJfYWxsb2Nfb25lKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBleHByICpjZSkKIHsKLQlzdHJ1Y3QgZXhwciAqZSA9IG1hbGxvYyhzaXplb2YoKmUpKTsKLQltZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7CisJc3RydWN0IGV4cHIgKmUgPSBjYWxsb2MoMSwgc2l6ZW9mKCplKSk7CiAJZS0+dHlwZSA9IHR5cGU7CiAJZS0+bGVmdC5leHByID0gY2U7CiAJcmV0dXJuIGU7CkBAIC0zMiw4ICsyOSw3IEBACiAKIHN0cnVjdCBleHByICpleHByX2FsbG9jX3R3byhlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMikKIHsKLQlzdHJ1Y3QgZXhwciAqZSA9IG1hbGxvYyhzaXplb2YoKmUpKTsKLQltZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7CisJc3RydWN0IGV4cHIgKmUgPSBjYWxsb2MoMSwgc2l6ZW9mKCplKSk7CiAJZS0+dHlwZSA9IHR5cGU7CiAJZS0+bGVmdC5leHByID0gZTE7CiAJZS0+cmlnaHQuZXhwciA9IGUyOwpAQCAtNDIsOCArMzgsNyBAQAogCiBzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19jb21wKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBzeW1ib2wgKnMxLCBzdHJ1Y3Qgc3ltYm9sICpzMikKIHsKLQlzdHJ1Y3QgZXhwciAqZSA9IG1hbGxvYyhzaXplb2YoKmUpKTsKLQltZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7CisJc3RydWN0IGV4cHIgKmUgPSBjYWxsb2MoMSwgc2l6ZW9mKCplKSk7CiAJZS0+dHlwZSA9IHR5cGU7CiAJZS0+bGVmdC5zeW0gPSBzMTsKIAllLT5yaWdodC5zeW0gPSBzMjsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9leHByLmggYi9zY3JpcHRzL2tjb25maWcvZXhwci5oCmluZGV4IDE2YmZhZTIuLjgwZmNlNTcgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9leHByLmgKKysrIGIvc2NyaXB0cy9rY29uZmlnL2V4cHIuaApAQCAtMTcyLDggKzE3Miw2IEBACiAjZGVmaW5lIE1FTlVfQ0hBTkdFRAkJMHgwMDAxCiAjZGVmaW5lIE1FTlVfUk9PVAkJMHgwMDAyCiAKLSNpZm5kZWYgU1dJRwotCiBleHRlcm4gc3RydWN0IGZpbGUgKmZpbGVfbGlzdDsKIGV4dGVybiBzdHJ1Y3QgZmlsZSAqY3VycmVudF9maWxlOwogc3RydWN0IGZpbGUgKmxvb2t1cF9maWxlKGNvbnN0IGNoYXIgKm5hbWUpOwpAQCAtMjE4LDcgKzIxNiw2IEBACiB7CiAJcmV0dXJuIGUgJiYgKGUtPnR5cGUgPT0gRV9TWU1CT0wgJiYgZS0+bGVmdC5zeW0gPT0gJnN5bWJvbF9ubyk7CiB9Ci0jZW5kaWYKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvZ2NvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9nY29uZi5jCmluZGV4IGExMWQ1ZjcuLjlmNDQzODAgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9nY29uZi5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9nY29uZi5jCkBAIC0yODUsOCArMjg1LDYgQEAKIHN0YXRpYyB2b2lkIHJlbmRlcmVyX2VkaXRlZChHdGtDZWxsUmVuZGVyZXJUZXh0ICogY2VsbCwKIAkJCSAgICBjb25zdCBnY2hhciAqIHBhdGhfc3RyaW5nLAogCQkJICAgIGNvbnN0IGdjaGFyICogbmV3X3RleHQsIGdwb2ludGVyIHVzZXJfZGF0YSk7Ci1zdGF0aWMgdm9pZCByZW5kZXJlcl90b2dnbGVkKEd0a0NlbGxSZW5kZXJlclRvZ2dsZSAqIGNlbGxyZW5kZXJlcnRvZ2dsZSwKLQkJCSAgICAgZ2NoYXIgKiBhcmcxLCBncG9pbnRlciB1c2VyX2RhdGEpOwogCiB2b2lkIGluaXRfcmlnaHRfdHJlZSh2b2lkKQogewpAQCAtMzIwLDggKzMxOCw2IEBACiAJCQkJCSAgICAiaW5jb25zaXN0ZW50IiwgQ09MX0JUTklOQywKIAkJCQkJICAgICJ2aXNpYmxlIiwgQ09MX0JUTlZJUywKIAkJCQkJICAgICJyYWRpbyIsIENPTF9CVE5SQUQsIE5VTEwpOwotCS8qZ19zaWduYWxfY29ubmVjdChHX09CSkVDVChyZW5kZXJlciksICJ0b2dnbGVkIiwKLQkgICBHX0NBTExCQUNLKHJlbmRlcmVyX3RvZ2dsZWQpLCBOVUxMKTsgKi8KIAlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3RleHRfbmV3KCk7CiAJZ3RrX3RyZWVfdmlld19jb2x1bW5fcGFja19zdGFydChHVEtfVFJFRV9WSUVXX0NPTFVNTihjb2x1bW4pLAogCQkJCQlyZW5kZXJlciwgRkFMU0UpOwpAQCAtODg4LDM1ICs4ODQsNiBAQAogCQlkaXNwbGF5X3RyZWVfcGFydCgpOwkvL2ZpeG1lOiBrZWVwIGV4cC9jb2xsCiB9CiAKLXN0YXRpYyB2b2lkIHJlbmRlcmVyX3RvZ2dsZWQoR3RrQ2VsbFJlbmRlcmVyVG9nZ2xlICogY2VsbCwKLQkJCSAgICAgZ2NoYXIgKiBwYXRoX3N0cmluZywgZ3BvaW50ZXIgdXNlcl9kYXRhKQotewotCUd0a1RyZWVQYXRoICpwYXRoLCAqc2VsX3BhdGggPSBOVUxMOwotCUd0a1RyZWVJdGVyIGl0ZXIsIHNlbF9pdGVyOwotCUd0a1RyZWVTZWxlY3Rpb24gKnNlbDsKLQlzdHJ1Y3QgbWVudSAqbWVudTsKLQotCXBhdGggPSBndGtfdHJlZV9wYXRoX25ld19mcm9tX3N0cmluZyhwYXRoX3N0cmluZyk7Ci0JaWYgKCFndGtfdHJlZV9tb2RlbF9nZXRfaXRlcihtb2RlbDIsICZpdGVyLCBwYXRoKSkKLQkJcmV0dXJuOwotCi0Jc2VsID0gZ3RrX3RyZWVfdmlld19nZXRfc2VsZWN0aW9uKEdUS19UUkVFX1ZJRVcodHJlZTJfdykpOwotCWlmIChndGtfdHJlZV9zZWxlY3Rpb25fZ2V0X3NlbGVjdGVkKHNlbCwgTlVMTCwgJnNlbF9pdGVyKSkKLQkJc2VsX3BhdGggPSBndGtfdHJlZV9tb2RlbF9nZXRfcGF0aChtb2RlbDIsICZzZWxfaXRlcik7Ci0JaWYgKCFzZWxfcGF0aCkKLQkJZ290byBvdXQxOwotCWlmIChndGtfdHJlZV9wYXRoX2NvbXBhcmUocGF0aCwgc2VsX3BhdGgpKQotCQlnb3RvIG91dDI7Ci0KLQlndGtfdHJlZV9tb2RlbF9nZXQobW9kZWwyLCAmaXRlciwgQ09MX01FTlUsICZtZW51LCAtMSk7Ci0JdG9nZ2xlX3N5bV92YWx1ZShtZW51KTsKLQotICAgICAgb3V0MjoKLQlndGtfdHJlZV9wYXRoX2ZyZWUoc2VsX3BhdGgpOwotICAgICAgb3V0MToKLQlndGtfdHJlZV9wYXRoX2ZyZWUocGF0aCk7Ci19Ci0KIHN0YXRpYyBnaW50IGNvbHVtbjJpbmRleChHdGtUcmVlVmlld0NvbHVtbiAqIGNvbHVtbikKIHsKIAlnaW50IGk7CkBAIC0xMTcyLDYgKzExMzksNyBAQAogCQkJcm93W0NPTF9CVE5WSVNdID0gR0lOVF9UT19QT0lOVEVSKFRSVUUpOwogCQlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKQogCQkJYnJlYWs7CisJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgU19UUklTVEFURToKIAkJdmFsID0gc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pOwogCQlzd2l0Y2ggKHZhbCkgewpAQCAtMTUwNiwxMCArMTQ3NCw2IEBACiAJY2hhciAqZW52OwogCWdjaGFyICpnbGFkZV9maWxlOwogCi0jaWZuZGVmIExLQ19ESVJFQ1RfTElOSwotCWtjb25maWdfbG9hZCgpOwotI2VuZGlmCi0KIAliaW5kdGV4dGRvbWFpbihQQUNLQUdFLCBMT0NBTEVESVIpOwogCWJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KFBBQ0tBR0UsICJVVEYtOCIpOwogCXRleHRkb21haW4oUEFDS0FHRSk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcva2NvbmZpZ19sb2FkLmMgYi9zY3JpcHRzL2tjb25maWcva2NvbmZpZ19sb2FkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZGNhYWQuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2tjb25maWdfbG9hZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgImxrYy5oIgotCi0jZGVmaW5lIFAobmFtZSx0eXBlLGFyZykJdHlwZSAoKm5hbWUgIyMgX3ApIGFyZwotI2luY2x1ZGUgImxrY19wcm90by5oIgotI3VuZGVmIFAKLQotdm9pZCBrY29uZmlnX2xvYWQodm9pZCkKLXsKLQl2b2lkICpoYW5kbGU7Ci0JY2hhciAqZXJyb3I7Ci0KLQloYW5kbGUgPSBkbG9wZW4oIi4vbGlia2NvbmZpZy5zbyIsIFJUTERfTEFaWSk7Ci0JaWYgKCFoYW5kbGUpIHsKLQkJaGFuZGxlID0gZGxvcGVuKCIuL3NjcmlwdHMva2NvbmZpZy9saWJrY29uZmlnLnNvIiwgUlRMRF9MQVpZKTsKLQkJaWYgKCFoYW5kbGUpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGRsZXJyb3IoKSk7Ci0JCQlleGl0KDEpOwotCQl9Ci0JfQotCi0jZGVmaW5lIFAobmFtZSx0eXBlLGFyZykJCQlcCi17CQkJCQkJXAotCW5hbWUgIyMgX3AgPSBkbHN5bShoYW5kbGUsICNuYW1lKTsJXAotICAgICAgICBpZiAoKGVycm9yID0gZGxlcnJvcigpKSkgIHsJCVwKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBlcnJvcik7CVwKLQkJZXhpdCgxKTsJCQlcCi0JfQkJCQkJXAotfQotI2luY2x1ZGUgImxrY19wcm90by5oIgotI3VuZGVmIFAKLX0KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9reGdldHRleHQuYyBiL3NjcmlwdHMva2NvbmZpZy9reGdldHRleHQuYwppbmRleCBlOWQ4ZTc5Li4yODU4NzM4IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcva3hnZXR0ZXh0LmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2t4Z2V0dGV4dC5jCkBAIC03LDcgKzcsNiBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCi0jZGVmaW5lIExLQ19ESVJFQ1RfTElOSwogI2luY2x1ZGUgImxrYy5oIgogCiBzdGF0aWMgY2hhciAqZXNjYXBlKGNvbnN0IGNoYXIqIHRleHQsIGNoYXIgKmJmLCBpbnQgbGVuKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2xrYy5oIGIvc2NyaXB0cy9rY29uZmlnL2xrYy5oCmluZGV4IGYzNGEwYTkuLmI2MzNiZGIgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9sa2MuaAorKysgYi9zY3JpcHRzL2tjb25maWcvbGtjLmgKQEAgLTIxLDEyICsyMSw3IEBACiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi0jaWZkZWYgTEtDX0RJUkVDVF9MSU5LCiAjZGVmaW5lIFAobmFtZSx0eXBlLGFyZykJZXh0ZXJuIHR5cGUgbmFtZSBhcmcKLSNlbHNlCi0jaW5jbHVkZSAibGtjX2RlZnMuaCIKLSNkZWZpbmUgUChuYW1lLHR5cGUsYXJnKQlleHRlcm4gdHlwZSAoKm5hbWUgIyMgX3ApIGFyZwotI2VuZGlmCiAjaW5jbHVkZSAibGtjX3Byb3RvLmgiCiAjdW5kZWYgUAogCkBAIC03OSw5ICs3NCw2IEBACiBpbnQgemNvbmZfbGluZW5vKHZvaWQpOwogY29uc3QgY2hhciAqemNvbmZfY3VybmFtZSh2b2lkKTsKIAotLyogY29uZi5jICovCi12b2lkIHhmZ2V0cyhjaGFyICpzdHIsIGludCBzaXplLCBGSUxFICppbik7Ci0KIC8qIGNvbmZkYXRhLmMgKi8KIGNvbnN0IGNoYXIgKmNvbmZfZ2V0X2NvbmZpZ25hbWUodm9pZCk7CiBjb25zdCBjaGFyICpjb25mX2dldF9hdXRvY29uZmlnX25hbWUodm9pZCk7CkBAIC05MCw2ICs4MiwxMSBAQAogdm9pZCBzeW1fYWRkX2NoYW5nZV9jb3VudChpbnQgY291bnQpOwogdm9pZCBjb25mX3NldF9hbGxfbmV3X3N5bWJvbHMoZW51bSBjb25mX2RlZl9tb2RlIG1vZGUpOwogCitzdHJ1Y3QgY29uZl9wcmludGVyIHsKKwl2b2lkICgqcHJpbnRfc3ltYm9sKShGSUxFICosIHN0cnVjdCBzeW1ib2wgKiwgY29uc3QgY2hhciAqLCB2b2lkICopOworCXZvaWQgKCpwcmludF9jb21tZW50KShGSUxFICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKK307CisKIC8qIGNvbmZkYXRhLmMgYW5kIGV4cHIuYyAqLwogc3RhdGljIGlubGluZSB2b2lkIHhmd3JpdGUoY29uc3Qgdm9pZCAqc3RyLCBzaXplX3QgbGVuLCBzaXplX3QgY291bnQsIEZJTEUgKm91dCkKIHsKQEAgLTk3LDkgKzk0LDYgQEAKIAkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIGluIHdyaXRpbmcgb3IgZW5kIG9mIGZpbGUuXG4iKTsKIH0KIAotLyoga2NvbmZpZ19sb2FkLmMgKi8KLXZvaWQga2NvbmZpZ19sb2FkKHZvaWQpOwotCiAvKiBtZW51LmMgKi8KIHZvaWQgX21lbnVfaW5pdCh2b2lkKTsKIHZvaWQgbWVudV93YXJuKHN0cnVjdCBtZW51ICptZW51LCBjb25zdCBjaGFyICpmbXQsIC4uLik7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbGtjX3Byb3RvLmggYi9zY3JpcHRzL2tjb25maWcvbGtjX3Byb3RvLmgKaW5kZXggMTczNDJmZS4uNDdmZTljMyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2xrY19wcm90by5oCisrKyBiL3NjcmlwdHMva2NvbmZpZy9sa2NfcHJvdG8uaApAQCAtMzEsNiArMzEsNyBAQAogUChzeW1fbG9va3VwLHN0cnVjdCBzeW1ib2wgKiwoY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzKSk7CiBQKHN5bV9maW5kLHN0cnVjdCBzeW1ib2wgKiwoY29uc3QgY2hhciAqbmFtZSkpOwogUChzeW1fZXhwYW5kX3N0cmluZ192YWx1ZSxjb25zdCBjaGFyICosKGNvbnN0IGNoYXIgKmluKSk7CitQKHN5bV9lc2NhcGVfc3RyaW5nX3ZhbHVlLCBjb25zdCBjaGFyICosKGNvbnN0IGNoYXIgKmluKSk7CiBQKHN5bV9yZV9zZWFyY2gsc3RydWN0IHN5bWJvbCAqKiwoY29uc3QgY2hhciAqcGF0dGVybikpOwogUChzeW1fdHlwZV9uYW1lLGNvbnN0IGNoYXIgKiwoZW51bSBzeW1ib2xfdHlwZSB0eXBlKSk7CiBQKHN5bV9jYWxjX3ZhbHVlLHZvaWQsKHN0cnVjdCBzeW1ib2wgKnN5bSkpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL21jb25mLmMgYi9zY3JpcHRzL2tjb25maWcvbWNvbmYuYwppbmRleCBkNDMzYzdhLi44MjBkMmI2IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbWNvbmYuYworKysgYi9zY3JpcHRzL2tjb25maWcvbWNvbmYuYwpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGxvY2FsZS5oPgogCi0jZGVmaW5lIExLQ19ESVJFQ1RfTElOSwogI2luY2x1ZGUgImxrYy5oIgogI2luY2x1ZGUgImx4ZGlhbG9nL2RpYWxvZy5oIgogCkBAIC04NDUsNiArODQ0LDcgQEAKIAkJCQkiXG5cbiIpKTsKIAkJCXJldHVybiAxOwogCQl9CisJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgLTE6CiAJCXByaW50ZihfKCJcblxuIgogCQkJIioqKiBFbmQgb2YgdGhlIGNvbmZpZ3VyYXRpb24uXG4iCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbWVudS5jIGIvc2NyaXB0cy9rY29uZmlnL21lbnUuYwppbmRleCA1ZmRmMTBkLi5kNjYwMDg2IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbWVudS5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9tZW51LmMKQEAgLTMsMTAgKzMsMTEgQEAKICAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgogICovCiAKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCi0jZGVmaW5lIExLQ19ESVJFQ1RfTElOSwogI2luY2x1ZGUgImxrYy5oIgogCiBzdGF0aWMgY29uc3QgY2hhciBub2hlbHBfdGV4dFtdID0gTl8oCkBAIC0zNTAsNyArMzUxLDcgQEAKIAkJCWxhc3RfbWVudS0+bmV4dCA9IE5VTEw7CiAJCX0KIAotCQlzeW0tPmRpcl9kZXAuZXhwciA9IHBhcmVudC0+ZGVwOworCQlzeW0tPmRpcl9kZXAuZXhwciA9IGV4cHJfYWxsb2Nfb3Ioc3ltLT5kaXJfZGVwLmV4cHIsIHBhcmVudC0+ZGVwKTsKIAl9CiAJZm9yIChtZW51ID0gcGFyZW50LT5saXN0OyBtZW51OyBtZW51ID0gbWVudS0+bmV4dCkgewogCQlpZiAoc3ltICYmIHN5bV9pc19jaG9pY2Uoc3ltKSAmJgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL25jb25mLmMgYi9zY3JpcHRzL2tjb25maWcvbmNvbmYuYwppbmRleCA0ODhkZDc0Li4zOWNhMWYxIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbmNvbmYuYworKysgYi9zY3JpcHRzL2tjb25maWcvbmNvbmYuYwpAQCAtNyw3ICs3LDcgQEAKICAqLwogI2RlZmluZSBfR05VX1NPVVJDRQogI2luY2x1ZGUgPHN0cmluZy5oPgotI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKwogI2luY2x1ZGUgImxrYy5oIgogI2luY2x1ZGUgIm5jb25mLmgiCiAjaW5jbHVkZSA8Y3R5cGUuaD4KQEAgLTEwNjcsNyArMTA2Nyw2IEBACiAJc3RydWN0IG1lbnUgKnN1Ym1lbnUgPSAwOwogCWNvbnN0IGNoYXIgKnByb21wdCA9IG1lbnVfZ2V0X3Byb21wdChtZW51KTsKIAlzdHJ1Y3Qgc3ltYm9sICpzeW07Ci0Jc3RydWN0IG1lbnUgKmFjdGl2ZV9tZW51ID0gTlVMTDsKIAlpbnQgcmVzOwogCWludCBjdXJyZW50X2luZGV4ID0gMDsKIAlpbnQgbGFzdF90b3Bfcm93ID0gMDsKQEAgLTExNTIsMTMgKzExNTEsOSBAQAogCQkJY29udGludWU7CiAKIAkJc3VibWVudSA9IChzdHJ1Y3QgbWVudSAqKSBpdGVtX2RhdGEoKTsKLQkJYWN0aXZlX21lbnUgPSAoc3RydWN0IG1lbnUgKilpdGVtX2RhdGEoKTsKIAkJaWYgKCFzdWJtZW51IHx8ICFtZW51X2lzX3Zpc2libGUoc3VibWVudSkpCiAJCQljb250aW51ZTsKLQkJaWYgKHN1Ym1lbnUpCi0JCQlzeW0gPSBzdWJtZW51LT5zeW07Ci0JCWVsc2UKLQkJCXN5bSA9IE5VTEw7CisJCXN5bSA9IHN1Ym1lbnUtPnN5bTsKIAogCQlzd2l0Y2ggKHJlcykgewogCQljYXNlICcgJzoKQEAgLTEyMjIsMjAgKzEyMTcsMTMgQEAKIAogc3RhdGljIHZvaWQgc2hvd19oZWxwKHN0cnVjdCBtZW51ICptZW51KQogewotCXN0cnVjdCBnc3RyIGhlbHAgPSBzdHJfbmV3KCk7CisJc3RydWN0IGdzdHIgaGVscDsKIAotCWlmIChtZW51ICYmIG1lbnUtPnN5bSAmJiBtZW51X2hhc19oZWxwKG1lbnUpKSB7Ci0JCWlmIChtZW51LT5zeW0tPm5hbWUpIHsKLQkJCXN0cl9wcmludGYoJmhlbHAsICIlcyVzOlxuXG4iLCBDT05GSUdfLCBtZW51LT5zeW0tPm5hbWUpOwotCQkJc3RyX2FwcGVuZCgmaGVscCwgXyhtZW51X2dldF9oZWxwKG1lbnUpKSk7Ci0JCQlzdHJfYXBwZW5kKCZoZWxwLCAiXG4iKTsKLQkJCWdldF9zeW1ib2xfc3RyKCZoZWxwLCBtZW51LT5zeW0pOwotCQl9IGVsc2UgewotCQkJc3RyX2FwcGVuZCgmaGVscCwgXyhtZW51X2dldF9oZWxwKG1lbnUpKSk7Ci0JCX0KLQl9IGVsc2UgewotCQlzdHJfYXBwZW5kKCZoZWxwLCBub2hlbHBfdGV4dCk7Ci0JfQorCWlmICghbWVudSkKKwkJcmV0dXJuOworCisJaGVscCA9IHN0cl9uZXcoKTsKKwltZW51X2dldF9leHRfaGVscChtZW51LCAmaGVscCk7CiAJc2hvd19zY3JvbGxfd2luKG1haW5fd2luZG93LCBfKG1lbnVfZ2V0X3Byb21wdChtZW51KSksIHN0cl9nZXQoJmhlbHApKTsKIAlzdHJfZnJlZSgmaGVscCk7CiB9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvcWNvbmYuY2MgYi9zY3JpcHRzL2tjb25maWcvcWNvbmYuY2MKaW5kZXggYzI3OTZiOC4uZGYyNzRmZSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmNjCisrKyBiL3NjcmlwdHMva2NvbmZpZy9xY29uZi5jYwpAQCAtMTQ3OCwxMCArMTQ3OCwxMyBAQAogCUNvbmZpZ1ZpZXc6OnVwZGF0ZUxpc3RBbGwoKTsKIH0KIAotdm9pZCBDb25maWdNYWluV2luZG93OjpzYXZlQ29uZmlnKHZvaWQpCitib29sIENvbmZpZ01haW5XaW5kb3c6OnNhdmVDb25maWcodm9pZCkKIHsKLQlpZiAoY29uZl93cml0ZShOVUxMKSkKKwlpZiAoY29uZl93cml0ZShOVUxMKSkgewogCQlRTWVzc2FnZUJveDo6aW5mb3JtYXRpb24odGhpcywgInFjb25mIiwgXygiVW5hYmxlIHRvIHNhdmUgY29uZmlndXJhdGlvbiEiKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2F2ZUNvbmZpZ0FzKHZvaWQpCkBAIC0xNjQyLDcgKzE2NDUsMTEgQEAKIAltYi5zZXRCdXR0b25UZXh0KFFNZXNzYWdlQm94OjpDYW5jZWwsIF8oIkNhbmNlbCBFeGl0IikpOwogCXN3aXRjaCAobWIuZXhlYygpKSB7CiAJY2FzZSBRTWVzc2FnZUJveDo6WWVzOgotCQlzYXZlQ29uZmlnKCk7CisJCWlmIChzYXZlQ29uZmlnKCkpCisJCQllLT5hY2NlcHQoKTsKKwkJZWxzZQorCQkJZS0+aWdub3JlKCk7CisJCWJyZWFrOwogCWNhc2UgUU1lc3NhZ2VCb3g6Ok5vOgogCQllLT5hY2NlcHQoKTsKIAkJYnJlYWs7CkBAIC0xNzQ1LDEwICsxNzUyLDYgQEAKIAliaW5kdGV4dGRvbWFpbihQQUNLQUdFLCBMT0NBTEVESVIpOwogCXRleHRkb21haW4oUEFDS0FHRSk7CiAKLSNpZm5kZWYgTEtDX0RJUkVDVF9MSU5LCi0Ja2NvbmZpZ19sb2FkKCk7Ci0jZW5kaWYKLQogCXByb2duYW1lID0gYXZbMF07CiAJY29uZmlnQXBwID0gbmV3IFFBcHBsaWNhdGlvbihhYywgYXYpOwogCWlmIChhYyA+IDEgJiYgYXZbMV1bMF0gPT0gJy0nKSB7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvcWNvbmYuaCBiL3NjcmlwdHMva2NvbmZpZy9xY29uZi5oCmluZGV4IDkxNjc3ZDkuLjM3MTViM2UgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9xY29uZi5oCisrKyBiL3NjcmlwdHMva2NvbmZpZy9xY29uZi5oCkBAIC0zMTEsNyArMzExLDcgQEAKIAl2b2lkIGxpc3RGb2N1c0NoYW5nZWQodm9pZCk7CiAJdm9pZCBnb0JhY2sodm9pZCk7CiAJdm9pZCBsb2FkQ29uZmlnKHZvaWQpOwotCXZvaWQgc2F2ZUNvbmZpZyh2b2lkKTsKKwlib29sIHNhdmVDb25maWcodm9pZCk7CiAJdm9pZCBzYXZlQ29uZmlnQXModm9pZCk7CiAJdm9pZCBzZWFyY2hDb25maWcodm9pZCk7CiAJdm9pZCBzaG93U2luZ2xlVmlldyh2b2lkKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYyBiL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYwppbmRleCBhNzk2Yzk1Li4wNzFmMDBjIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL3N5bWJvbC5jCkBAIC05LDcgKzksNiBAQAogI2luY2x1ZGUgPHJlZ2V4Lmg+CiAjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KIAotI2RlZmluZSBMS0NfRElSRUNUX0xJTksKICNpbmNsdWRlICJsa2MuaCIKIAogc3RydWN0IHN5bWJvbCBzeW1ib2xfeWVzID0gewpAQCAtNzUxLDcgKzc1MCw4IEBACiAJCWNhc2Ugbm86CiAJCQlyZXR1cm4gIm4iOwogCQljYXNlIG1vZDoKLQkJCXJldHVybiAibSI7CisJCQlzeW1fY2FsY192YWx1ZShtb2R1bGVzX3N5bSk7CisJCQlyZXR1cm4gKG1vZHVsZXNfc3ltLT5jdXJyLnRyaSA9PSBubykgPyAibiIgOiAibSI7CiAJCWNhc2UgeWVzOgogCQkJcmV0dXJuICJ5IjsKIAkJfQpAQCAtODkzLDYgKzg5Myw0OSBAQAogCXJldHVybiByZXM7CiB9CiAKK2NvbnN0IGNoYXIgKnN5bV9lc2NhcGVfc3RyaW5nX3ZhbHVlKGNvbnN0IGNoYXIgKmluKQoreworCWNvbnN0IGNoYXIgKnA7CisJc2l6ZV90IHJlc2xlbjsKKwljaGFyICpyZXM7CisJc2l6ZV90IGw7CisKKwlyZXNsZW4gPSBzdHJsZW4oaW4pICsgc3RybGVuKCJcIlwiIikgKyAxOworCisJcCA9IGluOworCWZvciAoOzspIHsKKwkJbCA9IHN0cmNzcG4ocCwgIlwiXFwiKTsKKwkJcCArPSBsOworCisJCWlmIChwWzBdID09ICdcMCcpCisJCQlicmVhazsKKworCQlyZXNsZW4rKzsKKwkJcCsrOworCX0KKworCXJlcyA9IG1hbGxvYyhyZXNsZW4pOworCXJlc1swXSA9ICdcMCc7CisKKwlzdHJjYXQocmVzLCAiXCIiKTsKKworCXAgPSBpbjsKKwlmb3IgKDs7KSB7CisJCWwgPSBzdHJjc3BuKHAsICJcIlxcIik7CisJCXN0cm5jYXQocmVzLCBwLCBsKTsKKwkJcCArPSBsOworCisJCWlmIChwWzBdID09ICdcMCcpCisJCQlicmVhazsKKworCQlzdHJjYXQocmVzLCAiXFwiKTsKKwkJc3RybmNhdChyZXMsIHArKywgMSk7CisJfQorCisJc3RyY2F0KHJlcywgIlwiIik7CisJcmV0dXJuIHJlczsKK30KKwogc3RydWN0IHN5bWJvbCAqKnN5bV9yZV9zZWFyY2goY29uc3QgY2hhciAqcGF0dGVybikKIHsKIAlzdHJ1Y3Qgc3ltYm9sICpzeW0sICoqc3ltX2FyciA9IE5VTEw7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvdXRpbC5jIGIvc2NyaXB0cy9rY29uZmlnL3V0aWwuYwppbmRleCA2MzMwY2M4Li5kMGI4YjIzIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvdXRpbC5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy91dGlsLmMKQEAgLTUsNiArNSw4IEBACiAgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KICAqLwogCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAibGtjLmgiCiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi5sIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLmwKaW5kZXggZGRlZTVmYy4uMDBmOWQzYSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLmwKKysrIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLmwKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2RlZmluZSBMS0NfRElSRUNUX0xJTksKICNpbmNsdWRlICJsa2MuaCIKIAogI2RlZmluZSBTVEFSVF9TVFJTSVpFCTE2CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvemNvbmYubGV4LmNfc2hpcHBlZCBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi5sZXguY19zaGlwcGVkCmluZGV4IDkwNmMwOTkuLmMzMmIxYTQgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi5sZXguY19zaGlwcGVkCisrKyBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi5sZXguY19zaGlwcGVkCkBAIC03NzYsNyArNzc2LDYgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2RlZmluZSBMS0NfRElSRUNUX0xJTksKICNpbmNsdWRlICJsa2MuaCIKIAogI2RlZmluZSBTVEFSVF9TVFJTSVpFCTE2CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvemNvbmYudGFiLmNfc2hpcHBlZCBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi50YWIuY19zaGlwcGVkCmluZGV4IDIxMWUxYTIuLmY2MzYxNDEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi50YWIuY19zaGlwcGVkCisrKyBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi50YWIuY19zaGlwcGVkCkBAIC04Nyw3ICs4Nyw2IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkYm9vbC5oPgogCi0jZGVmaW5lIExLQ19ESVJFQ1RfTElOSwogI2luY2x1ZGUgImxrYy5oIgogCiAjZGVmaW5lIHByaW50ZChtYXNrLCBmbXQuLi4pIGlmIChjZGVidWcgJiAobWFzaykpIHByaW50ZihmbXQpCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvemNvbmYueSBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi55CmluZGV4IGMzOGNjNWEuLjg2NGRhMDcgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi55CisrKyBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi55CkBAIC0xMSw3ICsxMSw2IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkYm9vbC5oPgogCi0jZGVmaW5lIExLQ19ESVJFQ1RfTElOSwogI2luY2x1ZGUgImxrYy5oIgogCiAjZGVmaW5lIHByaW50ZChtYXNrLCBmbXQuLi4pIGlmIChjZGVidWcgJiAobWFzaykpIHByaW50ZihmbXQpCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbV9jb21wYXQuYyBiL3NvdW5kL2NvcmUvcGNtX2NvbXBhdC5jCmluZGV4IDVmYjJlMjguLjkxY2RmOTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtX2NvbXBhdC5jCisrKyBiL3NvdW5kL2NvcmUvcGNtX2NvbXBhdC5jCkBAIC0zNDIsNyArMzQyLDcgQEAKIAkJCWtmcmVlKGJ1ZnMpOwogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KLQkJYnVmc1tjaF0gPSBjb21wYXRfcHRyKHB0cik7CisJCWJ1ZnNbaV0gPSBjb21wYXRfcHRyKHB0cik7CiAJCWJ1ZnB0cisrOwogCX0KIAlpZiAoZGlyID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3J0Y3RpbWVyLmMgYi9zb3VuZC9jb3JlL3J0Y3RpbWVyLmMKaW5kZXggMDg1MWNkMS4uZTg1ZTcyYiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9ydGN0aW1lci5jCisrKyBiL3NvdW5kL2NvcmUvcnRjdGltZXIuYwpAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+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=